Add <GlobalPreviewDrawer> component

This commit is contained in:
Oliver Walters 2026-06-08 04:36:16 +00:00
parent 345fe1d67e
commit 8b7b00b7cb
4 changed files with 100 additions and 0 deletions

View File

@ -29,6 +29,7 @@ import {
type PluginUIFeature,
PluginUIFeatureType
} from '../plugins/PluginUIFeature';
import GlobalPreviewDrawer from '../previews/GlobalPreviewDrawer';
import { Footer } from './Footer';
import { Header } from './Header';
@ -146,6 +147,7 @@ export default function LayoutComponent() {
)}
</Flex>
<GlobalImporterDrawer />
<GlobalPreviewDrawer />
</>
</ProtectedRoute>
);

View File

@ -0,0 +1,22 @@
import { usePreviewDrawerState } from '../../states/PreviewDrawerState';
import PreviewDrawer from './PreviewDrawer';
export default function GlobalPreviewDrawer() {
const isOpen = usePreviewDrawerState((state) => state.isOpen);
const modelType = usePreviewDrawerState((state) => state.modelType);
const instance = usePreviewDrawerState((state) => state.instance);
const closePreview = usePreviewDrawerState((state) => state.closePreview);
if (!isOpen || instance === null) {
return null;
}
return (
<PreviewDrawer
modelType={modelType}
instance={instance}
opened={isOpen}
onClose={closePreview}
/>
);
}

View File

@ -0,0 +1,39 @@
import { t } from '@lingui/core/macro';
import { Drawer, Stack, Text } from '@mantine/core';
import { StylishText } from '@lib/components/StylishText';
import type { ModelType } from '@lib/index';
import { getModelInfo } from '../render/ModelType';
export default function PreviewDrawer({
modelType,
instance,
opened,
onClose
}: Readonly<{
modelType?: ModelType;
instance?: any;
opened: boolean;
onClose: () => void;
}>) {
const modelInfo = getModelInfo(instance.model);
return (
<Drawer
position='right'
size='lg'
title={
<StylishText size='lg'>
TODO - implement actual preview content
</StylishText>
}
opened={opened}
onClose={onClose}
withCloseButton
>
<Stack gap='xs'>
<Text c='dimmed'>{t`Preview for ${modelInfo.label} #${instance.pk}`}</Text>
</Stack>
</Drawer>
);
}

View File

@ -0,0 +1,37 @@
import type { ModelType } from '@lib/enums/ModelType';
import { create } from 'zustand';
interface PreviewDrawerStateProps {
isOpen: boolean;
modelType?: ModelType;
instance?: any;
openPreview: (modelType: ModelType, instance: any) => void;
closePreview: () => void;
}
export const usePreviewDrawerState = create<PreviewDrawerStateProps>()(
(set) => ({
isOpen: false,
instance: null,
openPreview: (modelType: ModelType, instance: any) => {
set({ modelType, instance, isOpen: true });
},
closePreview: () => {
set({ modelType: undefined, instance: null, isOpen: false });
}
})
);
export function openGlobalPreview(modelType: ModelType, instance: any) {
usePreviewDrawerState.getState().openPreview(modelType, instance);
}
export function closeGlobalPreview() {
usePreviewDrawerState.getState().closePreview();
}
export function getGlobalPreviewState() {
return usePreviewDrawerState.getState();
}