From afaf53a7a49907f36fbd131c22c59d904ddc5fb9 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Fri, 5 Jan 2024 22:13:54 +0530 Subject: [PATCH] chore: let user know about 429 status (#2747) --- packages/services/src/Domain/Event/ApplicationEvent.ts | 1 + packages/services/src/Domain/Event/SyncEvent.ts | 1 + packages/snjs/lib/Application/Event.ts | 1 + packages/snjs/lib/Services/Sync/SyncService.ts | 5 +++++ .../Components/ApplicationView/ApplicationView.tsx | 7 ++++++- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/services/src/Domain/Event/ApplicationEvent.ts b/packages/services/src/Domain/Event/ApplicationEvent.ts index 7557fb240..82c63b6fd 100644 --- a/packages/services/src/Domain/Event/ApplicationEvent.ts +++ b/packages/services/src/Domain/Event/ApplicationEvent.ts @@ -56,4 +56,5 @@ export enum ApplicationEvent { /** Called when the app first launches and after first sync request made after sign in */ CompletedInitialSync = 'Application:CompletedInitialSync', DidPurchaseSubscription = 'Application:DidPurchaseSubscription', + SyncTooManyRequests = 'Application:SyncTooManyRequests', } diff --git a/packages/services/src/Domain/Event/SyncEvent.ts b/packages/services/src/Domain/Event/SyncEvent.ts index 19a65f139..f3af34012 100644 --- a/packages/services/src/Domain/Event/SyncEvent.ts +++ b/packages/services/src/Domain/Event/SyncEvent.ts @@ -33,6 +33,7 @@ export enum SyncEvent { ReceivedSharedVaultInvites = 'received-shared-vault-invites', ReceivedNotifications = 'received-user-events', ReceivedAsymmetricMessages = 'received-asymmetric-messages', + TooManyRequests = 'too-many-requests', } export type SyncEventReceivedRemoteSharedVaultsData = SharedVaultServerHash[] diff --git a/packages/snjs/lib/Application/Event.ts b/packages/snjs/lib/Application/Event.ts index b5cd429b7..00f17afc1 100644 --- a/packages/snjs/lib/Application/Event.ts +++ b/packages/snjs/lib/Application/Event.ts @@ -16,6 +16,7 @@ const map: Record = { [SyncEvent.DatabaseReadError]: ApplicationEvent.LocalDatabaseReadError, [SyncEvent.DatabaseWriteError]: ApplicationEvent.LocalDatabaseWriteError, [SyncEvent.DownloadFirstSyncCompleted]: ApplicationEvent.CompletedInitialSync, + [SyncEvent.TooManyRequests]: ApplicationEvent.SyncTooManyRequests, } export function applicationEventForSyncEvent(syncEvent: SyncEvent): ApplicationEvent | undefined { diff --git a/packages/snjs/lib/Services/Sync/SyncService.ts b/packages/snjs/lib/Services/Sync/SyncService.ts index b256d8a1f..3c6edc2cf 100644 --- a/packages/snjs/lib/Services/Sync/SyncService.ts +++ b/packages/snjs/lib/Services/Sync/SyncService.ts @@ -100,6 +100,7 @@ import { ContentType } from '@standardnotes/domain-core' const DEFAULT_MAJOR_CHANGE_THRESHOLD = 15 const INVALID_SESSION_RESPONSE_STATUS = 401 +const TOO_MANY_REQUESTS_RESPONSE_STATUS = 429 const DEFAULT_AUTO_SYNC_INTERVAL = 30_000 /** Content types appearing first are always mapped first */ @@ -1000,6 +1001,10 @@ export class SyncService void this.notifyEvent(SyncEvent.InvalidSession) } + if (response.status === TOO_MANY_REQUESTS_RESPONSE_STATUS) { + void this.notifyEvent(SyncEvent.TooManyRequests) + } + this.opStatus?.setError(response.error) void this.notifyEvent(SyncEvent.SyncError, response) diff --git a/packages/web/src/javascripts/Components/ApplicationView/ApplicationView.tsx b/packages/web/src/javascripts/Components/ApplicationView/ApplicationView.tsx index 4e336be44..2f968342d 100644 --- a/packages/web/src/javascripts/Components/ApplicationView/ApplicationView.tsx +++ b/packages/web/src/javascripts/Components/ApplicationView/ApplicationView.tsx @@ -13,7 +13,7 @@ import { FunctionComponent, useCallback, useEffect, useMemo, useState, lazy, use import RevisionHistoryModal from '@/Components/RevisionHistoryModal/RevisionHistoryModal' import PremiumModalProvider from '@/Hooks/usePremiumModal' import ConfirmSignoutContainer from '@/Components/ConfirmSignoutModal/ConfirmSignoutModal' -import { ToastContainer } from '@standardnotes/toast' +import { addToast, ToastContainer, ToastType } from '@standardnotes/toast' import FilePreviewModalWrapper from '@/Components/FilePreview/FilePreviewModal' import FileContextMenuWrapper from '@/Components/FileContextMenu/FileContextMenu' import PermissionsModalWrapper from '@/Components/PermissionsModal/PermissionsModalWrapper' @@ -141,6 +141,11 @@ const ApplicationView: FunctionComponent = ({ application, mainApplicatio }) .catch(console.error) } + } else if (eventName === ApplicationEvent.SyncTooManyRequests) { + addToast({ + type: ToastType.Error, + message: 'Too many requests. Please try again later.', + }) } })