Add feature flag for local backups

This commit is contained in:
trevor-signal
2026-03-17 11:52:20 -07:00
committed by GitHub
parent f21f83de01
commit 5233849d05
3 changed files with 27 additions and 36 deletions

View File

@@ -30,34 +30,36 @@ const log = createLogger('RemoteConfig');
// Semver flags must always be set to a valid semver (no empty enabled-only keys) // Semver flags must always be set to a valid semver (no empty enabled-only keys)
const SemverKeys = [ 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.beta',
'desktop.callQualitySurvey.prod', 'desktop.callQualitySurvey.prod',
'desktop.donationPaypal.beta', 'desktop.donationPaypal.beta',
'desktop.donationPaypal.prod', 'desktop.donationPaypal.prod',
'desktop.groupMemberLabels.edit.beta', 'desktop.groupMemberLabels.edit.beta',
'desktop.groupMemberLabels.edit.prod', 'desktop.groupMemberLabels.edit.prod',
'desktop.adminDelete.receive.beta', 'desktop.keyTransparency.beta',
'desktop.adminDelete.receive.prod', 'desktop.keyTransparency.prod',
'desktop.adminDelete.send.beta', 'desktop.localBackups.beta',
'desktop.adminDelete.send.prod', 'desktop.localBackups.prod',
'desktop.pinnedMessages.receive.beta', 'desktop.pinnedMessages.receive.beta',
'desktop.pinnedMessages.receive.prod', 'desktop.pinnedMessages.receive.prod',
'desktop.pinnedMessages.send.beta', 'desktop.pinnedMessages.send.beta',
'desktop.pinnedMessages.send.prod', 'desktop.pinnedMessages.send.prod',
'desktop.plaintextExport.beta', 'desktop.plaintextExport.beta',
'desktop.plaintextExport.prod', 'desktop.plaintextExport.prod',
'desktop.pollSend1to1.beta',
'desktop.pollSend1to1.prod',
'desktop.remoteMegaphone.beta', 'desktop.remoteMegaphone.beta',
'desktop.remoteMegaphone.prod', 'desktop.remoteMegaphone.prod',
'desktop.remoteMute.send.beta', 'desktop.remoteMute.send.beta',
'desktop.remoteMute.send.prod', 'desktop.remoteMute.send.prod',
'desktop.retireAccessKeyGroupSend.beta', 'desktop.retireAccessKeyGroupSend.beta',
'desktop.retireAccessKeyGroupSend.prod', 'desktop.retireAccessKeyGroupSend.prod',
'desktop.keyTransparency.beta',
'desktop.keyTransparency.prod',
'desktop.binaryServiceId.beta',
'desktop.binaryServiceId.prod',
'desktop.pollSend1to1.beta',
'desktop.pollSend1to1.prod',
] as const; ] as const;
export type SemverKeyType = ArrayValues<typeof SemverKeys>; export type SemverKeyType = ArrayValues<typeof SemverKeys>;
@@ -72,10 +74,11 @@ const ScalarKeys = [
'desktop.loggingErrorToasts', 'desktop.loggingErrorToasts',
'desktop.mediaQuality.levels', 'desktop.mediaQuality.levels',
'desktop.messageCleanup', 'desktop.messageCleanup',
'desktop.recentGifs.allowLegacyTenorCdnUrls',
'desktop.retryRespondMaxAge', 'desktop.retryRespondMaxAge',
'desktop.senderKey.retry', 'desktop.senderKey.retry',
'desktop.senderKeyMaxAge', 'desktop.senderKeyMaxAge',
'desktop.recentGifs.allowLegacyTenorCdnUrls', 'global.adminDeleteMaxAgeInSeconds',
'global.attachments.maxBytes', 'global.attachments.maxBytes',
'global.attachments.maxReceiveBytes', 'global.attachments.maxReceiveBytes',
'global.backups.mediaTierFallbackCdnNumber', 'global.backups.mediaTierFallbackCdnNumber',
@@ -85,10 +88,9 @@ const ScalarKeys = [
'global.messageQueueTimeInSeconds', 'global.messageQueueTimeInSeconds',
'global.nicknames.max', 'global.nicknames.max',
'global.nicknames.min', 'global.nicknames.min',
'global.normalDeleteMaxAgeInSeconds',
'global.pinned_message_limit', 'global.pinned_message_limit',
'global.textAttachmentLimitBytes', 'global.textAttachmentLimitBytes',
'global.normalDeleteMaxAgeInSeconds',
'global.adminDeleteMaxAgeInSeconds',
] as const; ] as const;
// These keys should always match those in Net.REMOTE_CONFIG_KEYS, prefixed by // These keys should always match those in Net.REMOTE_CONFIG_KEYS, prefixed by

View File

@@ -80,7 +80,6 @@ import { renderToastManagerWithoutMegaphone } from './ToastManager.preload.js';
import { useToastActions } from '../ducks/toast.preload.js'; import { useToastActions } from '../ducks/toast.preload.js';
import { DataReader, DataWriter } from '../../sql/Client.preload.js'; import { DataReader, DataWriter } from '../../sql/Client.preload.js';
import { deleteAllMyStories } from '../../util/deleteAllMyStories.preload.js'; import { deleteAllMyStories } from '../../util/deleteAllMyStories.preload.js';
import { isLocalBackupsEnabled } from '../../util/isLocalBackupsEnabled.dom.js';
import { SmartPreferencesDonations } from './PreferencesDonations.preload.js'; import { SmartPreferencesDonations } from './PreferencesDonations.preload.js';
import { useDonationsActions } from '../ducks/donations.preload.js'; import { useDonationsActions } from '../ducks/donations.preload.js';
import { generateDonationReceiptBlob } from '../../util/generateDonationReceipt.dom.js'; import { generateDonationReceiptBlob } from '../../util/generateDonationReceipt.dom.js';
@@ -580,7 +579,12 @@ export function SmartPreferences(): React.JSX.Element | null {
Settings.isContentProtectionSupported(OS); Settings.isContentProtectionSupported(OS);
const isContentProtectionNeeded = Settings.isContentProtectionNeeded(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 backupFreeMediaDays = getMessageQueueTime(items.remoteConfig) / DAY;
const isPlaintextExportEnabled = isFeaturedEnabledSelector({ const isPlaintextExportEnabled = isFeaturedEnabledSelector({

View File

@@ -1,26 +1,11 @@
// Copyright 2025 Signal Messenger, LLC // Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only // SPDX-License-Identifier: AGPL-3.0-only
import * as RemoteConfig from '../RemoteConfig.dom.js'; import { isFeaturedEnabledNoRedux } from './isFeatureEnabled.dom.js';
import { isTestOrMockEnvironment } from '../environment.std.js';
import { isStagingServer } from './isStagingServer.dom.js';
import { isNightly } from './version.std.js';
export function isLocalBackupsEnabled( export function isLocalBackupsEnabled(): boolean {
reduxConfig?: RemoteConfig.ConfigMapType return isFeaturedEnabledNoRedux({
): boolean { betaKey: 'desktop.localBackups.beta',
if (isStagingServer() || isTestOrMockEnvironment()) { prodKey: 'desktop.localBackups.prod',
return true; });
}
if (RemoteConfig.isEnabled('desktop.internalUser', reduxConfig)) {
return true;
}
const version = window.getVersion?.();
if (version != null) {
return isNightly(version);
}
return false;
} }