@tryfinch/react-connect 4.0.0 → 4.1.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/.eslintrc.js +1 -0
- package/.github/pull_request_template.md +66 -0
- package/.github/workflows/pr.yml +92 -0
- package/.github/workflows/release.yml +80 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +5 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +47 -15
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +47 -14
- package/dist/index.js.map +1 -1
- package/example/package-lock.json +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +58 -1
- package/src/index.ts +81 -14
package/.eslintrc.js
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
> The following sections MUST be filled out in order for your pull request to be reviewed
|
|
2
|
+
>
|
|
3
|
+
> If you've been asked to review this and information is missing or incomplete please ask the author to complete this first
|
|
4
|
+
|
|
5
|
+
## What is changing?
|
|
6
|
+
|
|
7
|
+
<!--
|
|
8
|
+
Please ensure your changes are in line with Finch's Coding Standards
|
|
9
|
+
- https://www.notion.so/tryfinch/Coding-Standards-051edcec95ff4dddb107303957e08416
|
|
10
|
+
-->
|
|
11
|
+
TODO
|
|
12
|
+
|
|
13
|
+
### ⚠️ What breaking changes will developers need to handle?
|
|
14
|
+
TODO (or n/a if no breaking changes)
|
|
15
|
+
|
|
16
|
+
## Why is it changing?
|
|
17
|
+
|
|
18
|
+
<!-- What problem does this solve? Why are the changes the appropriate solution? -->
|
|
19
|
+
TODO
|
|
20
|
+
|
|
21
|
+
## Relevant resources
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
Link to any:
|
|
25
|
+
- Associated tickets
|
|
26
|
+
- Discussions on Slack
|
|
27
|
+
- Related PRs
|
|
28
|
+
- Relevant metrics or logs
|
|
29
|
+
-->
|
|
30
|
+
TODO
|
|
31
|
+
|
|
32
|
+
## What steps did you take to test this?
|
|
33
|
+
|
|
34
|
+
<!--
|
|
35
|
+
Include the steps you took to validate these changes work as expected. This can include automated and manual testing.
|
|
36
|
+
These should allow reviewers to be confident that you have exercised all of your changes to verify that they work as expected
|
|
37
|
+
and will not break in production.
|
|
38
|
+
|
|
39
|
+
e.g.
|
|
40
|
+
- Manually verified that when we get the password change error from the provider we throw a 403
|
|
41
|
+
- Updated automated tests to validate that a 403 is raised when the provider returns the password change error
|
|
42
|
+
|
|
43
|
+
If your changes cannot be fully tested for some reason, or if you feel testing is not necessary, you must explain
|
|
44
|
+
why as well as how you will monitor for issues once they are deployed.
|
|
45
|
+
-->
|
|
46
|
+
TODO
|
|
47
|
+
|
|
48
|
+
### Screenshots
|
|
49
|
+
|
|
50
|
+
<!--
|
|
51
|
+
Include screenshots of your testing if possible, e.g. responses in Postman, successful data sync job runs
|
|
52
|
+
-->
|
|
53
|
+
TODO (or n/a if nothing can be captured in a screenshot)
|
|
54
|
+
|
|
55
|
+
## Was the JavaScript SDK updated as well?
|
|
56
|
+
|
|
57
|
+
<!--
|
|
58
|
+
If you are changing functionality in this frontend SDK the other one needs to be updated to match
|
|
59
|
+
https://github.com/Finch-API/finch-connect-js
|
|
60
|
+
-->
|
|
61
|
+
TODO (or n/a if no changes to duplicate)
|
|
62
|
+
|
|
63
|
+
## Was the relevant external documentation updated?
|
|
64
|
+
|
|
65
|
+
<!-- If any external documentation was updated as a result of this PR, link to it below. -->
|
|
66
|
+
TODO (or n/a if no relevant docs)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
name: Pull Request
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
# basic validations
|
|
8
|
+
|
|
9
|
+
validate-ticket-tracked:
|
|
10
|
+
name: Validate ticket tracked
|
|
11
|
+
uses: finch-api/github-actions-workflows/.github/workflows/valid-ticket-tracked.yml@main
|
|
12
|
+
with:
|
|
13
|
+
GH_EVENT_NUMBER: ${{ github.event.number }}
|
|
14
|
+
REPO_NAME: ${{ github.repository }}
|
|
15
|
+
secrets:
|
|
16
|
+
GHA_TOKEN: ${{ secrets.GH_READONLY_REPOS_AND_PACKAGES_PAT }}
|
|
17
|
+
|
|
18
|
+
validate-pr-title-standard:
|
|
19
|
+
name: Validate PR title is to standard
|
|
20
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout code
|
|
24
|
+
uses: actions/checkout@v5
|
|
25
|
+
|
|
26
|
+
- name: Validate PR title using semantic-pull-request
|
|
27
|
+
uses: amannn/action-semantic-pull-request@v5
|
|
28
|
+
env:
|
|
29
|
+
GITHUB_TOKEN: ${{ secrets.GH_READONLY_REPOS_AND_PACKAGES_PAT }}
|
|
30
|
+
with:
|
|
31
|
+
wip: true
|
|
32
|
+
types: |
|
|
33
|
+
build
|
|
34
|
+
chore
|
|
35
|
+
ci
|
|
36
|
+
docs
|
|
37
|
+
feat
|
|
38
|
+
fix
|
|
39
|
+
infra
|
|
40
|
+
perf
|
|
41
|
+
refactor
|
|
42
|
+
revert
|
|
43
|
+
style
|
|
44
|
+
test
|
|
45
|
+
|
|
46
|
+
# checks
|
|
47
|
+
|
|
48
|
+
lint:
|
|
49
|
+
name: Lint
|
|
50
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
51
|
+
needs:
|
|
52
|
+
- validate-ticket-tracked
|
|
53
|
+
- validate-pr-title-standard
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- name: Checkout code
|
|
57
|
+
uses: actions/checkout@v5
|
|
58
|
+
|
|
59
|
+
- name: Configure node
|
|
60
|
+
uses: useblacksmith/setup-node@v5
|
|
61
|
+
with:
|
|
62
|
+
node-version-file: .nvmrc
|
|
63
|
+
cache: npm
|
|
64
|
+
|
|
65
|
+
- name: Install dependencies
|
|
66
|
+
run: npm install
|
|
67
|
+
|
|
68
|
+
- name: Run lint
|
|
69
|
+
run: npm run lint
|
|
70
|
+
|
|
71
|
+
run-tests:
|
|
72
|
+
name: Unit test
|
|
73
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
74
|
+
needs:
|
|
75
|
+
- validate-ticket-tracked
|
|
76
|
+
- validate-pr-title-standard
|
|
77
|
+
|
|
78
|
+
steps:
|
|
79
|
+
- name: Checkout code
|
|
80
|
+
uses: actions/checkout@v5
|
|
81
|
+
|
|
82
|
+
- name: Configure node
|
|
83
|
+
uses: useblacksmith/setup-node@v5
|
|
84
|
+
with:
|
|
85
|
+
node-version-file: .nvmrc
|
|
86
|
+
cache: npm
|
|
87
|
+
|
|
88
|
+
- name: Install dependencies
|
|
89
|
+
run: npm install
|
|
90
|
+
|
|
91
|
+
- name: Run tests
|
|
92
|
+
run: npm run test
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Build and Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types:
|
|
6
|
+
- published
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
tests:
|
|
10
|
+
name: Tests
|
|
11
|
+
runs-on: blacksmith-2vcpu-ubuntu-2204
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout code
|
|
14
|
+
uses: actions/checkout@v5
|
|
15
|
+
|
|
16
|
+
- name: Configure node
|
|
17
|
+
uses: useblacksmith/setup-node@v5
|
|
18
|
+
with:
|
|
19
|
+
node-version-file: .nvmrc
|
|
20
|
+
cache: npm
|
|
21
|
+
|
|
22
|
+
- name: Install dependencies
|
|
23
|
+
run: npm install
|
|
24
|
+
|
|
25
|
+
- name: Run Tests
|
|
26
|
+
run: npm run test
|
|
27
|
+
|
|
28
|
+
lint:
|
|
29
|
+
name: Lint
|
|
30
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
31
|
+
|
|
32
|
+
steps:
|
|
33
|
+
- name: Checkout code
|
|
34
|
+
uses: actions/checkout@v5
|
|
35
|
+
|
|
36
|
+
- name: Configure node
|
|
37
|
+
uses: useblacksmith/setup-node@v5
|
|
38
|
+
with:
|
|
39
|
+
node-version-file: .nvmrc
|
|
40
|
+
cache: npm
|
|
41
|
+
|
|
42
|
+
- name: Install dependencies
|
|
43
|
+
run: npm install
|
|
44
|
+
|
|
45
|
+
- name: Run Lint
|
|
46
|
+
run: npm run lint
|
|
47
|
+
|
|
48
|
+
build-and-publish:
|
|
49
|
+
name: Build and Publish to NPM
|
|
50
|
+
runs-on: blacksmith-2vcpu-ubuntu-2204
|
|
51
|
+
needs:
|
|
52
|
+
- tests
|
|
53
|
+
- lint
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- name: Checkout code
|
|
57
|
+
uses: actions/checkout@v5
|
|
58
|
+
|
|
59
|
+
- name: Configure node
|
|
60
|
+
uses: useblacksmith/setup-node@v5
|
|
61
|
+
with:
|
|
62
|
+
node-version-file: .nvmrc
|
|
63
|
+
cache: npm
|
|
64
|
+
registry-url: https://registry.npmjs.org/
|
|
65
|
+
|
|
66
|
+
- name: Install dependencies
|
|
67
|
+
run: npm install
|
|
68
|
+
|
|
69
|
+
- name: Build
|
|
70
|
+
run: npm run build
|
|
71
|
+
|
|
72
|
+
- name: Update package version
|
|
73
|
+
run: npm version --no-git-tag-version ${{ github.ref_name }}
|
|
74
|
+
|
|
75
|
+
- name: Publish to npm
|
|
76
|
+
run: npm publish
|
|
77
|
+
env:
|
|
78
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
79
|
+
|
|
80
|
+
|
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v18.17.0
|
package/CHANGELOG.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -22,14 +22,25 @@ export type ConnectLaunchArgs = {
|
|
|
22
22
|
state?: string;
|
|
23
23
|
zIndex?: number;
|
|
24
24
|
};
|
|
25
|
+
export type ConnectPreviewLaunchArgs = {
|
|
26
|
+
clientId: string;
|
|
27
|
+
products: string[];
|
|
28
|
+
};
|
|
25
29
|
type OpenFn = (args: ConnectLaunchArgs) => void;
|
|
30
|
+
type OpenPreviewFn = (args: ConnectPreviewLaunchArgs) => void;
|
|
26
31
|
export declare const constructAuthUrl: ({ sessionId, state, apiConfig, }: {
|
|
27
32
|
sessionId: string;
|
|
28
33
|
state?: string | undefined;
|
|
29
34
|
apiConfig?: ApiConfig | undefined;
|
|
30
35
|
}) => string;
|
|
36
|
+
export declare const constructPreviewUrl: ({ clientId, products, apiConfig, }: {
|
|
37
|
+
clientId: string;
|
|
38
|
+
products: string[];
|
|
39
|
+
apiConfig?: ApiConfig | undefined;
|
|
40
|
+
}) => string;
|
|
31
41
|
export declare const useFinchConnect: (initializeArgs: ConnectInitializeArgs) => {
|
|
32
42
|
open: OpenFn;
|
|
43
|
+
openPreview: OpenPreviewFn;
|
|
33
44
|
};
|
|
34
45
|
export {};
|
|
35
46
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"./","sources":["index.ts"],"names":[],"mappings":"AAEA,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;AAClE,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,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,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"./","sources":["index.ts"],"names":[],"mappings":"AAEA,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;AAClE,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,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,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEhD,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;AAsC9D,eAAO,MAAM,gBAAgB;eAKhB,MAAM;;;YAclB,CAAC;AAEF,eAAO,MAAM,mBAAmB;cAKpB,MAAM;cACN,MAAM,EAAE;;YAiBnB,CAAC;AAIF,eAAO,MAAM,eAAe,mBACV,qBAAqB;UAC5B,MAAM;iBAAe,aAAa;CA8H5C,CAAC"}
|
package/dist/index.es.js
CHANGED
|
@@ -3,20 +3,35 @@ import { useRef, useEffect } from 'react';
|
|
|
3
3
|
const POST_MESSAGE_NAME = 'finch-auth-message-v2';
|
|
4
4
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
5
5
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
6
|
+
const appendBaseParams = (url) => {
|
|
7
|
+
url.searchParams.append('app_type', 'spa');
|
|
8
|
+
// The host URL of the SDK. This is used to store the referrer for postMessage purposes
|
|
9
|
+
url.searchParams.append('sdk_host_url', window.location.origin);
|
|
10
|
+
url.searchParams.append('mode', 'employer');
|
|
11
|
+
// replace with actual SDK version by rollup
|
|
12
|
+
url.searchParams.append('sdk_version', 'react-4.1.0');
|
|
13
|
+
};
|
|
6
14
|
const constructAuthUrl = ({ sessionId, state, apiConfig, }) => {
|
|
7
15
|
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
8
16
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
9
17
|
authUrl.searchParams.append('session', sessionId);
|
|
10
|
-
authUrl.searchParams.append('app_type', 'spa');
|
|
11
|
-
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
12
|
-
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
13
|
-
authUrl.searchParams.append('mode', 'employer');
|
|
14
18
|
if (state)
|
|
15
19
|
authUrl.searchParams.append('state', state);
|
|
16
|
-
|
|
17
|
-
authUrl.searchParams.append('sdk_version', 'react-4.0.0');
|
|
20
|
+
appendBaseParams(authUrl);
|
|
18
21
|
return authUrl.href;
|
|
19
22
|
};
|
|
23
|
+
const constructPreviewUrl = ({ clientId, products, apiConfig, }) => {
|
|
24
|
+
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
25
|
+
const previewUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
26
|
+
previewUrl.searchParams.append('preview', 'true');
|
|
27
|
+
previewUrl.searchParams.append('client_id', clientId);
|
|
28
|
+
previewUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
29
|
+
// This will be replaced by a universally allowed redirect URI in the backend
|
|
30
|
+
// We won't ever redirect to anything in preview mode, so we just need a value to pass validation
|
|
31
|
+
previewUrl.searchParams.append('redirect_uri', 'https://www.tryfinch.com');
|
|
32
|
+
appendBaseParams(previewUrl);
|
|
33
|
+
return previewUrl.href;
|
|
34
|
+
};
|
|
20
35
|
let isUseFinchConnectInitialized = false;
|
|
21
36
|
const useFinchConnect = (initializeArgs) => {
|
|
22
37
|
const isHookMounted = useRef(false);
|
|
@@ -31,19 +46,14 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
31
46
|
isHookMounted.current = true;
|
|
32
47
|
}
|
|
33
48
|
}, []);
|
|
34
|
-
const
|
|
35
|
-
var _a;
|
|
49
|
+
const createAndAttachIFrame = ({ src, zIndexOverride, }) => {
|
|
36
50
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
37
51
|
const iframe = document.createElement('iframe');
|
|
38
|
-
iframe.src =
|
|
39
|
-
sessionId: launchArgs.sessionId,
|
|
40
|
-
state: launchArgs.state,
|
|
41
|
-
apiConfig: initializeArgs.apiConfig,
|
|
42
|
-
});
|
|
52
|
+
iframe.src = src;
|
|
43
53
|
iframe.frameBorder = '0';
|
|
44
54
|
iframe.id = FINCH_CONNECT_IFRAME_ID;
|
|
45
55
|
iframe.style.position = 'fixed';
|
|
46
|
-
iframe.style.zIndex = (
|
|
56
|
+
iframe.style.zIndex = (zIndexOverride === null || zIndexOverride === void 0 ? void 0 : zIndexOverride.toString()) || '999';
|
|
47
57
|
iframe.style.height = '100%';
|
|
48
58
|
iframe.style.width = '100%';
|
|
49
59
|
iframe.style.top = '0';
|
|
@@ -54,6 +64,27 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
54
64
|
document.body.style.overflow = 'hidden';
|
|
55
65
|
}
|
|
56
66
|
};
|
|
67
|
+
const open = (launchArgs) => {
|
|
68
|
+
const iframeSrc = constructAuthUrl({
|
|
69
|
+
sessionId: launchArgs.sessionId,
|
|
70
|
+
state: launchArgs.state,
|
|
71
|
+
apiConfig: initializeArgs.apiConfig,
|
|
72
|
+
});
|
|
73
|
+
createAndAttachIFrame({
|
|
74
|
+
src: iframeSrc,
|
|
75
|
+
zIndexOverride: launchArgs.zIndex,
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const openPreview = (launchArgs) => {
|
|
79
|
+
const iframeSrc = constructPreviewUrl({
|
|
80
|
+
clientId: launchArgs.clientId,
|
|
81
|
+
products: launchArgs.products,
|
|
82
|
+
apiConfig: initializeArgs.apiConfig,
|
|
83
|
+
});
|
|
84
|
+
createAndAttachIFrame({
|
|
85
|
+
src: iframeSrc,
|
|
86
|
+
});
|
|
87
|
+
};
|
|
57
88
|
const close = () => {
|
|
58
89
|
var _a;
|
|
59
90
|
const frameToRemove = document.getElementById(FINCH_CONNECT_IFRAME_ID);
|
|
@@ -109,8 +140,9 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
109
140
|
}, [initializeArgs.onClose, initializeArgs.onError, initializeArgs.onSuccess]);
|
|
110
141
|
return {
|
|
111
142
|
open,
|
|
143
|
+
openPreview,
|
|
112
144
|
};
|
|
113
145
|
};
|
|
114
146
|
|
|
115
|
-
export { constructAuthUrl, useFinchConnect };
|
|
147
|
+
export { constructAuthUrl, constructPreviewUrl, useFinchConnect };
|
|
116
148
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,20 +7,35 @@ var react = require('react');
|
|
|
7
7
|
const POST_MESSAGE_NAME = 'finch-auth-message-v2';
|
|
8
8
|
const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
9
9
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
10
|
+
const appendBaseParams = (url) => {
|
|
11
|
+
url.searchParams.append('app_type', 'spa');
|
|
12
|
+
// The host URL of the SDK. This is used to store the referrer for postMessage purposes
|
|
13
|
+
url.searchParams.append('sdk_host_url', window.location.origin);
|
|
14
|
+
url.searchParams.append('mode', 'employer');
|
|
15
|
+
// replace with actual SDK version by rollup
|
|
16
|
+
url.searchParams.append('sdk_version', 'react-4.1.0');
|
|
17
|
+
};
|
|
10
18
|
const constructAuthUrl = ({ sessionId, state, apiConfig, }) => {
|
|
11
19
|
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
12
20
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
13
21
|
authUrl.searchParams.append('session', sessionId);
|
|
14
|
-
authUrl.searchParams.append('app_type', 'spa');
|
|
15
|
-
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
16
|
-
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
17
|
-
authUrl.searchParams.append('mode', 'employer');
|
|
18
22
|
if (state)
|
|
19
23
|
authUrl.searchParams.append('state', state);
|
|
20
|
-
|
|
21
|
-
authUrl.searchParams.append('sdk_version', 'react-4.0.0');
|
|
24
|
+
appendBaseParams(authUrl);
|
|
22
25
|
return authUrl.href;
|
|
23
26
|
};
|
|
27
|
+
const constructPreviewUrl = ({ clientId, products, apiConfig, }) => {
|
|
28
|
+
const CONNECT_URL = (apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.connectUrl) || BASE_FINCH_CONNECT_URI;
|
|
29
|
+
const previewUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
30
|
+
previewUrl.searchParams.append('preview', 'true');
|
|
31
|
+
previewUrl.searchParams.append('client_id', clientId);
|
|
32
|
+
previewUrl.searchParams.append('products', (products !== null && products !== void 0 ? products : []).join(' '));
|
|
33
|
+
// This will be replaced by a universally allowed redirect URI in the backend
|
|
34
|
+
// We won't ever redirect to anything in preview mode, so we just need a value to pass validation
|
|
35
|
+
previewUrl.searchParams.append('redirect_uri', 'https://www.tryfinch.com');
|
|
36
|
+
appendBaseParams(previewUrl);
|
|
37
|
+
return previewUrl.href;
|
|
38
|
+
};
|
|
24
39
|
let isUseFinchConnectInitialized = false;
|
|
25
40
|
const useFinchConnect = (initializeArgs) => {
|
|
26
41
|
const isHookMounted = react.useRef(false);
|
|
@@ -35,19 +50,14 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
35
50
|
isHookMounted.current = true;
|
|
36
51
|
}
|
|
37
52
|
}, []);
|
|
38
|
-
const
|
|
39
|
-
var _a;
|
|
53
|
+
const createAndAttachIFrame = ({ src, zIndexOverride, }) => {
|
|
40
54
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
41
55
|
const iframe = document.createElement('iframe');
|
|
42
|
-
iframe.src =
|
|
43
|
-
sessionId: launchArgs.sessionId,
|
|
44
|
-
state: launchArgs.state,
|
|
45
|
-
apiConfig: initializeArgs.apiConfig,
|
|
46
|
-
});
|
|
56
|
+
iframe.src = src;
|
|
47
57
|
iframe.frameBorder = '0';
|
|
48
58
|
iframe.id = FINCH_CONNECT_IFRAME_ID;
|
|
49
59
|
iframe.style.position = 'fixed';
|
|
50
|
-
iframe.style.zIndex = (
|
|
60
|
+
iframe.style.zIndex = (zIndexOverride === null || zIndexOverride === void 0 ? void 0 : zIndexOverride.toString()) || '999';
|
|
51
61
|
iframe.style.height = '100%';
|
|
52
62
|
iframe.style.width = '100%';
|
|
53
63
|
iframe.style.top = '0';
|
|
@@ -58,6 +68,27 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
58
68
|
document.body.style.overflow = 'hidden';
|
|
59
69
|
}
|
|
60
70
|
};
|
|
71
|
+
const open = (launchArgs) => {
|
|
72
|
+
const iframeSrc = constructAuthUrl({
|
|
73
|
+
sessionId: launchArgs.sessionId,
|
|
74
|
+
state: launchArgs.state,
|
|
75
|
+
apiConfig: initializeArgs.apiConfig,
|
|
76
|
+
});
|
|
77
|
+
createAndAttachIFrame({
|
|
78
|
+
src: iframeSrc,
|
|
79
|
+
zIndexOverride: launchArgs.zIndex,
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
const openPreview = (launchArgs) => {
|
|
83
|
+
const iframeSrc = constructPreviewUrl({
|
|
84
|
+
clientId: launchArgs.clientId,
|
|
85
|
+
products: launchArgs.products,
|
|
86
|
+
apiConfig: initializeArgs.apiConfig,
|
|
87
|
+
});
|
|
88
|
+
createAndAttachIFrame({
|
|
89
|
+
src: iframeSrc,
|
|
90
|
+
});
|
|
91
|
+
};
|
|
61
92
|
const close = () => {
|
|
62
93
|
var _a;
|
|
63
94
|
const frameToRemove = document.getElementById(FINCH_CONNECT_IFRAME_ID);
|
|
@@ -113,9 +144,11 @@ const useFinchConnect = (initializeArgs) => {
|
|
|
113
144
|
}, [initializeArgs.onClose, initializeArgs.onError, initializeArgs.onSuccess]);
|
|
114
145
|
return {
|
|
115
146
|
open,
|
|
147
|
+
openPreview,
|
|
116
148
|
};
|
|
117
149
|
};
|
|
118
150
|
|
|
119
151
|
exports.constructAuthUrl = constructAuthUrl;
|
|
152
|
+
exports.constructPreviewUrl = constructPreviewUrl;
|
|
120
153
|
exports.useFinchConnect = useFinchConnect;
|
|
121
154
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["useRef","useEffect"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["useRef","useEffect"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { constructAuthUrl } from './index';
|
|
1
|
+
import { constructAuthUrl, constructPreviewUrl } from './index';
|
|
2
2
|
|
|
3
3
|
const NOOP_CALLBACKS = {
|
|
4
4
|
onSuccess: jest.fn(),
|
|
@@ -51,4 +51,61 @@ describe('Finch React SDK', () => {
|
|
|
51
51
|
expect(authUrl.startsWith('https://cool.site/authorize?')).toBe(true);
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
|
+
|
|
55
|
+
describe('constructPreviewUrl', () => {
|
|
56
|
+
it('sets the preview parameter to true', () => {
|
|
57
|
+
const previewUrl = constructPreviewUrl({
|
|
58
|
+
clientId: 'test-client-id',
|
|
59
|
+
products: ['test-product'],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
expect(previewUrl).toContain('preview=true');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('sets the client ID parameter', () => {
|
|
66
|
+
const previewUrl = constructPreviewUrl({
|
|
67
|
+
clientId: 'test-client-id',
|
|
68
|
+
products: ['test-product'],
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
expect(previewUrl).toContain('client_id=test-client-id');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('sets the products parameter', () => {
|
|
75
|
+
const previewUrl = constructPreviewUrl({
|
|
76
|
+
clientId: 'test-client-id',
|
|
77
|
+
products: ['test-product', 'test-product-2'],
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
expect(previewUrl).toContain('products=test-product+test-product-2');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('sets a default redirect URI', () => {
|
|
84
|
+
const expectedRedirectUri = encodeURIComponent('https://www.tryfinch.com');
|
|
85
|
+
const previewUrl = constructPreviewUrl({
|
|
86
|
+
clientId: 'test-client-id',
|
|
87
|
+
products: ['test-product'],
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
expect(previewUrl).toContain(`redirect_uri=${expectedRedirectUri}`);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('adds all the expected base parameters to the auth URL', () => {
|
|
94
|
+
const expectedParameters = {
|
|
95
|
+
app_type: 'spa',
|
|
96
|
+
sdk_host_url: encodeURIComponent('http://localhost'),
|
|
97
|
+
mode: 'employer',
|
|
98
|
+
sdk_version: 'react-SDK_VERSION',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const authUrl = constructPreviewUrl({
|
|
102
|
+
clientId: 'test-client-id',
|
|
103
|
+
products: ['test-product'],
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
Object.entries(expectedParameters).forEach(([key, value]) => {
|
|
107
|
+
expect(authUrl).toContain(`${key}=${value}`);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
54
111
|
});
|
package/src/index.ts
CHANGED
|
@@ -29,8 +29,15 @@ export type ConnectLaunchArgs = {
|
|
|
29
29
|
zIndex?: number;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
export type ConnectPreviewLaunchArgs = {
|
|
33
|
+
clientId: string;
|
|
34
|
+
products: string[];
|
|
35
|
+
};
|
|
36
|
+
|
|
32
37
|
type OpenFn = (args: ConnectLaunchArgs) => void;
|
|
33
38
|
|
|
39
|
+
type OpenPreviewFn = (args: ConnectPreviewLaunchArgs) => void;
|
|
40
|
+
|
|
34
41
|
const POST_MESSAGE_NAME = 'finch-auth-message-v2' as const;
|
|
35
42
|
|
|
36
43
|
type FinchConnectAuthMessage = { name: typeof POST_MESSAGE_NAME } & (
|
|
@@ -58,6 +65,15 @@ const BASE_FINCH_CONNECT_URI = 'https://connect.tryfinch.com';
|
|
|
58
65
|
|
|
59
66
|
const FINCH_CONNECT_IFRAME_ID = 'finch-connect-iframe';
|
|
60
67
|
|
|
68
|
+
const appendBaseParams = (url: URL) => {
|
|
69
|
+
url.searchParams.append('app_type', 'spa');
|
|
70
|
+
// The host URL of the SDK. This is used to store the referrer for postMessage purposes
|
|
71
|
+
url.searchParams.append('sdk_host_url', window.location.origin);
|
|
72
|
+
url.searchParams.append('mode', 'employer');
|
|
73
|
+
// replace with actual SDK version by rollup
|
|
74
|
+
url.searchParams.append('sdk_version', 'react-SDK_VERSION');
|
|
75
|
+
};
|
|
76
|
+
|
|
61
77
|
export const constructAuthUrl = ({
|
|
62
78
|
sessionId,
|
|
63
79
|
state,
|
|
@@ -72,20 +88,43 @@ export const constructAuthUrl = ({
|
|
|
72
88
|
const authUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
73
89
|
|
|
74
90
|
authUrl.searchParams.append('session', sessionId);
|
|
75
|
-
authUrl.searchParams.append('app_type', 'spa');
|
|
76
|
-
/** The host URL of the SDK. This is used to store the referrer for postMessage purposes */
|
|
77
|
-
authUrl.searchParams.append('sdk_host_url', window.location.origin);
|
|
78
|
-
authUrl.searchParams.append('mode', 'employer');
|
|
79
91
|
if (state) authUrl.searchParams.append('state', state);
|
|
80
|
-
|
|
81
|
-
authUrl
|
|
92
|
+
|
|
93
|
+
appendBaseParams(authUrl);
|
|
82
94
|
|
|
83
95
|
return authUrl.href;
|
|
84
96
|
};
|
|
85
97
|
|
|
98
|
+
export const constructPreviewUrl = ({
|
|
99
|
+
clientId,
|
|
100
|
+
products,
|
|
101
|
+
apiConfig,
|
|
102
|
+
}: {
|
|
103
|
+
clientId: string;
|
|
104
|
+
products: string[];
|
|
105
|
+
apiConfig?: ApiConfig;
|
|
106
|
+
}) => {
|
|
107
|
+
const CONNECT_URL = apiConfig?.connectUrl || BASE_FINCH_CONNECT_URI;
|
|
108
|
+
|
|
109
|
+
const previewUrl = new URL(`${CONNECT_URL}/authorize`);
|
|
110
|
+
|
|
111
|
+
previewUrl.searchParams.append('preview', 'true');
|
|
112
|
+
previewUrl.searchParams.append('client_id', clientId);
|
|
113
|
+
previewUrl.searchParams.append('products', (products ?? []).join(' '));
|
|
114
|
+
// This will be replaced by a universally allowed redirect URI in the backend
|
|
115
|
+
// We won't ever redirect to anything in preview mode, so we just need a value to pass validation
|
|
116
|
+
previewUrl.searchParams.append('redirect_uri', 'https://www.tryfinch.com');
|
|
117
|
+
|
|
118
|
+
appendBaseParams(previewUrl);
|
|
119
|
+
|
|
120
|
+
return previewUrl.href;
|
|
121
|
+
};
|
|
122
|
+
|
|
86
123
|
let isUseFinchConnectInitialized = false;
|
|
87
124
|
|
|
88
|
-
export const useFinchConnect = (
|
|
125
|
+
export const useFinchConnect = (
|
|
126
|
+
initializeArgs: ConnectInitializeArgs
|
|
127
|
+
): { open: OpenFn; openPreview: OpenPreviewFn } => {
|
|
89
128
|
const isHookMounted = useRef(false);
|
|
90
129
|
|
|
91
130
|
useEffect(() => {
|
|
@@ -102,18 +141,20 @@ export const useFinchConnect = (initializeArgs: ConnectInitializeArgs): { open:
|
|
|
102
141
|
}
|
|
103
142
|
}, []);
|
|
104
143
|
|
|
105
|
-
const
|
|
144
|
+
const createAndAttachIFrame = ({
|
|
145
|
+
src,
|
|
146
|
+
zIndexOverride,
|
|
147
|
+
}: {
|
|
148
|
+
src: string;
|
|
149
|
+
zIndexOverride?: number;
|
|
150
|
+
}) => {
|
|
106
151
|
if (!document.getElementById(FINCH_CONNECT_IFRAME_ID)) {
|
|
107
152
|
const iframe = document.createElement('iframe');
|
|
108
|
-
iframe.src =
|
|
109
|
-
sessionId: launchArgs.sessionId,
|
|
110
|
-
state: launchArgs.state,
|
|
111
|
-
apiConfig: initializeArgs.apiConfig,
|
|
112
|
-
});
|
|
153
|
+
iframe.src = src;
|
|
113
154
|
iframe.frameBorder = '0';
|
|
114
155
|
iframe.id = FINCH_CONNECT_IFRAME_ID;
|
|
115
156
|
iframe.style.position = 'fixed';
|
|
116
|
-
iframe.style.zIndex =
|
|
157
|
+
iframe.style.zIndex = zIndexOverride?.toString() || '999';
|
|
117
158
|
iframe.style.height = '100%';
|
|
118
159
|
iframe.style.width = '100%';
|
|
119
160
|
iframe.style.top = '0';
|
|
@@ -125,6 +166,31 @@ export const useFinchConnect = (initializeArgs: ConnectInitializeArgs): { open:
|
|
|
125
166
|
}
|
|
126
167
|
};
|
|
127
168
|
|
|
169
|
+
const open: OpenFn = (launchArgs) => {
|
|
170
|
+
const iframeSrc = constructAuthUrl({
|
|
171
|
+
sessionId: launchArgs.sessionId,
|
|
172
|
+
state: launchArgs.state,
|
|
173
|
+
apiConfig: initializeArgs.apiConfig,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
createAndAttachIFrame({
|
|
177
|
+
src: iframeSrc,
|
|
178
|
+
zIndexOverride: launchArgs.zIndex,
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const openPreview: OpenPreviewFn = (launchArgs) => {
|
|
183
|
+
const iframeSrc = constructPreviewUrl({
|
|
184
|
+
clientId: launchArgs.clientId,
|
|
185
|
+
products: launchArgs.products,
|
|
186
|
+
apiConfig: initializeArgs.apiConfig,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
createAndAttachIFrame({
|
|
190
|
+
src: iframeSrc,
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
|
|
128
194
|
const close = () => {
|
|
129
195
|
const frameToRemove = document.getElementById(FINCH_CONNECT_IFRAME_ID);
|
|
130
196
|
if (frameToRemove) {
|
|
@@ -182,5 +248,6 @@ export const useFinchConnect = (initializeArgs: ConnectInitializeArgs): { open:
|
|
|
182
248
|
|
|
183
249
|
return {
|
|
184
250
|
open,
|
|
251
|
+
openPreview,
|
|
185
252
|
};
|
|
186
253
|
};
|