From 06c494beb0b061aa1e8ba21a2d02de3a13038395 Mon Sep 17 00:00:00 2001 From: MUsoftware Date: Fri, 15 May 2026 18:29:22 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20packages=20namespace=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20subpath=20named=20export=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=EA=B3=BC=20=EB=B6=80=EC=88=98=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20lint=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + apps/pyconkr-2025/src/App.tsx | 6 +- .../layout/CartBadgeButton/index.tsx | 6 +- .../layout/Footer/Mobile/MobileFooter.tsx | 2 +- .../src/components/layout/Footer/index.tsx | 4 +- .../layout/Header/Mobile/MobileHeader.tsx | 4 +- .../layout/Header/Mobile/MobileNavigation.tsx | 6 +- .../src/components/layout/Header/index.tsx | 4 +- .../components/layout/SignInButton/index.tsx | 47 +- .../layout/UserScanCodeButton/index.tsx | 10 +- .../src/components/pages/dynamic_route.tsx | 20 +- .../components/pages/presentation_detail.tsx | 29 +- .../src/components/pages/sign_in.tsx | 10 +- .../src/components/pages/sponsor_detail.tsx | 12 +- .../pyconkr-2025/src/consts/mdx_components.ts | 70 +-- .../src/debug/page/component_test.tsx | 10 +- apps/pyconkr-2025/src/debug/page/map_test.tsx | 10 +- apps/pyconkr-2025/src/debug/page/mdi_test.tsx | 8 +- .../pyconkr-2025/src/debug/page/shop_test.tsx | 12 +- apps/pyconkr-2025/src/main.tsx | 28 +- apps/pyconkr-2025/vite.config.mts | 5 +- apps/pyconkr-2026/src/App.tsx | 6 +- .../layout/CartBadgeButton/index.tsx | 6 +- .../layout/Footer/Mobile/MobileFooter.tsx | 2 +- .../src/components/layout/Footer/index.tsx | 4 +- .../layout/Header/Mobile/MobileHeader.tsx | 6 +- .../layout/Header/Mobile/MobileNavigation.tsx | 6 +- .../src/components/layout/Header/index.tsx | 4 +- .../components/layout/SignInButton/index.tsx | 47 +- .../layout/UserScanCodeButton/index.tsx | 10 +- .../src/components/layout/index.tsx | 2 +- .../src/components/pages/dynamic_route.tsx | 20 +- .../components/pages/presentation_detail.tsx | 29 +- .../src/components/pages/sign_in.tsx | 10 +- .../src/components/pages/sponsor_detail.tsx | 12 +- .../pyconkr-2026/src/consts/mdx_components.ts | 70 +-- apps/pyconkr-2026/src/main.tsx | 28 +- apps/pyconkr-2026/vite.config.mts | 5 +- .../elements/admin_signin_guard.tsx | 2 +- .../components/elements/error_fallback.tsx | 6 +- .../elements/public_file_picker.tsx | 2 +- .../src/components/layouts/admin_editor.tsx | 16 +- .../src/components/layouts/admin_list.tsx | 4 +- .../src/components/pages/account/account.tsx | 2 +- .../src/components/pages/account/manage.tsx | 6 +- .../src/components/pages/account/sign_in.tsx | 6 +- .../external_api/google_oauth2_editor.tsx | 4 +- .../src/components/pages/file/upload.tsx | 2 +- .../pages/modification_audit/components.tsx | 48 +- .../pages/modification_audit/dialogs.tsx | 10 +- .../pages/modification_audit/list.tsx | 2 +- .../pages/modification_audit/pages.tsx | 4 +- .../sub_pages/presentation_preview.tsx | 30 +- .../sub_pages/userext_preview.tsx | 10 +- .../notification/email_template_editor.tsx | 2 +- .../kakao_alimtalk_template_editor.tsx | 2 +- .../notification/send_history_create.tsx | 12 +- .../notification/send_history_result.tsx | 2 +- .../notification/sms_template_editor.tsx | 2 +- .../src/components/pages/page/editor.tsx | 10 +- .../components/pages/presentation/editor.tsx | 23 +- .../pages/shop/category_group/editor.tsx | 2 +- .../components/pages/shop/order/editor.tsx | 2 +- .../src/components/pages/shop/order/list.tsx | 2 +- .../pages/shop/order/refund_dialog.tsx | 2 +- .../components/pages/shop/product/editor.tsx | 2 +- .../components/pages/shop/product/list.tsx | 2 +- .../shop/product/tabs/basic_info_tab.tsx | 13 +- .../shop/product/tabs/option_groups_tab.tsx | 2 +- .../src/components/pages/sitemap/list.tsx | 4 +- .../src/components/pages/user/editor.tsx | 2 +- .../pages/user/shop_order_section.tsx | 2 +- .../src/consts/mdx_components.ts | 57 ++- apps/pyconkr-admin/src/main.tsx | 26 +- apps/pyconkr-admin/vite.config.ts | 5 +- .../components/dialogs/change_password.tsx | 6 +- .../modification_audit_cancel_confirm.tsx | 4 +- .../components/dialogs/public_file_upload.tsx | 8 +- .../src/components/elements/error_page.tsx | 4 +- .../components/elements/multilang_field.tsx | 14 +- .../elements/public_file_selector.tsx | 8 +- .../src/components/elements/signin_guard.tsx | 2 +- .../src/components/layout.tsx | 2 +- .../src/components/pages/home.tsx | 11 +- .../pages/modification_audit_preview.tsx | 2 +- .../src/components/pages/profile_editor.tsx | 4 +- .../src/components/pages/session_editor.tsx | 14 +- .../src/components/pages/signin.tsx | 10 +- apps/pyconkr-participant-portal/src/main.tsx | 19 +- .../vite.config.mts | 5 +- eslint.config.js | 81 +-- packages/common/src/components/index.ts | 85 +--- .../src/components/mdx_components/index.ts | 10 + .../mdx_components/mobile_cover.tsx | 6 +- .../mdx_components/session_timetable.tsx | 18 +- packages/common/src/index.ts | 12 +- packages/shop/src/apis/client.ts | 12 +- packages/shop/src/apis/index.ts | 299 +++++------ .../common/customer_info_form_dialog.tsx | 18 +- packages/shop/src/components/common/index.ts | 25 +- .../components/common/option_group_input.tsx | 16 +- .../src/components/common/price_display.tsx | 4 +- .../src/components/common/shop_context.tsx | 8 +- .../src/components/common/signin_guard.tsx | 8 +- .../shop/src/components/common/user_ident.tsx | 16 +- .../shop/src/components/features/cart.tsx | 53 +- .../shop/src/components/features/index.ts | 21 +- .../shop/src/components/features/order.tsx | 78 +-- .../src/components/features/patron_list.tsx | 10 +- .../shop/src/components/features/product.tsx | 114 ++--- .../src/components/features/user_status.tsx | 20 +- packages/shop/src/components/index.ts | 11 +- packages/shop/src/contexts/index.ts | 32 +- packages/shop/src/hooks/index.ts | 269 +++++----- packages/shop/src/index.ts | 11 +- packages/shop/src/schemas/index.ts | 476 +++++++++--------- packages/shop/src/utils/index.ts | 29 +- packages/shop/src/utils/portone.ts | 4 +- tsconfig.json | 6 +- 119 files changed, 1362 insertions(+), 1406 deletions(-) create mode 100644 packages/common/src/components/mdx_components/index.ts diff --git a/.gitignore b/.gitignore index a547bf3..cf970ef 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ dist dist-ssr *.local +# TypeScript incremental build cache +*.tsbuildinfo + # Editor directories and files .vscode/* !.vscode/extensions.json diff --git a/apps/pyconkr-2025/src/App.tsx b/apps/pyconkr-2025/src/App.tsx index 7ce3a4c..6510fe2 100644 --- a/apps/pyconkr-2025/src/App.tsx +++ b/apps/pyconkr-2025/src/App.tsx @@ -1,10 +1,10 @@ -import { useBackendClient, useFlattenSiteMapQuery, useSponsorQuery } from "@frontend/common/src/hooks/useAPI"; -import { buildNestedSiteMap } from "@frontend/common/src/utils"; +import { useBackendClient, useFlattenSiteMapQuery, useSponsorQuery } from "@frontend/common/hooks/useAPI"; +import * as BackendAPISchemas from "@frontend/common/schemas/backendAPI"; +import { buildNestedSiteMap } from "@frontend/common/utils"; import * as React from "react"; import { Route, Routes, useLocation } from "react-router-dom"; import * as R from "remeda"; -import * as BackendAPISchemas from "@frontend/common/src/schemas/backendAPI"; import MainLayout from "./components/layout/index.tsx"; import { PageIdParamRenderer, RouteRenderer } from "./components/pages/dynamic_route.tsx"; import { PresentationDetailPage } from "./components/pages/presentation_detail.tsx"; diff --git a/apps/pyconkr-2025/src/components/layout/CartBadgeButton/index.tsx b/apps/pyconkr-2025/src/components/layout/CartBadgeButton/index.tsx index c18e20c..53eee8b 100644 --- a/apps/pyconkr-2025/src/components/layout/CartBadgeButton/index.tsx +++ b/apps/pyconkr-2025/src/components/layout/CartBadgeButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useCart, useShopClient } from "@frontend/shop/hooks"; import { ShoppingCart } from "@mui/icons-material"; import { Badge, badgeClasses, IconButton, styled } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -33,8 +33,8 @@ const InnerCartBadgeButton: React.FC = ({ loading, export const CartBadgeButton: React.FC = Suspense.with( { fallback: }, ErrorBoundary.with({ fallback: }, () => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data: cart } = Shop.Hooks.useCart(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data: cart } = useCart(shopAPIClient); return ; }) ); diff --git a/apps/pyconkr-2025/src/components/layout/Footer/Mobile/MobileFooter.tsx b/apps/pyconkr-2025/src/components/layout/Footer/Mobile/MobileFooter.tsx index 79efc63..1ccb921 100644 --- a/apps/pyconkr-2025/src/components/layout/Footer/Mobile/MobileFooter.tsx +++ b/apps/pyconkr-2025/src/components/layout/Footer/Mobile/MobileFooter.tsx @@ -1,5 +1,5 @@ import styled from "@emotion/styled"; -import { useEmail } from "@frontend/common/src/hooks/useEmail"; +import { useEmail } from "@frontend/common/hooks/useEmail"; import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, X, YouTube } from "@mui/icons-material"; import * as React from "react"; diff --git a/apps/pyconkr-2025/src/components/layout/Footer/index.tsx b/apps/pyconkr-2025/src/components/layout/Footer/index.tsx index e5d313d..a0e294f 100644 --- a/apps/pyconkr-2025/src/components/layout/Footer/index.tsx +++ b/apps/pyconkr-2025/src/components/layout/Footer/index.tsx @@ -1,5 +1,5 @@ import styled from "@emotion/styled"; -import { useEmail } from "@frontend/common/src/hooks/useEmail"; +import { useEmail } from "@frontend/common/hooks/useEmail"; import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, OpenInNew, X, YouTube } from "@mui/icons-material"; import { Button, useMediaQuery, useTheme } from "@mui/material"; import * as React from "react"; @@ -7,8 +7,8 @@ import * as React from "react"; import FlickrIcon from "@apps/pyconkr-2025/assets/thirdparty/flickr.svg?react"; // import MobileFooter from "./Mobile/MobileFooter"; -import { useAppContext } from "../../../contexts/app_context"; import MobileFooter from "./Mobile/MobileFooter"; +import { useAppContext } from "../../../contexts/app_context"; interface IconItem { icon: React.FC<{ width?: number; height?: number }>; diff --git a/apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileHeader.tsx b/apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileHeader.tsx index c93d8e9..c875ef4 100644 --- a/apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileHeader.tsx +++ b/apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileHeader.tsx @@ -1,4 +1,4 @@ -import { Components } from "@frontend/common"; +import { PythonKorea } from "@frontend/common/components"; import { Box, Stack, styled, Typography } from "@mui/material"; import * as React from "react"; import { Link, useLocation } from "react-router-dom"; @@ -31,7 +31,7 @@ export const MobileHeader: React.FC = ({ isNavigationOpen = f - + = ({ isOpen, onCl - + 파이콘 한국 2025 diff --git a/apps/pyconkr-2025/src/components/layout/Header/index.tsx b/apps/pyconkr-2025/src/components/layout/Header/index.tsx index 0ecbe1b..7fc0847 100644 --- a/apps/pyconkr-2025/src/components/layout/Header/index.tsx +++ b/apps/pyconkr-2025/src/components/layout/Header/index.tsx @@ -1,4 +1,4 @@ -import { Components } from "@frontend/common"; +import { PythonKorea } from "@frontend/common/components"; import { ArrowForwardIos } from "@mui/icons-material"; import { Box, Button, CircularProgress, Divider, Stack, styled, SxProps, Theme, Typography, useMediaQuery, useTheme } from "@mui/material"; import { MUIStyledCommonProps } from "@mui/system"; @@ -63,7 +63,7 @@ const Header: React.FC = () => { - + diff --git a/apps/pyconkr-2025/src/components/layout/SignInButton/index.tsx b/apps/pyconkr-2025/src/components/layout/SignInButton/index.tsx index 7996129..3cacdd8 100644 --- a/apps/pyconkr-2025/src/components/layout/SignInButton/index.tsx +++ b/apps/pyconkr-2025/src/components/layout/SignInButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useSignOutMutation, useUserStatus } from "@frontend/shop/hooks"; import { Login, Logout } from "@mui/icons-material"; import { Button, Stack } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -77,29 +77,28 @@ const InnerSignInButtonImpl: React.FC = ({ ); }; -export const SignInButton: React.FC<{ isMobile?: boolean; isMainPath?: boolean; onClose?: () => void }> = ({ - isMobile = false, - isMainPath = true, - onClose, -}) => { - const SignInWithErrorBoundary = ErrorBoundary.with( - { fallback: }, - Suspense.with({ fallback: }, () => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const signOutMutation = Shop.Hooks.useSignOutMutation(shopAPIClient); - const { data } = Shop.Hooks.useUserStatus(shopAPIClient); +type SignInButtonProps = { isMobile?: boolean; isMainPath?: boolean; onClose?: () => void }; - return ( - - ); - }) - ); +const SignInButtonContent: React.FC = ({ isMobile, isMainPath, onClose }) => { + const shopAPIClient = useShopClient(); + const signOutMutation = useSignOutMutation(shopAPIClient); + const { data } = useUserStatus(shopAPIClient); - return ; + return ( + + ); }; + +export const SignInButton: React.FC = ({ isMobile = false, isMainPath = true, onClose }) => ( + }> + }> + + + +); diff --git a/apps/pyconkr-2025/src/components/layout/UserScanCodeButton/index.tsx b/apps/pyconkr-2025/src/components/layout/UserScanCodeButton/index.tsx index 3a26bf0..e6b9efc 100644 --- a/apps/pyconkr-2025/src/components/layout/UserScanCodeButton/index.tsx +++ b/apps/pyconkr-2025/src/components/layout/UserScanCodeButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useUserInfo } from "@frontend/shop/hooks"; import { QrCode2 } from "@mui/icons-material"; import { Button, IconButton, IconButtonProps } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -9,8 +9,8 @@ import { useAppContext } from "../../../contexts/app_context"; export const ScanCodeIconButton: React.FC<{ sx?: IconButtonProps["sx"] }> = Suspense.with( { fallback: }, ErrorBoundary.with({ fallback: }, ({ sx }) => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data } = Shop.Hooks.useUserInfo(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data } = useUserInfo(shopAPIClient); const iconBtnStyle: IconButtonProps["sx"] = (theme) => ({ color: theme.palette.primary.nonFocus, @@ -31,8 +31,8 @@ export const ScanCodeButton: React.FC = Suspense.with( { fallback: null }, ErrorBoundary.with({ fallback: null }, () => { const { language } = useAppContext(); - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data } = Shop.Hooks.useUserInfo(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data } = useUserInfo(shopAPIClient); const buttonText = language === "ko" ? "등록 코드" : "Entrance QR Code"; diff --git a/apps/pyconkr-2025/src/components/pages/dynamic_route.tsx b/apps/pyconkr-2025/src/components/pages/dynamic_route.tsx index 1fd2246..9a43b3d 100644 --- a/apps/pyconkr-2025/src/components/pages/dynamic_route.tsx +++ b/apps/pyconkr-2025/src/components/pages/dynamic_route.tsx @@ -1,8 +1,8 @@ -import { Components } from "@frontend/common"; -import { useBackendClient, usePageQuery } from "@frontend/common/src/hooks/useAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; -import { parseCss } from "@frontend/common/src/utils"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { CenteredPage, ErrorFallback, MDXRenderer } from "@frontend/common/components"; +import { useBackendClient, usePageQuery } from "@frontend/common/hooks/useAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; +import { parseCss } from "@frontend/common/utils"; import { CircularProgress, Stack, Theme } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { useQueryClient } from "@tanstack/react-query"; @@ -62,9 +62,9 @@ const LoginRequired: React.FC = () => <>401 Login Required; const PermissionDenied: React.FC = () => <>403 Permission Denied; const PageNotFound: React.FC = () => <>404 Not Found; const CenteredLoadingPage: React.FC = () => ( - + - + ); const throwPageNotFound: (message: string) => never = (message) => { @@ -85,10 +85,10 @@ const RouteErrorFallback: React.FC<{ error: Error; reset: () => void }> = ({ err case 404: return ; default: - return ; + return ; } } - return ; + return ; }; const WaitedCenteredLoadingPage: React.FC = Suspense.with({ fallback: }, () => { @@ -122,7 +122,7 @@ const InnerPageRenderer: React.FC<{ id: string }> = Suspense.with({ fallback: {data.sections.map((s) => ( - + ))} diff --git a/apps/pyconkr-2025/src/components/pages/presentation_detail.tsx b/apps/pyconkr-2025/src/components/pages/presentation_detail.tsx index 706109a..5c29219 100644 --- a/apps/pyconkr-2025/src/components/pages/presentation_detail.tsx +++ b/apps/pyconkr-2025/src/components/pages/presentation_detail.tsx @@ -1,6 +1,6 @@ -import { Components } from "@frontend/common"; -import { useBackendClient, useSessionQuery } from "@frontend/common/src/hooks/useAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { CenteredPage, ErrorFallback, FallbackImage, LinkHandler, MDXRenderer } from "@frontend/common/components"; +import { useBackendClient, useSessionQuery } from "@frontend/common/hooks/useAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Box, Chip, CircularProgress, Divider, Stack, styled, Table, TableBody, TableCell, TableRow, Typography } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { DateTime } from "luxon"; @@ -22,12 +22,12 @@ type SimplifiedSpeakerSchema = { }; const CenteredLoadingPage: React.FC = () => ( - + - + ); -const StyledPresentationImage = styled(Components.FallbackImage)(({ theme }) => ({ +const StyledPresentationImage = styled(FallbackImage)(({ theme }) => ({ maxWidth: "75%", maxHeight: "480px", aspectRatio: "1", @@ -92,7 +92,7 @@ const ProfileImageStyle: React.CSSProperties = { objectFit: "cover", }; -const ProfileImage = styled(Components.FallbackImage)(ProfileImageStyle); +const ProfileImage = styled(FallbackImage)(ProfileImageStyle); const ProfileImageErrorFallback: React.FC = () => ( @@ -111,9 +111,7 @@ const PresentationSpeakerItem: React.FC<{ speaker: SimplifiedSpeakerSchema }> = {speaker.biography ? ( - } - /> + } /> ) : ( <>
@@ -147,7 +145,7 @@ const PresentationImageFallback: React.FC<{ language: "ko" | "en" }> = ({ langua }; export const PresentationDetailPage: React.FC = ErrorBoundary.with( - { fallback: Components.ErrorFallback }, + { fallback: ErrorFallback }, Suspense.with({ fallback: }, () => { const { id } = useParams(); const { language, setAppContext } = useAppContext(); @@ -250,7 +248,7 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( } /> ({ color: theme.palette.primary.main, textDecoration: "underline" })}> - + ) : null} @@ -264,12 +262,7 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( /> )} - + {presentation.speakers && ( diff --git a/apps/pyconkr-2025/src/components/pages/sign_in.tsx b/apps/pyconkr-2025/src/components/pages/sign_in.tsx index 905b2ad..94e928c 100644 --- a/apps/pyconkr-2025/src/components/pages/sign_in.tsx +++ b/apps/pyconkr-2025/src/components/pages/sign_in.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useSignInWithSNSMutation, useUserStatus } from "@frontend/shop/hooks"; import { AccountCircleOutlined, Google } from "@mui/icons-material"; import { Backdrop, Button, ButtonProps, CircularProgress, Stack, Typography } from "@mui/material"; import { Suspense } from "@suspensive/react"; @@ -17,9 +17,9 @@ export const ShopSignInPage: React.FC = Suspense.with({ fallback: ({ openBackdrop: false }); const navigate = useNavigate(); - const shopAPIClient = Shop.Hooks.useShopClient(); - const SignInMutation = Shop.Hooks.useSignInWithSNSMutation(shopAPIClient); - const { data } = Shop.Hooks.useUserStatus(shopAPIClient); + const shopAPIClient = useShopClient(); + const SignInMutation = useSignInWithSNSMutation(shopAPIClient); + const { data } = useUserStatus(shopAPIClient); const shouldOpenBackdrop = SignInMutation.isPending || state.openBackdrop; @@ -55,7 +55,7 @@ export const ShopSignInPage: React.FC = Suspense.with({ fallback: <>404 Not Found; const CenteredLoadingPage: React.FC = () => ( - + - + ); const LogoImage = styled("img")(({ theme }) => ({ @@ -51,7 +51,7 @@ const DescriptionBox = styled(Box)(({ theme }) => ({ })); export const SponsorDetailPage: React.FC = ErrorBoundary.with( - { fallback: Components.ErrorFallback }, + { fallback: ErrorFallback }, Suspense.with({ fallback: }, () => { const { id } = useParams(); const { language, sponsorTiers, setAppContext } = useAppContext(); @@ -90,7 +90,7 @@ export const SponsorDetailPage: React.FC = ErrorBoundary.with(
- + ); diff --git a/apps/pyconkr-2025/src/consts/mdx_components.ts b/apps/pyconkr-2025/src/consts/mdx_components.ts index 3276981..5f69107 100644 --- a/apps/pyconkr-2025/src/consts/mdx_components.ts +++ b/apps/pyconkr-2025/src/consts/mdx_components.ts @@ -1,6 +1,20 @@ // 후대의 개발자님께 : 컴포넌트 맨 첫글자가 대문자로 시작하지 않으면 JSX 컴포넌트가 아니라 일반 HTML 태그로 인식합니다. 제발 대문자로 시작해주세요. -import { Components, Schemas } from "@frontend/common"; -import * as Shop from "@frontend/shop"; +import { LottiePlayer, NetworkLottiePlayer } from "@frontend/common/components"; +import { + Confetti, + FAQAccordion, + Map as MDXMap, + MobileAccordion, + MobileCover, + PrimaryStyledDetails, + SecondaryStyledDetails, + SessionList, + SessionTimeTable, + StyledFullWidthButton, +} from "@frontend/common/components/mdx_components"; +import type { SessionSchema } from "@frontend/common/schemas/backendAPI"; +import { PriceDisplay, ShopContextProvider, SignInGuard, UserSignInAccount, UserSignInMethod } from "@frontend/shop/components/common"; +import { CartStatus, OrderList, PatronList, ProductImageCardList, ProductList, UserInfo } from "@frontend/shop/components/features"; import * as mui from "@mui/material"; import type { MDXComponents } from "mdx/types.js"; import * as React from "react"; @@ -137,7 +151,7 @@ const MUIMDXComponents: MDXComponents = { Mui__material__Zoom: mui.Zoom, }; -const getPyConKR2025SessionUrl = (session: Schemas.BackendAPI.SessionSchema): string => { +const getPyConKR2025SessionUrl = (session: SessionSchema): string => { const urlSafeTitle = session.title .replace(/ /g, "-") .replace(/([.])/g, "_") @@ -151,21 +165,21 @@ const PyConKR2025FallbackImage = React.createElement("img", { style: { width: "100%", height: "100%", objectFit: "cover", borderRadius: "50%" }, }); -const PyConKR2025SessionList: React.FC> = (props) => - React.createElement(Components.MDX.SessionList, { +const PyConKR2025SessionList: React.FC> = (props) => + React.createElement(SessionList, { ...props, fallbackImage: PyConKR2025FallbackImage, getSessionUrl: getPyConKR2025SessionUrl, }); -const PyConKR2025SessionTimeTable: React.FC> = (props) => - React.createElement(Components.MDX.SessionTimeTable, { +const PyConKR2025SessionTimeTable: React.FC> = (props) => + React.createElement(SessionTimeTable, { ...props, getSessionUrl: getPyConKR2025SessionUrl, }); const PyConKR2025MobileAccordion: React.FC = () => - React.createElement(Components.MDX.MobileAccordion, { + React.createElement(MobileAccordion, { marqueeText: "AUG 15 - 17", marqueeLogoSrc: PyCon2025HostLogoSmall, hostLogoBigSrc: PyCon2025HostLogoBig, @@ -174,20 +188,20 @@ const PyConKR2025MobileAccordion: React.FC = () => }); const PyConKR2025MobileCover: React.FC = () => - React.createElement(Components.MDX.MobileCover, { + React.createElement(MobileCover, { coverImageSrc: PyCon2025MobileLogoImage, coverTitleSrc: PyCon2025MobileLogoTitle, }); const PyConKRCommonMDXComponents: MDXComponents = { - Common__Components__Lottie: Components.LottiePlayer, - Common__Components__NetworkLottie: Components.NetworkLottiePlayer, - Common__Components__MDX__Confetti: Components.MDX.Confetti, - Common__Components__MDX__PrimaryStyledDetails: Components.MDX.PrimaryStyledDetails, - Common__Components__MDX__SecondaryStyledDetails: Components.MDX.SecondaryStyledDetails, - Common__Components__MDX__Map: Components.MDX.Map, - Common__Components__MDX__FAQAccordion: Components.MDX.FAQAccordion, - Common__Components__MDX__FullWidthStyledButton: Components.MDX.StyledFullWidthButton, + Common__Components__Lottie: LottiePlayer, + Common__Components__NetworkLottie: NetworkLottiePlayer, + Common__Components__MDX__Confetti: Confetti, + Common__Components__MDX__PrimaryStyledDetails: PrimaryStyledDetails, + Common__Components__MDX__SecondaryStyledDetails: SecondaryStyledDetails, + Common__Components__MDX__Map: MDXMap, + Common__Components__MDX__FAQAccordion: FAQAccordion, + Common__Components__MDX__FullWidthStyledButton: StyledFullWidthButton, Common__Components__Session__List: PyConKR2025SessionList, Common__Components__Session__TimeTable: PyConKR2025SessionTimeTable, Common__Components__MDX__MobileAccordion: PyConKR2025MobileAccordion, @@ -195,17 +209,17 @@ const PyConKRCommonMDXComponents: MDXComponents = { }; const PythonKRShopMDXComponents: MDXComponents = { - Shop__Common__PriceDisplay: Shop.Components.Common.PriceDisplay, - Shop__Common__SignInGuard: Shop.Components.Common.SignInGuard, - Shop__Common__ContextProvider: Shop.Components.Common.ShopContextProvider, - Shop__Common__UserSignInMethod: Shop.Components.Common.UserSignInMethod, - Shop__Common__UserSignInAccount: Shop.Components.Common.UserSignInAccount, - Shop__Feature__CartStatus: Shop.Components.Features.CartStatus, - Shop__Feature__ProductList: Shop.Components.Features.ProductList, - Shop__Feature__ProductImageCardList: Shop.Components.Features.ProductImageCardList, - Shop__Feature__OrderList: Shop.Components.Features.OrderList, - Shop__Feature__UserInfo: Shop.Components.Features.UserInfo, - Shop__Feature__PatronList: Shop.Components.Features.PatronList, + Shop__Common__PriceDisplay: PriceDisplay, + Shop__Common__SignInGuard: SignInGuard, + Shop__Common__ContextProvider: ShopContextProvider, + Shop__Common__UserSignInMethod: UserSignInMethod, + Shop__Common__UserSignInAccount: UserSignInAccount, + Shop__Feature__CartStatus: CartStatus, + Shop__Feature__ProductList: ProductList, + Shop__Feature__ProductImageCardList: ProductImageCardList, + Shop__Feature__OrderList: OrderList, + Shop__Feature__UserInfo: UserInfo, + Shop__Feature__PatronList: PatronList, }; export const PyConKRMDXComponents = { diff --git a/apps/pyconkr-2025/src/debug/page/component_test.tsx b/apps/pyconkr-2025/src/debug/page/component_test.tsx index b406c61..ba4de28 100644 --- a/apps/pyconkr-2025/src/debug/page/component_test.tsx +++ b/apps/pyconkr-2025/src/debug/page/component_test.tsx @@ -1,4 +1,4 @@ -import { Components } from "@frontend/common"; +import { PrimaryStyledDetails, SecondaryStyledDetails } from "@frontend/common/components/mdx_components"; import { Chip, Stack, Table, TableBody, TableCell, TableRow } from "@mui/material"; import * as React from "react"; @@ -17,7 +17,7 @@ const HighlightedChip: React.FC<{ label: string }> = ({ label }) => ( export const ComponentTestPage: React.FC = () => { return ( - + 모든 자동차의 출입은 동국대 정문으로만 가능 @@ -47,9 +47,9 @@ export const ComponentTestPage: React.FC = () => {
-
+ - + 모든 자동차의 출입은 동국대 정문으로만 가능 @@ -79,7 +79,7 @@ export const ComponentTestPage: React.FC = () => {
-
+
); }; diff --git a/apps/pyconkr-2025/src/debug/page/map_test.tsx b/apps/pyconkr-2025/src/debug/page/map_test.tsx index 9c6bace..3058693 100644 --- a/apps/pyconkr-2025/src/debug/page/map_test.tsx +++ b/apps/pyconkr-2025/src/debug/page/map_test.tsx @@ -1,14 +1,14 @@ -import { Components } from "@frontend/common"; -import { getFormValue, isFormValid } from "@frontend/common/src/utils"; +import { Map as MDXMap, MapPropType } from "@frontend/common/components/mdx_components"; +import { getFormValue, isFormValid } from "@frontend/common/utils"; import { Box, Button, FormControlLabel, Stack, Switch, TextField } from "@mui/material"; import * as React from "react"; type MapTestPageStateType = { checked: boolean; - mapProps: Components.MDX.MapPropType; + mapProps: MapPropType; }; -const INITIAL_DATA: Components.MDX.MapPropType = { +const INITIAL_DATA: MapPropType = { geo: { lat: 37.5580918, lng: 126.9982178 }, placeName: { ko: "동국대학교 신공학관", @@ -90,7 +90,7 @@ export const MapTestPage: React.FC = () => { - + ); diff --git a/apps/pyconkr-2025/src/debug/page/mdi_test.tsx b/apps/pyconkr-2025/src/debug/page/mdi_test.tsx index ad7e376..2ff46fd 100644 --- a/apps/pyconkr-2025/src/debug/page/mdi_test.tsx +++ b/apps/pyconkr-2025/src/debug/page/mdi_test.tsx @@ -1,5 +1,5 @@ -import { Components } from "@frontend/common"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { MDXEditor, MDXRenderer } from "@frontend/common/components"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Box, Stack } from "@mui/material"; import React from "react"; @@ -27,10 +27,10 @@ export const MdiTestPage: React.FC = () => { }} > - + - + ); diff --git a/apps/pyconkr-2025/src/debug/page/shop_test.tsx b/apps/pyconkr-2025/src/debug/page/shop_test.tsx index bb5beee..5bfbe1a 100644 --- a/apps/pyconkr-2025/src/debug/page/shop_test.tsx +++ b/apps/pyconkr-2025/src/debug/page/shop_test.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { CartStatus, OrderList, ProductImageCardList, ProductList, UserInfo } from "@frontend/shop/components/features"; import { Divider, Stack, Typography } from "@mui/material"; import React from "react"; @@ -11,26 +11,26 @@ export const ShopTestPage: React.FC = () => ( 계정 상태 - + 상품 목록 - + 상품 목록 (이미지 카드) - + 장바구니 - + 주문 내역 - + ); diff --git a/apps/pyconkr-2025/src/main.tsx b/apps/pyconkr-2025/src/main.tsx index eef13e6..e9c2d04 100644 --- a/apps/pyconkr-2025/src/main.tsx +++ b/apps/pyconkr-2025/src/main.tsx @@ -1,7 +1,9 @@ import { Global } from "@emotion/react"; -import { Components, Utils } from "@frontend/common"; -import type { ContextOptions } from "@frontend/common/src/contexts"; -import * as Shop from "@frontend/shop"; +import { CenteredPage, CommonContextProvider, ErrorFallback } from "@frontend/common/components"; +import type { ContextOptions } from "@frontend/common/contexts"; +import { registerChunkLoadErrorReloadHandler } from "@frontend/common/utils"; +import { ShopContextProvider } from "@frontend/shop/components/common"; +import { ContextOptions as ShopContextOptions } from "@frontend/shop/contexts"; import { CircularProgress, CssBaseline, ThemeProvider } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { matchQuery, MutationCache, QueryClient, QueryClientProvider } from "@tanstack/react-query"; @@ -55,7 +57,7 @@ const CommonOptions: ContextOptions = { mdxComponents: PyConKRMDXComponents, }; -const ShopOptions: Shop.Contexts.ContextOptions = { +const ShopOptions: ShopContextOptions = { language: "ko", shopApiDomain: import.meta.env.VITE_PYCONKR_SHOP_API_DOMAIN, shopApiCSRFCookieName: import.meta.env.VITE_PYCONKR_SHOP_CSRF_COOKIE_NAME, @@ -64,12 +66,12 @@ const ShopOptions: Shop.Contexts.ContextOptions = { }; const SuspenseFallback = ( - + - + ); -const MainApp: React.FC = () => { +export const MainApp: React.FC = () => { const [appState, setAppContext] = React.useState>({ language: (localStorage.getItem(LOCAL_STORAGE_LANGUAGE_KEY) as "ko" | "en" | null) ?? "ko", shouldShowTitleBanner: true, @@ -87,9 +89,9 @@ const MainApp: React.FC = () => { - - - + + + @@ -98,8 +100,8 @@ const MainApp: React.FC = () => { - - + + @@ -108,6 +110,6 @@ const MainApp: React.FC = () => { ); }; -Utils.registerChunkLoadErrorReloadHandler(); +registerChunkLoadErrorReloadHandler(); ReactDom.createRoot(document.getElementById("root")!).render(); diff --git a/apps/pyconkr-2025/vite.config.mts b/apps/pyconkr-2025/vite.config.mts index 0be52a7..0026113 100644 --- a/apps/pyconkr-2025/vite.config.mts +++ b/apps/pyconkr-2025/vite.config.mts @@ -20,9 +20,8 @@ export default defineConfig(({ mode }) => { plugins: [react(), mdx(), ...(isLocalHttpBackend ? [] : [mkcert({ hosts: [host] })]), svgr()], resolve: { alias: { - "@frontend/common/src": path.resolve(__dirname, "../../packages/common/src"), - "@frontend/common": path.resolve(__dirname, "../../packages/common/src/index.ts"), - "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src/index.ts"), + "@frontend/common": path.resolve(__dirname, "../../packages/common/src"), + "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src"), "@apps/pyconkr-2025": path.resolve(__dirname, "./src"), }, }, diff --git a/apps/pyconkr-2026/src/App.tsx b/apps/pyconkr-2026/src/App.tsx index 051811e..73042a4 100644 --- a/apps/pyconkr-2026/src/App.tsx +++ b/apps/pyconkr-2026/src/App.tsx @@ -1,6 +1,6 @@ -import { useBackendClient, useFlattenSiteMapQuery, useSponsorQuery } from "@frontend/common/src/hooks/useAPI"; -import * as BackendAPISchemas from "@frontend/common/src/schemas/backendAPI"; -import { buildNestedSiteMap } from "@frontend/common/src/utils"; +import { useBackendClient, useFlattenSiteMapQuery, useSponsorQuery } from "@frontend/common/hooks/useAPI"; +import * as BackendAPISchemas from "@frontend/common/schemas/backendAPI"; +import { buildNestedSiteMap } from "@frontend/common/utils"; import * as React from "react"; import { Route, Routes, useLocation } from "react-router-dom"; import * as R from "remeda"; diff --git a/apps/pyconkr-2026/src/components/layout/CartBadgeButton/index.tsx b/apps/pyconkr-2026/src/components/layout/CartBadgeButton/index.tsx index c18e20c..53eee8b 100644 --- a/apps/pyconkr-2026/src/components/layout/CartBadgeButton/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/CartBadgeButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useCart, useShopClient } from "@frontend/shop/hooks"; import { ShoppingCart } from "@mui/icons-material"; import { Badge, badgeClasses, IconButton, styled } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -33,8 +33,8 @@ const InnerCartBadgeButton: React.FC = ({ loading, export const CartBadgeButton: React.FC = Suspense.with( { fallback: }, ErrorBoundary.with({ fallback: }, () => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data: cart } = Shop.Hooks.useCart(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data: cart } = useCart(shopAPIClient); return ; }) ); diff --git a/apps/pyconkr-2026/src/components/layout/Footer/Mobile/MobileFooter.tsx b/apps/pyconkr-2026/src/components/layout/Footer/Mobile/MobileFooter.tsx index 2eb9368..9fbf646 100644 --- a/apps/pyconkr-2026/src/components/layout/Footer/Mobile/MobileFooter.tsx +++ b/apps/pyconkr-2026/src/components/layout/Footer/Mobile/MobileFooter.tsx @@ -1,5 +1,5 @@ import styled from "@emotion/styled"; -import { useEmail } from "@frontend/common/src/hooks/useEmail"; +import { useEmail } from "@frontend/common/hooks/useEmail"; import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, X, YouTube } from "@mui/icons-material"; import * as React from "react"; diff --git a/apps/pyconkr-2026/src/components/layout/Footer/index.tsx b/apps/pyconkr-2026/src/components/layout/Footer/index.tsx index a010177..28fea3f 100644 --- a/apps/pyconkr-2026/src/components/layout/Footer/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/Footer/index.tsx @@ -1,13 +1,13 @@ import styled from "@emotion/styled"; -import { useEmail } from "@frontend/common/src/hooks/useEmail"; +import { useEmail } from "@frontend/common/hooks/useEmail"; import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, OpenInNew, X, YouTube } from "@mui/icons-material"; import { Button, useMediaQuery, useTheme } from "@mui/material"; import * as React from "react"; import FlickrIcon from "@apps/pyconkr-2026/assets/thirdparty/flickr.svg?react"; -import { useAppContext } from "../../../contexts/app_context"; import MobileFooter from "./Mobile/MobileFooter"; +import { useAppContext } from "../../../contexts/app_context"; interface IconItem { icon: React.FC<{ width?: number; height?: number }>; diff --git a/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileHeader.tsx b/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileHeader.tsx index 98c5f1c..f7696bc 100644 --- a/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileHeader.tsx +++ b/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileHeader.tsx @@ -1,12 +1,12 @@ -import { Components } from "@frontend/common"; +import { PythonKorea } from "@frontend/common/components"; import { Box, Stack, styled, Typography } from "@mui/material"; import * as React from "react"; import { Link } from "react-router-dom"; import { HamburgerButton } from "./HamburgerButton"; import { MobileNavigation } from "./MobileNavigation"; -import LanguageSelector from "../../LanguageSelector"; import { useAppContext } from "../../../../contexts/app_context"; +import LanguageSelector from "../../LanguageSelector"; export const MobileHeader: React.FC = () => { const { siteMapNode } = useAppContext(); @@ -19,7 +19,7 @@ export const MobileHeader: React.FC = () => { setIsOpen(!isOpen)} /> - + 파이콘 한국 2026 diff --git a/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileNavigation.tsx b/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileNavigation.tsx index 7848de4..ba17591 100644 --- a/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileNavigation.tsx +++ b/apps/pyconkr-2026/src/components/layout/Header/Mobile/MobileNavigation.tsx @@ -1,5 +1,5 @@ -import { Components } from "@frontend/common"; -import * as BackendAPISchemas from "@frontend/common/src/schemas/backendAPI"; +import { PythonKorea } from "@frontend/common/components"; +import * as BackendAPISchemas from "@frontend/common/schemas/backendAPI"; import { ArrowBack, ArrowForward } from "@mui/icons-material"; import { Box, Button, Chip, Drawer, IconButton, Stack, styled } from "@mui/material"; import * as React from "react"; @@ -150,7 +150,7 @@ export const MobileNavigation: React.FC = ({ isOpen, onCl - + 파이콘 한국 2026 diff --git a/apps/pyconkr-2026/src/components/layout/Header/index.tsx b/apps/pyconkr-2026/src/components/layout/Header/index.tsx index b9da072..46ada42 100644 --- a/apps/pyconkr-2026/src/components/layout/Header/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/Header/index.tsx @@ -1,4 +1,4 @@ -import { Components } from "@frontend/common"; +import { PythonKorea } from "@frontend/common/components"; import { ArrowForwardIos } from "@mui/icons-material"; import { Box, Button, CircularProgress, Divider, Stack, styled, SxProps, Theme, Typography, useMediaQuery, useTheme } from "@mui/material"; import { MUIStyledCommonProps } from "@mui/system"; @@ -53,7 +53,7 @@ export default function Header() { - + PyCon Korea 2026 diff --git a/apps/pyconkr-2026/src/components/layout/SignInButton/index.tsx b/apps/pyconkr-2026/src/components/layout/SignInButton/index.tsx index 7996129..3cacdd8 100644 --- a/apps/pyconkr-2026/src/components/layout/SignInButton/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/SignInButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useSignOutMutation, useUserStatus } from "@frontend/shop/hooks"; import { Login, Logout } from "@mui/icons-material"; import { Button, Stack } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -77,29 +77,28 @@ const InnerSignInButtonImpl: React.FC = ({ ); }; -export const SignInButton: React.FC<{ isMobile?: boolean; isMainPath?: boolean; onClose?: () => void }> = ({ - isMobile = false, - isMainPath = true, - onClose, -}) => { - const SignInWithErrorBoundary = ErrorBoundary.with( - { fallback: }, - Suspense.with({ fallback: }, () => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const signOutMutation = Shop.Hooks.useSignOutMutation(shopAPIClient); - const { data } = Shop.Hooks.useUserStatus(shopAPIClient); +type SignInButtonProps = { isMobile?: boolean; isMainPath?: boolean; onClose?: () => void }; - return ( - - ); - }) - ); +const SignInButtonContent: React.FC = ({ isMobile, isMainPath, onClose }) => { + const shopAPIClient = useShopClient(); + const signOutMutation = useSignOutMutation(shopAPIClient); + const { data } = useUserStatus(shopAPIClient); - return ; + return ( + + ); }; + +export const SignInButton: React.FC = ({ isMobile = false, isMainPath = true, onClose }) => ( + }> + }> + + + +); diff --git a/apps/pyconkr-2026/src/components/layout/UserScanCodeButton/index.tsx b/apps/pyconkr-2026/src/components/layout/UserScanCodeButton/index.tsx index 3a26bf0..e6b9efc 100644 --- a/apps/pyconkr-2026/src/components/layout/UserScanCodeButton/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/UserScanCodeButton/index.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useUserInfo } from "@frontend/shop/hooks"; import { QrCode2 } from "@mui/icons-material"; import { Button, IconButton, IconButtonProps } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; @@ -9,8 +9,8 @@ import { useAppContext } from "../../../contexts/app_context"; export const ScanCodeIconButton: React.FC<{ sx?: IconButtonProps["sx"] }> = Suspense.with( { fallback: }, ErrorBoundary.with({ fallback: }, ({ sx }) => { - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data } = Shop.Hooks.useUserInfo(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data } = useUserInfo(shopAPIClient); const iconBtnStyle: IconButtonProps["sx"] = (theme) => ({ color: theme.palette.primary.nonFocus, @@ -31,8 +31,8 @@ export const ScanCodeButton: React.FC = Suspense.with( { fallback: null }, ErrorBoundary.with({ fallback: null }, () => { const { language } = useAppContext(); - const shopAPIClient = Shop.Hooks.useShopClient(); - const { data } = Shop.Hooks.useUserInfo(shopAPIClient); + const shopAPIClient = useShopClient(); + const { data } = useUserInfo(shopAPIClient); const buttonText = language === "ko" ? "등록 코드" : "Entrance QR Code"; diff --git a/apps/pyconkr-2026/src/components/layout/index.tsx b/apps/pyconkr-2026/src/components/layout/index.tsx index f86462c..ee0da09 100644 --- a/apps/pyconkr-2026/src/components/layout/index.tsx +++ b/apps/pyconkr-2026/src/components/layout/index.tsx @@ -2,10 +2,10 @@ import styled from "@emotion/styled"; import { Stack } from "@mui/material"; import { Outlet } from "react-router-dom"; -import { useAppContext } from "../../contexts/app_context"; import Footer from "./Footer"; import Header from "./Header"; import { Sponsor } from "./Sponsor"; +import { useAppContext } from "../../contexts/app_context"; export default function MainLayout() { const { shouldShowSponsorBanner } = useAppContext(); diff --git a/apps/pyconkr-2026/src/components/pages/dynamic_route.tsx b/apps/pyconkr-2026/src/components/pages/dynamic_route.tsx index 1fd2246..9a43b3d 100644 --- a/apps/pyconkr-2026/src/components/pages/dynamic_route.tsx +++ b/apps/pyconkr-2026/src/components/pages/dynamic_route.tsx @@ -1,8 +1,8 @@ -import { Components } from "@frontend/common"; -import { useBackendClient, usePageQuery } from "@frontend/common/src/hooks/useAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; -import { parseCss } from "@frontend/common/src/utils"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { CenteredPage, ErrorFallback, MDXRenderer } from "@frontend/common/components"; +import { useBackendClient, usePageQuery } from "@frontend/common/hooks/useAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; +import { parseCss } from "@frontend/common/utils"; import { CircularProgress, Stack, Theme } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { useQueryClient } from "@tanstack/react-query"; @@ -62,9 +62,9 @@ const LoginRequired: React.FC = () => <>401 Login Required; const PermissionDenied: React.FC = () => <>403 Permission Denied; const PageNotFound: React.FC = () => <>404 Not Found; const CenteredLoadingPage: React.FC = () => ( - + - + ); const throwPageNotFound: (message: string) => never = (message) => { @@ -85,10 +85,10 @@ const RouteErrorFallback: React.FC<{ error: Error; reset: () => void }> = ({ err case 404: return ; default: - return ; + return ; } } - return ; + return ; }; const WaitedCenteredLoadingPage: React.FC = Suspense.with({ fallback: }, () => { @@ -122,7 +122,7 @@ const InnerPageRenderer: React.FC<{ id: string }> = Suspense.with({ fallback: {data.sections.map((s) => ( - + ))} diff --git a/apps/pyconkr-2026/src/components/pages/presentation_detail.tsx b/apps/pyconkr-2026/src/components/pages/presentation_detail.tsx index eea07a4..361331d 100644 --- a/apps/pyconkr-2026/src/components/pages/presentation_detail.tsx +++ b/apps/pyconkr-2026/src/components/pages/presentation_detail.tsx @@ -1,6 +1,6 @@ -import { Components } from "@frontend/common"; -import { useBackendClient, useSessionQuery } from "@frontend/common/src/hooks/useAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { CenteredPage, ErrorFallback, FallbackImage, LinkHandler, MDXRenderer } from "@frontend/common/components"; +import { useBackendClient, useSessionQuery } from "@frontend/common/hooks/useAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Box, Chip, CircularProgress, Divider, Stack, styled, Table, TableBody, TableCell, TableRow, Typography } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { DateTime } from "luxon"; @@ -22,12 +22,12 @@ type SimplifiedSpeakerSchema = { }; const CenteredLoadingPage: React.FC = () => ( - + - + ); -const StyledPresentationImage = styled(Components.FallbackImage)(({ theme }) => ({ +const StyledPresentationImage = styled(FallbackImage)(({ theme }) => ({ maxWidth: "75%", maxHeight: "480px", aspectRatio: "1", @@ -92,7 +92,7 @@ const ProfileImageStyle: React.CSSProperties = { objectFit: "cover", }; -const ProfileImage = styled(Components.FallbackImage)(ProfileImageStyle); +const ProfileImage = styled(FallbackImage)(ProfileImageStyle); const ProfileImageErrorFallback: React.FC = () => ( @@ -111,9 +111,7 @@ const PresentationSpeakerItem: React.FC<{ speaker: SimplifiedSpeakerSchema }> = {speaker.biography ? ( - } - /> + } /> ) : ( <>
@@ -147,7 +145,7 @@ const PresentationImageFallback: React.FC<{ language: "ko" | "en" }> = ({ langua }; export const PresentationDetailPage: React.FC = ErrorBoundary.with( - { fallback: Components.ErrorFallback }, + { fallback: ErrorFallback }, Suspense.with({ fallback: }, () => { const { id } = useParams(); const { language, setAppContext } = useAppContext(); @@ -250,7 +248,7 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( } /> ({ color: theme.palette.primary.main, textDecoration: "underline" })}> - + ) : null} @@ -264,12 +262,7 @@ export const PresentationDetailPage: React.FC = ErrorBoundary.with( /> )} - + {presentation.speakers && ( diff --git a/apps/pyconkr-2026/src/components/pages/sign_in.tsx b/apps/pyconkr-2026/src/components/pages/sign_in.tsx index 905b2ad..94e928c 100644 --- a/apps/pyconkr-2026/src/components/pages/sign_in.tsx +++ b/apps/pyconkr-2026/src/components/pages/sign_in.tsx @@ -1,4 +1,4 @@ -import * as Shop from "@frontend/shop"; +import { useShopClient, useSignInWithSNSMutation, useUserStatus } from "@frontend/shop/hooks"; import { AccountCircleOutlined, Google } from "@mui/icons-material"; import { Backdrop, Button, ButtonProps, CircularProgress, Stack, Typography } from "@mui/material"; import { Suspense } from "@suspensive/react"; @@ -17,9 +17,9 @@ export const ShopSignInPage: React.FC = Suspense.with({ fallback: ({ openBackdrop: false }); const navigate = useNavigate(); - const shopAPIClient = Shop.Hooks.useShopClient(); - const SignInMutation = Shop.Hooks.useSignInWithSNSMutation(shopAPIClient); - const { data } = Shop.Hooks.useUserStatus(shopAPIClient); + const shopAPIClient = useShopClient(); + const SignInMutation = useSignInWithSNSMutation(shopAPIClient); + const { data } = useUserStatus(shopAPIClient); const shouldOpenBackdrop = SignInMutation.isPending || state.openBackdrop; @@ -55,7 +55,7 @@ export const ShopSignInPage: React.FC = Suspense.with({ fallback: <>404 Not Found; const CenteredLoadingPage: React.FC = () => ( - + - + ); const LogoImage = styled("img")(({ theme }) => ({ @@ -51,7 +51,7 @@ const DescriptionBox = styled(Box)(({ theme }) => ({ })); export const SponsorDetailPage: React.FC = ErrorBoundary.with( - { fallback: Components.ErrorFallback }, + { fallback: ErrorFallback }, Suspense.with({ fallback: }, () => { const { id } = useParams(); const { language, sponsorTiers, setAppContext } = useAppContext(); @@ -90,7 +90,7 @@ export const SponsorDetailPage: React.FC = ErrorBoundary.with(
- + ); diff --git a/apps/pyconkr-2026/src/consts/mdx_components.ts b/apps/pyconkr-2026/src/consts/mdx_components.ts index 974feee..3992a4b 100644 --- a/apps/pyconkr-2026/src/consts/mdx_components.ts +++ b/apps/pyconkr-2026/src/consts/mdx_components.ts @@ -1,6 +1,20 @@ // 후대의 개발자님께 : 컴포넌트 맨 첫글자가 대문자로 시작하지 않으면 JSX 컴포넌트가 아니라 일반 HTML 태그로 인식합니다. 제발 대문자로 시작해주세요. -import { Components, Schemas } from "@frontend/common"; -import * as Shop from "@frontend/shop"; +import { LottiePlayer, NetworkLottiePlayer } from "@frontend/common/components"; +import { + Confetti, + FAQAccordion, + Map as MDXMap, + MobileAccordion, + MobileCover, + PrimaryStyledDetails, + SecondaryStyledDetails, + SessionList, + SessionTimeTable, + StyledFullWidthButton, +} from "@frontend/common/components/mdx_components"; +import type { SessionSchema } from "@frontend/common/schemas/backendAPI"; +import { PriceDisplay, ShopContextProvider, SignInGuard, UserSignInAccount, UserSignInMethod } from "@frontend/shop/components/common"; +import { CartStatus, OrderList, PatronList, ProductImageCardList, ProductList, UserInfo } from "@frontend/shop/components/features"; import * as mui from "@mui/material"; import type { MDXComponents } from "mdx/types.js"; import * as React from "react"; @@ -137,7 +151,7 @@ const MUIMDXComponents: MDXComponents = { Mui__material__Zoom: mui.Zoom, }; -const getPyConKR2025SessionUrl = (session: Schemas.BackendAPI.SessionSchema): string => { +const getPyConKR2025SessionUrl = (session: SessionSchema): string => { const urlSafeTitle = session.title .replace(/ /g, "-") .replace(/([.])/g, "_") @@ -151,21 +165,21 @@ const PyConKR2025FallbackImage = React.createElement("img", { style: { width: "100%", height: "100%", objectFit: "cover", borderRadius: "50%" }, }); -const PyConKR2025SessionList: React.FC> = (props) => - React.createElement(Components.MDX.SessionList, { +const PyConKR2025SessionList: React.FC> = (props) => + React.createElement(SessionList, { ...props, fallbackImage: PyConKR2025FallbackImage, getSessionUrl: getPyConKR2025SessionUrl, }); -const PyConKR2025SessionTimeTable: React.FC> = (props) => - React.createElement(Components.MDX.SessionTimeTable, { +const PyConKR2025SessionTimeTable: React.FC> = (props) => + React.createElement(SessionTimeTable, { ...props, getSessionUrl: getPyConKR2025SessionUrl, }); const PyConKR2025MobileAccordion: React.FC = () => - React.createElement(Components.MDX.MobileAccordion, { + React.createElement(MobileAccordion, { marqueeText: "AUG 15 - 17", marqueeLogoSrc: PyCon2025HostLogoSmall, hostLogoBigSrc: PyCon2025HostLogoBig, @@ -174,20 +188,20 @@ const PyConKR2025MobileAccordion: React.FC = () => }); const PyConKR2025MobileCover: React.FC = () => - React.createElement(Components.MDX.MobileCover, { + React.createElement(MobileCover, { coverImageSrc: PyCon2025MobileLogoImage, coverTitleSrc: PyCon2025MobileLogoTitle, }); const PyConKRCommonMDXComponents: MDXComponents = { - Common__Components__Lottie: Components.LottiePlayer, - Common__Components__NetworkLottie: Components.NetworkLottiePlayer, - Common__Components__MDX__Confetti: Components.MDX.Confetti, - Common__Components__MDX__PrimaryStyledDetails: Components.MDX.PrimaryStyledDetails, - Common__Components__MDX__SecondaryStyledDetails: Components.MDX.SecondaryStyledDetails, - Common__Components__MDX__Map: Components.MDX.Map, - Common__Components__MDX__FAQAccordion: Components.MDX.FAQAccordion, - Common__Components__MDX__FullWidthStyledButton: Components.MDX.StyledFullWidthButton, + Common__Components__Lottie: LottiePlayer, + Common__Components__NetworkLottie: NetworkLottiePlayer, + Common__Components__MDX__Confetti: Confetti, + Common__Components__MDX__PrimaryStyledDetails: PrimaryStyledDetails, + Common__Components__MDX__SecondaryStyledDetails: SecondaryStyledDetails, + Common__Components__MDX__Map: MDXMap, + Common__Components__MDX__FAQAccordion: FAQAccordion, + Common__Components__MDX__FullWidthStyledButton: StyledFullWidthButton, Common__Components__Session__List: PyConKR2025SessionList, Common__Components__Session__TimeTable: PyConKR2025SessionTimeTable, Common__Components__MDX__MobileAccordion: PyConKR2025MobileAccordion, @@ -195,17 +209,17 @@ const PyConKRCommonMDXComponents: MDXComponents = { }; const PythonKRShopMDXComponents: MDXComponents = { - Shop__Common__PriceDisplay: Shop.Components.Common.PriceDisplay, - Shop__Common__SignInGuard: Shop.Components.Common.SignInGuard, - Shop__Common__ContextProvider: Shop.Components.Common.ShopContextProvider, - Shop__Common__UserSignInMethod: Shop.Components.Common.UserSignInMethod, - Shop__Common__UserSignInAccount: Shop.Components.Common.UserSignInAccount, - Shop__Feature__CartStatus: Shop.Components.Features.CartStatus, - Shop__Feature__ProductList: Shop.Components.Features.ProductList, - Shop__Feature__ProductImageCardList: Shop.Components.Features.ProductImageCardList, - Shop__Feature__OrderList: Shop.Components.Features.OrderList, - Shop__Feature__UserInfo: Shop.Components.Features.UserInfo, - Shop__Feature__PatronList: Shop.Components.Features.PatronList, + Shop__Common__PriceDisplay: PriceDisplay, + Shop__Common__SignInGuard: SignInGuard, + Shop__Common__ContextProvider: ShopContextProvider, + Shop__Common__UserSignInMethod: UserSignInMethod, + Shop__Common__UserSignInAccount: UserSignInAccount, + Shop__Feature__CartStatus: CartStatus, + Shop__Feature__ProductList: ProductList, + Shop__Feature__ProductImageCardList: ProductImageCardList, + Shop__Feature__OrderList: OrderList, + Shop__Feature__UserInfo: UserInfo, + Shop__Feature__PatronList: PatronList, }; export const PyConKRMDXComponents = { diff --git a/apps/pyconkr-2026/src/main.tsx b/apps/pyconkr-2026/src/main.tsx index cf24b1f..851e60b 100644 --- a/apps/pyconkr-2026/src/main.tsx +++ b/apps/pyconkr-2026/src/main.tsx @@ -1,7 +1,9 @@ import { Global } from "@emotion/react"; -import { Components, Utils } from "@frontend/common"; -import type { ContextOptions } from "@frontend/common/src/contexts"; -import * as Shop from "@frontend/shop"; +import { CenteredPage, CommonContextProvider, ErrorFallback } from "@frontend/common/components"; +import type { ContextOptions } from "@frontend/common/contexts"; +import { registerChunkLoadErrorReloadHandler } from "@frontend/common/utils"; +import { ShopContextProvider } from "@frontend/shop/components/common"; +import { ContextOptions as ShopContextOptions } from "@frontend/shop/contexts"; import { CircularProgress, CssBaseline, ThemeProvider } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { matchQuery, MutationCache, QueryClient, QueryClientProvider } from "@tanstack/react-query"; @@ -55,7 +57,7 @@ const CommonOptions: ContextOptions = { mdxComponents: PyConKRMDXComponents, }; -const ShopOptions: Shop.Contexts.ContextOptions = { +const ShopOptions: ShopContextOptions = { language: "ko", shopApiDomain: import.meta.env.VITE_PYCONKR_SHOP_API_DOMAIN, shopApiCSRFCookieName: import.meta.env.VITE_PYCONKR_SHOP_CSRF_COOKIE_NAME, @@ -64,12 +66,12 @@ const ShopOptions: Shop.Contexts.ContextOptions = { }; const SuspenseFallback = ( - + - + ); -const MainApp: React.FC = () => { +export const MainApp: React.FC = () => { const [appState, setAppContext] = React.useState>({ language: (localStorage.getItem(LOCAL_STORAGE_LANGUAGE_KEY) as "ko" | "en" | null) ?? "ko", shouldShowTitleBanner: true, @@ -87,9 +89,9 @@ const MainApp: React.FC = () => { - - - + + + @@ -98,8 +100,8 @@ const MainApp: React.FC = () => { - - + + @@ -108,6 +110,6 @@ const MainApp: React.FC = () => { ); }; -Utils.registerChunkLoadErrorReloadHandler(); +registerChunkLoadErrorReloadHandler(); ReactDom.createRoot(document.getElementById("root")!).render(); diff --git a/apps/pyconkr-2026/vite.config.mts b/apps/pyconkr-2026/vite.config.mts index 1dbfc41..1f9cfbd 100644 --- a/apps/pyconkr-2026/vite.config.mts +++ b/apps/pyconkr-2026/vite.config.mts @@ -20,9 +20,8 @@ export default defineConfig(({ mode }) => { plugins: [react(), mdx(), ...(isLocalHttpBackend ? [] : [mkcert({ hosts: [host] })]), svgr()], resolve: { alias: { - "@frontend/common/src": path.resolve(__dirname, "../../packages/common/src"), - "@frontend/common": path.resolve(__dirname, "../../packages/common/src/index.ts"), - "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src/index.ts"), + "@frontend/common": path.resolve(__dirname, "../../packages/common/src"), + "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src"), "@apps/pyconkr-2026": path.resolve(__dirname, "./src"), }, }, diff --git a/apps/pyconkr-admin/src/components/elements/admin_signin_guard.tsx b/apps/pyconkr-admin/src/components/elements/admin_signin_guard.tsx index 52e73e8..98aeb4f 100644 --- a/apps/pyconkr-admin/src/components/elements/admin_signin_guard.tsx +++ b/apps/pyconkr-admin/src/components/elements/admin_signin_guard.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useSignedInUserQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useSignedInUserQuery } from "@frontend/common/hooks/useAdminAPI"; import { CircularProgress } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/elements/error_fallback.tsx b/apps/pyconkr-admin/src/components/elements/error_fallback.tsx index 50b6dda..eeea510 100644 --- a/apps/pyconkr-admin/src/components/elements/error_fallback.tsx +++ b/apps/pyconkr-admin/src/components/elements/error_fallback.tsx @@ -1,8 +1,8 @@ -import { Components } from "@frontend/common"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { ErrorFallback as BaseErrorFallback } from "@frontend/common/components"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import * as React from "react"; export const ErrorFallback: React.FC<{ error: Error; reset: () => void }> = ({ error, reset }) => { const { debug } = useCommonContext(); - return ; + return ; }; diff --git a/apps/pyconkr-admin/src/components/elements/public_file_picker.tsx b/apps/pyconkr-admin/src/components/elements/public_file_picker.tsx index 626c154..495ee4e 100644 --- a/apps/pyconkr-admin/src/components/elements/public_file_picker.tsx +++ b/apps/pyconkr-admin/src/components/elements/public_file_picker.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useChoicesQuery, usePublicFileQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useChoicesQuery, usePublicFileQuery } from "@frontend/common/hooks/useAdminAPI"; import { OpenInNew } from "@mui/icons-material"; import { Autocomplete, Box, Button, CircularProgress, Stack, TextField } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; diff --git a/apps/pyconkr-admin/src/components/layouts/admin_editor.tsx b/apps/pyconkr-admin/src/components/layouts/admin_editor.tsx index c7d0b03..e576464 100644 --- a/apps/pyconkr-admin/src/components/layouts/admin_editor.tsx +++ b/apps/pyconkr-admin/src/components/layouts/admin_editor.tsx @@ -1,5 +1,5 @@ -import { Components } from "@frontend/common"; -import { retrieve } from "@frontend/common/src/apis/admin_api"; +import { retrieve } from "@frontend/common/apis/admin_api"; +import { LottieDebugPanel, MDXRenderer, MarkdownEditor } from "@frontend/common/components"; import { useBackendAdminClient, useChoicesQuery, @@ -7,13 +7,13 @@ import { useRemoveMutation, useSchemaQuery, useUpdateMutation, -} from "@frontend/common/src/hooks/useAdminAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +} from "@frontend/common/hooks/useAdminAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { filterPropertiesByLanguageInJsonSchema, filterReadOnlyPropertiesInJsonSchema, filterWritablePropertiesInJsonSchema, -} from "@frontend/common/src/utils"; +} from "@frontend/common/utils"; import { Add, Close, Delete, Edit } from "@mui/icons-material"; import { Box, @@ -195,10 +195,10 @@ const MDEditorField: Field = ErrorBoundary.with({ fallback: ErrorFallback }, ({ - + - + @@ -248,7 +248,7 @@ const ReadOnlyValueField: React.FC<{ )} {fieldState.blob.type.startsWith("application/json") && fieldState.blobText && ( - + )} 링크 diff --git a/apps/pyconkr-admin/src/components/layouts/admin_list.tsx b/apps/pyconkr-admin/src/components/layouts/admin_list.tsx index ad8325d..dd03518 100644 --- a/apps/pyconkr-admin/src/components/layouts/admin_list.tsx +++ b/apps/pyconkr-admin/src/components/layouts/admin_list.tsx @@ -4,8 +4,8 @@ import { useListQuery, useOpenApiSchemaQuery, useRemovePreparedMutation, -} from "@frontend/common/src/hooks/useAdminAPI"; -import { extractQueryParameters } from "@frontend/common/src/utils"; +} from "@frontend/common/hooks/useAdminAPI"; +import { extractQueryParameters } from "@frontend/common/utils"; import { Add, Delete, Edit } from "@mui/icons-material"; import { Box, Button, CircularProgress, IconButton, Stack, Table, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; diff --git a/apps/pyconkr-admin/src/components/pages/account/account.tsx b/apps/pyconkr-admin/src/components/pages/account/account.tsx index ca6db0f..ced324e 100644 --- a/apps/pyconkr-admin/src/components/pages/account/account.tsx +++ b/apps/pyconkr-admin/src/components/pages/account/account.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useSignedInUserQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useSignedInUserQuery } from "@frontend/common/hooks/useAdminAPI"; import { CircularProgress } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/account/manage.tsx b/apps/pyconkr-admin/src/components/pages/account/manage.tsx index dbbdb03..4408634 100644 --- a/apps/pyconkr-admin/src/components/pages/account/manage.tsx +++ b/apps/pyconkr-admin/src/components/pages/account/manage.tsx @@ -1,6 +1,6 @@ -import { me } from "@frontend/common/src/apis/admin_api"; -import { useBackendAdminClient, useChangePasswordMutation, useSignOutMutation } from "@frontend/common/src/hooks/useAdminAPI"; -import { getFormValue, isFormValid } from "@frontend/common/src/utils"; +import { me } from "@frontend/common/apis/admin_api"; +import { useBackendAdminClient, useChangePasswordMutation, useSignOutMutation } from "@frontend/common/hooks/useAdminAPI"; +import { getFormValue, isFormValid } from "@frontend/common/utils"; import { Logout } from "@mui/icons-material"; import { Button, Stack, Tab, Tabs, TextField, Typography } from "@mui/material"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/account/sign_in.tsx b/apps/pyconkr-admin/src/components/pages/account/sign_in.tsx index 82e4d1c..a064221 100644 --- a/apps/pyconkr-admin/src/components/pages/account/sign_in.tsx +++ b/apps/pyconkr-admin/src/components/pages/account/sign_in.tsx @@ -1,6 +1,6 @@ -import { useBackendAdminClient, useSignInMutation } from "@frontend/common/src/hooks/useAdminAPI"; -import { getFormValue } from "@frontend/common/src/utils"; -import { me } from "@frontend/common/src/apis/admin_api"; +import { me } from "@frontend/common/apis/admin_api"; +import { useBackendAdminClient, useSignInMutation } from "@frontend/common/hooks/useAdminAPI"; +import { getFormValue } from "@frontend/common/utils"; import { Login } from "@mui/icons-material"; import { Button, Stack, TextField, Typography } from "@mui/material"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/external_api/google_oauth2_editor.tsx b/apps/pyconkr-admin/src/components/pages/external_api/google_oauth2_editor.tsx index 5358720..6c2c641 100644 --- a/apps/pyconkr-admin/src/components/pages/external_api/google_oauth2_editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/external_api/google_oauth2_editor.tsx @@ -1,5 +1,5 @@ -import { useBackendAdminClient, useIssueGoogleOAuth2AccessTokenMutation } from "@frontend/common/src/hooks/useAdminAPI"; -import { GoogleOAuth2AccessTokenResponseSchema } from "@frontend/common/src/schemas/backendAdminAPI"; +import { useBackendAdminClient, useIssueGoogleOAuth2AccessTokenMutation } from "@frontend/common/hooks/useAdminAPI"; +import { GoogleOAuth2AccessTokenResponseSchema } from "@frontend/common/schemas/backendAdminAPI"; import { VpnKey } from "@mui/icons-material"; import { Box, Button, Stack, Table, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/file/upload.tsx b/apps/pyconkr-admin/src/components/pages/file/upload.tsx index 251a60d..3c88e7c 100644 --- a/apps/pyconkr-admin/src/components/pages/file/upload.tsx +++ b/apps/pyconkr-admin/src/components/pages/file/upload.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useUploadPublicFileMutation } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useUploadPublicFileMutation } from "@frontend/common/hooks/useAdminAPI"; import { CloudUpload, PermMedia } from "@mui/icons-material"; import { Box, Button, Input, Stack, Typography } from "@mui/material"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/modification_audit/components.tsx b/apps/pyconkr-admin/src/components/pages/modification_audit/components.tsx index 3fbfaa1..9496d98 100644 --- a/apps/pyconkr-admin/src/components/pages/modification_audit/components.tsx +++ b/apps/pyconkr-admin/src/components/pages/modification_audit/components.tsx @@ -1,6 +1,6 @@ -import { Components } from "@frontend/common"; -import { useBackendAdminClient, usePublicFileQuery } from "@frontend/common/src/hooks/useAdminAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { FallbackImage, Fieldset, MDXRenderer } from "@frontend/common/components"; +import { useBackendAdminClient, usePublicFileQuery } from "@frontend/common/hooks/useAdminAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Accordion, AccordionDetails, @@ -81,40 +81,30 @@ export const PreviewTextField: React.FC = ({ originalDataset, export const PreviewMarkdownField: React.FC = ({ originalDataset, previewDataset, name, label }) => { const { baseUrl, mdxComponents } = useCommonContext(); return originalDataset[name] === previewDataset[name] ? ( - +
- + - +
) : ( - +
- + - +
기존 값을 보려면 여기를 클릭해주세요.
- +
- + - +
@@ -127,7 +117,7 @@ const ImageFallback: React.FC = () => ( ); -const WidthSpecifiedFallbackImage = styled(Components.FallbackImage)({ +const WidthSpecifiedFallbackImage = styled(FallbackImage)({ maxWidth: "20rem", objectFit: "cover", }); @@ -141,7 +131,7 @@ export const PreviewImageField: React.FC = ({ originalD const { data: previewImage } = usePublicFileQuery(backendAdminClient, newImgId); return originalImage?.id === previewImage?.id ? ( - +
{previewImage?.file ? ( } /> @@ -149,13 +139,13 @@ export const PreviewImageField: React.FC = ({ originalD )} - +
) : ( - +
{previewImage?.file ? ( } /> @@ -163,12 +153,12 @@ export const PreviewImageField: React.FC = ({ originalD )} - +
기존 이미지를 보려면 여기를 클릭해주세요.
- +
{originalImage?.file ? ( } /> @@ -176,7 +166,7 @@ export const PreviewImageField: React.FC = ({ originalD )} - +
diff --git a/apps/pyconkr-admin/src/components/pages/modification_audit/dialogs.tsx b/apps/pyconkr-admin/src/components/pages/modification_audit/dialogs.tsx index 10da0cc..07dfe03 100644 --- a/apps/pyconkr-admin/src/components/pages/modification_audit/dialogs.tsx +++ b/apps/pyconkr-admin/src/components/pages/modification_audit/dialogs.tsx @@ -1,6 +1,6 @@ -import { Components } from "@frontend/common"; -import { useApproveModificationAuditMutation, useBackendAdminClient, useRejectModificationAuditMutation } from "@frontend/common/src/hooks/useAdminAPI"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { Fieldset } from "@frontend/common/components"; +import { useApproveModificationAuditMutation, useBackendAdminClient, useRejectModificationAuditMutation } from "@frontend/common/hooks/useAdminAPI"; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField, Typography } from "@mui/material"; import { enqueueSnackbar, OptionsObject } from "notistack"; import * as React from "react"; @@ -85,9 +85,9 @@ export const RejectSubmitConfirmDialog: React.FC = ({
반려 후에는 다시 승인할 수 없습니다!
- +
- +
- + diff --git a/apps/pyconkr-admin/src/components/pages/presentation/editor.tsx b/apps/pyconkr-admin/src/components/pages/presentation/editor.tsx index 0e39ec3..16dd1e2 100644 --- a/apps/pyconkr-admin/src/components/pages/presentation/editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/presentation/editor.tsx @@ -1,4 +1,4 @@ -import { Components } from "@frontend/common"; +import { Fieldset, MDXRenderer, MarkdownEditor } from "@frontend/common/components"; import { useBackendAdminClient, useChoicesQuery, @@ -7,8 +7,8 @@ import { useRemovePreparedMutation, useSchemaQuery, useUpdatePreparedMutation, -} from "@frontend/common/src/hooks/useAdminAPI"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +} from "@frontend/common/hooks/useAdminAPI"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Autocomplete, Box, Button, Card, CardContent, CircularProgress, Stack, styled, Tab, Tabs, TextField, Typography } from "@mui/material"; import { DateTimePicker, LocalizationProvider } from "@mui/x-date-pickers"; import { AdapterLuxon } from "@mui/x-date-pickers/AdapterLuxon"; @@ -155,10 +155,10 @@ const PresentationSpeakerForm: React.FC = ({ di - + - + @@ -303,7 +303,10 @@ export const AdminPresentationEditor: React.FC = ErrorBoundary.with( const schedules = scheduleInitialData.map((s) => ({ ...s, trackId: s.id || Math.random().toString(36).substring(2, 15) })); React.useMemo(() => { - const mergeChoices = (schema: { schema?: { properties?: Record } }, choices: Record) => { + const mergeChoices = ( + schema: { schema?: { properties?: Record } }, + choices: Record + ) => { if (!schema?.schema?.properties || !choices) return; for (const [fieldName, items] of Object.entries(choices)) { const prop = schema.schema.properties[fieldName]; @@ -386,7 +389,7 @@ export const AdminPresentationEditor: React.FC = ErrorBoundary.with( {id ? ( - +
스케줄 정보 {editorState.schedules.map((s) => ( @@ -400,8 +403,8 @@ export const AdminPresentationEditor: React.FC = ErrorBoundary.with( ))}
+
발표자 정보 {editorState.speakers.map((s) => ( @@ -415,7 +418,7 @@ export const AdminPresentationEditor: React.FC = ErrorBoundary.with( ))}
) : ( diff --git a/apps/pyconkr-admin/src/components/pages/shop/category_group/editor.tsx b/apps/pyconkr-admin/src/components/pages/shop/category_group/editor.tsx index bed4e01..d90c4ce 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/category_group/editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/category_group/editor.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useRetrieveQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useRetrieveQuery } from "@frontend/common/hooks/useAdminAPI"; import { Add, Delete, Edit } from "@mui/icons-material"; import { Button, diff --git a/apps/pyconkr-admin/src/components/pages/shop/order/editor.tsx b/apps/pyconkr-admin/src/components/pages/shop/order/editor.tsx index c0ae856..1e42973 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/order/editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/order/editor.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useRetrieveQuery, useUpdateMutation } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useRetrieveQuery, useUpdateMutation } from "@frontend/common/hooks/useAdminAPI"; import { CurrencyExchange, NotificationsActive, Save } from "@mui/icons-material"; import { Alert, diff --git a/apps/pyconkr-admin/src/components/pages/shop/order/list.tsx b/apps/pyconkr-admin/src/components/pages/shop/order/list.tsx index 56af830..5e82228 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/order/list.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/order/list.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useListPaginatedQuery, useListQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useListPaginatedQuery, useListQuery } from "@frontend/common/hooks/useAdminAPI"; import { Chip, CircularProgress, diff --git a/apps/pyconkr-admin/src/components/pages/shop/order/refund_dialog.tsx b/apps/pyconkr-admin/src/components/pages/shop/order/refund_dialog.tsx index 6822646..802a593 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/order/refund_dialog.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/order/refund_dialog.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient } from "@frontend/common/hooks/useAdminAPI"; import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField, Typography } from "@mui/material"; import { useMutation } from "@tanstack/react-query"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/components/pages/shop/product/editor.tsx b/apps/pyconkr-admin/src/components/pages/shop/product/editor.tsx index d537752..9a2c1bf 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/product/editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/product/editor.tsx @@ -5,7 +5,7 @@ import { useRemoveMutation, useRetrieveQuery, useUpdateMutation, -} from "@frontend/common/src/hooks/useAdminAPI"; +} from "@frontend/common/hooks/useAdminAPI"; import { Add, Delete, Edit } from "@mui/icons-material"; import { Box, diff --git a/apps/pyconkr-admin/src/components/pages/shop/product/list.tsx b/apps/pyconkr-admin/src/components/pages/shop/product/list.tsx index ac137d3..a455ea2 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/product/list.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/product/list.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useListQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useListQuery } from "@frontend/common/hooks/useAdminAPI"; import { Add, Delete, Edit } from "@mui/icons-material"; import { Button, diff --git a/apps/pyconkr-admin/src/components/pages/shop/product/tabs/basic_info_tab.tsx b/apps/pyconkr-admin/src/components/pages/shop/product/tabs/basic_info_tab.tsx index 40e0799..23f3400 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/product/tabs/basic_info_tab.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/product/tabs/basic_info_tab.tsx @@ -1,5 +1,5 @@ -import { Components } from "@frontend/common"; -import { useCommonContext } from "@frontend/common/src/hooks/useCommonContext"; +import { MarkdownEditor, MDXRenderer } from "@frontend/common/components"; +import { useCommonContext } from "@frontend/common/hooks/useCommonContext"; import { Autocomplete, Box, @@ -128,15 +128,10 @@ export const BasicInfoTab: React.FC = ({ values, setField, disabled, grou
- setField(descKey, value ?? "")} - /> + setField(descKey, value ?? "")} /> - + diff --git a/apps/pyconkr-admin/src/components/pages/shop/product/tabs/option_groups_tab.tsx b/apps/pyconkr-admin/src/components/pages/shop/product/tabs/option_groups_tab.tsx index 40f05e1..8efdebb 100644 --- a/apps/pyconkr-admin/src/components/pages/shop/product/tabs/option_groups_tab.tsx +++ b/apps/pyconkr-admin/src/components/pages/shop/product/tabs/option_groups_tab.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useCreateMutation, useUpdateMutation } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useCreateMutation, useUpdateMutation } from "@frontend/common/hooks/useAdminAPI"; import { Add, Delete, Edit, ExpandMore } from "@mui/icons-material"; import { Accordion, diff --git a/apps/pyconkr-admin/src/components/pages/sitemap/list.tsx b/apps/pyconkr-admin/src/components/pages/sitemap/list.tsx index b341c00..bc908ca 100644 --- a/apps/pyconkr-admin/src/components/pages/sitemap/list.tsx +++ b/apps/pyconkr-admin/src/components/pages/sitemap/list.tsx @@ -4,8 +4,8 @@ import { useListQuery, useRemovePreparedMutation, useUpdatePreparedMutation, -} from "@frontend/common/src/hooks/useAdminAPI"; -import { buildFlatSiteMap, buildNestedSiteMap } from "@frontend/common/src/utils"; +} from "@frontend/common/hooks/useAdminAPI"; +import { buildFlatSiteMap, buildNestedSiteMap } from "@frontend/common/utils"; import { Add, Delete, Edit, Save } from "@mui/icons-material"; import { Box, diff --git a/apps/pyconkr-admin/src/components/pages/user/editor.tsx b/apps/pyconkr-admin/src/components/pages/user/editor.tsx index b718036..90effc2 100644 --- a/apps/pyconkr-admin/src/components/pages/user/editor.tsx +++ b/apps/pyconkr-admin/src/components/pages/user/editor.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useResetUserPasswordMutation } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useResetUserPasswordMutation } from "@frontend/common/hooks/useAdminAPI"; import { KeyOff } from "@mui/icons-material"; import { Button, ButtonProps, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; diff --git a/apps/pyconkr-admin/src/components/pages/user/shop_order_section.tsx b/apps/pyconkr-admin/src/components/pages/user/shop_order_section.tsx index cf0f9c9..4939a63 100644 --- a/apps/pyconkr-admin/src/components/pages/user/shop_order_section.tsx +++ b/apps/pyconkr-admin/src/components/pages/user/shop_order_section.tsx @@ -1,4 +1,4 @@ -import { useBackendAdminClient, useListQuery } from "@frontend/common/src/hooks/useAdminAPI"; +import { useBackendAdminClient, useListQuery } from "@frontend/common/hooks/useAdminAPI"; import { Alert, Chip, CircularProgress, Divider, Stack, Table, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import * as React from "react"; diff --git a/apps/pyconkr-admin/src/consts/mdx_components.ts b/apps/pyconkr-admin/src/consts/mdx_components.ts index 8b2b767..cdde31c 100644 --- a/apps/pyconkr-admin/src/consts/mdx_components.ts +++ b/apps/pyconkr-admin/src/consts/mdx_components.ts @@ -1,6 +1,17 @@ // 후대의 개발자님께 : 컴포넌트 맨 첫글자가 대문자로 시작하지 않으면 JSX 컴포넌트가 아니라 일반 HTML 태그로 인식합니다. 제발 대문자로 시작해주세요. -import { Components } from "@frontend/common"; -import * as Shop from "@frontend/shop"; +import { LottiePlayer, NetworkLottiePlayer } from "@frontend/common/components"; +import { + Confetti, + FAQAccordion, + Map as MDXMap, + PrimaryStyledDetails, + SecondaryStyledDetails, + SessionList, + SessionTimeTable, + StyledFullWidthButton, +} from "@frontend/common/components/mdx_components"; +import { PriceDisplay, ShopContextProvider, SignInGuard, UserSignInAccount, UserSignInMethod } from "@frontend/shop/components/common"; +import { CartStatus, OrderList, PatronList, ProductImageCardList, ProductList, UserInfo } from "@frontend/shop/components/features"; import * as mui from "@mui/material"; import type { MDXComponents } from "mdx/types.js"; @@ -131,30 +142,30 @@ const MUIMDXComponents: MDXComponents = { }; const PyConKRCommonMDXComponents: MDXComponents = { - Common__Components__Lottie: Components.LottiePlayer, - Common__Components__NetworkLottie: Components.NetworkLottiePlayer, - Common__Components__MDX__Confetti: Components.MDX.Confetti, - Common__Components__MDX__PrimaryStyledDetails: Components.MDX.PrimaryStyledDetails, - Common__Components__MDX__SecondaryStyledDetails: Components.MDX.SecondaryStyledDetails, - Common__Components__MDX__Map: Components.MDX.Map, - Common__Components__MDX__FAQAccordion: Components.MDX.FAQAccordion, - Common__Components__MDX__FullWidthStyledButton: Components.MDX.StyledFullWidthButton, - Common__Components__Session__List: Components.MDX.SessionList, - Common__Components__Session__TimeTable: Components.MDX.SessionTimeTable, + Common__Components__Lottie: LottiePlayer, + Common__Components__NetworkLottie: NetworkLottiePlayer, + Common__Components__MDX__Confetti: Confetti, + Common__Components__MDX__PrimaryStyledDetails: PrimaryStyledDetails, + Common__Components__MDX__SecondaryStyledDetails: SecondaryStyledDetails, + Common__Components__MDX__Map: MDXMap, + Common__Components__MDX__FAQAccordion: FAQAccordion, + Common__Components__MDX__FullWidthStyledButton: StyledFullWidthButton, + Common__Components__Session__List: SessionList, + Common__Components__Session__TimeTable: SessionTimeTable, }; const PythonKRShopMDXComponents: MDXComponents = { - Shop__Common__PriceDisplay: Shop.Components.Common.PriceDisplay, - Shop__Common__SignInGuard: Shop.Components.Common.SignInGuard, - Shop__Common__ContextProvider: Shop.Components.Common.ShopContextProvider, - Shop__Common__UserSignInMethod: Shop.Components.Common.UserSignInMethod, - Shop__Common__UserSignInAccount: Shop.Components.Common.UserSignInAccount, - Shop__Feature__CartStatus: Shop.Components.Features.CartStatus, - Shop__Feature__ProductList: Shop.Components.Features.ProductList, - Shop__Feature__ProductImageCardList: Shop.Components.Features.ProductImageCardList, - Shop__Feature__OrderList: Shop.Components.Features.OrderList, - Shop__Feature__UserInfo: Shop.Components.Features.UserInfo, - Shop__Feature__PatronList: Shop.Components.Features.PatronList, + Shop__Common__PriceDisplay: PriceDisplay, + Shop__Common__SignInGuard: SignInGuard, + Shop__Common__ContextProvider: ShopContextProvider, + Shop__Common__UserSignInMethod: UserSignInMethod, + Shop__Common__UserSignInAccount: UserSignInAccount, + Shop__Feature__CartStatus: CartStatus, + Shop__Feature__ProductList: ProductList, + Shop__Feature__ProductImageCardList: ProductImageCardList, + Shop__Feature__OrderList: OrderList, + Shop__Feature__UserInfo: UserInfo, + Shop__Feature__PatronList: PatronList, }; export const PyConKRMDXComponents = { diff --git a/apps/pyconkr-admin/src/main.tsx b/apps/pyconkr-admin/src/main.tsx index a2857dc..58951ce 100644 --- a/apps/pyconkr-admin/src/main.tsx +++ b/apps/pyconkr-admin/src/main.tsx @@ -1,6 +1,8 @@ -import { Components, Utils } from "@frontend/common"; -import type { ContextOptions } from "@frontend/common/src/contexts"; -import * as Shop from "@frontend/shop"; +import { CenteredPage, CommonContextProvider } from "@frontend/common/components"; +import type { ContextOptions } from "@frontend/common/contexts"; +import { registerChunkLoadErrorReloadHandler } from "@frontend/common/utils"; +import { ShopContextProvider } from "@frontend/shop/components/common"; +import { ContextOptions as ShopContextOptions } from "@frontend/shop/contexts"; import { CircularProgress } from "@mui/material"; import { ErrorBoundary, Suspense } from "@suspensive/react"; import { matchQuery, MutationCache, QueryClient, QueryClientProvider } from "@tanstack/react-query"; @@ -49,7 +51,7 @@ const CommonOptions: ContextOptions = { mdxComponents: PyConKRMDXComponents, }; -const ShopOptions: Shop.Contexts.ContextOptions = { +const ShopOptions: ShopContextOptions = { language: "ko", shopApiDomain: import.meta.env.VITE_PYCONKR_SHOP_API_DOMAIN, shopApiCSRFCookieName: import.meta.env.VITE_PYCONKR_SHOP_CSRF_COOKIE_NAME, @@ -57,22 +59,22 @@ const ShopOptions: Shop.Contexts.ContextOptions = { shopImpAccountId: import.meta.env.VITE_PYCONKR_SHOP_IMP_ACCOUNT_ID, }; -Utils.registerChunkLoadErrorReloadHandler(); +registerChunkLoadErrorReloadHandler(); ReactDom.createRoot(document.getElementById("root")!).render( - 문제가 발생했습니다, 새로고침을 해주세요.}> + 문제가 발생했습니다, 새로고침을 해주세요.}> + - + } > - - + + @@ -86,8 +88,8 @@ ReactDom.createRoot(document.getElementById("root")!).render( - - + + diff --git a/apps/pyconkr-admin/vite.config.ts b/apps/pyconkr-admin/vite.config.ts index 6b7e2dc..ca277d0 100644 --- a/apps/pyconkr-admin/vite.config.ts +++ b/apps/pyconkr-admin/vite.config.ts @@ -20,9 +20,8 @@ export default defineConfig(({ mode }) => { plugins: [react(), mdx(), ...(isLocalHttpBackend ? [] : [mkcert({ hosts: [host] })]), svgr()], resolve: { alias: { - "@frontend/common/src": path.resolve(__dirname, "../../packages/common/src"), - "@frontend/common": path.resolve(__dirname, "../../packages/common/src/index.ts"), - "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src/index.ts"), + "@frontend/common": path.resolve(__dirname, "../../packages/common/src"), + "@frontend/shop": path.resolve(__dirname, "../../packages/shop/src"), "@apps/pyconkr-admin": path.resolve(__dirname, "./src"), }, }, diff --git a/apps/pyconkr-participant-portal/src/components/dialogs/change_password.tsx b/apps/pyconkr-participant-portal/src/components/dialogs/change_password.tsx index 52444ca..85e34fa 100644 --- a/apps/pyconkr-participant-portal/src/components/dialogs/change_password.tsx +++ b/apps/pyconkr-participant-portal/src/components/dialogs/change_password.tsx @@ -1,6 +1,6 @@ -import { useChangePasswordMutation, useParticipantPortalClient } from "@frontend/common/src/hooks/useParticipantPortalAPI"; -import { getFormValue, isFormValid } from "@frontend/common/src/utils"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { useChangePasswordMutation, useParticipantPortalClient } from "@frontend/common/hooks/useParticipantPortalAPI"; +import { getFormValue, isFormValid } from "@frontend/common/utils"; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField } from "@mui/material"; import { enqueueSnackbar, OptionsObject } from "notistack"; import * as React from "react"; diff --git a/apps/pyconkr-participant-portal/src/components/dialogs/modification_audit_cancel_confirm.tsx b/apps/pyconkr-participant-portal/src/components/dialogs/modification_audit_cancel_confirm.tsx index 2e8ae85..49b348e 100644 --- a/apps/pyconkr-participant-portal/src/components/dialogs/modification_audit_cancel_confirm.tsx +++ b/apps/pyconkr-participant-portal/src/components/dialogs/modification_audit_cancel_confirm.tsx @@ -1,5 +1,5 @@ -import { useCancelModificationAuditMutation, useParticipantPortalClient } from "@frontend/common/src/hooks/useParticipantPortalAPI"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { useCancelModificationAuditMutation, useParticipantPortalClient } from "@frontend/common/hooks/useParticipantPortalAPI"; import { Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from "@mui/material"; import { enqueueSnackbar, OptionsObject } from "notistack"; import * as React from "react"; diff --git a/apps/pyconkr-participant-portal/src/components/dialogs/public_file_upload.tsx b/apps/pyconkr-participant-portal/src/components/dialogs/public_file_upload.tsx index 9794dc8..10bd15f 100644 --- a/apps/pyconkr-participant-portal/src/components/dialogs/public_file_upload.tsx +++ b/apps/pyconkr-participant-portal/src/components/dialogs/public_file_upload.tsx @@ -1,6 +1,6 @@ -import { Components } from "@frontend/common"; -import { useParticipantPortalClient, useUploadPublicFileMutation } from "@frontend/common/src/hooks/useParticipantPortalAPI"; -import { BackendAPIClientError } from "@frontend/common/src/apis"; +import { BackendAPIClientError } from "@frontend/common/apis"; +import { DndFileInput } from "@frontend/common/components"; +import { useParticipantPortalClient, useUploadPublicFileMutation } from "@frontend/common/hooks/useParticipantPortalAPI"; import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from "@mui/material"; import { enqueueSnackbar, OptionsObject } from "notistack"; import * as React from "react"; @@ -108,7 +108,7 @@ export const PublicFileUploadDialog: React.FC = ({ - +