From feb066f5ad4f802c5dc2d8901618ce11ceb57473 Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 17:54:21 +0900 Subject: [PATCH 1/7] =?UTF-8?q?chore:=20js-cookie=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 225 ++++------------------------------------------ package.json | 2 + 2 files changed, 18 insertions(+), 209 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50ae93fa..dafd2c81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.9.0", "date-fns": "^4.1.0", "dompurify": "^3.2.6", + "js-cookie": "^3.0.5", "lucide-react": "^0.511.0", "next": "15.3.2", "react": "^19.0.0", @@ -47,6 +48,7 @@ "@testing-library/react": "^16.3.0", "@types/dompurify": "^3.2.0", "@types/jest": "^30.0.0", + "@types/js-cookie": "^3.0.6", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", @@ -7390,6 +7392,12 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true + }, "node_modules/@types/jsdom": { "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", @@ -10090,47 +10098,6 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "node_modules/cmd-shim": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz", - "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==", - "dev": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -10673,109 +10640,6 @@ "node": ">=18" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -15603,6 +15467,14 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -17389,50 +17261,6 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -17502,27 +17330,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", - "dev": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", diff --git a/package.json b/package.json index 810de0e6..1f6b3839 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "axios": "^1.9.0", "date-fns": "^4.1.0", "dompurify": "^3.2.6", + "js-cookie": "^3.0.5", "lucide-react": "^0.511.0", "next": "15.3.2", "react": "^19.0.0", @@ -53,6 +54,7 @@ "@testing-library/react": "^16.3.0", "@types/dompurify": "^3.2.0", "@types/jest": "^30.0.0", + "@types/js-cookie": "^3.0.6", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", From 53cd456eb1641a6bd801bf58a6f6e6719e69e92a Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 17:56:25 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20middleware=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=9C=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(=EA=B8=B0=EC=A1=B4=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=EB=A5=BC=20src=EC=95=84=EB=9E=98=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- middleware.ts | 0 src/middleware.ts | 34 ++++++++++++++++++++++++++++++++++ src/utils/middleware-utils.ts | 22 ++++++++++++++++++++++ 3 files changed, 56 insertions(+) delete mode 100644 middleware.ts create mode 100644 src/middleware.ts create mode 100644 src/utils/middleware-utils.ts diff --git a/middleware.ts b/middleware.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 00000000..3ad8e520 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,34 @@ +import { APP_ROUTES } from '@/constants/appRoutes'; +import redirectWithError from '@/utils/middleware-utils'; +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; + +const middleware = async (request: NextRequest) => { + const { pathname } = request.nextUrl; + + const accessToken = request.cookies.get('accessToken')?.value; + const isSignIn = Boolean(accessToken); + + const isAuthPage = + pathname === APP_ROUTES.signin || pathname === APP_ROUTES.signup; + const isProtectedPage = pathname === APP_ROUTES.mypage; + + const referer = request.headers.get('referer') ?? ''; + const isFromSignIn = referer.includes(APP_ROUTES.signin); + + if (isProtectedPage && !isSignIn) { + return redirectWithError({ url: APP_ROUTES.signin, request }); + } + + if (isAuthPage && isSignIn && !isFromSignIn) { + return redirectWithError({ url: APP_ROUTES.home, request }); + } + + return NextResponse.next(); +}; + +export const config = { + matcher: ['/auths/signin', '/auths/signup', '/mypage'], +}; + +export default middleware; diff --git a/src/utils/middleware-utils.ts b/src/utils/middleware-utils.ts new file mode 100644 index 00000000..f1113c61 --- /dev/null +++ b/src/utils/middleware-utils.ts @@ -0,0 +1,22 @@ +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; + +interface RedirectWithErrorParams { + url: string; + request: NextRequest; +} + +const COOKIE_LIFE_TIME_SECONDS = 5; + +const redirectWithError = ({ url, request }: RedirectWithErrorParams) => { + const response = NextResponse.redirect(new URL(url, request.url)); + response.cookies.set('redirect_error', 'invalid_route', { + path: '/', + httpOnly: false, + secure: true, + maxAge: COOKIE_LIFE_TIME_SECONDS, + }); + return response; +}; + +export default redirectWithError; From e8bf6365db0402439479ee6ce34f0600d8580c99 Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 18:00:56 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor:=20=EB=AF=B8=EB=93=A4=EC=9B=A8?= =?UTF-8?q?=EC=96=B4=20=EC=A0=81=EC=9A=A9=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EA=B0=81=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C,=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8A=94=20ClientSideHandler=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=98=B8=EC=B6=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/auths/signin/page.tsx | 12 ++---------- src/app/auths/signup/page.tsx | 10 ---------- src/app/mypage/page.tsx | 14 +++++++++----- src/app/social/page.tsx | 36 +++++++++++++++++++---------------- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/app/auths/signin/page.tsx b/src/app/auths/signin/page.tsx index f982022e..b6143736 100644 --- a/src/app/auths/signin/page.tsx +++ b/src/app/auths/signin/page.tsx @@ -1,9 +1,7 @@ import SignInForm from './_components/SignInForm'; -import getMyInfoOnServer from '@/providers/auth-provider/getMyInfoOnServer'; -import { headers } from 'next/headers'; -import { redirect } from 'next/navigation'; import LinkToSignUp from './_components/LinkToSignUp'; import type { Metadata } from 'next'; +import ClientSideHandler from '@/components/logic/ClientSideHandler'; export const metadata: Metadata = { title: '로그인 - WeWrite', @@ -27,13 +25,6 @@ export const metadata: Metadata = { }; const SignIn = async () => { - const { isSignIn } = await getMyInfoOnServer(); - const referer = (await headers()).get('referer'); - - if (isSignIn) { - redirect(referer ?? '/'); - } - return (
@@ -44,6 +35,7 @@ const SignIn = async () => {
+
); }; diff --git a/src/app/auths/signup/page.tsx b/src/app/auths/signup/page.tsx index f3a71027..b4fb3a6f 100644 --- a/src/app/auths/signup/page.tsx +++ b/src/app/auths/signup/page.tsx @@ -1,8 +1,5 @@ -import getMyInfoOnServer from '@/providers/auth-provider/getMyInfoOnServer'; import SignupForm from './_components/SignupForm'; import LinkToSignIn from './_components/LinkToSignIn'; -import { redirect } from 'next/navigation'; -import { headers } from 'next/headers'; import type { Metadata } from 'next'; export const metadata: Metadata = { @@ -27,13 +24,6 @@ export const metadata: Metadata = { }; const SignUp = async () => { - const { isSignIn } = await getMyInfoOnServer(); - const referer = (await headers()).get('referer'); - - if (isSignIn) { - redirect(referer ?? '/'); - } - return (
diff --git a/src/app/mypage/page.tsx b/src/app/mypage/page.tsx index 5657e90a..5df7d008 100644 --- a/src/app/mypage/page.tsx +++ b/src/app/mypage/page.tsx @@ -1,13 +1,17 @@ +import ClientSideHandler from '@/components/logic/ClientSideHandler'; import MyProfile from './_components/my-profile/MyProfile'; import MySocialList from './_components/my-social-list/MySocialList'; const MyPage = () => { return ( -
-

마이 페이지

- - -
+ <> +
+

마이 페이지

+ + +
+ + ); }; diff --git a/src/app/social/page.tsx b/src/app/social/page.tsx index ea25d452..f05f346f 100644 --- a/src/app/social/page.tsx +++ b/src/app/social/page.tsx @@ -5,6 +5,7 @@ import { getQueryClient } from '@/lib/queryClinet'; import SocialListContainer from './_components/SocialListContainer'; import { BookOpen } from 'lucide-react'; import type { Metadata } from 'next'; +import ClientSideHandler from '@/components/logic/ClientSideHandler'; export const metadata: Metadata = { title: '스토리그룹 - WeWrite', @@ -35,23 +36,26 @@ const Social = async () => { }); return ( - -
-

- 모두와 만들어 나가는 상상의 여정 - - 함께 쓰고, 함께 완성하는 이야기 - -

+

+ 지금, 당신의 상상을 더해보세요 +

+
+ +
+ + ); }; From 2fa23e0059e8ad89505b9f062fe9f8432b628c64 Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 18:02:02 +0900 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=EB=AF=B8=EB=93=A4=EC=9B=A8=EC=96=B4?= =?UTF-8?q?=EC=99=80=EC=9D=98=20=EC=B6=A9=EB=8F=8C=EC=9D=84=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20=EC=8B=9C=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=8A=B8=20=EC=A0=84=ED=99=98=EC=9D=84=20social=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/layout/GNB/UserProfileDropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/GNB/UserProfileDropdown.tsx b/src/components/layout/GNB/UserProfileDropdown.tsx index 86e6bdf1..d5bbd3f0 100644 --- a/src/components/layout/GNB/UserProfileDropdown.tsx +++ b/src/components/layout/GNB/UserProfileDropdown.tsx @@ -41,7 +41,7 @@ const UserProfileDropdown = ({ closeDropdown(); if (pathname === APP_ROUTES.mypage) { - router.push(APP_ROUTES.signin); + router.push(APP_ROUTES.home); } }; From c188dd96bc468a84895fdcd1e4e930848ae055e3 Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 18:02:48 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20redirect=5Ferror=20=EC=BF=A0?= =?UTF-8?q?=ED=82=A4=EB=A5=BC=20=EA=B0=90=EC=A7=80=ED=95=98=EA=B3=A0=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=EB=B6=80=EB=A1=9C=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=ED=86=A0=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/logic/ClientSideHandler.tsx | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/components/logic/ClientSideHandler.tsx diff --git a/src/components/logic/ClientSideHandler.tsx b/src/components/logic/ClientSideHandler.tsx new file mode 100644 index 00000000..cab750ec --- /dev/null +++ b/src/components/logic/ClientSideHandler.tsx @@ -0,0 +1,26 @@ +'use client'; + +import toast from '@/utils/toast'; +import { useEffect } from 'react'; +import Cookies from 'js-cookie'; + +const ClientSideHandler = () => { + useEffect(() => { + const errorType = Cookies.get('redirect_error'); + + if (errorType === 'invalid_route') { + setTimeout(() => { + toast({ + type: 'error', + message: '잘못된 접근입니다.', + duration: 4, + }); + }, 0); + Cookies.remove('redirect_error'); + } + }, []); + + return null; +}; + +export default ClientSideHandler; From b6ad578f88ac5c08492bea51ddddddfc0b013c20 Mon Sep 17 00:00:00 2001 From: juyesu Date: Thu, 17 Jul 2025 18:04:59 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=9D=B4=ED=9B=84=20=EB=B8=8C=EB=9D=BC=EC=9A=B0=EC=A0=80=20?= =?UTF-8?q?=EB=92=A4=EB=A1=9C=20=EA=B0=80=EA=B8=B0=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EB=A1=9C=20=EB=8F=8C=EC=95=84=EA=B0=80=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=EB=B0=A9=EC=A7=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=EC=84=9C=20router.push=20->=20ro?= =?UTF-8?q?uter.replace=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/api/auth/usePostSignin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/api/auth/usePostSignin.ts b/src/hooks/api/auth/usePostSignin.ts index 6150390c..92d93c50 100644 --- a/src/hooks/api/auth/usePostSignin.ts +++ b/src/hooks/api/auth/usePostSignin.ts @@ -14,7 +14,7 @@ export const usePostSignin = () => { onSuccess: async () => { toast.success('로그인에 성공했습니다.'); await queryClient.prefetchQuery({ queryKey: ['myInfo'] }); - router.push(APP_ROUTES.social); + router.replace(APP_ROUTES.social); }, onError: (error: Error) => { const errorData = JSON.parse(error.message); From c685ac90ae608b02d3c9ec76e47a0de52e261af7 Mon Sep 17 00:00:00 2001 From: juyesu Date: Sun, 20 Jul 2025 19:11:39 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EB=84=A4=EC=9D=B4=EB=B0=8D=EC=9D=84=20=EB=AA=85?= =?UTF-8?q?=EC=8B=9C=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20Cli?= =?UTF-8?q?entSideHandler=20->=20RedirectErrorToastHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/auths/signin/page.tsx | 4 ++-- src/app/mypage/page.tsx | 4 ++-- src/app/social/page.tsx | 4 ++-- .../{ClientSideHandler.tsx => RedirectErrorToastHandler.tsx} | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/components/logic/{ClientSideHandler.tsx => RedirectErrorToastHandler.tsx} (84%) diff --git a/src/app/auths/signin/page.tsx b/src/app/auths/signin/page.tsx index b6143736..a326788b 100644 --- a/src/app/auths/signin/page.tsx +++ b/src/app/auths/signin/page.tsx @@ -1,7 +1,7 @@ import SignInForm from './_components/SignInForm'; import LinkToSignUp from './_components/LinkToSignUp'; import type { Metadata } from 'next'; -import ClientSideHandler from '@/components/logic/ClientSideHandler'; +import RedirectErrorToastHandler from '@/components/logic/RedirectErrorToastHandler'; export const metadata: Metadata = { title: '로그인 - WeWrite', @@ -35,7 +35,7 @@ const SignIn = async () => {
- +
); }; diff --git a/src/app/mypage/page.tsx b/src/app/mypage/page.tsx index 5df7d008..87bb61ca 100644 --- a/src/app/mypage/page.tsx +++ b/src/app/mypage/page.tsx @@ -1,4 +1,4 @@ -import ClientSideHandler from '@/components/logic/ClientSideHandler'; +import RedirectErrorToastHandler from '@/components/logic/RedirectErrorToastHandler'; import MyProfile from './_components/my-profile/MyProfile'; import MySocialList from './_components/my-social-list/MySocialList'; @@ -10,7 +10,7 @@ const MyPage = () => { - + ); }; diff --git a/src/app/social/page.tsx b/src/app/social/page.tsx index f05f346f..0310d10f 100644 --- a/src/app/social/page.tsx +++ b/src/app/social/page.tsx @@ -5,7 +5,7 @@ import { getQueryClient } from '@/lib/queryClinet'; import SocialListContainer from './_components/SocialListContainer'; import { BookOpen } from 'lucide-react'; import type { Metadata } from 'next'; -import ClientSideHandler from '@/components/logic/ClientSideHandler'; +import RedirectErrorToastHandler from '@/components/logic/RedirectErrorToastHandler'; export const metadata: Metadata = { title: '스토리그룹 - WeWrite', @@ -54,7 +54,7 @@ const Social = async () => { - + ); }; diff --git a/src/components/logic/ClientSideHandler.tsx b/src/components/logic/RedirectErrorToastHandler.tsx similarity index 84% rename from src/components/logic/ClientSideHandler.tsx rename to src/components/logic/RedirectErrorToastHandler.tsx index cab750ec..f0ac73be 100644 --- a/src/components/logic/ClientSideHandler.tsx +++ b/src/components/logic/RedirectErrorToastHandler.tsx @@ -4,7 +4,7 @@ import toast from '@/utils/toast'; import { useEffect } from 'react'; import Cookies from 'js-cookie'; -const ClientSideHandler = () => { +const RedirectErrorToastHandler = () => { useEffect(() => { const errorType = Cookies.get('redirect_error'); @@ -23,4 +23,4 @@ const ClientSideHandler = () => { return null; }; -export default ClientSideHandler; +export default RedirectErrorToastHandler;