Check app inactivity

This commit is contained in:
Bojan Mojsilovic 2024-03-11 19:25:55 +01:00
parent f8a0bb5e76
commit e30b717536
5 changed files with 107 additions and 34 deletions

View File

@ -13,6 +13,7 @@ import { NotificationsProvider } from './contexts/NotificationsContext';
import { SearchProvider } from './contexts/SearchContext'; import { SearchProvider } from './contexts/SearchContext';
import { MessagesProvider } from './contexts/MessagesContext'; import { MessagesProvider } from './contexts/MessagesContext';
import { MediaProvider } from './contexts/MediaContext'; import { MediaProvider } from './contexts/MediaContext';
import { AppProvider } from './contexts/AppContext';
export const APP_ID = `${Math.floor(Math.random()*10000000000)}`; export const APP_ID = `${Math.floor(Math.random()*10000000000)}`;
@ -25,34 +26,36 @@ const App: Component = () => {
onCleanup(() => { onCleanup(() => {
disconnect(); disconnect();
}) });
return ( return (
<TranslatorProvider> <AppProvider>
<Toaster> <TranslatorProvider>
<MediaProvider> <Toaster>
<AccountProvider> <MediaProvider>
<SearchProvider> <AccountProvider>
<SettingsProvider> <SearchProvider>
<ProfileProvider> <SettingsProvider>
<MessagesProvider> <ProfileProvider>
<NotificationsProvider> <MessagesProvider>
<HomeProvider> <NotificationsProvider>
<ExploreProvider> <HomeProvider>
<ThreadProvider> <ExploreProvider>
<Router /> <ThreadProvider>
</ThreadProvider> <Router />
</ExploreProvider> </ThreadProvider>
</HomeProvider> </ExploreProvider>
</NotificationsProvider> </HomeProvider>
</MessagesProvider> </NotificationsProvider>
</ProfileProvider> </MessagesProvider>
</SettingsProvider> </ProfileProvider>
</SearchProvider> </SettingsProvider>
</AccountProvider> </SearchProvider>
</MediaProvider> </AccountProvider>
</Toaster> </MediaProvider>
</TranslatorProvider> </Toaster>
</TranslatorProvider>
</AppProvider>
); );
}; };

View File

@ -0,0 +1,64 @@
import { createStore } from "solid-js/store";
import {
createContext,
createEffect,
JSXElement,
onCleanup,
onMount,
useContext
} from "solid-js";
export type AppContextStore = {
isInactive: boolean,
}
const initialData = {
isInactive: false,
};
export const AppContext = createContext<AppContextStore>();
export const AppProvider = (props: { children: JSXElement }) => {
let inactivityCounter = 0;
const monitorActivity = () => {
clearTimeout(inactivityCounter);
if (store.isInactive) {
updateStore('isInactive', () => false)
}
inactivityCounter = setTimeout(() => {
updateStore('isInactive', () => true)
}, 30 * 60_000);
};
// EFFECTS --------------------------------------
onMount(() => {
document.addEventListener('mousemove', monitorActivity);
});
onCleanup(() => {
document.removeEventListener('mousemove', monitorActivity);
});
createEffect(() => {
console.log('INACTIVE: ', store.isInactive)
})
// STORES ---------------------------------------
const [store, updateStore] = createStore<AppContextStore>({
...initialData,
});
return (
<AppContext.Provider value={store}>
{props.children}
</AppContext.Provider>
);
}
export const useAppContext = () => useContext(AppContext);

View File

@ -44,6 +44,7 @@ import { convertToNotes } from "../stores/note";
import { sanitize, sendEvent } from "../lib/notes"; import { sanitize, sendEvent } from "../lib/notes";
import { decrypt, encrypt } from "../lib/nostrAPI"; import { decrypt, encrypt } from "../lib/nostrAPI";
import { loadMsgContacts, saveMsgContacts } from "../lib/localStore"; import { loadMsgContacts, saveMsgContacts } from "../lib/localStore";
import { useAppContext } from "./AppContext";
export type MessagesContextStore = { export type MessagesContextStore = {
@ -110,6 +111,7 @@ export const MessagesContext = createContext<MessagesContextStore>();
export const MessagesProvider = (props: { children: ContextChildren }) => { export const MessagesProvider = (props: { children: ContextChildren }) => {
const account = useAccountContext(); const account = useAccountContext();
const app = useAppContext();
let msgSubscribed = '|'; let msgSubscribed = '|';
@ -788,7 +790,7 @@ export const MessagesProvider = (props: { children: ContextChildren }) => {
// EFFECTS -------------------------------------- // EFFECTS --------------------------------------
createEffect(() => { createEffect(() => {
if (isConnected() && account?.isKeyLookupDone && account?.hasPublicKey()) { if (isConnected() && account?.isKeyLookupDone && account?.hasPublicKey() && !app?.isInactive) {
subToMessagesStats(); subToMessagesStats();
} else { } else {
unsubscribeToMessagesStats(subidMsgCount()) unsubscribeToMessagesStats(subidMsgCount())

View File

@ -23,6 +23,7 @@ import { getLastSeen, subscribeToNotificationStats, unsubscribeToNotificationSta
import { useAccountContext } from "./AccountContext"; import { useAccountContext } from "./AccountContext";
import { timeNow } from "../utils"; import { timeNow } from "../utils";
import { useSettingsContext } from "./SettingsContext"; import { useSettingsContext } from "./SettingsContext";
import { useAppContext } from "./AppContext";
export type NotificationsContextStore = { export type NotificationsContextStore = {
notificationCount: number, notificationCount: number,
@ -49,6 +50,7 @@ export const NotificationsProvider = (props: { children: ContextChildren }) => {
const account = useAccountContext(); const account = useAccountContext();
const settings = useSettingsContext(); const settings = useSettingsContext();
const app = useAppContext();
const today = () => (new Date()).getTime(); const today = () => (new Date()).getTime();
@ -134,7 +136,7 @@ export const NotificationsProvider = (props: { children: ContextChildren }) => {
// EFFECTS -------------------------------------- // EFFECTS --------------------------------------
createEffect(() => { createEffect(() => {
if (isConnected() && account?.isKeyLookupDone && account?.hasPublicKey()) { if (isConnected() && account?.isKeyLookupDone && account?.hasPublicKey() && !app?.isInactive) {
subToNotificationStats(); subToNotificationStats();
} else { } else {
unsubscribeToNotificationStats(notfiStatsSubId()); unsubscribeToNotificationStats(notfiStatsSubId());

View File

@ -31,6 +31,7 @@ import { feedNewPosts, placeholders, branding } from '../translations';
import Search from '../components/Search/Search'; import Search from '../components/Search/Search';
import { setIsHome } from '../components/Layout/Layout'; import { setIsHome } from '../components/Layout/Layout';
import PageTitle from '../components/PageTitle/PageTitle'; import PageTitle from '../components/PageTitle/PageTitle';
import { useAppContext } from '../contexts/AppContext';
const Home: Component = () => { const Home: Component = () => {
@ -38,6 +39,7 @@ const Home: Component = () => {
const context = useHomeContext(); const context = useHomeContext();
const account = useAccountContext(); const account = useAccountContext();
const intl = useIntl(); const intl = useIntl();
const app = useAppContext();
const isPageLoading = () => context?.isFetching; const isPageLoading = () => context?.isFetching;
@ -57,6 +59,11 @@ const Home: Component = () => {
}); });
createEffect(() => { createEffect(() => {
if ((context?.future.notes.length || 0) > 99 || app?.isInactive) {
clearInterval(checkNewNotesTimer);
return;
}
const hex = context?.selectedFeed?.hex; const hex = context?.selectedFeed?.hex;
if (checkNewNotesTimer) { if (checkNewNotesTimer) {
@ -66,12 +73,11 @@ const Home: Component = () => {
setNewPostAuthors(() => []); setNewPostAuthors(() => []);
} }
const timeout = 25_000 + Math.random() * 10_000; const timeout = 10_000; //25_000 + Math.random() * 10_000;
checkNewNotesTimer = setInterval(() => { checkNewNotesTimer = setInterval(() => {
context?.actions.checkForNewNotes(hex); context?.actions.checkForNewNotes(hex);
}, timeout); }, timeout);
}); });
createEffect(() => { createEffect(() => {
@ -104,10 +110,6 @@ const Home: Component = () => {
}); });
const loadNewContent = () => { const loadNewContent = () => {
if (newNotesCount() > 100) {
location.reload();
return;
}
context?.actions.loadFutureContent(); context?.actions.loadFutureContent();
scrollWindowTo(0, true); scrollWindowTo(0, true);
setHasNewPosts(false); setHasNewPosts(false);