diff --git a/ts/RemoteConfig.dom.ts b/ts/RemoteConfig.dom.ts index 819d4114e1..becc942c8c 100644 --- a/ts/RemoteConfig.dom.ts +++ b/ts/RemoteConfig.dom.ts @@ -30,34 +30,36 @@ const log = createLogger('RemoteConfig'); // Semver flags must always be set to a valid semver (no empty enabled-only keys) const SemverKeys = [ + 'desktop.adminDelete.receive.beta', + 'desktop.adminDelete.receive.prod', + 'desktop.adminDelete.send.beta', + 'desktop.adminDelete.send.prod', + 'desktop.binaryServiceId.beta', + 'desktop.binaryServiceId.prod', 'desktop.callQualitySurvey.beta', 'desktop.callQualitySurvey.prod', 'desktop.donationPaypal.beta', 'desktop.donationPaypal.prod', 'desktop.groupMemberLabels.edit.beta', 'desktop.groupMemberLabels.edit.prod', - 'desktop.adminDelete.receive.beta', - 'desktop.adminDelete.receive.prod', - 'desktop.adminDelete.send.beta', - 'desktop.adminDelete.send.prod', + 'desktop.keyTransparency.beta', + 'desktop.keyTransparency.prod', + 'desktop.localBackups.beta', + 'desktop.localBackups.prod', 'desktop.pinnedMessages.receive.beta', 'desktop.pinnedMessages.receive.prod', 'desktop.pinnedMessages.send.beta', 'desktop.pinnedMessages.send.prod', 'desktop.plaintextExport.beta', 'desktop.plaintextExport.prod', + 'desktop.pollSend1to1.beta', + 'desktop.pollSend1to1.prod', 'desktop.remoteMegaphone.beta', 'desktop.remoteMegaphone.prod', 'desktop.remoteMute.send.beta', 'desktop.remoteMute.send.prod', 'desktop.retireAccessKeyGroupSend.beta', 'desktop.retireAccessKeyGroupSend.prod', - 'desktop.keyTransparency.beta', - 'desktop.keyTransparency.prod', - 'desktop.binaryServiceId.beta', - 'desktop.binaryServiceId.prod', - 'desktop.pollSend1to1.beta', - 'desktop.pollSend1to1.prod', ] as const; export type SemverKeyType = ArrayValues; @@ -72,10 +74,11 @@ const ScalarKeys = [ 'desktop.loggingErrorToasts', 'desktop.mediaQuality.levels', 'desktop.messageCleanup', + 'desktop.recentGifs.allowLegacyTenorCdnUrls', 'desktop.retryRespondMaxAge', 'desktop.senderKey.retry', 'desktop.senderKeyMaxAge', - 'desktop.recentGifs.allowLegacyTenorCdnUrls', + 'global.adminDeleteMaxAgeInSeconds', 'global.attachments.maxBytes', 'global.attachments.maxReceiveBytes', 'global.backups.mediaTierFallbackCdnNumber', @@ -85,10 +88,9 @@ const ScalarKeys = [ 'global.messageQueueTimeInSeconds', 'global.nicknames.max', 'global.nicknames.min', + 'global.normalDeleteMaxAgeInSeconds', 'global.pinned_message_limit', 'global.textAttachmentLimitBytes', - 'global.normalDeleteMaxAgeInSeconds', - 'global.adminDeleteMaxAgeInSeconds', ] as const; // These keys should always match those in Net.REMOTE_CONFIG_KEYS, prefixed by diff --git a/ts/state/smart/Preferences.preload.tsx b/ts/state/smart/Preferences.preload.tsx index 7fcb5ca768..402d586ea2 100644 --- a/ts/state/smart/Preferences.preload.tsx +++ b/ts/state/smart/Preferences.preload.tsx @@ -80,7 +80,6 @@ import { renderToastManagerWithoutMegaphone } from './ToastManager.preload.js'; import { useToastActions } from '../ducks/toast.preload.js'; import { DataReader, DataWriter } from '../../sql/Client.preload.js'; import { deleteAllMyStories } from '../../util/deleteAllMyStories.preload.js'; -import { isLocalBackupsEnabled } from '../../util/isLocalBackupsEnabled.dom.js'; import { SmartPreferencesDonations } from './PreferencesDonations.preload.js'; import { useDonationsActions } from '../ducks/donations.preload.js'; import { generateDonationReceiptBlob } from '../../util/generateDonationReceipt.dom.js'; @@ -580,7 +579,12 @@ export function SmartPreferences(): React.JSX.Element | null { Settings.isContentProtectionSupported(OS); const isContentProtectionNeeded = Settings.isContentProtectionNeeded(OS); - const backupLocalBackupsEnabled = isLocalBackupsEnabled(items.remoteConfig); + const backupLocalBackupsEnabled = isFeaturedEnabledSelector({ + betaKey: 'desktop.localBackups.beta', + prodKey: 'desktop.localBackups.prod', + currentVersion: version, + remoteConfig: items.remoteConfig, + }); const backupFreeMediaDays = getMessageQueueTime(items.remoteConfig) / DAY; const isPlaintextExportEnabled = isFeaturedEnabledSelector({ diff --git a/ts/util/isLocalBackupsEnabled.dom.ts b/ts/util/isLocalBackupsEnabled.dom.ts index a236c6f91e..7ed7c5f9d8 100644 --- a/ts/util/isLocalBackupsEnabled.dom.ts +++ b/ts/util/isLocalBackupsEnabled.dom.ts @@ -1,26 +1,11 @@ // Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only -import * as RemoteConfig from '../RemoteConfig.dom.js'; -import { isTestOrMockEnvironment } from '../environment.std.js'; -import { isStagingServer } from './isStagingServer.dom.js'; -import { isNightly } from './version.std.js'; +import { isFeaturedEnabledNoRedux } from './isFeatureEnabled.dom.js'; -export function isLocalBackupsEnabled( - reduxConfig?: RemoteConfig.ConfigMapType -): boolean { - if (isStagingServer() || isTestOrMockEnvironment()) { - return true; - } - - if (RemoteConfig.isEnabled('desktop.internalUser', reduxConfig)) { - return true; - } - - const version = window.getVersion?.(); - if (version != null) { - return isNightly(version); - } - - return false; +export function isLocalBackupsEnabled(): boolean { + return isFeaturedEnabledNoRedux({ + betaKey: 'desktop.localBackups.beta', + prodKey: 'desktop.localBackups.prod', + }); }