| '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' |
|
|
| 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 () => { |
| 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 (error) { |
| 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 |
|
|