You've already forked AstralRinth
0ffdabb2a3
* feat: new proj moderation page * make requested changes * add boolean for showing delay message * fix server icon + shortened code * fix server icon * refactor admonitions * msg correction. * correction + change spam-notice * Separate status info from instruction details * Tweak timing delay msg, thread activity warning, and refer to moderation with consistent terms. * Whoops, actually updated msgs correctly now. * prepr + margin * split out strings, simplify code again * fix: a few more moderation fixes (#6048) * fix: move tooltip to button * fix: lock status buttons after pressing * fix: unlisted/withheld icon on legacy badge * prepprrr * fix banners, add some extra dev mode stuff * fix thread id copy padding * tweak: adjust some of the status change messages (#6041) * update messages & bunch of other stuff * rename toggle * change hover to 2.5, fix error size * private msg overlay --------- Co-authored-by: coolbot100s <76798835+coolbot100s@users.noreply.github.com>
112 lines
3.0 KiB
TypeScript
112 lines
3.0 KiB
TypeScript
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 = <K extends PropertyKey>(flags: Record<K, FlagValue>) => 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,
|
|
projectBackground: false,
|
|
searchBackground: false,
|
|
advancedDebugInfo: false,
|
|
FilesRefreshButton: false,
|
|
showProjectPageDownloadModalServersPromo: false,
|
|
showProjectPageCreateServersTooltip: true,
|
|
showProjectPageQuickServerButton: false,
|
|
newProjectGeneralSettings: false,
|
|
newProjectEnvironmentSettings: true,
|
|
serverRamAsBytesAlwaysOn: false,
|
|
archonSentryCapture: false,
|
|
hideRussiaCensorshipBanner: false,
|
|
disablePrettyProjectUrlRedirects: false,
|
|
hidePreviewBanner: false,
|
|
i18nDebug: false,
|
|
showDiscoverProjectButtons: false,
|
|
useV1ContentTabAPI: true,
|
|
labrinthApiCanary: false,
|
|
dismissedExternalProjectsInfo: false,
|
|
modpackPermissionsPage: false,
|
|
showAllBanners: false,
|
|
alwaysIgnoreErrorBanner: false,
|
|
showViewProdRouteBanner: false,
|
|
showModeratorProjectMemberUi: false,
|
|
showModeratorPrivateMessageHighlight: true,
|
|
} 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<AllFeatureFlags>
|
|
|
|
const COOKIE_OPTIONS = {
|
|
maxAge: 60 * 60 * 24 * 365 * 10,
|
|
sameSite: 'lax',
|
|
secure: true,
|
|
httpOnly: false,
|
|
path: '/',
|
|
} satisfies CookieOptions<PartialFeatureFlags>
|
|
|
|
export const useFeatureFlags = () =>
|
|
useState<AllFeatureFlags>('featureFlags', () => {
|
|
const config = useRuntimeConfig()
|
|
|
|
const savedFlags = useCookie<PartialFeatureFlags>('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<PartialFeatureFlags>('featureFlags', COOKIE_OPTIONS)
|
|
cookie.value = flags.value
|
|
}
|