import { ActionIcon, Box, Paper } from '@mantine/core'; import { Minus } from 'lucide-react'; import { type MouseEvent, useEffect, useRef, useState } from 'react'; import { NOTEPAD_MIN_HEIGHT, NOTEPAD_MIN_WIDTH } from '@/constants/notepad'; import { useNotepadStore } from '@/stores/notepad'; import { usePreferencesStore } from '@/stores/preferences'; import { CloseConfirmModal } from './CloseConfirmModal.tsx'; import { NotepadEditor } from './Editor.tsx'; import { NotepadTabs } from './Tabs.tsx'; export const NotepadContainer = () => { const { position, setPosition, tabs, activeTabId, addTab, removeTab, isLoaded, isVisible, setVisible, } = useNotepadStore(); const { resolvedColorScheme } = usePreferencesStore(); const containerRef = useRef(null); const [resizeDirection, setResizeDirection] = useState(null); const [confirmCloseModal, setConfirmCloseModal] = useState<{ isOpen: boolean; title: string; }>({ isOpen: false, title: '', }); const activeTab = tabs.find((tab) => tab.title === activeTabId); const handleCreateNewTab = async () => { const newTab = await window.electronAPI.notepad.createNewTab(); addTab(newTab); }; const handleTabCloseRequest = (title: string) => { const tab = tabs.find((t) => t.title === title); if (!tab) return; if (tab.content.trim().length > 0) { setConfirmCloseModal({ isOpen: true, title, }); } else { removeTab(title); } }; const handleConfirmClose = () => { removeTab(confirmCloseModal.title); setConfirmCloseModal({ isOpen: false, title: '' }); }; const handleCancelClose = () => { setConfirmCloseModal({ isOpen: false, title: '' }); }; const handleResizeStart = (direction: string) => (e: MouseEvent) => { e.stopPropagation(); setResizeDirection(direction); }; useEffect(() => { const handleMouseMove = (e: globalThis.MouseEvent) => { if (resizeDirection) { const rect = containerRef.current?.getBoundingClientRect(); if (!rect) return; let newWidth = position.width; let newHeight = position.height; if (resizeDirection.includes('right')) { newWidth = Math.max(NOTEPAD_MIN_WIDTH, e.clientX - rect.left); } if (resizeDirection.includes('top')) { newHeight = Math.max(NOTEPAD_MIN_HEIGHT, window.innerHeight - e.clientY - 5); } setPosition({ ...position, width: newWidth, height: newHeight, }); } }; const handleMouseUp = () => { setResizeDirection(null); }; if (resizeDirection) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; } }, [resizeDirection, position, setPosition]); if (!isLoaded || !isVisible) return null; return ( {resizeDirection && ( )} setVisible(false)}> {activeTab && } ); };