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

IQSS / dataverse-frontend / 14606716179

22 Apr 2025 11:44PM UTC coverage: 97.863% (+0.4%) from 97.43%
14606716179

push

github

web-flow
Merge pull request #658 from IQSS/634-metadata-display-discrepancies-between-spa-and-jsf-app

Dataset Metadata: update formats of fields

2930 of 3069 branches covered (95.47%)

Branch coverage included in aggregate %.

4 of 4 new or added lines in 1 file covered. (100.0%)

24 existing lines in 14 files now uncovered.

6460 of 6526 relevant lines covered (98.99%)

26057.16 hits per line

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

98.08
/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

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

15
interface SessionProviderProps {
7,455✔
16
  repository: UserRepository
3,573✔
17
}
3,573✔
18

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

3,573✔
26
  const handleFetchError = useCallback(
64✔
27
    (err: unknown) => {
28
      if (err instanceof ReadError) {
13✔
29
        const readErrorHandler = new JSDataverseReadErrorHandler(err)
3,584✔
30
        const statusCode = readErrorHandler.getStatusCode()
11✔
31
        const errorMessage =
32
          readErrorHandler.getReasonWithoutStatusCode() ?? readErrorHandler.getErrorMessage()
7,466✔
33

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

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

45
          return
2,678✔
46
        }
47

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

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

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

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

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

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

85
  return (
64✔
86
    <SessionContext.Provider
87
      value={{
88
        user,
89
        isLoadingUser,
90
        sessionError,
91
        setUser,
92
        refetchUserSession
93
      }}>
94
      <Outlet />
95
    </SessionContext.Provider>
96
  )
97
}
30✔
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