diff --git a/package-lock.json b/package-lock.json index f7b572e..9f0d7fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2681,7 +2681,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2693,10 +2692,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2705,7 +2703,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2750,7 +2747,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2766,7 +2762,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2802,7 +2797,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -2815,8 +2809,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "deprecated": "Use @eslint/object-schema instead" }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.4", @@ -3098,160 +3091,6 @@ "@img/sharp-libvips-linux-arm64": "1.0.2" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -21969,6 +21808,126 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/public/icons/arrow_back_ios.svg b/public/icons/arrow_back_ios.svg index 71263ff..3f7c4f2 100644 --- a/public/icons/arrow_back_ios.svg +++ b/public/icons/arrow_back_ios.svg @@ -1,8 +1,8 @@ - + - + diff --git a/public/icons/speech_balloon.svg b/public/icons/speech_balloon.svg new file mode 100644 index 0000000..55a9fdc --- /dev/null +++ b/public/icons/speech_balloon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/icons/twopolaroids.svg b/public/icons/twopolaroids.svg index b9a35f1..37caca9 100644 --- a/public/icons/twopolaroids.svg +++ b/public/icons/twopolaroids.svg @@ -1,9 +1,9 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/src/app/(board)/board/[boardId]/loading.tsx b/src/app/(board)/board/[boardId]/loading.tsx index 74f486e..ffe0410 100644 --- a/src/app/(board)/board/[boardId]/loading.tsx +++ b/src/app/(board)/board/[boardId]/loading.tsx @@ -1,7 +1,9 @@ +import Loader from '@/components/Loading' + const Loading = () => { return ( -
-

Loading...

+
+
) } diff --git a/src/app/(board)/board/[boardId]/page.tsx b/src/app/(board)/board/[boardId]/page.tsx index 67e3098..f8b07c9 100644 --- a/src/app/(board)/board/[boardId]/page.tsx +++ b/src/app/(board)/board/[boardId]/page.tsx @@ -1,14 +1,29 @@ import Empty from '@/components/Board/Empty' import BoardHeader from '@/components/Board/Header' -import Polaroid from '@/components/Polaroid' +import CreatePolaroidModal from '@/components/Board/Modal' +import PolaroidCard from '@/components/Polaroid/PolaroidCard' import { getBoard } from '@/lib' +import { headers } from 'next/headers' import Link from 'next/link' import AddPolaroid from 'public/icons/add_polaroid.svg' -const BoardPage = async ({ params }: { params: { boardId: string } }) => { +interface BoardPageProps { + params: { + boardId: string + } + searchParams: Record | null | undefined +} + +const BoardPage = async ({ params, searchParams }: BoardPageProps) => { const { boardId } = params const board = await getBoard(boardId) + const show = searchParams?.show + + // get current path + const headersList = headers() + const headerPathname = headersList.get('x-pathname') || '' + return (
@@ -18,7 +33,7 @@ const BoardPage = async ({ params }: { params: { boardId: string } }) => { ) : (
{board.items.map((item) => ( - {
)} + {show && } diff --git a/src/app/(board)/board/[boardId]/polaroid/create/page.tsx b/src/app/(board)/board/[boardId]/polaroid/create/page.tsx deleted file mode 100644 index 07e7397..0000000 --- a/src/app/(board)/board/[boardId]/polaroid/create/page.tsx +++ /dev/null @@ -1,37 +0,0 @@ -'use client' - -import { CreatePolaroidPayload } from '@/types' -import { useParams } from 'next/navigation' -import { useState } from 'react' - -const CreatePolaroidPage = () => { - const { boardId } = useParams() - - const [caption, setCaption] = useState('') - - const handleUpload = async () => { - const payload: CreatePolaroidPayload = { - boardId: Number(boardId), - imageUrl: '', - caption, - } - console.log(payload) - } - - return ( -
-

사진을 업로드해주세요!

- setCaption(e.target.value)} - placeholder="한줄 문구를 입력할 수 있어요" - /> - -
- ) -} - -export default CreatePolaroidPage diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index b292f08..99c78ec 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -1,4 +1,3 @@ -import PolaroidMaker from '@/components/Polaroid/PolaroidMaker' import Link from 'next/link' const HomePage = () => { @@ -8,7 +7,6 @@ const HomePage = () => {

함께 꾸미는 폴라로이드 보드

POLABO

- 시작하기
) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 49ec34a..29e6d3d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,6 @@ +import '@/styles/globals.css' import type { Metadata } from 'next' import localFont from 'next/font/local' -import '@/styles/globals.css' const PretendVariable = localFont({ src: '../../public/fonts/PretendardVariable.woff2', @@ -30,7 +30,9 @@ export default function RootLayout({ }>) { return ( - +
{children}
diff --git a/src/components/Board/Modal.tsx b/src/components/Board/Modal.tsx new file mode 100644 index 0000000..e4ef7cb --- /dev/null +++ b/src/components/Board/Modal.tsx @@ -0,0 +1,44 @@ +'use client' + +import Link from 'next/link' +import ArrowBack from 'public/icons/arrow_back_ios.svg' +import { useEffect, useState } from 'react' +import ReactDOM from 'react-dom' +import Button from '../Button' +import PolaroidMaker from '../Polaroid/PolaroidMaker' + +interface ModalProps { + headerPathname: string +} + +const CreatePolaroidModal = ({ headerPathname }: ModalProps) => { + const [isMounted, setIsMounted] = useState(false) + const [buttonDisabled, setButtonDisabled] = useState(true) + + useEffect(() => { + setIsMounted(true) + }, []) + + if (!isMounted) return null + + return ReactDOM.createPortal( +
+
+ + + +
+ +
+
+ +
+
+
, + document.getElementById('modal-root') as HTMLElement, + ) +} + +export default CreatePolaroidModal diff --git a/src/components/Loading/index.tsx b/src/components/Loading/index.tsx new file mode 100644 index 0000000..e16708a --- /dev/null +++ b/src/components/Loading/index.tsx @@ -0,0 +1,25 @@ +'use client' + +import SpeechBalloon from 'public/icons/speech_balloon.svg' +import TwoPolaroids from 'public/icons/twopolaroids.svg' + +interface LoadingProps { + message: string +} + +const Loader = ({ message }: LoadingProps) => ( + <> +
+ +
+
+
+
+
+
+ +
{message}
+ +) + +export default Loader diff --git a/src/components/Polaroid/Base.tsx b/src/components/Polaroid/Base.tsx index ba189a0..f97cc39 100644 --- a/src/components/Polaroid/Base.tsx +++ b/src/components/Polaroid/Base.tsx @@ -29,7 +29,7 @@ const Bottom = ({ children }: { children: ReactNode }) => ( const Base = ({ children }: { children: ReactNode }) => { return ( -
+
{children}
) diff --git a/src/components/Polaroid/LoadingFilter.tsx b/src/components/Polaroid/LoadingFilter.tsx new file mode 100644 index 0000000..de42f62 --- /dev/null +++ b/src/components/Polaroid/LoadingFilter.tsx @@ -0,0 +1,15 @@ +import ReactDOM from 'react-dom' +import Loader from '../Loading' + +const Loading = ({ message }: { message: string }) => { + return ReactDOM.createPortal( +
+
+ +
+
, + document.getElementById('modal-root') as HTMLElement, + ) +} + +export default Loading diff --git a/src/components/Polaroid/PolaroidCard.tsx b/src/components/Polaroid/PolaroidCard.tsx index 7361b53..61e5252 100644 --- a/src/components/Polaroid/PolaroidCard.tsx +++ b/src/components/Polaroid/PolaroidCard.tsx @@ -12,7 +12,7 @@ function PolaroidCard({ imageUrl, oneLineMessage, filter }: PolaroidCardProps) { -

{oneLineMessage}

+

{oneLineMessage}

) diff --git a/src/components/Polaroid/PolaroidMaker.tsx b/src/components/Polaroid/PolaroidMaker.tsx index c3a135e..2729076 100644 --- a/src/components/Polaroid/PolaroidMaker.tsx +++ b/src/components/Polaroid/PolaroidMaker.tsx @@ -1,22 +1,55 @@ 'use client' -import AddPhotoIcon from 'public/icons/add_photo_alternate.svg' -import { ChangeEvent, useState } from 'react' import { MAX_LENGTH } from '@/lib' +import rotateImageIfNeeded from '@/lib/utils/image' +import AddPhotoIcon from 'public/icons/add_photo_alternate.svg' +import { ChangeEvent, useEffect, useState } from 'react' import Base, { PolaroidImage } from './Base' -const PolaroidMaker = () => { +interface PolaroidMakerProps { + setButtonDisabled: (disabled: boolean) => void +} + +const PolaroidMaker = ({ setButtonDisabled }: PolaroidMakerProps) => { const [inputEnabled, setInputEnabled] = useState(false) const [text, setText] = useState('') - const [selectedFile, setSelectedFile] = useState(null) + const [selectedFile, setSelectedFile] = useState(null) + // const [loadingImg, setLoadingImg] = useState(false) - const handleFileChange = (event: React.ChangeEvent) => { + const handleFileChange = async ( + event: React.ChangeEvent, + ) => { if (event.target.files && event.target.files.length > 0) { - setSelectedFile(event.target.files[0]) + // setSelectedFile(event.target.files[0]) + + const file = event.target.files[0] + const imageUrl = URL.createObjectURL(file) + const rotatedUrl = await rotateImageIfNeeded(imageUrl) + setSelectedFile(rotatedUrl) } } + useEffect(() => { + setButtonDisabled(!selectedFile) + }, [selectedFile, setButtonDisabled]) + + // useEffect(() => { + // if (selectedFile) { + // setLoadingImg(true) + // setButtonDisabled(true) + // const timer = setTimeout(() => { + // setLoadingImg(false) + // setButtonDisabled(false) + // }, 3000) + // return () => clearTimeout(timer) + // } + // setButtonDisabled(true) + + // return undefined + // }, [selectedFile, setButtonDisabled]) + + // if (loadingImg) return return ( @@ -34,7 +67,7 @@ const PolaroidMaker = () => { id="fileInput" /> {selectedFile ? ( - + ) : ( )} diff --git a/src/components/Polaroid/index.tsx b/src/components/Polaroid/index.tsx deleted file mode 100644 index 04c0df1..0000000 --- a/src/components/Polaroid/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import Image from 'next/image' - -interface PolaroidProps { - imageUrl: string - oneLineMessage: string - filter?: number -} - -function Polaroid({ imageUrl, oneLineMessage, filter }: PolaroidProps) { - let filterStyle = '' - if (filter === 1) { - filterStyle = - 'sepia(0.2) contrast(1.3) brightness(1.0) saturate(1.2) blur(0.7px)' - } else if (filter === 2) { - filterStyle = - 'sepia(0.4) contrast(1.1) brightness(0.9) saturate(0.8) hue-rotate(-20deg) blur(0.6px)' - } else { - filterStyle = 'none' - } - - return ( -
-
- Polaroid -
-
-

{oneLineMessage}

-
-
- ) -} - -Polaroid.defaultProps = { - filter: 1, -} - -export default Polaroid diff --git a/src/lib/api/board.ts b/src/lib/api/board.ts index 12ddf7c..bf07cb2 100644 --- a/src/lib/api/board.ts +++ b/src/lib/api/board.ts @@ -28,11 +28,3 @@ export const getTotalBoards = (): Promise => { }, }) } - -export const getTotalBoards = (): Promise => { - return get('/api/v1/boards/total-count', { - next: { - tags: ['totalBoards'], - }, - }) -} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..752a293 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server' + +function middleware(request: NextRequest) { + const requestHeaders = new Headers(request.headers) + requestHeaders.set('x-pathname', request.nextUrl.pathname) + + return NextResponse.next({ + request: { + headers: requestHeaders, + }, + }) +} + +export default middleware