diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 2e1c7aa82..a11701927 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -47,6 +47,7 @@ export { fetchAuthorizations, terminateAuthorization, terminateAllAuthorizations, fetchNotificationExceptions, fetchNotificationSettings, updateContactSignUpNotification, updateNotificationSettings, fetchLanguages, fetchLangPack, fetchPrivacySettings, setPrivacySettings, registerDevice, unregisterDevice, + updateIsOnline, } from './settings'; export { diff --git a/src/api/gramjs/methods/settings.ts b/src/api/gramjs/methods/settings.ts index 932a88b87..17669746c 100644 --- a/src/api/gramjs/methods/settings.ts +++ b/src/api/gramjs/methods/settings.ts @@ -366,9 +366,15 @@ export async function setPrivacySettings( return buildPrivacyRules(result.rules); } +export async function updateIsOnline(isOnline: boolean) { + await invokeRequest(new GramJs.account.UpdateStatus({ offline: !isOnline })); +} + function updateLocalDb( - result: GramJs.account.PrivacyRules | GramJs.contacts.Blocked | GramJs.contacts.BlockedSlice | - GramJs.Updates | GramJs.UpdatesCombined, + result: ( + GramJs.account.PrivacyRules | GramJs.contacts.Blocked | GramJs.contacts.BlockedSlice | + GramJs.Updates | GramJs.UpdatesCombined + ), ) { result.users.forEach((user) => { if (user instanceof GramJs.User) { diff --git a/src/components/main/Main.tsx b/src/components/main/Main.tsx index 052898d64..0761a1962 100644 --- a/src/components/main/Main.tsx +++ b/src/components/main/Main.tsx @@ -49,7 +49,7 @@ type StateProps = { }; type DispatchProps = Pick; const ANIMATION_DURATION = 350; @@ -75,6 +75,7 @@ const Main: FC = ({ loadAnimatedEmojis, loadNotificationSettings, loadNotificationExceptions, + updateIsOnline, }) => { if (DEBUG && !DEBUG_isLogged) { DEBUG_isLogged = true; @@ -85,11 +86,12 @@ const Main: FC = ({ // Initial API calls useEffect(() => { if (lastSyncTime) { + updateIsOnline(true); loadAnimatedEmojis(); loadNotificationSettings(); loadNotificationExceptions(); } - }, [lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings]); + }, [lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings, updateIsOnline]); const { transitionClassNames: middleColumnTransitionClassNames, @@ -129,6 +131,13 @@ const Main: FC = ({ } }, [animationLevel, isRightColumnShown]); + useBackgroundMode(() => { + updateIsOnline(false); + }, () => { + updateIsOnline(true); + }); + + // Browser tab indicators useBackgroundMode(() => { const initialUnread = selectCountNotMutedUnread(getGlobal()); let index = 0; @@ -220,6 +229,6 @@ export default memo(withGlobal( }; }, (setGlobal, actions): DispatchProps => pick(actions, [ - 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', + 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', 'updateIsOnline', ]), )(Main)); diff --git a/src/global/types.ts b/src/global/types.ts index eb7e2aaae..f128609f0 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -446,7 +446,7 @@ export type ActionTypes = ( 'loadAuthorizations' | 'terminateAuthorization' | 'terminateAllAuthorizations' | 'loadNotificationSettings' | 'updateContactSignUpNotification' | 'updateNotificationSettings' | 'loadLanguages' | 'loadPrivacySettings' | 'setPrivacyVisibility' | 'setPrivacySettings' | - 'loadNotificationExceptions' | 'setThemeSettings' | + 'loadNotificationExceptions' | 'setThemeSettings' | 'updateIsOnline' | // Stickers & GIFs 'loadStickerSets' | 'loadAddedStickers' | 'loadRecentStickers' | 'loadFavoriteStickers' | 'loadFeaturedStickers' | 'loadStickers' | 'setStickerSearchQuery' | 'loadSavedGifs' | 'setGifSearchQuery' | 'searchMoreGifs' | diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts index 6c1582fe5..65c2d9cf7 100644 --- a/src/lib/gramjs/tl/api.d.ts +++ b/src/lib/gramjs/tl/api.d.ts @@ -285,7 +285,7 @@ namespace Api { export type TypeAccessPointRule = AccessPointRule; export type TypeTlsClientHello = TlsClientHello; export type TypeTlsBlock = TlsBlockString | TlsBlockRandom | TlsBlockZero | TlsBlockDomain | TlsBlockGrease | TlsBlockScope; - + export namespace storage { export type TypeFileType = storage.FileUnknown | storage.FilePartial | storage.FileJpeg | storage.FileGif | storage.FilePng | storage.FilePdf | storage.FileMp3 | storage.FileMov | storage.FileMp4 | storage.FileWebp; @@ -7001,7 +7001,7 @@ namespace Api { }> { entries: Api.TypeTlsBlock[]; }; - + export namespace storage { export class FileUnknown extends VirtualClass {}; @@ -8500,7 +8500,7 @@ namespace Api { }>, Api.TypeDestroySessionRes> { sessionId: long; }; - + export namespace auth { export class SendCode extends Request { + callApi('updateIsOnline', payload); +});