import type { CookieOptions } from '#app' export type ProjectDisplayMode = 'list' | 'grid' | 'gallery' export type DarkColorTheme = 'dark' | 'oled' | 'retro' export interface NumberFlag { min: number max: number } export type BooleanFlag = boolean export type RadioFlag = ProjectDisplayMode | DarkColorTheme export type FlagValue = BooleanFlag /* | NumberFlag | RadioFlag */ const validateValues = (flags: Record) => flags export const DEFAULT_FEATURE_FLAGS = validateValues({ // Developer flags developerMode: false, demoMode: false, showVersionFilesInTable: false, showAdsWithPlus: false, alwaysShowChecklistAsPopup: true, testTaxForm: false, // Feature toggles projectTypesPrimaryNav: false, enableMedalPromotion: true, hidePlusPromoInUserMenu: false, oldProjectCards: true, newProjectCards: false, projectBackground: false, searchBackground: false, advancedDebugInfo: false, showProjectPageDownloadModalServersPromo: false, showProjectPageCreateServersTooltip: true, showProjectPageQuickServerButton: false, newProjectGeneralSettings: false, newProjectEnvironmentSettings: true, hideRussiaCensorshipBanner: false, serverDiscovery: false, // advancedRendering: true, // externalLinksNewTab: true, // notUsingBlockers: false, // hideModrinthAppPromos: false, // preferredDarkTheme: 'dark', // hideStagingBanner: false, // Project display modes // modSearchDisplayMode: 'list', // pluginSearchDisplayMode: 'list', // resourcePackSearchDisplayMode: 'gallery', // modpackSearchDisplayMode: 'list', // shaderSearchDisplayMode: 'gallery', // dataPackSearchDisplayMode: 'list', // userProjectDisplayMode: 'list', // collectionProjectDisplayMode: 'list', } as const) export type FeatureFlag = keyof typeof DEFAULT_FEATURE_FLAGS export type AllFeatureFlags = { [key in FeatureFlag]: (typeof DEFAULT_FEATURE_FLAGS)[key] } export type PartialFeatureFlags = Partial const COOKIE_OPTIONS = { maxAge: 60 * 60 * 24 * 365 * 10, sameSite: 'lax', secure: true, httpOnly: false, path: '/', } satisfies CookieOptions export const useFeatureFlags = () => useState('featureFlags', () => { const config = useRuntimeConfig() const savedFlags = useCookie('featureFlags', COOKIE_OPTIONS) if (!savedFlags.value) { savedFlags.value = {} } const flags: AllFeatureFlags = JSON.parse(JSON.stringify(DEFAULT_FEATURE_FLAGS)) const overrides = config.public.featureFlagOverrides as PartialFeatureFlags for (const key in overrides) { if (key in flags) { const flag = key as FeatureFlag const value = overrides[flag] as (typeof flags)[FeatureFlag] flags[flag] = value } } for (const key in savedFlags.value) { if (key in flags) { const flag = key as FeatureFlag const value = savedFlags.value[flag] as (typeof flags)[FeatureFlag] flags[flag] = value } } return flags }) export const saveFeatureFlags = () => { const flags = useFeatureFlags() const cookie = useCookie('featureFlags', COOKIE_OPTIONS) cookie.value = flags.value }