diff --git a/app/assets/javascripts/preferences/panes/general-segments/Labs.tsx b/app/assets/javascripts/preferences/panes/general-segments/Labs.tsx index 9d1370b6c..7c023168e 100644 --- a/app/assets/javascripts/preferences/panes/general-segments/Labs.tsx +++ b/app/assets/javascripts/preferences/panes/general-segments/Labs.tsx @@ -14,16 +14,41 @@ import { useCallback, useEffect, useState } from 'preact/hooks'; import { usePremiumModal } from '@/components/Premium'; import { HorizontalSeparator } from '@/components/shared/HorizontalSeparator'; +type ExperimentalFeatureItem = { + identifier: FeatureIdentifier; + name: string; + description: string; + isEnabled: boolean; + isEntitled: boolean; +}; + type Props = { application: WebApplication; }; export const LabsPane: FunctionComponent = ({ application }) => { - const [experimentalFeatures, setExperimentalFeatures] = - useState(); + const [experimentalFeatures, setExperimentalFeatures] = useState< + ExperimentalFeatureItem[] + >([]); const reloadExperimentalFeatures = useCallback(() => { - const experimentalFeatures = application.features.getExperimentalFeatures(); + const experimentalFeatures = application.features + .getExperimentalFeatures() + .map((featureIdentifier) => { + const feature = FindNativeFeature(featureIdentifier); + return { + identifier: featureIdentifier, + name: feature?.name ?? featureIdentifier, + description: feature?.description ?? '', + isEnabled: + application.features.isExperimentalFeatureEnabled( + featureIdentifier + ), + isEntitled: + application.features.getFeatureStatus(featureIdentifier) === + FeatureStatus.Entitled, + }; + }); setExperimentalFeatures(experimentalFeatures); }, [application.features]); @@ -33,42 +58,23 @@ export const LabsPane: FunctionComponent = ({ application }) => { const premiumModal = usePremiumModal(); - if (!experimentalFeatures) { - return ( -
- No experimental features available. -
- ); - } - return ( Labs
- {experimentalFeatures?.map( - (featureIdentifier: FeatureIdentifier, index: number) => { - const feature = FindNativeFeature(featureIdentifier); - const featureName = feature?.name ?? featureIdentifier; - const featureDescription = feature?.description ?? ''; - - const isFeatureEnabled = - application.features.isExperimentalFeatureEnabled( - featureIdentifier - ); - + {experimentalFeatures.map( + ( + { identifier, name, description, isEnabled, isEntitled }, + index: number + ) => { const toggleFeature = () => { - const isEntitled = - application.features.getFeatureStatus(featureIdentifier) === - FeatureStatus.Entitled; if (!isEntitled) { - premiumModal.activate(featureName); + premiumModal.activate(name); return; } - application.features.toggleExperimentalFeature( - featureIdentifier - ); + application.features.toggleExperimentalFeature(identifier); reloadExperimentalFeatures(); }; @@ -80,13 +86,10 @@ export const LabsPane: FunctionComponent = ({ application }) => { <>
- {featureName} - {featureDescription} + {name} + {description}
- +
{showHorizontalSeparator && ( @@ -95,6 +98,13 @@ export const LabsPane: FunctionComponent = ({ application }) => { ); } )} + {experimentalFeatures.length === 0 && ( +
+
+ No experimental features available. +
+
+ )}