Open bbanderson opened 3 years ago
와이어프레임을 보면서 페이지 인터랙션에 관한 이슈를 정리합니다.
페이지 별 파일을 pages에 정리하고, mocking data를 추가합니다.
. ├── context │ └── AuthContext.tsx └── pages ├── _app.tsx ├── _document.tsx ├── index.tsx ├── join.tsx ├── welcome.tsx ├── push.tsx ├── notice.tsx ├── account.tsx └── spaces ├── index.tsx └── [postId] ├── index.tsx ├── new.tsx └── edit.tsx
// context/AuthContext.tsx import { createContext, useContext, ReactNode, useState } from 'react'; type authContextType = { user: boolean; login: () => void; logout: () => void; }; const authContextDefaultValues: authContextType = { user: false, login: () => undefined, logout: () => undefined, }; const AuthContext = createContext<authContextType>(authContextDefaultValues); export function useAuth() { return useContext(AuthContext); } type Props = { children: ReactNode; }; export function AuthProvider({ children }: Props) { console.log('AuthProvider'); const [user, setUser] = useState<boolean>(false); const login = () => { console.log('로그인'); setUser(true); }; const logout = () => { console.log('로그아웃'); setUser(false); }; const value = { user, login, logout, }; return ( <> <AuthContext.Provider value={value}>{children}</AuthContext.Provider> </> ); }
// pages/_app.tsx import type { AppProps } from 'next/app'; import { AuthProvider, useAuth } from '@hermes/app/contexts/AuthContext'; import Head from 'next/head'; import { GlobalStyle } from '@hermes/design-system'; function MyApp({ Component, pageProps }: AppProps) { const { user, login, logout } = useAuth(); return ( <> <Head> <meta charSet="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>HERMES</title> </Head> <GlobalStyle /> <AuthProvider> <div> {/* 아래 버튼들이 GNB에 있다고 가정 */} {user ? '로그인 상태입니다.' : '로그아웃 상태입니다.'} {!user ? ( <button type="button" onClick={login}> 로그인 </button> ) : ( <button type="button" onClick={logout}> 로그아웃 </button> )} </div> <Component {...pageProps} /> </AuthProvider> </> ); } export default MyApp;
/
/spaces
/welcome
/join
// spaces import { useAuth } from 'contexts/AuthContext'; import { NextPage } from 'next'; import { useRouter } from 'next/router'; import { useEffect } from 'react'; const Spaces: NextPage = () => { const { user } = useAuth(); const router = useRouter(); useEffect(() => { if (!user) { router.replace('/'); } }, [router, user]); return ( <> <div>스페이스 대시보드</div> </> ); }; export default Spaces;
// spaces/:postId import { NextPage } from 'next'; import { useRouter } from 'next/router'; const Post: NextPage = () => { const { query } = useRouter(); return <div>글 {query.postId}</div>; }; export default Post;
페이지 구조 설계
와이어프레임을 보면서 페이지 인터랙션에 관한 이슈를 정리합니다.
Goals
페이지 별 파일을 pages에 정리하고, mocking data를 추가합니다.
페이지 경로
페이지 구조
contextAPI
랜딩페이지
/
/spaces
로 리다이렉트/welcome
으로 리다이렉트/spaces
로 리다이렉트/join
으로 리다이렉트/join
으로 유도하는 것 추가하면 어떨까요?회원가입 페이지
/join
/spaces
로 리다이렉트/welcome
으로 push최초 로그인 시 개인 스페이스 생성 페이지
/welcome
/spaces
로 리다이렉트/welcome
렌더링/spaces
로 push스페이스 대시보드 페이지
/spaces
/spaces
렌더링/
로 리다이렉트