| [userId || 'DEFAULT']: res.access_token, | [userId || 'DEFAULT']: res.access_token, | ||||
| } | } | ||||
| localStorage.setItem('token', JSON.stringify(accessTokenJson)) | localStorage.setItem('token', JSON.stringify(accessTokenJson)) | ||||
| localStorage.removeItem(CONVERSATION_ID_INFO) | |||||
| } | } | ||||
| } | } | ||||
| import { useEffect } from 'react' | import { useEffect } from 'react' | ||||
| import { useState } from 'react' | import { useState } from 'react' | ||||
| import { create } from 'zustand' | import { create } from 'zustand' | ||||
| import { useGlobalPublicStore } from './global-public-context' | |||||
| type WebAppStore = { | type WebAppStore = { | ||||
| shareCode: string | null | shareCode: string | null | ||||
| } | } | ||||
| const WebAppStoreProvider: FC<PropsWithChildren> = ({ children }) => { | const WebAppStoreProvider: FC<PropsWithChildren> = ({ children }) => { | ||||
| const isGlobalPending = useGlobalPublicStore(s => s.isGlobalPending) | |||||
| const updateWebAppAccessMode = useWebAppStore(state => state.updateWebAppAccessMode) | const updateWebAppAccessMode = useWebAppStore(state => state.updateWebAppAccessMode) | ||||
| const updateShareCode = useWebAppStore(state => state.updateShareCode) | const updateShareCode = useWebAppStore(state => state.updateShareCode) | ||||
| const pathname = usePathname() | const pathname = usePathname() | ||||
| }, [shareCode, updateShareCode]) | }, [shareCode, updateShareCode]) | ||||
| const { isFetching, data: accessModeResult } = useGetWebAppAccessModeByCode(shareCode) | const { isFetching, data: accessModeResult } = useGetWebAppAccessModeByCode(shareCode) | ||||
| const [isFetchingAccessToken, setIsFetchingAccessToken] = useState(false) | |||||
| const [isFetchingAccessToken, setIsFetchingAccessToken] = useState(true) | |||||
| useEffect(() => { | useEffect(() => { | ||||
| if (accessModeResult?.accessMode) { | if (accessModeResult?.accessMode) { | ||||
| } | } | ||||
| }, [accessModeResult, updateWebAppAccessMode, shareCode]) | }, [accessModeResult, updateWebAppAccessMode, shareCode]) | ||||
| if (isFetching || isFetchingAccessToken) { | |||||
| if (isGlobalPending || isFetching || isFetchingAccessToken) { | |||||
| return <div className='flex h-full w-full items-center justify-center'> | return <div className='flex h-full w-full items-center justify-center'> | ||||
| <Loading /> | <Loading /> | ||||
| </div> | </div> |
| .then((res) => { | .then((res) => { | ||||
| if (!/^[23]\d{2}$/.test(String(res.status))) { | if (!/^[23]\d{2}$/.test(String(res.status))) { | ||||
| if (res.status === 401) { | if (res.status === 401) { | ||||
| refreshAccessTokenOrRelogin(TIME_OUT).then(() => { | |||||
| ssePost(url, fetchOptions, otherOptions) | |||||
| }).catch(() => { | |||||
| if (isPublicAPI) { | |||||
| res.json().then((data: any) => { | res.json().then((data: any) => { | ||||
| if (isPublicAPI) { | if (isPublicAPI) { | ||||
| if (data.code === 'web_app_access_denied') | if (data.code === 'web_app_access_denied') | ||||
| } | } | ||||
| } | } | ||||
| }) | }) | ||||
| }) | |||||
| } | |||||
| else { | |||||
| refreshAccessTokenOrRelogin(TIME_OUT).then(() => { | |||||
| ssePost(url, fetchOptions, otherOptions) | |||||
| }).catch((err) => { | |||||
| console.error(err) | |||||
| }) | |||||
| } | |||||
| } | } | ||||
| else { | else { | ||||
| res.json().then((data) => { | res.json().then((data) => { |
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| import { AccessMode } from '@/models/access-control' | |||||
| import { useQuery } from '@tanstack/react-query' | import { useQuery } from '@tanstack/react-query' | ||||
| import { fetchAppInfo, fetchAppMeta, fetchAppParams, getAppAccessModeByAppCode } from './share' | import { fetchAppInfo, fetchAppMeta, fetchAppParams, getAppAccessModeByAppCode } from './share' | ||||
| const NAME_SPACE = 'webapp' | const NAME_SPACE = 'webapp' | ||||
| export const useGetWebAppAccessModeByCode = (code: string | null) => { | export const useGetWebAppAccessModeByCode = (code: string | null) => { | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| return useQuery({ | return useQuery({ | ||||
| queryKey: [NAME_SPACE, 'appAccessMode', code], | queryKey: [NAME_SPACE, 'appAccessMode', code], | ||||
| queryFn: () => { | queryFn: () => { | ||||
| if (systemFeatures.webapp_auth.enabled === false) { | |||||
| return { | |||||
| accessMode: AccessMode.PUBLIC, | |||||
| } | |||||
| } | |||||
| if (!code || code.length === 0) | if (!code || code.length === 0) | ||||
| return Promise.reject(new Error('App code is required to get access mode')) | return Promise.reject(new Error('App code is required to get access mode')) | ||||