import React, { useState, useCallback } from 'react'; import Toolbar from './components/Toolbar'; import CanvasComponent from './components/CanvasComponent'; import AiEditModal from './components/AiEditModal'; import ZoomSlider from './components/ZoomSlider'; import SettingsPanel from './components/SettingsPanel'; import ConfirmModal from './components/ConfirmModal'; import { DEFAULT_AI_API_ENDPOINT } from './constants'; // Custom Hooks import { useToasts } from './hooks/useToasts'; import { useCanvasHistory } from './hooks/useCanvasHistory'; import { useAiFeatures, AiImageQuality, AiDimensionsMode } from './hooks/useAiFeatures'; import { useDrawingTools } from './hooks/useDrawingTools'; import { useFullscreen } from './hooks/useFullscreen'; import { useConfirmModal } from './hooks/useConfirmModal'; import { useCanvasFileUtils } from './hooks/useCanvasFileUtils'; const App: React.FC = () => { // Core UI States const [zoomLevel, setZoomLevel] = useState(0.5); const [showSettingsPanel, setShowSettingsPanel] = useState(false); // Settings specific states const [showZoomSlider, setShowZoomSlider] = useState(true); const [aiImageQuality, setAiImageQuality] = useState('medium'); const [aiApiEndpoint, setAiApiEndpoint] = useState(DEFAULT_AI_API_ENDPOINT); const [aiDimensionsMode, setAiDimensionsMode] = useState('match_canvas'); // Custom Hooks Instantiation const { toasts, showToast } = useToasts(); const { historyStack, currentHistoryIndex, canvasWidth, canvasHeight, isLoading: isCanvasLoading, currentDataURL, handleDrawEnd, handleUndo, handleRedo, updateCanvasState, } = useCanvasHistory(); const { penColor, setPenColor, penSize, setPenSize, isEraserMode, toggleEraserMode, effectivePenColor, } = useDrawingTools(); const { isFullscreenActive, toggleFullscreen } = useFullscreen(showToast); const { confirmModalInfo, requestConfirmation, closeConfirmModal } = useConfirmModal(); const { handleLoadImageFile, handleExportImage, handleClearCanvas, handleCanvasSizeChange, } = useCanvasFileUtils({ canvasState: { currentDataURL, canvasWidth, canvasHeight }, historyActions: { updateCanvasState }, uiActions: { showToast, setZoomLevel }, confirmModalActions: { requestConfirmation }, }); const { isMagicUploading, showAiEditModal, aiPrompt, isGeneratingAiImage, sharedImageUrlForAi, aiEditError, isAskingAi, askUrl, handleMagicUpload, handleGenerateAiImage, handleAskAi, handleCancelAiEdit, setAiPrompt, clearAskUrl, } = useAiFeatures({ currentDataURL, showToast, updateCanvasState, setZoomLevel, aiImageQuality, aiApiEndpoint, aiDimensionsMode, currentCanvasWidth: canvasWidth, // Pass current canvas dimensions currentCanvasHeight: canvasHeight, // Pass current canvas dimensions }); const handlePromptChange = (newPrompt: string) => { setAiPrompt(newPrompt); // Clear the previous "Ask" response when the user types a new prompt if (askUrl !== null) { clearAskUrl(); } }; // Simple UI Toggles const handleToggleSettingsPanel = () => setShowSettingsPanel(prev => !prev); const canShare = !!currentDataURL; // Loading State if (isCanvasLoading) { return (

Loading Your Canvas...

Getting things ready!

); } // Main App Render return (
0} onRedo={handleRedo} canRedo={currentHistoryIndex < historyStack.length - 1 && historyStack.length > 0} onLoadImage={handleLoadImageFile} onExportImage={handleExportImage} onClearCanvas={handleClearCanvas} isEraserMode={isEraserMode} onToggleEraser={toggleEraserMode} onMagicUpload={handleMagicUpload} isMagicUploading={isMagicUploading} canShare={canShare} onToggleSettings={handleToggleSettingsPanel} />
{currentDataURL ? ( ) : (

Initializing Canvas...

)}
{showAiEditModal && sharedImageUrlForAi && ( )} {showZoomSlider && ( )} {showSettingsPanel && ( )} {confirmModalInfo.isOpen && ( )}
{toasts.map(toast => (
{toast.message}
))}
); }; export default App;