diff --git a/lib/reducers/notif-permission-alert-info-reducer.js b/lib/reducers/notif-permission-alert-info-reducer.js --- a/lib/reducers/notif-permission-alert-info-reducer.js +++ b/lib/reducers/notif-permission-alert-info-reducer.js @@ -1,15 +1,13 @@ // @flow +import type { AlertInfo } from '../types/alert-types.js'; import type { BaseAction } from '../types/redux-types'; -import { - type NotifPermissionAlertInfo, - recordNotifPermissionAlertActionType, -} from '../utils/push-alerts.js'; +import { recordNotifPermissionAlertActionType } from '../utils/push-alerts.js'; function reduceNotifPermissionAlertInfo( - state: NotifPermissionAlertInfo, + state: AlertInfo, action: BaseAction, -): NotifPermissionAlertInfo { +): AlertInfo { if (action.type === recordNotifPermissionAlertActionType) { return { totalAlerts: state.totalAlerts + 1, diff --git a/lib/types/alert-types.js b/lib/types/alert-types.js new file mode 100644 --- /dev/null +++ b/lib/types/alert-types.js @@ -0,0 +1,27 @@ +// @flow + +const alertTypes = Object.freeze({ + NOTIF_PERMISSION: 'notif-permission', +}); + +type AlertType = $Values; + +export type AlertInfo = { + +totalAlerts: number, + +lastAlertTime: number, +}; + +export type AlertInfos = { + +[alertID: AlertType]: AlertInfo, +}; + +export type AlertStore = { + +alertInfos: AlertInfos, +}; + +const defaultAlertInfo: AlertInfo = { + totalAlerts: 0, + lastAlertTime: 0, +}; + +export { alertTypes, defaultAlertInfo }; diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js --- a/lib/types/redux-types.js +++ b/lib/types/redux-types.js @@ -138,7 +138,7 @@ SetLateResponsePayload, UpdateKeyserverReachabilityPayload, } from '../keyserver-conn/keyserver-conn-types.js'; -import type { NotifPermissionAlertInfo } from '../utils/push-alerts.js'; +import type { AlertInfo } from '../types/alert-types.js'; export type BaseAppState = { +navInfo: NavInfo, @@ -150,7 +150,7 @@ +messageStore: MessageStore, +loadingStatuses: { [key: string]: { [idx: number]: LoadingStatus } }, +calendarFilters: $ReadOnlyArray, - +notifPermissionAlertInfo: NotifPermissionAlertInfo, + +notifPermissionAlertInfo: AlertInfo, +watchedThreadIDs: $ReadOnlyArray, +lifecycleState: LifecycleState, +enabledApps: EnabledApps, diff --git a/lib/utils/push-alerts.js b/lib/utils/push-alerts.js --- a/lib/utils/push-alerts.js +++ b/lib/utils/push-alerts.js @@ -1,21 +1,11 @@ // @flow -export type NotifPermissionAlertInfo = { - +totalAlerts: number, - +lastAlertTime: number, -}; - -const defaultNotifPermissionAlertInfo: NotifPermissionAlertInfo = { - totalAlerts: 0, - lastAlertTime: 0, -}; +import type { AlertInfo } from '../types/alert-types.js'; const recordNotifPermissionAlertActionType = 'RECORD_NOTIF_PERMISSION_ALERT'; const msInDay = 24 * 60 * 60 * 1000; -const shouldSkipPushPermissionAlert = ( - alertInfo: NotifPermissionAlertInfo, -): boolean => +const shouldSkipPushPermissionAlert = (alertInfo: AlertInfo): boolean => (alertInfo.totalAlerts > 3 && alertInfo.lastAlertTime > Date.now() - msInDay) || (alertInfo.totalAlerts > 6 && @@ -23,8 +13,4 @@ (alertInfo.totalAlerts > 9 && alertInfo.lastAlertTime > Date.now() - msInDay * 7); -export { - defaultNotifPermissionAlertInfo, - recordNotifPermissionAlertActionType, - shouldSkipPushPermissionAlert, -}; +export { recordNotifPermissionAlertActionType, shouldSkipPushPermissionAlert }; diff --git a/lib/utils/reducers-utils.test.js b/lib/utils/reducers-utils.test.js --- a/lib/utils/reducers-utils.test.js +++ b/lib/utils/reducers-utils.test.js @@ -1,8 +1,8 @@ // @flow import { authoritativeKeyserverID } from './authoritative-keyserver.js'; -import { defaultNotifPermissionAlertInfo } from './push-alerts.js'; import { resetUserSpecificState } from './reducers-utils.js'; +import { defaultAlertInfo } from '../types/alert-types.js'; import { defaultWebEnabledApps } from '../types/enabled-apps.js'; import { defaultCalendarFilters } from '../types/filter-types.js'; import { defaultKeyserverInfo } from '../types/keyserver-types.js'; @@ -46,7 +46,7 @@ loadingStatuses: {}, calendarFilters: defaultCalendarFilters, dataLoaded: false, - notifPermissionAlertInfo: defaultNotifPermissionAlertInfo, + notifPermissionAlertInfo: defaultAlertInfo, watchedThreadIDs: [], lifecycleState: 'active', enabledApps: defaultWebEnabledApps, diff --git a/native/push/push-handler.react.js b/native/push/push-handler.react.js --- a/native/push/push-handler.react.js +++ b/native/push/push-handler.react.js @@ -28,6 +28,7 @@ } from 'lib/selectors/thread-selectors.js'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; import { mergePrefixIntoBody } from 'lib/shared/notif-utils.js'; +import type { AlertInfo } from 'lib/types/alert-types.js'; import type { RawMessageInfo } from 'lib/types/message-types.js'; import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js'; import type { Dispatch } from 'lib/types/redux-types.js'; @@ -38,7 +39,6 @@ convertNotificationMessageInfoToNewIDSchema, } from 'lib/utils/migration-utils.js'; import { - type NotifPermissionAlertInfo, recordNotifPermissionAlertActionType, shouldSkipPushPermissionAlert, } from 'lib/utils/push-alerts.js'; @@ -110,7 +110,7 @@ +threadInfos: { +[id: string]: ThreadInfo, }, - +notifPermissionAlertInfo: NotifPermissionAlertInfo, + +notifPermissionAlertInfo: AlertInfo, +allUpdatesCurrentAsOf: { +[keyserverID: string]: number, }, diff --git a/native/redux/default-state.js b/native/redux/default-state.js --- a/native/redux/default-state.js +++ b/native/redux/default-state.js @@ -3,11 +3,11 @@ import { Platform } from 'react-native'; import Orientation from 'react-native-orientation-locker'; +import { defaultAlertInfo } from 'lib/types/alert-types.js'; import { defaultEnabledApps } from 'lib/types/enabled-apps.js'; import { defaultCalendarFilters } from 'lib/types/filter-types.js'; import { defaultKeyserverInfo } from 'lib/types/keyserver-types.js'; import { defaultGlobalThemeInfo } from 'lib/types/theme-types.js'; -import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import { defaultDimensionsInfo } from './dimensions-updater.react.js'; import type { AppState } from './state-types.js'; @@ -43,7 +43,7 @@ calendarFilters: defaultCalendarFilters, dataLoaded: false, customServer: natNodeServer, - notifPermissionAlertInfo: defaultNotifPermissionAlertInfo, + notifPermissionAlertInfo: defaultAlertInfo, watchedThreadIDs: [], lifecycleState: 'active', enabledApps: defaultEnabledApps, diff --git a/native/redux/persist.js b/native/redux/persist.js --- a/native/redux/persist.js +++ b/native/redux/persist.js @@ -59,6 +59,7 @@ DEPRECATED_unshimMessageStore, unshimFunc, } from 'lib/shared/unshim-utils.js'; +import { defaultAlertInfo } from 'lib/types/alert-types.js'; import { defaultEnabledApps } from 'lib/types/enabled-apps.js'; import { defaultCalendarQuery } from 'lib/types/entry-types.js'; import { defaultCalendarFilters } from 'lib/types/filter-types.js'; @@ -95,7 +96,6 @@ convertThreadStoreThreadInfosToNewIDSchema, } from 'lib/utils/migration-utils.js'; import { entries } from 'lib/utils/objects.js'; -import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import { resetUserSpecificState } from 'lib/utils/reducers-utils.js'; import { deprecatedConvertClientDBThreadInfoToRawThreadInfo, @@ -159,7 +159,7 @@ const migrations = { [1]: (state: AppState) => ({ ...state, - notifPermissionAlertInfo: defaultNotifPermissionAlertInfo, + notifPermissionAlertInfo: defaultAlertInfo, }), [2]: (state: AppState) => ({ ...state, diff --git a/native/redux/state-types.js b/native/redux/state-types.js --- a/native/redux/state-types.js +++ b/native/redux/state-types.js @@ -3,6 +3,7 @@ import type { Orientations } from 'react-native-orientation-locker'; import type { PersistState } from 'redux-persist/es/types.js'; +import type { AlertInfo } from 'lib/types/alert-types.js'; import type { AuxUserStore } from 'lib/types/aux-user-types.js'; import type { CommunityStore } from 'lib/types/community-types.js'; import type { DBOpsStore } from 'lib/types/db-ops-types'; @@ -23,7 +24,6 @@ import type { ThreadActivityStore } from 'lib/types/thread-activity-types'; import type { ThreadStore } from 'lib/types/thread-types.js'; import type { CurrentUserInfo, UserStore } from 'lib/types/user-types.js'; -import type { NotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import type { DimensionsInfo } from './dimensions-updater.react.js'; import type { NavInfo } from '../navigation/default-state.js'; @@ -58,7 +58,7 @@ +calendarFilters: $ReadOnlyArray, +dataLoaded: boolean, +customServer: ?string, - +notifPermissionAlertInfo: NotifPermissionAlertInfo, + +notifPermissionAlertInfo: AlertInfo, +watchedThreadIDs: $ReadOnlyArray, +lifecycleState: LifecycleState, +enabledApps: EnabledApps, diff --git a/web/redux/default-state.js b/web/redux/default-state.js --- a/web/redux/default-state.js +++ b/web/redux/default-state.js @@ -1,10 +1,10 @@ // @flow +import { defaultAlertInfo } from 'lib/types/alert-types.js'; import { defaultWebEnabledApps } from 'lib/types/enabled-apps.js'; import { defaultCalendarFilters } from 'lib/types/filter-types.js'; import { defaultKeyserverInfo } from 'lib/types/keyserver-types.js'; import { defaultGlobalThemeInfo } from 'lib/types/theme-types.js'; -import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import type { AppState } from './redux-setup.js'; import { authoritativeKeyserverID } from '../authoritative-keyserver.js'; @@ -44,7 +44,7 @@ loadingStatuses: {}, calendarFilters: defaultCalendarFilters, dataLoaded: false, - notifPermissionAlertInfo: defaultNotifPermissionAlertInfo, + notifPermissionAlertInfo: defaultAlertInfo, watchedThreadIDs: [], lifecycleState: 'active', enabledApps: defaultWebEnabledApps, diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js --- a/web/redux/redux-setup.js +++ b/web/redux/redux-setup.js @@ -30,6 +30,7 @@ identityInvalidSessionDowngrade, invalidSessionRecovery, } from 'lib/shared/session-utils.js'; +import type { AlertInfo } from 'lib/types/alert-types.js'; import type { AuxUserStore } from 'lib/types/aux-user-types.js'; import type { CommunityStore } from 'lib/types/community-types.js'; import type { MessageID, DBOpsStore } from 'lib/types/db-ops-types.js'; @@ -53,7 +54,6 @@ import type { ThreadActivityStore } from 'lib/types/thread-activity-types'; import type { ThreadStore } from 'lib/types/thread-types.js'; import type { CurrentUserInfo, UserStore } from 'lib/types/user-types.js'; -import type { NotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import { resetUserSpecificState } from 'lib/utils/reducers-utils.js'; import { @@ -102,7 +102,7 @@ +calendarFilters: $ReadOnlyArray, +communityPickerStore: CommunityPickerStore, +windowDimensions: WindowDimensions, - +notifPermissionAlertInfo: NotifPermissionAlertInfo, + +notifPermissionAlertInfo: AlertInfo, +watchedThreadIDs: $ReadOnlyArray, +lifecycleState: LifecycleState, +enabledApps: EnabledApps,