feat: view config feature flag (#13171)

* feat: add view_configurations feature flag

  - Add feature flag provider and hooks to admin dashboard
  - Add backend API endpoint for feature flags
  - Create view_configurations feature flag (disabled by default)
  - Update order list table to use legacy version when flag is disabled
  - Can be enabled with MEDUSA_FF_VIEW_CONFIGURATIONS=true env var

* fix: naming

* fix: feature flags unauthenticated

* fix: add test
This commit is contained in:
Sebastian Rindom
2025-08-15 08:56:40 +02:00
committed by GitHub
parent 4b3c43fe92
commit ab795bb0a2
8 changed files with 178 additions and 3 deletions
@@ -0,0 +1,46 @@
import React, { createContext, useContext } from "react"
import { useFeatureFlags, FeatureFlags } from "../../hooks/api/feature-flags"
interface FeatureFlagContextValue {
flags: FeatureFlags
isLoading: boolean
isFeatureEnabled: (flag: keyof FeatureFlags) => boolean
}
const FeatureFlagContext = createContext<FeatureFlagContextValue | null>(null)
export const useFeatureFlag = (flag: keyof FeatureFlags): boolean => {
const context = useContext(FeatureFlagContext)
if (!context) {
// If no context, assume feature is disabled
return false
}
return context.isFeatureEnabled(flag)
}
export const useFeatureFlagContext = () => {
const context = useContext(FeatureFlagContext)
if (!context) {
throw new Error("useFeatureFlagContext must be used within FeatureFlagProvider")
}
return context
}
interface FeatureFlagProviderProps {
children: React.ReactNode
}
export const FeatureFlagProvider: React.FC<FeatureFlagProviderProps> = ({ children }) => {
const { data: flags = {}, isLoading, error } = useFeatureFlags()
const isFeatureEnabled = (flag: keyof FeatureFlags): boolean => {
const enabled = flags[flag] === true
return enabled
}
return (
<FeatureFlagContext.Provider value={{ flags, isLoading, isFeatureEnabled }}>
{children}
</FeatureFlagContext.Provider>
)
}
@@ -8,6 +8,7 @@ import { queryClient } from "../lib/query-client"
import { ExtensionProvider } from "./extension-provider"
import { I18nProvider } from "./i18n-provider"
import { ThemeProvider } from "./theme-provider"
import { FeatureFlagProvider } from "./feature-flag-provider"
type ProvidersProps = PropsWithChildren<{
api: DashboardApp["api"]
@@ -20,9 +21,11 @@ export const Providers = ({ api, children }: ProvidersProps) => {
<HelmetProvider>
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<I18n />
<I18nProvider>{children}</I18nProvider>
<Toaster />
<FeatureFlagProvider>
<I18n />
<I18nProvider>{children}</I18nProvider>
<Toaster />
</FeatureFlagProvider>
</ThemeProvider>
</QueryClientProvider>
</HelmetProvider>