mirror of
https://github.com/samuelthomas2774/nxapi.git
synced 2026-04-26 00:13:08 -05:00
Remove auto refresh option
This commit is contained in:
parent
589a5ea220
commit
859ecea027
|
|
@ -1,14 +1,14 @@
|
||||||
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import { ScrollView, StyleSheet, Text, TouchableOpacity, useColorScheme, View } from 'react-native';
|
import { ScrollView, StyleSheet, Text, useColorScheme, View } from 'react-native';
|
||||||
import { CheckBox } from 'react-native-web';
|
|
||||||
import { Translation, useTranslation } from 'react-i18next';
|
|
||||||
import ipc, { events } from '../ipc.js';
|
import ipc, { events } from '../ipc.js';
|
||||||
import { AccentColourContext, getAccounts, Root, useAsync, useEventListener } from '../util.js';
|
import { getAccounts, Root, useAsync, useEventListener } from '../util.js';
|
||||||
import Sidebar from './sidebar.js';
|
import Sidebar from './sidebar.js';
|
||||||
import Update from './update.js';
|
import Update from './update.js';
|
||||||
import Main from './main.js';
|
import Main from './main.js';
|
||||||
import { BACKGROUND_COLOUR_MAIN_DARK, BACKGROUND_COLOUR_MAIN_LIGHT, BACKGROUND_COLOUR_SECONDARY_DARK, BACKGROUND_COLOUR_SECONDARY_LIGHT, TEXT_COLOUR_DARK, TEXT_COLOUR_LIGHT } from '../constants.js';
|
import { BACKGROUND_COLOUR_MAIN_DARK, BACKGROUND_COLOUR_MAIN_LIGHT, BACKGROUND_COLOUR_SECONDARY_DARK, BACKGROUND_COLOUR_SECONDARY_LIGHT, TEXT_COLOUR_DARK, TEXT_COLOUR_LIGHT } from '../constants.js';
|
||||||
|
|
||||||
|
const REFRESH_INTERVAL = 30 * 1000; // 30 seconds
|
||||||
|
|
||||||
export interface AppProps {
|
export interface AppProps {
|
||||||
vibrancy?: boolean;
|
vibrancy?: boolean;
|
||||||
insetTitleBarControls?: boolean;
|
insetTitleBarControls?: boolean;
|
||||||
|
|
@ -26,7 +26,8 @@ export default function App(props: AppProps) {
|
||||||
const [selectedUserId, setSelectedUserId] = useState<string | undefined>(undefined);
|
const [selectedUserId, setSelectedUserId] = useState<string | undefined>(undefined);
|
||||||
const selectedUser = useMemo(() => users?.find(u => u.user.id === selectedUserId), [users, selectedUserId]);
|
const selectedUser = useMemo(() => users?.find(u => u.user.id === selectedUserId), [users, selectedUserId]);
|
||||||
|
|
||||||
const [auto_refresh, setAutoRefresh] = useState<number | undefined>(undefined);
|
const [focused, setFocused] = useState(ipc.getWindowFocused());
|
||||||
|
useEventListener(events, 'window:focused', setFocused, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!selectedUser) setSelectedUserId(users?.[0]?.user.id);
|
if (!selectedUser) setSelectedUserId(users?.[0]?.user.id);
|
||||||
|
|
@ -40,30 +41,14 @@ export default function App(props: AppProps) {
|
||||||
>
|
>
|
||||||
<Sidebar users={users} selectedUser={selectedUserId} onSelectUser={setSelectedUserId}
|
<Sidebar users={users} selectedUser={selectedUserId} onSelectUser={setSelectedUserId}
|
||||||
insetTitleBarControls={props.insetTitleBarControls}
|
insetTitleBarControls={props.insetTitleBarControls}
|
||||||
>
|
/>
|
||||||
<View style={[styles.content, styles.checkboxContainer]}>
|
|
||||||
<AccentColourContext.Consumer children={accent_colour => (
|
|
||||||
<CheckBox
|
|
||||||
value={!!auto_refresh}
|
|
||||||
onValueChange={v => setAutoRefresh(v ? 30 * 1000 : undefined)}
|
|
||||||
color={'#' + accent_colour}
|
|
||||||
style={styles.checkbox}
|
|
||||||
/>
|
|
||||||
)} />
|
|
||||||
<TouchableOpacity style={styles.checkboxLabel} onPress={() => setAutoRefresh(auto_refresh ? undefined : 30 * 1000)}>
|
|
||||||
<Translation keyPrefix="main_window:sidebar">{
|
|
||||||
t => <Text style={theme.text}>{t('enable_auto_refresh')}</Text>
|
|
||||||
}</Translation>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<View style={[styles.main, theme.main]}>
|
<View style={[styles.main, theme.main]}>
|
||||||
<ScrollView style={styles.scroller} contentContainerStyle={styles.scrollerContent}>
|
<ScrollView style={styles.scroller} contentContainerStyle={styles.scrollerContent}>
|
||||||
<Update />
|
<Update />
|
||||||
|
|
||||||
{selectedUser ? <Main key={selectedUser.user.id} user={selectedUser}
|
{selectedUser ? <Main key={selectedUser.user.id} user={selectedUser}
|
||||||
autoRefresh={auto_refresh} /> : null}
|
autoRefresh={focused ? REFRESH_INTERVAL : undefined} /> : null}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</View>
|
</View>
|
||||||
</Root>;
|
</Root>;
|
||||||
|
|
@ -82,22 +67,6 @@ const styles = StyleSheet.create({
|
||||||
scrollerContent: {
|
scrollerContent: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
},
|
},
|
||||||
content: {
|
|
||||||
paddingVertical: 16,
|
|
||||||
paddingHorizontal: 20,
|
|
||||||
},
|
|
||||||
checkboxContainer: {
|
|
||||||
flex: 1,
|
|
||||||
marginRight: 20,
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
},
|
|
||||||
checkbox: {
|
|
||||||
marginRight: 10,
|
|
||||||
},
|
|
||||||
checkboxLabel: {
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const light = StyleSheet.create({
|
const light = StyleSheet.create({
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useCallback, useEffect } from 'react';
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
import { ActivityIndicator, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
import { ActivityIndicator, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import ipc, { events } from '../ipc.js';
|
import ipc, { events } from '../ipc.js';
|
||||||
|
|
@ -28,11 +28,15 @@ export default function Main(props: {
|
||||||
const [active_event, active_event_error, active_event_state, forceRefreshActiveEvent] = useAsync(useCallback(() => props.user.nsotoken ?
|
const [active_event, active_event_error, active_event_state, forceRefreshActiveEvent] = useAsync(useCallback(() => props.user.nsotoken ?
|
||||||
ipc.getCoralActiveEvent(props.user.nsotoken) : Promise.resolve(null), [ipc, props.user.nsotoken]));
|
ipc.getCoralActiveEvent(props.user.nsotoken) : Promise.resolve(null), [ipc, props.user.nsotoken]));
|
||||||
|
|
||||||
|
const [last_refresh_at, setLastRefreshAt] = useState(() => Date.now());
|
||||||
|
|
||||||
const loading = announcements_state === RequestState.LOADING ||
|
const loading = announcements_state === RequestState.LOADING ||
|
||||||
friends_state === RequestState.LOADING ||
|
friends_state === RequestState.LOADING ||
|
||||||
webservices_state === RequestState.LOADING ||
|
webservices_state === RequestState.LOADING ||
|
||||||
active_event_state === RequestState.LOADING;
|
active_event_state === RequestState.LOADING;
|
||||||
|
|
||||||
const refresh = useCallback(() => Promise.all([
|
const refresh = useCallback(() => Promise.all([
|
||||||
|
setLastRefreshAt(Date.now()),
|
||||||
forceRefreshFriends(), forceRefreshWebServices(), forceRefreshActiveEvent(),
|
forceRefreshFriends(), forceRefreshWebServices(), forceRefreshActiveEvent(),
|
||||||
]), [forceRefreshFriends, forceRefreshWebServices, forceRefreshActiveEvent]);
|
]), [forceRefreshFriends, forceRefreshWebServices, forceRefreshActiveEvent]);
|
||||||
|
|
||||||
|
|
@ -42,6 +46,13 @@ export default function Main(props: {
|
||||||
return () => clearTimeout(timeout);
|
return () => clearTimeout(timeout);
|
||||||
}, [ipc, props.user.nsotoken, loading, props.autoRefresh]);
|
}, [ipc, props.user.nsotoken, loading, props.autoRefresh]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (loading || !props.autoRefresh) return;
|
||||||
|
|
||||||
|
// When enabling auto refresh, update now if we haven't updated within the interval
|
||||||
|
if (last_refresh_at + props.autoRefresh < Date.now()) refresh();
|
||||||
|
}, [ipc, props.autoRefresh]);
|
||||||
|
|
||||||
useEventListener(events, 'window:refresh', refresh, []);
|
useEventListener(events, 'window:refresh', refresh, []);
|
||||||
|
|
||||||
const showErrorDetails = useCallback(() => {
|
const showErrorDetails = useCallback(() => {
|
||||||
|
|
|
||||||
|
|
@ -30,17 +30,8 @@ export function Root(props: React.PropsWithChildren<{
|
||||||
const [accent_colour, setAccentColour] = React.useState(() => ipc.getAccentColour());
|
const [accent_colour, setAccentColour] = React.useState(() => ipc.getAccentColour());
|
||||||
useEventListener(events, 'systemPreferences:accent-colour', setAccentColour, []);
|
useEventListener(events, 'systemPreferences:accent-colour', setAccentColour, []);
|
||||||
|
|
||||||
const [window_focused, setWindowFocus] = useState(true);
|
const [window_focused, setWindowFocused] = useState(ipc.getWindowFocused());
|
||||||
|
useEventListener(events, 'window:focused', setWindowFocused, []);
|
||||||
useEffect(() => {
|
|
||||||
const handler = (event: FocusEvent) => setWindowFocus(event.type === 'focus');
|
|
||||||
window.addEventListener('focus', handler);
|
|
||||||
window.addEventListener('blur', handler);
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener('focus', handler);
|
|
||||||
window.removeEventListener('blur', handler);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const [i18n, i18n_error] = useAsync(useCallback(async () => {
|
const [i18n, i18n_error] = useAsync(useCallback(async () => {
|
||||||
const i18n = createI18n();
|
const i18n = createI18n();
|
||||||
|
|
|
||||||
|
|
@ -176,8 +176,6 @@ export const main_window = {
|
||||||
|
|
||||||
add_user: 'User hinzufügen',
|
add_user: 'User hinzufügen',
|
||||||
discord_setup: 'Discord Rich Presence einrichten',
|
discord_setup: 'Discord Rich Presence einrichten',
|
||||||
|
|
||||||
enable_auto_refresh: 'Automatisch aktualisieren',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
update: {
|
update: {
|
||||||
|
|
|
||||||
|
|
@ -170,8 +170,6 @@ export const main_window = {
|
||||||
|
|
||||||
add_user: 'Add user',
|
add_user: 'Add user',
|
||||||
discord_setup: 'Set up Discord Rich Presence',
|
discord_setup: 'Set up Discord Rich Presence',
|
||||||
|
|
||||||
enable_auto_refresh: 'Enable auto refresh',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
update: {
|
update: {
|
||||||
|
|
|
||||||
|
|
@ -177,8 +177,6 @@ export const main_window = {
|
||||||
|
|
||||||
add_user: 'Añadir usuario',
|
add_user: 'Añadir usuario',
|
||||||
discord_setup: 'Configurar Discord Rich Presence',
|
discord_setup: 'Configurar Discord Rich Presence',
|
||||||
|
|
||||||
enable_auto_refresh: 'Activar actualización automática',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
update: {
|
update: {
|
||||||
|
|
|
||||||
|
|
@ -134,8 +134,6 @@ export const main_window = {
|
||||||
|
|
||||||
add_user: 'ユーザーを追加',
|
add_user: 'ユーザーを追加',
|
||||||
discord_setup: 'Discord Rich Presenceを設定',
|
discord_setup: 'Discord Rich Presenceを設定',
|
||||||
|
|
||||||
enable_auto_refresh: '自動更新',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
update: {
|
update: {
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) {
|
||||||
|
|
||||||
ipcMain.on('nxapi:browser:getwindowdata', e => e.returnValue = getWindowConfiguration(e.sender));
|
ipcMain.on('nxapi:browser:getwindowdata', e => e.returnValue = getWindowConfiguration(e.sender));
|
||||||
ipcMain.on('nxapi:app:language', e => e.returnValue = appinstance.i18n.resolvedLanguage ?? appinstance.i18n.language);
|
ipcMain.on('nxapi:app:language', e => e.returnValue = appinstance.i18n.resolvedLanguage ?? appinstance.i18n.language);
|
||||||
|
ipcMain.on('nxapi:window:focused', e => e.returnValue = e.sender.isFocused());
|
||||||
|
|
||||||
let accent_colour = systemPreferences.getAccentColor?.() || undefined;
|
let accent_colour = systemPreferences.getAccentColor?.() || undefined;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ const ipc = {
|
||||||
|
|
||||||
getLanguage: () => language,
|
getLanguage: () => language,
|
||||||
getAccentColour: () => accent_colour,
|
getAccentColour: () => accent_colour,
|
||||||
|
getWindowFocused: () => focused,
|
||||||
|
|
||||||
platform: process.platform,
|
platform: process.platform,
|
||||||
};
|
};
|
||||||
|
|
@ -125,4 +126,8 @@ ipcRenderer.on('nxapi:systemPreferences:accent-colour', (event, c: string) => {
|
||||||
events.emit('systemPreferences:accent-colour', c);
|
events.emit('systemPreferences:accent-colour', c);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let focused: boolean = invSync('window:focused');
|
||||||
|
window.addEventListener('focus', () => (focused = true, events.emit('window:focused', focused)));
|
||||||
|
window.addEventListener('blur', () => (focused = false, events.emit('window:focused', focused)));
|
||||||
|
|
||||||
contextBridge.exposeInMainWorld('nxapiElectronIpc', ipc);
|
contextBridge.exposeInMainWorld('nxapiElectronIpc', ipc);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user