Skip to content

Commit 69864cf

Browse files
update(other): 🧩 update
update structure and logic for this project
1 parent 42a4975 commit 69864cf

21 files changed

+217
-193
lines changed

config/.eslintrc-auto-import.json

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
{
22
"globals": {
33
"BrowserRouter": true,
4+
"ComponentType": true,
5+
"Dispatch": true,
6+
"HTMLAttributes": true,
7+
"HTMLProps": true,
48
"Link": true,
59
"NavLink": true,
610
"Navigate": true,
711
"Outlet": true,
812
"React": true,
13+
"ReactNode": true,
914
"Route": true,
1015
"RouterProvider": true,
1116
"Routes": true,
17+
"SetStateAction": true,
1218
"StrictMode": true,
1319
"Suspense": true,
1420
"componentDidCatch": true,
@@ -17,12 +23,25 @@
1723
"createGlobalStyle": true,
1824
"createRef": true,
1925
"createRoot": true,
26+
"decode": true,
27+
"deleteCookie": true,
28+
"encode": true,
2029
"forwardRef": true,
2130
"generatePath": true,
31+
"generateSentenceCase": true,
32+
"generateTitleCase": true,
33+
"getCookie": true,
34+
"getCustomSlug": true,
35+
"getLocale": true,
36+
"getSlug": true,
37+
"getSlugWithoutDash": true,
38+
"getUnsignedLetters": true,
39+
"hashCode": true,
2240
"keyframes": true,
2341
"lazy": true,
2442
"memo": true,
2543
"rgba": true,
44+
"setCookie": true,
2645
"startTransition": true,
2746
"styled": true,
2847
"useCallback": true,
@@ -51,61 +70,13 @@
5170
"useRoute": true,
5271
"useRoutes": true,
5372
"useSearchParams": true,
54-
"useState": true,
55-
"useSyncExternalStore": true,
56-
"useTransition": true,
57-
"BotInfo": true,
58-
"DeviceInfo": true,
59-
"generateSentenceCase": true,
60-
"generateTitleCase": true,
61-
"getCookie": true,
62-
"getCustomSlug": true,
63-
"getSlug": true,
64-
"getSlugWithoutDash": true,
65-
"getUnsignedLetters": true,
66-
"setCookie": true,
67-
"setLinkAlternateTag": true,
68-
"setLinkAmphtmlTag": true,
69-
"setLinkAuthorTag": true,
70-
"setLinkCanonicalTag": true,
71-
"setLinkNextTag": true,
72-
"setLinkPrevTag": true,
73-
"setLinkTwitterTitleTag": true,
74-
"setMetaAuthorTag": true,
75-
"setMetaDescriptionTag": true,
76-
"setMetaGeoPositionTag": true,
77-
"setMetaGeoRegionTag": true,
78-
"setMetaGoogleBotTag": true,
79-
"setMetaGoogleSiteVerificationTag": true,
80-
"setMetaICBMTag": true,
81-
"setMetaKeywordsTag": true,
82-
"setMetaOgDescriptionTag": true,
83-
"setMetaOgImageTag": true,
84-
"setMetaOgSiteNameTag": true,
85-
"setMetaOgTitleTag": true,
86-
"setMetaOgTypeTag": true,
87-
"setMetaOgUrlTag": true,
88-
"setMetaRobotsTag": true,
89-
"setMetaTwitterCardTag": true,
90-
"setMetaTwitterDescriptionTag": true,
91-
"setMetaTwitterImageTag": true,
92-
"setMetaViewportTag": true,
93-
"setSeoTag": true,
94-
"setTitleTag": true,
9573
"useSentenceCase": true,
9674
"useSlug": true,
9775
"useSlugWithoutDash": true,
76+
"useState": true,
77+
"useSyncExternalStore": true,
9878
"useTitleCase": true,
99-
"useUnsignedLetters": true,
100-
"LocaleInfo": true,
101-
"getLocale": true,
102-
"useLocaleInfo": true,
103-
"EnvironmentInfo": true,
104-
"deleteCookie": true,
105-
"ProxyAPI": true,
106-
"decode": true,
107-
"encode": true,
108-
"getAPIStore": true,
109-
"hashCode": true
79+
"useTransition": true,
80+
"useUnsignedLetters": true
11081
}
11182
}

config/auto-imports.d.ts

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@
55
// Generated by unplugin-auto-import
66
export {}
77
declare global {
8-
const BotInfo: typeof import('store/ServerStore.ts')['BotInfo']
98
const BrowserRouter: typeof import('react-router-dom')['BrowserRouter']
10-
const DeviceInfo: typeof import('store/ServerStore.ts')['DeviceInfo']
11-
const EnvironmentInfo: typeof import('store/ServerStore.ts')['EnvironmentInfo']
129
const Link: typeof import('react-router-dom')['Link']
13-
const LocaleInfo: typeof import('store/ServerStore.ts')['LocaleInfo']
1410
const NavLink: typeof import('react-router-dom')['NavLink']
1511
const Navigate: typeof import('react-router-dom')['Navigate']
1612
const Outlet: typeof import('react-router-dom')['Outlet']
17-
const ProxyAPI: typeof import('utils/ProxyAPIHelper/index.ts')['ProxyAPI']
1813
const React: typeof import('react')
1914
const Route: typeof import('react-router-dom')['Route']
2015
const RouterProvider: typeof import('react-router-dom')['RouterProvider']
@@ -34,7 +29,6 @@ declare global {
3429
const generatePath: typeof import('react-router-dom')['generatePath']
3530
const generateSentenceCase: typeof import('utils/StringHelper.ts')['generateSentenceCase']
3631
const generateTitleCase: typeof import('utils/StringHelper.ts')['generateTitleCase']
37-
const getAPIStore: typeof import('store/APIStore.ts')['getAPIStore']
3832
const getCookie: typeof import('utils/CookieHelper.ts')['getCookie']
3933
const getCustomSlug: typeof import('utils/StringHelper.ts')['getCustomSlug']
4034
const getLocale: typeof import('utils/StringHelper.ts')['getLocale']
@@ -47,34 +41,6 @@ declare global {
4741
const memo: typeof import('react')['memo']
4842
const rgba: typeof import('polished')['rgba']
4943
const setCookie: typeof import('utils/CookieHelper.ts')['setCookie']
50-
const setLinkAlternateTag: typeof import('utils/SeoHelper/index.ts')['setLinkAlternateTag']
51-
const setLinkAmphtmlTag: typeof import('utils/SeoHelper/index.ts')['setLinkAmphtmlTag']
52-
const setLinkAuthorTag: typeof import('utils/SeoHelper/index.ts')['setLinkAuthorTag']
53-
const setLinkCanonicalTag: typeof import('utils/SeoHelper/index.ts')['setLinkCanonicalTag']
54-
const setLinkNextTag: typeof import('utils/SeoHelper/index.ts')['setLinkNextTag']
55-
const setLinkPrevTag: typeof import('utils/SeoHelper/index.ts')['setLinkPrevTag']
56-
const setLinkTwitterTitleTag: typeof import('utils/SeoHelper/index.ts')['setLinkTwitterTitleTag']
57-
const setMetaAuthorTag: typeof import('utils/SeoHelper/index.ts')['setMetaAuthorTag']
58-
const setMetaDescriptionTag: typeof import('utils/SeoHelper/index.ts')['setMetaDescriptionTag']
59-
const setMetaGeoPositionTag: typeof import('utils/SeoHelper/index.ts')['setMetaGeoPositionTag']
60-
const setMetaGeoRegionTag: typeof import('utils/SeoHelper/index.ts')['setMetaGeoRegionTag']
61-
const setMetaGoogleBotTag: typeof import('utils/SeoHelper/index.ts')['setMetaGoogleBotTag']
62-
const setMetaGoogleSiteVerificationTag: typeof import('utils/SeoHelper/index.ts')['setMetaGoogleSiteVerificationTag']
63-
const setMetaICBMTag: typeof import('utils/SeoHelper/index.ts')['setMetaICBMTag']
64-
const setMetaKeywordsTag: typeof import('utils/SeoHelper/index.ts')['setMetaKeywordsTag']
65-
const setMetaOgDescriptionTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgDescriptionTag']
66-
const setMetaOgImageTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgImageTag']
67-
const setMetaOgSiteNameTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgSiteNameTag']
68-
const setMetaOgTitleTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgTitleTag']
69-
const setMetaOgTypeTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgTypeTag']
70-
const setMetaOgUrlTag: typeof import('utils/SeoHelper/index.ts')['setMetaOgUrlTag']
71-
const setMetaRobotsTag: typeof import('utils/SeoHelper/index.ts')['setMetaRobotsTag']
72-
const setMetaTwitterCardTag: typeof import('utils/SeoHelper/index.ts')['setMetaTwitterCardTag']
73-
const setMetaTwitterDescriptionTag: typeof import('utils/SeoHelper/index.ts')['setMetaTwitterDescriptionTag']
74-
const setMetaTwitterImageTag: typeof import('utils/SeoHelper/index.ts')['setMetaTwitterImageTag']
75-
const setMetaViewportTag: typeof import('utils/SeoHelper/index.ts')['setMetaViewportTag']
76-
const setSeoTag: typeof import('utils/SeoHelper/index.ts')['setSeoTag']
77-
const setTitleTag: typeof import('utils/SeoHelper/index.ts')['setTitleTag']
7844
const startTransition: typeof import('react')['startTransition']
7945
const styled: typeof import('styled-components')['default']
8046
const useCallback: typeof import('react')['useCallback']
@@ -89,7 +55,6 @@ declare global {
8955
const useInsertionEffect: typeof import('react')['useInsertionEffect']
9056
const useLayoutEffect: typeof import('react')['useLayoutEffect']
9157
const useLinkClickHandler: typeof import('react-router-dom')['useLinkClickHandler']
92-
const useLocaleInfo: typeof import('app/router/context/LocaleInfoContext')['useLocaleInfo']
9358
const useLocation: typeof import('react-router-dom')['useLocation']
9459
const useMatches: typeof import('react-router-dom')['useMatches']
9560
const useMemo: typeof import('react')['useMemo']
@@ -113,3 +78,9 @@ declare global {
11378
const useTransition: typeof import('react')['useTransition']
11479
const useUnsignedLetters: typeof import('hooks/useStringHelper.ts')['useUnsignedLetters']
11580
}
81+
// for type re-export
82+
declare global {
83+
// @ts-ignore
84+
export type { Dispatch, SetStateAction, HTMLProps, HTMLAttributes, ComponentType, ReactNode } from 'react'
85+
import('react')
86+
}

src/Layout.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import ErrorBoundary from 'utils/ErrorBoundary'
22
import LoadingBoundary from 'utils/LoadingBoundary'
33
import LoadingPageComponent from 'components/LoadingPageComponent'
44
import ErrorLoadingPageComponent from 'components/ErrorPageComponent'
5-
import { useUserInfo } from 'store/UserInfoContext'
5+
import { useUserInfo } from 'app/store/UserInfoContext'
66

77
const MainContainer = styled.div`
88
max-width: 1280px;
@@ -24,7 +24,6 @@ function Layout() {
2424

2525
const onClickLogout = () => {
2626
setUserState({ email: '' })
27-
route.handle.reProtect?.()
2827
}
2928

3029
return (

src/app/router/context/LoadingInfoContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const INIT_LOADING_INFO: ILoadingInfo = {
1010

1111
export const LoadingInfoContext = createContext<{
1212
loadingState: ILoadingInfo
13-
setLoadingState: React.Dispatch<React.SetStateAction<ILoadingInfo>>
13+
setLoadingState: Dispatch<SetStateAction<ILoadingInfo>>
1414
}>({
1515
loadingState: INIT_LOADING_INFO,
1616
setLoadingState: () => null,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { IUserInfo, useUserInfo } from 'app/store/UserInfoContext'
2+
3+
export interface ICertCustomizationInfo {
4+
user: IUserInfo
5+
}
6+
7+
export default function useCertificateCustomizationInfo(): ICertCustomizationInfo {
8+
const { userState } = useUserInfo()
9+
10+
return {
11+
user: userState,
12+
}
13+
}

src/app/router/index.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import Layout from 'Layout'
22
import NotFoundPage from 'pages/NotFoundPage'
33
import { RouteObject } from 'react-router-dom'
4-
import { RouteObjectCustomize } from 'static'
54
import { withLazy } from './utils/LazyComponentHandler'
65
import RouterDeliver from './utils/RouterDeliver'
76
import RouterInit from './utils/RouterInit'
87
import RouterProtection from './utils/RouterProtection'
98
import RouterValidation from './utils/RouterValidation'
109
import { LoadingInfoProvider } from './context/LoadingInfoContext'
11-
12-
const WAITING_VERIFY_ROUTER_ID_LIST: { [key: string]: Array<string> } = {
13-
[import.meta.env.ROUTER_COMMENT_ID]: [import.meta.env.ROUTER_LOGIN_ID],
14-
}
10+
import { RouteObjectCustomize } from './types'
1511

1612
// NOTE - Router Configuration
1713
const routes: RouteObjectCustomize[] = [
@@ -22,9 +18,7 @@ const routes: RouteObjectCustomize[] = [
2218
<RouterInit>
2319
<RouterValidation NotFoundPage={NotFoundPage}>
2420
<RouterDeliver>
25-
<RouterProtection
26-
WatingVerifyRouterIDList={WAITING_VERIFY_ROUTER_ID_LIST}
27-
>
21+
<RouterProtection>
2822
<Layout />
2923
</RouterProtection>
3024
</RouterDeliver>

src/app/router/types.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { IndexRouteObject } from 'react-router-dom'
2+
import { ICertCustomizationInfo } from './hooks/useCertificateCustomizationInfo'
3+
import { ICertInfo } from './utils/RouterProtection'
4+
import { IRouteInfo } from './context/InfoContext'
5+
6+
export interface RouteObjectCustomize
7+
extends Omit<IndexRouteObject, 'index' | 'children'> {
8+
index?: boolean
9+
handle?: {
10+
params?: {
11+
validate?: (params: Record<string, string>) => boolean
12+
[key: string]: any
13+
}
14+
protect?: (
15+
certInfo: ICertInfo & ICertCustomizationInfo,
16+
route: IRouteInfo
17+
) => boolean | string
18+
reProtect?: (
19+
certInfo: ICertInfo & ICertCustomizationInfo,
20+
route: IRouteInfo
21+
) => boolean | string
22+
[key: string]: any
23+
}
24+
children?: RouteObjectCustomize[]
25+
}
26+
27+
export interface IRouterProtectionProps {
28+
waitingVerifyRouterIDList?: { [key: string]: Array<string> }
29+
children?: ReactNode
30+
}

src/app/router/utils/LazyComponentHandler.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export function withLazy(
22
f: () => Promise<{
3-
default: React.ComponentType<any>
3+
default: ComponentType<any>
44
}>
55
) {
66
try {
@@ -10,7 +10,7 @@ export function withLazy(
1010
} else {
1111
throw Object.assign(
1212
new Error(
13-
'The param of withLazy function must be a Function return a Promise or a Dynamic Import that give a React.ComponentType'
13+
'The param of withLazy function must be a Function return a Promise or a Dynamic Import that give a ComponentType'
1414
),
1515
{ code: 402 }
1616
)

src/app/router/utils/RouterProtection.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import type { IUserInfo } from 'store/UserInfoContext'
2-
import type { To } from 'react-router'
31
import type { INavigateInfo } from 'app/router/context/InfoContext'
4-
import type { IValidation } from 'app/router/context/ValidationContext'
5-
import { useUserInfo } from 'store/UserInfoContext'
62
import { useNavigateInfo } from 'app/router/context/InfoContext'
3+
import type { IValidation } from 'app/router/context/ValidationContext'
4+
import type { To } from 'react-router'
5+
import useCertificateCustomizationInfo, {
6+
type ICertCustomizationInfo,
7+
} from '../hooks/useCertificateCustomizationInfo'
8+
import { IRouterProtectionProps, RouteObjectCustomize } from '../types'
79

8-
export interface ICertInfo {
9-
user: IUserInfo
10+
export interface ICertInfo extends ICertCustomizationInfo {
1011
navigateInfo: INavigateInfo
1112
successPath: string
1213
}
@@ -24,12 +25,12 @@ function useProtectRoute(): IValidation {
2425
status: 200,
2526
}
2627

27-
const { userInfo } = useUserInfo()
28+
const certificateCustomizationInfo = useCertificateCustomizationInfo()
2829

2930
const navigateInfo = useNavigateInfo()
3031

3132
const certificateInfo: ICertInfo = {
32-
user: userInfo,
33+
...certificateCustomizationInfo,
3334
navigateInfo,
3435
successPath,
3536
}
@@ -38,14 +39,14 @@ function useProtectRoute(): IValidation {
3839
const protect = (
3940
item?.handle as
4041
| {
41-
protect: (certInfo?: ICertInfo) => string
42+
protect: RouteObjectCustomize['handle']['protect']
4243
}
4344
| undefined
4445
)?.protect
4546

4647
if (protect && typeof protect === 'function') {
4748
const checkProtection = (isReProtect = false) => {
48-
const protectInfo = protect(certificateInfo)
49+
const protectInfo = protect(certificateInfo, route)
4950

5051
if (!protectInfo) {
5152
protection.status = 301
@@ -77,10 +78,10 @@ function useProtectRoute(): IValidation {
7778
} // useProtectRoute()
7879

7980
export default function RouterProtection({
80-
WatingVerifyRouterIDList,
81+
waitingVerifyRouterIDList = {},
8182
children,
82-
}) {
83-
WAITING_VERIFY_ROUTER_ID_LIST = WatingVerifyRouterIDList
83+
}: IRouterProtectionProps) {
84+
WAITING_VERIFY_ROUTER_ID_LIST = waitingVerifyRouterIDList
8485

8586
const route = useRoute()
8687
const protection = useProtectRoute()

0 commit comments

Comments
 (0)