import { FindNativeFeature } from '@standardnotes/features'; import { Switch } from '@/components/Switch'; import { PreferencesGroup, PreferencesSegment, Subtitle, Text, Title, } from '@/components/Preferences/components'; import { WebApplication } from '@/ui_models/application'; import { FeatureIdentifier, FeatureStatus } from '@standardnotes/snjs'; import { FunctionComponent } from 'preact'; 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< ExperimentalFeatureItem[] >([]); const reloadExperimentalFeatures = useCallback(() => { 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]); useEffect(() => { reloadExperimentalFeatures(); }, [reloadExperimentalFeatures]); const premiumModal = usePremiumModal(); return ( Labs
{experimentalFeatures.map( ( { identifier, name, description, isEnabled, isEntitled }, index: number ) => { const toggleFeature = () => { if (!isEntitled) { premiumModal.activate(name); return; } application.features.toggleExperimentalFeature(identifier); reloadExperimentalFeatures(); }; const showHorizontalSeparator = experimentalFeatures.length > 1 && index !== experimentalFeatures.length - 1; return ( <>
{name} {description}
{showHorizontalSeparator && ( )} ); } )} {experimentalFeatures.length === 0 && (
No experimental features available.
)}
); };