import useSWR from 'swr'; import { Image } from 'antd'; import { useAuth } from '@tempi/auth'; import { componentApi, MAPPING_CATEGORY } from '@tempi/editor-site'; import { __federation_method_setRemote, __federation_method_getRemote, __federation_method_unwrapDefault, } from '__federation__'; export const getModule = async ( scope: string, url: string, element: string, ) => { try { await __federation_method_setRemote(scope, { url: () => Promise.resolve(url), format: 'esm', from: 'vite', }); const moduleWrapper = await __federation_method_getRemote(scope, element); const module = await __federation_method_unwrapDefault(moduleWrapper); return module; } catch (e) { console.error(e); } }; export const getCustomElementEditor = async (id: number) => { const { cdnBaseUrl } = window?.config || {}; const CustomElementEditor = await getModule( `bundle_${id}_latest.js`, `${cdnBaseUrl}/bundle_${id}_latest.js`, './selector', ); CustomElementEditor.craft = { ...CustomElementEditor.craft, props: { ...(CustomElementEditor.craft.props || {}), customId: id, }, custom: { ...(CustomElementEditor.craft.custom || {}), tag: `customelement`, }, displayName: CustomElementEditor.craft.displayName, }; return CustomElementEditor; }; export const useCustomComponent = () => { const { merchantIdsDisplayCustomComponent = [] } = window?.config || {}; const { currentMerchant } = useAuth(); const isMerchantPermitted = merchantIdsDisplayCustomComponent.length === 0 || merchantIdsDisplayCustomComponent.includes(currentMerchant?.id); const { data, mutate, error } = useSWR( isMerchantPermitted ? 'v1/components' : null, async () => { const res = await componentApi.getListComponent({ offset: 0, limit: 200, isShow: true, }); const listComponents = res?.components; const customComponents = []; const resolvers = {}; const getCustomElementsFn = listComponents.map((el) => { return getCustomElementEditor(el.id) .then((editor) => ({ element: el, editor, })) .catch(() => null); }); const selectors = (await Promise.all(getCustomElementsFn)).filter( Boolean, ); selectors.forEach(({ element, editor: CustomElementEditor }) => { resolvers[`CustomElement${element.id}`] = CustomElementEditor; const fetchedElement = { category: [MAPPING_CATEGORY[element.categoryId]], icon: ( // eslint-disable-next-line react/jsx-no-undef ), selector: , key: `CUSTOM_ELEMENT_${element.id}`, name: element.name, trackingContentName: element.name, }; customComponents.push(fetchedElement); }); return { customComponents, resolvers, }; }, { revalidateOnFocus: false, }, ); return { customLoaded: isMerchantPermitted ? data && !error : true, customComponents: data?.customComponents || [], mutateComponent: mutate, resolvers: data?.resolvers || {}, }; };