Add feature flag for local backups

Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
This commit is contained in:
automated-signal
2026-03-17 14:20:50 -05:00
committed by GitHub
parent edb1a01223
commit 523b3153a7
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)
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<typeof SemverKeys>;
@@ -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

View File

@@ -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';
@@ -582,7 +581,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({

View File

@@ -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',
});
}