-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathAppendProcessProvider.tsx
More file actions
108 lines (92 loc) · 3.75 KB
/
AppendProcessProvider.tsx
File metadata and controls
108 lines (92 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import type { AppendStatus, CorbadoConnectAppendConfig } from '@corbado/types';
import type { ConnectError } from '@corbado/web-core';
import log from 'loglevel';
import type { FC, PropsWithChildren } from 'react';
import React, { useCallback, useMemo, useState } from 'react';
import useShared from '../hooks/useShared';
import type { Flags } from '../types/flags';
import type { AppendScreenType } from '../types/screenTypes';
import type { AppendSituationCode } from '../types/situations';
import type { AppendProcessContextProps } from './AppendProcessContext';
import AppendProcessContext from './AppendProcessContext';
type Props = {
config: CorbadoConnectAppendConfig;
initialScreenType: AppendScreenType;
};
export const AppendProcessProvider: FC<PropsWithChildren<Props>> = ({ children, initialScreenType, config }) => {
const [currentScreenType, setCurrentScreenType] = useState<AppendScreenType>(initialScreenType);
const [currentScreenOptions, setCurrentScreenOptions] = useState<any>();
const { getConnectService } = useShared();
const [flags, setFlags] = useState<Flags | undefined>();
const navigateToScreen = useCallback((screenType: AppendScreenType, options?: any) => {
setCurrentScreenType(screenType);
setCurrentScreenOptions(options);
}, []);
const handleErrorSoft = useCallback(
async (situationCode: AppendSituationCode, expected: boolean, showError: boolean, error?: ConnectError) => {
const messageCode = `situation: ${situationCode} ${error?.track()}`;
if (expected) {
await getConnectService().recordEventAppendError(messageCode);
} else {
await getConnectService().recordEventAppendErrorUnexpected(messageCode);
}
if (showError) {
config.onError?.(situationCode.toString());
}
},
[getConnectService, config],
);
const handleErrorHard = useCallback(
async (situationCode: AppendSituationCode, expected: boolean, error?: ConnectError) => {
const messageCode = `situation: ${situationCode} ${error?.track()}`;
if (expected) {
await getConnectService().recordEventAppendError(messageCode);
} else {
await getConnectService().recordEventAppendErrorUnexpected(messageCode);
}
config.onError?.(situationCode.toString());
void config.onSkip('skip-implicit');
},
[getConnectService, config],
);
const handleSkip = useCallback(
async (_: AppendSituationCode, explicit?: boolean) => {
let status: AppendStatus = 'skip-implicit';
if (explicit) {
status = 'skip-explicit';
await getConnectService().recordEventAppendExplicitAbort();
}
void config.onSkip(status);
},
[getConnectService, config],
);
const onReadMoreClick = useCallback(async () => {
await getConnectService().recordEventAppendLearnMore();
}, [getConnectService, config]);
const handleCredentialExistsError = useCallback(
async (attestationOptions: string, error?: ConnectError) => {
log.debug('error (credential-exists)');
await getConnectService().recordEventAppendCredentialExistsError(error?.track() ?? '', attestationOptions);
void config.onComplete('complete-noop', getConnectService().encodeClientState());
},
[getConnectService, config],
);
const contextValue = useMemo<AppendProcessContextProps>(
() => ({
currentScreenType,
currentScreenOptions,
navigateToScreen,
config,
handleErrorSoft,
handleErrorHard,
handleCredentialExistsError,
handleSkip,
onReadMoreClick,
flags,
setFlags,
}),
[currentScreenType, navigateToScreen, config, flags],
);
return <AppendProcessContext.Provider value={contextValue}>{children}</AppendProcessContext.Provider>;
};
export default AppendProcessProvider;