mirror of
https://github.com/knadh/listmonk.git
synced 2025-10-08 22:37:22 +08:00
114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
import React from 'react';
|
|
|
|
import { MonitorOutlined, PhoneIphoneOutlined } from '@mui/icons-material';
|
|
import { Box, Stack, SxProps, ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material';
|
|
import { Reader } from '@usewaypoint/email-builder';
|
|
|
|
import EditorBlock from '../../documents/editor/EditorBlock';
|
|
import {
|
|
setSelectedScreenSize,
|
|
useDocument,
|
|
useSelectedMainTab,
|
|
useSelectedScreenSize,
|
|
} from '../../documents/editor/EditorContext';
|
|
import ToggleInspectorPanelButton from '../InspectorDrawer/ToggleInspectorPanelButton';
|
|
|
|
import DownloadJson from './DownloadJson';
|
|
import HtmlPanel from './HtmlPanel';
|
|
import ImportJson from './ImportJson';
|
|
import JsonPanel from './JsonPanel';
|
|
import MainTabsGroup from './MainTabsGroup';
|
|
|
|
export default function TemplatePanel() {
|
|
const document = useDocument();
|
|
const selectedMainTab = useSelectedMainTab();
|
|
const selectedScreenSize = useSelectedScreenSize();
|
|
|
|
let mainBoxSx: SxProps = {
|
|
height: '100%',
|
|
};
|
|
if (selectedScreenSize === 'mobile') {
|
|
mainBoxSx = {
|
|
...mainBoxSx,
|
|
margin: '32px auto',
|
|
width: 370,
|
|
height: 800,
|
|
boxShadow:
|
|
'rgba(33, 36, 67, 0.04) 0px 10px 20px, rgba(33, 36, 67, 0.04) 0px 2px 6px, rgba(33, 36, 67, 0.04) 0px 0px 1px',
|
|
};
|
|
}
|
|
|
|
const handleScreenSizeChange = (_: unknown, value: unknown) => {
|
|
switch (value) {
|
|
case 'mobile':
|
|
case 'desktop':
|
|
setSelectedScreenSize(value);
|
|
return;
|
|
default:
|
|
setSelectedScreenSize('desktop');
|
|
}
|
|
};
|
|
|
|
const renderMainPanel = () => {
|
|
switch (selectedMainTab) {
|
|
case 'editor':
|
|
return (
|
|
<Box sx={mainBoxSx}>
|
|
<EditorBlock id="root" />
|
|
</Box>
|
|
);
|
|
case 'preview':
|
|
return (
|
|
<Box sx={mainBoxSx}>
|
|
<Reader document={document} rootBlockId="root" />
|
|
</Box>
|
|
);
|
|
case 'html':
|
|
return <HtmlPanel />;
|
|
case 'json':
|
|
return <JsonPanel />;
|
|
}
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<Stack
|
|
sx={{
|
|
height: 49,
|
|
borderBottom: 1,
|
|
borderColor: 'divider',
|
|
backgroundColor: 'white',
|
|
top: 0,
|
|
px: 1,
|
|
}}
|
|
direction="row"
|
|
justifyContent="space-between"
|
|
alignItems="center"
|
|
>
|
|
<Stack px={2} direction="row" gap={2} width="100%" justifyContent="space-between" alignItems="center">
|
|
<Stack direction="row" spacing={2}>
|
|
<MainTabsGroup />
|
|
</Stack>
|
|
<Stack direction="row" spacing={2}>
|
|
<DownloadJson />
|
|
<ImportJson />
|
|
<ToggleButtonGroup value={selectedScreenSize} exclusive size="small" onChange={handleScreenSizeChange}>
|
|
<ToggleButton value="desktop">
|
|
<Tooltip title="Desktop view">
|
|
<MonitorOutlined fontSize="small" />
|
|
</Tooltip>
|
|
</ToggleButton>
|
|
<ToggleButton value="mobile">
|
|
<Tooltip title="Mobile view">
|
|
<PhoneIphoneOutlined fontSize="small" />
|
|
</Tooltip>
|
|
</ToggleButton>
|
|
</ToggleButtonGroup>
|
|
</Stack>
|
|
</Stack>
|
|
<ToggleInspectorPanelButton />
|
|
</Stack>
|
|
<Box sx={{ height: 'calc(100vh - 49px)', overflow: 'auto', minWidth: 370 }}>{renderMainPanel()}</Box>
|
|
</>
|
|
);
|
|
}
|