Skip to content
Snippets Groups Projects
Unverified Commit f1d3902e authored by Robert Dyer's avatar Robert Dyer Committed by GitHub
Browse files

Rework bank secrets reset (#2870)

* Rework bank secrets reset

* Fix alignment

* Fix lint errors

* add release note

* Fix typo

* fix typo
parent 8b6ef7b3
No related branches found
No related tags found
No related merge requests found
...@@ -9,14 +9,17 @@ import { useFeatureFlag } from '../../hooks/useFeatureFlag'; ...@@ -9,14 +9,17 @@ import { useFeatureFlag } from '../../hooks/useFeatureFlag';
import { useGoCardlessStatus } from '../../hooks/useGoCardlessStatus'; import { useGoCardlessStatus } from '../../hooks/useGoCardlessStatus';
import { useSimpleFinStatus } from '../../hooks/useSimpleFinStatus'; import { useSimpleFinStatus } from '../../hooks/useSimpleFinStatus';
import { type SyncServerStatus } from '../../hooks/useSyncServerStatus'; import { type SyncServerStatus } from '../../hooks/useSyncServerStatus';
import { SvgDotsHorizontalTriple } from '../../icons/v1';
import { theme } from '../../style'; import { theme } from '../../style';
import { Button, ButtonWithLoading } from '../common/Button'; import { Button, ButtonWithLoading } from '../common/Button';
import { Link } from '../common/Link'; import { Link } from '../common/Link';
import { Menu } from '../common/Menu';
import { Modal } from '../common/Modal'; import { Modal } from '../common/Modal';
import { Paragraph } from '../common/Paragraph'; import { Paragraph } from '../common/Paragraph';
import { Text } from '../common/Text'; import { Text } from '../common/Text';
import { View } from '../common/View'; import { View } from '../common/View';
import { type CommonModalProps } from '../Modals'; import { type CommonModalProps } from '../Modals';
import { Tooltip } from '../tooltips';
type CreateAccountProps = { type CreateAccountProps = {
modalProps: CommonModalProps; modalProps: CommonModalProps;
...@@ -34,6 +37,8 @@ export function CreateAccountModal({ ...@@ -34,6 +37,8 @@ export function CreateAccountModal({
useState(null); useState(null);
const [isSimpleFinSetupComplete, setIsSimpleFinSetupComplete] = const [isSimpleFinSetupComplete, setIsSimpleFinSetupComplete] =
useState(null); useState(null);
const [menuGoCardlessOpen, setGoCardlessMenuOpen] = useState<boolean>(false);
const [menuSimplefinOpen, setSimplefinMenuOpen] = useState<boolean>(false);
const onConnectGoCardless = () => { const onConnectGoCardless = () => {
if (!isGoCardlessSetupComplete) { if (!isGoCardlessSetupComplete) {
...@@ -108,6 +113,36 @@ export function CreateAccountModal({ ...@@ -108,6 +113,36 @@ export function CreateAccountModal({
}); });
}; };
const onGoCardlessReset = () => {
send('secret-set', {
name: 'gocardless_secretId',
value: null,
}).then(() => {
send('secret-set', {
name: 'gocardless_secretKey',
value: null,
}).then(() => {
setIsGoCardlessSetupComplete(false);
setGoCardlessMenuOpen(false);
});
});
};
const onSimpleFinReset = () => {
send('secret-set', {
name: 'simplefin_token',
value: null,
}).then(() => {
send('secret-set', {
name: 'simplefin_accessKey',
value: null,
}).then(() => {
setIsSimpleFinSetupComplete(false);
setSimplefinMenuOpen(false);
});
});
};
const onCreateLocalAccount = () => { const onCreateLocalAccount = () => {
actions.pushModal('add-local-account'); actions.pushModal('add-local-account');
}; };
...@@ -168,20 +203,63 @@ export function CreateAccountModal({ ...@@ -168,20 +203,63 @@ export function CreateAccountModal({
<View style={{ gap: 10 }}> <View style={{ gap: 10 }}>
{syncServerStatus === 'online' ? ( {syncServerStatus === 'online' ? (
<> <>
<ButtonWithLoading <View
disabled={syncServerStatus !== 'online'}
style={{ style={{
padding: '10px 0', flexDirection: 'row',
fontSize: 15, gap: 10,
fontWeight: 600, alignItems: 'center',
flex: 1,
}} }}
onClick={onConnectGoCardless}
> >
{isGoCardlessSetupComplete <ButtonWithLoading
? 'Link bank account with GoCardless' disabled={syncServerStatus !== 'online'}
: 'Set up GoCardless for bank sync'} style={{
</ButtonWithLoading> padding: '10px 0',
fontSize: 15,
fontWeight: 600,
flex: 1,
}}
onClick={onConnectGoCardless}
>
{isGoCardlessSetupComplete
? 'Link bank account with GoCardless'
: 'Set up GoCardless for bank sync'}
</ButtonWithLoading>
{isGoCardlessSetupComplete && (
<Button
type="bare"
onClick={() => setGoCardlessMenuOpen(true)}
aria-label="Menu"
>
<SvgDotsHorizontalTriple
width={15}
height={15}
style={{ transform: 'rotateZ(90deg)' }}
/>
{menuGoCardlessOpen && (
<Tooltip
position="bottom-right"
width={200}
style={{ padding: 0 }}
onClose={() => setGoCardlessMenuOpen(false)}
>
<Menu
onMenuSelect={item => {
if (item === 'reconfigure') {
onGoCardlessReset();
}
}}
items={[
{
name: 'reconfigure',
text: 'Reset GoCardless credentials',
},
]}
/>
</Tooltip>
)}
</Button>
)}
</View>
<Text style={{ lineHeight: '1.4em', fontSize: 15 }}> <Text style={{ lineHeight: '1.4em', fontSize: 15 }}>
<strong> <strong>
Link a <em>European</em> bank account Link a <em>European</em> bank account
...@@ -191,22 +269,65 @@ export function CreateAccountModal({ ...@@ -191,22 +269,65 @@ export function CreateAccountModal({
</Text> </Text>
{simpleFinSyncFeatureFlag === true && ( {simpleFinSyncFeatureFlag === true && (
<> <>
<ButtonWithLoading <View
disabled={syncServerStatus !== 'online'}
loading={loadingSimpleFinAccounts}
style={{ style={{
flexDirection: 'row',
gap: 10,
marginTop: '18px', marginTop: '18px',
padding: '10px 0', alignItems: 'center',
fontSize: 15,
fontWeight: 600,
flex: 1,
}} }}
onClick={onConnectSimpleFin}
> >
{isSimpleFinSetupComplete <ButtonWithLoading
? 'Link bank account with SimpleFIN' disabled={syncServerStatus !== 'online'}
: 'Set up SimpleFIN for bank sync'} loading={loadingSimpleFinAccounts}
</ButtonWithLoading> style={{
padding: '10px 0',
fontSize: 15,
fontWeight: 600,
flex: 1,
}}
onClick={onConnectSimpleFin}
>
{isSimpleFinSetupComplete
? 'Link bank account with SimpleFIN'
: 'Set up SimpleFIN for bank sync'}
</ButtonWithLoading>
{isSimpleFinSetupComplete && (
<Button
type="bare"
onClick={() => setSimplefinMenuOpen(true)}
aria-label="Menu"
>
<SvgDotsHorizontalTriple
width={15}
height={15}
style={{ transform: 'rotateZ(90deg)' }}
/>
{menuSimplefinOpen && (
<Tooltip
position="bottom-right"
width={200}
style={{ padding: 0 }}
onClose={() => setSimplefinMenuOpen(false)}
>
<Menu
onMenuSelect={item => {
if (item === 'reconfigure') {
onSimpleFinReset();
}
}}
items={[
{
name: 'reconfigure',
text: 'Reset SimpleFIN credentials',
},
]}
/>
</Tooltip>
)}
</Button>
)}
</View>
<Text style={{ lineHeight: '1.4em', fontSize: 15 }}> <Text style={{ lineHeight: '1.4em', fontSize: 15 }}>
<strong> <strong>
Link a <em>North American</em> bank account Link a <em>North American</em> bank account
...@@ -236,7 +357,7 @@ export function CreateAccountModal({ ...@@ -236,7 +357,7 @@ export function CreateAccountModal({
to="https://actualbudget.org/docs/advanced/bank-sync" to="https://actualbudget.org/docs/advanced/bank-sync"
linkColor="muted" linkColor="muted"
> >
automatic syncing. automatic syncing
</Link> </Link>
. .
</Paragraph> </Paragraph>
......
...@@ -11,16 +11,13 @@ import { ...@@ -11,16 +11,13 @@ import {
import { useGoCardlessStatus } from '../../hooks/useGoCardlessStatus'; import { useGoCardlessStatus } from '../../hooks/useGoCardlessStatus';
import { AnimatedLoading } from '../../icons/AnimatedLoading'; import { AnimatedLoading } from '../../icons/AnimatedLoading';
import { SvgDotsHorizontalTriple } from '../../icons/v1';
import { theme } from '../../style'; import { theme } from '../../style';
import { Error, Warning } from '../alerts'; import { Error, Warning } from '../alerts';
import { Autocomplete } from '../autocomplete/Autocomplete'; import { Autocomplete } from '../autocomplete/Autocomplete';
import { Button } from '../common/Button'; import { Button } from '../common/Button';
import { Link } from '../common/Link'; import { Link } from '../common/Link';
import { Menu } from '../common/Menu';
import { Modal } from '../common/Modal'; import { Modal } from '../common/Modal';
import { Paragraph } from '../common/Paragraph'; import { Paragraph } from '../common/Paragraph';
import { Popover } from '../common/Popover';
import { View } from '../common/View'; import { View } from '../common/View';
import { FormField, FormLabel } from '../forms'; import { FormField, FormLabel } from '../forms';
import { type CommonModalProps } from '../Modals'; import { type CommonModalProps } from '../Modals';
...@@ -101,9 +98,7 @@ export function GoCardlessExternalMsg({ ...@@ -101,9 +98,7 @@ export function GoCardlessExternalMsg({
const [isGoCardlessSetupComplete, setIsGoCardlessSetupComplete] = useState< const [isGoCardlessSetupComplete, setIsGoCardlessSetupComplete] = useState<
boolean | null boolean | null
>(null); >(null);
const [menuOpen, setMenuOpen] = useState<boolean>(false);
const data = useRef<GoCardlessToken | null>(null); const data = useRef<GoCardlessToken | null>(null);
const triggerRef = useRef(null);
const { const {
data: bankOptions, data: bankOptions,
...@@ -230,39 +225,6 @@ export function GoCardlessExternalMsg({ ...@@ -230,39 +225,6 @@ export function GoCardlessExternalMsg({
> >
Link bank in browser &rarr; Link bank in browser &rarr;
</Button> </Button>
<Button
ref={triggerRef}
type="bare"
onClick={() => setMenuOpen(true)}
aria-label="Menu"
>
<SvgDotsHorizontalTriple
width={15}
height={15}
style={{ transform: 'rotateZ(90deg)' }}
/>
<Popover
triggerRef={triggerRef}
isOpen={menuOpen}
style={{ width: 200 }}
onOpenChange={() => setMenuOpen(false)}
>
<Menu
onMenuSelect={item => {
if (item === 'reconfigure') {
onGoCardlessInit();
}
}}
items={[
{
name: 'reconfigure',
text: 'Set new API secrets',
},
]}
/>
</Popover>
</Button>
</View> </View>
</View> </View>
); );
......
---
category: Enhancements
authors: [psybers]
---
Allow resetting SimpleFIN secrets and unify how bank sync secrets are reset.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment