@@ -13,6 +13,7 @@ import * as Sentry from '@sentry/nextjs'
1313import { UserContext } from 'lib/user'
1414import BlockedUploadsModal from 'components/blockedUploadsModal.js'
1515import Loading from 'components/loading'
16+ import constants from 'lib/constants'
1617
1718const queryClient = new QueryClient ( {
1819 defaultOptions : { queries : { staleTime : 60 * 1000 } } ,
@@ -26,33 +27,52 @@ const queryClient = new QueryClient({
2627export default function App ( { Component, pageProps } ) {
2728 const router = useRouter ( )
2829 const [ user , setUser ] = useState ( null )
30+ const [ isUserInitialized , setIsUserInitialized ] = useState ( false )
2931 const [ isUserBlockedModalShowing , setIsUserBlockedModalShowing ] =
3032 useState ( false )
3133
3234 const handleIsLoggedIn = useCallback ( async ( ) => {
3335 const data = await isLoggedIn ( )
34- if ( ! data ) return
36+ if ( ! data ) {
37+ setIsUserInitialized ( true )
38+ return
39+ }
40+
3541 if ( data ) {
3642 // @ts -ignore
3743 Sentry . setUser ( user )
3844 }
39- const tags = await getUserTags ( )
40- const pendingTagProposals = await getUserRequests ( )
4145
42- if ( tags . HasAccountRestriction && ! sessionStorage . hasSeenUserBlockedModal ) {
43- sessionStorage . hasSeenUserBlockedModal = true
44- setIsUserBlockedModalShowing ( true )
46+ try {
47+ const tags = await getUserTags ( )
48+ const pendingTagProposals = await getUserRequests ( )
49+ if (
50+ tags . HasAccountRestriction &&
51+ ! sessionStorage . hasSeenUserBlockedModal
52+ ) {
53+ sessionStorage . hasSeenUserBlockedModal = true
54+ setIsUserBlockedModalShowing ( true )
55+ }
56+ setUser ( {
57+ ...data ,
58+ // @ts -ignore
59+ tags,
60+ pendingTagProposals,
61+ } )
62+ } catch ( e ) {
63+ // do nothing
4564 }
65+
4666 // @ts -ignore
47- setUser ( {
48- ...data ,
49- // @ts -ignore
50- tags,
51- pendingTagProposals,
52- } )
5367 // eslint-disable-next-line react-hooks/exhaustive-deps
5468 } , [ ] )
5569
70+ useEffect ( ( ) => {
71+ if ( user ) {
72+ setIsUserInitialized ( true )
73+ }
74+ } , [ user ] )
75+
5676 useEffect ( ( ) => {
5777 handleIsLoggedIn ( )
5878 } , [ router , handleIsLoggedIn ] )
@@ -67,14 +87,39 @@ export default function App({ Component, pageProps }) {
6787 // If redirectIfFound is also set, redirect if the user was found
6888 ( pageProps . redirectIfFound && user )
6989 ) {
70- router . push ( pageProps . redirectTo )
90+ router . push ( router . query . returnUrl ?? pageProps . redirectTo )
91+ }
92+ } , [ pageProps , user , router , isUserInitialized ] )
93+
94+ const [ pendingAuthCheckRoute , setPendingAuthCheckRoute ] = useState ( '' )
95+
96+ useEffect ( ( ) => {
97+ if ( pendingAuthCheckRoute && isUserInitialized ) {
98+ const str = pendingAuthCheckRoute . replace ( / ( ^ \/ + | \/ + $ ) / g, '' )
99+
100+ if (
101+ ! user &&
102+ Object . values ( constants . AUTHENTICATED_ROUTES ) . includes ( str )
103+ ) {
104+ router . push ( {
105+ pathname : '/login' ,
106+ query : {
107+ returnUrl : str ,
108+ } ,
109+ } )
110+ }
111+ setPendingAuthCheckRoute ( '' )
71112 }
72- } , [ pageProps , user , router ] )
113+ } , [ pendingAuthCheckRoute , isUserInitialized , user , router ] )
73114
74115 useEffect ( ( ) => {
75116 Router . events . on ( 'routeChangeComplete' , ( route ) => {
76117 countly . trackPageView ( route )
118+ setPendingAuthCheckRoute ( route . split ( '?' ) [ 0 ] . toLowerCase ( ) )
77119 } )
120+ setPendingAuthCheckRoute (
121+ window . location . pathname . split ( '?' ) [ 0 ] . toLowerCase ( )
122+ )
78123 } , [ ] )
79124
80125 function handleClearUser ( ) {
@@ -106,7 +151,7 @@ export default function App({ Component, pageProps }) {
106151 < QueryClientProvider client = { queryClient } >
107152 < UserContext . Provider
108153 // @ts -ignore
109- value = { { user, handleClearUser } }
154+ value = { { user, handleClearUser, handleIsLoggedIn } }
110155 >
111156 < Layout { ...pageProps } >
112157 { ( props ) => < Component { ...pageProps } { ...props } /> }
0 commit comments