@basiq/connect-auth 0.1.76 → 0.1.79
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/LICENSE +21 -0
- package/README.md +159 -1
- package/dist/App.d.ts +3 -0
- package/dist/BasiqConnect.d.ts +3 -0
- package/dist/actions/actions.d.ts +22 -0
- package/dist/components/modals/LoadingModal.d.ts +8 -0
- package/dist/components/modals/index.d.ts +1 -0
- package/dist/components/pages/AuthScreen.d.ts +9 -0
- package/dist/components/pages/NotFound.d.ts +6 -0
- package/dist/components/pages/Page.d.ts +18 -0
- package/dist/components/pages/StartScreen.d.ts +10 -0
- package/dist/components/pages/index.d.ts +4 -0
- package/dist/components/ui/Button.d.ts +10 -0
- package/dist/components/ui/Modal.d.ts +9 -0
- package/dist/components/ui/icon.d.ts +7 -0
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/connect-auth.cjs.development.js +1494 -0
- package/dist/connect-auth.cjs.development.js.map +1 -0
- package/dist/connect-auth.cjs.production.min.js +2 -0
- package/dist/connect-auth.cjs.production.min.js.map +1 -0
- package/dist/connect-auth.esm.js +1486 -0
- package/dist/connect-auth.esm.js.map +1 -0
- package/dist/helpers/constants.d.ts +1 -0
- package/dist/helpers/hookUtils.d.ts +2 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/utils.d.ts +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8 -0
- package/dist/locales/i18n.d.ts +36 -0
- package/dist/setupTests.d.ts +1 -0
- package/dist/styledComponents/base.d.ts +4 -0
- package/dist/styledComponents/breakpoints.d.ts +15 -0
- package/dist/styledComponents/index.d.ts +4 -0
- package/dist/styledComponents/pages/auth.d.ts +10 -0
- package/dist/styledComponents/pages/basic.d.ts +23 -0
- package/dist/styledComponents/pages/index.d.ts +4 -0
- package/dist/styledComponents/pages/notFound.d.ts +9 -0
- package/dist/styledComponents/pages/start.d.ts +1 -0
- package/dist/styledComponents/styles.d.ts +2 -0
- package/dist/styledComponents/theme.d.ts +45 -0
- package/dist/styledComponents/ui/basic.d.ts +10 -0
- package/dist/styledComponents/ui/button.d.ts +9 -0
- package/dist/styledComponents/ui/index.d.ts +3 -0
- package/dist/styledComponents/ui/modals.d.ts +7 -0
- package/package.json +63 -99
- package/src/App.tsx +96 -0
- package/src/BasiqConnect.tsx +17 -0
- package/src/actions/actions.ts +72 -0
- package/src/components/modals/LoadingModal.tsx +28 -0
- package/src/components/modals/index.ts +1 -0
- package/src/components/pages/AuthScreen.tsx +96 -0
- package/src/components/pages/NotFound.tsx +44 -0
- package/src/components/pages/Page.tsx +46 -0
- package/src/components/pages/StartScreen.tsx +83 -0
- package/src/components/pages/index.ts +4 -0
- package/src/components/ui/Button.tsx +24 -0
- package/src/components/ui/Modal.tsx +29 -0
- package/src/components/ui/icon.tsx +18 -0
- package/src/components/ui/index.ts +1 -0
- package/src/custom.d.ts +9 -0
- package/{dist/25001c0659b6d43e86d2ee06256a7f63.otf → src/fonts/Mark-W1G-Bold.otf} +0 -0
- package/{dist/9763eea8f13903a473622431f7cb7c5c.otf → src/fonts/Mark-W1G-Book.otf} +0 -0
- package/src/fonts.d.ts +1 -0
- package/src/helpers/constants.ts +2 -0
- package/src/helpers/hookUtils.ts +8 -0
- package/src/helpers/index.ts +3 -0
- package/src/helpers/utils.ts +12 -0
- package/src/images/back.svg +8 -0
- package/src/images/error.svg +10 -0
- package/src/images/loading_indicator.svg +14 -0
- package/src/index.tsx +1 -0
- package/src/locales/en/translation.json +29 -0
- package/src/locales/i18n.ts +27 -0
- package/src/logo.svg +1 -0
- package/src/react-app-env.d.ts +1 -0
- package/src/react-i18next.d.ts +9 -0
- package/src/setupTests.ts +5 -0
- package/src/styled.d.ts +6 -0
- package/src/styledComponents/base.ts +73 -0
- package/src/styledComponents/breakpoints.ts +32 -0
- package/src/styledComponents/index.ts +4 -0
- package/src/styledComponents/pages/auth.ts +49 -0
- package/src/styledComponents/pages/basic.ts +126 -0
- package/src/styledComponents/pages/index.ts +4 -0
- package/src/styledComponents/pages/notFound.ts +70 -0
- package/src/styledComponents/pages/start.ts +6 -0
- package/src/styledComponents/styles.ts +25 -0
- package/src/styledComponents/theme.ts +58 -0
- package/src/styledComponents/ui/basic.ts +96 -0
- package/src/styledComponents/ui/button.ts +112 -0
- package/src/styledComponents/ui/index.ts +3 -0
- package/src/styledComponents/ui/modals.ts +48 -0
- package/.eslintignore +0 -1
- package/dist/60fda426a98e8c5b0470d694e2c66520.otf +0 -1
- package/dist/d4bd6e2e30a9c41422cecb85a045da71.otf +0 -1
- package/dist/main.js +0 -2
- package/dist/main.js.LICENSE.txt +0 -8
- package/tsconfig.json +0 -24
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React, { ChangeEvent, useState } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import Page, { IButton } from './Page';
|
|
4
|
+
import { DivAsLink, InputContainer, InputStyled, PageConnectFooterControl, PageConnectFooterText, StatusMessage } from '../../styledComponents';
|
|
5
|
+
import { InnerContainer } from '../../styledComponents/pages/start';
|
|
6
|
+
import { LoadingModal } from '../modals';
|
|
7
|
+
import { authUser, verifySmsCode } from '../../actions/actions';
|
|
8
|
+
|
|
9
|
+
interface IProps {
|
|
10
|
+
shadow: boolean;
|
|
11
|
+
onBack: () => void;
|
|
12
|
+
number: string;
|
|
13
|
+
authId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function AuthScreen({ onBack, number, authId, shadow }: IProps) {
|
|
17
|
+
const { t } = useTranslation();
|
|
18
|
+
const [error, setError] = useState('');
|
|
19
|
+
const [code, setCode] = useState('');
|
|
20
|
+
const [resend, setResend] = useState(false);
|
|
21
|
+
const [loading, setLoading] = useState(false);
|
|
22
|
+
const handleCodeApply = async () => {
|
|
23
|
+
setLoading(true);
|
|
24
|
+
const response = await verifySmsCode(authId, code);
|
|
25
|
+
setLoading(false);
|
|
26
|
+
if (response?.data?.access_token) {
|
|
27
|
+
window.open(`https://consent.basiq.io/home?token=${response?.data?.access_token}`);
|
|
28
|
+
}
|
|
29
|
+
if (response?.error) {
|
|
30
|
+
setError(t('this_code_doesnt_appear_to_be_valid'));
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const buttons: IButton[] = [
|
|
34
|
+
{
|
|
35
|
+
label: t('continue'),
|
|
36
|
+
onClick: () => handleCodeApply()
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const handleResend = async () => {
|
|
41
|
+
setError('');
|
|
42
|
+
setCode('');
|
|
43
|
+
setLoading(true);
|
|
44
|
+
const response = await authUser(authId);
|
|
45
|
+
setLoading(false);
|
|
46
|
+
if (response.error) {
|
|
47
|
+
setError(t('failed_to_send_sms'));
|
|
48
|
+
} else {
|
|
49
|
+
setResend(true);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const handleInput = (e: ChangeEvent<HTMLInputElement>) => {
|
|
53
|
+
setError('');
|
|
54
|
+
setResend(false);
|
|
55
|
+
setCode(e.target.value);
|
|
56
|
+
};
|
|
57
|
+
return (
|
|
58
|
+
<Page
|
|
59
|
+
title={t('verify_your_mobile_number')}
|
|
60
|
+
subTitle={t('please_enter_the_sms_code_sent_to_your_mobile_number', { number })}
|
|
61
|
+
shadow={shadow}
|
|
62
|
+
buttons={buttons}
|
|
63
|
+
onBack={onBack}
|
|
64
|
+
>
|
|
65
|
+
<InnerContainer>
|
|
66
|
+
<InputContainer>
|
|
67
|
+
<InputStyled
|
|
68
|
+
pattern="\d{4}"
|
|
69
|
+
inputMode="numeric"
|
|
70
|
+
autoComplete="one-time-code"
|
|
71
|
+
type="text"
|
|
72
|
+
maxLength={4}
|
|
73
|
+
onChange={handleInput}
|
|
74
|
+
value={code}
|
|
75
|
+
filled={code.length === 4}
|
|
76
|
+
error={!!error}
|
|
77
|
+
/>
|
|
78
|
+
</InputContainer>
|
|
79
|
+
<PageConnectFooterControl>
|
|
80
|
+
{resend && <StatusMessage>{t<string>('new_sms_code_has_been_sent')}</StatusMessage>}
|
|
81
|
+
{!!error && <StatusMessage error>{error}</StatusMessage>}
|
|
82
|
+
<PageConnectFooterText>
|
|
83
|
+
<span>
|
|
84
|
+
<>
|
|
85
|
+
{t('didnt_receive_the_code')} <DivAsLink onClick={() => handleResend()}>{t<string>('resend_sms')}</DivAsLink>
|
|
86
|
+
</>
|
|
87
|
+
</span>
|
|
88
|
+
</PageConnectFooterText>
|
|
89
|
+
</PageConnectFooterControl>
|
|
90
|
+
<LoadingModal isOpen={loading} />
|
|
91
|
+
</InnerContainer>
|
|
92
|
+
</Page>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default AuthScreen;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import {
|
|
4
|
+
PageControlsSection,
|
|
5
|
+
PageShadowWrapper,
|
|
6
|
+
PageStatusScreenContent,
|
|
7
|
+
PageStatusScreenMain,
|
|
8
|
+
PageStyled,
|
|
9
|
+
StatusScreenCircleContainer,
|
|
10
|
+
StatusScreenErrorCode
|
|
11
|
+
} from '../../styledComponents';
|
|
12
|
+
import Icon from '../ui/icon';
|
|
13
|
+
import Page from './Page';
|
|
14
|
+
import err from '../../images/error.svg';
|
|
15
|
+
|
|
16
|
+
interface IProps {
|
|
17
|
+
messageCode?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function NotFound({ messageCode = '404' }: IProps) {
|
|
21
|
+
const { t } = useTranslation();
|
|
22
|
+
return (
|
|
23
|
+
<Page shadow={false}>
|
|
24
|
+
<PageStyled>
|
|
25
|
+
<PageStatusScreenMain>
|
|
26
|
+
<PageStyled>
|
|
27
|
+
<PageStatusScreenContent>
|
|
28
|
+
<StatusScreenCircleContainer type="warning">
|
|
29
|
+
<Icon img={err} rotating={false} />
|
|
30
|
+
</StatusScreenCircleContainer>
|
|
31
|
+
<span>{t<string>('page_not_found')}</span>
|
|
32
|
+
<StatusScreenErrorCode>{`${t('error')}: ${messageCode}`}</StatusScreenErrorCode>
|
|
33
|
+
</PageStatusScreenContent>
|
|
34
|
+
</PageStyled>
|
|
35
|
+
</PageStatusScreenMain>
|
|
36
|
+
<PageControlsSection notEmpty={false}>
|
|
37
|
+
<PageShadowWrapper />
|
|
38
|
+
</PageControlsSection>
|
|
39
|
+
</PageStyled>
|
|
40
|
+
</Page>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default NotFound;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { ReactElement } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { Button } from '../ui';
|
|
4
|
+
import { PageControlsSection, PageMainContainer, PageShadow, PageShadowWrapper, PageStyled, PageSubtitle } from '../../styledComponents';
|
|
5
|
+
import { ButtonType } from '../ui/Button';
|
|
6
|
+
|
|
7
|
+
interface IProps {
|
|
8
|
+
buttons?: IButton[];
|
|
9
|
+
children: ReactElement;
|
|
10
|
+
title?: string | ReactElement;
|
|
11
|
+
subTitle?: string;
|
|
12
|
+
shadow: boolean;
|
|
13
|
+
onBack?: () => void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IButton {
|
|
17
|
+
label: string;
|
|
18
|
+
onClick: () => void;
|
|
19
|
+
buttonType?: ButtonType;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function Page(props: IProps) {
|
|
24
|
+
const { buttons, children, title, subTitle, shadow, onBack } = props;
|
|
25
|
+
|
|
26
|
+
const { t } = useTranslation();
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<PageStyled buttonCount={buttons?.length}>
|
|
30
|
+
{onBack && <Button onClick={onBack} label={t('back')} buttonType="back" />}
|
|
31
|
+
{title && <h3>{title}</h3>}
|
|
32
|
+
{subTitle && <PageSubtitle>{subTitle}</PageSubtitle>}
|
|
33
|
+
<PageMainContainer>{children}</PageMainContainer>
|
|
34
|
+
<PageControlsSection notEmpty={(buttons?.length ?? 0) > 0}>
|
|
35
|
+
<PageShadowWrapper>
|
|
36
|
+
{shadow && <PageShadow />}
|
|
37
|
+
{buttons?.map((b, index) => (
|
|
38
|
+
<Button key={index} onClick={b.onClick} label={b.label} buttonType={b.buttonType} disabled={b.disabled} />
|
|
39
|
+
))}
|
|
40
|
+
</PageShadowWrapper>
|
|
41
|
+
</PageControlsSection>
|
|
42
|
+
</PageStyled>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default Page;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Trans, useTranslation } from 'react-i18next';
|
|
3
|
+
import Page, { IButton } from './Page';
|
|
4
|
+
import { H4Styled, Spacer, InnerContainer } from '../../styledComponents';
|
|
5
|
+
import { authUser } from '../../actions/actions';
|
|
6
|
+
import { LoadingModal } from '../modals';
|
|
7
|
+
|
|
8
|
+
interface IProps {
|
|
9
|
+
onContinue: () => void;
|
|
10
|
+
showErrorScreen: (code:string) => void;
|
|
11
|
+
shadow: boolean;
|
|
12
|
+
appName: string;
|
|
13
|
+
authId?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function StartScreen(props: IProps) {
|
|
17
|
+
const { onContinue, appName, shadow, authId } = props;
|
|
18
|
+
const [loading, setLoading] = useState(false);
|
|
19
|
+
const { t } = useTranslation();
|
|
20
|
+
const handleContinue = async () => {
|
|
21
|
+
setLoading(true);
|
|
22
|
+
if(!!authId){
|
|
23
|
+
const response = await authUser(authId);
|
|
24
|
+
if (response?.data?.status === 'code-sent') {
|
|
25
|
+
setLoading(false);
|
|
26
|
+
onContinue();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
};
|
|
31
|
+
const buttons: IButton[] = [
|
|
32
|
+
{
|
|
33
|
+
label: t('continue'),
|
|
34
|
+
onClick: () => handleContinue()
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
return (
|
|
38
|
+
<Page
|
|
39
|
+
title={
|
|
40
|
+
appName ? (
|
|
41
|
+
<Trans t={t} i18nKey="use_basiq_to_connect_your_accounts" values={{ name: appName }} components={{ bold: <strong /> }} />
|
|
42
|
+
) : (
|
|
43
|
+
<Trans t={t} i18nKey="we_use_basiq_to_connect_your_accounts" components={{ bold: <strong /> }} />
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
shadow={shadow}
|
|
47
|
+
buttons={buttons}
|
|
48
|
+
>
|
|
49
|
+
<InnerContainer>
|
|
50
|
+
<Spacer />
|
|
51
|
+
<H4Styled>{t<string>('to_do_this_we_will_ask_you_to')}</H4Styled>
|
|
52
|
+
<ul>
|
|
53
|
+
<li>
|
|
54
|
+
<Trans t={t} i18nKey="verify_your_mobile_number_bold" components={{ bold: <strong /> }} />
|
|
55
|
+
</li>
|
|
56
|
+
<li>
|
|
57
|
+
<Trans t={t} i18nKey="consent_to_share_your_data_with_us" components={{ bold: <strong /> }} />
|
|
58
|
+
</li>
|
|
59
|
+
<li>
|
|
60
|
+
<Trans t={t} i18nKey="share_your_financial_data" components={{ bold: <strong /> }} />
|
|
61
|
+
</li>
|
|
62
|
+
</ul>
|
|
63
|
+
<H4Styled>{t<string>('things_you_should_know')}</H4Styled>
|
|
64
|
+
<ul>
|
|
65
|
+
<li>{t<string>('we_dont_share_your_data_without_your_consent')}</li>
|
|
66
|
+
<li>{t<string>('you_can_easily_stop_sharing_your_data_at_any_time')}</li>
|
|
67
|
+
<li>{t<string>('you_can_choose_to_delete_shared_data_when_we_no_longer_need_it')}</li>
|
|
68
|
+
</ul>
|
|
69
|
+
<Spacer />
|
|
70
|
+
<span>
|
|
71
|
+
<>
|
|
72
|
+
{t('by_proceeding_you_agree_to_the')}{' '}
|
|
73
|
+
<a href="https://docs.basiq.io/en/articles/415750-basiq-terms-of-service">{t<string>('terms_of_service')}</a> {t('and')}{' '}
|
|
74
|
+
<a href="https://docs.basiq.io/en/articles/382581-basiq-privacy-policy">{t<string>('privacy_notice')}</a>
|
|
75
|
+
</>
|
|
76
|
+
</span>
|
|
77
|
+
<LoadingModal isOpen={loading} />
|
|
78
|
+
</InnerContainer>
|
|
79
|
+
</Page>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default StartScreen;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ButtonLabel, ButtonStyled } from '../../styledComponents';
|
|
3
|
+
import back from '../../images/back.svg';
|
|
4
|
+
|
|
5
|
+
export type ButtonType = 'secondary' | 'tiny' | 'link' | 'back';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
onClick: () => void;
|
|
9
|
+
label: string;
|
|
10
|
+
buttonType?: ButtonType;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function Button(props: Props) {
|
|
15
|
+
const { onClick, label, buttonType, disabled } = props;
|
|
16
|
+
return (
|
|
17
|
+
<ButtonStyled buttonType={buttonType} disabled={disabled || false} onClick={onClick}>
|
|
18
|
+
{buttonType === 'back' && <img src={back} alt="" />}
|
|
19
|
+
<ButtonLabel> {label || ''}</ButtonLabel>
|
|
20
|
+
</ButtonStyled>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default Button;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { ReactElement, SyntheticEvent } from 'react';
|
|
2
|
+
import { ModalStyled } from '../../styledComponents';
|
|
3
|
+
|
|
4
|
+
interface IProps {
|
|
5
|
+
children: ReactElement;
|
|
6
|
+
onClose?: () => void;
|
|
7
|
+
isOpen: boolean;
|
|
8
|
+
disableTransparency: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function Modal(props: IProps) {
|
|
12
|
+
const { children, onClose, isOpen, disableTransparency } = props;
|
|
13
|
+
const handleOutsideClick = (e: SyntheticEvent<HTMLElement>) => {
|
|
14
|
+
if (onClose && (e.target as HTMLElement).id === 'ui-modal') {
|
|
15
|
+
onClose();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
{isOpen ? (
|
|
21
|
+
<ModalStyled id="ui-modal" disableTransparency={disableTransparency} onClick={handleOutsideClick}>
|
|
22
|
+
{children}
|
|
23
|
+
</ModalStyled>
|
|
24
|
+
) : null}
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default Modal;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IconWrapper } from '../../styledComponents';
|
|
3
|
+
|
|
4
|
+
interface IProps {
|
|
5
|
+
rotating: boolean;
|
|
6
|
+
img: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function Icon(props: IProps) {
|
|
10
|
+
const { rotating, img } = props;
|
|
11
|
+
return (
|
|
12
|
+
<IconWrapper rotating={rotating}>
|
|
13
|
+
<img src={img} alt="" />
|
|
14
|
+
</IconWrapper>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default Icon;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Button } from './Button';
|
package/src/custom.d.ts
ADDED
|
File without changes
|
|
File without changes
|
package/src/fonts.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module '*.otf';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SyntheticEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
export function detectScrollToBottom(event: SyntheticEvent<HTMLDivElement>) {
|
|
4
|
+
const { scrollHeight, scrollTop, clientHeight } = event.currentTarget;
|
|
5
|
+
return scrollHeight - scrollTop > clientHeight;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const hexToRGBa = (hex: string, opacity: number) => {
|
|
9
|
+
const hexToRGBA = hex.match(/[A-Za-z0-9]{2}/g)?.map((v) => parseInt(v, 16));
|
|
10
|
+
const opp = opacity > 1 && opacity < 0 ? 1 : opacity;
|
|
11
|
+
return `rgba(${hexToRGBA?.concat(opp).join()})`;
|
|
12
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<!-- Generated by IcoMoon.io -->
|
|
2
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
|
|
3
|
+
<title></title>
|
|
4
|
+
<g id="icomoon-ignore">
|
|
5
|
+
</g>
|
|
6
|
+
<path fill="#000" d="M682.667 469.333h-241.493l53.333-55.893c7.287-7.645 11.77-18.019 11.77-29.44 0-23.584-19.119-42.703-42.703-42.703-12.164 0-23.139 5.085-30.917 13.246l-0.016 0.017-122.027 128c-1.338 1.628-2.607 3.44-3.731 5.347l-0.109 0.199c-1.886 2.326-3.467 5.004-4.62 7.899l-0.073 0.207c-1.426 3.52-2.347 7.596-2.557 11.859l-0.003 0.088-0.853 3.84c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.2 5.299 5.227 9.831 8.968 13.662l127.992 127.992c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-54.613h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"></path>
|
|
7
|
+
<path fill="#000" d="M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"></path>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<!-- Generated by IcoMoon.io -->
|
|
2
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
|
|
3
|
+
<title></title>
|
|
4
|
+
<g id="icomoon-ignore">
|
|
5
|
+
</g>
|
|
6
|
+
<path fill="#fabe34" d="M512 0c282.77 0 512 229.23 512 512s-229.23 512-512 512c-282.77 0-512-229.23-512-512s229.23-512 512-512z"></path>
|
|
7
|
+
<path fill="#fff" d="M336.968 320.978c-33.427 33.427-49.307 89.357-49.307 183.024 0 93.669 15.88 149.598 49.307 183.026 33.429 33.429 89.357 49.309 183.026 49.309s149.597-15.88 183.026-49.309c33.427-33.427 49.307-89.357 49.307-183.026 0-93.667-15.88-149.597-49.307-183.024-33.429-33.429-89.357-49.309-183.026-49.309s-149.597 15.88-183.026 49.309zM307.978 291.986c45.586-45.586 116.074-61.317 212.016-61.317s166.43 15.731 212.016 61.317c45.586 45.586 61.317 116.074 61.317 212.016 0 95.944-15.731 166.432-61.317 212.018s-116.074 61.317-212.016 61.317c-95.942 0-166.43-15.731-212.016-61.317-45.587-45.586-61.317-116.074-61.317-212.018 0-95.942 15.73-166.43 61.317-212.016z"></path>
|
|
8
|
+
<path fill="#fff" d="M519.992 377.037c11.322 0 20.501 9.178 20.501 20.499v106.464c0 11.322-9.179 20.499-20.501 20.499s-20.499-9.178-20.499-20.499v-106.464c0-11.322 9.178-20.499 20.499-20.499z"></path>
|
|
9
|
+
<path fill="#fff" d="M499.379 599.667c0-11.323 9.178-20.501 20.499-20.501h0.246c11.322 0 20.501 9.178 20.501 20.501s-9.179 20.499-20.501 20.499h-0.246c-11.322 0-20.499-9.178-20.499-20.499z"></path>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- Generated by IcoMoon.io -->
|
|
2
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
|
|
3
|
+
<title></title>
|
|
4
|
+
<g id="icomoon-ignore">
|
|
5
|
+
</g>
|
|
6
|
+
<path d="M511.992 163.041c8.157 0 14.769 6.612 14.769 14.769v204.227c0 8.157-6.613 14.769-14.769 14.769s-14.769-6.613-14.769-14.769v-204.227c0-8.157 6.613-14.769 14.769-14.769z"></path>
|
|
7
|
+
<path d="M511.998 627.192c8.157 0 14.769 6.613 14.769 14.769v204.227c0 8.157-6.613 14.769-14.769 14.769s-14.769-6.613-14.769-14.769v-204.227c0-8.157 6.613-14.769 14.769-14.769z"></path>
|
|
8
|
+
<path d="M860.952 512c0 8.157-6.613 14.769-14.769 14.769h-204.227c-8.159 0-14.769-6.613-14.769-14.769s6.611-14.769 14.769-14.769h204.227c8.157 0 14.769 6.613 14.769 14.769z"></path>
|
|
9
|
+
<path d="M396.8 512c0 8.157-6.613 14.769-14.769 14.769h-204.227c-8.157 0-14.769-6.613-14.769-14.769s6.612-14.769 14.769-14.769h204.227c8.157 0 14.769 6.613 14.769 14.769z"></path>
|
|
10
|
+
<path d="M758.754 265.251c5.766 5.768 5.766 15.12 0 20.886l-144.412 144.412c-5.768 5.768-15.118 5.768-20.886 0s-5.768-15.12 0-20.888l144.41-144.41c5.768-5.768 15.12-5.768 20.888 0z"></path>
|
|
11
|
+
<path d="M430.545 593.455c5.768 5.768 5.768 15.12 0 20.888l-144.412 144.41c-5.766 5.768-15.118 5.768-20.886 0s-5.768-15.12 0-20.888l144.41-144.41c5.768-5.768 15.12-5.768 20.888 0z"></path>
|
|
12
|
+
<path d="M758.752 758.752c-5.768 5.768-15.12 5.768-20.888 0l-144.41-144.41c-5.768-5.768-5.768-15.12 0-20.888s15.12-5.768 20.888 0l144.41 144.41c5.768 5.768 5.768 15.12 0 20.888z"></path>
|
|
13
|
+
<path d="M430.543 430.549c-5.768 5.768-15.12 5.768-20.888 0l-144.41-144.412c-5.768-5.768-5.768-15.118 0-20.886s15.118-5.768 20.886 0l144.412 144.41c5.768 5.768 5.768 15.12 0 20.888z"></path>
|
|
14
|
+
</svg>
|
package/src/index.tsx
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {BasiqConnect} from './BasiqConnect'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"back": "Back",
|
|
3
|
+
"error": "Error",
|
|
4
|
+
"loading": "Loading",
|
|
5
|
+
"continue": "Continue",
|
|
6
|
+
"to_do_this_we_will_ask_you_to": "To do this we will ask you to",
|
|
7
|
+
"verify_your_mobile_number_bold": "<strong>Verify</strong> your mobile number",
|
|
8
|
+
"verify_your_mobile_number": "Verify your mobile number",
|
|
9
|
+
"consent_to_share_your_data_with_us": "<strong>Consent</strong> to share your data with us",
|
|
10
|
+
"share_your_financial_data": "<strong>Share</strong> your financial data",
|
|
11
|
+
"things_you_should_know": "Things you should know",
|
|
12
|
+
"we_dont_share_your_data_without_your_consent": "We don’t share your data without your consent",
|
|
13
|
+
"you_can_easily_stop_sharing_your_data_at_any_time": "You can easily stop sharing your data at any time",
|
|
14
|
+
"you_can_choose_to_delete_shared_data_when_we_no_longer_need_it": "You can choose to delete shared data when we no longer need it",
|
|
15
|
+
"by_proceeding_you_agree_to_the": "By proceeding, you agree to the",
|
|
16
|
+
"terms_of_service": "Terms of service",
|
|
17
|
+
"privacy_notice": "Privacy notice",
|
|
18
|
+
"and": "and",
|
|
19
|
+
"use_basiq_to_connect_your_accounts": "${name} use <strong>Basiq</strong> to connect your accounts",
|
|
20
|
+
"we_use_basiq_to_connect_your_accounts": "We use <strong>Basiq</strong> to connect your accounts",
|
|
21
|
+
"please_enter_the_sms_code_sent_to_your_mobile_number": "Please enter the SMS code sent to your mobile number (ending in xxx${number}).",
|
|
22
|
+
"new_sms_code_has_been_sent": "New SMS code has been sent.",
|
|
23
|
+
"this_code_doesnt_appear_to_be_valid": "This code doesn't appear to be valid.",
|
|
24
|
+
"didnt_receive_the_code": "Didn’t receive the code?",
|
|
25
|
+
"resend_sms": "Resend SMS",
|
|
26
|
+
"failed_to_send_sms": "Failed to send SMS.",
|
|
27
|
+
"page_not_found": "Page not found",
|
|
28
|
+
"missing_authentication_token": "Missing Authentication Token"
|
|
29
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import i18n from 'i18next';
|
|
2
|
+
import { initReactI18next } from 'react-i18next';
|
|
3
|
+
|
|
4
|
+
import translationEN from './en/translation.json';
|
|
5
|
+
|
|
6
|
+
export const defaultNS = 'ns1';
|
|
7
|
+
|
|
8
|
+
// the translations
|
|
9
|
+
export const resources = {
|
|
10
|
+
en: {
|
|
11
|
+
ns1: translationEN
|
|
12
|
+
}
|
|
13
|
+
} as const;
|
|
14
|
+
|
|
15
|
+
i18n.use(initReactI18next) // passes i18n down to react-i18next
|
|
16
|
+
.init({
|
|
17
|
+
resources,
|
|
18
|
+
lng: 'en',
|
|
19
|
+
ns: ['ns1'],
|
|
20
|
+
interpolation: {
|
|
21
|
+
escapeValue: false, // react already safes from xss
|
|
22
|
+
prefix: '${',
|
|
23
|
+
suffix: '}'
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export default i18n;
|
package/src/logo.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="react-scripts" />
|
package/src/styled.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { devices } from './breakpoints';
|
|
3
|
+
|
|
4
|
+
export const Root = styled.div`
|
|
5
|
+
white-space: pre-line;
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
position: fixed;
|
|
10
|
+
top: 50%;
|
|
11
|
+
left: 0;
|
|
12
|
+
right: 0;
|
|
13
|
+
transform: translate(0, -50%);
|
|
14
|
+
height: 100%;
|
|
15
|
+
max-height: 812px;
|
|
16
|
+
|
|
17
|
+
a {
|
|
18
|
+
text-decoration: none;
|
|
19
|
+
color: ${({ theme }) => theme.color.endeavour};
|
|
20
|
+
}
|
|
21
|
+
h3 {
|
|
22
|
+
font-weight: normal;
|
|
23
|
+
${({ theme }) => theme.mixin.title()};
|
|
24
|
+
strong {
|
|
25
|
+
${({ theme }) => theme.mixin.title()};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
${devices.phone} {
|
|
29
|
+
width: 100%;
|
|
30
|
+
height: 100%;
|
|
31
|
+
max-height: none;
|
|
32
|
+
padding: 0;
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
export const AppContainer = styled.div`
|
|
36
|
+
width: 539px;
|
|
37
|
+
background-color: ${({ theme }) => theme.color.white};
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-direction: column;
|
|
40
|
+
align-items: center;
|
|
41
|
+
padding: 16px;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
height: 100%;
|
|
44
|
+
|
|
45
|
+
${devices.phone} {
|
|
46
|
+
width: 100%;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&::-webkit-scrollbar {
|
|
50
|
+
display: none;
|
|
51
|
+
}
|
|
52
|
+
-ms-overflow-style: none;
|
|
53
|
+
scrollbar-width: none;
|
|
54
|
+
overflow-y: scroll;
|
|
55
|
+
`;
|
|
56
|
+
export const AppContainerWrapper = styled.div`
|
|
57
|
+
height: 100%;
|
|
58
|
+
position: relative;
|
|
59
|
+
border: 1px solid ${({ theme }) => theme.color.porcelain};
|
|
60
|
+
border-radius: 8px;
|
|
61
|
+
overflow: hidden;
|
|
62
|
+
${devices.phone} {
|
|
63
|
+
width: 100%;
|
|
64
|
+
border-radius: unset;
|
|
65
|
+
border: unset;
|
|
66
|
+
}
|
|
67
|
+
`;
|
|
68
|
+
export const AppContainerPage = styled.div`
|
|
69
|
+
width: 100%;
|
|
70
|
+
display: flex;
|
|
71
|
+
flex-direction: column;
|
|
72
|
+
align-items: center;
|
|
73
|
+
`;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const breakpoints = {
|
|
2
|
+
mobileS: '320px',
|
|
3
|
+
mobileL: '480px',
|
|
4
|
+
tabletMinus: '767px',
|
|
5
|
+
tabletH: '781px',
|
|
6
|
+
tablet: '768px',
|
|
7
|
+
tabletL: '992px',
|
|
8
|
+
laptop: '1024px',
|
|
9
|
+
laptopH: '1080px',
|
|
10
|
+
laptopXS: '1110px',
|
|
11
|
+
laptopS: '1280px',
|
|
12
|
+
laptopM: '1366px',
|
|
13
|
+
laptopL: '1440px',
|
|
14
|
+
laptopXL: '1540px',
|
|
15
|
+
desktopS: '1800px',
|
|
16
|
+
desktop: '2560px'
|
|
17
|
+
};
|
|
18
|
+
export const devices = {
|
|
19
|
+
fold: `@media only screen and (max-width: ${breakpoints.mobileS})`,
|
|
20
|
+
phoneXs: `@media only screen and (max-width: ${breakpoints.mobileL})`,
|
|
21
|
+
phone: `@media only screen and (max-width: ${breakpoints.tabletMinus})`,
|
|
22
|
+
phoneLandscape: `@media only screen and (max-width: ${breakpoints.mobileL})`,
|
|
23
|
+
tabletOnly: `@media only screen and (min-width: ${breakpoints.tablet}) and (max-width: ${breakpoints.tabletL})`,
|
|
24
|
+
iPadProLandscape: `@media only screen and (height: ${breakpoints.laptop}) and (width: ${breakpoints.laptopM})`,
|
|
25
|
+
iPadProPortrait: `@media only screen and (max-width: ${breakpoints.laptop}) and (max-height: ${breakpoints.laptopM})`,
|
|
26
|
+
iPad: `@media only screen and (max-width: ${breakpoints.laptop}) and (max-height: ${breakpoints.tablet}) `,
|
|
27
|
+
tablet: `@media only screen and (max-width: ${breakpoints.tabletL}) `,
|
|
28
|
+
desktop: `@media only screen and (min-height: ${breakpoints.tabletH} ) and (min-width: ${breakpoints.laptopS} ) `,
|
|
29
|
+
laptop: `@media only screen and (max-width: ${breakpoints.laptopS}) `,
|
|
30
|
+
laptopRegularScreenWidth: `@media only screen (max-height: ${breakpoints.laptopXS}) and and (max-width: ${breakpoints.laptopXL}) `,
|
|
31
|
+
bigDesktop: `@media only screen and (min-width: ${breakpoints.desktopS}) and (min-height: ${breakpoints.laptopH})) `
|
|
32
|
+
};
|