Skip to content

Commit 9692997

Browse files
committed
refactor: namespace 단위 import 제거
1 parent 363627a commit 9692997

161 files changed

Lines changed: 1896 additions & 1492 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/pyconkr-2025/src/App.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { useBackendClient, useFlattenSiteMapQuery, useSponsorQuery } from "@frontend/common/hooks/useAPI";
2-
import * as BackendAPISchemas from "@frontend/common/schemas/backendAPI";
2+
import { NestedSiteMapSchema } from "@frontend/common/schemas/backendAPI";
33
import { buildNestedSiteMap } from "@frontend/common/utils";
4-
import * as React from "react";
4+
import { FC, useEffect } from "react";
55
import { Route, Routes, useLocation } from "react-router-dom";
6-
import * as R from "remeda";
6+
import { isEmpty, isNullish } from "remeda";
77

88
import MainLayout from "./components/layout/index.tsx";
99
import { PageIdParamRenderer, RouteRenderer } from "./components/pages/dynamic_route.tsx";
@@ -14,7 +14,7 @@ import { Test } from "./components/pages/test.tsx";
1414
import { IS_DEBUG_ENV } from "./consts";
1515
import { useAppContext } from "./contexts/app_context";
1616

17-
export const App: React.FC = () => {
17+
export const App: FC = () => {
1818
const backendAPIClient = useBackendClient();
1919
const { data: sponsorTiers } = useSponsorQuery(backendAPIClient);
2020
const { data: flatSiteMap } = useFlattenSiteMapQuery(backendAPIClient);
@@ -23,17 +23,17 @@ export const App: React.FC = () => {
2323
const location = useLocation();
2424
const { setAppContext, language } = useAppContext();
2525

26-
React.useEffect(() => {
26+
useEffect(() => {
2727
(async () => {
28-
const currentRouteCodes = ["", ...location.pathname.split("/").filter((code) => !R.isEmpty(code))];
29-
const currentSiteMapDepth: (BackendAPISchemas.NestedSiteMapSchema | undefined)[] = [siteMapNode];
28+
const currentRouteCodes = ["", ...location.pathname.split("/").filter((code) => !isEmpty(code))];
29+
const currentSiteMapDepth: (NestedSiteMapSchema | undefined)[] = [siteMapNode];
3030

3131
for (const routeCode of currentRouteCodes.splice(1)) {
3232
const childrenMap = currentSiteMapDepth
3333
.at(-1)
34-
?.children?.reduce((acc, child) => ({ ...acc, [child.route_code]: child }), {} as Record<string, BackendAPISchemas.NestedSiteMapSchema>);
34+
?.children?.reduce((acc, child) => ({ ...acc, [child.route_code]: child }), {} as Record<string, NestedSiteMapSchema>);
3535
currentSiteMapDepth.push(childrenMap?.[routeCode]);
36-
if (R.isNullish(currentSiteMapDepth.at(-1))) {
36+
if (isNullish(currentSiteMapDepth.at(-1))) {
3737
console.warn(`Route not found in site map: ${routeCode}`);
3838
break;
3939
}

apps/pyconkr-2025/src/components/layout/BreadCrumb/index.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
import { NestedSiteMapSchema } from "@frontend/common/schemas/backendAPI";
22
import { Stack, styled } from "@mui/material";
3-
import * as React from "react";
3+
import { FC } from "react";
44
import { Link } from "react-router-dom";
5-
import * as R from "remeda";
6-
5+
import { isNonNullish } from "remeda";
76
type BreadCrumbPropType = {
87
title: string;
98
parentSiteMaps: (NestedSiteMapSchema | undefined)[];
109
};
1110

12-
export const BreadCrumb: React.FC<BreadCrumbPropType> = ({ title, parentSiteMaps }) => {
11+
export const BreadCrumb: FC<BreadCrumbPropType> = ({ title, parentSiteMaps }) => {
1312
let route = "/";
1413
return (
1514
<BreadCrumbContainer>
1615
<BreadcrumbPathContainer direction="row" alignItems="center">
1716
{parentSiteMaps
1817
.slice(1, -1)
19-
.filter((routeInfo) => R.isNonNullish(routeInfo))
18+
.filter((routeInfo) => isNonNullish(routeInfo))
2019
.map(({ route_code, name }, index) => {
2120
route += `${route_code}/`;
2221
return (

apps/pyconkr-2025/src/components/layout/CartBadgeButton/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useCart, useShopClient } from "@frontend/shop/hooks";
22
import { ShoppingCart } from "@mui/icons-material";
33
import { Badge, badgeClasses, IconButton, styled } from "@mui/material";
44
import { ErrorBoundary, Suspense } from "@suspensive/react";
5-
import * as React from "react";
5+
import { FC } from "react";
66
import { useNavigate } from "react-router-dom";
77

88
type InnerCartBadgeButtonPropType = {
@@ -19,7 +19,7 @@ const ColoredIconButton = styled(IconButton)(({ theme }) => ({
1919

2020
const InnerCartBadge = styled(Badge)({ [`& .${badgeClasses.badge}`]: { top: "-12px", right: "-3px" } });
2121

22-
const InnerCartBadgeButton: React.FC<InnerCartBadgeButtonPropType> = ({ loading, count }) => {
22+
const InnerCartBadgeButton: FC<InnerCartBadgeButtonPropType> = ({ loading, count }) => {
2323
const navigate = useNavigate();
2424

2525
return (
@@ -30,7 +30,7 @@ const InnerCartBadgeButton: React.FC<InnerCartBadgeButtonPropType> = ({ loading,
3030
);
3131
};
3232

33-
export const CartBadgeButton: React.FC = Suspense.with(
33+
export const CartBadgeButton: FC = Suspense.with(
3434
{ fallback: <InnerCartBadgeButton loading /> },
3535
ErrorBoundary.with({ fallback: <InnerCartBadgeButton /> }, () => {
3636
const shopAPIClient = useShopClient();

apps/pyconkr-2025/src/components/layout/Footer/Mobile/MobileFooter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import styled from "@emotion/styled";
22
import { useEmail } from "@frontend/common/hooks/useEmail";
33
import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, X, YouTube } from "@mui/icons-material";
4-
import * as React from "react";
4+
import { FC } from "react";
55

66
import FlickrIcon from "@apps/pyconkr-2025/assets/thirdparty/flickr.svg?react";
77
import { useAppContext } from "@apps/pyconkr-2025/contexts/app_context";
88

99
interface IconItem {
10-
icon: React.FC<{ width?: number; height?: number }>;
10+
icon: FC<{ width?: number; height?: number }>;
1111
alt: string;
1212
href: string;
1313
}

apps/pyconkr-2025/src/components/layout/Footer/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import styled from "@emotion/styled";
22
import { useEmail } from "@frontend/common/hooks/useEmail";
33
import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, OpenInNew, X, YouTube } from "@mui/icons-material";
44
import { Button, useMediaQuery, useTheme } from "@mui/material";
5-
import * as React from "react";
5+
import { FC, Fragment } from "react";
66

77
import FlickrIcon from "@apps/pyconkr-2025/assets/thirdparty/flickr.svg?react";
88
import { useAppContext } from "@apps/pyconkr-2025/contexts/app_context";
99

1010
import MobileFooter from "./Mobile/MobileFooter";
1111

1212
interface IconItem {
13-
icon: React.FC<{ width?: number; height?: number }>;
13+
icon: FC<{ width?: number; height?: number }>;
1414
alt: string;
1515
href: string;
1616
}
@@ -46,7 +46,7 @@ const defaultIcons: IconItem[] = [
4646
},
4747
];
4848

49-
const Bar: React.FC = () => <div style={{ display: "inline-block", padding: "0 0.25rem" }}>|</div>;
49+
const Bar: FC = () => <div style={{ display: "inline-block", padding: "0 0.25rem" }}>|</div>;
5050

5151
export default function Footer() {
5252
const { sendEmail } = useEmail();
@@ -118,12 +118,12 @@ export default function Footer() {
118118
</FooterText>
119119
<FooterLinks>
120120
{links.map((link, index) => (
121-
<React.Fragment key={index}>
121+
<Fragment key={index}>
122122
<Link key={link.text} href={link.href}>
123123
{link.text}
124124
</Link>
125125
{index < links.length - 1 && <Separator>|</Separator>}
126-
</React.Fragment>
126+
</Fragment>
127127
))}
128128
</FooterLinks>
129129
<FooterIcons>

apps/pyconkr-2025/src/components/layout/Header/Mobile/HamburgerButton.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { IconButton, styled } from "@mui/material";
2-
import * as React from "react";
3-
2+
import { FC } from "react";
43
interface HamburgerButtonProps {
54
isOpen: boolean;
65
onClick: () => void;
76
isMainPath?: boolean;
87
}
98

10-
export const HamburgerButton: React.FC<HamburgerButtonProps> = ({ isOpen, onClick, isMainPath = true }) => {
9+
export const HamburgerButton: FC<HamburgerButtonProps> = ({ isOpen, onClick, isMainPath = true }) => {
1110
return (
1211
<StyledIconButton onClick={onClick} isMainPath={isMainPath}>
1312
<HamburgerIcon isOpen={isOpen} isMainPath={isMainPath}>

apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileHeader.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PythonKorea } from "@frontend/common/components";
22
import { Box, Stack, styled, Typography } from "@mui/material";
3-
import * as React from "react";
3+
import { FC, useState } from "react";
44
import { Link, useLocation } from "react-router-dom";
55

66
import { useAppContext } from "@apps/pyconkr-2025/contexts/app_context";
@@ -14,10 +14,10 @@ interface MobileHeaderProps {
1414
onToggleNavigation?: () => void;
1515
}
1616

17-
export const MobileHeader: React.FC<MobileHeaderProps> = ({ isNavigationOpen = false, onToggleNavigation }) => {
17+
export const MobileHeader: FC<MobileHeaderProps> = ({ isNavigationOpen = false, onToggleNavigation }) => {
1818
const { siteMapNode } = useAppContext();
1919
const location = useLocation();
20-
const [internalNavigationOpen, setInternalNavigationOpen] = React.useState(false);
20+
const [internalNavigationOpen, setInternalNavigationOpen] = useState(false);
2121

2222
const navigationOpen = onToggleNavigation ? isNavigationOpen : internalNavigationOpen;
2323
const toggleNavigation = onToggleNavigation || (() => setInternalNavigationOpen(!internalNavigationOpen));

apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileLanguageToggle.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ButtonBase, styled } from "@mui/material";
2-
import * as React from "react";
2+
import { FC } from "react";
33

44
import { LOCAL_STORAGE_LANGUAGE_KEY } from "@apps/pyconkr-2025/consts/local_stroage";
55
import { useAppContext } from "@apps/pyconkr-2025/contexts/app_context";
@@ -8,7 +8,7 @@ interface MobileLanguageToggleProps {
88
isMainPath?: boolean;
99
}
1010

11-
export const MobileLanguageToggle: React.FC<MobileLanguageToggleProps> = ({ isMainPath = true }) => {
11+
export const MobileLanguageToggle: FC<MobileLanguageToggleProps> = ({ isMainPath = true }) => {
1212
const { language, setAppContext } = useAppContext();
1313

1414
const toggleLanguage = () => {

apps/pyconkr-2025/src/components/layout/Header/Mobile/MobileNavigation.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import { PythonKorea } from "@frontend/common/components";
2-
import * as BackendAPISchemas from "@frontend/common/schemas/backendAPI";
2+
import { NestedSiteMapSchema } from "@frontend/common/schemas/backendAPI";
33
import { ArrowBack, ArrowForward } from "@mui/icons-material";
44
import { Box, Button, Chip, Drawer, IconButton, Stack, styled, Typography } from "@mui/material";
5-
import * as React from "react";
5+
import { FC, useState } from "react";
66
import { Link, useLocation } from "react-router-dom";
7-
import * as R from "remeda";
7+
import { isEmpty } from "remeda";
88

99
import { SignInButton } from "@apps/pyconkr-2025/components/layout/SignInButton";
1010

1111
import { HamburgerButton } from "./HamburgerButton";
1212
import { MobileLanguageToggle } from "./MobileLanguageToggle";
1313
// import { ScanCodeButton } from "@apps/pyconkr-2025/components/layout/UserScanCodeButton";
1414

15-
type MenuType = BackendAPISchemas.NestedSiteMapSchema;
15+
type MenuType = NestedSiteMapSchema;
1616

1717
interface MobileNavigationProps {
1818
isOpen: boolean;
@@ -29,9 +29,9 @@ interface NavigationState {
2929
breadcrumbs: { name: string; level: NavigationLevel }[];
3030
}
3131

32-
export const MobileNavigation: React.FC<MobileNavigationProps> = ({ isOpen, onClose, siteMapNode }) => {
32+
export const MobileNavigation: FC<MobileNavigationProps> = ({ isOpen, onClose, siteMapNode }) => {
3333
const location = useLocation();
34-
const [navState, setNavState] = React.useState<NavigationState>({
34+
const [navState, setNavState] = useState<NavigationState>({
3535
level: "depth1",
3636
breadcrumbs: [],
3737
});
@@ -89,7 +89,7 @@ export const MobileNavigation: React.FC<MobileNavigationProps> = ({ isOpen, onCl
8989
.filter((s) => !s.hide)
9090
.map((menu) => (
9191
<MenuItem isMainPath={isMainPath} key={menu.id}>
92-
{!R.isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) ? (
92+
{!isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) ? (
9393
<MenuButton isMainPath={isMainPath} onClick={() => navigateToDepth2(menu)}>
9494
{menu.name}
9595
</MenuButton>
@@ -98,7 +98,7 @@ export const MobileNavigation: React.FC<MobileNavigationProps> = ({ isOpen, onCl
9898
{menu.name}
9999
</MenuLink>
100100
)}
101-
{!R.isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) && (
101+
{!isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) && (
102102
<MenuArrowButton isMainPath={isMainPath} onClick={() => navigateToDepth2(menu)}>
103103
<ArrowForward fontSize="small" />
104104
</MenuArrowButton>
@@ -131,7 +131,7 @@ export const MobileNavigation: React.FC<MobileNavigationProps> = ({ isOpen, onCl
131131
<Link to={`${navState.depth1!.route_code}/${menu.route_code}`} onClick={handleClose} style={{ textDecoration: "none" }}>
132132
<MenuChip isMainPath={isMainPath} label={menu.name} clickable />
133133
</Link>
134-
{!R.isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) && (
134+
{!isEmpty(menu.children) && Object.values(menu.children).some((child) => !child.hide) && (
135135
<MenuArrowButton isMainPath={isMainPath} onClick={() => navigateToDepth3(menu)}>
136136
<ArrowForward fontSize="small" />
137137
</MenuArrowButton>

apps/pyconkr-2025/src/components/layout/Header/index.tsx

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { NestedSiteMapSchema } from "@frontend/common/schemas/backendAPI";
33
import { ArrowForwardIos } from "@mui/icons-material";
44
import { Box, Button, CircularProgress, Divider, Stack, styled, SxProps, Theme, Typography, useMediaQuery, useTheme } from "@mui/material";
55
import { MUIStyledCommonProps } from "@mui/system";
6-
import * as React from "react";
6+
import { CSSProperties, FC, Fragment, useEffect, useState } from "react";
77
import { Link } from "react-router-dom";
8-
import * as R from "remeda";
8+
import { isEmpty, isNonNullish, isString } from "remeda";
99

1010
import { CartBadgeButton } from "@apps/pyconkr-2025/components/layout/CartBadgeButton";
1111
import LanguageSelector from "@apps/pyconkr-2025/components/layout/LanguageSelector";
@@ -24,14 +24,14 @@ type NavigationStateType = {
2424
depth3?: MenuType;
2525
};
2626

27-
const HeaderHeight: React.CSSProperties["height"] = "3.625rem";
28-
const BreadCrumbHeight: React.CSSProperties["height"] = "4.5rem";
27+
const HeaderHeight: CSSProperties["height"] = "3.625rem";
28+
const BreadCrumbHeight: CSSProperties["height"] = "4.5rem";
2929

30-
const Header: React.FC = () => {
30+
const Header: FC = () => {
3131
const { title, language, siteMapNode, currentSiteMapDepth, shouldShowTitleBanner } = useAppContext();
3232
const theme = useTheme();
3333
const isMobile = useMediaQuery(theme.breakpoints.down("md"));
34-
const [navState, setNavState] = React.useState<NavigationStateType>({});
34+
const [navState, setNavState] = useState<NavigationStateType>({});
3535

3636
const resetDepths = () => setNavState({});
3737
const setDepth1 = (depth1: MenuOrUndefinedType) => setNavState({ depth1 });
@@ -41,15 +41,15 @@ const Header: React.FC = () => {
4141
const getDepth2Route = (nextRoute?: string) => (navState.depth1?.route_code || "") + `/${nextRoute || ""}`;
4242
const getDepth3Route = (nextRoute?: string) => getDepth2Route(navState.depth2?.route_code) + `/${nextRoute || ""}`;
4343

44-
React.useEffect(resetDepths, [language]);
44+
useEffect(resetDepths, [language]);
4545

4646
if (isMobile) {
4747
return <MobileHeader />;
4848
}
4949

5050
let breadCrumbRoute = "";
5151
let breadCrumbArray = currentSiteMapDepth.slice(1, -1);
52-
if (R.isEmpty(breadCrumbArray)) breadCrumbArray = currentSiteMapDepth.slice(0, -1);
52+
if (isEmpty(breadCrumbArray)) breadCrumbArray = currentSiteMapDepth.slice(0, -1);
5353

5454
const headerContainerStyle: SxProps<Theme> = shouldShowTitleBanner
5555
? {}
@@ -77,8 +77,8 @@ const Header: React.FC = () => {
7777
<Link
7878
key={r.id}
7979
onClick={resetDepths}
80-
target={R.isString(r.external_link) ? "_blank" : undefined}
81-
rel={R.isString(r.external_link) ? "noopener noreferrer" : undefined}
80+
target={isString(r.external_link) ? "_blank" : undefined}
81+
rel={isString(r.external_link) ? "noopener noreferrer" : undefined}
8282
to={r.external_link || r.route_code}
8383
>
8484
<Button key={r.id} onMouseEnter={() => setDepth1(r)} sx={{ minWidth: 0, textTransform: "none" }}>
@@ -107,17 +107,17 @@ const Header: React.FC = () => {
107107
onClick={resetDepths}
108108
onMouseEnter={() => setDepth2(r)}
109109
// 하위 depth가 있는 경우, 하위 depth를 선택할 수 있도록 유지하기 위해 depth2도 유지합니다.
110-
onMouseLeave={() => R.isEmpty(navState.depth2?.children ?? {}) && setDepth2(undefined)}
111-
target={R.isString(r.external_link) ? "_blank" : undefined}
112-
rel={R.isString(r.external_link) ? "noopener noreferrer" : undefined}
110+
onMouseLeave={() => isEmpty(navState.depth2?.children ?? {}) && setDepth2(undefined)}
111+
target={isString(r.external_link) ? "_blank" : undefined}
112+
rel={isString(r.external_link) ? "noopener noreferrer" : undefined}
113113
to={r.external_link || getDepth2Route(r.route_code)}
114114
/>
115115
))}
116116
</Stack>
117117

118-
{navState.depth2 && !R.isEmpty(navState.depth2.children) && (
118+
{navState.depth2 && !isEmpty(navState.depth2.children) && (
119119
<>
120-
{!R.isEmpty(navState.depth2.children) && <Depth2to3Divider orientation="vertical" flexItem />}
120+
{!isEmpty(navState.depth2.children) && <Depth2to3Divider orientation="vertical" flexItem />}
121121

122122
<Stack spacing={1.5}>
123123
{Object.values(navState.depth2.children)
@@ -130,8 +130,8 @@ const Header: React.FC = () => {
130130
onClick={resetDepths}
131131
onMouseEnter={() => setDepth3(r)}
132132
onMouseLeave={() => setDepth3(undefined)}
133-
target={R.isString(r.external_link) ? "_blank" : undefined}
134-
rel={R.isString(r.external_link) ? "noopener noreferrer" : undefined}
133+
target={isString(r.external_link) ? "_blank" : undefined}
134+
rel={isString(r.external_link) ? "noopener noreferrer" : undefined}
135135
to={r.external_link || getDepth3Route(r?.route_code)}
136136
/>
137137
))}
@@ -160,14 +160,14 @@ const Header: React.FC = () => {
160160
<BreadCrumbContainer>
161161
<Stack direction="row" alignItems="center" spacing={0.5}>
162162
{breadCrumbArray
163-
.filter((routeInfo) => R.isNonNullish(routeInfo))
163+
.filter((routeInfo) => isNonNullish(routeInfo))
164164
.map(({ route_code, name }, index) => {
165165
breadCrumbRoute += `${route_code}/`;
166166
return (
167-
<React.Fragment key={index}>
167+
<Fragment key={index}>
168168
{index > 0 && <ArrowForwardIos sx={{ fontSize: "0.75rem" }} />}
169169
<Link to={breadCrumbRoute} children={name} />
170-
</React.Fragment>
170+
</Fragment>
171171
);
172172
})}
173173
</Stack>

0 commit comments

Comments
 (0)