swr-initor.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. 'use client'
  2. import { SWRConfig } from 'swr'
  3. import { 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. type SwrInitorProps = {
  8. children: ReactNode
  9. }
  10. const SwrInitor = ({
  11. children,
  12. }: SwrInitorProps) => {
  13. const router = useRouter()
  14. const searchParams = useSearchParams()
  15. const consoleToken = searchParams.get('access_token')
  16. const refreshToken = searchParams.get('refresh_token')
  17. const consoleTokenFromLocalStorage = localStorage?.getItem('console_token')
  18. const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token')
  19. const [init, setInit] = useState(false)
  20. const { getNewAccessToken } = useRefreshToken()
  21. useEffect(() => {
  22. if (!(consoleToken || refreshToken || consoleTokenFromLocalStorage || refreshTokenFromLocalStorage)) {
  23. router.replace('/signin')
  24. return
  25. }
  26. if (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage)
  27. getNewAccessToken(consoleTokenFromLocalStorage, refreshTokenFromLocalStorage)
  28. if (consoleToken && refreshToken) {
  29. localStorage.setItem('console_token', consoleToken)
  30. localStorage.setItem('refresh_token', refreshToken)
  31. getNewAccessToken(consoleToken, refreshToken).then(() => {
  32. router.replace('/apps', { forceOptimisticNavigation: false } as any)
  33. }).catch(() => {
  34. router.replace('/signin')
  35. })
  36. }
  37. setInit(true)
  38. }, [])
  39. return init
  40. ? (
  41. <SWRConfig value={{
  42. shouldRetryOnError: false,
  43. revalidateOnFocus: false,
  44. }}>
  45. {children}
  46. </SWRConfig>
  47. )
  48. : null
  49. }
  50. export default SwrInitor