From 5b07e90fba09212ad3c5a44fa630f2ad1dbea8e2 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Thu, 16 Jan 2025 23:35:47 +0900 Subject: [PATCH 01/18] add: signin page --- src/components/pages/Signin/SigninPage.tsx | 55 +++++++++++++++++++++- src/lib/network/account/SigninApi.ts | 9 ++++ src/lib/network/types/account.ts | 6 +-- src/mocks/handlers/account.ts | 13 +++-- src/mocks/middleware/ErrorHandler.ts | 2 +- src/pages/signin.tsx | 14 ++++++ 6 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 src/lib/network/account/SigninApi.ts create mode 100644 src/pages/signin.tsx diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index 3e659aa..336c38f 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -1,7 +1,60 @@ +import type { SigninRequestType } from '@/lib/network/types/account'; import type { NextPageWithLayout } from '@/pages/_app'; +import { useMutation } from '@tanstack/react-query'; +import { useRouter } from 'next/router'; +import { useForm } from 'react-hook-form'; +import BaseLayout from '@/components/layout/BaseLayout'; +import DarkTextInput from '@/components/ui/Form/DarkTextInput'; +import { SigninApi } from '@/lib/network/account/SigninApi'; +import { ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY } from '@/lib/network/utils'; const SigninPage: NextPageWithLayout = () => { - return
+ const router = useRouter() + const { register, handleSubmit } = useForm({ + defaultValues: { + emailOrPhone: '', + password: '' + } + }) + const { mutate } = useMutation({ + mutationFn: SigninApi, + onSuccess(result) { + localStorage.setItem(ACCESS_TOKEN_KEY, result.accessToken) + localStorage.setItem(REFRESH_TOKEN_KEY, result.refreshToken) + router.push('/') + } + }) + const signinFunction = (obj: SigninRequestType) => { + mutate(obj) + } + return
+
+

+ 로그인 +

+ + + + + +
+} +SigninPage.getLayout = (page) => { + return {page} } export default SigninPage \ No newline at end of file diff --git a/src/lib/network/account/SigninApi.ts b/src/lib/network/account/SigninApi.ts new file mode 100644 index 0000000..637fe0d --- /dev/null +++ b/src/lib/network/account/SigninApi.ts @@ -0,0 +1,9 @@ +import type { SigninRequestType, SigninResponseType } from '../types/account'; +import api from '..' + +export const SigninApi = async (params: SigninRequestType) => { + const result = await api.post('signin', { + json: params + }).json() + return result +} \ No newline at end of file diff --git a/src/lib/network/types/account.ts b/src/lib/network/types/account.ts index bf0b492..652f153 100644 --- a/src/lib/network/types/account.ts +++ b/src/lib/network/types/account.ts @@ -25,11 +25,11 @@ export type RefreshTokenResponseType = { refreshToken: string } & ErrorResponse -export type LoginRequestType = { - email: string +export type SigninRequestType = { + emailOrPhone: string password: string } -export type LoginResponseType = RefreshTokenResponseType & ErrorResponse +export type SigninResponseType = RefreshTokenResponseType & ErrorResponse export type MyInfoResponseType = { accountInfo: AccountBaseInfo diff --git a/src/mocks/handlers/account.ts b/src/mocks/handlers/account.ts index 62468f6..68c6f9f 100644 --- a/src/mocks/handlers/account.ts +++ b/src/mocks/handlers/account.ts @@ -1,4 +1,4 @@ -import type { EmailCheckRequestType, EmailCheckResponseType, LoginRequestType, LoginResponseType, MyInfoResponseType, RefreshTokenRequestType, RefreshTokenResponseType, SignupRequestType, SignupResponseType } from '@/lib/network/types/account'; +import type { EmailCheckRequestType, EmailCheckResponseType, SigninRequestType, SigninResponseType, MyInfoResponseType, RefreshTokenRequestType, RefreshTokenResponseType, SignupRequestType, SignupResponseType } from '@/lib/network/types/account'; import type { DefaultBodyType, PathParams } from 'msw'; import { delay, http } from 'msw' import { ErrorCode, ErrorHandler } from '../middleware/ErrorHandler'; @@ -59,13 +59,18 @@ const handlers = [ result: true }) })), - http.post('/api/login', ErrorHandler(async ({ request }) => { + http.post('/api/signup', ErrorHandler(async ({ request }) => { const requestJson = await request.json() const account = Object.values(accountList).find( - (account) => account.email === requestJson.email && account.password === requestJson.password + (account) => { + if (account.password !== requestJson.password) return false + if (account.email === requestJson.emailOrPhone) return true + if (account.phoneVerified && account.phone === requestJson.emailOrPhone) return false + return false + } ) if (!account) { - throw new ErrorException('Login failed', ErrorCode.LOGIN_FAILED) + throw new ErrorException('Login failed', ErrorCode.SIGNIN_FAILED) } const tokens = await generateAuth(account.id) return createSuccessResponse(tokens) diff --git a/src/mocks/middleware/ErrorHandler.ts b/src/mocks/middleware/ErrorHandler.ts index 8ef4ef1..4350ef4 100644 --- a/src/mocks/middleware/ErrorHandler.ts +++ b/src/mocks/middleware/ErrorHandler.ts @@ -9,7 +9,7 @@ export const ErrorCode = { WRONG_TOKEN_THROWN: -3, REFRESH_TOKEN_VERIFICATION_FAILED: -4, DUPLICATE_EMAIL: -5, - LOGIN_FAILED: -100 + SIGNIN_FAILED: -100 } export function ErrorHandler( diff --git a/src/pages/signin.tsx b/src/pages/signin.tsx new file mode 100644 index 0000000..fc8b784 --- /dev/null +++ b/src/pages/signin.tsx @@ -0,0 +1,14 @@ +import type { GetStaticProps } from 'next'; +import { getServerTranslations } from '@/lib/i18n/getServerTranslations' + +export { default } from '@/components/pages/Signin/SigninPage' + +export const getStaticProps: GetStaticProps = async ({ + locale, +}) => { + return { + props: { + ...await getServerTranslations(locale || 'en', ['common', 'page-signin']) + }, + } +} \ No newline at end of file From 0fc292d42567b54afedfdf48e9dd82915604e024 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:28:58 +0900 Subject: [PATCH 02/18] add: token as jotai state --- src/components/pages/Signin/SigninPage.tsx | 9 +++-- src/state/Token.ts | 6 +++ src/state/util/Storage.ts | 43 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/state/Token.ts create mode 100644 src/state/util/Storage.ts diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index 336c38f..5beac21 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -1,12 +1,13 @@ import type { SigninRequestType } from '@/lib/network/types/account'; import type { NextPageWithLayout } from '@/pages/_app'; import { useMutation } from '@tanstack/react-query'; +import { useAtom } from 'jotai'; import { useRouter } from 'next/router'; import { useForm } from 'react-hook-form'; import BaseLayout from '@/components/layout/BaseLayout'; import DarkTextInput from '@/components/ui/Form/DarkTextInput'; import { SigninApi } from '@/lib/network/account/SigninApi'; -import { ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY } from '@/lib/network/utils'; +import { accessTokenAtom, refreshTokenAtom } from '@/state/Token'; const SigninPage: NextPageWithLayout = () => { const router = useRouter() @@ -16,11 +17,13 @@ const SigninPage: NextPageWithLayout = () => { password: '' } }) + const [, setAccessToken] = useAtom(accessTokenAtom) + const [, setRefreshToken] = useAtom(refreshTokenAtom) const { mutate } = useMutation({ mutationFn: SigninApi, onSuccess(result) { - localStorage.setItem(ACCESS_TOKEN_KEY, result.accessToken) - localStorage.setItem(REFRESH_TOKEN_KEY, result.refreshToken) + setAccessToken(result.accessToken) + setRefreshToken(result.refreshToken) router.push('/') } }) diff --git a/src/state/Token.ts b/src/state/Token.ts new file mode 100644 index 0000000..39fdf40 --- /dev/null +++ b/src/state/Token.ts @@ -0,0 +1,6 @@ +import { atomWithStorage } from 'jotai/utils'; +import { ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY } from '@/lib/network/utils'; +import { JotaiLocalStorage } from './util/Storage'; + +export const accessTokenAtom = atomWithStorage(ACCESS_TOKEN_KEY, '', JotaiLocalStorage) +export const refreshTokenAtom = atomWithStorage(REFRESH_TOKEN_KEY, '', JotaiLocalStorage) \ No newline at end of file diff --git a/src/state/util/Storage.ts b/src/state/util/Storage.ts new file mode 100644 index 0000000..d4127a9 --- /dev/null +++ b/src/state/util/Storage.ts @@ -0,0 +1,43 @@ +import type { SyncStringStorage } from 'jotai/vanilla/utils/atomWithStorage'; +import { createJSONStorage } from 'jotai/utils'; + +const isBrowser = typeof window !== 'undefined' +const serverObj: { [k: string]: string } = {} + +export const CoveredLocalStorage: SyncStringStorage = { + getItem: (key) => { + if (isBrowser) { + return localStorage.getItem(key) + } else { + return serverObj[key] + } + }, + setItem(key, newValue) { + if (isBrowser) { + localStorage.setItem(key, newValue) + } else { + serverObj[key] = newValue + } + }, + removeItem(key) { + if (isBrowser) { + return localStorage.removeItem(key) + } else { + return serverObj[key] + } + }, + subscribe(key, callback) { + if (!isBrowser) return () => { } + const windowEventListener = (e: StorageEvent) => { + if (e.storageArea === localStorage && e.key === key) { + callback(localStorage.getItem(key)) + } + } + window.addEventListener('storage', windowEventListener) + return () => { + window.removeEventListener('storage', windowEventListener) + } + } +} + +export const JotaiLocalStorage = createJSONStorage(() => CoveredLocalStorage) \ No newline at end of file From 29c6378e9274cb92037c4bfafbf1ec2faba26a1c Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:35:43 +0900 Subject: [PATCH 03/18] add: password rule --- src/lib/validators.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/validators.ts b/src/lib/validators.ts index 4e075f9..93c7868 100644 --- a/src/lib/validators.ts +++ b/src/lib/validators.ts @@ -13,5 +13,6 @@ const validators = { export default validators export const pattern = { - email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i + email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, + password: /^(?!\s*$).{4,60}/ } \ No newline at end of file From 72f333e631f176347ae20bc13a9ea1c5063a18be Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:49:04 +0900 Subject: [PATCH 04/18] add: signin page lang files --- public/locales/en/common.json | 15 +++++++++++++++ public/locales/en/page-signin.json | 13 +++++++++++++ public/locales/kr/common.json | 15 +++++++++++++++ public/locales/kr/page-signin.json | 13 +++++++++++++ types/i18n/index.d.ts | 2 ++ 5 files changed, 58 insertions(+) create mode 100644 public/locales/en/page-signin.json create mode 100644 public/locales/kr/page-signin.json diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 54423ad..6026126 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -19,6 +19,21 @@ "pattern": "Please enter a valid email address." } }, + "emailOrPhone": { + "placeholder": "Email or mobile number", + "error": { + "required": "Please enter a valid email or phone number.", + "patternEmail": "Please enter a valid email.", + "validatePhone": "Please enter a valid phone number." + } + }, + "password": { + "placeholder": "Password", + "error": { + "required": "Your password must contain between 4 and 60 characters.", + "pattern": "Your password must contain between 4 and 60 characters." + } + }, "policy": { "label": "Yes, I consent to collection and use of my personal information in accordance with the Privacy Statemenet. (Details)", "error": { diff --git a/public/locales/en/page-signin.json b/public/locales/en/page-signin.json new file mode 100644 index 0000000..3c47e62 --- /dev/null +++ b/public/locales/en/page-signin.json @@ -0,0 +1,13 @@ +{ + "title": "Sign In", + "loginBtn": "Sign In", + "loginCodeDesc": "Message and data rates may apply", + "sendLoginCode": "Send Sign-In Code", + "or": "OR", + "useLogincodeBtn": "Use Sign-In Code", + "usePasswordBtn": "Use Password", + "findPassword": "Forgot password?", + "saveLoginInfo": "Remember me", + "areYouGuest": "New to Netflix?", + "gotoSignup": "Sign up now." +} diff --git a/public/locales/kr/common.json b/public/locales/kr/common.json index aa3476f..83e1e7d 100644 --- a/public/locales/kr/common.json +++ b/public/locales/kr/common.json @@ -19,6 +19,21 @@ "pattern": "유효한 이메일 주소를 입력하세요." } }, + "emailOrPhone": { + "placeholder": "이메일 주소 또는 휴대폰 번호", + "error": { + "required": "정확한 이메일 주소나 전화번호를 입력하세요.", + "patternEmail": "정확한 이메일 주소를 입력하세요.", + "validatePhone": "정확한 전화번호를 입력하세요." + } + }, + "password": { + "placeholder": "비밀번호", + "error": { + "required": "비밀번호는 4~60자 사이여야 합니다.", + "pattern": "비밀번호는 4~60자 사이여야 합니다." + } + }, "policy": { "label": "예, 저는 개인정보 처리방침에 따른 개인정보 수집 및 활용에 동의합니다. (상세 정보)", "error": { diff --git a/public/locales/kr/page-signin.json b/public/locales/kr/page-signin.json new file mode 100644 index 0000000..f09b123 --- /dev/null +++ b/public/locales/kr/page-signin.json @@ -0,0 +1,13 @@ +{ + "title": "로그인", + "loginBtn": "로그인", + "loginCodeDesc": "문자 또는 데이터 요금이 부과될 수 있습니다", + "sendLoginCode": "로그인 코드 받기", + "or": "또는", + "useLogincodeBtn": "로그인 코드 사용하기", + "usePasswordBtn": "비밀번호 사용하기", + "findPassword": "비밀번호를 잊으셨나요?", + "saveLoginInfo": "로그인 정보 저장", + "areYouGuest": "Netflix 회원이 아닌가요?", + "gotoSignup": "지금 가입하세요." +} \ No newline at end of file diff --git a/types/i18n/index.d.ts b/types/i18n/index.d.ts index 2e4012c..0261613 100644 --- a/types/i18n/index.d.ts +++ b/types/i18n/index.d.ts @@ -10,6 +10,7 @@ import 'i18next' import type common from '../../public/locales/en/common.json' import type PageHome from '../../public/locales/en/page-home.json' import type PageSignup from '../../public/locales/en/page-signup.json' +import type PageSignin from '../../public/locales/en/page-singin.json' declare module 'i18next' { interface CustomTypeOptions { @@ -18,6 +19,7 @@ declare module 'i18next' { common: typeof common, 'page-home': typeof PageHome 'page-signup': typeof PageSignup + 'page-signin': typeof PageSignin } } } \ No newline at end of file From fd92823c1e1d7b59381a8df015e811e2b763e3ae Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:52:08 +0900 Subject: [PATCH 05/18] add: signin parts --- .../pages/Signin/component/ButtonGroup.tsx | 28 ++++++++ .../pages/Signin/component/LoginCodeForm.tsx | 49 ++++++++++++++ .../pages/Signin/component/PasswordForm.tsx | 64 +++++++++++++++++++ .../network/account/SigninWithLoginCodeApi.ts | 9 +++ src/lib/network/types/account.ts | 7 ++ src/lib/validators.ts | 17 +++-- 6 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/components/pages/Signin/component/ButtonGroup.tsx create mode 100644 src/components/pages/Signin/component/LoginCodeForm.tsx create mode 100644 src/components/pages/Signin/component/PasswordForm.tsx create mode 100644 src/lib/network/account/SigninWithLoginCodeApi.ts diff --git a/src/components/pages/Signin/component/ButtonGroup.tsx b/src/components/pages/Signin/component/ButtonGroup.tsx new file mode 100644 index 0000000..76644bc --- /dev/null +++ b/src/components/pages/Signin/component/ButtonGroup.tsx @@ -0,0 +1,28 @@ +import type { MouseEventHandler } from 'react'; + +interface ButtonGroupProps { + submitText: string + or: string + buttonText: string + onSubmitClick?: MouseEventHandler + onButtonClick?: MouseEventHandler +} +export default function ButtonGroup({ + submitText, + onSubmitClick, + or, + buttonText, + onButtonClick +}: ButtonGroupProps) { + return <> + +

+ {or} +

+ + +} \ No newline at end of file diff --git a/src/components/pages/Signin/component/LoginCodeForm.tsx b/src/components/pages/Signin/component/LoginCodeForm.tsx new file mode 100644 index 0000000..4eb7b0e --- /dev/null +++ b/src/components/pages/Signin/component/LoginCodeForm.tsx @@ -0,0 +1,49 @@ +import type { SigninRequestType } from '@/lib/network/types/account'; +import type { ReactNode } from 'react'; +import { useTranslation } from 'next-i18next'; +import { useForm } from 'react-hook-form'; +import DarkTextInput from '@/components/ui/Form/DarkTextInput'; +import RHFValidErrorHelper from '@/components/ui/Form/utils/RHFValidErrorHelper'; +import validators from '@/lib/validators'; + +interface LoginCodeFormProps { + mutate: (_data: SigninRequestType) => void + buttonArea: ReactNode +} +export default function LoginCodeForm({ + mutate, + buttonArea, + className +}: LoginCodeFormProps & CssProps) { + const { t } = useTranslation(['common']) + + const { register, handleSubmit, formState } = useForm({ + mode: 'onBlur' + }) + const signinFunction = (obj: SigninRequestType) => { + mutate(obj) + } + + return
+ {/* TODO: need to change type between phone and email */} + { + if (validators.emailOrPhoneNumberType(v)) return true + if (isNaN(Number(v))) { + return t('common:form.emailOrPhone.error.patternEmail') + } else { + return t('common:form.emailOrPhone.error.validatePhone') + } + }, + })} + {...RHFValidErrorHelper( + formState.errors.emailOrPhone?.message, + formState.touchedFields.emailOrPhone + )} + placeholder={t('common:form.emailOrPhone.placeholder')} + /> + {buttonArea} + +} \ No newline at end of file diff --git a/src/components/pages/Signin/component/PasswordForm.tsx b/src/components/pages/Signin/component/PasswordForm.tsx new file mode 100644 index 0000000..e4ca85f --- /dev/null +++ b/src/components/pages/Signin/component/PasswordForm.tsx @@ -0,0 +1,64 @@ +import type { SigninRequestType } from '@/lib/network/types/account'; +import type { ReactNode } from 'react'; +import { useTranslation } from 'next-i18next'; +import { useForm } from 'react-hook-form'; +import DarkTextInput from '@/components/ui/Form/DarkTextInput'; +import RHFValidErrorHelper from '@/components/ui/Form/utils/RHFValidErrorHelper'; +import validators, { pattern } from '@/lib/validators'; + +interface PasswordFormProps { + mutate: (_data: SigninRequestType) => void + buttonArea: ReactNode +} +export default function PasswordForm({ + mutate, + buttonArea, + className +}: PasswordFormProps & CssProps) { + const { t } = useTranslation(['common']) + + const { register, handleSubmit, formState } = useForm({ + mode: 'onBlur' + }) + const signinFunction = (obj: SigninRequestType) => { + mutate(obj) + } + + return
+ {/* TODO: need to change type between phone and email */} + { + if (validators.emailOrPhoneNumberType(v)) return true + if (isNaN(Number(v))) { + return t('common:form.emailOrPhone.error.patternEmail') + } else { + return t('common:form.emailOrPhone.error.validatePhone') + } + }, + })} + {...RHFValidErrorHelper( + formState.errors.emailOrPhone?.message, + formState.touchedFields.emailOrPhone + )} + placeholder={t('common:form.emailOrPhone.placeholder')} + /> + + {buttonArea} + +} \ No newline at end of file diff --git a/src/lib/network/account/SigninWithLoginCodeApi.ts b/src/lib/network/account/SigninWithLoginCodeApi.ts new file mode 100644 index 0000000..a2d5729 --- /dev/null +++ b/src/lib/network/account/SigninWithLoginCodeApi.ts @@ -0,0 +1,9 @@ +import type { SigninWithCodeRequestType, SigninWithCodeResponseType } from '../types/account'; +import api from '..' + +export const SigninWithLoginCodeApi = async (params: SigninWithCodeRequestType) => { + const result = await api.post('signinWithLoginCode', { + json: params + }).json() + return result +} \ No newline at end of file diff --git a/src/lib/network/types/account.ts b/src/lib/network/types/account.ts index 652f153..ed89a16 100644 --- a/src/lib/network/types/account.ts +++ b/src/lib/network/types/account.ts @@ -31,6 +31,13 @@ export type SigninRequestType = { } export type SigninResponseType = RefreshTokenResponseType & ErrorResponse +export type SigninWithCodeRequestType = { + emailOrPhone: string +} +export type SigninWithCodeResponseType = { + result: boolean +} + export type MyInfoResponseType = { accountInfo: AccountBaseInfo } & ErrorResponse \ No newline at end of file diff --git a/src/lib/validators.ts b/src/lib/validators.ts index 93c7868..7cda53d 100644 --- a/src/lib/validators.ts +++ b/src/lib/validators.ts @@ -1,18 +1,23 @@ import { AsYouType } from 'libphonenumber-js/mobile' +export const pattern = { + email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, + password: /^(?!\s*$).{4,60}/ +} + const validators = { - phoneNumberType: (v: string) => { + phoneNumberType(v: string) { const phoneTypeChecker = new AsYouType() phoneTypeChecker.reset() phoneTypeChecker.input(v) const number = phoneTypeChecker.getNumber() return number?.getType() && number?.isPossible() }, + emailOrPhoneNumberType(v: string) { + if (this.phoneNumberType(v)) return true + if (pattern.email.test(v)) return true + return false + } } export default validators - -export const pattern = { - email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, - password: /^(?!\s*$).{4,60}/ -} \ No newline at end of file From d3f893946375ac32e2999a7b3e5173f8bb2dded0 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 21:58:15 +0900 Subject: [PATCH 06/18] add: signin page --- public/signin/signin-bg.jpg | Bin 0 -> 152809 bytes src/components/pages/Signin/SigninPage.tsx | 136 ++++++++++++------ .../pages/Signin/styles/signinPageStyle.ts | 71 +++++++++ src/components/styled/layout.ts | 24 ++++ src/lib/network/utils.ts | 2 + 5 files changed, 193 insertions(+), 40 deletions(-) create mode 100644 public/signin/signin-bg.jpg create mode 100644 src/components/pages/Signin/styles/signinPageStyle.ts diff --git a/public/signin/signin-bg.jpg b/public/signin/signin-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94a18e61affc3daebd0e84c9825ead2cc4d3ea51 GIT binary patch literal 152809 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
    I!DmloK?cQR04HTV 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 Hgb)AOtzotK literal 0 HcmV?d00001 diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index 5beac21..47e5eaa 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -1,59 +1,115 @@ -import type { SigninRequestType } from '@/lib/network/types/account'; +import type { SigninResponseType, SigninWithCodeResponseType } from '@/lib/network/types/account'; import type { NextPageWithLayout } from '@/pages/_app'; import { useMutation } from '@tanstack/react-query'; import { useAtom } from 'jotai'; +import Image from 'next/image'; +import Link from 'next/link'; import { useRouter } from 'next/router'; -import { useForm } from 'react-hook-form'; +import { useTranslation } from 'next-i18next'; +import { useState } from 'react'; import BaseLayout from '@/components/layout/BaseLayout'; -import DarkTextInput from '@/components/ui/Form/DarkTextInput'; +import { HeaderLinkStyleCss } from '@/components/layout/styles/SignupLayoutStyle'; +import ConditionalRender from '@/components/ui/utils/ConditionalRender'; import { SigninApi } from '@/lib/network/account/SigninApi'; +import { SigninWithLoginCodeApi } from '@/lib/network/account/SigninWithLoginCodeApi'; +import { SIGNIN_EMAIL_OR_PHONE } from '@/lib/network/utils'; import { accessTokenAtom, refreshTokenAtom } from '@/state/Token'; +import NetflixLogo from '@assets/netflix/top-logo.svg' +import ButtonGroup from './component/ButtonGroup'; +import LoginCodeForm from './component/LoginCodeForm'; +import PasswordForm from './component/PasswordForm'; +import { backgroundCss, formAreaCss, formGridCss, formPositionAreaCss, formTitleCss, headerAreaCss, signinPageBaseCss } from './styles/signinPageStyle'; const SigninPage: NextPageWithLayout = () => { const router = useRouter() - const { register, handleSubmit } = useForm({ - defaultValues: { - emailOrPhone: '', - password: '' - } - }) + const [isLoginCodeForm, setIsLoginCodeForm] = useState(false) + const { t } = useTranslation(['common', 'page-signin']) const [, setAccessToken] = useAtom(accessTokenAtom) const [, setRefreshToken] = useAtom(refreshTokenAtom) - const { mutate } = useMutation({ + const { mutate: signinMutate } = useMutation({ mutationFn: SigninApi, - onSuccess(result) { - setAccessToken(result.accessToken) - setRefreshToken(result.refreshToken) - router.push('/') + onSuccess: loginSuccessAction + }) + + function loginSuccessAction(data: SigninResponseType) { + setAccessToken(data.accessToken) + setRefreshToken(data.refreshToken) + router.push('/selectProfile') + } + + const { mutate: signinWithLoginCodeMutate } = useMutation({ + mutationFn: SigninWithLoginCodeApi, + onMutate(variables) { + sessionStorage.setItem(SIGNIN_EMAIL_OR_PHONE, variables.emailOrPhone) + return () => { + sessionStorage.removeItem(SIGNIN_EMAIL_OR_PHONE) + } + }, + onSuccess: loginWithCodeAction, + onError(_error, _variables, context) { + if (context) context() } }) - const signinFunction = (obj: SigninRequestType) => { - mutate(obj) + function loginWithCodeAction(data: SigninWithCodeResponseType) { + if (data.result) { + router.push('/signinWithLoginCode') + } } - return
    -
    -

    - 로그인 -

    - - - - - + + return
    +
    + bg +
    +
    + + + +
    +
    +
    +
    +

    + {t('page-signin:title')} +

    +
    + +

    {t('page-signin:loginCodeDesc')}

    + { + setIsLoginCodeForm(false) + }} + /> + + } + />, + false: { + setIsLoginCodeForm(true) + }} + + />} + /> + }} + /> +
    +
    +
    } SigninPage.getLayout = (page) => { diff --git a/src/components/pages/Signin/styles/signinPageStyle.ts b/src/components/pages/Signin/styles/signinPageStyle.ts new file mode 100644 index 0000000..a78f5c7 --- /dev/null +++ b/src/components/pages/Signin/styles/signinPageStyle.ts @@ -0,0 +1,71 @@ +import { css } from '@emotion/react'; +import { BreakPoints } from '@/components/styled/layout'; +import { theme } from '@/components/ui/theme'; + +export const signinPageBaseCss = css({ + position: 'relative', + display: 'flex', + flexDirection: 'column', + backgroundColor: '#000', + justifyContent: 'center', + alignItems: 'center' +}) + +export const backgroundCss = css({ + pointerEvents: 'none', + zIndex: 0, + position: 'absolute', + top: 0, + left: 0, + minHeight: '100vh', + opacity: '0.5', + '~ *': { + zIndex: 1, + } +}) + +export const headerAreaCss = css({ + alignSelf: 'stretch', + display: 'flex', + padding: '1.5rem' +}, BreakPoints.sm({ + padding: '1.5rem 2rem' +})) + +export const formPositionAreaCss = css({ + padding: '0 5%', +}, BreakPoints.sm({ + marginBottom: '50px' +})) + +export const formAreaCss = css({ + background: 'rgba(0,0,0,0.7)', + borderRadius: theme.borderRadius.xs, + boxSizing: 'border-box', + margin: 0, + width: '100%', + display: 'flex', + flexDirection: 'column', +}, BreakPoints.sm({ + minHeight: '707px', + minWidth: '450px', + padding: '48px 68px' +})) + +export const formGridCss = css({ + display: 'flex', + flexDirection: 'column', + gap: '16px', + '> p': { + textAlign: 'center', + fontWeight: 400, + fontSize: '1rem', + color: 'rgba(255,255,255,0.7)' + } +}) + +export const formTitleCss = css({ + fontSize: '32px', + fontWeight: 700, + marginBottom: '28px' +}) \ No newline at end of file diff --git a/src/components/styled/layout.ts b/src/components/styled/layout.ts index 7ff08ee..a65d45d 100644 --- a/src/components/styled/layout.ts +++ b/src/components/styled/layout.ts @@ -1,3 +1,5 @@ +import type { CSSObject, SerializedStyles } from '@emotion/react'; +import { css } from '@emotion/react'; import facepaint from 'facepaint' type DisplaySize = 'xs' | 'sm' | 'md' | 'lg' | 'full' @@ -16,3 +18,25 @@ const sizes: Record = { export const MediaPoint = facepaint( Object.values(sizes).slice(1).map(v => `@media (min-width: ${v}px)`) ) +export const BreakPoints = { + /** + * minWidth: 0px + */ + xs: (args: CSSObject | SerializedStyles | (CSSObject | SerializedStyles)[]) => css({ [`@media (min-width: ${sizes.xs}px)`]: args }), + /** + * minWidth: 600px + */ + sm: (args: CSSObject | SerializedStyles | (CSSObject | SerializedStyles)[]) => css({ [`@media (min-width: ${sizes.sm}px)`]: args }), + /** + * minWidth: 960px + */ + md: (args: CSSObject | SerializedStyles | (CSSObject | SerializedStyles)[]) => css({ [`@media (min-width: ${sizes.md}px)`]: args }), + /** + * minWidth: 1280px + */ + lg: (args: CSSObject | SerializedStyles | (CSSObject | SerializedStyles)[]) => css({ [`@media (min-width: ${sizes.lg}px)`]: args }), + /** + * minWidth: 1920px + */ + full: (args: CSSObject | SerializedStyles | (CSSObject | SerializedStyles)[]) => css({ [`@media (min-width: ${sizes.full}px)`]: args }) +} \ No newline at end of file diff --git a/src/lib/network/utils.ts b/src/lib/network/utils.ts index 3957ae2..28a1a6f 100644 --- a/src/lib/network/utils.ts +++ b/src/lib/network/utils.ts @@ -1,2 +1,4 @@ export const ACCESS_TOKEN_KEY = 'access-token' export const REFRESH_TOKEN_KEY = 'refresh-token' + +export const SIGNIN_EMAIL_OR_PHONE = 'signin-emailOrPhone' \ No newline at end of file From 7edb3c998d8c8e2f0d3b53b7004aee560658ec01 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 21:59:02 +0900 Subject: [PATCH 07/18] add: signin page style & button css changed --- src/components/pages/Home/styles/HeroHead.ts | 5 +- .../pages/Signin/component/ButtonGroup.tsx | 5 +- .../pages/Signin/styles/ButtonGroupStyle.ts | 15 ++++ .../pages/Signup/styles/SignupMain.ts | 4 +- src/components/ui/Button/ButtonStyle.tsx | 84 ++++++++++++------- src/components/ui/theme/index.ts | 7 +- types/emotion/index.d.ts | 5 ++ 7 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 src/components/pages/Signin/styles/ButtonGroupStyle.ts diff --git a/src/components/pages/Home/styles/HeroHead.ts b/src/components/pages/Home/styles/HeroHead.ts index fae8f24..939aef1 100644 --- a/src/components/pages/Home/styles/HeroHead.ts +++ b/src/components/pages/Home/styles/HeroHead.ts @@ -1,7 +1,7 @@ import styled from '@emotion/styled'; import Link from 'next/link'; import { MediaPoint } from '@/components/styled/layout'; -import { DarkButtonInteractionCss, DefaultButtonCss } from '@/components/ui/Button/ButtonStyle'; +import { DefaultButtonCss, RedButtonCss } from '@/components/ui/Button/ButtonStyle'; import { TextDisplayCss } from '@/components/ui/Font/TextDisplayStyle'; import { theme } from '@/components/ui/theme'; import TopLogo from '@assets/netflix/top-logo.svg' @@ -59,7 +59,8 @@ export const HeroHeadRightSide = styled.div([{ export const HeroHeadSigninLink = styled(Link)([ TextDisplayCss, DefaultButtonCss, - DarkButtonInteractionCss, + RedButtonCss.color, + RedButtonCss.interaction.dark, { minHeight: '2rem', borderRadius: theme.borderRadius.xs, diff --git a/src/components/pages/Signin/component/ButtonGroup.tsx b/src/components/pages/Signin/component/ButtonGroup.tsx index 76644bc..688e79c 100644 --- a/src/components/pages/Signin/component/ButtonGroup.tsx +++ b/src/components/pages/Signin/component/ButtonGroup.tsx @@ -1,4 +1,5 @@ import type { MouseEventHandler } from 'react'; +import { ButtonActionCss, ButtonSubmitCss } from '../styles/ButtonGroupStyle'; interface ButtonGroupProps { submitText: string @@ -15,13 +16,13 @@ export default function ButtonGroup({ onButtonClick }: ButtonGroupProps) { return <> -

    {or}

    - diff --git a/src/components/pages/Signin/styles/ButtonGroupStyle.ts b/src/components/pages/Signin/styles/ButtonGroupStyle.ts new file mode 100644 index 0000000..246c7a6 --- /dev/null +++ b/src/components/pages/Signin/styles/ButtonGroupStyle.ts @@ -0,0 +1,15 @@ +import { css } from '@emotion/react'; +import { BlackButtonCss, DefaultButtonCss, RedButtonCss } from '@/components/ui/Button/ButtonStyle'; +import { TextDisplayCss } from '@/components/ui/Font/TextDisplayStyle'; + +export const ButtonGroupCss = css({ + height: '40px', + justifyContent: 'center', + alignItems: 'center', + fontWeight: 500, + fontSize: '1rem', +}, DefaultButtonCss, TextDisplayCss) + +export const ButtonSubmitCss = css(ButtonGroupCss, RedButtonCss.color, RedButtonCss.interaction.dark) + +export const ButtonActionCss = css(ButtonGroupCss, BlackButtonCss.color, BlackButtonCss.interaction.dark) diff --git a/src/components/pages/Signup/styles/SignupMain.ts b/src/components/pages/Signup/styles/SignupMain.ts index 540a001..afc47c3 100644 --- a/src/components/pages/Signup/styles/SignupMain.ts +++ b/src/components/pages/Signup/styles/SignupMain.ts @@ -1,5 +1,5 @@ import { css } from '@emotion/react'; -import { DefaultButtonCss, LightButtonInteractionCss } from '@/components/ui/Button/ButtonStyle'; +import { DefaultButtonCss, RedButtonCss, } from '@/components/ui/Button/ButtonStyle'; export const SignupMainContentCss = css([{ maxWidth: '340px', @@ -7,7 +7,7 @@ export const SignupMainContentCss = css([{ margin: '0 auto' }]) -export const SignupMainNextButtonCss = css([DefaultButtonCss, LightButtonInteractionCss, { +export const SignupMainNextButtonCss = css([DefaultButtonCss, RedButtonCss.color, RedButtonCss.interaction.light, { width: '100%', minHeight: '64px', fontSize: '24px', diff --git a/src/components/ui/Button/ButtonStyle.tsx b/src/components/ui/Button/ButtonStyle.tsx index f17910a..92e259f 100644 --- a/src/components/ui/Button/ButtonStyle.tsx +++ b/src/components/ui/Button/ButtonStyle.tsx @@ -2,9 +2,7 @@ import { css } from '@emotion/react'; import { theme } from '../theme'; export const DefaultButtonCss = css({ - fontFamily: `${theme.fonts.NetflixSans + ', ' + theme.fonts.Roboto};`, lineHeight: 1, - backgroundColor: theme.color.red.default, transitionDuration: '.25s', transitionProperty: ['background-color', 'border-color'], transitionTimingFunction: 'cubic-bezier(0.4,0,0.68,0.06)', @@ -14,36 +12,66 @@ export const DefaultButtonCss = css({ position: 'relative', boxSizing: 'border-box', display: 'inline-flex', - color: theme.color.white.default, fill: 'currentcolor', verticalAlign: 'text-top', minWidth: 'max-content', }) -export const DarkButtonInteractionCss = css({ - '&:hover': { - transitionTimingFunction: 'cubic-bezier(0.32,0.94,0.6,1)', - backgroundColor: theme.color.red.hover.dark, - borderColor: 'black' - }, - '&:active': { - transition: 'none', - color: theme.color.white.active, - backgroundColor: theme.color.red.active.dark, - }, - '&:focus:not(:focus-visible)': { - outline: 'none' +export const RedButtonCss = { + color: css({ + backgroundColor: theme.color.red.default, + color: theme.color.white.default, + }), + interaction: { + dark: css({ + '&:hover': { + transitionTimingFunction: 'cubic-bezier(0.32,0.94,0.6,1)', + backgroundColor: theme.color.red.hover.dark, + borderColor: 'black' + }, + '&:active': { + transition: 'none', + color: theme.color.white.active, + backgroundColor: theme.color.red.active.dark, + }, + '&:focus:not(:focus-visible)': { + outline: 'none' + } + }), + light: css({ + '&:hover': { + backgroundColor: theme.color.red.hover.light, + }, + '&:active': { + backgroundColor: theme.color.red.active.light, + }, + '&:focus:not(:focus-visible)': { + outline: 'none' + } + }) } -}) -console.log(theme.color.red.hover.light) -export const LightButtonInteractionCss = css({ - '&:hover': { - backgroundColor: theme.color.red.hover.light, - }, - '&:active': { - backgroundColor: theme.color.red.active.light, - }, - '&:focus:not(:focus-visible)': { - outline: 'none' +} + +export const BlackButtonCss = { + color: css({ + backgroundColor: theme.color.grey.buttonBg.default, + color: theme.color.white.default, + }), + interaction: { + dark: css({ + '&:hover': { + transitionTimingFunction: 'cubic-bezier(0.32,0.94,0.6,1)', + backgroundColor: theme.color.grey.buttonBg.hover, + borderColor: 'black' + }, + '&:active': { + transition: 'none', + color: theme.color.white.active, + backgroundColor: theme.color.grey.buttonBg.action, + }, + '&:focus:not(:focus-visible)': { + outline: 'none' + } + }) } -}) +} \ No newline at end of file diff --git a/src/components/ui/theme/index.ts b/src/components/ui/theme/index.ts index 20d5ce3..7c9afeb 100644 --- a/src/components/ui/theme/index.ts +++ b/src/components/ui/theme/index.ts @@ -17,7 +17,12 @@ export const theme: Theme = { lightDivider: '#e6e6e6', footerLightFont: '#737373', footerLightBg: '#f3f3f3', - outline: 'rgba(128,128,128,0.7)' + outline: 'rgba(128,128,128,0.7)', + buttonBg: { + default: 'rgba(128,128,128,0.4)', + action: 'rgba(128,128,128,0.3)', + hover: 'rgba(128,128,128,0.3)' + } }, white: { default: '#ffffff', diff --git a/types/emotion/index.d.ts b/types/emotion/index.d.ts index d0e986f..9632c30 100644 --- a/types/emotion/index.d.ts +++ b/types/emotion/index.d.ts @@ -17,6 +17,11 @@ declare module '@emotion/react' { footerLightFont: '#737373' footerLightBg: '#f3f3f3' outline: 'rgba(128,128,128,0.7)' + buttonBg: { + default: 'rgba(128,128,128,0.4)' + action: 'rgba(128,128,128,0.3)' + hover: 'rgba(128,128,128,0.3)' + } } white: { default: '#ffffff' From d4570d17e2366ba1695c042b21bef662a4208e22 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 21:59:14 +0900 Subject: [PATCH 08/18] fix: input z-index changed --- src/components/ui/Form/DarkTextInput/style.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/ui/Form/DarkTextInput/style.ts b/src/components/ui/Form/DarkTextInput/style.ts index c6d4b43..371bff7 100644 --- a/src/components/ui/Form/DarkTextInput/style.ts +++ b/src/components/ui/Form/DarkTextInput/style.ts @@ -41,7 +41,8 @@ export const InputAreaShellCss = css({ flex: '1 1 100%', position: 'relative', display: 'flex', - alignItems: 'center' + alignItems: 'center', + zIndex: 0 }) export const InputTagDefaultCss = css([{ From c240f77665fb544950ede50f63f9925d979350a9 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 22:57:02 +0900 Subject: [PATCH 09/18] add: checkbox --- public/netflix/input/checkbox-checked.svg | 3 + src/components/ui/Form/DarkCheckbox/index.tsx | 21 ++++++ src/components/ui/Form/DarkCheckbox/style.ts | 70 +++++++++++++++++++ src/components/ui/theme/index.ts | 6 +- types/emotion/index.d.ts | 4 ++ 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 public/netflix/input/checkbox-checked.svg create mode 100644 src/components/ui/Form/DarkCheckbox/index.tsx create mode 100644 src/components/ui/Form/DarkCheckbox/style.ts diff --git a/public/netflix/input/checkbox-checked.svg b/public/netflix/input/checkbox-checked.svg new file mode 100644 index 0000000..4bf35f6 --- /dev/null +++ b/public/netflix/input/checkbox-checked.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/components/ui/Form/DarkCheckbox/index.tsx b/src/components/ui/Form/DarkCheckbox/index.tsx new file mode 100644 index 0000000..1e9ddc9 --- /dev/null +++ b/src/components/ui/Form/DarkCheckbox/index.tsx @@ -0,0 +1,21 @@ +import type { InputHTMLAttributes } from 'react'; +import { useId } from 'react'; +import InputLayout from '../InputLayout' +import { CheckboxDisplayAreaCss, CheckboxAreaShellCss, CheckboxDivCss, CheckboxLabelDefaultCss, CheckboxLabelFromTextCss, CheckboxTagDefaultCss } from './style'; + +export default function DarkCheckbox({ + ...props +}: InputHTMLAttributes & CssProps) { + const inputId = useId() + const { ...inputProps } = props + return + +
    + +
    + + {props.placeholder} + +
    +
    +} \ No newline at end of file diff --git a/src/components/ui/Form/DarkCheckbox/style.ts b/src/components/ui/Form/DarkCheckbox/style.ts new file mode 100644 index 0000000..0546806 --- /dev/null +++ b/src/components/ui/Form/DarkCheckbox/style.ts @@ -0,0 +1,70 @@ +import { css } from '@emotion/react'; +import { theme } from '../../theme'; + +export const CheckboxDivCss = css([{ + display: 'inline-flex', +}]) + +const checkboxSize = '1.125rem' +const inputSize = '2.75rem' +const inputPosition = `calc((${inputSize} - ${checkboxSize}) / -2)` + +export const CheckboxAreaShellCss = css({ + position: 'relative', + display: 'grid', + alignItems: 'center', + gridTemplateColumns: `${checkboxSize} 1fr`, + zIndex: 0 +}) + +export const CheckboxDisplayAreaCss = css({ + width: checkboxSize, + height: checkboxSize +}) + +export const CheckboxTagDefaultCss = css([{ + appearance: 'none', + border: '0 solid transparent', + background: 'transparent', + position: 'relative', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + width: inputSize, + height: inputSize, + left: inputPosition, + top: inputPosition, + ':after': { + content: '""', + display: 'block', + width: checkboxSize, + height: checkboxSize, + borderRadius: theme.borderRadius.xxs, + borderStyle: 'solid', + borderWidth: '1px', + borderColor: theme.color.black.default, + backgroundColor: theme.color.white.default, + }, + ':checked:after': { + backgroundImage: 'url(/netflix/input/checkbox-checked.svg)', + backgroundRepeat: 'no-repeat', + backgroundPosition: 'center', + backgroundSize: '.75rem' + } +}]) + +export const CheckboxLabelDefaultCss = css([{ + zIndex: 1, + paddingLeft: '0.75rem', + textAlign: 'start', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', +}]) + +export const CheckboxLabelFromTextCss = css([{ + fontWeight: '400', + lineHeight: 1.5, + color: theme.color.white.default, + fontSize: '1rem', +}]) diff --git a/src/components/ui/theme/index.ts b/src/components/ui/theme/index.ts index 7c9afeb..b851a6d 100644 --- a/src/components/ui/theme/index.ts +++ b/src/components/ui/theme/index.ts @@ -9,9 +9,13 @@ export const theme: Theme = { }, borderRadius: { sm: '.325rem', - xs: '.25rem' + xs: '.25rem', + xxs: '.125rem', }, color: { + black: { + default: '#000' + }, grey: { defaultFont: '#333', lightDivider: '#e6e6e6', diff --git a/types/emotion/index.d.ts b/types/emotion/index.d.ts index 9632c30..899019d 100644 --- a/types/emotion/index.d.ts +++ b/types/emotion/index.d.ts @@ -9,8 +9,12 @@ declare module '@emotion/react' { borderRadius: { sm: '.325rem' xs: '.25rem' + xxs: '.125rem' } color: { + black: { + default: '#000' + }, grey: { defaultFont: '#333' lightDivider: '#e6e6e6' From 84bfe81fa60eeb53efe089aa7dbb9a5a1fbe083f Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:06:52 +0900 Subject: [PATCH 10/18] add: signin footer --- src/components/pages/Signin/SigninPage.tsx | 15 +++++++++- .../pages/Signin/styles/signinPageStyle.ts | 28 ++++++++++++++++++- src/components/ui/Form/DarkCheckbox/index.tsx | 4 +-- src/components/ui/theme/index.ts | 3 +- types/emotion/index.d.ts | 1 + 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index 47e5eaa..5e30c4d 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -9,6 +9,7 @@ import { useTranslation } from 'next-i18next'; import { useState } from 'react'; import BaseLayout from '@/components/layout/BaseLayout'; import { HeaderLinkStyleCss } from '@/components/layout/styles/SignupLayoutStyle'; +import DarkCheckbox from '@/components/ui/Form/DarkCheckbox'; import ConditionalRender from '@/components/ui/utils/ConditionalRender'; import { SigninApi } from '@/lib/network/account/SigninApi'; import { SigninWithLoginCodeApi } from '@/lib/network/account/SigninWithLoginCodeApi'; @@ -18,7 +19,7 @@ import NetflixLogo from '@assets/netflix/top-logo.svg' import ButtonGroup from './component/ButtonGroup'; import LoginCodeForm from './component/LoginCodeForm'; import PasswordForm from './component/PasswordForm'; -import { backgroundCss, formAreaCss, formGridCss, formPositionAreaCss, formTitleCss, headerAreaCss, signinPageBaseCss } from './styles/signinPageStyle'; +import { backgroundCss, forgotPasswordCss, formAreaCss, formGridCss, formPositionAreaCss, formTitleCss, headerAreaCss, rememberSigninInfoCss, signinPageBaseCss, signupLinkCss } from './styles/signinPageStyle'; const SigninPage: NextPageWithLayout = () => { const router = useRouter() @@ -107,6 +108,18 @@ const SigninPage: NextPageWithLayout = () => { /> }} /> +
    + + {t('page-signin:findPassword')} + + +

    + {t('page-signin:areYouGuest')}  + + {t('page-signin:gotoSignup')} + +

    +
    diff --git a/src/components/pages/Signin/styles/signinPageStyle.ts b/src/components/pages/Signin/styles/signinPageStyle.ts index a78f5c7..f8f3d59 100644 --- a/src/components/pages/Signin/styles/signinPageStyle.ts +++ b/src/components/pages/Signin/styles/signinPageStyle.ts @@ -60,7 +60,7 @@ export const formGridCss = css({ textAlign: 'center', fontWeight: 400, fontSize: '1rem', - color: 'rgba(255,255,255,0.7)' + color: theme.color.white.opacity70 } }) @@ -68,4 +68,30 @@ export const formTitleCss = css({ fontSize: '32px', fontWeight: 700, marginBottom: '28px' +}) + +export const forgotPasswordCss = css({ + color: theme.color.white.default, + textAlign: 'center', + fontWeight: 400, + fontSize: '1rem', + margin: '16px auto 0', + display: 'block', + ':hover': { + textDecoration: 'underline' + } +}) + +export const rememberSigninInfoCss = css({ + marginTop: '1.25rem' +}) + +export const signupLinkCss = css({ + marginTop: '1rem', + color: theme.color.white.opacity70, + fontSize: '1rem', + fontWeight: 400, + '> a': { + color: theme.color.white.default + } }) \ No newline at end of file diff --git a/src/components/ui/Form/DarkCheckbox/index.tsx b/src/components/ui/Form/DarkCheckbox/index.tsx index 1e9ddc9..1e4beca 100644 --- a/src/components/ui/Form/DarkCheckbox/index.tsx +++ b/src/components/ui/Form/DarkCheckbox/index.tsx @@ -4,11 +4,11 @@ import InputLayout from '../InputLayout' import { CheckboxDisplayAreaCss, CheckboxAreaShellCss, CheckboxDivCss, CheckboxLabelDefaultCss, CheckboxLabelFromTextCss, CheckboxTagDefaultCss } from './style'; export default function DarkCheckbox({ - ...props + className, ...props }: InputHTMLAttributes & CssProps) { const inputId = useId() const { ...inputProps } = props - return + return
    diff --git a/src/components/ui/theme/index.ts b/src/components/ui/theme/index.ts index b851a6d..b86ebee 100644 --- a/src/components/ui/theme/index.ts +++ b/src/components/ui/theme/index.ts @@ -14,7 +14,7 @@ export const theme: Theme = { }, color: { black: { - default: '#000' + default: '#000', }, grey: { defaultFont: '#333', @@ -30,6 +30,7 @@ export const theme: Theme = { }, white: { default: '#ffffff', + opacity70: 'rgba(255,255,255,0.7)', active: 'rgba(255,255,255,0.7)', hover: 'rgba(255,255,255,0.7)', }, diff --git a/types/emotion/index.d.ts b/types/emotion/index.d.ts index 899019d..2b9dff4 100644 --- a/types/emotion/index.d.ts +++ b/types/emotion/index.d.ts @@ -29,6 +29,7 @@ declare module '@emotion/react' { } white: { default: '#ffffff' + opacity70: 'rgba(255,255,255,0.7)', active: 'rgba(255,255,255,0.7)' hover: 'rgba(255,255,255,0.7)' } From f13247ac4769a955856224e19c8920421392d6e2 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:09:14 +0900 Subject: [PATCH 11/18] fix: i18n type mistypo --- types/i18n/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/i18n/index.d.ts b/types/i18n/index.d.ts index 0261613..e2ec591 100644 --- a/types/i18n/index.d.ts +++ b/types/i18n/index.d.ts @@ -9,8 +9,8 @@ import 'i18next' // resources.ts file is generated with `npm run toc` import type common from '../../public/locales/en/common.json' import type PageHome from '../../public/locales/en/page-home.json' +import type PageSignin from '../../public/locales/en/page-signin.json' import type PageSignup from '../../public/locales/en/page-signup.json' -import type PageSignin from '../../public/locales/en/page-singin.json' declare module 'i18next' { interface CustomTypeOptions { From b33a3a93bab51f38204ab71e4c1973c92aaaf0e3 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:17:41 +0900 Subject: [PATCH 12/18] fix: api url mistypo --- src/mocks/handlers/account.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mocks/handlers/account.ts b/src/mocks/handlers/account.ts index 68c6f9f..461199f 100644 --- a/src/mocks/handlers/account.ts +++ b/src/mocks/handlers/account.ts @@ -59,7 +59,7 @@ const handlers = [ result: true }) })), - http.post('/api/signup', ErrorHandler(async ({ request }) => { + http.post('/api/signin', ErrorHandler(async ({ request }) => { const requestJson = await request.json() const account = Object.values(accountList).find( (account) => { From 52db5fc1bdcd883147e0191d09d74e0b708d4519 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:32:12 +0900 Subject: [PATCH 13/18] fix: signin jwt generate issue --- src/mocks/middleware/token.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mocks/middleware/token.ts b/src/mocks/middleware/token.ts index e503b3f..91ca0bf 100644 --- a/src/mocks/middleware/token.ts +++ b/src/mocks/middleware/token.ts @@ -14,12 +14,19 @@ type JwtPayloadType = JWTPayload & JwtCustomPayload const secret = new TextEncoder().encode( 'FciQubnp5uouLKK8s27hI6UpAfSuf9rjBMC3lyzjqqilYcc9X9L0SH5wcXUDCVAFO0S5YtIEnD3I4LEGuhsPKDPRZqDAgdFyNwus', ) - +const issuer = 'jwt-issuer:matthew' +const audience = 'jwt-audience:matthew' async function generateJWT(accountId: number, isRefreshToken: boolean) { const token = await new SignJWT({ accountId, isRefreshToken }) + .setProtectedHeader({ + alg: 'HS256' + }) + .setIssuedAt() + .setIssuer(issuer) + .setAudience(audience) .setExpirationTime(isRefreshToken ? '4w' : '1w') .sign(secret) return token From db44db24d37ca45e3ce0113152e563b05e87bcd6 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:40:30 +0900 Subject: [PATCH 14/18] fix: form type --- src/components/pages/Signin/component/LoginCodeForm.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/pages/Signin/component/LoginCodeForm.tsx b/src/components/pages/Signin/component/LoginCodeForm.tsx index 4eb7b0e..ed48bbb 100644 --- a/src/components/pages/Signin/component/LoginCodeForm.tsx +++ b/src/components/pages/Signin/component/LoginCodeForm.tsx @@ -1,4 +1,4 @@ -import type { SigninRequestType } from '@/lib/network/types/account'; +import type { SigninWithCodeRequestType } from '@/lib/network/types/account'; import type { ReactNode } from 'react'; import { useTranslation } from 'next-i18next'; import { useForm } from 'react-hook-form'; @@ -7,7 +7,7 @@ import RHFValidErrorHelper from '@/components/ui/Form/utils/RHFValidErrorHelper' import validators from '@/lib/validators'; interface LoginCodeFormProps { - mutate: (_data: SigninRequestType) => void + mutate: (_data: SigninWithCodeRequestType) => void buttonArea: ReactNode } export default function LoginCodeForm({ @@ -17,10 +17,10 @@ export default function LoginCodeForm({ }: LoginCodeFormProps & CssProps) { const { t } = useTranslation(['common']) - const { register, handleSubmit, formState } = useForm({ + const { register, handleSubmit, formState } = useForm({ mode: 'onBlur' }) - const signinFunction = (obj: SigninRequestType) => { + const signinFunction = (obj: SigninWithCodeRequestType) => { mutate(obj) } From e6e593f3534df858045b4d334ff9c4411ab8108e Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Mon, 20 Jan 2025 12:11:14 +0900 Subject: [PATCH 15/18] fix: api error --- src/components/pages/Signin/SigninPage.tsx | 11 ++++++++++- src/lib/network/index.ts | 13 +++++++++++++ src/mocks/middleware/ErrorHandler.ts | 6 +++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index 5e30c4d..f4807ea 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -1,4 +1,5 @@ import type { SigninResponseType, SigninWithCodeResponseType } from '@/lib/network/types/account'; +import type { ErrorResponse } from '@/lib/network/types/error'; import type { NextPageWithLayout } from '@/pages/_app'; import { useMutation } from '@tanstack/react-query'; import { useAtom } from 'jotai'; @@ -14,6 +15,7 @@ import ConditionalRender from '@/components/ui/utils/ConditionalRender'; import { SigninApi } from '@/lib/network/account/SigninApi'; import { SigninWithLoginCodeApi } from '@/lib/network/account/SigninWithLoginCodeApi'; import { SIGNIN_EMAIL_OR_PHONE } from '@/lib/network/utils'; +import { ErrorCode } from '@/mocks/middleware/ErrorHandler'; import { accessTokenAtom, refreshTokenAtom } from '@/state/Token'; import NetflixLogo from '@assets/netflix/top-logo.svg' import ButtonGroup from './component/ButtonGroup'; @@ -29,7 +31,8 @@ const SigninPage: NextPageWithLayout = () => { const [, setRefreshToken] = useAtom(refreshTokenAtom) const { mutate: signinMutate } = useMutation({ mutationFn: SigninApi, - onSuccess: loginSuccessAction + onSuccess: loginSuccessAction, + onError: loginFailedAction }) function loginSuccessAction(data: SigninResponseType) { @@ -37,6 +40,12 @@ const SigninPage: NextPageWithLayout = () => { setRefreshToken(data.refreshToken) router.push('/selectProfile') } + function loginFailedAction(error: Error) { + const errorState: ErrorResponse = JSON.parse(error.message) + if (errorState.errorCode === ErrorCode.SIGNIN_FAILED) { + // TODO: display error message + } + } const { mutate: signinWithLoginCodeMutate } = useMutation({ mutationFn: SigninWithLoginCodeApi, diff --git a/src/lib/network/index.ts b/src/lib/network/index.ts index bd601d8..2b6dd87 100644 --- a/src/lib/network/index.ts +++ b/src/lib/network/index.ts @@ -1,10 +1,23 @@ import type { RefreshTokenResponseType } from './types/account'; +import type { ErrorResponse } from './types/error'; +import type { HTTPError } from 'ky'; import ky from 'ky' import { ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY } from './utils' const baseApi = ky.extend({ prefixUrl: '/api/', hooks: { + beforeError: [ + async (error: HTTPError) => { + const { response } = error; + if (response && response.body) { + const json = await response.json() + error.name = `API Error ${json.errorCode}`; + error.message = JSON.stringify(json); + } + return error; + } + ], beforeRequest: [ (request) => { if (typeof window !== 'undefined') { diff --git a/src/mocks/middleware/ErrorHandler.ts b/src/mocks/middleware/ErrorHandler.ts index 4350ef4..d54e2e4 100644 --- a/src/mocks/middleware/ErrorHandler.ts +++ b/src/mocks/middleware/ErrorHandler.ts @@ -17,10 +17,11 @@ export function ErrorHandler { return async (args) => { try { - return resolver(args); + const result = await resolver(args) + return result; } catch (e) { if (e instanceof ErrorException) { - let errorStateCode = 200 + let errorStateCode = 500 if (e.errorCode === ErrorCode.AUTH_FAILED) { errorStateCode = 401 } else if (e.errorCode === ErrorCode.AUTH_EXPIRED) { @@ -33,7 +34,6 @@ export function ErrorHandler({ errorCode: -999999, message: 'Unhandled error Thrown' From fd5294fcf7e4be331c8e18d8912c93a6753e2515 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:49:18 +0900 Subject: [PATCH 16/18] fix: client only storage --- src/state/util/Storage.ts | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/state/util/Storage.ts b/src/state/util/Storage.ts index d4127a9..ed95d1e 100644 --- a/src/state/util/Storage.ts +++ b/src/state/util/Storage.ts @@ -1,33 +1,23 @@ import type { SyncStringStorage } from 'jotai/vanilla/utils/atomWithStorage'; import { createJSONStorage } from 'jotai/utils'; -const isBrowser = typeof window !== 'undefined' -const serverObj: { [k: string]: string } = {} +const isBrowser = typeof window === 'undefined' export const CoveredLocalStorage: SyncStringStorage = { getItem: (key) => { - if (isBrowser) { - return localStorage.getItem(key) - } else { - return serverObj[key] - } + if (isBrowser) return '' + return localStorage.getItem(key) }, setItem(key, newValue) { - if (isBrowser) { - localStorage.setItem(key, newValue) - } else { - serverObj[key] = newValue - } + if (isBrowser) return + localStorage.setItem(key, newValue) }, removeItem(key) { - if (isBrowser) { - return localStorage.removeItem(key) - } else { - return serverObj[key] - } + if (isBrowser) return + localStorage.removeItem(key) }, subscribe(key, callback) { - if (!isBrowser) return () => { } + if (isBrowser) return () => { } const windowEventListener = (e: StorageEvent) => { if (e.storageArea === localStorage && e.key === key) { callback(localStorage.getItem(key)) From 95ace8e6f3a25cbfffe4360266ae4e36f060af7a Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:55:29 +0900 Subject: [PATCH 17/18] fix: defaultValue on LoginCodeForm --- src/components/pages/Signin/component/LoginCodeForm.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/pages/Signin/component/LoginCodeForm.tsx b/src/components/pages/Signin/component/LoginCodeForm.tsx index ed48bbb..e16c035 100644 --- a/src/components/pages/Signin/component/LoginCodeForm.tsx +++ b/src/components/pages/Signin/component/LoginCodeForm.tsx @@ -18,7 +18,10 @@ export default function LoginCodeForm({ const { t } = useTranslation(['common']) const { register, handleSubmit, formState } = useForm({ - mode: 'onBlur' + mode: 'onBlur', + defaultValues: { + emailOrPhone: '' + } }) const signinFunction = (obj: SigninWithCodeRequestType) => { mutate(obj) From d62ecc079097c80e95d7f5a27989ac2d3bd1a273 Mon Sep 17 00:00:00 2001 From: cjhih456 <42570411+cjhih456@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:13:21 +0900 Subject: [PATCH 18/18] fix: signin page diffusion of responsibility --- src/components/pages/Signin/SigninPage.tsx | 52 ------------------- .../pages/Signin/component/LoginCodeForm.tsx | 7 ++- .../pages/Signin/component/PasswordForm.tsx | 6 +-- .../hooks/useSendSigninWithCodeRequest.ts | 32 ++++++++++++ .../hooks/useSigninWIthPasswordMutate.tsx | 33 ++++++++++++ src/state/Account.ts | 5 ++ src/state/util/Storage.ts | 28 +++++----- 7 files changed, 92 insertions(+), 71 deletions(-) create mode 100644 src/components/pages/Signin/hooks/useSendSigninWithCodeRequest.ts create mode 100644 src/components/pages/Signin/hooks/useSigninWIthPasswordMutate.tsx create mode 100644 src/state/Account.ts diff --git a/src/components/pages/Signin/SigninPage.tsx b/src/components/pages/Signin/SigninPage.tsx index f4807ea..57eb80e 100644 --- a/src/components/pages/Signin/SigninPage.tsx +++ b/src/components/pages/Signin/SigninPage.tsx @@ -1,22 +1,12 @@ -import type { SigninResponseType, SigninWithCodeResponseType } from '@/lib/network/types/account'; -import type { ErrorResponse } from '@/lib/network/types/error'; import type { NextPageWithLayout } from '@/pages/_app'; -import { useMutation } from '@tanstack/react-query'; -import { useAtom } from 'jotai'; import Image from 'next/image'; import Link from 'next/link'; -import { useRouter } from 'next/router'; import { useTranslation } from 'next-i18next'; import { useState } from 'react'; import BaseLayout from '@/components/layout/BaseLayout'; import { HeaderLinkStyleCss } from '@/components/layout/styles/SignupLayoutStyle'; import DarkCheckbox from '@/components/ui/Form/DarkCheckbox'; import ConditionalRender from '@/components/ui/utils/ConditionalRender'; -import { SigninApi } from '@/lib/network/account/SigninApi'; -import { SigninWithLoginCodeApi } from '@/lib/network/account/SigninWithLoginCodeApi'; -import { SIGNIN_EMAIL_OR_PHONE } from '@/lib/network/utils'; -import { ErrorCode } from '@/mocks/middleware/ErrorHandler'; -import { accessTokenAtom, refreshTokenAtom } from '@/state/Token'; import NetflixLogo from '@assets/netflix/top-logo.svg' import ButtonGroup from './component/ButtonGroup'; import LoginCodeForm from './component/LoginCodeForm'; @@ -24,47 +14,8 @@ import PasswordForm from './component/PasswordForm'; import { backgroundCss, forgotPasswordCss, formAreaCss, formGridCss, formPositionAreaCss, formTitleCss, headerAreaCss, rememberSigninInfoCss, signinPageBaseCss, signupLinkCss } from './styles/signinPageStyle'; const SigninPage: NextPageWithLayout = () => { - const router = useRouter() const [isLoginCodeForm, setIsLoginCodeForm] = useState(false) const { t } = useTranslation(['common', 'page-signin']) - const [, setAccessToken] = useAtom(accessTokenAtom) - const [, setRefreshToken] = useAtom(refreshTokenAtom) - const { mutate: signinMutate } = useMutation({ - mutationFn: SigninApi, - onSuccess: loginSuccessAction, - onError: loginFailedAction - }) - - function loginSuccessAction(data: SigninResponseType) { - setAccessToken(data.accessToken) - setRefreshToken(data.refreshToken) - router.push('/selectProfile') - } - function loginFailedAction(error: Error) { - const errorState: ErrorResponse = JSON.parse(error.message) - if (errorState.errorCode === ErrorCode.SIGNIN_FAILED) { - // TODO: display error message - } - } - - const { mutate: signinWithLoginCodeMutate } = useMutation({ - mutationFn: SigninWithLoginCodeApi, - onMutate(variables) { - sessionStorage.setItem(SIGNIN_EMAIL_OR_PHONE, variables.emailOrPhone) - return () => { - sessionStorage.removeItem(SIGNIN_EMAIL_OR_PHONE) - } - }, - onSuccess: loginWithCodeAction, - onError(_error, _variables, context) { - if (context) context() - } - }) - function loginWithCodeAction(data: SigninWithCodeResponseType) { - if (data.result) { - router.push('/signinWithLoginCode') - } - } return
    @@ -87,7 +38,6 @@ const SigninPage: NextPageWithLayout = () => { render={{ true:

    {t('page-signin:loginCodeDesc')}

    @@ -104,7 +54,6 @@ const SigninPage: NextPageWithLayout = () => { />, false: { onButtonClick={() => { setIsLoginCodeForm(true) }} - />} /> }} diff --git a/src/components/pages/Signin/component/LoginCodeForm.tsx b/src/components/pages/Signin/component/LoginCodeForm.tsx index e16c035..7d19349 100644 --- a/src/components/pages/Signin/component/LoginCodeForm.tsx +++ b/src/components/pages/Signin/component/LoginCodeForm.tsx @@ -5,18 +5,17 @@ import { useForm } from 'react-hook-form'; import DarkTextInput from '@/components/ui/Form/DarkTextInput'; import RHFValidErrorHelper from '@/components/ui/Form/utils/RHFValidErrorHelper'; import validators from '@/lib/validators'; +import useSendSigninWithCodeRequest from '../hooks/useSendSigninWithCodeRequest'; interface LoginCodeFormProps { - mutate: (_data: SigninWithCodeRequestType) => void buttonArea: ReactNode } export default function LoginCodeForm({ - mutate, buttonArea, className }: LoginCodeFormProps & CssProps) { const { t } = useTranslation(['common']) - + const { signinWithLoginCodeMutate } = useSendSigninWithCodeRequest() const { register, handleSubmit, formState } = useForm({ mode: 'onBlur', defaultValues: { @@ -24,7 +23,7 @@ export default function LoginCodeForm({ } }) const signinFunction = (obj: SigninWithCodeRequestType) => { - mutate(obj) + signinWithLoginCodeMutate(obj) } return
    diff --git a/src/components/pages/Signin/component/PasswordForm.tsx b/src/components/pages/Signin/component/PasswordForm.tsx index e4ca85f..f0de665 100644 --- a/src/components/pages/Signin/component/PasswordForm.tsx +++ b/src/components/pages/Signin/component/PasswordForm.tsx @@ -5,13 +5,12 @@ import { useForm } from 'react-hook-form'; import DarkTextInput from '@/components/ui/Form/DarkTextInput'; import RHFValidErrorHelper from '@/components/ui/Form/utils/RHFValidErrorHelper'; import validators, { pattern } from '@/lib/validators'; +import useSigninWIthPasswordMutate from '../hooks/useSigninWIthPasswordMutate'; interface PasswordFormProps { - mutate: (_data: SigninRequestType) => void buttonArea: ReactNode } export default function PasswordForm({ - mutate, buttonArea, className }: PasswordFormProps & CssProps) { @@ -20,8 +19,9 @@ export default function PasswordForm({ const { register, handleSubmit, formState } = useForm({ mode: 'onBlur' }) + const { signinMutate } = useSigninWIthPasswordMutate() const signinFunction = (obj: SigninRequestType) => { - mutate(obj) + signinMutate(obj) } return diff --git a/src/components/pages/Signin/hooks/useSendSigninWithCodeRequest.ts b/src/components/pages/Signin/hooks/useSendSigninWithCodeRequest.ts new file mode 100644 index 0000000..c4a0f94 --- /dev/null +++ b/src/components/pages/Signin/hooks/useSendSigninWithCodeRequest.ts @@ -0,0 +1,32 @@ +import type { SigninWithCodeResponseType } from '@/lib/network/types/account'; +import { useMutation } from '@tanstack/react-query' +import { useAtom } from 'jotai' +import { useRouter } from 'next/router'; +import { SigninWithLoginCodeApi } from '@/lib/network/account/SigninWithLoginCodeApi' +import { signinEmailOrPhoneAtom } from '@/state/Account' + +export default function useSendSigninWithCodeRequest() { + const router = useRouter() + const [, setSigninEmailOrPhone] = useAtom(signinEmailOrPhoneAtom) + const { mutate: signinWithLoginCodeMutate } = useMutation({ + mutationFn: SigninWithLoginCodeApi, + onMutate(variables) { + setSigninEmailOrPhone(variables.emailOrPhone) + return () => { + setSigninEmailOrPhone('') + } + }, + onSuccess: loginWithCodeAction, + onError(_error, _variables, context) { + if (context) context() + } + }) + function loginWithCodeAction(data: SigninWithCodeResponseType) { + if (data.result) { + router.push('/signinWithLoginCode') + } + } + return { + signinWithLoginCodeMutate + } +} \ No newline at end of file diff --git a/src/components/pages/Signin/hooks/useSigninWIthPasswordMutate.tsx b/src/components/pages/Signin/hooks/useSigninWIthPasswordMutate.tsx new file mode 100644 index 0000000..9187796 --- /dev/null +++ b/src/components/pages/Signin/hooks/useSigninWIthPasswordMutate.tsx @@ -0,0 +1,33 @@ +import type { SigninResponseType } from '@/lib/network/types/account'; +import type { ErrorResponse } from '@/lib/network/types/error'; +import { useMutation } from '@tanstack/react-query' +import { useAtom } from 'jotai' +import { useRouter } from 'next/router'; +import { SigninApi } from '@/lib/network/account/SigninApi' +import { ErrorCode } from '@/mocks/middleware/ErrorHandler'; +import { accessTokenAtom, refreshTokenAtom } from '@/state/Token' + +export default function useSigninWIthPasswordMutate() { + const router = useRouter() + const [, setAccessToken] = useAtom(accessTokenAtom) + const [, setRefreshToken] = useAtom(refreshTokenAtom) + const { mutate: signinMutate } = useMutation({ + mutationFn: SigninApi, + onSuccess: loginSuccessAction, + onError: loginFailedAction + }) + function loginSuccessAction(data: SigninResponseType) { + setAccessToken(data.accessToken) + setRefreshToken(data.refreshToken) + router.push('/') + } + function loginFailedAction(error: Error) { + const errorState: ErrorResponse = JSON.parse(error.message) + if (errorState.errorCode === ErrorCode.SIGNIN_FAILED) { + // TODO: display error message + } + } + return { + signinMutate + } +} \ No newline at end of file diff --git a/src/state/Account.ts b/src/state/Account.ts new file mode 100644 index 0000000..3bbe056 --- /dev/null +++ b/src/state/Account.ts @@ -0,0 +1,5 @@ +import { atomWithStorage } from 'jotai/utils'; +import { SIGNIN_EMAIL_OR_PHONE } from '@/lib/network/utils'; +import { JotaiSessionStorage } from './util/Storage'; + +export const signinEmailOrPhoneAtom = atomWithStorage(SIGNIN_EMAIL_OR_PHONE, '', JotaiSessionStorage) \ No newline at end of file diff --git a/src/state/util/Storage.ts b/src/state/util/Storage.ts index ed95d1e..1cde6fe 100644 --- a/src/state/util/Storage.ts +++ b/src/state/util/Storage.ts @@ -3,24 +3,24 @@ import { createJSONStorage } from 'jotai/utils'; const isBrowser = typeof window === 'undefined' -export const CoveredLocalStorage: SyncStringStorage = { +const CoveredStorageGenerate = (storage: Storage | null): SyncStringStorage => ({ getItem: (key) => { - if (isBrowser) return '' - return localStorage.getItem(key) + if (!storage) return '' + return storage.getItem(key) }, setItem(key, newValue) { - if (isBrowser) return - localStorage.setItem(key, newValue) + if (!storage) return + storage.setItem(key, newValue) }, removeItem(key) { - if (isBrowser) return - localStorage.removeItem(key) + if (!storage) return + storage.removeItem(key) }, subscribe(key, callback) { - if (isBrowser) return () => { } + if (!storage) return () => { } const windowEventListener = (e: StorageEvent) => { - if (e.storageArea === localStorage && e.key === key) { - callback(localStorage.getItem(key)) + if (e.storageArea === storage && e.key === key) { + callback(storage.getItem(key)) } } window.addEventListener('storage', windowEventListener) @@ -28,6 +28,10 @@ export const CoveredLocalStorage: SyncStringStorage = { window.removeEventListener('storage', windowEventListener) } } -} +}) -export const JotaiLocalStorage = createJSONStorage(() => CoveredLocalStorage) \ No newline at end of file +export const CoveredLocalStorage: SyncStringStorage = CoveredStorageGenerate(isBrowser ? localStorage : null) +export const CoveredSessionStorage: SyncStringStorage = CoveredStorageGenerate(isBrowser ? sessionStorage : null) + +export const JotaiLocalStorage = createJSONStorage(() => CoveredLocalStorage) +export const JotaiSessionStorage = createJSONStorage(() => CoveredSessionStorage) \ No newline at end of file