@tryfinch/react-connect 3.6.1 → 3.11.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 +1 -0
- package/dist/index.d.ts +19 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +44 -31
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +44 -31
- package/dist/index.js.map +1 -1
- package/example/src/App.tsx +27 -10
- package/package.json +1 -1
- package/src/index.ts +91 -54
package/README.md
CHANGED
|
@@ -27,6 +27,7 @@ const App = () => {
|
|
|
27
27
|
products: ['company', 'directory'],
|
|
28
28
|
// Check Finch's [documentation](https://developer.tryfinch.com/docs/reference/96f5be9e0ec1a-providers) for the full list of payroll provider IDs
|
|
29
29
|
// payrollProvider: '<payroll-provider-id>',
|
|
30
|
+
// 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.
|
|
30
31
|
// sandbox: false,
|
|
31
32
|
// manual: false,
|
|
32
33
|
// zIndex: 999,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
export type SuccessEvent = {
|
|
2
2
|
code: string;
|
|
3
3
|
state?: string;
|
|
4
|
+
idpRedirectUri?: string;
|
|
4
5
|
};
|
|
5
6
|
export type ErrorEvent = {
|
|
6
7
|
errorMessage: string;
|
|
7
8
|
};
|
|
8
9
|
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;
|
|
10
|
+
type BaseConnectOptions = {
|
|
13
11
|
state: string | null;
|
|
14
12
|
onSuccess: (e: SuccessEvent) => void;
|
|
15
13
|
onError: (e: ErrorEvent) => void;
|
|
16
14
|
onClose: () => void;
|
|
15
|
+
zIndex: number;
|
|
16
|
+
apiConfig?: {
|
|
17
|
+
connectUrl: string;
|
|
18
|
+
redirectUrl: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
type ConnectOptionsWithSessionId = BaseConnectOptions & {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
products?: string[];
|
|
24
|
+
};
|
|
25
|
+
type ConnectOptionsWithClientId = BaseConnectOptions & {
|
|
26
|
+
category: string | null;
|
|
27
|
+
clientId: string;
|
|
28
|
+
manual: boolean;
|
|
17
29
|
payrollProvider: string | null;
|
|
18
30
|
products: string[];
|
|
31
|
+
clientName?: string;
|
|
19
32
|
sandbox: Sandbox;
|
|
20
|
-
zIndex: number;
|
|
21
|
-
finchDevMode?: boolean;
|
|
22
33
|
};
|
|
23
|
-
type
|
|
34
|
+
export type ConnectOptions = ConnectOptionsWithSessionId | ConnectOptionsWithClientId;
|
|
35
|
+
type OpenFn = (overrides?: Partial<ConnectOptions>) => void;
|
|
24
36
|
export declare const useFinchConnect: (options: Partial<ConnectOptions>) => {
|
|
25
37
|
open: OpenFn;
|
|
26
38
|
};
|
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,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,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,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;AAyG5D,eAAO,MAAM,eAAe,YAAa,QAAQ,cAAc,CAAC;UAAW,MAAM;CA0GhF,CAAC"}
|
package/dist/index.es.js
CHANGED
|
@@ -2,55 +2,66 @@ import { useRef, useEffect } from 'react';
|
|
|
2
2
|
|
|
3
3
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
4
4
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
5
|
-
const DEV_FINCH_CONNECT_URI = 'http://localhost:3000';
|
|
6
|
-
const DEV_DEFAULT_FINCH_REDIRECT_URI = 'http://localhost:4001';
|
|
7
5
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
8
6
|
const FINCH_AUTH_MESSAGE_NAME = 'finch-auth-message';
|
|
9
|
-
const constructAuthUrl = (
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
const constructAuthUrl = (connectOptions) => {
|
|
8
|
+
const { state, apiConfig } = connectOptions;
|
|
9
|
+
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
10
|
+
const REDIRECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.redirectUrl) || DEFAULT_FINCH_REDIRECT_URI;
|
|
11
|
+
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
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, } = 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
|
+
authUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
29
|
+
if (manual)
|
|
30
|
+
authUrl.searchParams.append('manual', String(manual));
|
|
31
|
+
if (sandbox)
|
|
32
|
+
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
33
|
+
}
|
|
19
34
|
authUrl.searchParams.append('app_type', 'spa');
|
|
20
|
-
authUrl.searchParams.append('redirect_uri',
|
|
35
|
+
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
21
36
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
22
37
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
23
38
|
authUrl.searchParams.append('mode', 'employer');
|
|
24
|
-
if (manual)
|
|
25
|
-
authUrl.searchParams.append('manual', String(manual));
|
|
26
|
-
if (sandbox)
|
|
27
|
-
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
28
39
|
if (state)
|
|
29
40
|
authUrl.searchParams.append('state', state);
|
|
30
41
|
// replace with actual SDK version by rollup
|
|
31
|
-
authUrl.searchParams.append('sdk_version', 'react-3.
|
|
42
|
+
authUrl.searchParams.append('sdk_version', 'react-3.11.0');
|
|
32
43
|
return authUrl.href;
|
|
33
44
|
};
|
|
34
45
|
const noop = () => {
|
|
35
46
|
// intentionally empty
|
|
36
47
|
};
|
|
37
|
-
const
|
|
38
|
-
category: null,
|
|
39
|
-
manual: false,
|
|
48
|
+
const BASE_DEFAULTS = {
|
|
40
49
|
onSuccess: noop,
|
|
41
50
|
onError: noop,
|
|
42
51
|
onClose: noop,
|
|
43
|
-
payrollProvider: null,
|
|
44
|
-
products: [],
|
|
45
|
-
sandbox: false,
|
|
46
52
|
state: null,
|
|
47
53
|
zIndex: 999,
|
|
48
|
-
finchDevMode: false,
|
|
49
54
|
};
|
|
55
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { clientId: '', category: null, manual: false, payrollProvider: null, products: [], clientName: undefined, sandbox: false });
|
|
56
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { sessionId: '' });
|
|
50
57
|
let isUseFinchConnectInitialized = false;
|
|
51
58
|
const useFinchConnect = (options) => {
|
|
52
|
-
if (!options
|
|
53
|
-
throw new Error('must specify clientId in options for useFinchConnect');
|
|
59
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
60
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
61
|
+
}
|
|
62
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
63
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
64
|
+
}
|
|
54
65
|
const isHookMounted = useRef(false);
|
|
55
66
|
useEffect(() => {
|
|
56
67
|
if (!isHookMounted.current) {
|
|
@@ -63,7 +74,8 @@ const useFinchConnect = (options) => {
|
|
|
63
74
|
isHookMounted.current = true;
|
|
64
75
|
}
|
|
65
76
|
}, []);
|
|
66
|
-
const combinedOptions =
|
|
77
|
+
const combinedOptions = 'sessionId' in options
|
|
78
|
+
? Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_SESSION_ID), options) : Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_CLIENT_ID), options);
|
|
67
79
|
const open = (overrides) => {
|
|
68
80
|
const openOptions = Object.assign(Object.assign({}, combinedOptions), overrides);
|
|
69
81
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
@@ -92,13 +104,13 @@ const useFinchConnect = (options) => {
|
|
|
92
104
|
};
|
|
93
105
|
useEffect(() => {
|
|
94
106
|
function handleFinchAuth(event) {
|
|
95
|
-
|
|
96
|
-
const
|
|
107
|
+
var _a;
|
|
108
|
+
const CONNECT_URL = ((_a = combinedOptions.apiConfig) === null || _a === void 0 ? void 0 : _a.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
97
109
|
if (!event.data)
|
|
98
110
|
return;
|
|
99
111
|
if (event.data.name !== FINCH_AUTH_MESSAGE_NAME)
|
|
100
112
|
return;
|
|
101
|
-
if (!event.origin.startsWith(
|
|
113
|
+
if (!event.origin.startsWith(CONNECT_URL))
|
|
102
114
|
return;
|
|
103
115
|
close();
|
|
104
116
|
switch (event.data.kind) {
|
|
@@ -112,6 +124,7 @@ const useFinchConnect = (options) => {
|
|
|
112
124
|
combinedOptions.onSuccess({
|
|
113
125
|
code: event.data.code,
|
|
114
126
|
state: event.data.state,
|
|
127
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
115
128
|
});
|
|
116
129
|
break;
|
|
117
130
|
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
|
@@ -6,55 +6,66 @@ var react = require('react');
|
|
|
6
6
|
|
|
7
7
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
8
8
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
9
|
-
const DEV_FINCH_CONNECT_URI = 'http://localhost:3000';
|
|
10
|
-
const DEV_DEFAULT_FINCH_REDIRECT_URI = 'http://localhost:4001';
|
|
11
9
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
12
10
|
const FINCH_AUTH_MESSAGE_NAME = 'finch-auth-message';
|
|
13
|
-
const constructAuthUrl = (
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
const constructAuthUrl = (connectOptions) => {
|
|
12
|
+
const { state, apiConfig } = connectOptions;
|
|
13
|
+
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
14
|
+
const REDIRECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.redirectUrl) || DEFAULT_FINCH_REDIRECT_URI;
|
|
15
|
+
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
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, } = 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
|
+
authUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
33
|
+
if (manual)
|
|
34
|
+
authUrl.searchParams.append('manual', String(manual));
|
|
35
|
+
if (sandbox)
|
|
36
|
+
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
37
|
+
}
|
|
23
38
|
authUrl.searchParams.append('app_type', 'spa');
|
|
24
|
-
authUrl.searchParams.append('redirect_uri',
|
|
39
|
+
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
25
40
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
26
41
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
27
42
|
authUrl.searchParams.append('mode', 'employer');
|
|
28
|
-
if (manual)
|
|
29
|
-
authUrl.searchParams.append('manual', String(manual));
|
|
30
|
-
if (sandbox)
|
|
31
|
-
authUrl.searchParams.append('sandbox', String(sandbox));
|
|
32
43
|
if (state)
|
|
33
44
|
authUrl.searchParams.append('state', state);
|
|
34
45
|
// replace with actual SDK version by rollup
|
|
35
|
-
authUrl.searchParams.append('sdk_version', 'react-3.
|
|
46
|
+
authUrl.searchParams.append('sdk_version', 'react-3.11.0');
|
|
36
47
|
return authUrl.href;
|
|
37
48
|
};
|
|
38
49
|
const noop = () => {
|
|
39
50
|
// intentionally empty
|
|
40
51
|
};
|
|
41
|
-
const
|
|
42
|
-
category: null,
|
|
43
|
-
manual: false,
|
|
52
|
+
const BASE_DEFAULTS = {
|
|
44
53
|
onSuccess: noop,
|
|
45
54
|
onError: noop,
|
|
46
55
|
onClose: noop,
|
|
47
|
-
payrollProvider: null,
|
|
48
|
-
products: [],
|
|
49
|
-
sandbox: false,
|
|
50
56
|
state: null,
|
|
51
57
|
zIndex: 999,
|
|
52
|
-
finchDevMode: false,
|
|
53
58
|
};
|
|
59
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { clientId: '', category: null, manual: false, payrollProvider: null, products: [], clientName: undefined, sandbox: false });
|
|
60
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID = Object.assign(Object.assign({}, BASE_DEFAULTS), { sessionId: '' });
|
|
54
61
|
let isUseFinchConnectInitialized = false;
|
|
55
62
|
const useFinchConnect = (options) => {
|
|
56
|
-
if (!options
|
|
57
|
-
throw new Error('must specify clientId in options for useFinchConnect');
|
|
63
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
64
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
65
|
+
}
|
|
66
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
67
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
68
|
+
}
|
|
58
69
|
const isHookMounted = react.useRef(false);
|
|
59
70
|
react.useEffect(() => {
|
|
60
71
|
if (!isHookMounted.current) {
|
|
@@ -67,7 +78,8 @@ const useFinchConnect = (options) => {
|
|
|
67
78
|
isHookMounted.current = true;
|
|
68
79
|
}
|
|
69
80
|
}, []);
|
|
70
|
-
const combinedOptions =
|
|
81
|
+
const combinedOptions = 'sessionId' in options
|
|
82
|
+
? Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_SESSION_ID), options) : Object.assign(Object.assign({}, DEFAULT_OPTIONS_WITH_CLIENT_ID), options);
|
|
71
83
|
const open = (overrides) => {
|
|
72
84
|
const openOptions = Object.assign(Object.assign({}, combinedOptions), overrides);
|
|
73
85
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
@@ -96,13 +108,13 @@ const useFinchConnect = (options) => {
|
|
|
96
108
|
};
|
|
97
109
|
react.useEffect(() => {
|
|
98
110
|
function handleFinchAuth(event) {
|
|
99
|
-
|
|
100
|
-
const
|
|
111
|
+
var _a;
|
|
112
|
+
const CONNECT_URL = ((_a = combinedOptions.apiConfig) === null || _a === void 0 ? void 0 : _a.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
101
113
|
if (!event.data)
|
|
102
114
|
return;
|
|
103
115
|
if (event.data.name !== FINCH_AUTH_MESSAGE_NAME)
|
|
104
116
|
return;
|
|
105
|
-
if (!event.origin.startsWith(
|
|
117
|
+
if (!event.origin.startsWith(CONNECT_URL))
|
|
106
118
|
return;
|
|
107
119
|
close();
|
|
108
120
|
switch (event.data.kind) {
|
|
@@ -116,6 +128,7 @@ const useFinchConnect = (options) => {
|
|
|
116
128
|
combinedOptions.onSuccess({
|
|
117
129
|
code: event.data.code,
|
|
118
130
|
state: event.data.state,
|
|
131
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
119
132
|
});
|
|
120
133
|
break;
|
|
121
134
|
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
|
@@ -14,29 +14,44 @@ const App = () => {
|
|
|
14
14
|
const onClose = () => setResult({ kind: 'closed' });
|
|
15
15
|
|
|
16
16
|
const { open } = useFinchConnect({
|
|
17
|
-
clientId: '
|
|
18
|
-
products: [
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
clientId: 'f36f0cf9-5900-4171-b6d9-364008eb61aa',
|
|
18
|
+
products: [
|
|
19
|
+
'company',
|
|
20
|
+
'directory',
|
|
21
|
+
'individual',
|
|
22
|
+
'employment',
|
|
23
|
+
'payment',
|
|
24
|
+
'pay_statement',
|
|
25
|
+
'benefits',
|
|
26
|
+
],
|
|
27
|
+
payrollProvider: 'gusto',
|
|
28
|
+
state: '',
|
|
21
29
|
onSuccess,
|
|
22
30
|
onError,
|
|
23
31
|
onClose,
|
|
24
32
|
});
|
|
25
33
|
|
|
26
|
-
const submissionHandler: React.FormEventHandler<HTMLFormElement>
|
|
34
|
+
const submissionHandler: React.FormEventHandler<HTMLFormElement> = (e) => {
|
|
27
35
|
e.preventDefault();
|
|
28
36
|
open({
|
|
29
37
|
...(sendState ? { state: new Date().toISOString() } : undefined),
|
|
30
|
-
})
|
|
38
|
+
});
|
|
31
39
|
};
|
|
32
40
|
|
|
33
41
|
return (
|
|
34
42
|
<div className="container">
|
|
35
|
-
<h2
|
|
43
|
+
<h2>
|
|
44
|
+
<a href="https://www.npmjs.com/package/@tryfinch/react-connect">@tryfinch/react-connect</a>{' '}
|
|
45
|
+
Example App
|
|
46
|
+
</h2>
|
|
36
47
|
<form className="actions" onSubmit={submissionHandler}>
|
|
37
48
|
<div className="row">
|
|
38
49
|
<label className="top-label">Include State:</label>
|
|
39
|
-
<input
|
|
50
|
+
<input
|
|
51
|
+
type="checkbox"
|
|
52
|
+
checked={sendState}
|
|
53
|
+
onChange={() => setSendState((prev) => !prev)}
|
|
54
|
+
/>
|
|
40
55
|
</div>
|
|
41
56
|
<div className="row">
|
|
42
57
|
<button className="cta" type="submit">
|
|
@@ -45,8 +60,10 @@ const App = () => {
|
|
|
45
60
|
</div>
|
|
46
61
|
</form>
|
|
47
62
|
<div className="results">
|
|
48
|
-
|
|
49
|
-
|
|
63
|
+
{!result && (
|
|
64
|
+
<p>Complete a Finch Connect session and the success event will be displayed here</p>
|
|
65
|
+
)}
|
|
66
|
+
{result && <Result result={result} />}
|
|
50
67
|
</div>
|
|
51
68
|
</div>
|
|
52
69
|
);
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
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
|
|
|
8
11
|
export type ErrorEvent = {
|
|
@@ -14,24 +17,38 @@ export type Sandbox =
|
|
|
14
17
|
| 'provider' /** This is to enable the new Provider Sandbox */
|
|
15
18
|
| boolean /** This is the old sandbox flag retained for backwards compatibility */;
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
category: string | null;
|
|
19
|
-
clientId: string;
|
|
20
|
-
manual: boolean;
|
|
20
|
+
type BaseConnectOptions = {
|
|
21
21
|
state: string | null;
|
|
22
22
|
onSuccess: (e: SuccessEvent) => void;
|
|
23
23
|
onError: (e: ErrorEvent) => void;
|
|
24
24
|
onClose: () => void;
|
|
25
|
+
zIndex: number;
|
|
26
|
+
apiConfig?: {
|
|
27
|
+
connectUrl: string;
|
|
28
|
+
redirectUrl: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type ConnectOptionsWithSessionId = BaseConnectOptions & {
|
|
33
|
+
// Use this option if you have a Finch Connect sessionID from the IDP redirect flow
|
|
34
|
+
sessionId: string;
|
|
35
|
+
// Allow for overriding products for the session
|
|
36
|
+
products?: string[];
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
type ConnectOptionsWithClientId = BaseConnectOptions & {
|
|
40
|
+
category: string | null;
|
|
41
|
+
clientId: string;
|
|
42
|
+
manual: boolean;
|
|
25
43
|
payrollProvider: string | null;
|
|
26
44
|
products: string[];
|
|
45
|
+
clientName?: string;
|
|
27
46
|
sandbox: Sandbox;
|
|
28
|
-
zIndex: number;
|
|
29
|
-
finchDevMode?: boolean;
|
|
30
47
|
};
|
|
31
48
|
|
|
32
|
-
type
|
|
33
|
-
|
|
34
|
-
) => void;
|
|
49
|
+
export type ConnectOptions = ConnectOptionsWithSessionId | ConnectOptionsWithClientId;
|
|
50
|
+
|
|
51
|
+
type OpenFn = (overrides?: Partial<ConnectOptions>) => void;
|
|
35
52
|
|
|
36
53
|
const POST_MESSAGE_NAME = 'finch-auth-message' as const;
|
|
37
54
|
|
|
@@ -43,6 +60,7 @@ type FinchConnectAuthMessage = { name: typeof POST_MESSAGE_NAME } & (
|
|
|
43
60
|
kind: 'success';
|
|
44
61
|
code: string;
|
|
45
62
|
state?: string;
|
|
63
|
+
idpRedirectUri?: string;
|
|
46
64
|
}
|
|
47
65
|
| {
|
|
48
66
|
kind: 'error';
|
|
@@ -58,41 +76,46 @@ interface FinchConnectPostMessage {
|
|
|
58
76
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
59
77
|
const DEFAULT_FINCH_REDIRECT_URI = 'https://tryfinch.com';
|
|
60
78
|
|
|
61
|
-
const DEV_FINCH_CONNECT_URI = 'http://localhost:3000';
|
|
62
|
-
const DEV_DEFAULT_FINCH_REDIRECT_URI = 'http://localhost:4001';
|
|
63
|
-
|
|
64
79
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
65
80
|
const FINCH_AUTH_MESSAGE_NAME = 'finch-auth-message';
|
|
66
81
|
|
|
67
|
-
const constructAuthUrl = ({
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
const constructAuthUrl = (connectOptions: ConnectOptions) => {
|
|
83
|
+
const { state, apiConfig } = connectOptions;
|
|
84
|
+
|
|
85
|
+
const CONNECT_URL = apiConfig?.connectUrl || BASE_FINCH_CONNECT_URI;
|
|
86
|
+
const REDIRECT_URL = apiConfig?.redirectUrl || DEFAULT_FINCH_REDIRECT_URI;
|
|
87
|
+
|
|
88
|
+
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
89
|
+
|
|
90
|
+
if ('sessionId' in connectOptions) {
|
|
91
|
+
const { sessionId, products } = connectOptions;
|
|
92
|
+
authUrl.searchParams.append('session', sessionId);
|
|
93
|
+
if (products) authUrl.searchParams.append('products', products.join(' '));
|
|
94
|
+
} else {
|
|
95
|
+
const {
|
|
96
|
+
clientId,
|
|
97
|
+
payrollProvider,
|
|
98
|
+
category,
|
|
99
|
+
products,
|
|
100
|
+
manual,
|
|
101
|
+
sandbox,
|
|
102
|
+
clientName,
|
|
103
|
+
} = connectOptions;
|
|
104
|
+
|
|
105
|
+
if (clientId) authUrl.searchParams.append('client_id', clientId);
|
|
106
|
+
if (payrollProvider) authUrl.searchParams.append('payroll_provider', payrollProvider);
|
|
107
|
+
if (category) authUrl.searchParams.append('category', category);
|
|
108
|
+
if (clientName) authUrl.searchParams.append('client_name', clientName);
|
|
109
|
+
authUrl.searchParams.append('products', (products ?? []).join(' '));
|
|
110
|
+
if (manual) authUrl.searchParams.append('manual', String(manual));
|
|
111
|
+
if (sandbox) authUrl.searchParams.append('sandbox', String(sandbox));
|
|
112
|
+
}
|
|
113
|
+
|
|
86
114
|
authUrl.searchParams.append('app_type', 'spa');
|
|
87
|
-
authUrl.searchParams.append(
|
|
88
|
-
'redirect_uri',
|
|
89
|
-
canUseFinchDevMode ? DEV_DEFAULT_FINCH_REDIRECT_URI : DEFAULT_FINCH_REDIRECT_URI
|
|
90
|
-
);
|
|
115
|
+
authUrl.searchParams.append('redirect_uri', REDIRECT_URL);
|
|
91
116
|
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
92
117
|
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
93
118
|
authUrl.searchParams.append('mode', 'employer');
|
|
94
|
-
if (manual) authUrl.searchParams.append('manual', String(manual));
|
|
95
|
-
if (sandbox) authUrl.searchParams.append('sandbox', String(sandbox));
|
|
96
119
|
if (state) authUrl.searchParams.append('state', state);
|
|
97
120
|
// replace with actual SDK version by rollup
|
|
98
121
|
authUrl.searchParams.append('sdk_version', 'react-SDK_VERSION');
|
|
@@ -104,24 +127,41 @@ const noop = () => {
|
|
|
104
127
|
// intentionally empty
|
|
105
128
|
};
|
|
106
129
|
|
|
107
|
-
const
|
|
108
|
-
category: null,
|
|
109
|
-
manual: false,
|
|
130
|
+
const BASE_DEFAULTS = {
|
|
110
131
|
onSuccess: noop,
|
|
111
132
|
onError: noop,
|
|
112
133
|
onClose: noop,
|
|
134
|
+
state: null,
|
|
135
|
+
zIndex: 999,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const DEFAULT_OPTIONS_WITH_CLIENT_ID: HasKey<ConnectOptions, 'clientId'> = {
|
|
139
|
+
...BASE_DEFAULTS,
|
|
140
|
+
clientId: '',
|
|
141
|
+
category: null,
|
|
142
|
+
manual: false,
|
|
113
143
|
payrollProvider: null,
|
|
114
144
|
products: [],
|
|
145
|
+
clientName: undefined,
|
|
115
146
|
sandbox: false,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const DEFAULT_OPTIONS_WITH_SESSION_ID: HasKey<ConnectOptions, 'sessionId'> = {
|
|
150
|
+
...BASE_DEFAULTS,
|
|
151
|
+
sessionId: '',
|
|
119
152
|
};
|
|
120
153
|
|
|
121
154
|
let isUseFinchConnectInitialized = false;
|
|
122
155
|
|
|
123
156
|
export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenFn } => {
|
|
124
|
-
if (!options
|
|
157
|
+
if (!('sessionId' in options) && !('clientId' in options)) {
|
|
158
|
+
throw new Error('must specify either sessionId or clientId in options for useFinchConnect');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if ('sessionId' in options && 'clientId' in options) {
|
|
162
|
+
throw new Error('cannot specify both sessionId and clientId in options for useFinchConnect');
|
|
163
|
+
}
|
|
164
|
+
|
|
125
165
|
const isHookMounted = useRef(false);
|
|
126
166
|
|
|
127
167
|
useEffect(() => {
|
|
@@ -138,11 +178,10 @@ export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenF
|
|
|
138
178
|
}
|
|
139
179
|
}, []);
|
|
140
180
|
|
|
141
|
-
const combinedOptions: ConnectOptions =
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
};
|
|
181
|
+
const combinedOptions: ConnectOptions =
|
|
182
|
+
'sessionId' in options
|
|
183
|
+
? { ...DEFAULT_OPTIONS_WITH_SESSION_ID, ...options }
|
|
184
|
+
: { ...DEFAULT_OPTIONS_WITH_CLIENT_ID, ...options };
|
|
146
185
|
|
|
147
186
|
const open: OpenFn = (overrides) => {
|
|
148
187
|
const openOptions: ConnectOptions = {
|
|
@@ -177,14 +216,11 @@ export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenF
|
|
|
177
216
|
|
|
178
217
|
useEffect(() => {
|
|
179
218
|
function handleFinchAuth(event: FinchConnectPostMessage) {
|
|
180
|
-
const
|
|
181
|
-
combinedOptions.finchDevMode && window.location.hostname === 'localhost';
|
|
182
|
-
|
|
183
|
-
const CONNECT_URI = canUseFinchDevMode ? DEV_FINCH_CONNECT_URI : BASE_FINCH_CONNECT_URI;
|
|
219
|
+
const CONNECT_URL = combinedOptions.apiConfig?.connectUrl || BASE_FINCH_CONNECT_URI;
|
|
184
220
|
|
|
185
221
|
if (!event.data) return;
|
|
186
222
|
if (event.data.name !== FINCH_AUTH_MESSAGE_NAME) return;
|
|
187
|
-
if (!event.origin.startsWith(
|
|
223
|
+
if (!event.origin.startsWith(CONNECT_URL)) return;
|
|
188
224
|
|
|
189
225
|
close();
|
|
190
226
|
|
|
@@ -199,6 +235,7 @@ export const useFinchConnect = (options: Partial<ConnectOptions>): { open: OpenF
|
|
|
199
235
|
combinedOptions.onSuccess({
|
|
200
236
|
code: event.data.code,
|
|
201
237
|
state: event.data.state,
|
|
238
|
+
idpRedirectUri: event.data.idpRedirectUri,
|
|
202
239
|
});
|
|
203
240
|
break;
|
|
204
241
|
default: {
|