Skip to content

Commit 5682ecf

Browse files
chesterkmralonp99
andauthored
feat: updated cf status persistance logic & updated events for iframe (#2818)
* feat: updated cf status persistance logic & updated events for iframe * fix: fixed redirects override * feat: refactor * feat: added test * feat: added tst for ui options redirect * fix: refactor --------- Co-authored-by: Alon Peretz <[email protected]>
1 parent 09c9f18 commit 5682ecf

File tree

30 files changed

+609
-133
lines changed

30 files changed

+609
-133
lines changed

apps/kyb-app/public/locales/en/translation.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
"header": "Thank you!<br /> We’re reviewing your application",
2020
"content": "We will inform you by email once your account is ready."
2121
},
22+
"failed": {
23+
"header": "Submission failed.",
24+
"content": "Please contact {{companyName}} for support."
25+
},
2226
"industries": [
2327
"Adult Entertainment and Products",
2428
"Aerospace Engineering",

apps/kyb-app/src/components/layouts/AppShell/LanguagePicker.tsx

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,29 @@ export const LanguagePicker = () => {
3434
}
3535

3636
return (
37-
<DropdownInput
38-
value={language}
39-
name="languagePicker"
40-
options={supportedLanguages}
41-
props={{
42-
item: { variant: 'inverted' },
43-
content: { className: 'w-[204px] p-1', align: 'start' },
44-
trigger: {
45-
icon: (
46-
<span className="text-primary-foreground">
47-
<GlobeIcon />
48-
</span>
49-
),
50-
className: 'px-3 gap-x-2 bg-primary text-primary-foreground',
51-
},
52-
}}
53-
onChange={selectedLanguage => {
54-
updateLanguage(selectedLanguage);
55-
i18next.changeLanguage(selectedLanguage);
56-
setLanguage(selectedLanguage);
57-
}}
58-
/>
37+
<div>
38+
<DropdownInput
39+
value={language}
40+
name="languagePicker"
41+
options={supportedLanguages}
42+
props={{
43+
item: { variant: 'inverted' },
44+
content: { className: 'w-[204px] p-1', align: 'start' },
45+
trigger: {
46+
icon: (
47+
<span className="text-primary-foreground">
48+
<GlobeIcon />
49+
</span>
50+
),
51+
className: 'px-3 gap-x-2 bg-primary text-primary-foreground',
52+
},
53+
}}
54+
onChange={selectedLanguage => {
55+
updateLanguage(selectedLanguage);
56+
i18next.changeLanguage(selectedLanguage);
57+
setLanguage(selectedLanguage);
58+
}}
59+
/>
60+
</div>
5961
);
6062
};

apps/kyb-app/src/components/layouts/AppShell/Navigation.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ export const Navigation = () => {
4343

4444
return (
4545
<button
46-
className={ctw('cursor-pointer select-none', {
46+
className={ctw('flex cursor-pointer select-none flex-row flex-nowrap items-center', {
4747
'pointer-events-none opacity-50': isDisabled,
4848
})}
4949
aria-disabled={isDisabled}
5050
onClick={onPrevious}
5151
type={'button'}
5252
>
53-
<ArrowLeft className="inline" />
54-
<span className="pl-2 align-middle text-sm font-bold">
53+
<ArrowLeft size={24} className="flex-shrink-0" />
54+
<span className="flex flex-nowrap pl-2 align-middle text-sm font-bold">
5555
{isFirstStep && customer
5656
? t('backToPortal', { companyName: customer.displayName })
5757
: t('back')}

apps/kyb-app/src/components/organisms/DynamicUI/Page/Page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export const Page = ({ page, children }: PageProps) => {
7171
pageErrors: pageErrors.reduce((map, pageError) => {
7272
map[pageError.stateName] = pageError.errors.reduce((map, error) => {
7373
map[error.fieldId] = error;
74+
7475
return map;
7576
}, {} as PageContext['pageErrors'][string]);
7677

apps/kyb-app/src/components/organisms/UIRenderer/elements/JSONForm/components/DocumentField/DocumentField.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,6 @@ export const DocumentField = (
226226
[stateApi, options, definition, inputIndex, sendEvent],
227227
);
228228

229-
console.log('IS LOADING', elementState.isLoading);
230-
231229
return (
232230
<div className="flex flex-col gap-2">
233231
<FileUploaderField

apps/kyb-app/src/components/organisms/UIRenderer/elements/SubmitButton/SubmitButton.tsx

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ import { useUIElementHandlers } from '@/components/organisms/UIRenderer/hooks/us
1111
import { useUIElementState } from '@/components/organisms/UIRenderer/hooks/useUIElementState';
1212
import { UIElementComponent } from '@/components/organisms/UIRenderer/types';
1313
import { UIPage } from '@/domains/collection-flow';
14-
import { useFlowTracking } from '@/hooks/useFlowTracking';
15-
import {
16-
CollectionFlowStatusesEnum,
17-
getCollectionFlowState,
18-
setStepCompletionState,
19-
} from '@ballerine/common';
14+
import { getCollectionFlowState, setStepCompletionState } from '@ballerine/common';
2015
import { Button } from '@ballerine/ui';
2116
import { useCallback, useMemo } from 'react';
2217

@@ -63,8 +58,6 @@ export const SubmitButton: UIElementComponent<{ text: string }> = ({ definition
6358
[helpers, errors],
6459
);
6560

66-
const { trackFinish } = useFlowTracking();
67-
6861
const handleClick = useCallback(() => {
6962
setPageElementsTouched(
7063
// @ts-ignore
@@ -79,7 +72,6 @@ export const SubmitButton: UIElementComponent<{ text: string }> = ({ definition
7972
const collectionFlow = getCollectionFlowState(context);
8073

8174
if (collectionFlow) {
82-
collectionFlow.status = CollectionFlowStatusesEnum.completed;
8375
setStepCompletionState(context, {
8476
stepName: currentPage?.stateName as string,
8577
completed: true,
@@ -90,20 +82,7 @@ export const SubmitButton: UIElementComponent<{ text: string }> = ({ definition
9082
}
9183

9284
onClickHandler();
93-
94-
if (isFinishPage && isValid) {
95-
trackFinish();
96-
}
97-
}, [
98-
currentPage,
99-
pages,
100-
state,
101-
isValid,
102-
stateApi,
103-
setPageElementsTouched,
104-
onClickHandler,
105-
trackFinish,
106-
]);
85+
}, [currentPage, pages, state, isValid, stateApi, setPageElementsTouched, onClickHandler]);
10786

10887
return (
10988
<Button

apps/kyb-app/src/domains/collection-flow/collection-flow.api.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import {
77
TUser,
88
UISchema,
99
} from '@/domains/collection-flow/types';
10-
import { CollectionFlowContext } from '@/domains/collection-flow/types/flow-context.types';
10+
import {
11+
CollectionFlowConfig,
12+
CollectionFlowContext,
13+
} from '@/domains/collection-flow/types/flow-context.types';
1114
import posthog from 'posthog-js';
1215

1316
export const fetchUser = async (): Promise<TUser> => {
@@ -64,10 +67,15 @@ export const fetchCustomer = async (): Promise<TCustomer> => {
6467
return await request.get('collection-flow/customer').json<TCustomer>();
6568
};
6669

67-
export const fetchFlowContext = async (): Promise<CollectionFlowContext> => {
70+
export interface FlowContextResponse {
71+
context: CollectionFlowContext;
72+
config: CollectionFlowConfig;
73+
}
74+
75+
export const fetchFlowContext = async (): Promise<FlowContextResponse> => {
6876
try {
6977
const result = await request.get('collection-flow/context');
70-
const resultJson = await result.json<CollectionFlowContext>();
78+
const resultJson = await result.json<FlowContextResponse>();
7179

7280
if (!resultJson || typeof resultJson !== 'object') {
7381
throw new Error('Invalid flow context');

apps/kyb-app/src/hooks/useAppExit/useAppExit.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ import { useFlowTracking } from '@/hooks/useFlowTracking';
33
import { useLanguage } from '@/hooks/useLanguage';
44
import { useUISchemasQuery } from '@/hooks/useUISchemasQuery';
55
import { useCallback } from 'react';
6+
import { CollectionFlowEvents } from '../useFlowTracking/enums';
67

78
export const useAppExit = () => {
89
const appLanguage = useLanguage();
910
const { data: uiSchema } = useUISchemasQuery(appLanguage);
10-
const { trackExit } = useFlowTracking();
1111
const { customer } = useCustomerQuery();
12+
const { trackEvent } = useFlowTracking();
1213

1314
const kybOnExitAction = uiSchema?.config?.kybOnExitAction || 'send-event';
1415

1516
const exit = useCallback(() => {
1617
if (kybOnExitAction === 'send-event') {
17-
trackExit();
18+
trackEvent(CollectionFlowEvents.USER_EXITED);
19+
1820
return;
1921
}
2022

@@ -23,11 +25,10 @@ export const useAppExit = () => {
2325
location.href = customer?.websiteUrl;
2426
}
2527
}
26-
}, [trackExit, customer]);
28+
}, [trackEvent, customer]);
2729

2830
return {
2931
exit,
30-
isExitAvailable:
31-
uiSchema?.config?.kybOnExitAction === 'send-event' ? true : !!customer?.websiteUrl,
32+
isExitAvailable: kybOnExitAction === 'send-event' ? true : !!customer?.websiteUrl,
3233
};
3334
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const CollectionFlowEvents = {
2+
USER_EXITED: 'user-exited',
3+
FLOW_COMPLETED: 'flow-completed',
4+
FLOW_FAILED: 'flow-failed',
5+
} as const;
6+
7+
export type TCollectionFlowEvents =
8+
(typeof CollectionFlowEvents)[keyof typeof CollectionFlowEvents];
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
import { useCallback } from 'react';
2+
import { TCollectionFlowEvents } from './enums';
23

3-
export const useFlowTracking = () => {
4-
const trackExit = useCallback(() => {
5-
const event = 'ballerine.collection-flow.back-button-pressed';
6-
console.log(`Sending event: ${event}`);
7-
window.parent.postMessage(event, '*');
8-
}, []);
4+
const DEFAULT_PREFIX = 'ballerine.collection-flow';
95

10-
const trackFinish = useCallback(() => {
11-
const event = 'ballerine.collection-flow.finish-button-pressed';
12-
console.log(`Sending event: ${event}`);
6+
interface IUseFlowTracking {
7+
prefix?: string;
8+
}
139

14-
window.parent.postMessage('ballerine.collection-flow.finish-button-pressed', '*');
15-
}, []);
10+
const formatEventName = (prefix: string, event: string) => `${prefix}.${event}`;
11+
12+
export const useFlowTracking = (
13+
{ prefix = DEFAULT_PREFIX }: IUseFlowTracking = { prefix: DEFAULT_PREFIX },
14+
) => {
15+
const trackEvent = useCallback(
16+
(event: TCollectionFlowEvents) => {
17+
const formattedEvent = formatEventName(prefix, event);
18+
19+
console.log(`Sending event: ${formattedEvent}`);
20+
window.parent.postMessage(formattedEvent, '*');
21+
},
22+
[prefix],
23+
);
1624

1725
return {
18-
trackExit,
19-
trackFinish,
26+
trackEvent,
2027
};
2128
};

0 commit comments

Comments
 (0)