RocketChat/Rocket.Chat

View on GitHub
packages/ui-client/src/components/FeaturePreview/FeaturePreview.tsx

Summary

Maintainability
A
0 mins
Test Coverage
/* eslint-disable react/no-multi-comp */
import type { ReactElement, ReactNode } from 'react';
import { Children, Suspense, cloneElement } from 'react';

import { useFeaturePreview } from '../../hooks/useFeaturePreview';
import { FeaturesAvailable } from '../../hooks/useFeaturePreviewList';

export const FeaturePreview = ({ feature, children }: { feature: FeaturesAvailable; children: ReactElement[] }) => {
    const featureToggleEnabled = useFeaturePreview(feature);

    const toggledChildren = Children.map(children, (child) =>
        cloneElement(child, {
            featureToggleEnabled,
        }),
    );

    return <Suspense fallback={null}>{toggledChildren}</Suspense>;
};

export const FeaturePreviewOn = ({ children, featureToggleEnabled }: { children: ReactNode; featureToggleEnabled?: boolean }) => (
    <>{featureToggleEnabled && children}</>
);

export const FeaturePreviewOff = ({ children, featureToggleEnabled }: { children: ReactNode; featureToggleEnabled?: boolean }) => (
    <>{!featureToggleEnabled && children}</>
);