actual/packages/desktop-client/src/global-events.js
Tom French 9c0df36e16
Sort import in alphabetical order (#238)
* style: enforce sorting of imports

* style: alphabetize imports

* style: merge duplicated imports
2022-09-02 15:07:24 +01:00

170 lines
4.8 KiB
JavaScript

import * as sharedListeners from 'loot-core/src/client/shared-listeners';
import { send, listen } from 'loot-core/src/platform/client/fetch';
import * as undo from 'loot-core/src/platform/client/undo';
export function handleGlobalEvents(actions, store) {
global.Actual.onEventFromMain('update-downloaded', (event, info) => {
actions.setAppState({ updateInfo: info });
});
global.Actual.onEventFromMain('update-error', msg => {
// Ignore errors. We don't want to constantly bug the user if they
// always have a flaky connection or have intentionally disabled
// updates. They will see the error in the about page if they try
// to update.
});
listen('server-error', info => {
actions.addGenericErrorNotification();
});
listen('update-loading-status', status => {
switch (status) {
case 'updating':
actions.updateStatusText('Updating...');
break;
default:
}
});
listen('orphaned-payees', ({ orphanedIds, updatedPayeeIds }) => {
// Right now, it prompts to merge into the first payee
actions.pushModal('merge-unused-payees', {
payeeIds: orphanedIds,
targetPayeeId: updatedPayeeIds[0]
});
});
listen('schedules-offline', ({ payees }) => {
let history = window.__history;
if (history) {
history.push(`/schedule/posts-offline-notification`, {
locationPtr: history.location,
payees
});
}
});
async function onManage() {
let tempId = await send('make-user-temp-id');
let url = 'https://actualbudget.com/account?tempId=' + tempId;
window.Actual.openURLInBrowser(url);
}
// This is experimental: we sync data locally automatically when
// data changes from the backend
listen('sync-event', async ({ type, tables }) => {
// We don't need to query anything until the file is loaded, and
// sync events might come in if the file is being synced before
// being loaded (happens when downloading)
let prefs = store.getState().prefs.local;
if (prefs && prefs.id) {
if (type === 'applied') {
if (tables.includes('payees') || tables.includes('payee_mapping')) {
actions.getPayees();
}
}
}
});
// TODO: Should this run on mobile too?
listen('sync-event', async ({ type }) => {
if (type === 'unauthorized') {
actions.addNotification({
type: 'warning',
message: 'Unable to authenticate with server',
sticky: true,
id: 'auth-issue'
});
}
});
sharedListeners.listenForSyncEvent(actions, store);
listen('undo-event', undoState => {
let { messages, tables, undoTag } = undoState;
let promises = [];
if (
tables.includes('categories') ||
tables.includes('category_groups') ||
tables.includes('category_mapping')
) {
promises.push(actions.getCategories());
}
if (tables.includes('accounts')) {
promises.push(actions.getAccounts());
}
let tagged = undo.getTaggedState(undoTag);
if (tagged) {
Promise.all(promises).then(() => {
actions.setLastUndoState(undoState);
// If a modal has been tagged, open it instead of navigating
if (tagged.openModal) {
let { modalStack } = store.getState().modals;
if (
modalStack.length === 0 ||
modalStack[modalStack.length - 1].name !== tagged.openModal
) {
actions.replaceModal(tagged.openModal);
}
} else {
actions.closeModal();
if (window.location.href !== tagged.url) {
window.location.href = tagged.url;
// This stops propagation of the undo event, which is
// important because if we are changing URLs any existing
// undo listeners on the current page don't need to be run
return true;
}
}
});
}
});
listen('fallback-write-error', () => {
actions.addNotification({
type: 'error',
title: 'Unable to save changes',
sticky: true,
message:
'This browser only supports using the app in one tab at a time, ' +
'and another tab has opened the app. No changes will be saved ' +
'from this tab; please close it and continue working in the other one.'
});
});
listen('start-load', () => {
actions.closeBudgetUI();
actions.setAppState({ loadingText: '' });
});
listen('finish-load', () => {
actions.closeModal();
actions.setAppState({ loadingText: null });
actions.loadPrefs();
});
listen('start-import', () => {
actions.closeBudgetUI();
actions.setAppState({ loadingText: 'Importing...' });
});
listen('finish-import', () => {
actions.closeModal();
actions.setAppState({ loadingText: null });
actions.loadPrefs();
});
listen('show-budgets', () => {
actions.closeBudgetUI();
actions.setAppState({ loadingText: null });
});
}