@tryfinch/react-connect 3.7.0 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/index.d.ts +20 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +50 -27
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +50 -27
- package/dist/index.js.map +1 -1
- package/example/src/App.tsx +1 -0
- package/package.json +1 -1
- package/src/index.ts +99 -44
package/README.md
CHANGED
|
@@ -18,7 +18,13 @@ const App = () => {
|
|
|
18
18
|
const [code, setCode] = useState(null);
|
|
19
19
|
|
|
20
20
|
const onSuccess = ({ code }) => setCode(code);
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* @param {string} errorMessage - The error message
|
|
23
|
+
* @param {'validation_error' | 'employer_error'} errorType - The type of error
|
|
24
|
+
* - 'validation_error': Finch Connect failed to open due to validation error
|
|
25
|
+
* - 'employer_connection_error': The errors employers see within the Finch Connect flow
|
|
26
|
+
*/
|
|
27
|
+
const onError = ({ errorMessage, errorType }) => console.error(errorMessage, errorType);
|
|
22
28
|
const onClose = () => console.log('User exited Finch Connect');
|
|
23
29
|
|
|
24
30
|
const { open } = useFinchConnect({
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,41 @@
|
|
|
1
1
|
export type SuccessEvent = {
|
|
2
2
|
code: string;
|
|
3
3
|
state?: string;
|
|
4
|
+
idpRedirectUri?: string;
|
|
4
5
|
};
|
|
6
|
+
type ErrorType = 'validation_error' | 'employer_connection_error';
|
|
5
7
|
export type ErrorEvent = {
|
|
6
8
|
errorMessage: string;
|
|
9
|
+
errorType?: ErrorType;
|
|
7
10
|
};
|
|
8
11
|
export type Sandbox = 'finch' /** This is to enable the new Finch (simulated) Sandbox */ | 'provider' /** This is to enable the new Provider Sandbox */ | boolean /** This is the old sandbox flag retained for backwards compatibility */;
|
|
9
|
-
|
|
10
|
-
category: string | null;
|
|
11
|
-
clientId: string;
|
|
12
|
-
manual: boolean;
|
|
12
|
+
type BaseConnectOptions = {
|
|
13
13
|
state: string | null;
|
|
14
14
|
onSuccess: (e: SuccessEvent) => void;
|
|
15
15
|
onError: (e: ErrorEvent) => void;
|
|
16
16
|
onClose: () => void;
|
|
17
|
-
payrollProvider: string | null;
|
|
18
|
-
products: string[];
|
|
19
|
-
sandbox: Sandbox;
|
|
20
17
|
zIndex: number;
|
|
21
18
|
apiConfig?: {
|
|
22
19
|
connectUrl: string;
|
|
23
20
|
redirectUrl: string;
|
|
24
21
|
};
|
|
25
22
|
};
|
|
26
|
-
type
|
|
23
|
+
type ConnectOptionsWithSessionId = BaseConnectOptions & {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
products?: string[];
|
|
26
|
+
};
|
|
27
|
+
type ConnectOptionsWithClientId = BaseConnectOptions & {
|
|
28
|
+
category: string | null;
|
|
29
|
+
clientId: string;
|
|
30
|
+
manual: boolean;
|
|
31
|
+
payrollProvider: string | null;
|
|
32
|
+
products: string[];
|
|
33
|
+
clientName?: string;
|
|
34
|
+
connectionId?: string;
|
|
35
|
+
sandbox: Sandbox;
|
|
36
|
+
};
|
|
37
|
+
export type ConnectOptions = ConnectOptionsWithSessionId | ConnectOptionsWithClientId;
|
|
38
|
+
type OpenFn = (overrides?: Partial<ConnectOptions>) => void;
|
|
27
39
|
export declare const useFinchConnect: (options: Partial<ConnectOptions>) => {
|
|
28
40
|
open: OpenFn;
|
|
29
41
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,SAAS,GAAG,kBAAkB,GAAG,2BAA2B,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,0DAA0D,GAClE,UAAU,CAAC,iDAAiD,GAC5D,OAAO,CAAC,wEAAwE,CAAC;AAErF,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,KAAK,2BAA2B,GAAG,kBAAkB,GAAG;IAEtD,SAAS,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,0BAA0B,GAAG,kBAAkB,GAAG;IACrD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,2BAA2B,GAAG,0BAA0B,CAAC;AAEtF,KAAK,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;AA0G5D,eAAO,MAAM,eAAe,YAAa,QAAQ,cAAc,CAAC;UAAW,MAAM;CA+GhF,CAAC"}
|
package/dist/index.es.js
CHANGED
|
@@ -1,54 +1,69 @@
|
|
|
1
1
|
import { useRef, useEffect } from 'react';
|
|
2
2
|
|
|
3
|
+
const POST_MESSAGE_NAME = 'finch-auth-message-v2';
|
|
3
4
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
4
5
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
5
6
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
6
|
-
const
|
|
7
|
-
const
|
|
7
|
+
const constructAuthUrl = (connectOptions) => {
|
|
8
|
+
const { state, apiConfig } = connectOptions;
|
|
8
9
|
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
9
10
|
const REDIRECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.redirectUrl) || DEFAULT_FINCH_REDIRECT_URI;
|
|
10
11
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
if ('sessionId' in connectOptions) {
|
|
13
|
+
const { sessionId, products } = connectOptions;
|
|
14
|
+
authUrl.searchParams.append('session', sessionId);
|
|
15
|
+
if (products)
|
|
16
|
+
authUrl.searchParams.append('products', products.join(' '));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const { clientId, payrollProvider, category, products, manual, sandbox, clientName, connectionId, } = connectOptions;
|
|
20
|
+
if (clientId)
|
|
21
|
+
authUrl.searchParams.append('client_id', clientId);
|
|
22
|
+
if (payrollProvider)
|
|
23
|
+
authUrl.searchParams.append('payroll_provider', payrollProvider);
|
|
24
|
+
if (category)
|
|
25
|
+
authUrl.searchParams.append('category', category);
|
|
26
|
+
if (clientName)
|
|
27
|
+
authUrl.searchParams.append('client_name', clientName);
|
|
28
|
+
if (connectionId)
|
|
29
|
+
authUrl.searchParams.append('connection_id', connectionId);
|
|
30
|
+
authUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
31
|
+
if (manual)
|
|
32
|
+
authUrl.searchParams.append('manual', String(manual));
|
|
33
|
+
if (sandbox)
|
|
34
|
+
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
35
|
+
}
|
|
18
36
|
authUrl.searchParams.append('app_type', 'spa');
|
|
19
37
|
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
20
38
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
21
39
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
22
40
|
authUrl.searchParams.append('mode', 'employer');
|
|
23
|
-
if (manual)
|
|
24
|
-
authUrl.searchParams.append('manual', String(manual));
|
|
25
|
-
if (sandbox)
|
|
26
|
-
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
27
41
|
if (state)
|
|
28
42
|
authUrl.searchParams.append('state', state);
|
|
29
43
|
// replace with actual SDK version by rollup
|
|
30
|
-
authUrl.searchParams.append('sdk_version', 'react-3.
|
|
44
|
+
authUrl.searchParams.append('sdk_version', 'react-3.13.0');
|
|
31
45
|
return authUrl.href;
|
|
32
46
|
};
|
|
33
47
|
const noop = () => {
|
|
34
48
|
// intentionally empty
|
|
35
49
|
};
|
|
36
|
-
const
|
|
37
|
-
category: null,
|
|
38
|
-
manual: false,
|
|
50
|
+
const BASE_DEFAULTS = {
|
|
39
51
|
onSuccess: noop,
|
|
40
52
|
onError: noop,
|
|
41
53
|
onClose: noop,
|
|
42
|
-
payrollProvider: null,
|
|
43
|
-
products: [],
|
|
44
|
-
sandbox: false,
|
|
45
54
|
state: null,
|
|
46
55
|
zIndex: 999,
|
|
47
56
|
};
|
|
57
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { clientId: '', category: null, manual: false, payrollProvider: null, products: [], clientName: undefined, sandbox: false });
|
|
58
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { sessionId: '' });
|
|
48
59
|
let isUseFinchConnectInitialized = false;
|
|
49
60
|
const useFinchConnect = (options) => {
|
|
50
|
-
if (!options
|
|
51
|
-
throw new Error('must specify clientId in options for useFinchConnect');
|
|
61
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
62
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
63
|
+
}
|
|
64
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
65
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
66
|
+
}
|
|
52
67
|
const isHookMounted = useRef(false);
|
|
53
68
|
useEffect(() => {
|
|
54
69
|
if (!isHookMounted.current) {
|
|
@@ -61,7 +76,8 @@ const useFinchConnect = (options) => {
|
|
|
61
76
|
isHookMounted.current = true;
|
|
62
77
|
}
|
|
63
78
|
}, []);
|
|
64
|
-
const combinedOptions =
|
|
79
|
+
const combinedOptions = 'sessionId' in options
|
|
80
|
+
? Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_SESSION_ID), options) : Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_CLIENT_ID), options);
|
|
65
81
|
const open = (overrides) => {
|
|
66
82
|
const openOptions = Object.assign(Object.assign({}, combinedOptions), overrides);
|
|
67
83
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
@@ -90,26 +106,33 @@ const useFinchConnect = (options) => {
|
|
|
90
106
|
};
|
|
91
107
|
useEffect(() => {
|
|
92
108
|
function handleFinchAuth(event) {
|
|
93
|
-
var _a;
|
|
109
|
+
var _a, _b, _c, _d;
|
|
94
110
|
const CONNECT_URL = ((_a = combinedOptions.apiConfig) === null || _a === void 0 ? void 0 : _a.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
95
111
|
if (!event.data)
|
|
96
112
|
return;
|
|
97
|
-
if (event.data.name !==
|
|
113
|
+
if (event.data.name !== POST_MESSAGE_NAME)
|
|
98
114
|
return;
|
|
99
115
|
if (!event.origin.startsWith(CONNECT_URL))
|
|
100
116
|
return;
|
|
101
|
-
|
|
117
|
+
if (event.data.kind !== 'error')
|
|
118
|
+
close();
|
|
102
119
|
switch (event.data.kind) {
|
|
103
120
|
case 'closed':
|
|
104
121
|
combinedOptions.onClose();
|
|
105
122
|
break;
|
|
106
123
|
case 'error':
|
|
107
|
-
|
|
124
|
+
if ((_b = event.data.error) === null || _b === void 0 ? void 0 : _b.shouldClose)
|
|
125
|
+
close();
|
|
126
|
+
combinedOptions.onError({
|
|
127
|
+
errorMessage: (_c = event.data.error) === null || _c === void 0 ? void 0 : _c.message,
|
|
128
|
+
errorType: (_d = event.data.error) === null || _d === void 0 ? void 0 : _d.type,
|
|
129
|
+
});
|
|
108
130
|
break;
|
|
109
131
|
case 'success':
|
|
110
132
|
combinedOptions.onSuccess({
|
|
111
133
|
code: event.data.code,
|
|
112
134
|
state: event.data.state,
|
|
135
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
113
136
|
});
|
|
114
137
|
break;
|
|
115
138
|
default: {
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,55 +4,70 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
|
+
const POST_MESSAGE_NAME = 'finch-auth-message-v2';
|
|
7
8
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
8
9
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
9
10
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
10
|
-
const
|
|
11
|
-
const
|
|
11
|
+
const constructAuthUrl = (connectOptions) => {
|
|
12
|
+
const { state, apiConfig } = connectOptions;
|
|
12
13
|
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
13
14
|
const REDIRECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.redirectUrl) || DEFAULT_FINCH_REDIRECT_URI;
|
|
14
15
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
if ('sessionId' in connectOptions) {
|
|
17
|
+
const { sessionId, products } = connectOptions;
|
|
18
|
+
authUrl.searchParams.append('session', sessionId);
|
|
19
|
+
if (products)
|
|
20
|
+
authUrl.searchParams.append('products', products.join(' '));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const { clientId, payrollProvider, category, products, manual, sandbox, clientName, connectionId, } = connectOptions;
|
|
24
|
+
if (clientId)
|
|
25
|
+
authUrl.searchParams.append('client_id', clientId);
|
|
26
|
+
if (payrollProvider)
|
|
27
|
+
authUrl.searchParams.append('payroll_provider', payrollProvider);
|
|
28
|
+
if (category)
|
|
29
|
+
authUrl.searchParams.append('category', category);
|
|
30
|
+
if (clientName)
|
|
31
|
+
authUrl.searchParams.append('client_name', clientName);
|
|
32
|
+
if (connectionId)
|
|
33
|
+
authUrl.searchParams.append('connection_id', connectionId);
|
|
34
|
+
authUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
35
|
+
if (manual)
|
|
36
|
+
authUrl.searchParams.append('manual', String(manual));
|
|
37
|
+
if (sandbox)
|
|
38
|
+
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
39
|
+
}
|
|
22
40
|
authUrl.searchParams.append('app_type', 'spa');
|
|
23
41
|
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
24
42
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
25
43
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
26
44
|
authUrl.searchParams.append('mode', 'employer');
|
|
27
|
-
if (manual)
|
|
28
|
-
authUrl.searchParams.append('manual', String(manual));
|
|
29
|
-
if (sandbox)
|
|
30
|
-
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
31
45
|
if (state)
|
|
32
46
|
authUrl.searchParams.append('state', state);
|
|
33
47
|
// replace with actual SDK version by rollup
|
|
34
|
-
authUrl.searchParams.append('sdk_version', 'react-3.
|
|
48
|
+
authUrl.searchParams.append('sdk_version', 'react-3.13.0');
|
|
35
49
|
return authUrl.href;
|
|
36
50
|
};
|
|
37
51
|
const noop = () => {
|
|
38
52
|
// intentionally empty
|
|
39
53
|
};
|
|
40
|
-
const
|
|
41
|
-
category: null,
|
|
42
|
-
manual: false,
|
|
54
|
+
const BASE_DEFAULTS = {
|
|
43
55
|
onSuccess: noop,
|
|
44
56
|
onError: noop,
|
|
45
57
|
onClose: noop,
|
|
46
|
-
payrollProvider: null,
|
|
47
|
-
products: [],
|
|
48
|
-
sandbox: false,
|
|
49
58
|
state: null,
|
|
50
59
|
zIndex: 999,
|
|
51
60
|
};
|
|
61
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { clientId: '', category: null, manual: false, payrollProvider: null, products: [], clientName: undefined, sandbox: false });
|
|
62
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { sessionId: '' });
|
|
52
63
|
let isUseFinchConnectInitialized = false;
|
|
53
64
|
const useFinchConnect = (options) => {
|
|
54
|
-
if (!options
|
|
55
|
-
throw new Error('must specify clientId in options for useFinchConnect');
|
|
65
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
66
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
67
|
+
}
|
|
68
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
69
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
70
|
+
}
|
|
56
71
|
const isHookMounted = react.useRef(false);
|
|
57
72
|
react.useEffect(() => {
|
|
58
73
|
if (!isHookMounted.current) {
|
|
@@ -65,7 +80,8 @@ const useFinchConnect = (options) => {
|
|
|
65
80
|
isHookMounted.current = true;
|
|
66
81
|
}
|
|
67
82
|
}, []);
|
|
68
|
-
const combinedOptions =
|
|
83
|
+
const combinedOptions = 'sessionId' in options
|
|
84
|
+
? Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_SESSION_ID), options) : Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_CLIENT_ID), options);
|
|
69
85
|
const open = (overrides) => {
|
|
70
86
|
const openOptions = Object.assign(Object.assign({}, combinedOptions), overrides);
|
|
71
87
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
@@ -94,26 +110,33 @@ const useFinchConnect = (options) => {
|
|
|
94
110
|
};
|
|
95
111
|
react.useEffect(() => {
|
|
96
112
|
function handleFinchAuth(event) {
|
|
97
|
-
var _a;
|
|
113
|
+
var _a, _b, _c, _d;
|
|
98
114
|
const CONNECT_URL = ((_a = combinedOptions.apiConfig) === null || _a === void 0 ? void 0 : _a.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
99
115
|
if (!event.data)
|
|
100
116
|
return;
|
|
101
|
-
if (event.data.name !==
|
|
117
|
+
if (event.data.name !== POST_MESSAGE_NAME)
|
|
102
118
|
return;
|
|
103
119
|
if (!event.origin.startsWith(CONNECT_URL))
|
|
104
120
|
return;
|
|
105
|
-
|
|
121
|
+
if (event.data.kind !== 'error')
|
|
122
|
+
close();
|
|
106
123
|
switch (event.data.kind) {
|
|
107
124
|
case 'closed':
|
|
108
125
|
combinedOptions.onClose();
|
|
109
126
|
break;
|
|
110
127
|
case 'error':
|
|
111
|
-
|
|
128
|
+
if ((_b = event.data.error) === null || _b === void 0 ? void 0 : _b.shouldClose)
|
|
129
|
+
close();
|
|
130
|
+
combinedOptions.onError({
|
|
131
|
+
errorMessage: (_c = event.data.error) === null || _c === void 0 ? void 0 : _c.message,
|
|
132
|
+
errorType: (_d = event.data.error) === null || _d === void 0 ? void 0 : _d.type,
|
|
133
|
+
});
|
|
112
134
|
break;
|
|
113
135
|
case 'success':
|
|
114
136
|
combinedOptions.onSuccess({
|
|
115
137
|
code: event.data.code,
|
|
116
138
|
state: event.data.state,
|
|
139
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
117
140
|
});
|
|
118
141
|
break;
|
|
119
142
|
default: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/src/index.ts"],"sourcesContent":[null],"names":["useRef","useEffect"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/src/index.ts"],"sourcesContent":[null],"names":["useRef","useEffect"],"mappings":"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"}
|
package/example/src/App.tsx
CHANGED
|
@@ -19,6 +19,7 @@ const App = () => {
|
|
|
19
19
|
// For 'sandbox`, omit or use 'false' if in production. Use "finch" or "provider" for sandbox testing, depending on test plan. See Finch's [documentation](https://developer.tryfinch.com/implementation-guide/Test/Testing-Plan) for an overview of Finch and Provider sandboxes.
|
|
20
20
|
// sandbox: false,
|
|
21
21
|
// payrollProvider: '<payroll-provider-id>',
|
|
22
|
+
//connectionId: '<connection-id>', // Used for reauth of an existing connection
|
|
22
23
|
onSuccess,
|
|
23
24
|
onError,
|
|
24
25
|
onClose,
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
2
|
|
|
3
|
+
type HasKey<T, K extends PropertyKey> = T extends Record<K, unknown> ? T : never;
|
|
4
|
+
|
|
3
5
|
export type SuccessEvent = {
|
|
4
6
|
code: string;
|
|
5
7
|
state?: string;
|
|
8
|
+
idpRedirectUri?: string;
|
|
6
9
|
};
|
|
7
10
|
|
|
11
|
+
type ErrorType = 'validation_error' | 'employer_connection_error';
|
|
12
|
+
|
|
8
13
|
export type ErrorEvent = {
|
|
9
14
|
errorMessage: string;
|
|
15
|
+
errorType?: ErrorType;
|
|
10
16
|
};
|
|
11
17
|
|
|
12
18
|
export type Sandbox =
|
|
@@ -14,17 +20,11 @@ export type Sandbox =
|
|
|
14
20
|
| 'provider' /** This is to enable the new Provider Sandbox */
|
|
15
21
|
| boolean /** This is the old sandbox flag retained for backwards compatibility */;
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
category: string | null;
|
|
19
|
-
clientId: string;
|
|
20
|
-
manual: boolean;
|
|
23
|
+
type BaseConnectOptions = {
|
|
21
24
|
state: string | null;
|
|
22
25
|
onSuccess: (e: SuccessEvent) => void;
|
|
23
26
|
onError: (e: ErrorEvent) => void;
|
|
24
27
|
onClose: () => void;
|
|
25
|
-
payrollProvider: string | null;
|
|
26
|
-
products: string[];
|
|
27
|
-
sandbox: Sandbox;
|
|
28
28
|
zIndex: number;
|
|
29
29
|
apiConfig?: {
|
|
30
30
|
connectUrl: string;
|
|
@@ -32,11 +32,29 @@ export type ConnectOptions = {
|
|
|
32
32
|
};
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
type
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
type ConnectOptionsWithSessionId = BaseConnectOptions & {
|
|
36
|
+
// Use this option if you have a Finch Connect sessionID from the IDP redirect flow
|
|
37
|
+
sessionId: string;
|
|
38
|
+
// Allow for overriding products for the session
|
|
39
|
+
products?: string[];
|
|
40
|
+
};
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
type ConnectOptionsWithClientId = BaseConnectOptions & {
|
|
43
|
+
category: string | null;
|
|
44
|
+
clientId: string;
|
|
45
|
+
manual: boolean;
|
|
46
|
+
payrollProvider: string | null;
|
|
47
|
+
products: string[];
|
|
48
|
+
clientName?: string;
|
|
49
|
+
connectionId?: string;
|
|
50
|
+
sandbox: Sandbox;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export type ConnectOptions = ConnectOptionsWithSessionId | ConnectOptionsWithClientId;
|
|
54
|
+
|
|
55
|
+
type OpenFn = (overrides?: Partial<ConnectOptions>) => void;
|
|
56
|
+
|
|
57
|
+
const POST_MESSAGE_NAME = 'finch-auth-message-v2' as const;
|
|
40
58
|
|
|
41
59
|
type FinchConnectAuthMessage = { name: typeof POST_MESSAGE_NAME } & (
|
|
42
60
|
| {
|
|
@@ -46,10 +64,11 @@ type FinchConnectAuthMessage = { name: typeof POST_MESSAGE_NAME } & (
|
|
|
46
64
|
kind: 'success';
|
|
47
65
|
code: string;
|
|
48
66
|
state?: string;
|
|
67
|
+
idpRedirectUri?: string;
|
|
49
68
|
}
|
|
50
69
|
| {
|
|
51
70
|
kind: 'error';
|
|
52
|
-
error: string;
|
|
71
|
+
error: { shouldClose: boolean; message: string; type: ErrorType };
|
|
53
72
|
}
|
|
54
73
|
);
|
|
55
74
|
|
|
@@ -62,33 +81,46 @@ const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
|
62
81
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
63
82
|
|
|
64
83
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
payrollProvider,
|
|
70
|
-
category,
|
|
71
|
-
products,
|
|
72
|
-
manual,
|
|
73
|
-
sandbox,
|
|
74
|
-
state,
|
|
75
|
-
apiConfig,
|
|
76
|
-
}: Partial<ConnectOptions>) => {
|
|
84
|
+
|
|
85
|
+
const constructAuthUrl = (connectOptions: ConnectOptions) => {
|
|
86
|
+
const { state, apiConfig } = connectOptions;
|
|
87
|
+
|
|
77
88
|
const CONNECT_URL = apiConfig?.connectUrl || BASE_FINCH_CONNECT_URI;
|
|
78
89
|
const REDIRECT_URL = apiConfig?.redirectUrl || DEFAULT_FINCH_REDIRECT_URI;
|
|
79
90
|
|
|
80
91
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
81
|
-
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
92
|
+
|
|
93
|
+
if ('sessionId' in connectOptions) {
|
|
94
|
+
const { sessionId, products } = connectOptions;
|
|
95
|
+
authUrl.searchParams.append('session', sessionId);
|
|
96
|
+
if (products) authUrl.searchParams.append('products', products.join(' '));
|
|
97
|
+
} else {
|
|
98
|
+
const {
|
|
99
|
+
clientId,
|
|
100
|
+
payrollProvider,
|
|
101
|
+
category,
|
|
102
|
+
products,
|
|
103
|
+
manual,
|
|
104
|
+
sandbox,
|
|
105
|
+
clientName,
|
|
106
|
+
connectionId,
|
|
107
|
+
} = connectOptions;
|
|
108
|
+
|
|
109
|
+
if (clientId) authUrl.searchParams.append('client_id', clientId);
|
|
110
|
+
if (payrollProvider) authUrl.searchParams.append('payroll_provider', payrollProvider);
|
|
111
|
+
if (category) authUrl.searchParams.append('category', category);
|
|
112
|
+
if (clientName) authUrl.searchParams.append('client_name', clientName);
|
|
113
|
+
if (connectionId) authUrl.searchParams.append('connection_id', connectionId);
|
|
114
|
+
authUrl.searchParams.append('products', (products ?? []).join(' '));
|
|
115
|
+
if (manual) authUrl.searchParams.append('manual', String(manual));
|
|
116
|
+
if (sandbox) authUrl.searchParams.append('sandbox', String(sandbox));
|
|
117
|
+
}
|
|
118
|
+
|
|
85
119
|
authUrl.searchParams.append('app_type', 'spa');
|
|
86
120
|
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
87
121
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
88
122
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
89
123
|
authUrl.searchParams.append('mode', 'employer');
|
|
90
|
-
if (manual) authUrl.searchParams.append('manual', String(manual));
|
|
91
|
-
if (sandbox) authUrl.searchParams.append('sandbox', String(sandbox));
|
|
92
124
|
if (state) authUrl.searchParams.append('state', state);
|
|
93
125
|
// replace with actual SDK version by rollup
|
|
94
126
|
authUrl.searchParams.append('sdk_version', 'react-SDK_VERSION');
|
|
@@ -100,23 +132,41 @@ const noop = () => {
|
|
|
100
132
|
// intentionally empty
|
|
101
133
|
};
|
|
102
134
|
|
|
103
|
-
const
|
|
104
|
-
category: null,
|
|
105
|
-
manual: false,
|
|
135
|
+
const BASE_DEFAULTS = {
|
|
106
136
|
onSuccess: noop,
|
|
107
137
|
onError: noop,
|
|
108
138
|
onClose: noop,
|
|
139
|
+
state: null,
|
|
140
|
+
zIndex: 999,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID: HasKey<ConnectOptions, 'clientId'> = {
|
|
144
|
+
...BASE_DEFAULTS,
|
|
145
|
+
clientId: '',
|
|
146
|
+
category: null,
|
|
147
|
+
manual: false,
|
|
109
148
|
payrollProvider: null,
|
|
110
149
|
products: [],
|
|
150
|
+
clientName: undefined,
|
|
111
151
|
sandbox: false,
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID: HasKey<ConnectOptions, 'sessionId'> = {
|
|
155
|
+
...BASE_DEFAULTS,
|
|
156
|
+
sessionId: '',
|
|
114
157
|
};
|
|
115
158
|
|
|
116
159
|
let isUseFinchConnectInitialized = false;
|
|
117
160
|
|
|
118
161
|
export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenFn } => {
|
|
119
|
-
if (!options
|
|
162
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
163
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
167
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
168
|
+
}
|
|
169
|
+
|
|
120
170
|
const isHookMounted = useRef(false);
|
|
121
171
|
|
|
122
172
|
useEffect(() => {
|
|
@@ -133,11 +183,10 @@ export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenF
|
|
|
133
183
|
}
|
|
134
184
|
}, []);
|
|
135
185
|
|
|
136
|
-
const combinedOptions: ConnectOptions =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
};
|
|
186
|
+
const combinedOptions: ConnectOptions =
|
|
187
|
+
'sessionId' in options
|
|
188
|
+
? { ...DEFAULT_OPTIONS_WITH_SESSION_ID, ...options }
|
|
189
|
+
: { ...DEFAULT_OPTIONS_WITH_CLIENT_ID, ...options };
|
|
141
190
|
|
|
142
191
|
const open: OpenFn = (overrides) => {
|
|
143
192
|
const openOptions: ConnectOptions = {
|
|
@@ -175,22 +224,28 @@ export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenF
|
|
|
175
224
|
const CONNECT_URL = combinedOptions.apiConfig?.connectUrl || BASE_FINCH_CONNECT_URI;
|
|
176
225
|
|
|
177
226
|
if (!event.data) return;
|
|
178
|
-
if (event.data.name !==
|
|
227
|
+
if (event.data.name !== POST_MESSAGE_NAME) return;
|
|
179
228
|
if (!event.origin.startsWith(CONNECT_URL)) return;
|
|
180
229
|
|
|
181
|
-
close();
|
|
230
|
+
if (event.data.kind !== 'error') close();
|
|
182
231
|
|
|
183
232
|
switch (event.data.kind) {
|
|
184
233
|
case 'closed':
|
|
185
234
|
combinedOptions.onClose();
|
|
186
235
|
break;
|
|
187
236
|
case 'error':
|
|
188
|
-
|
|
237
|
+
if (event.data.error?.shouldClose) close();
|
|
238
|
+
|
|
239
|
+
combinedOptions.onError({
|
|
240
|
+
errorMessage: event.data.error?.message,
|
|
241
|
+
errorType: event.data.error?.type,
|
|
242
|
+
});
|
|
189
243
|
break;
|
|
190
244
|
case 'success':
|
|
191
245
|
combinedOptions.onSuccess({
|
|
192
246
|
code: event.data.code,
|
|
193
247
|
state: event.data.state,
|
|
248
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
194
249
|
});
|
|
195
250
|
break;
|
|
196
251
|
default: {
|