1
1
import type { ThemeProviderProps } from '@primer/react'
2
+ import { useRouter } from 'next/router'
3
+ import { useEffect } from 'react'
2
4
import useSWR from 'swr'
3
5
6
+ import { getTheme } from '../../lib/get-theme'
7
+
4
8
export default async function fetcher < JSON = any > (
5
9
input : RequestInfo ,
6
10
init ?: RequestInit
@@ -11,7 +15,7 @@ export default async function fetcher<JSON = any>(
11
15
12
16
export type Session = {
13
17
isSignedIn : boolean
14
- csrfToken : string
18
+ csrfToken ? : string
15
19
userLanguage : string // en, es, ja, cn
16
20
theme : {
17
21
colorMode : Pick < ThemeProviderProps , 'colorMode' >
@@ -25,8 +29,27 @@ export type Session = {
25
29
}
26
30
}
27
31
32
+ const defaultSession : Session = {
33
+ isSignedIn : false ,
34
+ userLanguage : 'en' , // en, es, ja, cn
35
+ theme : getTheme ( { } ) , // as if no cookie was present
36
+ themeCss : getTheme ( { } , true ) , // as if no cookie was present
37
+ }
28
38
// React hook version
29
39
export function useSession ( ) {
30
- const { data : session , error } = useSWR < Session > ( '/api/session' , fetcher )
31
- return { session, isLoadingSession : ! error && ! session }
40
+ const { locale } = useRouter ( )
41
+
42
+ const { data : session , error } = useSWR < Session > ( '/api/session' , fetcher , {
43
+ // Use the current language, as per the URL, until we know what the
44
+ // user actually prefers.
45
+ fallbackData : Object . assign ( { } , defaultSession , { userLanguage : locale } ) ,
46
+ } )
47
+
48
+ useEffect ( ( ) => {
49
+ if ( error ) {
50
+ console . warn ( 'An error occurred loading the user session' , error )
51
+ }
52
+ } , [ error ] )
53
+
54
+ return { session }
32
55
}
0 commit comments