feat: add show ram as bytes always on

This commit is contained in:
tdgao
2026-04-14 18:38:41 -06:00
parent 34e1db3a30
commit e9d42f276c
8 changed files with 58 additions and 8 deletions
+5
View File
@@ -157,6 +157,11 @@ provideModrinthClient(tauriApiClient)
providePageContext({ providePageContext({
hierarchicalSidebarAvailable: ref(true), hierarchicalSidebarAvailable: ref(true),
showAds: ref(false), showAds: ref(false),
featureFlags: {
serverRamAsBytesAlwaysOn: computed(() =>
themeStore.getFeatureFlag('server_ram_as_bytes_always_on'),
),
},
openExternalUrl: (url) => openUrl(url), openExternalUrl: (url) => openUrl(url),
}) })
provideModalBehavior({ provideModalBehavior({
+1
View File
@@ -6,6 +6,7 @@ export const DEFAULT_FEATURE_FLAGS = {
worlds_tab: false, worlds_tab: false,
worlds_in_home: true, worlds_in_home: true,
server_project_qa: false, server_project_qa: false,
server_ram_as_bytes_always_on: false,
i18n_debug: false, i18n_debug: false,
} }
@@ -38,6 +38,7 @@ export const DEFAULT_FEATURE_FLAGS = validateValues({
showProjectPageQuickServerButton: false, showProjectPageQuickServerButton: false,
newProjectGeneralSettings: false, newProjectGeneralSettings: false,
newProjectEnvironmentSettings: true, newProjectEnvironmentSettings: true,
serverRamAsBytesAlwaysOn: false,
archonSentryCapture: false, archonSentryCapture: false,
hideRussiaCensorshipBanner: false, hideRussiaCensorshipBanner: false,
disablePrettyProjectUrlRedirects: false, disablePrettyProjectUrlRedirects: false,
@@ -1,12 +1,18 @@
import { provideModalBehavior, providePageContext } from '@modrinth/ui' import { provideModalBehavior, providePageContext } from '@modrinth/ui'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { useFeatureFlags } from '~/composables/featureFlags.ts'
export function setupPageContextProvider() { export function setupPageContextProvider() {
const cosmetics = useCosmetics() const cosmetics = useCosmetics()
const featureFlags = useFeatureFlags()
providePageContext({ providePageContext({
hierarchicalSidebarAvailable: ref(false), hierarchicalSidebarAvailable: ref(false),
showAds: ref(false), showAds: ref(false),
featureFlags: {
serverRamAsBytesAlwaysOn: computed(() => featureFlags.value.serverRamAsBytesAlwaysOn),
},
openExternalUrl: (url) => window.open(url, '_blank'), openExternalUrl: (url) => window.open(url, '_blank'),
}) })
provideModalBehavior({ provideModalBehavior({
+1
View File
@@ -55,6 +55,7 @@ pub enum FeatureFlag {
ProjectBackground, ProjectBackground,
WorldsTab, WorldsTab,
WorldsInHome, WorldsInHome,
ServerRamAsBytesAlwaysOn,
ServersInApp, ServersInApp,
ServerProjectQa, ServerProjectQa,
I18nDebug, I18nDebug,
@@ -89,12 +89,15 @@
</div> </div>
<span>{{ prefConfig.description }}</span> <span>{{ prefConfig.description }}</span>
</label> </label>
<Toggle <div v-tooltip="getPreferenceTooltip(key)">
:id="`pref-${key}`" <Toggle
v-model="newUserPreferences[key]" :id="`pref-${key}`"
class="flex-none" :model-value="getPreferenceValue(key)"
:disabled="!prefConfig.implemented" class="flex-none"
/> :disabled="!prefConfig.implemented || isPreferenceForcedByFeatureFlag(key)"
@update:model-value="(value) => setPreferenceValue(key, !!value)"
/>
</div>
</div> </div>
<!-- Info --> <!-- Info -->
@@ -138,11 +141,13 @@ import {
injectModrinthClient, injectModrinthClient,
injectModrinthServerContext, injectModrinthServerContext,
injectNotificationManager, injectNotificationManager,
injectPageContext,
} from '#ui/providers' } from '#ui/providers'
const { addNotification } = injectNotificationManager() const { addNotification } = injectNotificationManager()
const client = injectModrinthClient() const client = injectModrinthClient()
const { server: data, serverId, busyReasons } = injectModrinthServerContext() const { server: data, serverId, busyReasons } = injectModrinthServerContext()
const { featureFlags } = injectPageContext()
const queryClient = useQueryClient() const queryClient = useQueryClient()
const serverName = ref(data.value?.name) const serverName = ref(data.value?.name)
@@ -207,6 +212,28 @@ const userPreferences = useStorage<UserPreferences>(
const newUserPreferences = ref<UserPreferences>(JSON.parse(JSON.stringify(userPreferences.value))) const newUserPreferences = ref<UserPreferences>(JSON.parse(JSON.stringify(userPreferences.value)))
const isRamAsBytesForcedByFeatureFlag = computed(
() => featureFlags?.serverRamAsBytesAlwaysOn?.value ?? false,
)
const isPreferenceForcedByFeatureFlag = (key: string) =>
key === 'ramAsNumber' && isRamAsBytesForcedByFeatureFlag.value
const getPreferenceTooltip = (key: string) =>
isPreferenceForcedByFeatureFlag(key)
? 'Feature flag enabled to always show RAM as bytes.'
: undefined
const getPreferenceValue = (key: string) =>
isPreferenceForcedByFeatureFlag(key) ? true : newUserPreferences.value[key as PreferenceKeys]
const setPreferenceValue = (key: string, value: boolean) => {
if (isPreferenceForcedByFeatureFlag(key)) {
return
}
newUserPreferences.value[key as PreferenceKeys] = value
}
// Info properties // Info properties
const infoProperties = [ const infoProperties = [
{ name: 'Server ID', value: serverId ?? 'Unknown' }, { name: 'Server ID', value: serverId ?? 'Unknown' },
@@ -60,11 +60,12 @@ import { useStorage } from '@vueuse/core'
import { computed, defineAsyncComponent, ref, shallowRef, watch } from 'vue' import { computed, defineAsyncComponent, ref, shallowRef, watch } from 'vue'
import { RouterLink } from 'vue-router' import { RouterLink } from 'vue-router'
import { injectModrinthServerContext } from '#ui/providers' import { injectModrinthServerContext, injectPageContext } from '#ui/providers'
const VueApexCharts = defineAsyncComponent(() => import('vue3-apexcharts')) const VueApexCharts = defineAsyncComponent(() => import('vue3-apexcharts'))
const { serverId } = injectModrinthServerContext() const { serverId } = injectModrinthServerContext()
const { featureFlags } = injectPageContext()
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
@@ -83,6 +84,9 @@ const chartsReady = ref(new Set<number>())
const userPreferences = useStorage(`pyro-server-${serverId || 'unknown'}-preferences`, { const userPreferences = useStorage(`pyro-server-${serverId || 'unknown'}-preferences`, {
ramAsNumber: false, ramAsNumber: false,
}) })
const isRamAsBytesForcedByFeatureFlag = computed(
() => featureFlags?.serverRamAsBytesAlwaysOn?.value ?? false,
)
const stats = shallowRef( const stats = shallowRef(
props.data?.current || { props.data?.current || {
@@ -214,7 +218,9 @@ const metrics = computed(() => {
{ {
title: 'Memory', title: 'Memory',
value: value:
props.showMemoryAsBytes || userPreferences.value.ramAsNumber props.showMemoryAsBytes ||
isRamAsBytesForcedByFeatureFlag.value ||
userPreferences.value.ramAsNumber
? formatBytes(stats.value.ram_usage_bytes ?? 0) ? formatBytes(stats.value.ram_usage_bytes ?? 0)
: `${ramPercent.value.toFixed(2)}%`, : `${ramPercent.value.toFixed(2)}%`,
icon: DatabaseIcon, icon: DatabaseIcon,
@@ -6,6 +6,9 @@ export interface PageContext {
// pages may render sidebar content in #sidebar-teleport-target instead of in the main layout when true // pages may render sidebar content in #sidebar-teleport-target instead of in the main layout when true
hierarchicalSidebarAvailable: Ref<boolean> hierarchicalSidebarAvailable: Ref<boolean>
showAds: Ref<boolean> showAds: Ref<boolean>
featureFlags?: {
serverRamAsBytesAlwaysOn?: Ref<boolean>
}
openExternalUrl: (url: string) => void openExternalUrl: (url: string) => void
} }