swr-initor.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. 'use client'
  2. import { SWRConfig } from 'swr'
  3. import { useCallback, useEffect, useState } from 'react'
  4. import type { ReactNode } from 'react'
  5. import { useRouter, useSearchParams } from 'next/navigation'
  6. import useRefreshToken from '@/hooks/use-refresh-token'
  7. import { fetchSetupStatus } from '@/service/common'
  8. type SwrInitorProps = {
  9. children: ReactNode
  10. }
  11. const SwrInitor = ({
  12. children,
  13. }: SwrInitorProps) => {
  14. const router = useRouter()
  15. const searchParams = useSearchParams()
  16. const { getNewAccessToken } = useRefreshToken()
  17. const consoleToken = searchParams.get('access_token')
  18. const refreshToken = searchParams.get('refresh_token')
  19. const consoleTokenFromLocalStorage = localStorage?.getItem('console_token')
  20. const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token')
  21. const [init, setInit] = useState(false)
  22. const isSetupFinished = useCallback(async () => {
  23. try {
  24. if (localStorage.getItem('setup_status') === 'finished')
  25. return true
  26. const setUpStatus = await fetchSetupStatus()
  27. if (setUpStatus.step !== 'finished') {
  28. localStorage.removeItem('setup_status')
  29. return false
  30. }
  31. localStorage.setItem('setup_status', 'finished')
  32. return true
  33. }
  34. catch (error) {
  35. console.error(error)
  36. return false
  37. }
  38. }, [])
  39. const setRefreshToken = useCallback(async () => {
  40. try {
  41. if (!(consoleToken || refreshToken || consoleTokenFromLocalStorage || refreshTokenFromLocalStorage))
  42. return Promise.reject(new Error('No token found'))
  43. if (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage)
  44. await getNewAccessToken()
  45. if (consoleToken && refreshToken) {
  46. localStorage.setItem('console_token', consoleToken)
  47. localStorage.setItem('refresh_token', refreshToken)
  48. await getNewAccessToken()
  49. }
  50. }
  51. catch (error) {
  52. return Promise.reject(error)
  53. }
  54. }, [consoleToken, refreshToken, consoleTokenFromLocalStorage, refreshTokenFromLocalStorage, getNewAccessToken])
  55. useEffect(() => {
  56. (async () => {
  57. try {
  58. const isFinished = await isSetupFinished()
  59. if (!isFinished) {
  60. router.replace('/install')
  61. return
  62. }
  63. await setRefreshToken()
  64. setInit(true)
  65. }
  66. catch (error) {
  67. router.replace('/signin')
  68. }
  69. })()
  70. }, [isSetupFinished, setRefreshToken, router])
  71. return init
  72. ? (
  73. <SWRConfig value={{
  74. shouldRetryOnError: false,
  75. revalidateOnFocus: false,
  76. }}>
  77. {children}
  78. </SWRConfig>
  79. )
  80. : null
  81. }
  82. export default SwrInitor