react-toolkits 2.11.2 → 2.11.3

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/locale/hooks.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { has, template, get } from 'lodash-es';
2
2
  import { createContext, useMemo, useContext } from 'react';
3
- import 'antd';
4
- import { useStoreWithEqualityFn } from 'zustand/traditional';
5
- import 'zustand';
3
+ import { useStore } from 'zustand';
6
4
  import 'zustand/middleware';
7
5
  import axios from 'axios';
8
6
  import 'jwt-decode';
7
+ import 'antd';
9
8
  import 'react/jsx-runtime';
10
9
 
11
10
  // src/components/locale/hooks.ts
@@ -21,7 +20,7 @@ var ToolkitsContext = createContext(null);
21
20
  function useToolkitsStore(selector) {
22
21
  const store = useContext(ToolkitsContext);
23
22
  if (!store) throw new Error("Missing ToolkitsProvider in the tree");
24
- return useStoreWithEqualityFn(store, selector);
23
+ return useStore(store, selector);
25
24
  }
26
25
  if (process.env.NODE_ENV !== "production") ;
27
26
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;;AAQwBA,MAAM,MAAO,CAAA;AAAA,EACnC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA,iCAAA;AAAA,GAClB;AACF,CAAC,EAAA;ACDD,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA,CAAA;AAEzD,SAAS,iBACd,QACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAClE,EAAO,OAAA,sBAAA,CAAuB,OAAO,QAAQ,CAAA,CAAA;AAC/C,CAAA;AAyBA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA,CAE3C;;;AC5BO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA,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,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA,CAAA;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 { useEffect } from 'react'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const instance = 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 useEffect(() => {\n instance.interceptors.request.eject(requestInterceptorId)\n instance.interceptors.response.eject(responseInterceptorId)\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = instance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = instance.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 && state.game) {\n 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 = instance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = instance.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 (state.signInPath) {\n if (response.status === 412) {\n // TODO: 登录页显示“未注册”\n }\n window.location.replace(state?.signInPath)\n } else {\n throw new Error('请在 ToolkitsProvider 中配置 signInPath')\n }\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 () => {\n instance.interceptors.request.eject(requestInterceptorId)\n instance.interceptors.response.eject(responseInterceptorId)\n }\n }, [state])\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 { useStoreWithEqualityFn } from 'zustand/traditional'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport { Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(\n selector: (state: ToolkitsState, equalityFn?: (left: T, right: T) => boolean) => T,\n) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStoreWithEqualityFn(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore(restProps)\n }\n\n return (\n <App>\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <Interceptor>{children}</Interceptor>\n </App>\n </ToolkitsContext.Provider>\n </App>\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"]}
1
+ {"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAOwBA,MAAM,MAAO,CAAA;AAAA,EACnC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA,iCAAA;AAAA,GAClB;AACF,CAAC,EAAA;ACDD,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA,CAAA;AACjC,CAAA;AAqBA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA,CAE3C;;;ACrBO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA,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,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA,CAAA;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 { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const instance = 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 (requestInterceptorId) {\n instance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n instance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = instance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = instance.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 && state.game) {\n 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 = instance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = instance.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 (state.signInPath) {\n if (response.status === 412) {\n // TODO: 登录页显示“未注册”\n }\n window.location.replace(state?.signInPath)\n } else {\n throw new Error('请在 ToolkitsProvider 中配置 signInPath')\n }\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 type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport { 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\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore(restProps)\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <Interceptor>{children}</Interceptor>\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 CHANGED
@@ -1,11 +1,10 @@
1
1
  import { has, template, get } from 'lodash-es';
2
2
  import { createContext, useMemo, useContext } from 'react';
3
- import 'antd';
4
- import { useStoreWithEqualityFn } from 'zustand/traditional';
5
- import 'zustand';
3
+ import { useStore } from 'zustand';
6
4
  import 'zustand/middleware';
7
5
  import axios from 'axios';
8
6
  import 'jwt-decode';
7
+ import 'antd';
9
8
  import 'react/jsx-runtime';
10
9
 
11
10
  // src/components/locale/hooks.ts
@@ -21,7 +20,7 @@ var ToolkitsContext = createContext(null);
21
20
  function useToolkitsStore(selector) {
22
21
  const store = useContext(ToolkitsContext);
23
22
  if (!store) throw new Error("Missing ToolkitsProvider in the tree");
24
- return useStoreWithEqualityFn(store, selector);
23
+ return useStore(store, selector);
25
24
  }
26
25
  if (process.env.NODE_ENV !== "production") ;
27
26
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;;AAQwBA,MAAM,MAAO,CAAA;AAAA,EACnC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA,iCAAA;AAAA,GAClB;AACF,CAAC,EAAA;ACDD,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA,CAAA;AAEzD,SAAS,iBACd,QACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAClE,EAAO,OAAA,sBAAA,CAAuB,OAAO,QAAQ,CAAA,CAAA;AAC/C,CAAA;AAyBA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA,CAE3C;;;AC5BO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA,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,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA,CAAA;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 { useEffect } from 'react'\nimport { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const instance = 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 useEffect(() => {\n instance.interceptors.request.eject(requestInterceptorId)\n instance.interceptors.response.eject(responseInterceptorId)\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = instance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = instance.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 && state.game) {\n 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 = instance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = instance.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 (state.signInPath) {\n if (response.status === 412) {\n // TODO: 登录页显示“未注册”\n }\n window.location.replace(state?.signInPath)\n } else {\n throw new Error('请在 ToolkitsProvider 中配置 signInPath')\n }\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 () => {\n instance.interceptors.request.eject(requestInterceptorId)\n instance.interceptors.response.eject(responseInterceptorId)\n }\n }, [state])\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 { useStoreWithEqualityFn } from 'zustand/traditional'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport { Interceptor } from '../../utils/axios'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\nexport function useToolkitsStore<T>(\n selector: (state: ToolkitsState, equalityFn?: (left: T, right: T) => boolean) => T,\n) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n return useStoreWithEqualityFn(store, selector)\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nexport let toolkitsStore: ToolkitsStore\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore(restProps)\n }\n\n return (\n <App>\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <Interceptor>{children}</Interceptor>\n </App>\n </ToolkitsContext.Provider>\n </App>\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"]}
1
+ {"version":3,"sources":["../src/utils/axios.tsx","../src/components/toolkitsProvider/Provider.tsx","../src/components/locale/hooks.ts"],"names":["axios","locale"],"mappings":";;;;;;;;;;;;AAOwBA,MAAM,MAAO,CAAA;AAAA,EACnC,OAAS,EAAA,GAAA;AAAA,EACT,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA,iCAAA;AAAA,GAClB;AACF,CAAC,EAAA;ACDD,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA,CAAA;AAEzD,SAAS,iBAAoB,QAAuC,EAAA;AACzE,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAClE,EAAO,OAAA,QAAA,CAAS,OAAO,QAAQ,CAAA,CAAA;AACjC,CAAA;AAqBA,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA,CAE3C;;;ACrBO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMC,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA,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,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA,CAAA;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 { useToolkitsStore } from '../components/toolkitsProvider'\nimport { APP_ID_HEADER } from '../constants'\n\nexport const instance = 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 (requestInterceptorId) {\n instance.interceptors.request.eject(requestInterceptorId)\n }\n\n if (responseInterceptorId) {\n instance.interceptors.response.eject(responseInterceptorId)\n }\n\n const interceptors = state.interceptors\n\n if (interceptors?.request) {\n requestInterceptorId = instance.interceptors.request.use(...interceptors.request)\n } else {\n requestInterceptorId = instance.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 && state.game) {\n 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 = instance.interceptors.response.use(...interceptors.response)\n } else {\n responseInterceptorId = instance.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 (state.signInPath) {\n if (response.status === 412) {\n // TODO: 登录页显示“未注册”\n }\n window.location.replace(state?.signInPath)\n } else {\n throw new Error('请在 ToolkitsProvider 中配置 signInPath')\n }\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 type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\nimport type { ToolkitsState } from '../../stores'\nimport { createToolkitsStore } from '../../stores'\nimport type { ContextSlice } from '../../stores/context'\nimport { 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\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore(restProps)\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <Interceptor>{children}</Interceptor>\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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-toolkits",
3
3
  "type": "module",
4
- "version": "2.11.2",
4
+ "version": "2.11.3",
5
5
  "sideEffects": [
6
6
  "*.css"
7
7
  ],
@@ -65,9 +65,9 @@
65
65
  "ts-essentials": "^10.0.1",
66
66
  "tsup": "^8.1.0",
67
67
  "typescript": "^5.5.4",
68
+ "@flow97/eslint-config-react": "1.0.3",
68
69
  "tailwind-config": "0.1.2",
69
- "tsconfig": "0.0.6",
70
- "@flow97/eslint-config-react": "1.0.3"
70
+ "tsconfig": "0.0.6"
71
71
  },
72
72
  "peerDependencies": {
73
73
  "antd": "^5.12.2",