You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gcgj-dify-1.7.0/web/app/components/swr-initor.tsx

108 lines
2.8 KiB
TypeScript

'use client'
import { SWRConfig } from 'swr'
import { useCallback, useEffect, useState } from 'react'
import type { ReactNode } from 'react'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { fetchSetupStatus } from '@/service/common'
import {
EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION,
} from '@/app/education-apply/constants'
type SwrInitorProps = {
children: ReactNode;
}
const SwrInitor = ({ children }: SwrInitorProps) => {
const router = useRouter()
const searchParams = useSearchParams()
const consoleToken = decodeURIComponent(
searchParams.get('access_token') || '',
)
const refreshToken = decodeURIComponent(
searchParams.get('refresh_token') || '',
)
const consoleTokenFromLocalStorage = localStorage?.getItem('console_token')
const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token')
const pathname = usePathname()
const [init, setInit] = useState(false)
const isSetupFinished = useCallback(async () => {
try {
if (localStorage.getItem('setup_status') === 'finished') return true
const setUpStatus = await fetchSetupStatus()
if (setUpStatus.step !== 'finished') {
localStorage.removeItem('setup_status')
return false
}
localStorage.setItem('setup_status', 'finished')
return true
}
catch (error) {
console.error(error)
return false
}
}, [])
useEffect(() => {
(async () => {
const action = searchParams.get('action')
if (action === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION)
localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes')
try {
const isFinished = await isSetupFinished()
if (!isFinished) {
router.replace('/install')
return
}
if (
!(
(consoleToken && refreshToken)
|| (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage)
)
) {
router.replace('/signin')
return
}
if (
searchParams.has('access_token')
|| searchParams.has('refresh_token')
) {
consoleToken && localStorage.setItem('console_token', consoleToken)
refreshToken && localStorage.setItem('refresh_token', refreshToken)
router.replace(pathname)
}
setInit(true)
}
catch {
router.replace('/signin')
}
})()
}, [
isSetupFinished,
router,
pathname,
searchParams,
consoleToken,
refreshToken,
consoleTokenFromLocalStorage,
refreshTokenFromLocalStorage,
])
return init ? (
<SWRConfig
value={{
shouldRetryOnError: false,
revalidateOnFocus: false,
}}
>
{children}
</SWRConfig>
) : null
}
export default SwrInitor