import { ReactNode } from "react";
import { TranslationKey } from "../languageHandler";
import { SettingLevel } from "./SettingLevel";
import SettingController from "./controllers/SettingController";
import { WatchManager } from "./WatchManager";
export declare const defaultWatchManager: WatchManager;
export declare enum LabGroup {
    Messaging = 0,
    Profile = 1,
    Spaces = 2,
    Widgets = 3,
    Rooms = 4,
    Threads = 5,
    VoiceAndVideo = 6,
    Moderation = 7,
    Analytics = 8,
    Themes = 9,
    Encryption = 10,
    Experimental = 11,
    Developer = 12,
    Ui = 13
}
export declare enum Features {
    VoiceBroadcast = "feature_voice_broadcast",
    VoiceBroadcastForceSmallChunks = "feature_voice_broadcast_force_small_chunks",
    NotificationSettings2 = "feature_notification_settings2",
    OidcNativeFlow = "feature_oidc_native_flow",
    ReleaseAnnouncement = "feature_release_announcement",
    /** If true, use the Rust crypto implementation.
     *
     * This is no longer read, but we continue to populate it on all devices, to guard against people rolling back to
     * old versions of EW that do not use rust crypto by default.
     */
    RustCrypto = "feature_rust_crypto"
}
export declare const labGroupNames: Record<LabGroup, TranslationKey>;
export type SettingValueType = boolean | number | string | number[] | string[] | Record<string, unknown> | Record<string, unknown>[] | null;
export interface IBaseSetting<T extends SettingValueType = SettingValueType> {
    isFeature?: false | undefined;
    displayName?: TranslationKey | Partial<{
        [level in SettingLevel]: TranslationKey;
    }>;
    description?: TranslationKey | (() => ReactNode);
    supportedLevels: SettingLevel[];
    default: T;
    controller?: SettingController;
    supportedLevelsAreOrdered?: boolean;
    invertedSettingName?: string;
    betaInfo?: {
        title: TranslationKey;
        caption: () => ReactNode;
        faq?: (enabled: boolean) => ReactNode;
        image?: string;
        feedbackSubheading?: TranslationKey;
        feedbackLabel?: string;
        extraSettings?: string[];
        requiresRefresh?: boolean;
    };
    shouldWarn?: boolean;
}
export interface IFeature extends Omit<IBaseSetting<boolean>, "isFeature"> {
    isFeature: true;
    labsGroup: LabGroup;
}
export type ISetting = IBaseSetting | IFeature;
export declare const SETTINGS: {
    [setting: string]: ISetting;
};
