diff --git a/apps/admin/src/pages/GlobalError/GlobalError.tsx b/apps/admin/src/pages/GlobalError/GlobalError.tsx new file mode 100644 index 0000000..f6d820e --- /dev/null +++ b/apps/admin/src/pages/GlobalError/GlobalError.tsx @@ -0,0 +1,39 @@ +import { Button, TriangleWarningIcon } from '@muneo/design-system'; +import { useEffect } from 'react'; +import { Link, useRouteError } from 'react-router'; +import { ROUTES } from '@/constants/routes'; + +export const GlobalError = () => { + const error = useRouteError(); + + useEffect(() => { + console.error(error); + }, [error]); + + return ( +
+ +

오류가 발생했습니다

+

일시적인 문제가 발생했습니다. 다시 시도해주세요.

+
+ + +
+
+ ); +}; diff --git a/apps/admin/src/pages/LoginPage/LoginPage.css.ts b/apps/admin/src/pages/Login/Login.css.ts similarity index 100% rename from apps/admin/src/pages/LoginPage/LoginPage.css.ts rename to apps/admin/src/pages/Login/Login.css.ts diff --git a/apps/admin/src/pages/LoginPage/LoginPage.tsx b/apps/admin/src/pages/Login/Login.tsx similarity index 81% rename from apps/admin/src/pages/LoginPage/LoginPage.tsx rename to apps/admin/src/pages/Login/Login.tsx index 1650837..557e0b8 100644 --- a/apps/admin/src/pages/LoginPage/LoginPage.tsx +++ b/apps/admin/src/pages/Login/Login.tsx @@ -1,7 +1,7 @@ import { LoginForm } from './components/LoginForm'; -import * as styles from './LoginPage.css'; +import * as styles from './Login.css'; -export const LoginPage = () => ( +export const Login = () => (
diff --git a/apps/admin/src/pages/LoginPage/components/LoginForm.tsx b/apps/admin/src/pages/Login/components/LoginForm.tsx similarity index 96% rename from apps/admin/src/pages/LoginPage/components/LoginForm.tsx rename to apps/admin/src/pages/Login/components/LoginForm.tsx index 163fba1..874cf07 100644 --- a/apps/admin/src/pages/LoginPage/components/LoginForm.tsx +++ b/apps/admin/src/pages/Login/components/LoginForm.tsx @@ -1,6 +1,6 @@ import { Button, TextField } from '@muneo/design-system'; import { useLoginForm } from '../hooks/useLoginForm'; -import * as styles from '../LoginPage.css'; +import * as styles from '../Login.css'; export const LoginForm = () => { const { email, password, setEmail, setPassword, fieldErrors, submitError, isPending, submit } = useLoginForm(); diff --git a/apps/admin/src/pages/LoginPage/hooks/useLoginForm.ts b/apps/admin/src/pages/Login/hooks/useLoginForm.ts similarity index 100% rename from apps/admin/src/pages/LoginPage/hooks/useLoginForm.ts rename to apps/admin/src/pages/Login/hooks/useLoginForm.ts diff --git a/apps/admin/src/pages/NotFound/NotFound.tsx b/apps/admin/src/pages/NotFound/NotFound.tsx new file mode 100644 index 0000000..ab6fd23 --- /dev/null +++ b/apps/admin/src/pages/NotFound/NotFound.tsx @@ -0,0 +1,28 @@ +import { Button } from '@muneo/design-system'; +import { Link } from 'react-router'; +import { ROUTES } from '@/constants/routes'; + +export const NotFound = () => ( +
+

404

+

+ 페이지를 찾을 수 없습니다 +

+

+ 요청하신 페이지가 존재하지 않거나 이동되었습니다. +

+ +
+); diff --git a/apps/admin/src/pages/UserDetailPage/UserDetailPage.css.ts b/apps/admin/src/pages/UserDetail/UserDetail.css.ts similarity index 100% rename from apps/admin/src/pages/UserDetailPage/UserDetailPage.css.ts rename to apps/admin/src/pages/UserDetail/UserDetail.css.ts diff --git a/apps/admin/src/pages/UserDetailPage/UserDetailPage.tsx b/apps/admin/src/pages/UserDetail/UserDetail.tsx similarity index 97% rename from apps/admin/src/pages/UserDetailPage/UserDetailPage.tsx rename to apps/admin/src/pages/UserDetail/UserDetail.tsx index 1ddb08f..48d27c2 100644 --- a/apps/admin/src/pages/UserDetailPage/UserDetailPage.tsx +++ b/apps/admin/src/pages/UserDetail/UserDetail.tsx @@ -6,9 +6,9 @@ import { UserDangerZone } from './components/UserDangerZone'; import { UserEditForm } from './components/UserEditForm'; import { UserRoleSection } from './components/UserRoleSection'; import { useUserDetail } from './hooks/useUserDetail'; -import * as styles from './UserDetailPage.css'; +import * as styles from './UserDetail.css'; -export const UserDetailPage = () => { +export const UserDetail = () => { const { userId, detail, diff --git a/apps/admin/src/pages/UserDetailPage/components/UserDangerZone.tsx b/apps/admin/src/pages/UserDetail/components/UserDangerZone.tsx similarity index 96% rename from apps/admin/src/pages/UserDetailPage/components/UserDangerZone.tsx rename to apps/admin/src/pages/UserDetail/components/UserDangerZone.tsx index 9b01db2..bc62ae4 100644 --- a/apps/admin/src/pages/UserDetailPage/components/UserDangerZone.tsx +++ b/apps/admin/src/pages/UserDetail/components/UserDangerZone.tsx @@ -1,6 +1,6 @@ import { Button } from '@muneo/design-system'; import { Card } from '@/components/Card'; -import * as styles from '../UserDetailPage.css'; +import * as styles from '../UserDetail.css'; interface UserDangerZoneProps { isDeleted: boolean; diff --git a/apps/admin/src/pages/UserDetailPage/components/UserEditForm.tsx b/apps/admin/src/pages/UserDetail/components/UserEditForm.tsx similarity index 97% rename from apps/admin/src/pages/UserDetailPage/components/UserEditForm.tsx rename to apps/admin/src/pages/UserDetail/components/UserEditForm.tsx index 07be3f5..a90d650 100644 --- a/apps/admin/src/pages/UserDetailPage/components/UserEditForm.tsx +++ b/apps/admin/src/pages/UserDetail/components/UserEditForm.tsx @@ -3,7 +3,7 @@ import { type FormEvent } from 'react'; import { type UpdateUserRequest } from '@/api'; import { Card } from '@/components/Card'; import { type FormErrors } from '../hooks/useUserDetail'; -import * as styles from '../UserDetailPage.css'; +import * as styles from '../UserDetail.css'; interface UserEditFormProps { form: UpdateUserRequest; diff --git a/apps/admin/src/pages/UserDetailPage/components/UserRoleSection.tsx b/apps/admin/src/pages/UserDetail/components/UserRoleSection.tsx similarity index 97% rename from apps/admin/src/pages/UserDetailPage/components/UserRoleSection.tsx rename to apps/admin/src/pages/UserDetail/components/UserRoleSection.tsx index 8643997..041ec6a 100644 --- a/apps/admin/src/pages/UserDetailPage/components/UserRoleSection.tsx +++ b/apps/admin/src/pages/UserDetail/components/UserRoleSection.tsx @@ -2,7 +2,7 @@ import { Button, Dropdown } from '@muneo/design-system'; import { USER_ROLES, type UserRole } from '@/api'; import { Card } from '@/components/Card'; import { ROLE_LABEL } from '@/lib/formatters'; -import * as styles from '../UserDetailPage.css'; +import * as styles from '../UserDetail.css'; interface UserRoleSectionProps { currentRole: UserRole; diff --git a/apps/admin/src/pages/UserDetailPage/hooks/useUserDetail.ts b/apps/admin/src/pages/UserDetail/hooks/useUserDetail.ts similarity index 100% rename from apps/admin/src/pages/UserDetailPage/hooks/useUserDetail.ts rename to apps/admin/src/pages/UserDetail/hooks/useUserDetail.ts diff --git a/apps/admin/src/pages/UsersListPage/UsersListPage.css.ts b/apps/admin/src/pages/UsersList/UsersList.css.ts similarity index 100% rename from apps/admin/src/pages/UsersListPage/UsersListPage.css.ts rename to apps/admin/src/pages/UsersList/UsersList.css.ts diff --git a/apps/admin/src/pages/UsersListPage/UsersListPage.tsx b/apps/admin/src/pages/UsersList/UsersList.tsx similarity index 93% rename from apps/admin/src/pages/UsersListPage/UsersListPage.tsx rename to apps/admin/src/pages/UsersList/UsersList.tsx index a180202..56e6fb1 100644 --- a/apps/admin/src/pages/UsersListPage/UsersListPage.tsx +++ b/apps/admin/src/pages/UsersList/UsersList.tsx @@ -3,9 +3,9 @@ import { ROUTES } from '@/constants/routes'; import { UserFilters } from './components/UserFilters'; import { UsersTable } from './components/UsersTable'; import { useUsersFilters } from './hooks/useUsersFilters'; -import * as styles from './UsersListPage.css'; +import * as styles from './UsersList.css'; -export const UsersListPage = () => { +export const UsersList = () => { const navigate = useNavigate(); const { draft, setDraft, query, apply, reset, prevPage, nextPage } = useUsersFilters(); diff --git a/apps/admin/src/pages/UsersListPage/components/UserFilters.css.ts b/apps/admin/src/pages/UsersList/components/UserFilters.css.ts similarity index 100% rename from apps/admin/src/pages/UsersListPage/components/UserFilters.css.ts rename to apps/admin/src/pages/UsersList/components/UserFilters.css.ts diff --git a/apps/admin/src/pages/UsersListPage/components/UserFilters.tsx b/apps/admin/src/pages/UsersList/components/UserFilters.tsx similarity index 100% rename from apps/admin/src/pages/UsersListPage/components/UserFilters.tsx rename to apps/admin/src/pages/UsersList/components/UserFilters.tsx diff --git a/apps/admin/src/pages/UsersListPage/components/UsersTable.css.ts b/apps/admin/src/pages/UsersList/components/UsersTable.css.ts similarity index 100% rename from apps/admin/src/pages/UsersListPage/components/UsersTable.css.ts rename to apps/admin/src/pages/UsersList/components/UsersTable.css.ts diff --git a/apps/admin/src/pages/UsersListPage/components/UsersTable.tsx b/apps/admin/src/pages/UsersList/components/UsersTable.tsx similarity index 100% rename from apps/admin/src/pages/UsersListPage/components/UsersTable.tsx rename to apps/admin/src/pages/UsersList/components/UsersTable.tsx diff --git a/apps/admin/src/pages/UsersListPage/hooks/useUsersFilters.ts b/apps/admin/src/pages/UsersList/hooks/useUsersFilters.ts similarity index 100% rename from apps/admin/src/pages/UsersListPage/hooks/useUsersFilters.ts rename to apps/admin/src/pages/UsersList/hooks/useUsersFilters.ts diff --git a/apps/admin/src/router/router.tsx b/apps/admin/src/router/router.tsx index aba15e5..05a96d2 100644 --- a/apps/admin/src/router/router.tsx +++ b/apps/admin/src/router/router.tsx @@ -1,31 +1,38 @@ import { createBrowserRouter, Navigate } from 'react-router'; import { ROUTES } from '@/constants/routes'; import { Layout } from '@/layout/Layout'; -import { LoginPage } from '@/pages/LoginPage/LoginPage'; -import { UserDetailPage } from '@/pages/UserDetailPage/UserDetailPage'; -import { UsersListPage } from '@/pages/UsersListPage/UsersListPage'; +import { GlobalError } from '@/pages/GlobalError/GlobalError'; +import { Login } from '@/pages/Login/Login'; +import { NotFound } from '@/pages/NotFound/NotFound'; +import { UserDetail } from '@/pages/UserDetail/UserDetail'; +import { UsersList } from '@/pages/UsersList/UsersList'; import { ProtectedRoute } from './ProtectedRoute'; export const router = createBrowserRouter([ { - path: ROUTES.login, - element: , - }, - { - element: , + errorElement: , children: [ { - element: , + path: ROUTES.login, + element: , + }, + { + element: , children: [ - { index: true, element: }, - { path: ROUTES.users, element: }, - { path: ROUTES.userDetail(':userId'), element: }, + { + element: , + children: [ + { index: true, element: }, + { path: ROUTES.users, element: }, + { path: ROUTES.userDetail(':userId'), element: }, + ], + }, ], }, + { + path: '*', + element: , + }, ], }, - { - path: '*', - element: , - }, ]); diff --git a/apps/admin/vercel.json b/apps/admin/vercel.json new file mode 100644 index 0000000..7eb07db --- /dev/null +++ b/apps/admin/vercel.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +}