feat: self-serve signup Phase 2 (frontend cutover) (#162)
Co-authored-by: Michael Chihlas <michael@resolutionflow.com> Co-committed-by: Michael Chihlas <michael@resolutionflow.com>
This commit was merged in pull request #162.
This commit is contained in:
42
frontend/src/components/common/FeatureGate.tsx
Normal file
42
frontend/src/components/common/FeatureGate.tsx
Normal file
@@ -0,0 +1,42 @@
|
||||
import type { ReactNode } from 'react'
|
||||
import { useFeature } from '@/hooks/useFeature'
|
||||
import { UpgradePrompt } from './UpgradePrompt'
|
||||
|
||||
interface FeatureGateProps {
|
||||
/** Feature flag key (e.g. `psa_integration`). Must match a backend `feature_flags.flag_key`. */
|
||||
feature: string
|
||||
/**
|
||||
* Rendered when the feature is enabled for the current account.
|
||||
*/
|
||||
children: ReactNode
|
||||
/**
|
||||
* Rendered when the feature is disabled. Defaults to `<UpgradePrompt feature={feature} />`.
|
||||
* Pass `null` to render nothing.
|
||||
*/
|
||||
fallback?: ReactNode
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditionally renders `children` based on whether `feature` is enabled
|
||||
* for the current account.
|
||||
*
|
||||
* This is a UX affordance — the security boundary is the backend
|
||||
* `require_feature` dependency. Never trust this gate for authorization.
|
||||
*/
|
||||
export function FeatureGate({ feature, children, fallback }: FeatureGateProps) {
|
||||
const enabled = useFeature(feature)
|
||||
|
||||
if (enabled) {
|
||||
return <>{children}</>
|
||||
}
|
||||
|
||||
// Use explicit fallback when provided, otherwise render the standard prompt.
|
||||
// `null` is a valid fallback (renders nothing).
|
||||
if (fallback !== undefined) {
|
||||
return <>{fallback}</>
|
||||
}
|
||||
|
||||
return <UpgradePrompt feature={feature} />
|
||||
}
|
||||
|
||||
export default FeatureGate
|
||||
Reference in New Issue
Block a user