import styled from '@emotion/styled'; import { AddBlock, BackIcon, Builder, BuilderConfig, BuilderHeader, Contact, DesignMode, DeviceSwitcher, DraggableElementsV2, EmptyBuilderMobile, ExpireLicenseModal, InstructionDocument, LoadingBuilder, MENU_ITEMS, PageInfo, RootEditor, Sidebar, SidebarItem, StyleMenu, TextButton, ReportMenu, } from '@tempi/editor-site'; import { Helmet } from 'react-helmet'; import { isMobileOnly } from 'react-device-detect'; import React, { useState } from 'react'; import { PageSettingModal } from './PageSettingModal'; import { PopupSelection } from 'modules/popup'; import { useCustomComponent } from 'hooks'; import { allElementsExclude } from 'constants/elements'; import { PopupMenu } from 'modules/sidebar/menu/PopupMenu'; import { ContactBubbleMenu } from 'modules/sidebar/menu/ContactBubble'; import { SettingsFilled } from '@fluentui/react-icons'; import { useLandingPage } from '../hooks/useLandingPage'; import { PagePreview } from './PagePreview'; import { Dropdown, Spin, Switch } from 'antd'; import { PrevNext } from '@tempi/core-editor'; import { useTracking } from 'hooks/useTracking'; import { PublishMenu } from './PublishMenu'; import { t } from '../../../i18n'; import { SinglePageType, SINGLE_PAGE_EDITOR_PROPS } from '../constant'; const { isGlobalWebsite, flagPB4525 } = window?.config || {}; const excludeComponents = isGlobalWebsite ? [MENU_ITEMS.PRODUCT_LIST, MENU_ITEMS.EXAM_SCORE, MENU_ITEMS.LEAD_FORM] : []; export interface PageEditorInterface { updatePageService: (id: any, body: any) => Promise; getPageService: ( id: any, params?: { device: any; }, ) => Promise; children?: React.ReactElement; singlePageType: SinglePageType; } export const PageEditor: React.FC = ({ updatePageService, getPageService, singlePageType, children, }) => { const { metaTitleDefault, publishPagePath, allowPublishedPage, enableBottomMenu, enableContactBubbleSetting, enableReportMenu, pageSettingProps, deviceSwitcherProps, } = SINGLE_PAGE_EDITOR_PROPS[singlePageType]; const [isEditor, setIsEditor] = useState(true); const { customComponents } = useCustomComponent(); const { isDisabledEditor, isValidatingLicense, loadingInit: loadingGetPage, page, device, onChangeDevice, onSavePage, allowAutoSave, setAllowAutoSave, loading, getPageContent, visiblePageSettingModal, setVisiblePageSettingModal, designMode, onChangeDesignMode, } = useLandingPage({ updatePageService, getPageService }); const { getAttrTracking } = useTracking(); const onPreview = () => { setIsEditor(false); }; const deviceSwitcherMenu = ( ); const saveMenu = ( setAllowAutoSave(!allowAutoSave)} /> ), }, ], }} placement="bottom" disabled={isDisabledEditor} > onSavePage()} loading={loading} > {t('Lưu')} ); const previewMenu = ( {t('Xem trước')} ); const publishMenu = allowPublishedPage ? [ , ] : []; const rightMenuPreview = [deviceSwitcherMenu, saveMenu, ...publishMenu]; const rightMenu = [ deviceSwitcherMenu, , saveMenu, previewMenu, ...publishMenu, ]; const builderConfig: BuilderConfig = { builderHeader: ( , onSavePage({ name: newName })} url={page?.canonical} />, ]} rightHeader={rightMenu.filter(Boolean)} /> ), content: getPageContent(), builderSidebar: ( , , , , ...(enableContactBubbleSetting ? [] : []), ...(enableReportMenu && flagPB4525 ? [] : []), ]} bottomMenu={ enableBottomMenu ? [ , , setVisiblePageSettingModal(true)} trackingContentName={'SettingBtn'} active={visiblePageSettingModal} tooltip={t('Cài đặt trang')} disabled={isDisabledEditor} > , ] : [] } /> ), RootEditor, }; return ( <> {page?.name || metaTitleDefault} {!isMobileOnly && ( {isEditor ? ( ) : ( setIsEditor(true)} rightHeader={rightMenuPreview.filter(Boolean)} content={getPageContent()} page={page as any} /> )} onChangeDesignMode(designMode) } onSavePage={onSavePage} callbackCancel={() => onChangeDesignMode(page?.designMode)} {...pageSettingProps} /> )} {isMobileOnly && } {children} ); }; const Wrapper = styled.div` height: 100vh; `; const SaveButton = styled(TextButton)` display: flex; align-items: center; gap: 4px; &.disabled { cursor: default; color: var(--text-secondary-color) !important; } `;