feat: BIG-171 alerts global and lazy loading.

This commit is contained in:
a.bouhuolia
2021-10-30 20:55:50 +02:00
parent 2d9aaac653
commit b4e1fa4aca
7 changed files with 133 additions and 27 deletions

View File

@@ -12,6 +12,7 @@ import DashboardSplitPane from 'components/Dashboard/DashboardSplitePane';
import GlobalHotkeys from './GlobalHotkeys';
import DashboardProvider from './DashboardProvider';
import DrawersContainer from 'components/DrawersContainer';
import AlertsContainer from 'containers/AlertsContainer';
import EnsureSubscriptionIsActive from '../Guards/EnsureSubscriptionIsActive';
/**
@@ -55,6 +56,7 @@ export default function Dashboard() {
<DialogsContainer />
<GlobalHotkeys />
<DrawersContainer />
<AlertsContainer />
</DashboardProvider>
);
}

View File

@@ -1,26 +1,20 @@
import React from 'react';
import AccountDeleteAlert from 'containers/Alerts/AccountDeleteAlert';
import AccountInactivateAlert from 'containers/Alerts/AccountInactivateAlert';
import AccountActivateAlert from 'containers/Alerts/AccountActivateAlert';
const AccountDeleteAlert = React.lazy(() =>
import('containers/Alerts/AccountDeleteAlert'),
);
const AccountInactivateAlert = React.lazy(() =>
import('containers/Alerts/AccountInactivateAlert'),
);
const AccountActivateAlert = React.lazy(() =>
import('containers/Alerts/AccountActivateAlert'),
);
// import AccountBulkDeleteAlert from 'containers/Alerts/AccountBulkDeleteAlert';
// import AccountBulkInactivateAlert from 'containers/Alerts/AccountBulkInactivateAlert';
// import AccountBulkActivateAlert from 'containers/Alerts/AccountBulkActivateAlert';
/**
* Accounts alert.
*/
export default function AccountsAlerts({
}) {
return (
<div class="accounts-alerts">
<AccountDeleteAlert name={'account-delete'} />
<AccountInactivateAlert name={'account-inactivate'} />
<AccountActivateAlert name={'account-activate'} />
{/* <AccountBulkDeleteAlert name={'accounts-bulk-delete'} />
<AccountBulkInactivateAlert name={'accounts-bulk-inactivate'} />
<AccountBulkActivateAlert name={'accounts-bulk-activate'} /> */}
</div>
)
}
export default [
{ name: 'account-delete', component: AccountDeleteAlert },
{ name: 'account-inactivate', component: AccountInactivateAlert },
{ name: 'account-activate', component: AccountActivateAlert },
];

View File

@@ -7,7 +7,6 @@ import { AccountsChartProvider } from './AccountsChartProvider';
import AccountsViewsTabs from 'containers/Accounts/AccountsViewsTabs';
import AccountsActionsBar from 'containers/Accounts/AccountsActionsBar';
import AccountsAlerts from './AccountsAlerts';
import AccountsDataTable from './AccountsDataTable';
import withAccounts from 'containers/Accounts/withAccounts';
@@ -49,8 +48,6 @@ function AccountsChart({
<AccountsDataTable />
</DashboardContentTable>
</DashboardPageContent>
<AccountsAlerts />
</AccountsChartProvider>
);
}

View File

@@ -0,0 +1,100 @@
import React, { Suspense } from 'react';
import * as R from 'ramda';
import { Intent, Classes, ProgressBar } from '@blueprintjs/core';
import { debounce } from 'lodash';
import styled from 'styled-components';
import clsx from 'classnames';
import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect';
import withAlertActions from 'containers/Alert/withAlertActions';
import { AppToaster } from 'components';
function AlertLazyFallbackMessage({ amount }) {
return (
<React.Fragment>
<ToastText>Alert content is loading, just a second.</ToastText>
<ProgressBar
className={clsx({
[Classes.PROGRESS_NO_STRIPES]: amount >= 100,
})}
intent={amount < 100 ? Intent.PRIMARY : Intent.SUCCESS}
value={amount / 100}
/>
</React.Fragment>
);
}
function AlertLazyFallback({}) {
const progressToastInterval = React.useRef(null);
const toastKey = React.useRef(null);
const toastProgressLoading = (amount) => {
return {
message: <AlertLazyFallbackMessage amount={amount} />,
onDismiss: (didTimeoutExpire) => {
if (!didTimeoutExpire) {
window.clearInterval(progressToastInterval.current);
}
},
timeout: amount < 100 ? 0 : 2000,
};
};
const triggerProgressToast = () => {
let progress = 0;
toastKey.current = AppToaster.show(toastProgressLoading(0));
progressToastInterval.current = window.setInterval(() => {
if (toastKey.current == null || progress > 100) {
window.clearInterval(progressToastInterval.current);
} else {
progress += 10 + Math.random() * 20;
AppToaster.show(toastProgressLoading(progress), toastKey.current);
}
}, 100);
};
const hideProgressToast = () => {
window.clearInterval(progressToastInterval.current);
AppToaster.dismiss(toastKey.current);
};
// Debounce the trigger.
const dobounceTrigger = React.useRef(
debounce(() => {
triggerProgressToast();
}, 500),
);
React.useEffect(() => {
dobounceTrigger.current();
return () => {
hideProgressToast();
dobounceTrigger.current.cancel();
};
});
return null;
}
function AlertLazyInside({ isOpen, name, Component }) {
if (!isOpen) {
return null;
}
return (
<Suspense fallback={<AlertLazyFallback />}>
<Component name={name} />
</Suspense>
);
}
export const AlertLazy = R.compose(
withAlertStoreConnect(),
withAlertActions,
)(AlertLazyInside);
const ToastText = styled.div`
margin-bottom: 10px;
`;

View File

@@ -0,0 +1,13 @@
import React from 'react';
import { AlertLazy } from './components'
import registered from './registered';
export default function AlertsContainer() {
return (
<React.Fragment>
{registered.map((alert) => (
<AlertLazy name={alert.name} Component={alert.component} />
))}
</React.Fragment>
);
}

View File

@@ -0,0 +1,3 @@
import AccountsAlerts from '../Accounts/AccountsAlerts';
export default [...AccountsAlerts];

View File

@@ -14,7 +14,6 @@ import {
Icon,
T,
} from '../../../components';
import AccountsAlerts from './../../Accounts/AccountsAlerts';
import { useCashFlowAccountsContext } from './CashFlowAccountsProvider';
@@ -173,8 +172,6 @@ export default function CashflowAccountsGrid() {
<CashflowAccountsGridItems accounts={cashflowAccounts} />
)}
</BankAccountsList>
<AccountsAlerts />
</CashflowAccountsGridWrap>
);
}