react-toolkits 2.11.7 → 2.11.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/locale/hooks.js.map +1 -1
- package/locale/index.js.map +1 -1
- package/package.json +1 -1
package/locale/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAQ6BA,MAAM,MAAO,CAAA;AAAA,EACxC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA;AAAA;AAEpB,CAAC;ACED,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACjC;AA4CA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;;;AC9CpC,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"hooks.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport axios, { AxiosHeaders } from 'axios'\nimport type { ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const axiosInstance = axios.create({\n baseURL: '/',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n})\n\nexport type JsonData<T = any> = {\n code?: number\n status?: number\n errno?: number\n data: T\n msg: string\n}\n\nlet requestInterceptorId: number\nlet responseInterceptorId: number\n\nexport const Interceptor = ({ children }: { children?: ReactNode }) => {\n const state = useToolkitsStore(s => s)\n const { notification } = App.useApp()\n\n if (!state.token) {\n return <Navigate to={state.signInPath} />\n }\n\n if (requestInterceptorId) {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n axiosInstance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = axiosInstance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = axiosInstance.interceptors.request.use(config => {\n const headers = new AxiosHeaders(config.headers)\n config.responseType = config.responseType || 'json'\n\n if (state.token) {\n headers.set('Authorization', `Bearer ${state.token}`)\n }\n\n if (!headers.has(APP_ID_HEADER) && state.usePermissionApiV2) {\n if (state.isGlobal || !state.game) {\n headers.set(APP_ID_HEADER, 'global')\n } else if (state.gameApiV2) {\n headers.set(APP_ID_HEADER, state.game.game_id)\n } else {\n headers.set(APP_ID_HEADER, state.game.id)\n }\n }\n\n headers.set('Accept', config.responseType === 'blob' ? 'application/octet-stream' : 'application/json')\n config.headers = headers\n return config\n })\n }\n\n if (interceptors?.response) {\n responseInterceptorId = axiosInstance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = axiosInstance.interceptors.response.use(\n response => {\n const responseType = response.request.responseType || 'json'\n\n if (responseType === 'json') {\n const data = response.data as JsonData\n\n if (data.code === 0 || data.code === 200 || data.status === 0 || data.errno === 0) {\n return response\n } else {\n notification.error({\n message: 'Request failed',\n description: data.msg,\n })\n throw new Error(data.msg)\n }\n }\n\n return response\n },\n error => {\n if (axios.isAxiosError(error)) {\n const response = error.response\n\n if (!response) {\n throw error\n }\n\n if (response.status === 401 || response.status === 412) {\n state.clearToken?.()\n if (response.status === 412) {\n state.setUnregistered()\n }\n window.location.replace(state.signInPath)\n } else if (response.status === 403) {\n notification.error({\n message: 'Forbidden',\n description: 'You do not have permission to access this resource.',\n })\n } else {\n notification.error({\n message: 'Request failed',\n description: response.data.msg,\n })\n throw new Error(response.data.msg)\n }\n }\n throw error\n },\n )\n }\n\n return children\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { SWRConfig } from 'swr'\nimport type { Head } from 'ts-essentials'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport type { JsonData } from '../../utils/axios'\nimport { axiosInstance, Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStore(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nlet globalState: ToolkitsState\n\n// FIXME: 嵌套的 Provider 需要合并,不然会导致一些意外的情况\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n\n
|
|
1
|
+
{"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAQ6BA,MAAM,MAAO,CAAA;AAAA,EACxC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA;AAAA;AAEpB,CAAC;ACED,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACjC;AA4CA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;;;AC9CpC,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"hooks.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport axios, { AxiosHeaders } from 'axios'\nimport type { ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const axiosInstance = axios.create({\n baseURL: '/',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n})\n\nexport type JsonData<T = any> = {\n code?: number\n status?: number\n errno?: number\n data: T\n msg: string\n}\n\nlet requestInterceptorId: number\nlet responseInterceptorId: number\n\nexport const Interceptor = ({ children }: { children?: ReactNode }) => {\n const state = useToolkitsStore(s => s)\n const { notification } = App.useApp()\n\n if (!state.token) {\n return <Navigate to={state.signInPath} />\n }\n\n if (requestInterceptorId) {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n axiosInstance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = axiosInstance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = axiosInstance.interceptors.request.use(config => {\n const headers = new AxiosHeaders(config.headers)\n config.responseType = config.responseType || 'json'\n\n if (state.token) {\n headers.set('Authorization', `Bearer ${state.token}`)\n }\n\n if (!headers.has(APP_ID_HEADER) && state.usePermissionApiV2) {\n if (state.isGlobal || !state.game) {\n headers.set(APP_ID_HEADER, 'global')\n } else if (state.gameApiV2) {\n headers.set(APP_ID_HEADER, state.game.game_id)\n } else {\n headers.set(APP_ID_HEADER, state.game.id)\n }\n }\n\n headers.set('Accept', config.responseType === 'blob' ? 'application/octet-stream' : 'application/json')\n config.headers = headers\n return config\n })\n }\n\n if (interceptors?.response) {\n responseInterceptorId = axiosInstance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = axiosInstance.interceptors.response.use(\n response => {\n const responseType = response.request.responseType || 'json'\n\n if (responseType === 'json') {\n const data = response.data as JsonData\n\n if (data.code === 0 || data.code === 200 || data.status === 0 || data.errno === 0) {\n return response\n } else {\n notification.error({\n message: 'Request failed',\n description: data.msg,\n })\n throw new Error(data.msg)\n }\n }\n\n return response\n },\n error => {\n if (axios.isAxiosError(error)) {\n const response = error.response\n\n if (!response) {\n throw error\n }\n\n if (response.status === 401 || response.status === 412) {\n state.clearToken?.()\n if (response.status === 412) {\n state.setUnregistered()\n }\n window.location.replace(state.signInPath)\n } else if (response.status === 403) {\n notification.error({\n message: 'Forbidden',\n description: 'You do not have permission to access this resource.',\n })\n } else {\n notification.error({\n message: 'Request failed',\n description: response.data.msg,\n })\n throw new Error(response.data.msg)\n }\n }\n throw error\n },\n )\n }\n\n return children\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { SWRConfig } from 'swr'\nimport type { Head } from 'ts-essentials'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport type { JsonData } from '../../utils/axios'\nimport { axiosInstance, Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStore(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nlet globalState: ToolkitsState\n\n// FIXME: 嵌套的 Provider 需要合并,不然会导致一些意外的情况\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...globalState, ...restProps })\n }\n\n globalState = storeRef.current.getState()\n\n if (!globalState.signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <SWRConfig\n value={{\n fetcher: (arg: string | Head<Parameters<typeof axiosInstance.request>>) => {\n if (typeof arg === 'string') {\n return axiosInstance.get<JsonData>(arg).then(res => res.data.data)\n }\n return axiosInstance.request<JsonData>(arg).then(res => res.data.data)\n },\n }}\n >\n <Interceptor>{children}</Interceptor>\n </SWRConfig>\n </App>\n </ToolkitsContext.Provider>\n )\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '../toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n"]}
|
package/locale/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAQ6BA,MAAM,MAAO,CAAA;AAAA,EACxC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA;AAAA;AAEpB,CAAC;ACED,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACjC;AA4CA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;;;AC9CpC,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"index.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport axios, { AxiosHeaders } from 'axios'\nimport type { ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const axiosInstance = axios.create({\n baseURL: '/',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n})\n\nexport type JsonData<T = any> = {\n code?: number\n status?: number\n errno?: number\n data: T\n msg: string\n}\n\nlet requestInterceptorId: number\nlet responseInterceptorId: number\n\nexport const Interceptor = ({ children }: { children?: ReactNode }) => {\n const state = useToolkitsStore(s => s)\n const { notification } = App.useApp()\n\n if (!state.token) {\n return <Navigate to={state.signInPath} />\n }\n\n if (requestInterceptorId) {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n axiosInstance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = axiosInstance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = axiosInstance.interceptors.request.use(config => {\n const headers = new AxiosHeaders(config.headers)\n config.responseType = config.responseType || 'json'\n\n if (state.token) {\n headers.set('Authorization', `Bearer ${state.token}`)\n }\n\n if (!headers.has(APP_ID_HEADER) && state.usePermissionApiV2) {\n if (state.isGlobal || !state.game) {\n headers.set(APP_ID_HEADER, 'global')\n } else if (state.gameApiV2) {\n headers.set(APP_ID_HEADER, state.game.game_id)\n } else {\n headers.set(APP_ID_HEADER, state.game.id)\n }\n }\n\n headers.set('Accept', config.responseType === 'blob' ? 'application/octet-stream' : 'application/json')\n config.headers = headers\n return config\n })\n }\n\n if (interceptors?.response) {\n responseInterceptorId = axiosInstance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = axiosInstance.interceptors.response.use(\n response => {\n const responseType = response.request.responseType || 'json'\n\n if (responseType === 'json') {\n const data = response.data as JsonData\n\n if (data.code === 0 || data.code === 200 || data.status === 0 || data.errno === 0) {\n return response\n } else {\n notification.error({\n message: 'Request failed',\n description: data.msg,\n })\n throw new Error(data.msg)\n }\n }\n\n return response\n },\n error => {\n if (axios.isAxiosError(error)) {\n const response = error.response\n\n if (!response) {\n throw error\n }\n\n if (response.status === 401 || response.status === 412) {\n state.clearToken?.()\n if (response.status === 412) {\n state.setUnregistered()\n }\n window.location.replace(state.signInPath)\n } else if (response.status === 403) {\n notification.error({\n message: 'Forbidden',\n description: 'You do not have permission to access this resource.',\n })\n } else {\n notification.error({\n message: 'Request failed',\n description: response.data.msg,\n })\n throw new Error(response.data.msg)\n }\n }\n throw error\n },\n )\n }\n\n return children\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { SWRConfig } from 'swr'\nimport type { Head } from 'ts-essentials'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport type { JsonData } from '../../utils/axios'\nimport { axiosInstance, Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStore(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nlet globalState: ToolkitsState\n\n// FIXME: 嵌套的 Provider 需要合并,不然会导致一些意外的情况\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n\n
|
|
1
|
+
{"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAQ6BA,MAAM,MAAO,CAAA;AAAA,EACxC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA;AAAA;AAEpB,CAAC;ACED,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACjC;AA4CA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;;;AC9CpC,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"index.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport axios, { AxiosHeaders } from 'axios'\nimport type { ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const axiosInstance = axios.create({\n baseURL: '/',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n})\n\nexport type JsonData<T = any> = {\n code?: number\n status?: number\n errno?: number\n data: T\n msg: string\n}\n\nlet requestInterceptorId: number\nlet responseInterceptorId: number\n\nexport const Interceptor = ({ children }: { children?: ReactNode }) => {\n const state = useToolkitsStore(s => s)\n const { notification } = App.useApp()\n\n if (!state.token) {\n return <Navigate to={state.signInPath} />\n }\n\n if (requestInterceptorId) {\n axiosInstance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n axiosInstance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = axiosInstance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = axiosInstance.interceptors.request.use(config => {\n const headers = new AxiosHeaders(config.headers)\n config.responseType = config.responseType || 'json'\n\n if (state.token) {\n headers.set('Authorization', `Bearer ${state.token}`)\n }\n\n if (!headers.has(APP_ID_HEADER) && state.usePermissionApiV2) {\n if (state.isGlobal || !state.game) {\n headers.set(APP_ID_HEADER, 'global')\n } else if (state.gameApiV2) {\n headers.set(APP_ID_HEADER, state.game.game_id)\n } else {\n headers.set(APP_ID_HEADER, state.game.id)\n }\n }\n\n headers.set('Accept', config.responseType === 'blob' ? 'application/octet-stream' : 'application/json')\n config.headers = headers\n return config\n })\n }\n\n if (interceptors?.response) {\n responseInterceptorId = axiosInstance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = axiosInstance.interceptors.response.use(\n response => {\n const responseType = response.request.responseType || 'json'\n\n if (responseType === 'json') {\n const data = response.data as JsonData\n\n if (data.code === 0 || data.code === 200 || data.status === 0 || data.errno === 0) {\n return response\n } else {\n notification.error({\n message: 'Request failed',\n description: data.msg,\n })\n throw new Error(data.msg)\n }\n }\n\n return response\n },\n error => {\n if (axios.isAxiosError(error)) {\n const response = error.response\n\n if (!response) {\n throw error\n }\n\n if (response.status === 401 || response.status === 412) {\n state.clearToken?.()\n if (response.status === 412) {\n state.setUnregistered()\n }\n window.location.replace(state.signInPath)\n } else if (response.status === 403) {\n notification.error({\n message: 'Forbidden',\n description: 'You do not have permission to access this resource.',\n })\n } else {\n notification.error({\n message: 'Request failed',\n description: response.data.msg,\n })\n throw new Error(response.data.msg)\n }\n }\n throw error\n },\n )\n }\n\n return children\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { SWRConfig } from 'swr'\nimport type { Head } from 'ts-essentials'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport type { JsonData } from '../../utils/axios'\nimport { axiosInstance, Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStore(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nlet globalState: ToolkitsState\n\n// FIXME: 嵌套的 Provider 需要合并,不然会导致一些意外的情况\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...globalState, ...restProps })\n }\n\n globalState = storeRef.current.getState()\n\n if (!globalState.signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <SWRConfig\n value={{\n fetcher: (arg: string | Head<Parameters<typeof axiosInstance.request>>) => {\n if (typeof arg === 'string') {\n return axiosInstance.get<JsonData>(arg).then(res => res.data.data)\n }\n return axiosInstance.request<JsonData>(arg).then(res => res.data.data)\n },\n }}\n >\n <Interceptor>{children}</Interceptor>\n </SWRConfig>\n </App>\n </ToolkitsContext.Provider>\n )\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '../toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n"]}
|