import * as React from 'react'; import { Alert, Flex, Link, Placeholder } from '@aws-amplify/ui-react'; import dynamic, { LoaderComponent } from 'next/dynamic'; import { useRouter } from 'next/router'; import { isArray } from 'lodash'; export default function Example() { return; } export interface FragmentProps { /** * Allowlist of accepted platforms. If the current platform is not in this * list, then the fragment will not render. * */ platforms?: string[]; /** * If true, all JS frameworks (react, vue, angular) will be treated as a single platform named 'web'. * Note: if this is true, platforms={['web']} should be used to enable web content instead of platforms={['react', 'vue', 'angular']} */ useCommonWebContent?: boolean; children: ({ platform }: { platform: string }) => LoaderComponent; } const shouldRenderFragment = ( allowlist: string[], platform: string | string[] ): boolean => { if (isArray(platform)) { console.error('ERROR - Only one platform should be selected.'); return true; } if (!allowlist) { // if allowlist is not provided, we assume we render all requested fragment return true; } else { // if allowlist is provided, then we render only if it's allowlisted return allowlist.includes(platform); } }; export const Fragment = ({ children, platforms, useCommonWebContent, }: FragmentProps) => { const { query: { platform: framework = 'react' }, } = useRouter(); const platform = getPlatform(framework as string, useCommonWebContent); const Component = React.useMemo(() => { if (!shouldRenderFragment(platforms, platform)) { return null; } return dynamic(() => children({ platform }), { loading({ error, isLoading }) { if (error) { return ( {error.message.includes('Cannot find module') ? ( <>Content missing for {platform}. ) : ( error.message )}{' '} Please open an issue. ); } return ( ); }, }); }, [children, platform, platforms]); return Component ? : null; }; function getPlatform(framework = 'react', useCommonWebContent = false) { if (!useCommonWebContent) { return framework; } if (['react', 'vue', 'angular'].includes(framework)) { return 'web'; } return framework; }