swr-initor.tsx 2.7 KB

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