import { ExternalLink, Eye, EyeOff, FlaskConical } from 'lucide-react' import Link from 'next/link' import { ReactNode, useEffect } from 'react' import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization' import { IS_PLATFORM } from 'lib/constants' import { useAppStateSnapshot } from 'state/app-state' import { Badge, Button, Modal, ScrollArea, cn } from 'ui' import { APISidePanelPreview } from './APISidePanelPreview' import { CLSPreview } from './CLSPreview' import { FEATURE_PREVIEWS } from './FeaturePreview.constants' import { useFeaturePreviewContext } from './FeaturePreviewContext' import { InlineEditorPreview } from './InlineEditorPreview' const FEATURE_PREVIEW_KEY_TO_CONTENT: { [key: string]: ReactNode } = { [LOCAL_STORAGE_KEYS.UI_PREVIEW_INLINE_EDITOR]: , [LOCAL_STORAGE_KEYS.UI_PREVIEW_API_SIDE_PANEL]: , [LOCAL_STORAGE_KEYS.UI_PREVIEW_CLS]: , } const FeaturePreviewModal = () => { const { ref } = useParams() const snap = useAppStateSnapshot() const org = useSelectedOrganization() const featurePreviewContext = useFeaturePreviewContext() const { mutate: sendEvent } = useSendEventMutation() // [Joshen] Use this if we want to feature flag previews function isReleasedToPublic(feature: (typeof FEATURE_PREVIEWS)[number]) { switch (feature.key) { default: return true } } const selectedFeatureKey = snap.selectedFeaturePreview === '' ? FEATURE_PREVIEWS.filter((feature) => isReleasedToPublic(feature))[0].key : snap.selectedFeaturePreview const { flags, onUpdateFlag } = featurePreviewContext const selectedFeature = FEATURE_PREVIEWS.find((preview) => preview.key === selectedFeatureKey) const isSelectedFeatureEnabled = flags[selectedFeatureKey] const allFeaturePreviews = IS_PLATFORM ? FEATURE_PREVIEWS : FEATURE_PREVIEWS.filter((x) => !x.isPlatformOnly) const toggleFeature = () => { onUpdateFlag(selectedFeatureKey, !isSelectedFeatureEnabled) sendEvent({ action: isSelectedFeatureEnabled ? 'feature_preview_disabled' : 'feature_preview_enabled', properties: { feature: selectedFeatureKey }, groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) } function handleCloseFeaturePreviewModal() { snap.setShowFeaturePreviewModal(false) } useEffect(() => { if (snap.showFeaturePreviewModal) { sendEvent({ action: 'feature_previews_clicked', groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) } }, [snap.showFeaturePreviewModal]) return ( {FEATURE_PREVIEWS.length > 0 ? (
{allFeaturePreviews .filter((feature) => isReleasedToPublic(feature)) .map((feature) => { const isEnabled = flags[feature.key] ?? false return (
snap.setSelectedFeaturePreview(feature.key)} className={cn( 'flex items-center space-x-3 p-4 border-b cursor-pointer bg transition', selectedFeatureKey === feature.key ? 'bg-surface-300' : 'bg-surface-100' )} > {isEnabled ? ( ) : ( )}

{feature.name}

) })}

{selectedFeature?.name}

{selectedFeature?.isNew && New}
{selectedFeature?.discussionsUrl !== undefined && ( )}
{FEATURE_PREVIEW_KEY_TO_CONTENT[selectedFeatureKey]}
) : (

No feature previews available

Have an idea for the dashboard? Let us know via Github Discussions!

)}
) } export default FeaturePreviewModal