Add error alert preferences and related IPC handlers

This commit is contained in:
Bella Lawrence 2025-04-19 22:37:19 +12:00
parent 018b3b121f
commit 8e30643bc8
No known key found for this signature in database
GPG Key ID: 3FEB4D8FC145E886
7 changed files with 56 additions and 3 deletions

View File

@ -30,6 +30,8 @@ function _Preferences(props: {
const [login_item, ,, forceRefreshLoginItem] = useAsync(useCallback(() => ipc.getLoginItemSettings(), [ipc]));
const [show_error_alerts, , show_error_alerts_state, forceRefreshErrorAlerts] = useAsync(useCallback(() => ipc.getShowErrorAlerts(), [ipc]));
const setOpenAtLogin = useCallback(async (open_at_login: boolean | 'mixed') => {
await ipc.setLoginItemSettings({...login_item!, startup_enabled: !!open_at_login});
forceRefreshLoginItem();
@ -39,6 +41,11 @@ function _Preferences(props: {
forceRefreshLoginItem();
}, [ipc, login_item]);
const setShowErrorAlerts = useCallback(async (show_error_alerts: boolean | 'mixed') => {
await ipc.setShowErrorAlerts(!!show_error_alerts);
forceRefreshErrorAlerts();
}, [ipc]);
const [discord_users, discord_users_error, discord_users_state, forceRefreshDiscordUsers] =
useAsync(useCallback(() => ipc.getDiscordUsers(), [ipc]));
@ -97,7 +104,8 @@ function _Preferences(props: {
useEventListener(events, 'window:refresh', () => (
forceRefreshAccounts(), forceRefreshLoginItem(),
forceRefreshDiscordUsers(), forceRefreshDiscordOptions()
forceRefreshDiscordUsers(), forceRefreshDiscordOptions(),
forceRefreshErrorAlerts()
), []);
if (!users ||
@ -280,6 +288,26 @@ function _Preferences(props: {
<Text style={[styles.help, theme.text]}>{t('splatnet3.discord_help_2')}</Text>
</View>
</View>
<View style={styles.section}>
<View style={styles.sectionLeft}>
<Text style={[styles.label, theme.text]}>{t('miscellaneous.heading')}</Text>
</View>
<View style={styles.sectionRight}>
<View style={[styles.checkboxContainer]}>
<CheckBox
value={show_error_alerts ?? true}
onValueChange={setShowErrorAlerts}
color={'#' + (accent_colour ?? DEFAULT_ACCENT_COLOUR)}
style={styles.checkbox}
/>
<TouchableOpacity style={styles.checkboxLabel} onPress={() => setShowErrorAlerts(!(show_error_alerts ?? true))}>
<Text style={[styles.checkboxLabelText, theme.text]}>{t('miscellaneous.show_error_alerts')}</Text>
</TouchableOpacity>
</View>
<Text style={[styles.help, theme.text]}>{t('miscellaneous.show_error_alerts_help')}</Text>
</View>
</View>
</View>;
}

View File

@ -290,6 +290,12 @@ export const preferences_window = {
discord_help_1: 'Uses SplatNet 3 to retrieve additional presence information while playing Splatoon 3. You must be using a secondary Nintendo Account that is friends with your main account to fetch your presence, and the secondary account must be able to access SplatNet 3.',
discord_help_2: 'When using a presence URL that returns Splatoon 3 data additional presence information will be shown regardless of this setting.',
},
miscellaneous: {
heading: 'Miscellaneous',
show_error_alerts: 'Show error alerts',
show_error_alerts_help: 'This will show a popup when an error occurs while loading data. This is useful for debugging, but can be annoying if you are not interested in the errors.',
}
};
export const friend_window = {

View File

@ -484,6 +484,7 @@ export class Store extends EventEmitter {
error: err,
buttons: ['OK', 'Retry'],
defaultId: 1,
app: this.app,
});
if (response === 1) {
@ -513,6 +514,7 @@ export class Store extends EventEmitter {
error: err,
buttons: ['OK', 'Retry'],
defaultId: 1,
app: this.app,
});
if (response === 1) {
@ -520,4 +522,4 @@ export class Store extends EventEmitter {
}
}
}
}
}

View File

@ -64,6 +64,10 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) {
handle('systemPreferences:getloginitem', () => appinstance.store.getLoginItem());
handle('systemPreferences:setloginitem', (e, settings: LoginItemOptions) => appinstance.store.setLoginItem(settings));
handle('preferences:showerroralerts', () => storage.getItem('preferences.showerroralerts'));
handle('preferences:setshowerroralerts', (e, enabled: boolean) =>
storage.setItem('preferences.showerroralerts', enabled));
handle('update:get', () => appinstance.updater.cache ?? appinstance.updater.check());
handle('update:check', () => appinstance.updater.check());

View File

@ -63,6 +63,7 @@ export class PresenceMonitorManager {
error: err,
buttons: ['OK', 'Retry', 'Stop'],
defaultId: 0,
app: this.app,
});
if (response === 1) {
@ -391,6 +392,7 @@ export class PresenceMonitorManager {
error: err,
buttons: ['OK', 'Retry'],
defaultId: 0,
app: this.app,
});
if (response === 1) {
@ -420,6 +422,7 @@ export class PresenceMonitorManager {
await showErrorDialog({
message: error.name + ' updating presence monitor',
error,
app: this.app,
});
}
}

View File

@ -77,10 +77,17 @@ interface ErrorBoxOptions extends MessageBoxOptions {
window?: BrowserWindow;
}
export function showErrorDialog(options: ErrorBoxOptions) {
export async function showErrorDialog(options: ErrorBoxOptions) {
const {error, app, window, ...message_box_options} = options;
const detail = ErrorDescription.getErrorDescription(error);
if (app) {
const showErrorAlerts = await app.store.storage.getItem('preferences.showerroralerts') as boolean
if (showErrorAlerts === false) {
return Promise.resolve({ response: 0, checkboxChecked: false });
}
}
message_box_options.detail = message_box_options.detail ?
detail + '\n\n' + message_box_options.detail :
detail;

View File

@ -47,6 +47,9 @@ const ipc = {
getLoginItemSettings: () => inv<LoginItem>('systemPreferences:getloginitem'),
setLoginItemSettings: (settings: LoginItemOptions) => inv('systemPreferences:setloginitem', settings),
getShowErrorAlerts: () => inv<boolean>('preferences:showerroralerts'),
setShowErrorAlerts: (enabled: boolean) => inv('preferences:setshowerroralerts', enabled),
getUpdateData: () => inv<UpdateCacheData | null>('update:get'),
checkUpdates: () => inv<UpdateCacheData | null>('update:check'),