• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IQSS / dataverse-frontend / 20150732855

11 Dec 2025 11:24PM UTC coverage: 98.063% (+0.3%) from 97.795%
20150732855

Pull #825

github

ekraffmiller
Add text to handle pagination
Pull Request #825: 775 account page notifications

1578 of 1634 branches covered (96.57%)

Branch coverage included in aggregate %.

12 of 12 new or added lines in 6 files covered. (100.0%)

27 existing lines in 12 files now uncovered.

3789 of 3839 relevant lines covered (98.7%)

10902.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.0
/src/sections/session/SessionProvider.tsx
1
import { useCallback, useContext, useEffect, useState } from 'react'
2
import { Outlet, useNavigate } from 'react-router-dom'
3
import { AuthContext } from 'react-oauth2-code-pkce'
4
import { ReadError } from '@iqss/dataverse-client-javascript'
5
import { User } from '../../users/domain/models/User'
6
import { SessionContext, SessionError } from './SessionContext'
7
import { getUser } from '../../users/domain/useCases/getUser'
8
import { UserRepository } from '../../users/domain/repositories/UserRepository'
9
import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler'
10
import { QueryParamKey, Route } from '../Route.enum'
11

2,485✔
12
export const BEARER_TOKEN_IS_VALID_BUT_NOT_LINKED_MESSAGE =
2,485✔
13
  'Bearer token is validated, but there is no linked user account.'
2,485✔
14

15
interface SessionProviderProps {
2,485✔
16
  repository: UserRepository
1,191✔
17
}
1,191✔
18

1,191✔
19
export function SessionProvider({ repository }: SessionProviderProps) {
1,191✔
20
  const navigate = useNavigate()
21
  const { token, loginInProgress } = useContext(AuthContext)
1,191✔
22
  const [user, setUser] = useState<User | null>(null)
UNCOV
23
  const [isLoadingUser, setIsLoadingUser] = useState(false)
×
24
  const [sessionError, setSessionError] = useState<SessionError | null>(null)
25

1,191✔
26
  const handleFetchError = useCallback(
27
    (err: unknown) => {
28
      if (err instanceof ReadError) {
29
        const readErrorHandler = new JSDataverseReadErrorHandler(err)
1,191✔
30
        const statusCode = readErrorHandler.getStatusCode()
31
        const errorMessage =
32
          readErrorHandler.getReasonWithoutStatusCode() ?? readErrorHandler.getErrorMessage()
2,485✔
33

4✔
34
        // Handle specific error: Bearer token validated, but no linked user account
35
        if (readErrorHandler.isBearerTokenValidatedButNoLinkedUserAccountError()) {
4✔
36
          setSessionError({ statusCode, message: errorMessage })
37

×
38
          // Redirect to the sign-up page with a query param
39
          navigate(
40
            `${Route.SIGN_UP}?${new URLSearchParams({
2,485✔
41
              [QueryParamKey.VALID_TOKEN_BUT_NOT_LINKED_ACCOUNT]: 'true'
42
            }).toString()}`
43
          )
44

45
          return
890✔
46
        }
47

48
        // Set session error for other ReadError cases
49
        setSessionError({ statusCode, message: errorMessage })
50
        return
51
      }
52

53
      // Handle unexpected errors
54
      setSessionError({
55
        statusCode: null,
56
        message: 'An unexpected error occurred while getting the user.'
57
      })
58
    },
59
    [navigate]
60
  )
61

62
  const fetchUser = useCallback(async () => {
63
    setIsLoadingUser(true)
64

65
    try {
66
      const user = await getUser(repository)
67
      setUser(user)
68
    } catch (err) {
69
      handleFetchError(err)
70
    } finally {
71
      setIsLoadingUser(false)
72
    }
73
  }, [repository, handleFetchError])
74

75
  const refetchUserSession = async () => {
76
    await fetchUser()
77
  }
78

79
  useEffect(() => {
80
    if (token && !loginInProgress) {
81
      void fetchUser()
82
    }
83
  }, [token, loginInProgress, fetchUser])
84

85
  return (
86
    <SessionContext.Provider
87
      value={{
88
        user,
89
        isLoadingUser,
90
        sessionError,
91
        setUser,
92
        refetchUserSession
93
      }}>
94
      <Outlet />
95
    </SessionContext.Provider>
96
  )
97
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc