feat(renderer): mount UpdateBanner, FirstRunWizard, and CrashReportModal

This commit is contained in:
2026-06-08 06:43:40 +05:30
parent 691b00a2b8
commit 9b899b5205
3 changed files with 15 additions and 1 deletions
+4
View File
@@ -4,6 +4,8 @@ import { ModalLayer } from './components/modals/ModalLayer';
import { Toaster } from './components/ui/sonner'; import { Toaster } from './components/ui/sonner';
import { ReplPanel } from './components/tools/ReplPanel'; import { ReplPanel } from './components/tools/ReplPanel';
import { PrintPreview } from './components/tools/PrintPreview'; import { PrintPreview } from './components/tools/PrintPreview';
import { UpdateBanner } from './components/UpdateBanner';
import { FirstRunWizard } from './components/FirstRunWizard';
import { useWelcomeTrigger } from './hooks/use-welcome-trigger'; import { useWelcomeTrigger } from './hooks/use-welcome-trigger';
function App() { function App() {
@@ -21,6 +23,8 @@ function App() {
<AppShell /> <AppShell />
<ModalLayer /> <ModalLayer />
<Toaster /> <Toaster />
<UpdateBanner />
<FirstRunWizard />
<ReplPanel /> <ReplPanel />
{printOpen && <PrintPreview onClose={() => setPrintOpen(false)} />} {printOpen && <PrintPreview onClose={() => setPrintOpen(false)} />}
</> </>
@@ -2,6 +2,7 @@ import { useAppStore } from '@/stores/app-store';
import { AboutDialog } from './AboutDialog'; import { AboutDialog } from './AboutDialog';
import { AsciiGeneratorDialog } from './AsciiGeneratorDialog'; import { AsciiGeneratorDialog } from './AsciiGeneratorDialog';
import { ConfirmDialog } from './ConfirmDialog'; import { ConfirmDialog } from './ConfirmDialog';
import { CrashReportModal } from './CrashReportModal';
import { ExportBatchDialog } from './ExportBatchDialog'; import { ExportBatchDialog } from './ExportBatchDialog';
import { ExportDocxDialog } from './ExportDocxDialog'; import { ExportDocxDialog } from './ExportDocxDialog';
import { ExportHtmlDialog } from './ExportHtmlDialog'; import { ExportHtmlDialog } from './ExportHtmlDialog';
@@ -41,5 +42,7 @@ export function ModalLayer() {
return <TableGeneratorDialog />; return <TableGeneratorDialog />;
case 'find-in-files': case 'find-in-files':
return <FindInFilesDialog />; return <FindInFilesDialog />;
case 'crashReports':
return <CrashReportModal onClose={useAppStore.getState().closeModal} />;
} }
} }
+8 -1
View File
@@ -30,7 +30,8 @@ export type ModalState =
| { kind: 'export-word'; props: { sourcePath: string } } | { kind: 'export-word'; props: { sourcePath: string } }
| { kind: 'ascii-generator' } | { kind: 'ascii-generator' }
| { kind: 'table-generator' } | { kind: 'table-generator' }
| { kind: 'find-in-files' }; | { kind: 'find-in-files' }
| { kind: 'crashReports' };
export type ModalKind = ModalState['kind']; export type ModalKind = ModalState['kind'];
@@ -40,6 +41,7 @@ interface AppState {
zenMode: boolean; zenMode: boolean;
paneSizes: PaneSizes; paneSizes: PaneSizes;
modal: ModalState; modal: ModalState;
firstRun: boolean;
toggleSidebar: () => void; toggleSidebar: () => void;
togglePreview: () => void; togglePreview: () => void;
setZenMode: (value: boolean) => void; setZenMode: (value: boolean) => void;
@@ -49,6 +51,8 @@ interface AppState {
...args: Extract<ModalState, { kind: K }> extends { props: infer P } ? [props?: P] : [] ...args: Extract<ModalState, { kind: K }> extends { props: infer P } ? [props?: P] : []
) => void; ) => void;
closeModal: () => void; closeModal: () => void;
setFirstRun: (value: boolean) => void;
newBuffer: (content?: string) => void;
} }
export const useAppStore = create<AppState>()( export const useAppStore = create<AppState>()(
@@ -59,6 +63,7 @@ export const useAppStore = create<AppState>()(
zenMode: false, zenMode: false,
paneSizes: { sidebar: 20, editor: 50, preview: 30 }, paneSizes: { sidebar: 20, editor: 50, preview: 30 },
modal: { kind: null }, modal: { kind: null },
firstRun: true,
toggleSidebar: () => set((s) => ({ sidebarVisible: !s.sidebarVisible })), toggleSidebar: () => set((s) => ({ sidebarVisible: !s.sidebarVisible })),
togglePreview: () => set((s) => ({ previewVisible: !s.previewVisible })), togglePreview: () => set((s) => ({ previewVisible: !s.previewVisible })),
setZenMode: (value) => set({ zenMode: value }), setZenMode: (value) => set({ zenMode: value }),
@@ -69,6 +74,8 @@ export const useAppStore = create<AppState>()(
return { modal: candidate }; return { modal: candidate };
}), }),
closeModal: () => set({ modal: { kind: null } }), closeModal: () => set({ modal: { kind: null } }),
setFirstRun: (value) => set({ firstRun: value }),
newBuffer: (_content?: string) => set({ firstRun: false }),
}), }),
{ {
name: 'mc-app-store', name: 'mc-app-store',