import React, { lazy, Suspense, useCallback, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { CoverType, ViewIconType, ViewLayout, ViewMetaCover, ViewMetaIcon, ViewMetaProps } from '@/application/types'; import TitleEditable from '@/components/view-meta/TitleEditable'; import ViewCover from '@/components/view-meta/ViewCover'; import { CustomIconPopover } from '@/components/_shared/cutsom-icon'; import { notify } from '@/components/_shared/notify'; import PageIcon from '@/components/_shared/view-icon/PageIcon'; const AddIconCover = lazy(() => import('@/components/view-meta/AddIconCover')); export function ViewMetaPreview({ icon: iconProp, cover: coverProp, name, extra, readOnly = true, viewId, updatePage, onEnter, maxWidth, uploadFile, layout, onFocus, updatePageIcon, updatePageName, }: ViewMetaProps) { const [cover, setCover] = React.useState(coverProp || null); const [icon, setIcon] = React.useState(iconProp || null); useEffect(() => { setCover(coverProp || null); }, [coverProp]); useEffect(() => { setIcon(iconProp || null); }, [iconProp]); const coverType = useMemo(() => { if (cover && [CoverType.NormalColor, CoverType.GradientColor].includes(cover.type)) { return 'color'; } if (CoverType.BuildInImage === cover?.type) { return 'built_in'; } if (cover && [CoverType.CustomImage, CoverType.UpsplashImage].includes(cover.type)) { return 'custom'; } }, [cover]); const coverValue = useMemo(() => { if (coverType === CoverType.BuildInImage) { return { 1: '/covers/m_cover_image_1.png', 2: '/covers/m_cover_image_2.png', 3: '/covers/m_cover_image_3.png', 4: '/covers/m_cover_image_4.png', 5: '/covers/m_cover_image_5.png', 6: '/covers/m_cover_image_6.png', }[cover?.value as string]; } return cover?.value; }, [coverType, cover?.value]); const { t } = useTranslation(); const [isHover, setIsHover] = React.useState(false); const handleUpdateIcon = React.useCallback( async (icon: { ty: ViewIconType; value: string }) => { if (!updatePageIcon || !viewId) return; setIcon(icon); try { await updatePageIcon(viewId, icon); // eslint-disable-next-line } catch (e: any) { notify.error(e.message); } }, [updatePageIcon, viewId] ); const handleUpdateName = React.useCallback( async (newName: string) => { if (!updatePageName || !viewId) return; try { if (name === newName) return; await updatePageName(viewId, newName); // eslint-disable-next-line } catch (e: any) { notify.error(e.message); } }, [name, updatePageName, viewId] ); const handleUpdateCover = React.useCallback( async (cover?: { type: CoverType; value: string }) => { if (!updatePage || !viewId) return; setCover(cover ? cover : null); try { await updatePage(viewId, { icon: icon || { ty: ViewIconType.Emoji, value: '', }, name: name || '', extra: { ...extra, cover: cover, }, }); // eslint-disable-next-line } catch (e: any) { notify.error(e.message); } }, [extra, icon, name, updatePage, viewId] ); const onUploadFile = useCallback( async (file: File) => { if (!uploadFile) return Promise.reject(); return uploadFile(file); }, [uploadFile] ); const ref = React.useRef(null); useEffect(() => { const el = ref.current; const handleMouseEnter = () => { setIsHover(true); }; const handleMouseLeave = () => { setIsHover(false); }; if (el) { el.addEventListener('mouseenter', handleMouseEnter); el.addEventListener('mouseleave', handleMouseLeave); } return () => { if (el) { el.removeEventListener('mouseenter', handleMouseEnter); el.removeEventListener('mouseleave', handleMouseLeave); } }; }, []); return (
{cover && ( )}
{!readOnly && ( { void handleUpdateCover({ type: CoverType.BuildInImage, value: '1', }); }} maxWidth={maxWidth} onUploadFile={onUploadFile} /> )}

{icon?.value ? ( { void handleUpdateIcon({ ty: ViewIconType.Emoji, value: '', }); }} onSelectIcon={(icon) => { if (icon.ty === ViewIconType.Icon) { void handleUpdateIcon({ ty: ViewIconType.Icon, value: JSON.stringify({ color: icon.color, groupName: icon.value.split('/')[0], iconName: icon.value.split('/')[1], }), }); return; } void handleUpdateIcon(icon); }} onUploadFile={onUploadFile} >
) : null} {!readOnly && viewId ? ( ) : (
{name}
)}

); } export default ViewMetaPreview;