Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

swr-initializer.tsx 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. import { resolvePostLoginRedirect } from '../signin/utils/post-login-redirect'
  12. type SwrInitializerProps = {
  13. children: ReactNode
  14. }
  15. const SwrInitializer = ({
  16. children,
  17. }: SwrInitializerProps) => {
  18. const router = useRouter()
  19. const searchParams = useSearchParams()
  20. const consoleToken = decodeURIComponent(searchParams.get('access_token') || '')
  21. const refreshToken = decodeURIComponent(searchParams.get('refresh_token') || '')
  22. const consoleTokenFromLocalStorage = localStorage?.getItem('console_token')
  23. const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token')
  24. const pathname = usePathname()
  25. const [init, setInit] = useState(false)
  26. const isSetupFinished = useCallback(async () => {
  27. try {
  28. if (localStorage.getItem('setup_status') === 'finished')
  29. return true
  30. const setUpStatus = await fetchSetupStatus()
  31. if (setUpStatus.step !== 'finished') {
  32. localStorage.removeItem('setup_status')
  33. return false
  34. }
  35. localStorage.setItem('setup_status', 'finished')
  36. return true
  37. }
  38. catch (error) {
  39. console.error(error)
  40. return false
  41. }
  42. }, [])
  43. useEffect(() => {
  44. (async () => {
  45. const action = searchParams.get('action')
  46. if (action === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION)
  47. localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes')
  48. try {
  49. const isFinished = await isSetupFinished()
  50. if (!isFinished) {
  51. router.replace('/install')
  52. return
  53. }
  54. if (!((consoleToken && refreshToken) || (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage))) {
  55. router.replace('/signin')
  56. return
  57. }
  58. if (searchParams.has('access_token') || searchParams.has('refresh_token')) {
  59. consoleToken && localStorage.setItem('console_token', consoleToken)
  60. refreshToken && localStorage.setItem('refresh_token', refreshToken)
  61. const redirectUrl = resolvePostLoginRedirect(searchParams)
  62. if (redirectUrl)
  63. location.replace(redirectUrl)
  64. else
  65. router.replace(pathname)
  66. }
  67. setInit(true)
  68. }
  69. catch {
  70. router.replace('/signin')
  71. }
  72. })()
  73. }, [isSetupFinished, router, pathname, searchParams, consoleToken, refreshToken, consoleTokenFromLocalStorage, refreshTokenFromLocalStorage])
  74. return init
  75. ? (
  76. <SWRConfig value={{
  77. shouldRetryOnError: false,
  78. revalidateOnFocus: false,
  79. dedupingInterval: 60000,
  80. focusThrottleInterval: 5000,
  81. provider: () => new Map(),
  82. }}>
  83. {children}
  84. </SWRConfig>
  85. )
  86. : null
  87. }
  88. export default SwrInitializer