import { ReactNode, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Badge from '@/shared/components/badge' import { postJSON } from '@/infrastructure/fetch-json' import { Button } from 'react-bootstrap' import getMeta from '@/utils/meta' export type UserFeatures = { [key: string]: boolean } type IntegrationLinkingWidgetProps = { logo: ReactNode title: string description: string helpPath?: string labsEnabled?: boolean experimentName: string setErrorMessage: (message: string) => void } export function LabsExperimentWidget({ logo, title, description, helpPath, labsEnabled, experimentName, setErrorMessage, }: IntegrationLinkingWidgetProps) { const { t } = useTranslation() const userFeatures = getMeta('ol-features') as UserFeatures const [enabled, setEnabled] = useState(() => { return userFeatures[experimentName] === true }) const experimentsErrorMessage = t( 'we_are_unable_to_opt_you_into_this_experiment' ) const handleEnable = useCallback(async () => { try { const enablePath = `/labs/participate/experiments/${experimentName}/opt-in` await postJSON(enablePath) setEnabled(true) } catch (err) { setErrorMessage(experimentsErrorMessage) } }, [experimentName, setErrorMessage, experimentsErrorMessage]) const handleDisable = useCallback(async () => { try { const disablePath = `/labs/participate/experiments/${experimentName}/opt-out` await postJSON(disablePath) setEnabled(false) } catch (err) { setErrorMessage(experimentsErrorMessage) } }, [experimentName, setErrorMessage, experimentsErrorMessage]) return (
{logo}

{title}

{enabled && {t('enabled')}}

{description}{' '} {helpPath && ( {t('learn_more')} )}

{labsEnabled && ( )}
) } type ActionButtonProps = { enabled?: boolean handleEnable: () => void handleDisable: () => void } function ActionButton({ enabled, handleEnable, handleDisable, }: ActionButtonProps) { const { t } = useTranslation() if (enabled) { return ( ) } else { return ( ) } } export default LabsExperimentWidget