@turnix-co/konva-editor 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +558 -0
- package/dist/index.d.ts +635 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../store/hooks/index.ts","../../store/slices/canvasSlice.ts","../../store/hooks/useDirectDrawing.ts","../../components/canvas/DirectDrawingCanvas.tsx","../../store/hooks/useImageHandling.ts","../../store/hooks/useMcqHandling.ts","../../store/hooks/useTrueFalseHandling.ts","../../store/hooks/useVideoHandling.ts","../../store/hooks/useShapeHandling.ts","../../store/hooks/useTextHandling.ts","../../store/hooks/useShortAnswerHandling.ts","../../store/hooks/useLongAnswerHandling.tsx","../../store/hooks/useFlashcardHandling.ts","../../store/hooks/usePhotoFrameHandling.ts","../../store/hooks/UseTransformer.ts","../../store/hooks/useSlideThumbnail.ts","../../utils/perfectFreehand.ts","../../store/hooks/useImageDrawing.ts","../../components/layers/ImageLayer.tsx","../../components/elements/VideoPlayer.tsx","../../components/elements/VideoThumbnail.tsx","../../components/layers/VideoLayer.tsx","../../components/layers/ShapeLayer.tsx","../../components/layers/TextLayer.tsx","../../components/elements/FlashcardRenderer.tsx","../../components/layers/FlashcardLayer.tsx","../../store/hooks/usePhotoFrameDrawing.ts","../../components/elements/PhotoFrameRenderer.tsx","../../components/layers/PhotoFrameLayer.tsx","../../components/ui/ContextMenu.tsx","../../components/ui/Submenu.tsx","../../components/ui/InputDialog.tsx","../../components/ui/ColorPickerDialog.tsx","../../components/ui/CropDialog.tsx","../../components/ui/ScreenRecorder.tsx","../../components/ui/ObjectAudioRecorder.tsx","../../components/ui/AudioIndicator.tsx","../../components/ui/LayersPanel.tsx","../../components/elements/MultipleChoice.tsx","../../components/elements/MultipleChoiceDragAndDrop.tsx","../../components/layers/MultipleChoiceLayer.tsx","../../components/elements/TrueFalse.tsx","../../components/elements/TrueFalseDragAndDrop.tsx","../../components/layers/TrueFalseLayer.tsx","../../node_modules/@tanstack/store/src/scheduler.ts","../../node_modules/@tanstack/store/src/types.ts","../../node_modules/@tanstack/store/src/store.ts","../../node_modules/@tanstack/store/src/derived.ts","../../node_modules/@tanstack/pacer/src/utils.ts","../../node_modules/@tanstack/devtools-event-client/src/plugin.ts","../../node_modules/@tanstack/pacer/src/event-client.ts","../../node_modules/@tanstack/pacer/src/throttler.ts","../../node_modules/@tanstack/form-core/src/utils.ts","../../node_modules/@tanstack/form-core/src/ValidationLogic.ts","../../node_modules/@tanstack/form-core/src/standardSchemaValidator.ts","../../node_modules/@tanstack/form-core/src/metaHelper.ts","../../node_modules/@tanstack/form-core/src/EventClient.ts","../../node_modules/@tanstack/form-core/src/FormApi.ts","../../node_modules/@tanstack/form-core/src/FieldApi.ts","../../node_modules/@tanstack/react-store/src/index.ts","../../node_modules/@tanstack/react-form/src/useIsomorphicLayoutEffect.ts","../../node_modules/@tanstack/react-form/src/useField.tsx","../../node_modules/@tanstack/react-form/src/useForm.tsx","../../components/elements/McqForm.tsx","../../components/ui/FloatingTextToolbar.tsx","../../components/ui/TextEditingArea.tsx","../../components/elements/ShortAnswer.tsx","../../components/layers/ShortAnswerLayer.tsx","../../store/hooks/useFillInTheBlanksHandling.ts","../../components/elements/FillInTheBlanks.tsx","../../components/layers/FillInTheBlanksLayer.tsx","../../components/elements/LongAnswer.tsx","../../components/layers/LongAnswerLayer.tsx","../../components/canvas/Canvas.tsx","../../utils/videoStorage.ts","../../store/slices/toolbarSlice.ts","../../components/ui/CameraRecorder.tsx","../../components/ui/FlashcardConfigDialog.tsx","../../components/Toolbar.tsx","../../node_modules/shared/src/utils.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/circle-check-big.ts","../../node_modules/lucide-react/src/icons/circle-x.ts","../../node_modules/lucide-react/src/icons/copy.ts","../../node_modules/lucide-react/src/icons/plus.ts","../../node_modules/lucide-react/src/icons/trash-2.ts","../../node_modules/lucide-react/src/icons/upload.ts","../../components/slides/SlideThumbnail.tsx","../../components/slides/SlideNavigation.tsx","../../components/PublishButton.tsx","../../components/ui/EditorRoot.tsx","../../utils/persistence.ts","../../store/middleware/persistenceMiddleware.ts","../../store/store.ts","../../utils/exportSlide.ts","../../store/hooks/useSlidesPersistence.ts"],"names":["useDispatch","useReduxDispatch","useSelector","selector","useReduxSelector","useAppDispatch","useAppSelector","MAX_SLIDES","createEmptySlide","name","initialSlide","initialState","canvasSlice","createSlice","state","newSlide","action","slideIndex","s","newIndex","originalSlide","slide","fromIndex","toIndex","movedSlide","lineWithTimestamp","line","l","lineIndex","duplicated","id","type","newTimestamp","image","img","video","vid","shape","shp","text","txt","flashcard","fc","photoFrame","pf","mcq","mc","trueFalse","tf","shortAnswer","sa","longAnswer","la","fillInTheBlanks","fib","ln","imageWithTimestamp","index","videoWithTimestamp","v","shapeWithTimestamp","newMultipleChoice","lastChoice","multipleChoice","newTrueFalse","newShortAnswer","lastAnswer","newLongAnswer","newFillInTheBlank","lastBlank","fillInTheBlank","item","link","altText","audioData","textWithTimestamp","t","flashcardWithTimestamp","f","availableIndices","_","i","photoFrameWithTimestamp","p","frame","slideHistory","currentSlide","previous","error","next","clonedSlide","addSlide","deleteSlide","duplicateSlide","setCurrentSlide","updateSlideThumbnail","setBackgroundColor","reorderSlides","loadSlides","addLine","removeLine","addImage","updateImage","deleteImage","duplicateImage","addVideo","updateVideo","deleteVideo","duplicateVideo","toggleVideoPlaying","addShape","updateShape","duplicateShape","deleteShape","addText","updateText","deleteText","duplicateText","addFlashcard","updateFlashcard","deleteFlashcard","duplicateFlashcard","editFlashcard","nextFlashcard","previousFlashcard","addPhotoFrame","updatePhotoFrame","deletePhotoFrame","duplicatePhotoFrame","toggleImageDrawingMode","addImageAnnotation","updateImageAnnotation","clearImageAnnotations","togglePhotoFrameDrawingMode","addPhotoFrameAnnotation","updatePhotoFrameAnnotation","clearPhotoFrameAnnotations","addMultipleChoice","updateMultipleChoice","editMultipleChoice","deleteMultipleChoice","duplicateMultipleChoice","addTrueFalse","updateTrueFalse","deleteTrueFalse","duplicateTrueFalse","addShortAnswer","updateShortAnswer","deleteShortAnswer","duplicateShortAnswer","addLongAnswer","updateLongAnswer","deleteLongAnswer","duplicateLongAnswer","addFillInTheBlanks","updateFillInTheBlanks","deleteFillInTheBlanks","duplicateFillInTheBlanks","setShowMcqForm","setShowFlashcardForm","setActivityType","setEditingActivity","bringToFront","sendToBack","toggleLock","setLink","setAltText","setAudioData","updateLastLine","finalizeDrawing","setLines","updateLinePosition","updateLineTransform","deleteLineById","duplicateLine","updateElementOrder","clearCanvas","undo","redo","saveToHistory","toggleSketchMode","setSketchMode","setEditingTextId","selectCurrentSlideId","selectCurrentSlide","currentSlideId","selectAllSlides","selectCanAddSlide","selectSlideById","slideId","canvasSlice_default","useDirectDrawing","onDrawEnd","dispatch","canvasRef","useRef","hasStartedDrawing","tool","color","strokeWidth","isSketchMode","lines","setCanvasRef","useCallback","ref","startDrawing","pos","draw","stopDrawing","DirectDrawingCanvas","forwardRef","width","height","style","isDrawingRef","pointsRef","lastPointRef","toolRef","colorRef","strokeWidthRef","isSketchModeRef","useEffect","canvas","ctx","redrawLine","points","stroke","getStroke","useImperativeHandle","dx","dy","flatPoints","point","jsx","DirectDrawingCanvas_default","useImageHandling","onUpdate","images","imageRefs","loadedImagesRef","previousImageIdsRef","currentImageIds","cachedImage","getLoadedImage","handleDragEnd","e","node","imageId","handleImageTransformEnd","group","imageNode","scaleX","scaleY","rotation","currentWidth","currentHeight","newWidth","newHeight","useMcqHandling","mcqRefs","useMemo","handleMcqTransform","mcqId","useTrueFalseHandling","trueFalseRefs","handleTrueFalseTransform","trueFalseId","useVideoHandling","videos","videoRefs","handleVideoClick","videoId","handleVideoDragEnd","handleVideoTransformEnd","useShapeHandling","shapes","shapeRefs","loadedShapesRef","isDragging","setIsDragging","useState","handleShapeDragEnd","shapeId","handleShapeResizeEnd","shapeType","updates","ringScale","useTextHandling","updatePreview","textareaRef","texts","textRefs","editingTextId","editingValue","setEditingValue","fontScale","value","textNode","textarea","textareaWidth","textareaHeight","scale","stage","borderAndPadding","calculatedWidth","calculatedHeight","lineCount","fontSize","minHeightForLines","originalText","originalWidth","naturalWidth","naturalHeight","useShortAnswerHandling","shortAnswers","saRefs","handleShortAnswerDragEnd","saId","useLongAnswerHandling","longAnswers","handleLongAnswerDragEnd","laId","useFlashcardHandling","flashcards","flashcardRefs","src","imageKey","flashcardId","handleFlashcardTransformEnd","handleNext","handlePrevious","usePhotoFrameHandling","photoFrames","photoFrameRefs","cameraStreams","setCameraStreams","photoFrameId","handlePhotoFrameTransformEnd","currentFrame","startCamera","stream","prev","newMap","stopCamera","track","capturePhoto","videoElement","dataUrl","cameraStreamsRef","useTransformer","transformerRef","mcqConstraints","boundBoxFunc","oldBox","newBox","attachTransformer","selectedId","trueFalseRef","selectedNode","deselectTransformer","useDebouncedCallback","callback","delay","timeoutRef","args","useSlideThumbnail","stageRef","slideIdRef","generateThumbnail","dataURL","debouncedGenerateThumbnail","strokeToPoints","generateSmoothStroke","options","useImageDrawing","isDrawing","hasMovedWhileDrawing","currentLinePoints","activeLine","setActiveLine","annotations","isDrawingMode","imageWidth","imageHeight","normalizedX","normalizedY","lastPoint","newPoints","ImageWithDrawing","memo","loadedImage","onDragEnd","onTransform","onSelect","onContextMenu","shouldEnableDrawing","handleMouseDown","handleMouseMove","handleMouseUp","jsxs","Group","KonvaImage","konvaNode","handleContextMenuEvent","mousePos","imageRect","existingNode","pixelPoints","idx","pixelStrokeWidth","Line","ImageLayer","Fragment","VideoPlayer","x","y","isSelected","onTransformEnd","videoRef","Rect","Html","VideoPlayer_default","VideoThumbnail","onClick","nodeRef","thumbnailImage","setThumbnailImage","isDrawingTool","playButtonX","playButtonY","baseRadius","playButtonRadius","videoRect","Circle","RegularPolygon","VideoThumbnail_default","VideoLayer","onVideoClick","React","viewportWidth","viewportHeight","ShapeLayer","handleShapeDragStart","key","commonProps","Star","Ellipse","Ring","Wedge","Arrow","KonvaLine","Arc","TextLayer","onDoubleClick","isEditing","isBold","Text","mouseEvent","FlashcardRenderer","onNext","onPrevious","currentImage","setCurrentImage","cornerRadius","borderWidth","buttonSize","buttonRadius","margin","flashcardRect","FlashcardRenderer_default","FlashcardLayer","usePhotoFrameDrawing","frameId","frameWidth","frameHeight","PhotoFrameRenderer","onStartCamera","onCapture","cameraStream","capturedImage","setCapturedImage","liveImage","setLiveImage","animationFrameRef","liveImageRef","lastFrameTimeRef","FRAME_INTERVAL","handleGlobalMouseUp","handleGlobalTouchEnd","startCapture","captureFrame","timestamp","err","handleCaptureClick","transform","relativePos","displayImage","centerX","centerY","frameRect","KonvaText","PhotoFrameRenderer_default","PhotoFrameLayer","ContextMenu","onAction","onClose","menuRef","handleClickOutside","event","handleEscape","menuItems","ArrowUpIcon","Lock","LinkIcon","SpeakerHifiIcon","NotePencilIcon","Palette","ScissorsIcon","PencilSimple","CopySimple","Square","Chat","EyeIcon","Stack","Trash","handleItemClick","Submenu","items","InputDialog","title","label","placeholder","defaultValue","onSave","setValue","inputRef","handleSave","X","ColorPickerDialog","defaultColor","onConfirm","onCancel","setColor","dialogRef","handleSubmit","hslToHex","h","a","n","k","dialogContent","hue","hex","presetColor","createPortal","CropImage","imageSrc","onCrop","useImage","imageRef","cropRectRef","dimensions","initialCropArea","cropWidth","cropHeight","cropX","cropY","cropArea","setCropArea","handleTransformEnd","Stage","Layer","newX","newY","Transformer","CropDialog","cropData","setCropData","originalX","originalY","originalHeight","croppedImageData","Check","ScreenRecorder","onRecordingComplete","directDrawingCanvasRef","isRecording","setIsRecording","recordedBlob","setRecordedBlob","recordingTime","setRecordingTime","includeMicrophone","setIncludeMicrophone","mediaRecorderRef","chunksRef","timerRef","canvasStreamRef","canvasThumbnailRef","recordingCanvasRef","updateRecordingCanvasRef","startRecording","videoStream","audioStream","layers","layer","children","recordingCanvas","recordingCtx","updateRecordingCanvas","layerCanvas","directCanvas","resolve","videoTrack","frameCount","animate","audioError","tracks","combinedStream","mimeType","mediaRecorder","blob","stopRecording","downloadRecording","url","formatTime","seconds","mins","secs","Stop","Microphone","MicrophoneSlash","Record","Download","ObjectAudioRecorder","elementType","existingAudio","onDelete","audioBlob","setAudioBlob","isPlaying","setIsPlaying","audioRef","res","playAudio","audio","stopPlaying","reader","base64","handleDelete","Play","AudioIndicator","SpeakerSimpleSlash","SpeakerHigh","LayersPanel","selectedElementId","onSelectElement","allLayers","b","orderedLayers","setOrderedLayers","getIcon","iconClass","ImageIcon","VideoCamera","Shapes","TextT","Cards","FrameCorners","Question","handleMoveUp","layerAbove","handleMoveDown","layerBelow","handleReorder","newOrder","baseTimestamp","Reorder","DotsSixVertical","ArrowUp","ArrowDown","MultipleChoice","handleSelect","selectedOptions","setSelectedOptions","isChecked","setIsChecked","pressedButton","setPressedButton","groupRef","correctIndices","isMultipleAnswer","handleOptionClick","newSet","handleCheckWork","handleReset","isFullyCorrect","correctlySelected","isPartiallyCorrect","getFeedbackMessage","getFeedbackColor","optionHeight","optionGap","padding","questionTitleHeight","feedbackHeight","instructionHeight","buttonHeight","buttonTopMargin","optionsStartY","optionsHeight","totalHeight","reactEvent","option","isThisCorrect","yPos","borderColor","bgColor","MultipleChoice_default","white","MultipleChoiceDragAndDrop","isHovering","setIsHovering","droppedOptions","setDroppedOptions","isPressed","setIsPressed","resetKey","setResetKey","screenX","screenY","screenWidth","screenHeight","dropZoneX","dropZoneY","dropZoneWidth","dropZoneHeight","handleOptionDragMove","optionX","optionY","optionWidth","isOverDropZone","handleOptionDragEnd","isInDropZone","correctlyDropped","col","row","gap","isDropped","isCorrectOption","showFeedback","strokeColor","MultipleChoiceLayer","TrueFalse","selectedAnswer","setSelectedAnswer","correctAnswer","isCorrect","rect","TrueFalse_default","TrueFalseDragAndDrop","droppedAnswer","setDroppedAnswer","TrueFalseLayer","trueFalses","__storeToDerived","__derivedToStore","__depsThatHaveWrittenThisTick","__isFlushing","__batchDepth","__pendingUpdates","__initialBatchValues","__flush_internals","relatedVals","sorted","Derived","derived","stores","store","relatedLinkedDerivedVals","__notifyListeners","listener","__notifyDerivedListeners","__flush","prevState","derivedVals","batch","fn","pendingUpdateToFlush","isUpdaterFunction","updater","Store","unsub","_b","_a","_c","_Derived","prevDepVals","currDepVals","dep","depVals","shouldRecompute","lastSeenDepValues","cleanup","deps","relatedStores","isFunction","parseFunctionOrValue","createKey","_enabled","_pluginId","_eventTarget","_debug","_queuedEvents","_connected","_connectIntervalId","_connectEveryMs","_retryCount","_maxRetries","_onConnected","_connectFunction","EventClient","pluginId","debug","enabled","reconnectEveryMs","__privateAdd","__privateSet","__privateGet","__privateWrapper","eventTarget","eventName","detail","eventSuffix","payload","cb","handler","PacerEventClient","props","emitChange","pacerEventClient","getDefaultThrottlerState","defaultOptions","Throttler","initialOptions","_timeoutId","_setState","_getEnabled","_getWait","_execute","_clearTimeout","newOptions","newState","combinedState","isPending","now","timeSinceLastExecution","wait","_timeSinceLastExecution","timeoutDuration","lastArgs","lastExecutionTime","nextExecutionTime","throttle","functionalUpdate","input","getBy","obj","path","makePathArray","current","pathPart","setBy","_path","doSet","parent","prefix","deleteBy","doDelete","finalPath","remove","rest","reLineOfOnlyDigits","reDigitsBetweenDots","reStartWithDigitThenDot","reDotWithDigitsToEnd","reMultipleDots","intPrefix","intReplace","str","d","numStr","num","isNonEmptyArray","getSyncValidatorArray","cause","runValidation","validator","getAsyncValidatorArray","asyncDebounceMs","onBlurAsyncDebounceMs","onChangeAsyncDebounceMs","onDynamicAsyncDebounceMs","defaultDebounceMs","validatorCause","debounceMs","isGlobalFormValidationError","evaluate","objA","objB","keysA","keysB","determineFormLevelErrorSourceAndValue","newFormValidatorError","isPreviousErrorFromFormValidator","previousErrorValue","determineFieldLevelErrorSourceAndValue","formLevelError","fieldLevelError","mergeOpts","originalOpts","overrides","IDX","HEX","BUFFER","uuid","out","defaultValidationLogic","isAsync","onMountValidator","onChangeValidator","onBlurValidator","onSubmitValidator","onServerValidator","prefixSchemaToErrors","issues","formValue","schema","issue","issuePath","currentFormValue","pathSegment","segment","segmentAsNumber","transformFormIssues","schemaErrors","standardSchemaValidators","validationSource","result","isStandardSchemaValidator","defaultFieldMeta","metaHelper","formApi","handleArrayFieldMetaShift","field","mode","secondIndex","affectedFields","getAffectedFields","handleInsertMode","handleRemoveMode","handleSwapMode","handleMoveMode","getFieldPath","affectedFieldKeys","startIndex","endIndex","currentValue","fieldItems","fieldKey","updateIndex","direction","currIndex","shiftMeta","fields","nextFieldKey","nextFieldMeta","getEmptyFieldMeta","insertIndex","fromFields","fromKey","fromMeta","swappedKey","meta1","meta2","FormEventClient","formEventClient","getDefaultFormState","defaultState","FormApi","opts","cleanupFieldMetaDerived","cleanupStoreDerived","onMount","oldOptions","shouldUpdateReeval","val","shouldUpdateValues","shouldUpdateState","values","currentFieldMeta","fieldMetaBase","fieldValidationPromises","fieldInstance","lastIndex","fieldKeysToValidate","fieldsToValidate","nestedField","validates","hasErrored","currentValidationErrorMap","validateObj","rawError","formError","fieldErrors","normalizeError","errorMapKey","getErrorMapKey","fieldMeta","currentErrorMap","currentErrorMapSource","newErrorValue","newSource","submitErrKey","serverErrKey","promises","fieldErrorsFromFormValidators","controller","rawResolve","rawReject","fieldErrorsFromNormalizeError","results","fieldsErrorMap","fieldValidationResult","fieldError","newErrorMap","acc","dontUpdateMeta","dontRunListeners","dontValidate","fieldsToDelete","fieldStr","fieldValue","_d","start","index1","index2","prev1","prev2","fieldName","_prevVal","prevVal","prevBaseStore","currBaseStore","originalMetaCount","currBaseMeta","prevBaseMeta","prevFieldInfo","curFieldVal","isFieldValid","isFieldPristine","isDefaultValue","currFieldMeta","fieldMetaValues","isFieldsValidating","isFieldsValid","isTouched","isBlurred","shouldInvalidateOnMount","isDirty","isPristine","hasOnMountError","isValidating","errors","curr","isFormValid","isValid","submitInvalid","canSubmit","errorMap","transformArray","newObj","debouncedDevtoolState","submitMeta","old","submitMetaArg","done","meta","FieldApi","info","nameHasChanged","formDefault","aIndex","bIndex","linkedFields","onChangeListenTo","onBlurListenTo","errorFromForm","linkedFieldValidates","fieldValidates","validate","validateFieldFn","fieldValitateObj","formValidationResultPromise","asyncFormValidationResults","linkedField","validatesPromises","linkedPromises","validateFieldAsyncFn","formDebounceMs","fieldDebounceMs","useStore","useSyncExternalStoreWithSelector","shallow","getOwnKeys","useIsomorphicLayoutEffect","useLayoutEffect","useField","fieldApi","extendedApi","Field","fieldOptions","jsxToDisplay","LocalSubscribe","form","data","useForm","formId","useId","api","FieldInfo","McqForm","editElement","initialQuestionType","questionType","setQuestionType","trueFalseData","uuidv4","multipleChoiceData","shortAnswerData","fillInTheBlankData","longAnswerData","handleShowMcqForm","opt","handleOptionChange","handleAddOption","handleRemoveOption","newCorrectIndex","handleToggleCorrectAnswer","currentCorrectIndex","isEmpty","hasError","isSubmitting","McqForm_default","FloatingTextToolbar","position","handleFontSizeChange","delta","handleColorChange","handleFontWeightToggle","handleFontStyleToggle","handleTextDecorationToggle","handleFontFamilyChange","fontFamily","TextB","TextItalic","TextUnderline","TextEditingArea","onEditingChange","onFinish","localRef","textareaStyles","autoResize","tempSpan","maxWidth","lineWidth","el","length","ShortAnswer","handleTransform","userInput","setUserInput","submitted","setSubmitted","inputHeight","inputMargin","placeholderHeight","ShortAnswer_default","ShortAnswerLayer","shortAns","useFillInTheBlanksHandling","fibRefs","handleFillInTheBlanksDragEnd","fibId","FillInTheBlanks","warningHeight","FillInTheBlanks_default","FillInTheBlanksLayer","LongAnswer","textareaMargin","LongAnswerLayer","longAns","Canvas","onStageReady","onSelectionChange","onTextEditingReady","onDirectDrawingCanvasReady","editingActivity","showMcqForm","containerRef","setSelectedId","previewUrl","setPreviewUrl","setDimensions","contextMenu","setContextMenu","floatingToolbarPosition","setFloatingToolbarPosition","editingOverlayPosition","setEditingOverlayPosition","submenu","setSubmenu","dialog","setDialog","colorPickerDialog","setColorPickerDialog","cropDialog","setCropDialog","showScreenRecorder","setShowScreenRecorder","showObjectAudioRecorder","setShowObjectAudioRecorder","showLayersPanel","setShowLayersPanel","directDrawingRef","updateDimensions","resizeObserver","container","currentSlideIdRef","contentCountRef","isInitialMountRef","newCount","countChanged","drawingTool","drawingColor","drawingStrokeWidth","drawingIsSketchMode","lineRefs","handleMcqDragEnd","handleTrueFalseDragEnd","handleTextDragEnd","handleTextTransformEnd","handleTextDoubleClick","startEditing","handleEditingChange","finishEditing","reduxEditingTextId","handleFlashcardDragEnd","handleFlashcardNext","handleFlashcardPrevious","handlePhotoFrameDragEnd","isLocked","handleDeselect","transformer","textId","stageBox","textPosition","targetClass","clickedOnEmpty","clickedOnTransformer","clickedOnImage","clickedOnText","clickedOnGroup","clickedOnShape","clickedOnMultipleChoice","handleImageDragEnd","handleVideoClickWithSelection","handleContextMenu","elementId","handleEditActivity","activity","handleEditFlashcard","handleContextMenuAction","currentElement","currentAudioElement","currentShape","imageElement","cloneCount","responseLink","currentEl","handleCloseContextMenu","handleSubmenuAction","handleDialogSave","handleAudioSave","handleAudioDelete","handleCropConfirm","canvasElement","allElements","isEraser","isPenSketch","isEraserSketch","lineId","evt","selectedText","Canvas_default","VIDEO_DB_NAME","VIDEO_STORE_NAME","initVideoStorageDB","reject","request","db","saveVideoBlob","thumbnailDataUrl","entry","loadAllVideoBlobs","entries","videoMap","deleteVideoBlob","createVideoObjectURL","toolbarSlice","setTool","setPenColor","setStrokeWidth","setFontSize","setFontFamily","setFontStyle","setFontWeight","setTextDecoration","setTextColor","toolbarSlice_default","CameraRecorder","setCameraStream","isCameraReady","setIsCameraReady","cameraVideoRef","videoCameraStream","finalStream","MAX_IMAGES","FlashcardConfigDialog","editingFlashcard","setImages","order","setOrder","fileInputRef","handleFileChange","files","remainingSlots","fileArray","readers","file","dataUrls","handleDrop","filesToAdd","handleDragOver","handleDragLeave","handleRemoveImage","Warning","ArrowsDownUp","Shuffle","imgSrc","Toolbar","isOpenProp","onScreenRecord","onTextAdded","showToggleButton","editingFlashCard","showFlashcardForm","backgroundColor","isAnyRecordedVideoPlaying","fontStyle","fontWeight","textDecoration","textColor","showCameraRecorder","setShowCameraRecorder","internalIsOpen","setInternalIsOpen","isOpen","handleToggle","tools","Selection","Pen","Eraser","Triangle","Hexagon","Pizza","ArrowRight","LineSegment","Circuitry","handleImageUpload","aspectRatio","maxHeight","handleVideoUpload","objectUrl","timeout","seekTime","handleFlashcardConfirm","flashCardId","handleAddPhotoFrame","handleNewShape","shapeSpecificProps","newShape","handleToolSelect","toolName","handleClearCanvas","handleBackgroundColorChange","newColor","handleScreenRecordClick","handleCameraRecordClick","handleRecordingComplete","videoBlob","videoAspect","activityType","handleAddFlashcard","List","Video","Camera","ListChecksIcon","ToggleRight","Textbox","Article","ArrowUUpLeft","ArrowUDownRight","Toolbar_default","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","array","hasA11yProp","prop","defaultAttributes","Icon","size","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","CircleCheckBig","CircleX","Copy","Plus","Trash2","Upload","SlideThumbnail","isSingleSlide","onDuplicate","SlideNavigation","slides","canAddSlide","handleAddSlide","handleSelectSlide","handleDuplicateSlide","handleDeleteSlide","PublishButton","onPublish","isPublishing","setIsPublishing","progress","setProgress","setResult","handlePublish","response","prog","EditorRoot","DB_NAME","DB_VERSION","STORE_NAME","LOCALSTORAGE_KEY","initDB","saveToIndexedDB","clearRequest","addRequest","loadFromIndexedDB","backup","saveCurrentSlideId","loadCurrentSlideId","debounce","func","SAVE_TRIGGER_ACTIONS","IMMEDIATE_SAVE_ACTIONS","debouncedSave","immediateSave","isSaving","persistenceMiddleware","originalVideoId","originalVideo","duplicatedVideo","QueryClient","configureStore","getDefaultMiddleware","exportSlideAsImage","format","quality","pixelRatio","fileName","exportSlideAsBlob","getSlideDataURL","useSlidesPersistence","savedCurrentSlideId","videoBlobs","restoredSlides","restoredVideos","videoData","newObjectUrl","validSlideId"],"mappings":"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","file":"index.js","sourcesContent":["// Public API - All components and functions exposed to users\r\n\r\n// ============================================\r\n// KONVA RE-EXPORTS (For type compatibility)\r\n// ============================================\r\n// Re-export Konva so users don't need to install it separately for types\r\nexport { default as Konva } from 'konva';\r\nexport type { Stage as KonvaStage } from 'konva/lib/Stage';\r\n\r\n// ============================================\r\n// MAIN COMPONENTS (User-facing)\r\n// ============================================\r\nexport { default as Canvas, type CanvasProps } from '../../components/canvas/Canvas';\r\nexport { default as Toolbar, type ToolbarProps } from '../../components/Toolbar';\r\nexport { SlideNavigation } from '../../components/slides/SlideNavigation';\r\nexport { ScreenRecorder } from '../../components/ui/ScreenRecorder';\r\nexport { PublishButton } from '../../components/PublishButton';\r\nexport { EditorRoot, type EditorRootProps } from '../../components/ui/EditorRoot';\r\n\r\n// ============================================\r\n// REDUX STORE (Required for setup)\r\n// ============================================\r\nexport { store } from '../../store/store';\r\nexport type { RootState, AppDispatch } from '../../store/store';\r\n\r\n// Redux Provider (users need this to wrap their app)\r\nexport { Provider as ReduxProvider } from 'react-redux';\r\n\r\n// ============================================\r\n// REDUX ACTIONS (For advanced users)\r\n// ============================================\r\nexport {\r\n // Slide management\r\n addSlide,\r\n deleteSlide,\r\n setCurrentSlide,\r\n duplicateSlide,\r\n reorderSlides,\r\n setBackgroundColor,\r\n loadSlides,\r\n updateSlideThumbnail,\r\n\r\n // Image elements\r\n addImage,\r\n updateImage,\r\n deleteImage,\r\n duplicateImage,\r\n toggleImageDrawingMode,\r\n addImageAnnotation,\r\n updateImageAnnotation,\r\n clearImageAnnotations,\r\n\r\n // Video elements\r\n addVideo,\r\n updateVideo,\r\n deleteVideo,\r\n duplicateVideo,\r\n toggleVideoPlaying,\r\n\r\n // Text elements\r\n addText,\r\n updateText,\r\n deleteText,\r\n duplicateText,\r\n setEditingTextId,\r\n\r\n // Shape elements\r\n addShape,\r\n updateShape,\r\n deleteShape,\r\n duplicateShape,\r\n\r\n // Flashcard elements\r\n addFlashcard,\r\n updateFlashcard,\r\n deleteFlashcard,\r\n duplicateFlashcard,\r\n editFlashcard,\r\n nextFlashcard,\r\n previousFlashcard,\r\n\r\n // PhotoFrame elements\r\n addPhotoFrame,\r\n updatePhotoFrame,\r\n deletePhotoFrame,\r\n duplicatePhotoFrame,\r\n togglePhotoFrameDrawingMode,\r\n addPhotoFrameAnnotation,\r\n updatePhotoFrameAnnotation,\r\n clearPhotoFrameAnnotations,\r\n\r\n // Multiple Choice elements\r\n addMultipleChoice,\r\n updateMultipleChoice,\r\n editMultipleChoice,\r\n deleteMultipleChoice,\r\n duplicateMultipleChoice,\r\n\r\n // True/False elements\r\n addTrueFalse,\r\n updateTrueFalse,\r\n deleteTrueFalse,\r\n duplicateTrueFalse,\r\n\r\n // Short Answer elements\r\n addShortAnswer,\r\n updateShortAnswer,\r\n deleteShortAnswer,\r\n duplicateShortAnswer,\r\n\r\n // Long Answer elements\r\n addLongAnswer,\r\n updateLongAnswer,\r\n deleteLongAnswer,\r\n duplicateLongAnswer,\r\n\r\n // Fill in the Blanks elements\r\n addFillInTheBlanks,\r\n updateFillInTheBlanks,\r\n deleteFillInTheBlanks,\r\n duplicateFillInTheBlanks,\r\n\r\n // Drawing/Lines\r\n addLine,\r\n removeLine,\r\n updateLastLine,\r\n finalizeDrawing,\r\n setLines,\r\n updateLinePosition,\r\n updateLineTransform,\r\n deleteLineById,\r\n duplicateLine,\r\n\r\n // Canvas actions\r\n clearCanvas,\r\n undo,\r\n redo,\r\n saveToHistory,\r\n updateElementOrder,\r\n\r\n // Element actions\r\n bringToFront,\r\n sendToBack,\r\n toggleLock,\r\n setLink,\r\n setAltText,\r\n setAudioData,\r\n\r\n // UI State\r\n setShowMcqForm,\r\n setShowFlashcardForm,\r\n setActivityType,\r\n setEditingActivity,\r\n toggleSketchMode,\r\n setSketchMode,\r\n\r\n // Selectors\r\n selectCurrentSlideId,\r\n selectCurrentSlide,\r\n selectAllSlides,\r\n selectCanAddSlide,\r\n selectSlideById,\r\n} from '../../store/slices/canvasSlice';\r\n\r\nexport {\r\n // Toolbar actions\r\n setTool,\r\n setPenColor,\r\n setStrokeWidth,\r\n} from '../../store/slices/toolbarSlice';\r\n\r\n// ============================================\r\n// TYPES (For TypeScript users)\r\n// ============================================\r\nexport type {\r\n ImageElement,\r\n VideoElement,\r\n Slide,\r\n Line,\r\n TextElement,\r\n Shape,\r\n FlashcardElement,\r\n PhotoFrameElement,\r\n MultipleChoice,\r\n TrueFalse,\r\n ShortAnswer,\r\n LongAnswer,\r\n FillInTheBlanks,\r\n} from '../../store/slices/canvasSlice';\r\n\r\n// ============================================\r\n// UTILITIES (Optional exports)\r\n// ============================================\r\nexport { exportSlideAsImage, exportSlideAsBlob, getSlideDataURL } from '../../utils/exportSlide';\r\nexport type { ExportOptions } from '../../utils/exportSlide';\r\n\r\n// Publishing types (for users who want to implement custom publishing)\r\nexport type { PublishProgress, PublishResponse, PublishButtonProps } from '../../components/PublishButton';\r\n\r\n// ============================================\r\n// HOOKS (For custom integrations)\r\n// ============================================\r\nexport { useDispatch, useSelector } from '../../store/hooks';\r\nexport { useSlidesPersistence } from '../../store/hooks/useSlidesPersistence';\r\n","import { useDispatch as useReduxDispatch, useSelector as useReduxSelector } from 'react-redux';\r\nimport { AppDispatch, RootState } from '@/store/store';\r\n\r\nexport const useDispatch = () => useReduxDispatch<AppDispatch>();\r\nexport const useSelector = <T>(selector: (state: RootState) => T): T => useReduxSelector(selector);\r\nexport const useAppDispatch = useDispatch;\r\nexport const useAppSelector = useSelector;\r\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\n\r\nconst MAX_SLIDES = 20;\r\n\r\ntype Line = {\r\n id?: string;\r\n tool: string;\r\n points: number[];\r\n color: string;\r\n strokeWidth: number;\r\n isSketch?: boolean;\r\n timestamp?: number;\r\n x?: number;\r\n y?: number;\r\n scaleX?: number;\r\n scaleY?: number;\r\n rotation?: number;\r\n};\r\n\r\ntype Shape = {\r\n id: string;\r\n type: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n color?: string;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n radius?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n numPoints?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n angle?: number;\r\n points?: number[];\r\n pointerLength?: number;\r\n pointerWidth?: number;\r\n strokeWidth?: number;\r\n scaleX?: number;\r\n scaleY?: number;\r\n sides?: number;\r\n innerRadius2?: number;\r\n outerRadius2?: number;\r\n clockwise?: boolean;\r\n};\r\n\r\ntype ImageElement = {\r\n id: string;\r\n src: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n draggable: boolean;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n annotations?: Line[];\r\n isDrawingMode?: boolean;\r\n};\r\n\r\ntype VideoElement = {\r\n id: string;\r\n objectUrl: string;\r\n thumbnailDataUrl: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n draggable: boolean;\r\n isPlaying: boolean;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n videoData?: string;\r\n videoBlob?: Blob;\r\n audioData?: string;\r\n isRecorded?: boolean;\r\n};\r\n\r\ntype FlashcardElement = {\r\n id: string;\r\n images: string[];\r\n currentIndex: number;\r\n order: 'sequential' | 'random';\r\n navigationHistory?: number[];\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n draggable: boolean;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\n\r\ntype PhotoFrameElement = {\r\n id: string;\r\n capturedImageUrl?: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n draggable: boolean;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n isCapturing: boolean;\r\n annotations?: Line[];\r\n isDrawingMode?: boolean;\r\n};\r\n\r\ntype TextElement = {\r\n id: string;\r\n text: string;\r\n x: number;\r\n y: number;\r\n width?: number;\r\n height?: number;\r\n rotation: number;\r\n draggable: boolean;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n fontSize: number;\r\n fontFamily: string;\r\n fontStyle: string;\r\n fontWeight: string;\r\n textDecoration: string;\r\n fill: string;\r\n align: string;\r\n};\r\n\r\nexport type MultipleChoice = {\r\n id: string;\r\n data: {\r\n questionType: string;\r\n responseType: string;\r\n feedbackMode: string;\r\n question: string;\r\n responseOptions: {\r\n options: string[];\r\n correctIndex: number[];\r\n };\r\n };\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\n\r\nexport type TrueFalse = {\r\n id: string;\r\n data: {\r\n questionType: string;\r\n responseType: string;\r\n feedbackMode: string;\r\n question: string;\r\n responseOptions: {\r\n options: string[];\r\n correctAnswer: boolean;\r\n };\r\n };\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\n\r\nexport type ShortAnswer = {\r\n id: string;\r\n data: {\r\n questionType: string;\r\n responseType: string;\r\n feedbackMode: string;\r\n question: string;\r\n responseOptions: {\r\n options: string[];\r\n correctShortAnswer: string;\r\n };\r\n };\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\nexport type LongAnswer = {\r\n id: string;\r\n data: {\r\n questionType: string;\r\n responseType: string;\r\n feedbackMode: string;\r\n question: string;\r\n responseOptions: {\r\n options: string[];\r\n correctLongAnswer: string;\r\n };\r\n };\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\n\r\nexport type FillInTheBlanks = {\r\n id: string;\r\n data: {\r\n questionType: string;\r\n responseType: string;\r\n feedbackMode: string;\r\n question: string;\r\n responseOptions: {\r\n options: string[];\r\n correctShortAnswer: string;\r\n };\r\n };\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n locked?: boolean;\r\n link?: string;\r\n altText?: string;\r\n zIndex?: number;\r\n timestamp?: number;\r\n audioData?: string;\r\n};\r\n\r\ntype Slide = {\r\n id: string;\r\n name: string;\r\n thumbnail?: string;\r\n backgroundColor?: string;\r\n lines: Line[];\r\n shapes: Shape[];\r\n images: ImageElement[];\r\n videos: VideoElement[];\r\n flashcards: FlashcardElement[];\r\n photoFrames: PhotoFrameElement[];\r\n texts: TextElement[];\r\n createdAt: number;\r\n updatedAt: number;\r\n activityType: string;\r\n multipleChoices: MultipleChoice[];\r\n trueFalses: TrueFalse[];\r\n shortAnswers: ShortAnswer[];\r\n LongAnswer: LongAnswer[];\r\n fillInTheBlanks: FillInTheBlanks[];\r\n showMcqForm: boolean;\r\n showFlashcardForm: boolean;\r\n editingActivity: MultipleChoice | TrueFalse | ShortAnswer | LongAnswer | FillInTheBlanks | null;\r\n editingFlashcard: FlashcardElement | null;\r\n};\r\n\r\ntype SlideHistory = {\r\n past: Slide[];\r\n future: Slide[];\r\n};\r\n\r\ntype CanvasState = {\r\n slides: Slide[];\r\n currentSlideId: string;\r\n history: Record<string, SlideHistory>;\r\n isSketchMode: boolean;\r\n editingTextId: string | null;\r\n};\r\n\r\nconst createEmptySlide = (name?: string): Slide => ({\r\n id: `slide-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n name: name || `Slide ${Date.now()}`,\r\n thumbnail: undefined,\r\n backgroundColor: '#ffffff',\r\n lines: [],\r\n shapes: [],\r\n images: [],\r\n videos: [],\r\n flashcards: [],\r\n photoFrames: [],\r\n texts: [],\r\n activityType: '',\r\n multipleChoices: [],\r\n trueFalses: [],\r\n shortAnswers: [],\r\n LongAnswer: [],\r\n fillInTheBlanks: [],\r\n showMcqForm: false,\r\n showFlashcardForm: false,\r\n editingActivity: null,\r\n editingFlashcard: null,\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n});\r\n\r\nconst initialSlide = createEmptySlide('Slide 1');\r\n\r\nconst initialState: CanvasState = {\r\n slides: [initialSlide],\r\n currentSlideId: initialSlide.id,\r\n history: {\r\n [initialSlide.id]: {\r\n past: [],\r\n future: [],\r\n },\r\n },\r\n isSketchMode: true,\r\n editingTextId: null,\r\n};\r\n\r\nconst canvasSlice = createSlice({\r\n name: 'canvas',\r\n initialState,\r\n reducers: {\r\n addSlide: (state) => {\r\n if (state.slides.length >= MAX_SLIDES) return;\r\n const newSlide = createEmptySlide(`Slide ${state.slides.length + 1}`);\r\n state.slides.push(newSlide);\r\n state.currentSlideId = newSlide.id;\r\n state.history[newSlide.id] = { past: [], future: [] };\r\n },\r\n deleteSlide: (state, action: PayloadAction<string>) => {\r\n if (state.slides.length <= 1) return;\r\n const slideIndex = state.slides.findIndex((s) => s.id === action.payload);\r\n if (slideIndex === -1) return;\r\n\r\n state.slides.splice(slideIndex, 1);\r\n delete state.history[action.payload];\r\n\r\n if (state.currentSlideId === action.payload) {\r\n const newIndex = Math.max(0, slideIndex - 1);\r\n state.currentSlideId = state.slides[newIndex].id;\r\n }\r\n },\r\n duplicateSlide: (state, action: PayloadAction<string>) => {\r\n if (state.slides.length >= MAX_SLIDES) return;\r\n const slideIndex = state.slides.findIndex((s) => s.id === action.payload);\r\n if (slideIndex === -1) return;\r\n\r\n const originalSlide = state.slides[slideIndex];\r\n const newSlide: Slide = {\r\n ...originalSlide,\r\n id: `slide-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n name: `${originalSlide.name} (Copy)`,\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n lines: JSON.parse(JSON.stringify(originalSlide.lines)),\r\n images: JSON.parse(JSON.stringify(originalSlide.images)),\r\n videos: JSON.parse(JSON.stringify(originalSlide.videos)),\r\n shapes: JSON.parse(JSON.stringify(originalSlide.shapes)),\r\n flashcards: JSON.parse(JSON.stringify(originalSlide.flashcards)),\r\n photoFrames: JSON.parse(JSON.stringify(originalSlide.photoFrames)),\r\n };\r\n\r\n state.slides.splice(slideIndex + 1, 0, newSlide);\r\n state.currentSlideId = newSlide.id;\r\n state.history[newSlide.id] = { past: [], future: [] };\r\n },\r\n setCurrentSlide: (state, action: PayloadAction<string>) => {\r\n const slide = state.slides.find((s) => s.id === action.payload);\r\n if (slide) {\r\n state.currentSlideId = action.payload;\r\n }\r\n },\r\n updateSlideThumbnail: (state, action: PayloadAction<{ id: string; thumbnail: string }>) => {\r\n const slide = state.slides.find((s) => s.id === action.payload.id);\r\n if (slide) {\r\n slide.thumbnail = action.payload.thumbnail;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n setBackgroundColor: (state, action: PayloadAction<string>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.backgroundColor = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n reorderSlides: (state, action: PayloadAction<{ fromIndex: number; toIndex: number }>) => {\r\n const { fromIndex, toIndex } = action.payload;\r\n if (fromIndex < 0 || fromIndex >= state.slides.length) return;\r\n if (toIndex < 0 || toIndex >= state.slides.length) return;\r\n\r\n const [movedSlide] = state.slides.splice(fromIndex, 1);\r\n state.slides.splice(toIndex, 0, movedSlide);\r\n },\r\n loadSlides: (state, action: PayloadAction<{ slides: Slide[]; currentSlideId: string }>) => {\r\n state.slides = action.payload.slides.map((slide) => ({\r\n ...slide,\r\n showMcqForm: false,\r\n }));\r\n state.currentSlideId = action.payload.currentSlideId;\r\n state.history = {};\r\n action.payload.slides.forEach((slide) => {\r\n state.history[slide.id] = { past: [], future: [] };\r\n });\r\n },\r\n addLine: (state, action: PayloadAction<Line>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const lineWithTimestamp = {\r\n ...action.payload,\r\n id: action.payload.id || `line-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n x: action.payload.x || 0,\r\n y: action.payload.y || 0,\r\n };\r\n slide.lines.push(lineWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n removeLine: (state, action: PayloadAction<number>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide && action.payload >= 0 && action.payload < slide.lines.length) {\r\n slide.lines.splice(action.payload, 1);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateLastLine: (state, action: PayloadAction<number[]>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide && slide.lines.length > 0) {\r\n slide.lines[slide.lines.length - 1].points = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n finalizeDrawing: (state) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n setLines: (state, action: PayloadAction<Line[]>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.lines = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateLinePosition: (state, action: PayloadAction<{ id: string; x: number; y: number }>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const line = slide.lines.find((l) => l.id === action.payload.id);\r\n if (line) {\r\n line.x = action.payload.x;\r\n line.y = action.payload.y;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n updateLineTransform: (\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n x: number;\r\n y: number;\r\n scaleX: number;\r\n scaleY: number;\r\n rotation: number;\r\n }>\r\n ) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const line = slide.lines.find((l) => l.id === action.payload.id);\r\n if (line) {\r\n line.x = action.payload.x;\r\n line.y = action.payload.y;\r\n line.scaleX = action.payload.scaleX;\r\n line.scaleY = action.payload.scaleY;\r\n line.rotation = action.payload.rotation;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteLineById: (state, action: PayloadAction<string>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const lineIndex = slide.lines.findIndex((l) => l.id === action.payload);\r\n if (lineIndex !== -1) {\r\n slide.lines.splice(lineIndex, 1);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n duplicateLine: (state, action: PayloadAction<string>) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const line = slide.lines.find((l) => l.id === action.payload);\r\n if (line) {\r\n const duplicated: Line = {\r\n ...line,\r\n id: `line-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\r\n x: (line.x || 0) + 20,\r\n y: (line.y || 0) + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.lines.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n updateElementOrder: (\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'text'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks'\r\n | 'line';\r\n newTimestamp: number;\r\n }>\r\n ) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type, newTimestamp } = action.payload;\r\n\r\n switch (type) {\r\n case 'image':\r\n const image = slide.images.find((img) => img.id === id);\r\n if (image) image.timestamp = newTimestamp;\r\n break;\r\n case 'video':\r\n const video = slide.videos.find((vid) => vid.id === id);\r\n if (video) video.timestamp = newTimestamp;\r\n break;\r\n case 'shape':\r\n const shape = slide.shapes.find((shp) => shp.id === id);\r\n if (shape) shape.timestamp = newTimestamp;\r\n break;\r\n case 'text':\r\n const text = slide.texts.find((txt) => txt.id === id);\r\n if (text) text.timestamp = newTimestamp;\r\n break;\r\n case 'flashcard':\r\n const flashcard = slide.flashcards.find((fc) => fc.id === id);\r\n if (flashcard) flashcard.timestamp = newTimestamp;\r\n break;\r\n case 'photoFrame':\r\n const photoFrame = slide.photoFrames.find((pf) => pf.id === id);\r\n if (photoFrame) photoFrame.timestamp = newTimestamp;\r\n break;\r\n case 'mcq':\r\n const mcq = slide.multipleChoices.find((mc) => mc.id === id);\r\n if (mcq) mcq.timestamp = newTimestamp;\r\n break;\r\n case 'trueFalse':\r\n const trueFalse = slide.trueFalses.find((tf) => tf.id === id);\r\n if (trueFalse) trueFalse.timestamp = newTimestamp;\r\n break;\r\n case 'shortAnswer':\r\n const shortAnswer = slide.shortAnswers.find((sa) => sa.id === id);\r\n if (shortAnswer) shortAnswer.timestamp = newTimestamp;\r\n break;\r\n case 'longAnswer':\r\n const longAnswer = slide.LongAnswer.find((la) => la.id === id);\r\n if (longAnswer) longAnswer.timestamp = newTimestamp;\r\n break;\r\n case 'fillInTheBlanks':\r\n const fillInTheBlanks = slide.fillInTheBlanks.find((fib) => fib.id === id);\r\n if (fillInTheBlanks) fillInTheBlanks.timestamp = newTimestamp;\r\n break;\r\n case 'line':\r\n const line = slide.lines.find((ln) => ln.id === id);\r\n if (line) line.timestamp = newTimestamp;\r\n break;\r\n }\r\n\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addImage(state, action: PayloadAction<ImageElement>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const imageWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n slide.images.push(imageWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateImage(state, action: PayloadAction<Partial<ImageElement> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.images.findIndex((img) => img.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.images[index] = { ...slide.images[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteImage(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.images = slide.images.filter((img) => img.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateImage(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const image = slide.images.find((img) => img.id === action.payload);\r\n if (image) {\r\n const duplicated: ImageElement = {\r\n ...image,\r\n id: `img-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: image.x + 20,\r\n y: image.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.images.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addVideo(state, action: PayloadAction<VideoElement>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const videoWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n slide.videos.push(videoWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateVideo(state, action: PayloadAction<Partial<VideoElement> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.videos.findIndex((v) => v.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.videos[index] = { ...slide.videos[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n toggleVideoPlaying(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const video = slide.videos.find((v) => v.id === action.payload);\r\n if (video) {\r\n video.isPlaying = !video.isPlaying;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteVideo(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.videos = slide.videos.filter((v) => v.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateVideo(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const video = slide.videos.find((v) => v.id === action.payload);\r\n if (video) {\r\n const duplicated: VideoElement = {\r\n ...video,\r\n id: `vid-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: video.x + 20,\r\n y: video.y + 20,\r\n isPlaying: false,\r\n timestamp: Date.now(),\r\n };\r\n slide.videos.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addShape(state, action: PayloadAction<Shape>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const shapeWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n slide.shapes?.push(shapeWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateShape(state, action: PayloadAction<Partial<Shape> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.shapes.findIndex((s) => s.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.shapes[index] = { ...slide.shapes[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n duplicateShape(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const shape = slide.shapes.find((s) => s.id === action.payload);\r\n if (shape) {\r\n const duplicated: Shape = {\r\n ...shape,\r\n id: `shape-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: shape.x + 20,\r\n y: shape.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.shapes.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteShape(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.shapes = slide.shapes.filter((s) => s.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addMultipleChoice(state, action: PayloadAction<MultipleChoice>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n if (!slide.multipleChoices) {\r\n slide.multipleChoices = [];\r\n }\r\n const newMultipleChoice = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n if (slide.multipleChoices.length > 0) {\r\n const lastChoice = slide.multipleChoices[slide.multipleChoices.length - 1];\r\n newMultipleChoice.x = lastChoice.x + 20;\r\n newMultipleChoice.y = lastChoice.y + 20;\r\n }\r\n slide.multipleChoices.push(newMultipleChoice);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateMultipleChoice(state, action: PayloadAction<Partial<MultipleChoice> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide && slide.multipleChoices) {\r\n const index = slide.multipleChoices.findIndex((mc) => mc.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.multipleChoices[index] = {\r\n ...slide.multipleChoices[index],\r\n ...action.payload,\r\n };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n editMultipleChoice(state, action: PayloadAction<Partial<MultipleChoice> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide && slide.multipleChoices) {\r\n const index = slide.multipleChoices.findIndex((mc) => mc.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.multipleChoices[index] = {\r\n ...slide.multipleChoices[index],\r\n ...action.payload,\r\n };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n duplicateMultipleChoice(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const multipleChoice = slide.multipleChoices.find((mc) => mc.id === action.payload);\r\n if (multipleChoice) {\r\n const duplicated: MultipleChoice = {\r\n ...multipleChoice,\r\n id: `mcq-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: multipleChoice.x + 20,\r\n y: multipleChoice.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.multipleChoices.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteMultipleChoice(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.multipleChoices = slide.multipleChoices.filter((mc) => mc.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addTrueFalse(state, action: PayloadAction<TrueFalse>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n if (!slide.trueFalses) {\r\n slide.trueFalses = [];\r\n }\r\n const newTrueFalse = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n if (slide.trueFalses.length > 0) {\r\n const lastChoice = slide.trueFalses[slide.trueFalses.length - 1];\r\n newTrueFalse.x = lastChoice.x + 20;\r\n newTrueFalse.y = lastChoice.y + 20;\r\n }\r\n\r\n slide.trueFalses.push(newTrueFalse);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateTrueFalse(state, action: PayloadAction<Partial<TrueFalse> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.trueFalses.findIndex((tf) => tf.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.trueFalses[index] = { ...slide.trueFalses[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteTrueFalse(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.trueFalses = slide.trueFalses.filter((tf) => tf.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateTrueFalse(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const trueFalse = slide.trueFalses.find((tf) => tf.id === action.payload);\r\n if (trueFalse) {\r\n const duplicated = {\r\n ...trueFalse,\r\n id: `shape-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: trueFalse.x + 20,\r\n y: trueFalse.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.trueFalses.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addShortAnswer(state, action: PayloadAction<ShortAnswer>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n if (!slide.shortAnswers) {\r\n slide.shortAnswers = [];\r\n }\r\n const newShortAnswer = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n if (slide.shortAnswers.length > 0) {\r\n const lastAnswer = slide.shortAnswers[slide.shortAnswers.length - 1];\r\n newShortAnswer.x = lastAnswer.x + 20;\r\n newShortAnswer.y = lastAnswer.y + 20;\r\n }\r\n slide.shortAnswers.push(newShortAnswer);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateShortAnswer(state, action: PayloadAction<Partial<ShortAnswer> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.shortAnswers.findIndex((sa) => sa.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.shortAnswers[index] = { ...slide.shortAnswers[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n duplicateShortAnswer(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const shortAnswer = slide.shortAnswers.find((sa) => sa.id === action.payload);\r\n if (shortAnswer) {\r\n const duplicated = {\r\n ...shortAnswer,\r\n id: `shortAnswer-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: shortAnswer.x + 20,\r\n y: shortAnswer.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.shortAnswers.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteShortAnswer(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.shortAnswers = slide.shortAnswers.filter((sa) => sa.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addLongAnswer(state, action: PayloadAction<LongAnswer>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n if (!slide.LongAnswer) {\r\n slide.LongAnswer = [];\r\n }\r\n const newLongAnswer = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n\r\n if (slide.LongAnswer.length > 0) {\r\n const lastAnswer = slide.LongAnswer[slide.LongAnswer.length - 1];\r\n newLongAnswer.x = lastAnswer.x + 20;\r\n newLongAnswer.y = lastAnswer.y + 20;\r\n }\r\n\r\n slide.LongAnswer.push(newLongAnswer);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateLongAnswer(state, action: PayloadAction<Partial<LongAnswer> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const longAnswer = slide.LongAnswer.find((la) => la.id === action.payload.id);\r\n if (longAnswer) {\r\n Object.assign(longAnswer, action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteLongAnswer(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.LongAnswer = slide.LongAnswer.filter((la) => la.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateLongAnswer(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const longAnswer = slide.LongAnswer.find((la) => la.id === action.payload);\r\n if (longAnswer) {\r\n const newLongAnswer = {\r\n ...longAnswer,\r\n id: `${longAnswer.id}-copy-${Date.now()}`,\r\n timestamp: Date.now(),\r\n };\r\n slide.LongAnswer.push(newLongAnswer);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n setShowMcqForm(state, action: PayloadAction<boolean>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.showMcqForm = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n setShowFlashcardForm(state, action: PayloadAction<boolean>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.showFlashcardForm = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addFillInTheBlanks(state, action: PayloadAction<FillInTheBlanks>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n if (!slide.fillInTheBlanks) {\r\n slide.fillInTheBlanks = [];\r\n }\r\n const newFillInTheBlank = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n if (slide.fillInTheBlanks.length > 0) {\r\n const lastBlank = slide.fillInTheBlanks[slide.fillInTheBlanks.length - 1];\r\n newFillInTheBlank.x = lastBlank.x + 20;\r\n newFillInTheBlank.y = lastBlank.y + 20;\r\n }\r\n slide.fillInTheBlanks.push(newFillInTheBlank);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateFillInTheBlanks(state, action: PayloadAction<Partial<FillInTheBlanks> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.fillInTheBlanks.findIndex((fib) => fib.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.fillInTheBlanks[index] = { ...slide.fillInTheBlanks[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteFillInTheBlanks(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.fillInTheBlanks = slide.fillInTheBlanks.filter((fib) => fib.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateFillInTheBlanks(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const fillInTheBlank = slide.fillInTheBlanks.find((fib) => fib.id === action.payload);\r\n if (fillInTheBlank) {\r\n const duplicated = {\r\n ...fillInTheBlank,\r\n id: `fillInTheBlank-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: fillInTheBlank.x + 20,\r\n y: fillInTheBlank.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.fillInTheBlanks.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n setActivityType(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.activityType = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n setEditingActivity(\r\n state,\r\n action: PayloadAction<\r\n MultipleChoice | TrueFalse | ShortAnswer | LongAnswer | FillInTheBlanks | null\r\n >\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.editingActivity = action.payload;\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n // Order actions\r\n bringToFront(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'mcq'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type } = action.payload;\r\n if (type === 'image') {\r\n const index = slide.images.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.images.splice(index, 1);\r\n slide.images.push(item);\r\n }\r\n } else if (type === 'video') {\r\n const index = slide.videos.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.videos.splice(index, 1);\r\n slide.videos.push(item);\r\n }\r\n } else if (type === 'shape') {\r\n const index = slide.shapes.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.shapes.splice(index, 1);\r\n slide.shapes.push(item);\r\n }\r\n } else if (type === 'flashcard') {\r\n const index = slide.flashcards.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.flashcards.splice(index, 1);\r\n slide.flashcards.push(item);\r\n }\r\n } else if (type === 'photoFrame') {\r\n const index = slide.photoFrames.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.photoFrames.splice(index, 1);\r\n slide.photoFrames.push(item);\r\n }\r\n } else if (type === 'text') {\r\n const index = slide.texts.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.texts.splice(index, 1);\r\n slide.texts.push(item);\r\n }\r\n } else if (type === 'trueFalse') {\r\n const index = slide.trueFalses.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.trueFalses.splice(index, 1);\r\n slide.trueFalses.push(item);\r\n }\r\n } else if (type === 'shortAnswer') {\r\n const index = slide.shortAnswers.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.shortAnswers.splice(index, 1);\r\n slide.shortAnswers.push(item);\r\n }\r\n } else if (type === 'fillInTheBlanks') {\r\n const index = slide.fillInTheBlanks.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.fillInTheBlanks.splice(index, 1);\r\n slide.fillInTheBlanks.push(item);\r\n }\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n sendToBack(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'mcq'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type } = action.payload;\r\n if (type === 'image') {\r\n const index = slide.images.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.images.splice(index, 1);\r\n slide.images.unshift(item);\r\n }\r\n } else if (type === 'video') {\r\n const index = slide.videos.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.videos.splice(index, 1);\r\n slide.videos.unshift(item);\r\n }\r\n } else if (type === 'shape') {\r\n const index = slide.shapes.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.shapes.splice(index, 1);\r\n slide.shapes.unshift(item);\r\n }\r\n } else if (type === 'flashcard') {\r\n const index = slide.flashcards.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.flashcards.splice(index, 1);\r\n slide.flashcards.unshift(item);\r\n }\r\n } else if (type === 'photoFrame') {\r\n const index = slide.photoFrames.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.photoFrames.splice(index, 1);\r\n slide.photoFrames.unshift(item);\r\n }\r\n } else if (type === 'text') {\r\n const index = slide.texts.findIndex((item) => item.id === id);\r\n if (index !== -1) {\r\n const [item] = slide.texts.splice(index, 1);\r\n slide.texts.unshift(item);\r\n }\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n toggleLock(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'mcq'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type } = action.payload;\r\n const array =\r\n type === 'image'\r\n ? slide.images\r\n : type === 'video'\r\n ? slide.videos\r\n : type === 'shape'\r\n ? slide.shapes\r\n : type === 'flashcard'\r\n ? slide.flashcards\r\n : type === 'photoFrame'\r\n ? slide.photoFrames\r\n : type === 'trueFalse'\r\n ? slide.trueFalses\r\n : type === 'shortAnswer'\r\n ? slide.shortAnswers\r\n : type === 'fillInTheBlanks'\r\n ? slide.fillInTheBlanks\r\n : slide.texts;\r\n const item = array.find((item) => item.id === id);\r\n if (item) {\r\n item.locked = !item.locked;\r\n if ('draggable' in item) {\r\n item.draggable = !item.locked;\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n setLink(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'mcq'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n link: string;\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type, link } = action.payload;\r\n const array =\r\n type === 'image'\r\n ? slide.images\r\n : type === 'video'\r\n ? slide.videos\r\n : type === 'shape'\r\n ? slide.shapes\r\n : type === 'flashcard'\r\n ? slide.flashcards\r\n : type === 'photoFrame'\r\n ? slide.photoFrames\r\n : type === 'mcq'\r\n ? slide.multipleChoices\r\n : type === 'trueFalse'\r\n ? slide.trueFalses\r\n : type === 'shortAnswer'\r\n ? slide.shortAnswers\r\n : type === 'fillInTheBlanks'\r\n ? slide.fillInTheBlanks\r\n : slide.texts;\r\n const item = array.find((item) => item.id === id);\r\n if (item) {\r\n item.link = link;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n setAltText(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n altText: string;\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type, altText } = action.payload;\r\n const array =\r\n type === 'image'\r\n ? slide.images\r\n : type === 'video'\r\n ? slide.videos\r\n : type === 'shape'\r\n ? slide.shapes\r\n : type === 'flashcard'\r\n ? slide.flashcards\r\n : type === 'photoFrame'\r\n ? slide.photoFrames\r\n : type === 'trueFalse'\r\n ? slide.trueFalses\r\n : type === 'shortAnswer'\r\n ? slide.shortAnswers\r\n : type === 'fillInTheBlanks'\r\n ? slide.fillInTheBlanks\r\n : slide.texts;\r\n const item = array.find((item) => item.id === id);\r\n if (item) {\r\n item.altText = altText;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n setAudioData(\r\n state,\r\n action: PayloadAction<{\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'text'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n audioData: string;\r\n }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const { id, type, audioData } = action.payload;\r\n const array =\r\n type === 'image'\r\n ? slide.images\r\n : type === 'video'\r\n ? slide.videos\r\n : type === 'shape'\r\n ? slide.shapes\r\n : type === 'flashcard'\r\n ? slide.flashcards\r\n : type === 'photoFrame'\r\n ? slide.photoFrames\r\n : type === 'trueFalse'\r\n ? slide.trueFalses\r\n : type === 'shortAnswer'\r\n ? slide.shortAnswers\r\n : type === 'fillInTheBlanks'\r\n ? slide.fillInTheBlanks\r\n : slide.texts;\r\n const item = array.find((item) => item.id === id);\r\n if (item) {\r\n item.audioData = audioData;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n clearCanvas: (state) => {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.lines = [];\r\n slide.images = [];\r\n slide.videos = [];\r\n slide.shapes = [];\r\n slide.flashcards = [];\r\n slide.photoFrames = [];\r\n slide.texts = [];\r\n slide.multipleChoices = [];\r\n slide.trueFalses = [];\r\n slide.shortAnswers = [];\r\n slide.LongAnswer = [];\r\n slide.fillInTheBlanks = [];\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n addText(state, action: PayloadAction<TextElement>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const textWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n slide.texts.push(textWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateText(state, action: PayloadAction<Partial<TextElement> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.texts.findIndex((t) => t.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.texts[index] = { ...slide.texts[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteText(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.texts = slide.texts.filter((t) => t.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateText(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const text = slide.texts.find((t) => t.id === action.payload);\r\n if (text) {\r\n const duplicated: TextElement = {\r\n ...text,\r\n id: `text-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: text.x + 20,\r\n y: text.y + 20,\r\n timestamp: Date.now(),\r\n };\r\n slide.texts.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addFlashcard(state, action: PayloadAction<FlashcardElement>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const flashcardWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n if (slide.flashcards.length >= 40) {\r\n alert('You can add maximum 40 flashcards');\r\n return;\r\n }\r\n slide.flashcards.push(flashcardWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updateFlashcard(state, action: PayloadAction<Partial<FlashcardElement> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.flashcards.findIndex((f) => f.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.flashcards[index] = { ...slide.flashcards[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deleteFlashcard(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.flashcards = slide.flashcards.filter((f) => f.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicateFlashcard(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const flashcard = slide.flashcards.find((f) => f.id === action.payload);\r\n if (flashcard) {\r\n const duplicated: FlashcardElement = {\r\n ...flashcard,\r\n id: `flashcard-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: flashcard.x + 20,\r\n y: flashcard.y + 20,\r\n currentIndex: 0,\r\n timestamp: Date.now(),\r\n };\r\n slide.flashcards.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n editFlashcard(state, action: PayloadAction<FlashcardElement | null>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.editingFlashcard = action.payload;\r\n }\r\n },\r\n nextFlashcard(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const flashcard = slide.flashcards.find((f) => f.id === action.payload);\r\n if (flashcard && flashcard.images.length > 0) {\r\n if (flashcard.order === 'sequential') {\r\n flashcard.currentIndex = (flashcard.currentIndex + 1) % flashcard.images.length;\r\n } else {\r\n if (!flashcard.navigationHistory) {\r\n flashcard.navigationHistory = [flashcard.currentIndex];\r\n }\r\n\r\n const availableIndices = flashcard.images\r\n .map((_, i) => i)\r\n .filter((i) => i !== flashcard.currentIndex);\r\n if (availableIndices.length > 0) {\r\n const newIndex =\r\n availableIndices[Math.floor(Math.random() * availableIndices.length)];\r\n flashcard.navigationHistory.push(newIndex);\r\n flashcard.currentIndex = newIndex;\r\n }\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n previousFlashcard(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const flashcard = slide.flashcards.find((f) => f.id === action.payload);\r\n if (flashcard && flashcard.images.length > 0) {\r\n if (flashcard.order === 'sequential') {\r\n flashcard.currentIndex =\r\n (flashcard.currentIndex - 1 + flashcard.images.length) % flashcard.images.length;\r\n } else {\r\n if (flashcard.navigationHistory && flashcard.navigationHistory.length > 1) {\r\n flashcard.navigationHistory.pop();\r\n flashcard.currentIndex =\r\n flashcard.navigationHistory[flashcard.navigationHistory.length - 1];\r\n }\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addPhotoFrame(state, action: PayloadAction<PhotoFrameElement>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const photoFrameWithTimestamp = {\r\n ...action.payload,\r\n timestamp: action.payload.timestamp || Date.now(),\r\n };\r\n slide.photoFrames.push(photoFrameWithTimestamp);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n updatePhotoFrame(state, action: PayloadAction<Partial<PhotoFrameElement> & { id: string }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const index = slide.photoFrames.findIndex((p) => p.id === action.payload.id);\r\n if (index !== -1) {\r\n slide.photoFrames[index] = { ...slide.photoFrames[index], ...action.payload };\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n deletePhotoFrame(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n slide.photoFrames = slide.photoFrames.filter((p) => p.id !== action.payload);\r\n slide.updatedAt = Date.now();\r\n }\r\n },\r\n duplicatePhotoFrame(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const photoFrame = slide.photoFrames.find((p) => p.id === action.payload);\r\n if (photoFrame) {\r\n const duplicated: PhotoFrameElement = {\r\n ...photoFrame,\r\n id: `photoframe-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: photoFrame.x + 20,\r\n y: photoFrame.y + 20,\r\n isCapturing: false,\r\n timestamp: Date.now(),\r\n };\r\n slide.photoFrames.push(duplicated);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n toggleImageDrawingMode(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const image = slide.images.find((img) => img.id === action.payload);\r\n if (image) {\r\n image.isDrawingMode = !image.isDrawingMode;\r\n if (!image.annotations) {\r\n image.annotations = [];\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addImageAnnotation(state, action: PayloadAction<{ imageId: string; line: Line }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const image = slide.images.find((img) => img.id === action.payload.imageId);\r\n if (image) {\r\n if (!image.annotations) {\r\n image.annotations = [];\r\n }\r\n image.annotations.push(action.payload.line);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n updateImageAnnotation(state, action: PayloadAction<{ imageId: string; points: number[] }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const image = slide.images.find((img) => img.id === action.payload.imageId);\r\n if (image && image.annotations && image.annotations.length > 0) {\r\n image.annotations[image.annotations.length - 1].points = action.payload.points;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n clearImageAnnotations(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const image = slide.images.find((img) => img.id === action.payload);\r\n if (image) {\r\n image.annotations = [];\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n togglePhotoFrameDrawingMode(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const frame = slide.photoFrames.find((f) => f.id === action.payload);\r\n if (frame) {\r\n frame.isDrawingMode = !frame.isDrawingMode;\r\n if (!frame.annotations) {\r\n frame.annotations = [];\r\n }\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n addPhotoFrameAnnotation(state, action: PayloadAction<{ frameId: string; line: Line }>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const frame = slide.photoFrames.find((f) => f.id === action.payload.frameId);\r\n if (frame) {\r\n if (!frame.annotations) {\r\n frame.annotations = [];\r\n }\r\n frame.annotations.push(action.payload.line);\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n updatePhotoFrameAnnotation(\r\n state,\r\n action: PayloadAction<{ frameId: string; points: number[] }>\r\n ) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const frame = slide.photoFrames.find((f) => f.id === action.payload.frameId);\r\n if (frame && frame.annotations && frame.annotations.length > 0) {\r\n frame.annotations[frame.annotations.length - 1].points = action.payload.points;\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n clearPhotoFrameAnnotations(state, action: PayloadAction<string>) {\r\n const slide = state.slides.find((s) => s.id === state.currentSlideId);\r\n if (slide) {\r\n const frame = slide.photoFrames.find((f) => f.id === action.payload);\r\n if (frame) {\r\n frame.annotations = [];\r\n slide.updatedAt = Date.now();\r\n }\r\n }\r\n },\r\n undo: (state) => {\r\n const slideHistory = state.history[state.currentSlideId];\r\n if (slideHistory && slideHistory.past.length > 0) {\r\n const slideIndex = state.slides.findIndex((s) => s.id === state.currentSlideId);\r\n if (slideIndex >= 0) {\r\n try {\r\n const currentSlide = state.slides[slideIndex];\r\n slideHistory.future.unshift(JSON.parse(JSON.stringify(currentSlide)));\r\n const previous = slideHistory.past.pop()!;\r\n state.slides[slideIndex] = previous;\r\n } catch (error) {\r\n console.warn('Failed to undo - data too large:', error);\r\n slideHistory.past = [];\r\n slideHistory.future = [];\r\n }\r\n }\r\n }\r\n },\r\n redo: (state) => {\r\n const slideHistory = state.history[state.currentSlideId];\r\n if (slideHistory && slideHistory.future.length > 0) {\r\n const slideIndex = state.slides.findIndex((s) => s.id === state.currentSlideId);\r\n if (slideIndex >= 0) {\r\n try {\r\n const currentSlide = state.slides[slideIndex];\r\n // Save current state to past\r\n slideHistory.past.push(JSON.parse(JSON.stringify(currentSlide)));\r\n // Restore next state\r\n const next = slideHistory.future.shift()!;\r\n state.slides[slideIndex] = next;\r\n } catch (error) {\r\n console.warn('Failed to redo - data too large:', error);\r\n slideHistory.past = [];\r\n slideHistory.future = [];\r\n }\r\n }\r\n }\r\n },\r\n saveToHistory: (state) => {\r\n const slideIndex = state.slides.findIndex((s) => s.id === state.currentSlideId);\r\n if (slideIndex >= 0) {\r\n const currentSlide = state.slides[slideIndex];\r\n const slideHistory = state.history[state.currentSlideId];\r\n if (slideHistory) {\r\n try {\r\n const clonedSlide = JSON.parse(JSON.stringify(currentSlide));\r\n slideHistory.past.push(clonedSlide);\r\n slideHistory.future = [];\r\n if (slideHistory.past.length > 20) {\r\n slideHistory.past.shift();\r\n }\r\n } catch (error) {\r\n console.warn('Failed to save to history - data too large:', error);\r\n if (slideHistory.past.length > 5) {\r\n slideHistory.past = slideHistory.past.slice(-5);\r\n }\r\n slideHistory.future = [];\r\n }\r\n }\r\n }\r\n },\r\n toggleSketchMode: (state) => {\r\n state.isSketchMode = !state.isSketchMode;\r\n },\r\n setSketchMode: (state, action: PayloadAction<boolean>) => {\r\n state.isSketchMode = action.payload;\r\n },\r\n setEditingTextId: (state, action: PayloadAction<string | null>) => {\r\n state.editingTextId = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n addSlide,\r\n deleteSlide,\r\n duplicateSlide,\r\n setCurrentSlide,\r\n updateSlideThumbnail,\r\n setBackgroundColor,\r\n reorderSlides,\r\n loadSlides,\r\n addLine,\r\n removeLine,\r\n addImage,\r\n updateImage,\r\n deleteImage,\r\n duplicateImage,\r\n addVideo,\r\n updateVideo,\r\n deleteVideo,\r\n duplicateVideo,\r\n toggleVideoPlaying,\r\n addShape,\r\n updateShape,\r\n duplicateShape,\r\n deleteShape,\r\n addText,\r\n updateText,\r\n deleteText,\r\n duplicateText,\r\n addFlashcard,\r\n updateFlashcard,\r\n deleteFlashcard,\r\n duplicateFlashcard,\r\n editFlashcard,\r\n nextFlashcard,\r\n previousFlashcard,\r\n addPhotoFrame,\r\n updatePhotoFrame,\r\n deletePhotoFrame,\r\n duplicatePhotoFrame,\r\n toggleImageDrawingMode,\r\n addImageAnnotation,\r\n updateImageAnnotation,\r\n clearImageAnnotations,\r\n togglePhotoFrameDrawingMode,\r\n addPhotoFrameAnnotation,\r\n updatePhotoFrameAnnotation,\r\n clearPhotoFrameAnnotations,\r\n addMultipleChoice,\r\n updateMultipleChoice,\r\n editMultipleChoice,\r\n deleteMultipleChoice,\r\n duplicateMultipleChoice,\r\n addTrueFalse,\r\n updateTrueFalse,\r\n deleteTrueFalse,\r\n duplicateTrueFalse,\r\n addShortAnswer,\r\n updateShortAnswer,\r\n deleteShortAnswer,\r\n duplicateShortAnswer,\r\n addLongAnswer,\r\n updateLongAnswer,\r\n deleteLongAnswer,\r\n duplicateLongAnswer,\r\n addFillInTheBlanks,\r\n updateFillInTheBlanks,\r\n deleteFillInTheBlanks,\r\n duplicateFillInTheBlanks,\r\n setShowMcqForm,\r\n setShowFlashcardForm,\r\n setActivityType,\r\n setEditingActivity,\r\n // Element actions\r\n bringToFront,\r\n sendToBack,\r\n toggleLock,\r\n setLink,\r\n setAltText,\r\n setAudioData,\r\n updateLastLine,\r\n finalizeDrawing,\r\n setLines,\r\n updateLinePosition,\r\n updateLineTransform,\r\n deleteLineById,\r\n duplicateLine,\r\n updateElementOrder,\r\n clearCanvas,\r\n undo,\r\n redo,\r\n saveToHistory,\r\n toggleSketchMode,\r\n setSketchMode,\r\n setEditingTextId,\r\n} = canvasSlice.actions;\r\n\r\nexport const selectCurrentSlideId = (state: { canvas: CanvasState }) => state.canvas.currentSlideId;\r\n\r\nexport const selectCurrentSlide = (state: { canvas: CanvasState }) => {\r\n const currentSlideId = state.canvas.currentSlideId;\r\n const slideIndex = state.canvas.slides.findIndex((s) => s.id === currentSlideId);\r\n return slideIndex >= 0 ? state.canvas.slides[slideIndex] : undefined;\r\n};\r\n\r\nexport const selectAllSlides = (state: { canvas: CanvasState }) => state.canvas.slides;\r\n\r\nexport const selectCanAddSlide = (state: { canvas: CanvasState }) =>\r\n state.canvas.slides.length < MAX_SLIDES;\r\n\r\nexport const selectSlideById = (slideId: string) => (state: { canvas: CanvasState }) => {\r\n const slideIndex = state.canvas.slides.findIndex((s) => s.id === slideId);\r\n return slideIndex >= 0 ? state.canvas.slides[slideIndex] : undefined;\r\n};\r\n\r\nexport default canvasSlice.reducer;\r\nexport type {\r\n VideoElement,\r\n Slide,\r\n Line,\r\n ImageElement,\r\n Shape,\r\n FlashcardElement,\r\n PhotoFrameElement,\r\n TextElement,\r\n};\r\n","import { useRef, useCallback } from 'react';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { addLine, finalizeDrawing, saveToHistory } from '@/store/slices/canvasSlice';\r\nimport type { DirectDrawingCanvasHandle } from '@/components/canvas/DirectDrawingCanvas';\r\n\r\nexport const useDirectDrawing = (onDrawEnd?: () => void) => {\r\n const dispatch = useDispatch();\r\n const canvasRef = useRef<DirectDrawingCanvasHandle | null>(null);\r\n const hasStartedDrawing = useRef(false);\r\n\r\n const tool = useSelector((state) => state.toolbar.selectedTool);\r\n const color = useSelector((state) => state.toolbar.penColor);\r\n const strokeWidth = useSelector((state) => state.toolbar.strokeWidth);\r\n const isSketchMode = useSelector((state) => state.canvas.isSketchMode);\r\n\r\n const lines = useSelector((state) => {\r\n const currentSlide = state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId);\r\n return currentSlide?.lines || [];\r\n });\r\n\r\n const setCanvasRef = useCallback((ref: DirectDrawingCanvasHandle | null) => {\r\n canvasRef.current = ref;\r\n }, []);\r\n\r\n const startDrawing = useCallback(\r\n (pos: { x: number; y: number }) => {\r\n // Only pen tool uses direct canvas drawing\r\n // Eraser is now click-to-delete (Excalidraw-style)\r\n if (tool !== 'pen') return;\r\n\r\n if (!canvasRef.current) return;\r\n dispatch(saveToHistory());\r\n canvasRef.current.startDrawing(pos);\r\n hasStartedDrawing.current = true;\r\n },\r\n [tool, dispatch]\r\n );\r\n\r\n const draw = useCallback((pos: { x: number; y: number }) => {\r\n if (!canvasRef.current || !hasStartedDrawing.current) return;\r\n canvasRef.current.draw(pos);\r\n }, []);\r\n\r\n const stopDrawing = useCallback(() => {\r\n if (!canvasRef.current || !hasStartedDrawing.current) return;\r\n\r\n const line = canvasRef.current.stopDrawing();\r\n hasStartedDrawing.current = false;\r\n\r\n if (line && line.points.length >= 4) {\r\n dispatch(addLine(line));\r\n }\r\n\r\n dispatch(finalizeDrawing());\r\n onDrawEnd?.();\r\n }, [dispatch, onDrawEnd]);\r\n\r\n return {\r\n lines,\r\n tool,\r\n color,\r\n strokeWidth,\r\n isSketchMode,\r\n setCanvasRef,\r\n startDrawing,\r\n draw,\r\n stopDrawing,\r\n };\r\n};\r\n","'use client';\r\n\r\nimport React, { useRef, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react';\r\nimport getStroke from 'perfect-freehand';\r\n\r\nexport type DrawingLine = {\r\n tool: string;\r\n points: number[];\r\n color: string;\r\n strokeWidth: number;\r\n isSketch?: boolean;\r\n};\r\n\r\nexport type DirectDrawingCanvasHandle = {\r\n startDrawing: (pos: { x: number; y: number }) => void;\r\n draw: (pos: { x: number; y: number }) => void;\r\n stopDrawing: () => DrawingLine | null;\r\n clear: () => void;\r\n isDrawing: () => boolean;\r\n getCanvasElement: () => HTMLCanvasElement | null;\r\n};\r\n\r\ntype DirectDrawingCanvasProps = {\r\n width: number;\r\n height: number;\r\n tool: string;\r\n color: string;\r\n strokeWidth: number;\r\n isSketchMode: boolean;\r\n style?: React.CSSProperties;\r\n};\r\n\r\nconst DirectDrawingCanvas = forwardRef<DirectDrawingCanvasHandle, DirectDrawingCanvasProps>(\r\n ({ width, height, tool, color, strokeWidth, isSketchMode, style }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const isDrawingRef = useRef(false);\r\n const pointsRef = useRef<{ x: number; y: number }[]>([]);\r\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\r\n\r\n const toolRef = useRef(tool);\r\n const colorRef = useRef(color);\r\n const strokeWidthRef = useRef(strokeWidth);\r\n const isSketchModeRef = useRef(isSketchMode);\r\n\r\n useEffect(() => {\r\n toolRef.current = tool;\r\n colorRef.current = color;\r\n strokeWidthRef.current = strokeWidth;\r\n isSketchModeRef.current = isSketchMode;\r\n }, [tool, color, strokeWidth, isSketchMode]);\r\n\r\n const clearCanvas = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n }, []);\r\n\r\n const redrawLine = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n const points = pointsRef.current;\r\n if (!canvas || points.length < 1) return;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n const isEraser = toolRef.current === 'eraser';\r\n if (isEraser) {\r\n ctx.globalCompositeOperation = 'destination-out';\r\n ctx.fillStyle = 'rgba(0,0,0,1)';\r\n } else {\r\n ctx.globalCompositeOperation = 'source-over';\r\n ctx.fillStyle = colorRef.current;\r\n }\r\n if (points.length === 1) {\r\n ctx.beginPath();\r\n ctx.arc(points[0].x, points[0].y, strokeWidthRef.current / 2, 0, Math.PI * 2);\r\n ctx.fill();\r\n return;\r\n }\r\n\r\n const stroke = getStroke(points, {\r\n size: strokeWidthRef.current,\r\n thinning: 0.5,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n simulatePressure: true,\r\n easing: (t) => t,\r\n start: { taper: 0, cap: true },\r\n end: { taper: 0, cap: true },\r\n });\r\n\r\n if (stroke.length < 2) return;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(stroke[0][0], stroke[0][1]);\r\n\r\n for (let i = 1; i < stroke.length; i++) {\r\n ctx.lineTo(stroke[i][0], stroke[i][1]);\r\n }\r\n\r\n ctx.closePath();\r\n ctx.fill();\r\n }, []);\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n startDrawing: (pos: { x: number; y: number }) => {\r\n isDrawingRef.current = true;\r\n pointsRef.current = [{ x: pos.x, y: pos.y }];\r\n lastPointRef.current = pos;\r\n\r\n redrawLine();\r\n },\r\n\r\n draw: (pos: { x: number; y: number }) => {\r\n if (!isDrawingRef.current || !lastPointRef.current) return;\r\n\r\n const dx = pos.x - lastPointRef.current.x;\r\n const dy = pos.y - lastPointRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance < 2) return;\r\n\r\n pointsRef.current.push({ x: pos.x, y: pos.y });\r\n lastPointRef.current = pos;\r\n\r\n redrawLine();\r\n },\r\n\r\n stopDrawing: () => {\r\n if (!isDrawingRef.current) return null;\r\n\r\n isDrawingRef.current = false;\r\n\r\n if (pointsRef.current.length < 2) {\r\n pointsRef.current = [];\r\n lastPointRef.current = null;\r\n clearCanvas();\r\n return null;\r\n }\r\n\r\n const stroke = getStroke(pointsRef.current, {\r\n size: strokeWidthRef.current,\r\n thinning: 0.5,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n simulatePressure: true,\r\n easing: (t) => t,\r\n start: { taper: 0, cap: true },\r\n end: { taper: 0, cap: true },\r\n });\r\n\r\n const flatPoints = stroke.flatMap((point) => [point[0], point[1]]);\r\n\r\n const line: DrawingLine = {\r\n tool: toolRef.current,\r\n points: flatPoints,\r\n color: colorRef.current,\r\n strokeWidth: strokeWidthRef.current,\r\n isSketch: true,\r\n };\r\n\r\n pointsRef.current = [];\r\n lastPointRef.current = null;\r\n clearCanvas();\r\n\r\n return line;\r\n },\r\n\r\n clear: () => {\r\n clearCanvas();\r\n pointsRef.current = [];\r\n lastPointRef.current = null;\r\n isDrawingRef.current = false;\r\n },\r\n\r\n isDrawing: () => isDrawingRef.current,\r\n\r\n getCanvasElement: () => canvasRef.current,\r\n }),\r\n [clearCanvas, redrawLine]\r\n );\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n canvas.width = width;\r\n canvas.height = height;\r\n }, [width, height]);\r\n\r\n return (\r\n <canvas\r\n ref={canvasRef}\r\n width={width}\r\n height={height}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n ...style,\r\n }}\r\n />\r\n );\r\n }\r\n);\r\n\r\nDirectDrawingCanvas.displayName = 'DirectDrawingCanvas';\r\n\r\nexport default DirectDrawingCanvas;\r\n","import { useRef, useCallback, useEffect } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { updateImage, selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\ntype ImageElement = {\r\n id: string;\r\n src: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n draggable: boolean;\r\n};\r\n\r\nexport const useImageHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const images = currentSlide?.images || [];\r\n const imageRefs = useRef<Map<string, Konva.Image>>(new Map());\r\n const loadedImagesRef = useRef<Map<string, HTMLImageElement>>(new Map());\r\n const previousImageIdsRef = useRef<Set<string>>(new Set());\r\n\r\n useEffect(() => {\r\n const currentImageIds = new Set(images.map((img) => img.id));\r\n\r\n previousImageIdsRef.current.forEach((id) => {\r\n if (!currentImageIds.has(id)) {\r\n const cachedImage = loadedImagesRef.current.get(id);\r\n if (cachedImage) {\r\n cachedImage.src = '';\r\n loadedImagesRef.current.delete(id);\r\n }\r\n imageRefs.current.delete(id);\r\n }\r\n });\r\n\r\n previousImageIdsRef.current = currentImageIds;\r\n }, [images]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n loadedImagesRef.current.forEach((img) => {\r\n img.src = '';\r\n });\r\n loadedImagesRef.current.clear();\r\n imageRefs.current.clear();\r\n };\r\n }, []);\r\n\r\n const getLoadedImage = useCallback((img: ImageElement) => {\r\n if (loadedImagesRef.current.has(img.id)) {\r\n return loadedImagesRef.current.get(img.id);\r\n }\r\n\r\n const image = new window.Image();\r\n image.src = img.src;\r\n loadedImagesRef.current.set(img.id, image);\r\n return image;\r\n }, []);\r\n\r\n const handleDragEnd = useCallback(\r\n (e: KonvaEventObject<Event>, onUpdate?: () => void) => {\r\n const node = e.target;\r\n const imageId = node.id();\r\n const image = images.find((img) => img.id === imageId);\r\n\r\n if (image) {\r\n dispatch(\r\n updateImage({\r\n id: imageId,\r\n x: node.x(),\r\n y: node.y(),\r\n width: node.width(),\r\n height: node.height(),\r\n rotation: node.rotation(),\r\n })\r\n );\r\n onUpdate?.();\r\n }\r\n },\r\n [images, dispatch]\r\n );\r\n\r\n const handleImageTransformEnd = useCallback(\r\n (imageId: string, e: KonvaEventObject<Event>) => {\r\n const group = e.target;\r\n const imageNode = imageRefs.current.get(imageId);\r\n\r\n if (!imageNode) {\r\n console.error('❌ Image node not found for id:', imageId);\r\n return;\r\n }\r\n\r\n const scaleX = group.scaleX();\r\n const scaleY = group.scaleY();\r\n const rotation = group.rotation();\r\n\r\n const currentWidth = imageNode.width();\r\n const currentHeight = imageNode.height();\r\n const newWidth = Math.max(5, currentWidth * scaleX);\r\n const newHeight = Math.max(5, currentHeight * scaleY);\r\n\r\n group.scaleX(1);\r\n group.scaleY(1);\r\n\r\n imageNode.width(newWidth);\r\n imageNode.height(newHeight);\r\n\r\n dispatch(\r\n updateImage({\r\n id: imageId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: group.x(),\r\n y: group.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n group.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n images,\r\n getLoadedImage,\r\n imageRefs,\r\n handleDragEnd,\r\n handleImageTransformEnd,\r\n };\r\n};\r\n","import { useSelector } from 'react-redux';\r\nimport { selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport { useCallback, useMemo, useRef } from 'react';\r\nimport { updateMultipleChoice } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useDispatch } from 'react-redux';\r\nimport Konva from 'konva';\r\n\r\nexport const useMcqHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const mcqRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n const multipleChoice = useMemo(() => {\r\n return currentSlide?.multipleChoices || [];\r\n }, [currentSlide?.multipleChoices]);\r\n\r\n const handleMcqTransform = useCallback(\r\n (mcqId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n\r\n const newWidth = Math.max(5, node.width() * scaleX);\r\n const newHeight = Math.max(5, node.height() * scaleY);\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n node.width(newWidth);\r\n node.height(newHeight);\r\n\r\n dispatch(\r\n updateMultipleChoice({\r\n id: mcqId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: node.x(),\r\n y: node.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n node.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handleDragEnd = (e: KonvaEventObject<DragEvent>, mcqId: string) => {\r\n dispatch(\r\n updateMultipleChoice({\r\n id: mcqId,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n };\r\n\r\n return {\r\n multipleChoice,\r\n handleMcqTransform,\r\n mcqRefs,\r\n handleDragEnd,\r\n };\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useSelector } from 'react-redux';\r\nimport { useRef } from 'react';\r\nimport { selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { useMemo } from 'react';\r\nimport { updateTrueFalse } from '@/store/slices/canvasSlice';\r\nimport { useCallback } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\n\r\nexport const useTrueFalseHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const trueFalseRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n const trueFalse = useMemo(() => {\r\n return currentSlide?.trueFalses || [];\r\n }, [currentSlide?.trueFalses]);\r\n\r\n const handleTrueFalseTransform = useCallback(\r\n (trueFalseId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n\r\n const newWidth = Math.max(5, node.width() * scaleX);\r\n const newHeight = Math.max(5, node.height() * scaleY);\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n node.width(newWidth);\r\n node.height(newHeight);\r\n\r\n dispatch(\r\n updateTrueFalse({\r\n id: trueFalseId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: node.x(),\r\n y: node.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n node.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handleTrueFalseDragEnd = (e: KonvaEventObject<DragEvent>, trueFalseId: string) => {\r\n dispatch(\r\n updateTrueFalse({\r\n id: trueFalseId,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n };\r\n\r\n return {\r\n trueFalse,\r\n handleTrueFalseTransform,\r\n handleTrueFalseDragEnd,\r\n trueFalseRefs,\r\n };\r\n};\r\n","import { useRef, useCallback } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { updateVideo, toggleVideoPlaying, selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\nexport const useVideoHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const videos = currentSlide?.videos || [];\r\n const videoRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n\r\n const handleVideoClick = useCallback(\r\n (videoId: string) => {\r\n dispatch(toggleVideoPlaying(videoId));\r\n },\r\n [dispatch]\r\n );\r\n\r\n const handleVideoDragEnd = useCallback(\r\n (videoId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n dispatch(\r\n updateVideo({\r\n id: videoId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handleVideoTransformEnd = useCallback(\r\n (videoId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n\r\n const newWidth = Math.max(5, node.width() * scaleX);\r\n const newHeight = Math.max(5, node.height() * scaleY);\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n node.width(newWidth);\r\n node.height(newHeight);\r\n\r\n dispatch(\r\n updateVideo({\r\n id: videoId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: node.x(),\r\n y: node.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n node.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n videos,\r\n videoRefs,\r\n handleVideoClick,\r\n handleVideoDragEnd,\r\n handleVideoTransformEnd,\r\n };\r\n};\r\n","import { useSelector, useDispatch } from '@/store/hooks';\r\nimport { selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { useRef, useState } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useCallback } from 'react';\r\nimport { updateShape } from '@/store/slices/canvasSlice';\r\nimport type { Shape } from '@/store/slices/canvasSlice';\r\n\r\ntype ShapeRefs = Map<string, Konva.Shape>;\r\n\r\nexport const useShapeHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const shapes = currentSlide?.shapes || [];\r\n const shapeRefs = useRef<ShapeRefs>(new Map());\r\n const loadedShapesRef = useRef<Map<string, HTMLImageElement>>(new Map());\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Shape drag handler\r\n const handleShapeDragEnd = useCallback(\r\n (shapeId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n dispatch(\r\n updateShape({\r\n id: shapeId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handleShapeResizeEnd = useCallback(\r\n (shapeId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target as Konva.Shape;\r\n const shape = shapes.find((s) => s.id === shapeId);\r\n\r\n if (!shape) return;\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const shapeType = shape.type?.toLowerCase();\r\n\r\n // For arrow and line, don't reset scale - we'll store it differently\r\n const isLineOrArrow = shapeType === 'arrow' || shapeType === 'line';\r\n\r\n if (!isLineOrArrow) {\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n }\r\n\r\n const updates: Partial<Shape> & { id: string } = {\r\n id: shapeId,\r\n x: node.x(),\r\n y: node.y(),\r\n width: Math.max(5, node.width() * scaleX),\r\n height: Math.max(5, node.height() * scaleY),\r\n rotation: node.rotation(),\r\n };\r\n\r\n switch (shapeType) {\r\n case 'circle':\r\n updates.radius = (node.width() * scaleX) / 2;\r\n break;\r\n case 'star':\r\n updates.innerRadius = (node.width() * scaleX) / 4;\r\n updates.outerRadius = (node.width() * scaleX) / 2;\r\n break;\r\n case 'triangle':\r\n updates.radius = (node.width() * scaleX) / 2;\r\n break;\r\n case 'ellipse':\r\n updates.radiusX = (node.width() * scaleX) / 2;\r\n updates.radiusY = (node.height() * scaleY) / 2;\r\n break;\r\n case 'polygon':\r\n updates.radius = (node.width() * scaleX) / 2;\r\n break;\r\n case 'ring':\r\n const ringScale = scaleX;\r\n updates.innerRadius = shape.innerRadius && shape.innerRadius * ringScale;\r\n updates.outerRadius = shape.outerRadius && shape.outerRadius * ringScale;\r\n break;\r\n case 'wedge':\r\n updates.radius = shape.radius && shape.radius * scaleX;\r\n break;\r\n case 'arc':\r\n updates.innerRadius = shape.innerRadius && shape.innerRadius * scaleX;\r\n updates.outerRadius = shape.outerRadius && shape.outerRadius * scaleX;\r\n break;\r\n case 'arrow':\r\n case 'line': {\r\n // For arrow and line, store the scale values directly from the node\r\n // The node already has the correct scale after transform\r\n updates.scaleX = scaleX;\r\n updates.scaleY = scaleY;\r\n // Don't update width/height for line-based shapes as they use points\r\n delete updates.width;\r\n delete updates.height;\r\n break;\r\n }\r\n }\r\n\r\n dispatch(updateShape(updates));\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate, shapes]\r\n );\r\n\r\n return {\r\n shapes,\r\n shapeRefs,\r\n isDragging,\r\n loadedShapesRef,\r\n handleShapeDragEnd,\r\n handleShapeResizeEnd,\r\n };\r\n};\r\n","import { useRef, useState } from 'react';\r\nimport { useSelector } from '@/store/hooks';\r\nimport { useAppDispatch } from '@/store/hooks';\r\nimport {\r\n updateText,\r\n saveToHistory,\r\n selectCurrentSlide,\r\n setEditingTextId as setReduxEditingTextId,\r\n} from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\nexport const useTextHandling = (\r\n updatePreview: () => void,\r\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\r\n) => {\r\n const dispatch = useAppDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const texts = currentSlide?.texts || [];\r\n const textRefs = useRef<Map<string, Konva.Text>>(new Map());\r\n const [editingTextId, setEditingTextId] = useState<string | null>(null);\r\n const [editingValue, setEditingValue] = useState<string>('');\r\n\r\n const handleDragEnd = (e: Konva.KonvaEventObject<DragEvent>, id: string) => {\r\n const node = e.target;\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n updatePreview();\r\n };\r\n\r\n const handleTransformEnd = (id: string) => {\r\n const node = textRefs.current.get(id);\r\n if (!node) return;\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const text = texts.find((t) => t.id === id);\r\n if (!text) return;\r\n const fontScale = (scaleX + scaleY) / 2;\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id,\r\n x: node.x(),\r\n y: node.y(),\r\n width: Math.max(5, (text.width || 100) * scaleX),\r\n height: Math.max(5, (text.height || 50) * scaleY),\r\n fontSize: Math.round(Math.max(8, text.fontSize * fontScale)),\r\n rotation: node.rotation(),\r\n })\r\n );\r\n updatePreview();\r\n };\r\n\r\n const handleDoubleClick = (id: string) => {\r\n const text = texts.find((t) => t.id === id);\r\n if (text && !text.locked) {\r\n setEditingTextId(id);\r\n setEditingValue(text.text);\r\n }\r\n };\r\n\r\n const startEditing = (id: string) => {\r\n const text = texts.find((t) => t.id === id);\r\n if (text && !text.locked) {\r\n setEditingTextId(id);\r\n setEditingValue(text.text);\r\n }\r\n };\r\n\r\n const handleEditingChange = (value: string) => {\r\n setEditingValue(value);\r\n };\r\n\r\n const finishEditing = () => {\r\n if (editingTextId) {\r\n const textNode = textRefs.current.get(editingTextId);\r\n const text = texts.find((t) => t.id === editingTextId);\r\n\r\n dispatch(saveToHistory());\r\n\r\n const updates: {\r\n id: string;\r\n text: string;\r\n fontWeight?: string;\r\n fontStyle?: string;\r\n textDecoration?: string;\r\n width?: number;\r\n height?: number;\r\n } = {\r\n id: editingTextId,\r\n text: editingValue,\r\n };\r\n\r\n if (text) {\r\n if (text.fontWeight !== undefined) updates.fontWeight = text.fontWeight;\r\n if (text.fontStyle !== undefined) updates.fontStyle = text.fontStyle;\r\n if (text.textDecoration !== undefined) updates.textDecoration = text.textDecoration;\r\n }\r\n\r\n if (textareaRef?.current && editingValue.trim()) {\r\n const textarea = textareaRef.current;\r\n\r\n const textareaWidth = textarea.offsetWidth;\r\n const textareaHeight = textarea.offsetHeight;\r\n\r\n let scale = 1;\r\n if (textNode) {\r\n const stage = textNode.getStage();\r\n if (stage) {\r\n scale = stage.scaleX();\r\n }\r\n }\r\n\r\n const borderAndPadding = (2 + 5) * 2;\r\n const calculatedWidth = (textareaWidth - borderAndPadding) / scale;\r\n const calculatedHeight = (textareaHeight - borderAndPadding) / scale;\r\n const lineCount = editingValue.split('\\n').length;\r\n\r\n const text = texts.find((t) => t.id === editingTextId);\r\n const fontSize = text?.fontSize || 24;\r\n const lineHeight = 1.2;\r\n const minHeightForLines = lineCount * fontSize * lineHeight + 10;\r\n\r\n updates.width = Math.max(200, calculatedWidth);\r\n updates.height = Math.max(50, calculatedHeight, minHeightForLines);\r\n } else if (textNode && editingValue.trim()) {\r\n const originalText = textNode.text();\r\n const originalWidth = textNode.width();\r\n\r\n textNode.text(editingValue);\r\n textNode.width(undefined as unknown as number);\r\n\r\n const naturalWidth = textNode.width();\r\n const naturalHeight = textNode.height();\r\n\r\n textNode.text(originalText);\r\n textNode.width(originalWidth);\r\n\r\n updates.width = Math.max(200, naturalWidth + 20);\r\n updates.height = Math.max(50, naturalHeight + 20);\r\n }\r\n\r\n dispatch(updateText(updates));\r\n setEditingTextId(null);\r\n setEditingValue('');\r\n dispatch(setReduxEditingTextId(null));\r\n updatePreview();\r\n }\r\n };\r\n\r\n return {\r\n texts,\r\n textRefs,\r\n handleDragEnd,\r\n handleTransformEnd,\r\n handleDoubleClick,\r\n startEditing,\r\n editingTextId,\r\n editingValue,\r\n handleEditingChange,\r\n finishEditing,\r\n };\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectCurrentSlide } from '../slices/canvasSlice';\r\nimport { useRef } from 'react';\r\nimport { updateShortAnswer } from '../slices/canvasSlice';\r\nimport { useCallback } from 'react';\r\nimport Konva from 'konva';\r\n\r\nexport const useShortAnswerHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const shortAnswers = currentSlide?.shortAnswers || [];\r\n const saRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n\r\n const handleShortAnswerDragEnd = useCallback(\r\n (e: Konva.KonvaEventObject<DragEvent>, saId: string) => {\r\n const node = e.target;\r\n dispatch(\r\n updateShortAnswer({\r\n id: saId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n shortAnswers,\r\n saRefs,\r\n handleShortAnswerDragEnd,\r\n };\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectCurrentSlide } from '../slices/canvasSlice';\r\nimport { useRef, useMemo } from 'react';\r\nimport { updateLongAnswer } from '../slices/canvasSlice';\r\nimport { useCallback } from 'react';\r\nimport Konva from 'konva';\r\n\r\nexport const useLongAnswerHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n // const longAnswers = currentSlide?.LongAnswer || [];\r\n const longAnswers = useMemo(() => {\r\n return currentSlide?.LongAnswer || [];\r\n }, [currentSlide?.LongAnswer]);\r\n\r\n const handleLongAnswerDragEnd = useCallback(\r\n (e: Konva.KonvaEventObject<DragEvent>, laId: string) => {\r\n const node = e.target;\r\n dispatch(\r\n updateLongAnswer({\r\n id: laId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n longAnswers,\r\n handleLongAnswerDragEnd,\r\n };\r\n};\r\n","import { useRef, useCallback } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport {\r\n updateFlashcard,\r\n selectCurrentSlide,\r\n nextFlashcard,\r\n previousFlashcard,\r\n} from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\nexport const useFlashcardHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const flashcards = currentSlide?.flashcards || [];\r\n const flashcardRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n const loadedImagesRef = useRef<Map<string, HTMLImageElement>>(new Map());\r\n\r\n const getLoadedImage = useCallback((src: string, imageKey: string) => {\r\n if (loadedImagesRef.current.has(imageKey)) {\r\n return loadedImagesRef.current.get(imageKey);\r\n }\r\n\r\n const image = new window.Image();\r\n image.src = src;\r\n loadedImagesRef.current.set(imageKey, image);\r\n return image;\r\n }, []);\r\n\r\n const handleDragEnd = useCallback(\r\n (e: KonvaEventObject<Event>, onUpdate?: () => void) => {\r\n const node = e.target;\r\n const flashcardId = node.id();\r\n const flashcard = flashcards.find((fc) => fc.id === flashcardId);\r\n\r\n if (flashcard) {\r\n dispatch(\r\n updateFlashcard({\r\n id: flashcardId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n }\r\n },\r\n [flashcards, dispatch]\r\n );\r\n\r\n const handleFlashcardTransformEnd = useCallback(\r\n (flashcardId: string, e: KonvaEventObject<Event>) => {\r\n const node = e.target;\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n\r\n const newWidth = Math.max(50, node.width() * scaleX);\r\n const newHeight = Math.max(50, node.height() * scaleY);\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n node.width(newWidth);\r\n node.height(newHeight);\r\n\r\n dispatch(\r\n updateFlashcard({\r\n id: flashcardId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: node.x(),\r\n y: node.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n node.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handleNext = useCallback(\r\n (flashcardId: string) => {\r\n dispatch(nextFlashcard(flashcardId));\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handlePrevious = useCallback(\r\n (flashcardId: string) => {\r\n dispatch(previousFlashcard(flashcardId));\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n flashcards,\r\n getLoadedImage,\r\n flashcardRefs,\r\n handleDragEnd,\r\n handleFlashcardTransformEnd,\r\n handleNext,\r\n handlePrevious,\r\n };\r\n};\r\n","import { useRef, useCallback, useState, useEffect } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { updatePhotoFrame, selectCurrentSlide } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\nexport const usePhotoFrameHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const photoFrames = currentSlide?.photoFrames || [];\r\n const photoFrameRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n const [cameraStreams, setCameraStreams] = useState<Map<string, MediaStream>>(new Map());\r\n\r\n const handleDragEnd = useCallback(\r\n (e: KonvaEventObject<Event>, photoFrameId: string) => {\r\n console.log('handleDragEnd');\r\n dispatch(\r\n updatePhotoFrame({\r\n id: photoFrameId,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const handlePhotoFrameTransformEnd = useCallback(\r\n (photoFrameId: string, e: KonvaEventObject<Event>) => {\r\n const group = e.target;\r\n const scaleX = group.scaleX();\r\n const scaleY = group.scaleY();\r\n const rotation = group.rotation();\r\n\r\n const currentFrame = photoFrames.find((f) => f.id === photoFrameId);\r\n if (!currentFrame) return;\r\n\r\n const newWidth = Math.max(100, currentFrame.width * scaleX);\r\n const newHeight = Math.max(100, currentFrame.height * scaleY);\r\n\r\n group.scaleX(1);\r\n group.scaleY(1);\r\n\r\n dispatch(\r\n updatePhotoFrame({\r\n id: photoFrameId,\r\n width: newWidth,\r\n height: newHeight,\r\n x: group.x(),\r\n y: group.y(),\r\n rotation: rotation,\r\n })\r\n );\r\n\r\n group.getLayer()?.batchDraw();\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate, photoFrames]\r\n );\r\n\r\n const startCamera = useCallback(\r\n async (photoFrameId: string) => {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n video: { width: 640, height: 480 },\r\n audio: false,\r\n });\r\n\r\n setCameraStreams((prev) => {\r\n const newMap = new Map(prev);\r\n newMap.set(photoFrameId, stream);\r\n return newMap;\r\n });\r\n\r\n dispatch(\r\n updatePhotoFrame({\r\n id: photoFrameId,\r\n isCapturing: true,\r\n })\r\n );\r\n\r\n onUpdate?.();\r\n return stream;\r\n } catch (error) {\r\n console.error('Error accessing camera:', error);\r\n return null;\r\n }\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n const stopCamera = useCallback(\r\n (photoFrameId: string) => {\r\n const stream = cameraStreams.get(photoFrameId);\r\n if (stream) {\r\n stream.getTracks().forEach((track) => track.stop());\r\n setCameraStreams((prev) => {\r\n const newMap = new Map(prev);\r\n newMap.delete(photoFrameId);\r\n return newMap;\r\n });\r\n\r\n dispatch(\r\n updatePhotoFrame({\r\n id: photoFrameId,\r\n isCapturing: false,\r\n })\r\n );\r\n\r\n onUpdate?.();\r\n }\r\n },\r\n [cameraStreams, dispatch, onUpdate]\r\n );\r\n\r\n const capturePhoto = useCallback(\r\n (photoFrameId: string, videoElement: HTMLVideoElement) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = videoElement.videoWidth;\r\n canvas.height = videoElement.videoHeight;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);\r\n const dataUrl = canvas.toDataURL('image/jpeg', 0.8);\r\n\r\n dispatch(\r\n updatePhotoFrame({\r\n id: photoFrameId,\r\n capturedImageUrl: dataUrl,\r\n isCapturing: false,\r\n })\r\n );\r\n\r\n stopCamera(photoFrameId);\r\n\r\n onUpdate?.();\r\n return dataUrl;\r\n }\r\n return null;\r\n },\r\n [dispatch, stopCamera, onUpdate]\r\n );\r\n\r\n const cameraStreamsRef = useRef(cameraStreams);\r\n\r\n useEffect(() => {\r\n cameraStreamsRef.current = cameraStreams;\r\n }, [cameraStreams]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n cameraStreamsRef.current.forEach((stream) => {\r\n stream.getTracks().forEach((track) => track.stop());\r\n });\r\n };\r\n }, []);\r\n\r\n return {\r\n photoFrames,\r\n photoFrameRefs,\r\n handleDragEnd,\r\n handlePhotoFrameTransformEnd,\r\n startCamera,\r\n stopCamera,\r\n capturePhoto,\r\n cameraStreams,\r\n };\r\n};\r\n","import { useRef, useCallback, useMemo } from 'react';\r\nimport Konva from 'konva';\r\n\r\ntype RefMap<T> = Map<string, T>;\r\n\r\ntype VideoElement = {\r\n id: string;\r\n isPlaying: boolean;\r\n};\r\n\r\ntype Box = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n};\r\n\r\nexport const useTransformer = () => {\r\n const transformerRef = useRef<Konva.Transformer | null>(null);\r\n\r\n const mcqConstraints = useMemo(\r\n () => ({\r\n minWidth: 340,\r\n minHeight: 400,\r\n maxWidth: 520,\r\n maxHeight: 600,\r\n }),\r\n []\r\n );\r\n\r\n const boundBoxFunc = useCallback(\r\n (oldBox: Box, newBox: Box) => {\r\n const node = transformerRef.current?.nodes()[0];\r\n const isMcqElement = node?.name() === 'mcq-element';\r\n\r\n if (isMcqElement) {\r\n return {\r\n ...newBox,\r\n width: Math.max(mcqConstraints.minWidth, Math.min(newBox.width, mcqConstraints.maxWidth)),\r\n height: Math.max(\r\n mcqConstraints.minHeight,\r\n Math.min(newBox.height, mcqConstraints.maxHeight)\r\n ),\r\n };\r\n }\r\n return newBox;\r\n },\r\n [mcqConstraints]\r\n );\r\n\r\n const attachTransformer = useCallback(\r\n (\r\n selectedId: string | null,\r\n imageRefs: RefMap<Konva.Image>,\r\n videoRefs: RefMap<Konva.Group>,\r\n shapeRefs: RefMap<Konva.Shape>,\r\n mcqRefs: RefMap<Konva.Rect>,\r\n trueFalseRef: RefMap<Konva.Rect>,\r\n videos: VideoElement[] = []\r\n ) => {\r\n if (!transformerRef.current) return;\r\n\r\n if (selectedId) {\r\n const selectedVideo = videos.find((v) => v.id === selectedId);\r\n const isPlayingVideo = selectedVideo?.isPlaying;\r\n\r\n if (!isPlayingVideo) {\r\n const selectedNode =\r\n imageRefs.get(selectedId) ||\r\n videoRefs.get(selectedId) ||\r\n shapeRefs.get(selectedId) ||\r\n mcqRefs.get(selectedId) ||\r\n trueFalseRef.get(selectedId);\r\n\r\n if (selectedNode) {\r\n transformerRef.current.boundBoxFunc(boundBoxFunc);\r\n transformerRef.current.nodes([selectedNode]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n transformerRef.current.nodes([]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n },\r\n []\r\n );\r\n\r\n const deselectTransformer = useCallback(() => {\r\n if (transformerRef.current) {\r\n transformerRef.current.nodes([]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n }\r\n }, []);\r\n\r\n return { transformerRef, attachTransformer, deselectTransformer, boundBoxFunc };\r\n};\r\n","import { useCallback, useEffect, useRef } from 'react';\r\nimport { useAppDispatch } from './index';\r\nimport { updateSlideThumbnail } from '../slices/canvasSlice';\r\nimport Konva from 'konva';\r\n\r\nconst useDebouncedCallback = <T extends (...args: never[]) => unknown>(\r\n callback: T,\r\n delay: number\r\n) => {\r\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return useCallback(\r\n (...args: Parameters<T>) => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n timeoutRef.current = setTimeout(() => {\r\n callback(...args);\r\n }, delay);\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [delay]\r\n );\r\n};\r\n\r\nexport const useSlideThumbnail = (\r\n slideId: string,\r\n stageRef: React.RefObject<Konva.Stage | null>\r\n) => {\r\n const dispatch = useAppDispatch();\r\n const slideIdRef = useRef(slideId);\r\n\r\n useEffect(() => {\r\n slideIdRef.current = slideId;\r\n }, [slideId]);\r\n\r\n const generateThumbnail = useCallback(() => {\r\n if (!stageRef.current) return;\r\n\r\n try {\r\n const dataURL = stageRef.current.toDataURL({\r\n pixelRatio: 0.2,\r\n mimeType: 'image/jpeg',\r\n quality: 0.6,\r\n });\r\n\r\n dispatch(updateSlideThumbnail({ id: slideIdRef.current, thumbnail: dataURL }));\r\n } catch (error) {\r\n console.error('Error generating thumbnail:', error);\r\n }\r\n }, [stageRef, dispatch]);\r\n\r\n const debouncedGenerateThumbnail = useDebouncedCallback(generateThumbnail, 500);\r\n\r\n return {\r\n generateThumbnail,\r\n debouncedGenerateThumbnail,\r\n };\r\n};\r\n","import getStroke from 'perfect-freehand';\r\n\r\nexport type Point = {\r\n x: number;\r\n y: number;\r\n pressure?: number;\r\n};\r\n\r\nexport const pointsToArray = (flatPoints: number[]): Point[] => {\r\n const points: Point[] = [];\r\n for (let i = 0; i < flatPoints.length; i += 2) {\r\n points.push({\r\n x: flatPoints[i],\r\n y: flatPoints[i + 1],\r\n pressure: 0.5,\r\n });\r\n }\r\n return points;\r\n};\r\n\r\nexport const getSvgPathFromStroke = (stroke: number[][]): string => {\r\n if (!stroke.length) return '';\r\n\r\n const d = stroke.reduce(\r\n (acc, [x0, y0], i, arr) => {\r\n const [x1, y1] = arr[(i + 1) % arr.length];\r\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\r\n return acc;\r\n },\r\n ['M', ...stroke[0], 'Q']\r\n );\r\n\r\n d.push('Z');\r\n return d.join(' ');\r\n};\r\n\r\nexport const strokeToPoints = (stroke: number[][]): number[] => {\r\n return stroke.flatMap((point) => [point[0], point[1]]);\r\n};\r\n\r\nexport const generateSmoothStroke = (\r\n points: Point[],\r\n options?: {\r\n size?: number;\r\n thinning?: number;\r\n smoothing?: number;\r\n streamline?: number;\r\n simulatePressure?: boolean;\r\n }\r\n): number[] => {\r\n const stroke = getStroke(points, {\r\n size: options?.size || 8,\r\n thinning: options?.thinning || 0.5,\r\n smoothing: options?.smoothing || 0.5,\r\n streamline: options?.streamline || 0.5,\r\n simulatePressure: options?.simulatePressure !== false,\r\n easing: (t) => t,\r\n start: {\r\n taper: 0,\r\n cap: true,\r\n },\r\n end: {\r\n taper: 0,\r\n cap: true,\r\n },\r\n });\r\n\r\n return strokeToPoints(stroke);\r\n};\r\n","import { useRef, useCallback, useState } from 'react';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { addImageAnnotation } from '@/store/slices/canvasSlice';\r\nimport { generateSmoothStroke } from '@/utils/perfectFreehand';\r\n\r\ntype Line = {\r\n tool: string;\r\n points: number[];\r\n color: string;\r\n strokeWidth: number;\r\n isSketch?: boolean;\r\n};\r\n\r\nexport const useImageDrawing = (imageId: string) => {\r\n const dispatch = useDispatch();\r\n const isDrawing = useRef(false);\r\n const hasMovedWhileDrawing = useRef(false);\r\n const currentLinePoints = useRef<Array<{ x: number; y: number }>>([]);\r\n\r\n const [activeLine, setActiveLine] = useState<Line | null>(null);\r\n\r\n const tool = useSelector((state) => state.toolbar.selectedTool);\r\n const color = useSelector((state) => state.toolbar.penColor);\r\n const strokeWidth = useSelector((state) => state.toolbar.strokeWidth);\r\n const isSketchMode = useSelector((state) => state.canvas.isSketchMode);\r\n\r\n const image = useSelector((state) => {\r\n const currentSlide = state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId);\r\n return currentSlide?.images.find((img) => img.id === imageId);\r\n });\r\n\r\n const annotations = image?.annotations || [];\r\n const isDrawingMode = image?.isDrawingMode || false;\r\n const imageWidth = image?.width || 1;\r\n const imageHeight = image?.height || 1;\r\n\r\n const startDrawing = useCallback(\r\n (pos: { x: number; y: number }) => {\r\n if (tool !== 'pen' && tool !== 'eraser') {\r\n return;\r\n }\r\n\r\n isDrawing.current = true;\r\n hasMovedWhileDrawing.current = false;\r\n currentLinePoints.current = [{ x: pos.x, y: pos.y }];\r\n\r\n const normalizedX = pos.x / imageWidth;\r\n const normalizedY = pos.y / imageHeight;\r\n\r\n setActiveLine({\r\n tool: tool,\r\n points: [normalizedX, normalizedY],\r\n color,\r\n strokeWidth: strokeWidth / imageWidth,\r\n isSketch: isSketchMode,\r\n });\r\n },\r\n [tool, color, strokeWidth, isSketchMode, imageWidth, imageHeight]\r\n );\r\n\r\n const draw = useCallback(\r\n (pos: { x: number; y: number }) => {\r\n if (!isDrawing.current || !activeLine) return;\r\n\r\n hasMovedWhileDrawing.current = true;\r\n\r\n const lastPoint = currentLinePoints.current[currentLinePoints.current.length - 1];\r\n const distance = Math.sqrt(\r\n Math.pow(pos.x - lastPoint.x, 2) + Math.pow(pos.y - lastPoint.y, 2)\r\n );\r\n\r\n if (distance < 2) return;\r\n\r\n currentLinePoints.current.push({ x: pos.x, y: pos.y });\r\n\r\n let newPoints: number[];\r\n\r\n if (isSketchMode) {\r\n const smoothPoints = generateSmoothStroke(currentLinePoints.current, {\r\n size: strokeWidth * 2,\r\n thinning: 0.6,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n simulatePressure: true,\r\n });\r\n newPoints = smoothPoints.map((p, i) => (i % 2 === 0 ? p / imageWidth : p / imageHeight));\r\n } else {\r\n const normalizedX = pos.x / imageWidth;\r\n const normalizedY = pos.y / imageHeight;\r\n newPoints = [...activeLine.points, normalizedX, normalizedY];\r\n }\r\n\r\n setActiveLine((prev) => (prev ? { ...prev, points: newPoints } : null));\r\n },\r\n [isSketchMode, strokeWidth, activeLine, imageWidth, imageHeight]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n if (!isDrawing.current) return;\r\n\r\n if (activeLine && activeLine.points.length > 0) {\r\n dispatch(addImageAnnotation({ imageId, line: activeLine }));\r\n }\r\n\r\n setActiveLine(null);\r\n isDrawing.current = false;\r\n hasMovedWhileDrawing.current = false;\r\n currentLinePoints.current = [];\r\n }, [dispatch, imageId, activeLine]);\r\n\r\n return {\r\n annotations,\r\n activeLine,\r\n isDrawingMode,\r\n startDrawing,\r\n draw,\r\n stopDrawing,\r\n tool,\r\n };\r\n};\r\n","'use client';\r\n\r\nimport { memo, useEffect } from 'react';\r\nimport { Group, Image as KonvaImage, Line } from 'react-konva';\r\n\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { useImageDrawing } from '@/store/hooks/useImageDrawing';\r\n\r\ntype Line = {\r\n tool: string;\r\n points: number[];\r\n color: string;\r\n strokeWidth: number;\r\n isSketch?: boolean;\r\n};\r\n\r\ntype ImageElement = {\r\n id: string;\r\n src: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n draggable: boolean;\r\n annotations?: Line[];\r\n isDrawingMode?: boolean;\r\n};\r\n\r\ntype KonvaImageWithCleanup = Konva.Image & {\r\n _contextMenuCleanup?: () => void;\r\n};\r\n\r\ntype ImageLayerProps = {\r\n images: ImageElement[];\r\n getLoadedImage: (img: ImageElement) => HTMLImageElement | undefined;\r\n imageRefs: React.MutableRefObject<Map<string, Konva.Image>>;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransform: (imageId: string, e: KonvaEventObject<Event>) => void;\r\n onSelect: (id: string) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nconst ImageWithDrawing = memo(\r\n ({\r\n img,\r\n loadedImage,\r\n imageRefs,\r\n onDragEnd,\r\n onTransform,\r\n onSelect,\r\n onContextMenu,\r\n }: {\r\n img: ImageElement;\r\n loadedImage: HTMLImageElement;\r\n imageRefs: React.MutableRefObject<Map<string, Konva.Image>>;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransform: (imageId: string, e: KonvaEventObject<Event>) => void;\r\n onSelect: (id: string) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n }) => {\r\n const { annotations, activeLine, isDrawingMode, startDrawing, draw, stopDrawing, tool } =\r\n useImageDrawing(img.id);\r\n\r\n // Sync Konva node dimensions with Redux state whenever they change\r\n useEffect(() => {\r\n const imageNode = imageRefs.current.get(img.id);\r\n if (imageNode) {\r\n // Force the Konva node to match Redux dimensions\r\n if (imageNode.width() !== img.width || imageNode.height() !== img.height) {\r\n console.log('🔄 Syncing dimensions from Redux to Konva:', {\r\n id: img.id,\r\n reduxWidth: img.width,\r\n reduxHeight: img.height,\r\n konvaWidth: imageNode.width(),\r\n konvaHeight: imageNode.height(),\r\n });\r\n imageNode.width(img.width);\r\n imageNode.height(img.height);\r\n imageNode.getLayer()?.batchDraw();\r\n }\r\n }\r\n }, [img.id, img.width, img.height, imageRefs]);\r\n\r\n // DISABLE image-specific drawing - always use canvas drawing instead\r\n const shouldEnableDrawing = false; // tool === 'pen' || tool === 'eraser';\r\n\r\n // Add global mouse up listener to stop drawing even if mouse is released outside image\r\n useEffect(() => {\r\n if (!shouldEnableDrawing) return;\r\n\r\n const handleGlobalMouseUp = () => {\r\n stopDrawing();\r\n };\r\n\r\n const handleGlobalTouchEnd = () => {\r\n stopDrawing();\r\n };\r\n\r\n window.addEventListener('mouseup', handleGlobalMouseUp);\r\n window.addEventListener('touchend', handleGlobalTouchEnd);\r\n\r\n return () => {\r\n window.removeEventListener('mouseup', handleGlobalMouseUp);\r\n window.removeEventListener('touchend', handleGlobalTouchEnd);\r\n };\r\n }, [stopDrawing, shouldEnableDrawing]);\r\n\r\n const handleMouseDown = (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n // Stop event from reaching Stage handlers immediately when drawing\r\n if (shouldEnableDrawing) {\r\n e.cancelBubble = true;\r\n e.evt.stopPropagation();\r\n e.evt.preventDefault();\r\n }\r\n\r\n if (!shouldEnableDrawing) {\r\n // Normal mode: allow selection\r\n onSelect(img.id);\r\n return;\r\n }\r\n\r\n // Drawing mode: start drawing\r\n // Get the image node (not the group) to get proper relative coordinates\r\n const imageNode = e.currentTarget;\r\n const transform = imageNode.getAbsoluteTransform().copy();\r\n const stage = imageNode.getStage();\r\n const pos = stage?.getPointerPosition();\r\n\r\n if (pos) {\r\n // Invert the transform to convert stage coordinates to image local coordinates\r\n transform.invert();\r\n const relativePos = transform.point(pos);\r\n startDrawing(relativePos);\r\n }\r\n };\r\n\r\n const handleMouseMove = (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n if (!shouldEnableDrawing) return;\r\n\r\n // Get the image node to get proper relative coordinates\r\n const imageNode = e.currentTarget;\r\n const transform = imageNode.getAbsoluteTransform().copy();\r\n const stage = imageNode.getStage();\r\n const pos = stage?.getPointerPosition();\r\n\r\n if (pos) {\r\n // Invert the transform to convert stage coordinates to image local coordinates\r\n transform.invert();\r\n const relativePos = transform.point(pos);\r\n draw(relativePos);\r\n }\r\n e.cancelBubble = true;\r\n };\r\n\r\n const handleMouseUp = (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n if (!shouldEnableDrawing) return;\r\n stopDrawing();\r\n e.cancelBubble = true;\r\n };\r\n\r\n return (\r\n <Group listening={tool !== 'pen' && tool !== 'eraser'}>\r\n <KonvaImage\r\n id={img.id}\r\n ref={(node) => {\r\n if (node) {\r\n imageRefs.current.set(img.id, node);\r\n\r\n // Force the Konva node to use Redux dimensions, not natural image dimensions\r\n node.width(img.width);\r\n node.height(img.height);\r\n node.getLayer()?.batchDraw();\r\n\r\n // Add right-click listener to the Konva node\r\n const konvaNode = node.getStage()?.container();\r\n if (konvaNode) {\r\n const handleContextMenuEvent = (e: MouseEvent) => {\r\n const mousePos = node.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const imageRect = {\r\n x: img.x,\r\n y: img.y,\r\n width: img.width,\r\n height: img.height,\r\n };\r\n // Check if right-click is within image bounds\r\n if (\r\n mousePos.x >= imageRect.x &&\r\n mousePos.x <= imageRect.x + imageRect.width &&\r\n mousePos.y >= imageRect.y &&\r\n mousePos.y <= imageRect.y + imageRect.height\r\n ) {\r\n const reactEvent = e as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent, img.id, 'image');\r\n }\r\n }\r\n };\r\n konvaNode.addEventListener('contextmenu', handleContextMenuEvent);\r\n // Store cleanup function\r\n (node as KonvaImageWithCleanup)._contextMenuCleanup = () => {\r\n konvaNode.removeEventListener('contextmenu', handleContextMenuEvent);\r\n };\r\n }\r\n } else {\r\n // Cleanup event listener\r\n const existingNode = imageRefs.current.get(img.id) as\r\n | KonvaImageWithCleanup\r\n | undefined;\r\n if (existingNode?._contextMenuCleanup) {\r\n existingNode._contextMenuCleanup();\r\n }\r\n imageRefs.current.delete(img.id);\r\n }\r\n }}\r\n rotation={img.rotation}\r\n draggable={tool !== 'pen' && tool !== 'eraser'}\r\n onDragEnd={onDragEnd}\r\n onTransformEnd={(e) => onTransform(img.id, e)}\r\n image={loadedImage}\r\n x={img.x}\r\n y={img.y}\r\n width={img.width}\r\n height={img.height}\r\n {...(tool !== 'pen' && tool !== 'eraser'\r\n ? {\r\n onClick: handleMouseDown,\r\n onTap: handleMouseDown,\r\n onMouseDown: handleMouseDown,\r\n onTouchStart: handleMouseDown,\r\n onMouseMove: handleMouseMove,\r\n onTouchMove: handleMouseMove,\r\n onMouseUp: handleMouseUp,\r\n onTouchEnd: handleMouseUp,\r\n }\r\n : {})}\r\n />\r\n {/* Render annotations */}\r\n {annotations?.map((line, i) => {\r\n // Convert normalized coordinates (0-1) back to pixels\r\n const pixelPoints = line.points.map((p, idx) =>\r\n idx % 2 === 0 ? p * img.width + img.x : p * img.height + img.y\r\n );\r\n // Convert normalized stroke width back to pixels\r\n const pixelStrokeWidth = line.strokeWidth * img.width;\r\n\r\n return (\r\n <Line\r\n key={i}\r\n points={pixelPoints}\r\n stroke={line.tool === 'eraser' ? 'white' : line.color}\r\n strokeWidth={pixelStrokeWidth}\r\n tension={0.5}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n globalCompositeOperation={line.tool === 'eraser' ? 'destination-out' : 'source-over'}\r\n fill={line.isSketch ? line.color : undefined}\r\n closed={line.isSketch}\r\n listening={false}\r\n />\r\n );\r\n })}\r\n {/* Render active line being drawn - uses local state, not Redux */}\r\n {activeLine && (\r\n <Line\r\n key=\"active\"\r\n points={activeLine.points.map((p, idx) =>\r\n idx % 2 === 0 ? p * img.width + img.x : p * img.height + img.y\r\n )}\r\n stroke={activeLine.tool === 'eraser' ? 'white' : activeLine.color}\r\n strokeWidth={activeLine.strokeWidth * img.width}\r\n tension={0.5}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n globalCompositeOperation={\r\n activeLine.tool === 'eraser' ? 'destination-out' : 'source-over'\r\n }\r\n fill={activeLine.isSketch ? activeLine.color : undefined}\r\n closed={activeLine.isSketch}\r\n listening={false}\r\n />\r\n )}\r\n </Group>\r\n );\r\n }\r\n);\r\n\r\nImageWithDrawing.displayName = 'ImageWithDrawing';\r\n\r\nexport const ImageLayer = memo(\r\n ({\r\n images,\r\n getLoadedImage,\r\n imageRefs,\r\n onDragEnd,\r\n onTransform,\r\n onSelect,\r\n onContextMenu,\r\n }: ImageLayerProps) => {\r\n return (\r\n <>\r\n {images.map((img) => {\r\n const loadedImage = getLoadedImage(img);\r\n return loadedImage ? (\r\n <ImageWithDrawing\r\n key={img.id}\r\n img={img}\r\n loadedImage={loadedImage}\r\n imageRefs={imageRefs}\r\n onDragEnd={onDragEnd}\r\n onTransform={onTransform}\r\n onSelect={onSelect}\r\n onContextMenu={onContextMenu}\r\n />\r\n ) : null;\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nImageLayer.displayName = 'ImageLayer';\r\n","'use client';\r\nimport React, { useRef } from 'react';\r\nimport { Group, Rect } from 'react-konva';\r\nimport { Html } from 'react-konva-utils';\r\nimport { useDispatch } from '@/store/hooks';\r\nimport { toggleVideoPlaying } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\n\r\ntype VideoPlayerProps = {\r\n src: string;\r\n x: number;\r\n id: string;\r\n y: number;\r\n width: number;\r\n height: number;\r\n isSelected: boolean;\r\n onTransformEnd: (e: KonvaEventObject<Event>) => void;\r\n onDragEnd: (e: KonvaEventObject<Event>) => void;\r\n rotation: number;\r\n};\r\n\r\nconst VideoPlayer: React.FC<VideoPlayerProps> = ({\r\n src,\r\n x,\r\n id,\r\n y,\r\n width,\r\n height,\r\n isSelected,\r\n rotation = 0,\r\n onTransformEnd,\r\n onDragEnd,\r\n}) => {\r\n const dispatch = useDispatch();\r\n const videoRef = useRef<HTMLVideoElement | null>(null);\r\n\r\n const handleVideoClick = (id: string) => {\r\n dispatch(toggleVideoPlaying(id));\r\n };\r\n\r\n return (\r\n <Group\r\n draggable\r\n x={x}\r\n y={y}\r\n width={width}\r\n height={height}\r\n rotation={rotation}\r\n onDragEnd={onDragEnd}\r\n onTransformEnd={onTransformEnd}\r\n >\r\n <Rect\r\n width={width}\r\n height={height}\r\n fill=\"black\"\r\n stroke={isSelected ? '#4A90E2' : 'transparent'}\r\n strokeWidth={2}\r\n />\r\n <Html\r\n divProps={{\r\n style: {\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n overflow: 'hidden',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n }}\r\n >\r\n <video\r\n ref={videoRef}\r\n src={src}\r\n controls\r\n autoPlay\r\n onClick={() => handleVideoClick(id)}\r\n onSeeking={(e) => e.stopPropagation()}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain',\r\n pointerEvents: 'auto',\r\n }}\r\n />\r\n </Html>\r\n </Group>\r\n );\r\n};\r\n\r\nexport default VideoPlayer;\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Group, Image as KonvaImage, Circle, RegularPolygon } from 'react-konva';\r\nimport { VideoElement } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype VideoThumbnailProps = {\r\n video: VideoElement;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransformEnd: (e: KonvaEventObject<Event>) => void;\r\n onContextMenu: (e: React.MouseEvent) => void;\r\n nodeRef: (node: Konva.Group | null) => void;\r\n};\r\n\r\ntype KonvaNodeWithCleanup = Konva.Group & {\r\n _contextMenuCleanup?: () => void;\r\n};\r\n\r\nconst VideoThumbnail: React.FC<VideoThumbnailProps> = ({\r\n video,\r\n isSelected,\r\n onClick,\r\n onDragEnd,\r\n onTransformEnd,\r\n onContextMenu,\r\n nodeRef,\r\n}) => {\r\n const [thumbnailImage, setThumbnailImage] = useState<HTMLImageElement | null>(null);\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n\r\n useEffect(() => {\r\n if (video.thumbnailDataUrl) {\r\n const img = new window.Image();\r\n img.src = video.thumbnailDataUrl;\r\n img.onload = () => {\r\n setThumbnailImage(img);\r\n };\r\n }\r\n }, [video.thumbnailDataUrl]);\r\n\r\n if (!thumbnailImage) return null;\r\n\r\n const playButtonX = video.width / 2;\r\n const playButtonY = video.height / 2;\r\n const baseRadius = Math.min(video.width, video.height) * 0.08;\r\n const playButtonRadius = Math.max(40, Math.min(baseRadius, 80));\r\n\r\n return (\r\n <Group\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={video.x}\r\n y={video.y}\r\n rotation={video.rotation}\r\n width={video.width}\r\n height={video.height}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: onDragEnd,\r\n onTransformEnd: onTransformEnd,\r\n }\r\n : {})}\r\n ref={(node) => {\r\n nodeRef(node);\r\n if (node) {\r\n const konvaNode = node.getStage()?.container();\r\n if (konvaNode) {\r\n const handleContextMenuEvent = (e: MouseEvent) => {\r\n const mousePos = node.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const videoRect = {\r\n x: video.x,\r\n y: video.y,\r\n width: video.width,\r\n height: video.height,\r\n };\r\n if (\r\n mousePos.x >= videoRect.x &&\r\n mousePos.x <= videoRect.x + videoRect.width &&\r\n mousePos.y >= videoRect.y &&\r\n mousePos.y <= videoRect.y + videoRect.height\r\n ) {\r\n const reactEvent = e as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent);\r\n }\r\n }\r\n };\r\n konvaNode.addEventListener('contextmenu', handleContextMenuEvent);\r\n (node as KonvaNodeWithCleanup)._contextMenuCleanup = () => {\r\n konvaNode.removeEventListener('contextmenu', handleContextMenuEvent);\r\n };\r\n }\r\n } else {\r\n // Cleanup handled by nodeRef\r\n }\r\n }}\r\n >\r\n <KonvaImage\r\n image={thumbnailImage}\r\n width={video.width}\r\n height={video.height}\r\n listening={!isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onClick: onClick,\r\n onTap: onClick,\r\n }\r\n : {})}\r\n shadowColor=\"black\"\r\n shadowBlur={isSelected ? 10 : 0}\r\n shadowOpacity={isSelected ? 0.3 : 0}\r\n />\r\n <Circle\r\n x={playButtonX}\r\n y={playButtonY}\r\n radius={playButtonRadius}\r\n fill=\"white\"\r\n listening={!isDrawingTool}\r\n shadowColor=\"black\"\r\n shadowBlur={20}\r\n shadowOpacity={0.4}\r\n shadowOffsetX={0}\r\n shadowOffsetY={2}\r\n {...(!isDrawingTool\r\n ? {\r\n onClick: onClick,\r\n onTap: onClick,\r\n }\r\n : {})}\r\n />\r\n <Circle\r\n x={playButtonX}\r\n y={playButtonY}\r\n radius={playButtonRadius * 0.88}\r\n fill=\"rgba(0, 0, 0, 0.75)\"\r\n listening={!isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onClick: onClick,\r\n onTap: onClick,\r\n }\r\n : {})}\r\n />\r\n <RegularPolygon\r\n x={playButtonX + playButtonRadius * 0.1}\r\n y={playButtonY}\r\n sides={3}\r\n radius={playButtonRadius * 0.35}\r\n fill=\"white\"\r\n rotation={90}\r\n listening={!isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onClick: onClick,\r\n onTap: onClick,\r\n }\r\n : {})}\r\n />\r\n </Group>\r\n );\r\n};\r\n\r\nexport default VideoThumbnail;\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { memo } from 'react';\r\nimport VideoPlayer from '@/components/elements/VideoPlayer';\r\nimport VideoThumbnail from '@/components/elements/VideoThumbnail';\r\n\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\n\r\ntype VideoElement = {\r\n id: string;\r\n objectUrl: string;\r\n thumbnailDataUrl: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n draggable: boolean;\r\n isPlaying: boolean;\r\n isRecorded?: boolean;\r\n};\r\n\r\ntype VideoLayerProps = {\r\n videos: VideoElement[];\r\n selectedId: string | null;\r\n videoRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onVideoClick: (id: string) => void;\r\n onDragEnd: (id: string, e: KonvaEventObject<Event>) => void;\r\n onTransformEnd: (id: string, e: KonvaEventObject<Event>) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nexport const VideoLayer = memo(\r\n ({\r\n videos,\r\n selectedId,\r\n videoRefs,\r\n onVideoClick,\r\n onDragEnd,\r\n onTransformEnd,\r\n onContextMenu,\r\n }: VideoLayerProps) => {\r\n return (\r\n <>\r\n {videos.map((video) => (\r\n <React.Fragment key={video.id}>\r\n <VideoThumbnail\r\n video={video}\r\n isSelected={!video.isPlaying && selectedId === video.id}\r\n onClick={() => onVideoClick(video.id)}\r\n onDragEnd={(e) => onDragEnd(video.id, e)}\r\n onTransformEnd={(e) => onTransformEnd(video.id, e)}\r\n onContextMenu={(e) => onContextMenu(e, video.id, 'video')}\r\n nodeRef={(node) => {\r\n if (node) {\r\n videoRefs.current.set(video.id, node);\r\n } else {\r\n videoRefs.current.delete(video.id);\r\n }\r\n }}\r\n />\r\n\r\n {video.isPlaying &&\r\n (() => {\r\n let x = video.x;\r\n let y = video.y;\r\n\r\n if (video.isRecorded) {\r\n const viewportWidth =\r\n typeof window !== 'undefined' ? window.innerWidth : video.width;\r\n const viewportHeight =\r\n typeof window !== 'undefined' ? window.innerHeight : video.height;\r\n\r\n x = (viewportWidth - video.width) / 2;\r\n y = (viewportHeight - video.height) / 2;\r\n }\r\n\r\n return (\r\n <VideoPlayer\r\n id={video.id}\r\n src={video.objectUrl}\r\n x={x}\r\n y={y}\r\n width={video.width}\r\n height={video.height}\r\n isSelected={false}\r\n rotation={video.rotation}\r\n onTransformEnd={(e) => onTransformEnd(video.id, e)}\r\n onDragEnd={(e) => onDragEnd(video.id, e)}\r\n />\r\n );\r\n })()}\r\n </React.Fragment>\r\n ))}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nVideoLayer.displayName = 'VideoLayer';\r\n","import { memo } from 'react';\r\nimport {\r\n Rect,\r\n Circle,\r\n Star,\r\n RegularPolygon,\r\n Ellipse,\r\n Ring,\r\n Wedge,\r\n Arrow,\r\n Line as KonvaLine,\r\n Arc,\r\n} from 'react-konva';\r\nimport type { Shape } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype ShapeLayerProps = {\r\n shapes: Shape[];\r\n shapeRefs: React.MutableRefObject<\r\n Map<\r\n string,\r\n | Konva.Shape\r\n | Konva.Circle\r\n | Konva.Star\r\n | Konva.RegularPolygon\r\n | Konva.Rect\r\n | Konva.Ellipse\r\n | Konva.Ring\r\n | Konva.Wedge\r\n | Konva.Arrow\r\n | Konva.Line\r\n | Konva.Arc\r\n >\r\n >;\r\n handleShapeDragEnd: (shapeId: string, e: KonvaEventObject<Event>) => void;\r\n handleShapeResizeEnd: (shapeId: string, e: KonvaEventObject<Event>) => void;\r\n onSelect: (id: string) => void;\r\n handleShapeDragStart?: () => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nexport const ShapeLayer = memo(\r\n ({\r\n shapes,\r\n shapeRefs,\r\n handleShapeDragEnd,\r\n handleShapeResizeEnd,\r\n onSelect,\r\n handleShapeDragStart,\r\n onContextMenu,\r\n }: ShapeLayerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n\r\n return (\r\n <>\r\n {shapes.map((shape, i) => {\r\n const key = shape.id || i;\r\n\r\n const commonProps = {\r\n id: shape.id,\r\n x: shape.x,\r\n y: shape.y,\r\n rotation: shape.rotation,\r\n draggable: !shape.locked && !isDrawingTool,\r\n listening: !isDrawingTool,\r\n fill: shape.color || '#096B76',\r\n stroke: '#000000',\r\n strokeWidth: 2,\r\n opacity: 1,\r\n };\r\n\r\n switch (shape.type?.toLowerCase()) {\r\n case 'circle':\r\n return (\r\n <Circle\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n radius={shape.radius || shape.width / 2}\r\n width={shape.width}\r\n height={shape.width}\r\n />\r\n );\r\n\r\n case 'star':\r\n return (\r\n <Star\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n numPoints={5}\r\n innerRadius={shape.innerRadius || shape.width / 4}\r\n outerRadius={shape.outerRadius || shape.width / 2}\r\n />\r\n );\r\n\r\n case 'triangle':\r\n return (\r\n <RegularPolygon\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n sides={3}\r\n radius={shape.radius || shape.width / 2}\r\n />\r\n );\r\n\r\n case 'polygon':\r\n return (\r\n <RegularPolygon\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n sides={shape.sides || 6}\r\n radius={shape.radius || shape.width / 2}\r\n />\r\n );\r\n\r\n case 'ellipse':\r\n return (\r\n <Ellipse\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n radiusX={shape.radiusX || shape.width / 2}\r\n radiusY={shape.radiusY || shape.height / 2}\r\n />\r\n );\r\n\r\n case 'ring':\r\n return (\r\n <Ring\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n innerRadius={shape.innerRadius || shape.width / 4}\r\n outerRadius={shape.outerRadius || shape.width / 2}\r\n />\r\n );\r\n\r\n case 'wedge':\r\n return (\r\n <Wedge\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n radius={shape.radius || shape.width / 2}\r\n angle={shape.angle || 60}\r\n />\r\n );\r\n\r\n case 'arrow':\r\n return (\r\n <Arrow\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n scaleX={shape.scaleX || 1}\r\n scaleY={shape.scaleY || 1}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n points={shape.points || [0, 0, shape.width, 0]}\r\n pointerLength={shape.pointerLength || 10}\r\n pointerWidth={shape.pointerWidth || 10}\r\n stroke=\"#000000\"\r\n strokeWidth={shape.strokeWidth || 3}\r\n fill=\"transparent\"\r\n />\r\n );\r\n\r\n case 'line':\r\n return (\r\n <KonvaLine\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n scaleX={shape.scaleX || 1}\r\n scaleY={shape.scaleY || 1}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n points={shape.points || [0, 0, shape.width, 0]}\r\n stroke=\"#000000\"\r\n strokeWidth={shape.strokeWidth || 3}\r\n fill=\"transparent\"\r\n />\r\n );\r\n\r\n case 'arc':\r\n return (\r\n <Arc\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n innerRadius={shape.innerRadius || shape.width / 4}\r\n outerRadius={shape.outerRadius || shape.width / 2}\r\n angle={shape.angle || 90}\r\n />\r\n );\r\n\r\n case 'rectangle':\r\n default:\r\n return (\r\n <Rect\r\n key={key}\r\n ref={(node) => {\r\n if (node) {\r\n shapeRefs.current.set(shape.id, node);\r\n } else {\r\n shapeRefs.current.delete(shape.id);\r\n }\r\n }}\r\n {...commonProps}\r\n draggable={!shape.locked && !isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragStart: (e: KonvaEventObject<MouseEvent>) => {\r\n handleShapeDragStart?.();\r\n },\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) =>\r\n handleShapeDragEnd(shape.id, e),\r\n onTransformEnd: (e: KonvaEventObject<Event>) =>\r\n handleShapeResizeEnd(shape.id, e),\r\n onClick: () => onSelect(shape.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, shape.id, 'shape');\r\n },\r\n }\r\n : {})}\r\n width={shape.width}\r\n height={shape.height}\r\n cornerRadius={shape.type === 'rounded-rectangle' ? 10 : 0}\r\n />\r\n );\r\n }\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nShapeLayer.displayName = 'ShapeLayer';\r\n","'use client';\r\n\r\nimport { Text } from 'react-konva';\r\nimport { TextElement } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype TextLayerProps = {\r\n texts: TextElement[];\r\n textRefs: React.MutableRefObject<Map<string, Konva.Text>>;\r\n onDragEnd: (e: Konva.KonvaEventObject<DragEvent>, id: string) => void;\r\n onTransformEnd: (id: string) => void;\r\n onSelect: (id: string) => void;\r\n onContextMenu: (e: React.MouseEvent, elementId: string, elementType: 'text') => void;\r\n onDoubleClick: (id: string) => void;\r\n editingTextId: string | null;\r\n editingValue: string;\r\n onEditingChange: (value: string) => void;\r\n};\r\n\r\nexport const TextLayer = ({\r\n texts,\r\n textRefs,\r\n onDragEnd,\r\n onTransformEnd,\r\n onSelect,\r\n onContextMenu,\r\n onDoubleClick,\r\n editingTextId,\r\n}: TextLayerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n\r\n return (\r\n <>\r\n {texts.map((text) => {\r\n // Hide text while editing\r\n const isEditing = text.id === editingTextId;\r\n\r\n // Simulate bold effect for fonts that don't have bold variants\r\n const isBold = text.fontWeight === 'bold';\r\n const strokeWidth = isBold ? Math.max(1, text.fontSize / 25) : 0;\r\n\r\n return (\r\n <Text\r\n key={text.id}\r\n id={text.id}\r\n ref={(node) => {\r\n if (node) {\r\n textRefs.current.set(text.id, node);\r\n } else {\r\n textRefs.current.delete(text.id);\r\n }\r\n }}\r\n text={text.text}\r\n x={text.x}\r\n y={text.y}\r\n width={text.width}\r\n height={text.height}\r\n rotation={text.rotation}\r\n draggable={!text.locked && !isEditing && !isDrawingTool}\r\n listening={!isDrawingTool}\r\n fontSize={text.fontSize}\r\n fontFamily={text.fontFamily}\r\n fontStyle={text.fontStyle}\r\n fontWeight={text.fontWeight}\r\n textDecoration={text.textDecoration}\r\n fill={text.fill}\r\n stroke={isBold ? text.fill : undefined}\r\n strokeWidth={strokeWidth}\r\n align={text.align}\r\n wrap=\"none\"\r\n lineHeight={1.2}\r\n opacity={isEditing ? 0 : 1}\r\n visible={!isEditing}\r\n {...(!isDrawingTool\r\n ? {\r\n onClick: () => onSelect(text.id),\r\n onTap: () => onSelect(text.id),\r\n onDblClick: () => onDoubleClick(text.id),\r\n onDblTap: () => onDoubleClick(text.id),\r\n onDragEnd: (e: Konva.KonvaEventObject<DragEvent>) => onDragEnd(e, text.id),\r\n onTransformEnd: () => onTransformEnd(text.id),\r\n onContextMenu: (e: Konva.KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n const mouseEvent = e.evt as unknown as React.MouseEvent;\r\n onContextMenu(mouseEvent, text.id, 'text');\r\n },\r\n }\r\n : {})}\r\n />\r\n );\r\n })}\r\n </>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Group, Image as KonvaImage, Rect, Circle, Text, Line } from 'react-konva';\r\nimport { FlashcardElement } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\n\r\ntype FlashcardRendererProps = {\r\n flashcard: FlashcardElement;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransformEnd: (e: KonvaEventObject<Event>) => void;\r\n onContextMenu: (e: React.MouseEvent) => void;\r\n onNext: () => void;\r\n onPrevious: () => void;\r\n nodeRef: (node: Konva.Group | null) => void;\r\n};\r\n\r\ntype KonvaNodeWithCleanup = Konva.Group & {\r\n _contextMenuCleanup?: () => void;\r\n};\r\n\r\nconst FlashcardRenderer: React.FC<FlashcardRendererProps> = ({\r\n flashcard,\r\n isSelected,\r\n onClick,\r\n onDragEnd,\r\n onTransformEnd,\r\n onContextMenu,\r\n onNext,\r\n onPrevious,\r\n nodeRef,\r\n}) => {\r\n const [currentImage, setCurrentImage] = useState<HTMLImageElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (flashcard.images.length > 0 && flashcard.images[flashcard.currentIndex]) {\r\n const img = new window.Image();\r\n img.src = flashcard.images[flashcard.currentIndex];\r\n img.onload = () => {\r\n setCurrentImage(img);\r\n };\r\n }\r\n }, [flashcard.images, flashcard.currentIndex]);\r\n\r\n if (!currentImage || flashcard.images.length === 0) return null;\r\n\r\n const cornerRadius = 8;\r\n const borderWidth = 2;\r\n const buttonSize = Math.min(flashcard.width, flashcard.height) * 0.08;\r\n const buttonRadius = Math.max(16, Math.min(buttonSize, 32));\r\n const margin = 15;\r\n\r\n return (\r\n <Group\r\n id={flashcard.id}\r\n draggable={flashcard.draggable && !flashcard.locked}\r\n x={flashcard.x}\r\n y={flashcard.y}\r\n rotation={flashcard.rotation}\r\n width={flashcard.width}\r\n height={flashcard.height}\r\n onDragEnd={onDragEnd}\r\n onTransformEnd={onTransformEnd}\r\n ref={(node) => {\r\n nodeRef(node);\r\n if (node) {\r\n const konvaNode = node.getStage()?.container();\r\n if (konvaNode) {\r\n const handleContextMenuEvent = (e: MouseEvent) => {\r\n const mousePos = node.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const flashcardRect = {\r\n x: flashcard.x,\r\n y: flashcard.y,\r\n width: flashcard.width,\r\n height: flashcard.height,\r\n };\r\n if (\r\n mousePos.x >= flashcardRect.x &&\r\n mousePos.x <= flashcardRect.x + flashcardRect.width &&\r\n mousePos.y >= flashcardRect.y &&\r\n mousePos.y <= flashcardRect.y + flashcardRect.height\r\n ) {\r\n const reactEvent = e as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent);\r\n }\r\n }\r\n };\r\n konvaNode.addEventListener('contextmenu', handleContextMenuEvent);\r\n (node as KonvaNodeWithCleanup)._contextMenuCleanup = () => {\r\n konvaNode.removeEventListener('contextmenu', handleContextMenuEvent);\r\n };\r\n }\r\n }\r\n }}\r\n >\r\n <Rect\r\n width={flashcard.width}\r\n height={flashcard.height}\r\n cornerRadius={cornerRadius}\r\n fill=\"white\"\r\n shadowColor=\"black\"\r\n shadowBlur={isSelected ? 12 : 8}\r\n shadowOpacity={isSelected ? 0.3 : 0.2}\r\n shadowOffsetX={0}\r\n shadowOffsetY={2}\r\n onClick={onClick}\r\n onTap={onClick}\r\n />\r\n\r\n <Rect\r\n width={flashcard.width}\r\n height={flashcard.height}\r\n cornerRadius={cornerRadius}\r\n stroke=\"#E5E7EB\"\r\n strokeWidth={borderWidth}\r\n listening={false}\r\n />\r\n\r\n <KonvaImage\r\n x={borderWidth + 4}\r\n y={borderWidth + 4}\r\n image={currentImage}\r\n width={flashcard.width - (borderWidth + 4) * 2}\r\n height={flashcard.height - (borderWidth + 4) * 2}\r\n cornerRadius={cornerRadius - borderWidth}\r\n onClick={onClick}\r\n onTap={onClick}\r\n />\r\n\r\n <Rect\r\n x={borderWidth}\r\n y={flashcard.height - 50}\r\n width={flashcard.width - borderWidth * 2}\r\n height={50}\r\n cornerRadius={[0, 0, cornerRadius - borderWidth, cornerRadius - borderWidth]}\r\n fillLinearGradientStartPoint={{ x: 0, y: 0 }}\r\n fillLinearGradientEndPoint={{ x: 0, y: 50 }}\r\n fillLinearGradientColorStops={[0, 'rgba(255, 255, 255, 0)', 1, 'rgba(255, 255, 255, 0.95)']}\r\n listening={false}\r\n />\r\n\r\n {/* {flashcard.images.length > 1 && (\r\n <Group x={flashcard.width / 2} y={flashcard.height - 25}>\r\n {flashcard.images.map((_, index) => {\r\n const dotX = (index - (flashcard.images.length - 1) / 2) * 10;\r\n const isActive = index === flashcard.currentIndex;\r\n return (\r\n <Circle\r\n key={index}\r\n x={dotX}\r\n y={0}\r\n radius={isActive ? 4 : 3}\r\n fill={isActive ? '#3B82F6' : '#D1D5DB'}\r\n />\r\n );\r\n })}\r\n </Group>\r\n )} */}\r\n\r\n {flashcard.images.length > 1 &&\r\n (flashcard.order === 'sequential' ||\r\n (flashcard.order === 'random' &&\r\n flashcard.navigationHistory &&\r\n flashcard.navigationHistory.length > 1)) && (\r\n <Group\r\n x={margin + buttonRadius}\r\n y={flashcard.height / 2}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n onPrevious();\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n onPrevious();\r\n }}\r\n >\r\n <Circle\r\n radius={buttonRadius}\r\n fill=\"white\"\r\n shadowColor=\"black\"\r\n shadowBlur={4}\r\n shadowOpacity={0.15}\r\n />\r\n <Line\r\n points={[-4, -6, -10, 0, -4, 6]}\r\n stroke=\"#6B7280\"\r\n strokeWidth={2}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n />\r\n </Group>\r\n )}\r\n\r\n {flashcard.images.length > 1 && (\r\n <Group\r\n x={flashcard.width - margin - buttonRadius}\r\n y={flashcard.height / 2}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n onNext();\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n onNext();\r\n }}\r\n >\r\n <Circle\r\n radius={buttonRadius}\r\n fill=\"white\"\r\n shadowColor=\"black\"\r\n shadowBlur={4}\r\n shadowOpacity={0.15}\r\n />\r\n <Line\r\n points={[4, -6, 10, 0, 4, 6]}\r\n stroke=\"#6B7280\"\r\n strokeWidth={2}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n />\r\n </Group>\r\n )}\r\n\r\n <Rect\r\n x={flashcard.width - 60}\r\n y={flashcard.height - 35}\r\n width={50}\r\n height={24}\r\n cornerRadius={4}\r\n fill=\"rgba(255, 255, 255, 0.9)\"\r\n />\r\n <Text\r\n x={flashcard.width - 60}\r\n y={flashcard.height - 35}\r\n width={50}\r\n height={24}\r\n text={`${flashcard.currentIndex + 1}/${flashcard.images.length}`}\r\n fontSize={11}\r\n fontFamily=\"Arial\"\r\n fill=\"#6B7280\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n </Group>\r\n );\r\n};\r\n\r\nexport default FlashcardRenderer;\r\n","'use client';\r\n\r\nimport { memo } from 'react';\r\nimport FlashcardRenderer from '@/components/elements/FlashcardRenderer';\r\nimport { FlashcardElement } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\n\r\ntype FlashcardLayerProps = {\r\n flashcards: FlashcardElement[];\r\n flashcardRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n selectedId: string | null;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransform: (flashcardId: string, e: KonvaEventObject<Event>) => void;\r\n onSelect: (id: string) => void;\r\n onNext: (flashcardId: string) => void;\r\n onPrevious: (flashcardId: string) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'flashcard' | 'photoFrame'\r\n ) => void;\r\n};\r\n\r\nexport const FlashcardLayer = memo(\r\n ({\r\n flashcards,\r\n flashcardRefs,\r\n selectedId,\r\n onDragEnd,\r\n onTransform,\r\n onSelect,\r\n onNext,\r\n onPrevious,\r\n onContextMenu,\r\n }: FlashcardLayerProps) => {\r\n return (\r\n <>\r\n {flashcards.map((flashcard) => (\r\n <FlashcardRenderer\r\n key={flashcard.id}\r\n flashcard={flashcard}\r\n isSelected={selectedId === flashcard.id}\r\n onClick={() => onSelect(flashcard.id)}\r\n onDragEnd={onDragEnd}\r\n onTransformEnd={(e) => onTransform(flashcard.id, e)}\r\n onContextMenu={(e) => onContextMenu(e, flashcard.id, 'flashcard')}\r\n onNext={() => onNext(flashcard.id)}\r\n onPrevious={() => onPrevious(flashcard.id)}\r\n nodeRef={(node) => {\r\n if (node) {\r\n flashcardRefs.current.set(flashcard.id, node);\r\n } else {\r\n flashcardRefs.current.delete(flashcard.id);\r\n }\r\n }}\r\n />\r\n ))}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nFlashcardLayer.displayName = 'FlashcardLayer';\r\n","import { useRef, useCallback, useState } from 'react';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { addPhotoFrameAnnotation } from '@/store/slices/canvasSlice';\r\nimport { generateSmoothStroke } from '@/utils/perfectFreehand';\r\n\r\ntype Line = {\r\n tool: string;\r\n points: number[];\r\n color: string;\r\n strokeWidth: number;\r\n isSketch?: boolean;\r\n};\r\n\r\nexport const usePhotoFrameDrawing = (frameId: string) => {\r\n const dispatch = useDispatch();\r\n const isDrawing = useRef(false);\r\n const hasMovedWhileDrawing = useRef(false);\r\n const currentLinePoints = useRef<Array<{ x: number; y: number }>>([]);\r\n\r\n const [activeLine, setActiveLine] = useState<Line | null>(null);\r\n\r\n const tool = useSelector((state) => state.toolbar.selectedTool);\r\n const color = useSelector((state) => state.toolbar.penColor);\r\n const strokeWidth = useSelector((state) => state.toolbar.strokeWidth);\r\n const isSketchMode = useSelector((state) => state.canvas.isSketchMode);\r\n\r\n const frame = useSelector((state) => {\r\n const currentSlide = state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId);\r\n return currentSlide?.photoFrames.find((f) => f.id === frameId);\r\n });\r\n\r\n const annotations = frame?.annotations || [];\r\n const isDrawingMode = frame?.isDrawingMode || false;\r\n const frameWidth = frame?.width || 1;\r\n const frameHeight = frame?.height || 1;\r\n\r\n const startDrawing = useCallback(\r\n (pos: { x: number; y: number }) => {\r\n if (!isDrawingMode) return;\r\n\r\n isDrawing.current = true;\r\n hasMovedWhileDrawing.current = false;\r\n currentLinePoints.current = [{ x: pos.x, y: pos.y }];\r\n const normalizedX = pos.x / frameWidth;\r\n const normalizedY = pos.y / frameHeight;\r\n\r\n setActiveLine({\r\n tool: 'pen',\r\n points: [normalizedX, normalizedY],\r\n color,\r\n strokeWidth: strokeWidth / frameWidth,\r\n isSketch: isSketchMode,\r\n });\r\n },\r\n [isDrawingMode, color, strokeWidth, isSketchMode, frameWidth, frameHeight]\r\n );\r\n\r\n const draw = useCallback(\r\n (pos: { x: number; y: number }) => {\r\n if (!isDrawing.current || !activeLine) return;\r\n\r\n hasMovedWhileDrawing.current = true;\r\n\r\n const lastPoint = currentLinePoints.current[currentLinePoints.current.length - 1];\r\n const distance = Math.sqrt(\r\n Math.pow(pos.x - lastPoint.x, 2) + Math.pow(pos.y - lastPoint.y, 2)\r\n );\r\n if (distance < 2) return;\r\n\r\n currentLinePoints.current.push({ x: pos.x, y: pos.y });\r\n\r\n let newPoints: number[];\r\n\r\n if (isSketchMode) {\r\n const smoothPoints = generateSmoothStroke(currentLinePoints.current, {\r\n size: strokeWidth * 2,\r\n thinning: 0.6,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n simulatePressure: true,\r\n });\r\n newPoints = smoothPoints.map((p, i) => (i % 2 === 0 ? p / frameWidth : p / frameHeight));\r\n } else {\r\n const normalizedX = pos.x / frameWidth;\r\n const normalizedY = pos.y / frameHeight;\r\n newPoints = [...activeLine.points, normalizedX, normalizedY];\r\n }\r\n\r\n setActiveLine((prev) => (prev ? { ...prev, points: newPoints } : null));\r\n },\r\n [isSketchMode, strokeWidth, activeLine, frameWidth, frameHeight]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n if (!isDrawing.current) return;\r\n\r\n if (activeLine && activeLine.points.length > 0) {\r\n dispatch(addPhotoFrameAnnotation({ frameId, line: activeLine }));\r\n }\r\n\r\n setActiveLine(null);\r\n isDrawing.current = false;\r\n hasMovedWhileDrawing.current = false;\r\n currentLinePoints.current = [];\r\n }, [dispatch, frameId, activeLine]);\r\n\r\n return {\r\n annotations,\r\n activeLine,\r\n isDrawingMode,\r\n startDrawing,\r\n draw,\r\n stopDrawing,\r\n };\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState, useRef } from 'react';\r\nimport { Group, Image as KonvaImage, Rect, Circle, Text as KonvaText, Line } from 'react-konva';\r\nimport { PhotoFrameElement } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { usePhotoFrameDrawing } from '@/store/hooks/usePhotoFrameDrawing';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype PhotoFrameRendererProps = {\r\n photoFrame: PhotoFrameElement;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onTransformEnd: (e: KonvaEventObject<Event>) => void;\r\n onContextMenu: (e: React.MouseEvent) => void;\r\n onStartCamera: () => void;\r\n onCapture: (videoElement: HTMLVideoElement) => void;\r\n cameraStream: MediaStream | undefined;\r\n nodeRef: (node: Konva.Group | null) => void;\r\n};\r\n\r\ntype KonvaNodeWithCleanup = Konva.Group & {\r\n _contextMenuCleanup?: () => void;\r\n};\r\n\r\nconst PhotoFrameRenderer: React.FC<PhotoFrameRendererProps> = ({\r\n photoFrame,\r\n isSelected,\r\n onClick,\r\n onDragEnd,\r\n onTransformEnd,\r\n onContextMenu,\r\n onStartCamera,\r\n onCapture,\r\n cameraStream,\r\n nodeRef,\r\n}) => {\r\n const [capturedImage, setCapturedImage] = useState<HTMLImageElement | null>(null);\r\n const [liveImage, setLiveImage] = useState<HTMLImageElement | null>(null);\r\n const videoRef = useRef<HTMLVideoElement | null>(null);\r\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\r\n const animationFrameRef = useRef<number | null>(null);\r\n // Reuse single Image object for live preview to prevent memory leak\r\n const liveImageRef = useRef<HTMLImageElement | null>(null);\r\n // Throttle frame captures to reduce memory pressure (30fps instead of 60fps)\r\n const lastFrameTimeRef = useRef<number>(0);\r\n const FRAME_INTERVAL = 33; // ~30fps\r\n\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n\r\n const { annotations, activeLine, isDrawingMode, startDrawing, draw, stopDrawing } =\r\n usePhotoFrameDrawing(photoFrame.id);\r\n\r\n // Add global mouse up listener to stop drawing even if mouse is released outside frame\r\n useEffect(() => {\r\n if (!isDrawingMode) return;\r\n\r\n const handleGlobalMouseUp = () => {\r\n stopDrawing();\r\n };\r\n\r\n const handleGlobalTouchEnd = () => {\r\n stopDrawing();\r\n };\r\n\r\n window.addEventListener('mouseup', handleGlobalMouseUp);\r\n window.addEventListener('touchend', handleGlobalTouchEnd);\r\n\r\n return () => {\r\n window.removeEventListener('mouseup', handleGlobalMouseUp);\r\n window.removeEventListener('touchend', handleGlobalTouchEnd);\r\n };\r\n }, [stopDrawing, isDrawingMode]);\r\n\r\n useEffect(() => {\r\n if (photoFrame.capturedImageUrl) {\r\n const img = new window.Image();\r\n img.src = photoFrame.capturedImageUrl;\r\n img.onload = () => {\r\n setCapturedImage(img);\r\n };\r\n }\r\n }, [photoFrame.capturedImageUrl]);\r\n\r\n useEffect(() => {\r\n if (photoFrame.isCapturing && cameraStream) {\r\n if (!videoRef.current) {\r\n videoRef.current = document.createElement('video');\r\n videoRef.current.autoplay = true;\r\n videoRef.current.playsInline = true;\r\n }\r\n\r\n if (!canvasRef.current) {\r\n canvasRef.current = document.createElement('canvas');\r\n }\r\n\r\n const video = videoRef.current;\r\n const canvas = canvasRef.current;\r\n\r\n video.srcObject = cameraStream;\r\n\r\n const startCapture = () => {\r\n canvas.width = video.videoWidth || 640;\r\n canvas.height = video.videoHeight || 480;\r\n console.log('📹 Starting live capture, canvas size:', canvas.width, canvas.height);\r\n\r\n const captureFrame = (timestamp: number) => {\r\n // Throttle to ~30fps to reduce memory pressure\r\n if (timestamp - lastFrameTimeRef.current < FRAME_INTERVAL) {\r\n animationFrameRef.current = requestAnimationFrame(captureFrame);\r\n return;\r\n }\r\n lastFrameTimeRef.current = timestamp;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx && video.readyState === video.HAVE_ENOUGH_DATA) {\r\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n const dataUrl = canvas.toDataURL('image/jpeg', 0.6); // Lower quality for live preview\r\n\r\n // Create a new Image object for each frame to force React re-render\r\n const img = new window.Image();\r\n img.onload = () => {\r\n setLiveImage(img);\r\n };\r\n img.src = dataUrl;\r\n }\r\n animationFrameRef.current = requestAnimationFrame(captureFrame);\r\n };\r\n\r\n animationFrameRef.current = requestAnimationFrame(captureFrame);\r\n };\r\n\r\n video.onloadedmetadata = startCapture;\r\n\r\n // Also start immediately if metadata is already loaded\r\n if (video.readyState >= video.HAVE_METADATA) {\r\n startCapture();\r\n }\r\n\r\n // Ensure video is playing\r\n video.play().catch((err) => console.error('Error playing video:', err));\r\n\r\n return () => {\r\n if (animationFrameRef.current) {\r\n cancelAnimationFrame(animationFrameRef.current);\r\n animationFrameRef.current = null;\r\n }\r\n };\r\n }\r\n return () => {\r\n setLiveImage(null);\r\n // Clean up live image ref when stopping capture\r\n if (liveImageRef.current) {\r\n liveImageRef.current.src = '';\r\n }\r\n };\r\n }, [photoFrame.isCapturing, cameraStream]);\r\n\r\n const handleCaptureClick = () => {\r\n if (videoRef.current && photoFrame.isCapturing) {\r\n onCapture(videoRef.current);\r\n }\r\n };\r\n\r\n const handleMouseDown = (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n if (photoFrame.capturedImageUrl) {\r\n if (!isDrawingMode) {\r\n // Normal mode: allow selection\r\n onClick();\r\n return;\r\n }\r\n\r\n // Drawing mode: start drawing\r\n // Get the image node to get proper relative coordinates\r\n const imageNode = e.currentTarget;\r\n const transform = imageNode.getAbsoluteTransform().copy();\r\n const stage = imageNode.getStage();\r\n const pos = stage?.getPointerPosition();\r\n\r\n if (pos) {\r\n // Invert the transform to convert stage coordinates to image local coordinates\r\n transform.invert();\r\n const relativePos = transform.point(pos);\r\n startDrawing(relativePos);\r\n }\r\n e.cancelBubble = true;\r\n } else {\r\n onClick();\r\n }\r\n };\r\n\r\n const handleMouseMove = (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n if (!isDrawingMode || !photoFrame.capturedImageUrl) return;\r\n\r\n // Get the image node to get proper relative coordinates\r\n const imageNode = e.currentTarget;\r\n const transform = imageNode.getAbsoluteTransform().copy();\r\n const stage = imageNode.getStage();\r\n const pos = stage?.getPointerPosition();\r\n\r\n if (pos) {\r\n // Invert the transform to convert stage coordinates to image local coordinates\r\n transform.invert();\r\n const relativePos = transform.point(pos);\r\n draw(relativePos);\r\n }\r\n };\r\n\r\n const handleMouseUp = () => {\r\n if (!isDrawingMode || !photoFrame.capturedImageUrl) return;\r\n stopDrawing();\r\n };\r\n\r\n const displayImage = photoFrame.isCapturing ? liveImage : capturedImage;\r\n const buttonSize = Math.min(photoFrame.width, photoFrame.height) * 0.12;\r\n const buttonRadius = Math.max(25, Math.min(buttonSize, 50));\r\n const centerX = photoFrame.width / 2;\r\n const centerY = photoFrame.height / 2;\r\n\r\n return (\r\n <Group\r\n id={photoFrame.id}\r\n draggable={!isDrawingMode && !isDrawingTool}\r\n listening={true}\r\n x={photoFrame.x}\r\n y={photoFrame.y}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: onDragEnd,\r\n onTransformEnd: onTransformEnd,\r\n }\r\n : {})}\r\n rotation={photoFrame.rotation}\r\n width={photoFrame.width}\r\n height={photoFrame.height}\r\n ref={(node) => {\r\n nodeRef(node);\r\n if (node) {\r\n const konvaNode = node.getStage()?.container();\r\n if (konvaNode) {\r\n const handleContextMenuEvent = (e: MouseEvent) => {\r\n const mousePos = node.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const frameRect = {\r\n x: photoFrame.x,\r\n y: photoFrame.y,\r\n width: photoFrame.width,\r\n height: photoFrame.height,\r\n };\r\n if (\r\n mousePos.x >= frameRect.x &&\r\n mousePos.x <= frameRect.x + frameRect.width &&\r\n mousePos.y >= frameRect.y &&\r\n mousePos.y <= frameRect.y + frameRect.height\r\n ) {\r\n const reactEvent = e as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent);\r\n }\r\n }\r\n };\r\n konvaNode.addEventListener('contextmenu', handleContextMenuEvent);\r\n (node as KonvaNodeWithCleanup)._contextMenuCleanup = () => {\r\n konvaNode.removeEventListener('contextmenu', handleContextMenuEvent);\r\n };\r\n }\r\n }\r\n }}\r\n >\r\n {/* Main frame rect */}\r\n <Rect\r\n x={0}\r\n y={0}\r\n width={photoFrame.width}\r\n height={photoFrame.height}\r\n fill={displayImage ? 'transparent' : '#f0f0f0'}\r\n stroke={isSelected ? 'transparent' : '#4A90E2'}\r\n strokeWidth={isSelected ? 0 : 2}\r\n cornerRadius={8}\r\n listening={true}\r\n onClick={onClick}\r\n onTap={onClick}\r\n />\r\n\r\n {displayImage && (\r\n <KonvaImage\r\n image={displayImage}\r\n width={photoFrame.width}\r\n height={photoFrame.height}\r\n cornerRadius={8}\r\n listening={true}\r\n onClick={handleMouseDown}\r\n onTap={handleMouseDown}\r\n onMouseDown={handleMouseDown}\r\n onTouchStart={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onTouchMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchEnd={handleMouseUp}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: onDragEnd,\r\n onTransformEnd: onTransformEnd,\r\n }\r\n : {})}\r\n />\r\n )}\r\n\r\n {/* Render annotations */}\r\n {annotations?.map((line, i) => {\r\n // Convert normalized coordinates (0-1) back to pixels\r\n const pixelPoints = line.points.map((p, idx) =>\r\n idx % 2 === 0 ? p * photoFrame.width : p * photoFrame.height\r\n );\r\n // Convert normalized stroke width back to pixels\r\n const pixelStrokeWidth = line.strokeWidth * photoFrame.width;\r\n\r\n return (\r\n <Line\r\n key={i}\r\n points={pixelPoints}\r\n stroke={line.tool === 'eraser' ? 'white' : line.color}\r\n strokeWidth={pixelStrokeWidth}\r\n tension={0.5}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n globalCompositeOperation={line.tool === 'eraser' ? 'destination-out' : 'source-over'}\r\n fill={line.isSketch ? line.color : undefined}\r\n closed={line.isSketch}\r\n listening={false}\r\n />\r\n );\r\n })}\r\n {/* Render active line being drawn - uses local state, not Redux */}\r\n {activeLine && (\r\n <Line\r\n key=\"active\"\r\n points={activeLine.points.map((p, idx) =>\r\n idx % 2 === 0 ? p * photoFrame.width : p * photoFrame.height\r\n )}\r\n stroke={activeLine.tool === 'eraser' ? 'white' : activeLine.color}\r\n strokeWidth={activeLine.strokeWidth * photoFrame.width}\r\n tension={0.5}\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n globalCompositeOperation={\r\n activeLine.tool === 'eraser' ? 'destination-out' : 'source-over'\r\n }\r\n fill={activeLine.isSketch ? activeLine.color : undefined}\r\n closed={activeLine.isSketch}\r\n listening={false}\r\n />\r\n )}\r\n\r\n {!displayImage && !photoFrame.isCapturing && (\r\n <KonvaText\r\n x={0}\r\n y={centerY - 20}\r\n width={photoFrame.width}\r\n height={40}\r\n text=\"Click to start camera\"\r\n fontSize={16}\r\n fontFamily=\"Arial\"\r\n fill=\"#666\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n )}\r\n\r\n {!photoFrame.capturedImageUrl && (\r\n <>\r\n <Circle\r\n x={centerX}\r\n y={photoFrame.height * 0.75}\r\n radius={buttonRadius}\r\n fill={photoFrame.isCapturing ? '#E74C3C' : '#4A90E2'}\r\n shadowColor=\"black\"\r\n shadowBlur={5}\r\n shadowOpacity={0.3}\r\n listening={true}\r\n onClick={(e: KonvaEventObject<MouseEvent>) => {\r\n e.cancelBubble = true;\r\n if (photoFrame.isCapturing) {\r\n handleCaptureClick();\r\n } else {\r\n onStartCamera();\r\n }\r\n }}\r\n onTap={(e: KonvaEventObject<TouchEvent>) => {\r\n e.cancelBubble = true;\r\n if (photoFrame.isCapturing) {\r\n handleCaptureClick();\r\n } else {\r\n onStartCamera();\r\n }\r\n }}\r\n />\r\n <KonvaText\r\n x={centerX - buttonRadius}\r\n y={photoFrame.height * 0.75 - 8}\r\n width={buttonRadius * 2}\r\n height={16}\r\n text={photoFrame.isCapturing ? '📸' : '📷'}\r\n fontSize={20}\r\n fontFamily=\"Arial\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={true}\r\n onClick={(e: KonvaEventObject<MouseEvent>) => {\r\n e.cancelBubble = true;\r\n if (photoFrame.isCapturing) {\r\n handleCaptureClick();\r\n } else {\r\n onStartCamera();\r\n }\r\n }}\r\n onTap={(e: KonvaEventObject<TouchEvent>) => {\r\n e.cancelBubble = true;\r\n if (photoFrame.isCapturing) {\r\n handleCaptureClick();\r\n } else {\r\n onStartCamera();\r\n }\r\n }}\r\n />\r\n </>\r\n )}\r\n\r\n {photoFrame.isCapturing && (\r\n <>\r\n <Rect\r\n x={10}\r\n y={10}\r\n width={60}\r\n height={25}\r\n fill=\"rgba(231, 76, 60, 0.9)\"\r\n cornerRadius={4}\r\n />\r\n <KonvaText\r\n x={10}\r\n y={10}\r\n width={60}\r\n height={25}\r\n text=\"● LIVE\"\r\n fontSize={12}\r\n fontFamily=\"Arial\"\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n </>\r\n )}\r\n </Group>\r\n );\r\n};\r\n\r\nexport default PhotoFrameRenderer;\r\n","'use client';\r\n\r\nimport { memo } from 'react';\r\nimport PhotoFrameRenderer from '@/components/elements/PhotoFrameRenderer';\r\nimport { PhotoFrameElement } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\n\r\ntype PhotoFrameLayerProps = {\r\n photoFrames: PhotoFrameElement[];\r\n photoFrameRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n selectedId: string | null;\r\n onDragEnd: (e: KonvaEventObject<DragEvent>, photoFrameId: string) => void;\r\n onTransform: (photoFrameId: string, e: KonvaEventObject<Event>) => void;\r\n onSelect: (id: string) => void;\r\n onStartCamera: (photoFrameId: string) => void;\r\n onCapture: (photoFrameId: string, videoElement: HTMLVideoElement) => void;\r\n cameraStreams: Map<string, MediaStream>;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'flashcard' | 'photoFrame'\r\n ) => void;\r\n};\r\n\r\nexport const PhotoFrameLayer = memo(\r\n ({\r\n photoFrames,\r\n photoFrameRefs,\r\n selectedId,\r\n onDragEnd,\r\n onTransform,\r\n onSelect,\r\n onStartCamera,\r\n onCapture,\r\n cameraStreams,\r\n onContextMenu,\r\n }: PhotoFrameLayerProps) => {\r\n return (\r\n <>\r\n {photoFrames.map((photoFrame) => (\r\n <PhotoFrameRenderer\r\n key={photoFrame.id}\r\n photoFrame={photoFrame}\r\n isSelected={selectedId === photoFrame.id}\r\n onClick={() => onSelect(photoFrame.id)}\r\n onDragEnd={(e) => onDragEnd(e, photoFrame.id)}\r\n onTransformEnd={(e) => onTransform(photoFrame.id, e)}\r\n onContextMenu={(e) => onContextMenu(e, photoFrame.id, 'photoFrame')}\r\n onStartCamera={() => onStartCamera(photoFrame.id)}\r\n onCapture={(videoElement) => onCapture(photoFrame.id, videoElement)}\r\n cameraStream={cameraStreams.get(photoFrame.id)}\r\n nodeRef={(node) => {\r\n if (node) {\r\n photoFrameRefs.current.set(photoFrame.id, node);\r\n } else {\r\n photoFrameRefs.current.delete(photoFrame.id);\r\n }\r\n }}\r\n />\r\n ))}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nPhotoFrameLayer.displayName = 'PhotoFrameLayer';\r\n","'use client';\r\n\r\nimport { EyeIcon } from '@phosphor-icons/react';\r\nimport {\r\n ArrowUpIcon,\r\n Chat,\r\n CopySimple,\r\n LinkIcon,\r\n Lock,\r\n ScissorsIcon,\r\n SpeakerHifiIcon,\r\n Square,\r\n Trash,\r\n Palette,\r\n PencilSimple,\r\n NotePencilIcon,\r\n Stack,\r\n} from '@phosphor-icons/react/dist/ssr';\r\nimport React, { useEffect, useRef } from 'react';\r\n// import {\r\n// ArrowUpIcon,\r\n// LockClosedIcon,\r\n// LinkIcon,\r\n// SpeakerWaveIcon,\r\n// ScissorsIcon,\r\n// DocumentDuplicateIcon,\r\n// Square3Stack3DIcon,\r\n// ChatBubbleBottomCenterTextIcon,\r\n// EyeIcon,\r\n// TrashIcon,\r\n// } from '@heroicons/react/24/outline';\r\n\r\nexport type ContextMenuAction =\r\n | 'order'\r\n | 'lock'\r\n | 'link'\r\n | 'voice'\r\n | 'edit'\r\n | 'editFlashcard'\r\n | 'color'\r\n | 'crop'\r\n | 'draw'\r\n | 'duplicate'\r\n | 'infinite-clone'\r\n | 'make-response'\r\n | 'accessibility'\r\n | 'layers'\r\n | 'delete';\r\n\r\ntype ContextMenuProps = {\r\n x: number;\r\n y: number;\r\n onAction: (action: ContextMenuAction, event?: React.MouseEvent) => void;\r\n onClose: () => void;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'text'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks'\r\n | 'line';\r\n\r\n isDrawingMode?: boolean;\r\n};\r\n\r\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\r\n x,\r\n y,\r\n onAction,\r\n onClose,\r\n type,\r\n isDrawingMode,\r\n}) => {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n document.addEventListener('keydown', handleEscape);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n }, [onClose]);\r\n\r\n const menuItems: Array<{\r\n action: ContextMenuAction;\r\n label: string;\r\n icon: React.ReactNode;\r\n hasSubmenu?: boolean;\r\n isDanger?: boolean;\r\n }> = [\r\n {\r\n action: 'order',\r\n label: 'Order',\r\n icon: <ArrowUpIcon className=\"h-5 w-5\" />,\r\n hasSubmenu: true,\r\n },\r\n {\r\n action: 'lock',\r\n label: 'Lock',\r\n icon: <Lock className=\"h-5 w-5\" />,\r\n hasSubmenu: true,\r\n },\r\n {\r\n action: 'link',\r\n label: 'Link',\r\n icon: <LinkIcon className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'voice',\r\n label: 'Voice',\r\n icon: <SpeakerHifiIcon className=\"h-5 w-5\" />,\r\n },\r\n ...(type === 'mcq' ||\r\n type === 'trueFalse' ||\r\n type === 'shortAnswer' ||\r\n type === 'longAnswer' ||\r\n type === 'fillInTheBlanks'\r\n ? [\r\n {\r\n action: 'edit' as ContextMenuAction,\r\n label: 'Edit',\r\n icon: <NotePencilIcon className=\"h-5 w-5\" />,\r\n },\r\n ]\r\n : []),\r\n ...(type === 'shape'\r\n ? [\r\n {\r\n action: 'color' as ContextMenuAction,\r\n label: 'Change Color',\r\n icon: <Palette className=\"h-5 w-5\" />,\r\n },\r\n ]\r\n : []),\r\n ...(type === 'image'\r\n ? [\r\n {\r\n action: 'crop' as ContextMenuAction,\r\n label: 'Crop Image',\r\n icon: <ScissorsIcon className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'draw' as ContextMenuAction,\r\n label: isDrawingMode ? 'Exit Drawing Mode' : 'Draw on Image',\r\n icon: <PencilSimple className=\"h-5 w-5\" />,\r\n },\r\n ]\r\n : []),\r\n ...(type === 'photoFrame'\r\n ? [\r\n {\r\n action: 'draw' as ContextMenuAction,\r\n label: isDrawingMode ? 'Exit Drawing Mode' : 'Draw on Frame',\r\n icon: <PencilSimple className=\"h-5 w-5\" />,\r\n },\r\n ]\r\n : []),\r\n ...(type === 'flashcard'\r\n ? [\r\n {\r\n action: 'editFlashcard' as ContextMenuAction,\r\n label: 'Edit Flashcard',\r\n icon: <NotePencilIcon className=\"h-5 w-5\" />,\r\n },\r\n ]\r\n : []),\r\n {\r\n action: 'duplicate',\r\n label: 'Duplicate',\r\n icon: <CopySimple className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'infinite-clone',\r\n label: 'Infinite Clone',\r\n icon: <Square className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'make-response',\r\n label: 'Make Response',\r\n icon: <Chat className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'accessibility',\r\n label: 'Accessibility',\r\n icon: <EyeIcon className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'layers',\r\n label: 'Layers',\r\n icon: <Stack className=\"h-5 w-5\" />,\r\n },\r\n {\r\n action: 'delete',\r\n label: 'Delete',\r\n icon: <Trash className=\"h-5 w-5\" />,\r\n isDanger: true,\r\n },\r\n ];\r\n\r\n const handleItemClick = (action: ContextMenuAction, event: React.MouseEvent) => {\r\n // Don't close for submenu items\r\n if (action === 'order' || action === 'lock') {\r\n onAction(action, event);\r\n } else {\r\n onAction(action);\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n className=\"fixed z-100 min-w-[200px] rounded-lg border border-gray-200 bg-white shadow-xl\"\r\n style={{\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n }}\r\n >\r\n <div className=\"py-2\">\r\n {menuItems.map((item, index) => (\r\n <button\r\n key={item.action}\r\n onClick={(e) => handleItemClick(item.action, e)}\r\n className={`flex w-full items-center justify-between px-4 py-2.5 text-left text-sm transition-colors hover:bg-gray-50 ${\r\n item.isDanger ? 'text-red-600 hover:bg-red-50' : 'text-gray-700'\r\n } ${index !== 0 ? 'border-t border-gray-100' : ''}`}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {item.icon}\r\n <span className=\"font-medium\">{item.label}</span>\r\n </div>\r\n {item.hasSubmenu && (\r\n <svg\r\n className=\"h-4 w-4 text-gray-400\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M9 5l7 7-7 7\"\r\n />\r\n </svg>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\n\r\ntype SubmenuProps = {\r\n x: number;\r\n y: number;\r\n items: Array<{\r\n label: string;\r\n onClick: () => void;\r\n }>;\r\n onClose: () => void;\r\n};\r\n\r\nexport const Submenu: React.FC<SubmenuProps> = ({ x, y, items, onClose }) => {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [onClose]);\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n className=\"fixed z-101 min-w-[180px] rounded-lg border border-gray-200 bg-white shadow-xl\"\r\n style={{\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n }}\r\n >\r\n <div className=\"py-2\">\r\n {items.map((item, index) => (\r\n <button\r\n key={index}\r\n onClick={() => {\r\n item.onClick();\r\n onClose();\r\n }}\r\n className=\"flex w-full items-center px-4 py-2.5 text-left text-sm text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n <span className=\"font-medium\">{item.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { X } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype InputDialogProps = {\r\n title: string;\r\n label: string;\r\n placeholder: string;\r\n defaultValue?: string;\r\n onSave: (value: string) => void;\r\n onClose: () => void;\r\n};\r\n\r\nexport const InputDialog: React.FC<InputDialogProps> = ({\r\n title,\r\n label,\r\n placeholder,\r\n defaultValue = '',\r\n onSave,\r\n onClose,\r\n}) => {\r\n const [value, setValue] = useState(defaultValue);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n inputRef.current?.focus();\r\n }, []);\r\n\r\n const handleSave = () => {\r\n onSave(value);\r\n onClose();\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n handleSave();\r\n } else if (e.key === 'Escape') {\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-102 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-lg bg-white p-6 shadow-2xl\">\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <h2 className=\"text-xl font-semibold text-gray-900\">{title}</h2>\r\n <button\r\n onClick={onClose}\r\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600\"\r\n >\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-6\">\r\n <label className=\"mb-2 block text-sm font-medium text-gray-700\">{label}</label>\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => setValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={placeholder}\r\n className=\"w-full rounded-lg border border-gray-300 px-4 py-2 focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 focus:outline-none\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={onClose}\r\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n className=\"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-700\"\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { X } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype ColorPickerDialogProps = {\r\n defaultColor?: string;\r\n onConfirm: (color: string) => void;\r\n onCancel: () => void;\r\n};\r\n\r\nexport const ColorPickerDialog: React.FC<ColorPickerDialogProps> = ({\r\n defaultColor = '#096B76',\r\n onConfirm,\r\n onCancel,\r\n}) => {\r\n const [color, setColor] = useState(defaultColor);\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onCancel();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, [onCancel]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n onConfirm(color);\r\n };\r\n\r\n // Convert HSL to HEX\r\n const hslToHex = (h: number, s: number, l: number) => {\r\n l /= 100;\r\n const a = (s * Math.min(l, 1 - l)) / 100;\r\n const f = (n: number) => {\r\n const k = (n + h / 30) % 12;\r\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\r\n return Math.round(255 * color)\r\n .toString(16)\r\n .padStart(2, '0');\r\n };\r\n return `#${f(0)}${f(8)}${f(4)}`;\r\n };\r\n\r\n const presetColors = [\r\n '#FF6B6B',\r\n '#4ECDC4',\r\n '#45B7D1',\r\n '#FFA07A',\r\n '#98D8C8',\r\n '#F7DC6F',\r\n '#BB8FCE',\r\n '#85C1E2',\r\n '#096B76',\r\n '#2C3E50',\r\n '#E74C3C',\r\n '#3498DB',\r\n '#2ECC71',\r\n '#F39C12',\r\n '#9B59B6',\r\n '#1ABC9C',\r\n ];\r\n\r\n const dialogContent = (\r\n <div\r\n className=\"pointer-events-none fixed inset-0 z-100 flex items-center justify-center\"\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onMouseUp={(e) => e.stopPropagation()}\r\n onMouseMove={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n onTouchMove={(e) => e.stopPropagation()}\r\n onTouchEnd={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n ref={dialogRef}\r\n className=\"pointer-events-auto max-h-[90vh] w-96 max-w-[90vw] overflow-y-auto rounded-xl border border-gray-200 bg-white p-6 shadow-2xl\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-gray-800\">Change Shape Color</h3>\r\n <button\r\n onClick={onCancel}\r\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600\"\r\n >\r\n <X size={20} weight=\"bold\" />\r\n </button>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit}>\r\n <div className=\"space-y-4\">\r\n {/* Color Preview */}\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className=\"h-16 w-16 rounded-lg border-2 border-gray-300 shadow-sm\"\r\n style={{ backgroundColor: color }}\r\n />\r\n <div className=\"flex-1\">\r\n <label className=\"mb-1 block text-xs font-semibold text-gray-500\">HEX COLOR</label>\r\n <input\r\n type=\"text\"\r\n value={color}\r\n onChange={(e) => setColor(e.target.value)}\r\n className=\"w-full rounded-lg border border-gray-300 px-3 py-2 font-mono text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-200 focus:outline-none\"\r\n placeholder=\"#000000\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Native Color Picker */}\r\n <div>\r\n <label className=\"mb-1 block text-xs font-semibold text-gray-500\">COLOR PICKER</label>\r\n <input\r\n type=\"color\"\r\n value={color}\r\n onChange={(e) => setColor(e.target.value)}\r\n className=\"h-12 w-full cursor-pointer rounded-lg border border-gray-300\"\r\n />\r\n </div>\r\n\r\n {/* Rainbow Slider */}\r\n <div>\r\n <label className=\"mb-1 block text-xs font-semibold text-gray-500\">HUE SLIDER</label>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"360\"\r\n defaultValue=\"180\"\r\n onChange={(e) => {\r\n const hue = parseInt(e.target.value);\r\n const hex = hslToHex(hue, 100, 50);\r\n setColor(hex);\r\n }}\r\n className=\"h-3 w-full cursor-pointer appearance-none rounded-full\"\r\n style={{\r\n background:\r\n 'linear-gradient(to right, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%)',\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Preset Colors */}\r\n <div>\r\n <label className=\"mb-2 block text-xs font-semibold text-gray-500\">\r\n PRESET COLORS\r\n </label>\r\n <div className=\"grid grid-cols-8 gap-2\">\r\n {presetColors.map((presetColor) => (\r\n <button\r\n key={presetColor}\r\n type=\"button\"\r\n onClick={() => setColor(presetColor)}\r\n className={`h-8 w-8 rounded-lg border-2 transition-all hover:scale-110 ${\r\n color.toUpperCase() === presetColor.toUpperCase()\r\n ? 'border-blue-500 ring-2 ring-blue-200'\r\n : 'border-gray-300'\r\n }`}\r\n style={{ backgroundColor: presetColor }}\r\n title={presetColor}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"mt-6 flex gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n className=\"flex-1 rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"submit\"\r\n className=\"flex-1 rounded-lg bg-blue-500 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-600\"\r\n >\r\n Apply Color\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n\r\n return createPortal(dialogContent, document.body);\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { X, Check } from '@phosphor-icons/react/dist/ssr';\r\nimport Konva from 'konva';\r\nimport { Stage, Layer, Image as KonvaImage, Rect, Transformer } from 'react-konva';\r\nimport useImage from 'use-image';\r\n\r\ntype CropDialogProps = {\r\n imageSrc: string;\r\n onConfirm: (croppedImageData: string) => void;\r\n onCancel: () => void;\r\n};\r\n\r\nconst CropImage: React.FC<{\r\n imageSrc: string;\r\n onCrop: (x: number, y: number, width: number, height: number) => void;\r\n}> = ({ imageSrc, onCrop }) => {\r\n const [image] = useImage(imageSrc);\r\n const imageRef = useRef<Konva.Image>(null);\r\n const cropRectRef = useRef<Konva.Rect>(null);\r\n const transformerRef = useRef<Konva.Transformer>(null);\r\n\r\n // Calculate dimensions based on image, not as state\r\n const dimensions = useMemo(() => {\r\n if (!image) return { width: 600, height: 400 };\r\n\r\n const maxWidth = 600;\r\n const maxHeight = 400;\r\n const scale = Math.min(maxWidth / image.width, maxHeight / image.height);\r\n return {\r\n width: image.width * scale,\r\n height: image.height * scale,\r\n };\r\n }, [image]);\r\n\r\n // Calculate initial crop area based on dimensions\r\n const initialCropArea = useMemo(() => {\r\n const cropWidth = dimensions.width * 0.5;\r\n const cropHeight = dimensions.height * 0.5;\r\n const cropX = (dimensions.width - cropWidth) / 2;\r\n const cropY = (dimensions.height - cropHeight) / 2;\r\n return { x: cropX, y: cropY, width: cropWidth, height: cropHeight };\r\n }, [dimensions]);\r\n\r\n const [cropArea, setCropArea] = useState(initialCropArea);\r\n\r\n // Update crop area when initial crop area changes (when image loads)\r\n useEffect(() => {\r\n setCropArea(initialCropArea);\r\n }, [initialCropArea]);\r\n\r\n useEffect(() => {\r\n if (transformerRef.current && cropRectRef.current) {\r\n transformerRef.current.nodes([cropRectRef.current]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n }\r\n }, [cropArea]);\r\n\r\n useEffect(() => {\r\n onCrop(cropArea.x, cropArea.y, cropArea.width, cropArea.height);\r\n }, [cropArea, onCrop]);\r\n\r\n const handleTransformEnd = () => {\r\n const node = cropRectRef.current;\r\n if (!node) return;\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n\r\n // Reset scale\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n setCropArea({\r\n x: node.x(),\r\n y: node.y(),\r\n width: Math.max(20, node.width() * scaleX),\r\n height: Math.max(20, node.height() * scaleY),\r\n });\r\n };\r\n\r\n const handleDragEnd = () => {\r\n const node = cropRectRef.current;\r\n if (!node) return;\r\n\r\n setCropArea({\r\n x: node.x(),\r\n y: node.y(),\r\n width: node.width(),\r\n height: node.height(),\r\n });\r\n };\r\n\r\n return (\r\n <Stage width={dimensions.width} height={dimensions.height} className=\"border border-gray-300\">\r\n <Layer>\r\n <KonvaImage\r\n ref={imageRef}\r\n image={image}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n />\r\n {/* Overlay - darken non-cropped area */}\r\n <Rect\r\n x={0}\r\n y={0}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n fill=\"rgba(0, 0, 0, 0.5)\"\r\n globalCompositeOperation=\"source-over\"\r\n />\r\n {/* Clear crop area */}\r\n <Rect\r\n x={cropArea.x}\r\n y={cropArea.y}\r\n width={cropArea.width}\r\n height={cropArea.height}\r\n globalCompositeOperation=\"destination-out\"\r\n />\r\n {/* Crop selection rectangle */}\r\n <Rect\r\n ref={cropRectRef}\r\n x={cropArea.x}\r\n y={cropArea.y}\r\n width={cropArea.width}\r\n height={cropArea.height}\r\n stroke=\"#4A90E2\"\r\n strokeWidth={2}\r\n draggable\r\n onDragEnd={handleDragEnd}\r\n onTransformEnd={handleTransformEnd}\r\n dragBoundFunc={(pos) => {\r\n const newX = Math.max(0, Math.min(pos.x, dimensions.width - cropArea.width));\r\n const newY = Math.max(0, Math.min(pos.y, dimensions.height - cropArea.height));\r\n return { x: newX, y: newY };\r\n }}\r\n />\r\n <Transformer\r\n ref={transformerRef}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={false}\r\n keepRatio={false}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n boundBoxFunc={(oldBox, newBox) => {\r\n // Limit resize within image bounds\r\n if (newBox.width < 20 || newBox.height < 20) {\r\n return oldBox;\r\n }\r\n if (\r\n newBox.x < 0 ||\r\n newBox.y < 0 ||\r\n newBox.x + newBox.width > dimensions.width ||\r\n newBox.y + newBox.height > dimensions.height\r\n ) {\r\n return oldBox;\r\n }\r\n return newBox;\r\n }}\r\n />\r\n </Layer>\r\n </Stage>\r\n );\r\n};\r\n\r\nexport const CropDialog: React.FC<CropDialogProps> = ({ imageSrc, onConfirm, onCancel }) => {\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n const [cropData, setCropData] = useState({ x: 0, y: 0, width: 0, height: 0 });\r\n const [image] = useImage(imageSrc);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onCancel();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, [onCancel]);\r\n\r\n const handleCrop = (x: number, y: number, width: number, height: number) => {\r\n setCropData({ x, y, width, height });\r\n };\r\n\r\n const handleConfirm = () => {\r\n if (!image) return;\r\n\r\n // Calculate the crop area in the original image coordinates\r\n const maxWidth = 600;\r\n const maxHeight = 400;\r\n const scale = Math.min(maxWidth / image.width, maxHeight / image.height);\r\n\r\n const originalX = cropData.x / scale;\r\n const originalY = cropData.y / scale;\r\n const originalWidth = cropData.width / scale;\r\n const originalHeight = cropData.height / scale;\r\n\r\n // Create a canvas to crop the image\r\n const canvas = document.createElement('canvas');\r\n canvas.width = originalWidth;\r\n canvas.height = originalHeight;\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) return;\r\n\r\n ctx.drawImage(\r\n image,\r\n originalX,\r\n originalY,\r\n originalWidth,\r\n originalHeight,\r\n 0,\r\n 0,\r\n originalWidth,\r\n originalHeight\r\n );\r\n\r\n const croppedImageData = canvas.toDataURL('image/png');\r\n onConfirm(croppedImageData);\r\n };\r\n\r\n const dialogContent = (\r\n <div\r\n className=\"bg-opacity-50 pointer-events-none fixed inset-0 z-100 flex items-center justify-center bg-black\"\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onMouseUp={(e) => e.stopPropagation()}\r\n onMouseMove={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n onTouchMove={(e) => e.stopPropagation()}\r\n onTouchEnd={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n ref={dialogRef}\r\n className=\"pointer-events-auto max-h-[90vh] w-auto max-w-[90vw] overflow-y-auto rounded-xl border border-gray-200 bg-white p-6 shadow-2xl\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-gray-800\">Crop Image</h3>\r\n <button\r\n onClick={onCancel}\r\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600\"\r\n >\r\n <X size={20} weight=\"bold\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4 text-sm text-gray-600\">\r\n Drag the corners to resize the crop area, or drag the rectangle to move it.\r\n </div>\r\n\r\n <div className=\"mb-6\">\r\n <CropImage imageSrc={imageSrc} onCrop={handleCrop} />\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"flex gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n className=\"flex-1 rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleConfirm}\r\n className=\"flex flex-1 items-center justify-center gap-2 rounded-lg bg-blue-500 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-600\"\r\n >\r\n <Check size={16} weight=\"bold\" />\r\n Crop Image\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return createPortal(dialogContent, document.body);\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport {\r\n X,\r\n Record,\r\n Stop,\r\n Download,\r\n Microphone,\r\n MicrophoneSlash,\r\n} from '@phosphor-icons/react/dist/ssr';\r\nimport Konva from 'konva';\r\n\r\ntype ScreenRecorderProps = {\r\n onClose: () => void;\r\n stageRef?: React.RefObject<Konva.Stage | null>; // Konva.Stage reference\r\n onRecordingComplete?: (videoBlob: Blob, thumbnailDataUrl: string) => void; // Callback when recording is complete\r\n directDrawingCanvasRef?: React.RefObject<HTMLCanvasElement | null>; // Reference to DirectDrawingCanvas overlay\r\n};\r\n\r\nexport const ScreenRecorder: React.FC<ScreenRecorderProps> = ({\r\n onClose,\r\n stageRef,\r\n onRecordingComplete,\r\n directDrawingCanvasRef,\r\n}) => {\r\n const [isRecording, setIsRecording] = useState(false);\r\n const [recordedBlob, setRecordedBlob] = useState<Blob | null>(null);\r\n const [recordingTime, setRecordingTime] = useState(0);\r\n const [includeMicrophone, setIncludeMicrophone] = useState(true);\r\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\r\n const chunksRef = useRef<Blob[]>([]);\r\n const timerRef = useRef<NodeJS.Timeout | null>(null);\r\n const canvasStreamRef = useRef<MediaStream | null>(null);\r\n const animationFrameRef = useRef<number | null>(null);\r\n const canvasThumbnailRef = useRef<string | null>(null); // Store canvas thumbnail\r\n const recordingCanvasRef = useRef<HTMLCanvasElement | null>(null); // Store recording canvas\r\n const updateRecordingCanvasRef = useRef<(() => void) | null>(null); // Store update function\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (animationFrameRef.current) {\r\n cancelAnimationFrame(animationFrameRef.current);\r\n }\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n if (canvasStreamRef.current) {\r\n canvasStreamRef.current.getTracks().forEach((track) => track.stop());\r\n }\r\n };\r\n }, []);\r\n\r\n const startRecording = async () => {\r\n try {\r\n let videoStream: MediaStream;\r\n let audioStream: MediaStream | null = null;\r\n\r\n // Try to get canvas stream first\r\n if (stageRef?.current) {\r\n // IMPORTANT: Konva creates a composite canvas from multiple layer canvases\r\n // We need to use toCanvas() to get a single merged canvas that we can record\r\n console.log('Creating recording canvas from Konva stage...');\r\n\r\n // Get all layers\r\n const layers = stageRef.current.getLayers();\r\n console.log('Konva layers:', layers.length);\r\n layers.forEach((layer: Konva.Layer, index: number) => {\r\n const children = layer.getChildren();\r\n console.log(`Layer ${index} children count:`, children.length);\r\n });\r\n\r\n // Create a new canvas that will continuously render the stage\r\n const recordingCanvas = document.createElement('canvas');\r\n recordingCanvas.width = stageRef.current.width();\r\n recordingCanvas.height = stageRef.current.height();\r\n const recordingCtx = recordingCanvas.getContext('2d', { willReadFrequently: false });\r\n\r\n if (!recordingCtx) {\r\n console.error('Could not get recording canvas context');\r\n alert('Failed to create recording canvas.');\r\n return;\r\n }\r\n\r\n console.log(\r\n 'Recording canvas created, dimensions:',\r\n recordingCanvas.width,\r\n 'x',\r\n recordingCanvas.height\r\n );\r\n\r\n // Store recording canvas in ref for later access\r\n recordingCanvasRef.current = recordingCanvas;\r\n\r\n // Function to copy stage content to recording canvas\r\n const updateRecordingCanvas = () => {\r\n // Clear the recording canvas\r\n recordingCtx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);\r\n\r\n // Draw each layer's canvas onto the recording canvas\r\n layers.forEach((layer: Konva.Layer) => {\r\n const layerCanvas = layer.getCanvas()._canvas;\r\n if (layerCanvas) {\r\n recordingCtx.drawImage(layerCanvas, 0, 0);\r\n }\r\n });\r\n\r\n // IMPORTANT: Also draw the DirectDrawingCanvas overlay (pen tool strokes in progress)\r\n // This ensures that live drawing strokes are captured during recording\r\n if (directDrawingCanvasRef?.current) {\r\n const directCanvas = directDrawingCanvasRef.current;\r\n recordingCtx.drawImage(directCanvas, 0, 0);\r\n }\r\n };\r\n\r\n // Store update function in ref for later access\r\n updateRecordingCanvasRef.current = updateRecordingCanvas;\r\n\r\n // Initial draw\r\n stageRef.current.draw();\r\n updateRecordingCanvas();\r\n\r\n // Small delay to ensure the draw completes\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n console.log('Creating captureStream...');\r\n // Use captureStream with framerate to continuously capture\r\n const stream = recordingCanvas.captureStream(30); // 30 FPS\r\n\r\n videoStream = stream;\r\n console.log('Canvas stream created, tracks:', videoStream.getTracks().length);\r\n\r\n // Get video track\r\n const videoTrack = videoStream.getVideoTracks()[0];\r\n if (videoTrack) {\r\n console.log('Video track:', videoTrack.label, 'state:', videoTrack.readyState);\r\n }\r\n\r\n // Force canvas to render continuously during recording\r\n let frameCount = 0;\r\n const animate = () => {\r\n // Update the recording canvas with current stage content\r\n updateRecordingCanvas();\r\n\r\n // Also force Konva layers to redraw\r\n if (stageRef?.current) {\r\n const layers = stageRef.current.getLayers();\r\n layers.forEach((layer: Konva.Layer) => {\r\n layer.batchDraw();\r\n });\r\n\r\n // Log every 60 frames (about once per second at 60fps)\r\n frameCount++;\r\n if (frameCount % 60 === 0) {\r\n console.log('Drawing frame:', frameCount);\r\n }\r\n }\r\n animationFrameRef.current = requestAnimationFrame(animate);\r\n };\r\n animate();\r\n } else {\r\n console.error('Stage ref not provided');\r\n alert('Stage reference not available.');\r\n return;\r\n }\r\n\r\n if (includeMicrophone) {\r\n try {\r\n audioStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n },\r\n });\r\n } catch (audioError) {\r\n console.warn('Microphone access denied:', audioError);\r\n }\r\n }\r\n\r\n const tracks = [...videoStream.getVideoTracks()];\r\n if (audioStream) {\r\n tracks.push(...audioStream.getAudioTracks());\r\n }\r\n\r\n const combinedStream = new MediaStream(tracks);\r\n canvasStreamRef.current = combinedStream;\r\n\r\n // Try to find a supported mime type\r\n let mimeType = 'video/webm';\r\n if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9,opus')) {\r\n mimeType = 'video/webm;codecs=vp9,opus';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8,opus')) {\r\n mimeType = 'video/webm;codecs=vp8,opus';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {\r\n mimeType = 'video/webm;codecs=vp9';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {\r\n mimeType = 'video/webm;codecs=vp8';\r\n }\r\n\r\n console.log('Using mimeType:', mimeType);\r\n\r\n const mediaRecorder = new MediaRecorder(combinedStream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 2500000, // 2.5 Mbps\r\n });\r\n\r\n mediaRecorderRef.current = mediaRecorder;\r\n chunksRef.current = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n console.log('Data available, size:', event.data.size);\r\n if (event.data.size > 0) {\r\n chunksRef.current.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n console.log('Recording stopped, chunks:', chunksRef.current.length);\r\n const blob = new Blob(chunksRef.current, { type: mimeType });\r\n console.log('Final blob size:', blob.size);\r\n\r\n // Capture final canvas state as thumbnail BEFORE stopping everything\r\n if (stageRef?.current && updateRecordingCanvasRef.current && recordingCanvasRef.current) {\r\n // Force one final draw to ensure latest state\r\n stageRef.current.draw();\r\n const layers = stageRef.current.getLayers();\r\n layers.forEach((layer: Konva.Layer) => {\r\n layer.batchDraw();\r\n });\r\n\r\n // Update recording canvas one last time\r\n updateRecordingCanvasRef.current();\r\n\r\n // Capture the final screenshot\r\n canvasThumbnailRef.current = recordingCanvasRef.current.toDataURL('image/jpeg', 0.8);\r\n console.log(\r\n 'Final canvas thumbnail captured, length:',\r\n canvasThumbnailRef.current.length\r\n );\r\n }\r\n\r\n combinedStream.getTracks().forEach((track) => track.stop());\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n // Stop animation frame loop\r\n if (animationFrameRef.current) {\r\n cancelAnimationFrame(animationFrameRef.current);\r\n animationFrameRef.current = null;\r\n }\r\n\r\n // ALWAYS show the preview with Download and Re-record buttons\r\n // Let the user choose what to do with the recording\r\n setRecordedBlob(blob);\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n console.error('MediaRecorder error:', event);\r\n };\r\n\r\n console.log('Starting recording...');\r\n mediaRecorder.start(1000); // Collect data every 1 second\r\n setIsRecording(true);\r\n setRecordingTime(0);\r\n\r\n timerRef.current = setInterval(() => {\r\n setRecordingTime((prev) => prev + 1);\r\n }, 1000);\r\n } catch (error) {\r\n console.error('Error starting screen recording:', error);\r\n alert('Failed to start recording. Please ensure you granted permission.');\r\n }\r\n };\r\n\r\n const stopRecording = () => {\r\n if (mediaRecorderRef.current && isRecording) {\r\n console.log('Stopping recording, state:', mediaRecorderRef.current.state);\r\n if (mediaRecorderRef.current.state !== 'inactive') {\r\n // Request any remaining data before stopping\r\n mediaRecorderRef.current.requestData();\r\n // Small delay to ensure data is collected\r\n setTimeout(() => {\r\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {\r\n mediaRecorderRef.current.stop();\r\n }\r\n }, 100);\r\n }\r\n setIsRecording(false);\r\n }\r\n };\r\n\r\n const downloadRecording = () => {\r\n if (recordedBlob) {\r\n const url = URL.createObjectURL(recordedBlob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `screen-recording-${Date.now()}.webm`;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n\r\n const formatTime = (seconds: number) => {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n };\r\n\r\n if (isRecording) {\r\n return (\r\n <div className=\"fixed top-4 left-1/2 z-102 flex -translate-x-1/2 items-center gap-4 rounded-full border border-gray-200 bg-white px-6 py-3 shadow-2xl\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"h-3 w-3 animate-pulse rounded-full bg-red-600\"></div>\r\n <span className=\"font-mono text-lg font-semibold text-gray-900\">\r\n {formatTime(recordingTime)}\r\n </span>\r\n </div>\r\n <div className=\"h-6 w-px bg-gray-300\"></div>\r\n <span className=\"text-sm text-gray-600\">Recording canvas...</span>\r\n <button\r\n onClick={stopRecording}\r\n className=\"ml-2 flex items-center gap-2 rounded-full bg-red-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-red-700\"\r\n >\r\n <Stop className=\"h-4 w-4\" weight=\"fill\" />\r\n Stop\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-102 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-lg bg-white p-6 shadow-2xl\">\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <h2 className=\"text-xl font-semibold text-gray-900\">Screen Recording</h2>\r\n <button\r\n onClick={onClose}\r\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600\"\r\n >\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-6\">\r\n {!recordedBlob && (\r\n <div className=\"text-center\">\r\n <p className=\"mb-4 text-sm text-gray-600\">\r\n Record your canvas with voice narration. Everything you draw, type, or add will be\r\n captured automatically.\r\n </p>\r\n\r\n <div className=\"mb-4 flex items-center justify-center gap-2\">\r\n <button\r\n onClick={() => setIncludeMicrophone(!includeMicrophone)}\r\n className={`flex items-center gap-2 rounded-lg border px-4 py-2 text-sm transition-colors ${\r\n includeMicrophone\r\n ? 'border-blue-500 bg-blue-50 text-blue-700'\r\n : 'border-gray-300 bg-white text-gray-700 hover:bg-gray-50'\r\n }`}\r\n >\r\n {includeMicrophone ? (\r\n <>\r\n <Microphone className=\"h-5 w-5\" weight=\"fill\" />\r\n Microphone On\r\n </>\r\n ) : (\r\n <>\r\n <MicrophoneSlash className=\"h-5 w-5\" />\r\n Microphone Off\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n\r\n <button\r\n onClick={startRecording}\r\n className=\"flex items-center gap-2 rounded-lg bg-red-600 px-6 py-3 text-white transition-colors hover:bg-red-700\"\r\n >\r\n <Record className=\"h-5 w-5\" weight=\"fill\" />\r\n Start Recording\r\n </button>\r\n </div>\r\n )}\r\n\r\n {recordedBlob && (\r\n <div className=\"space-y-4\">\r\n {/* Video Preview */}\r\n <div className=\"overflow-hidden rounded-lg bg-gray-900\">\r\n <video\r\n src={URL.createObjectURL(recordedBlob)}\r\n controls\r\n className=\"w-full\"\r\n style={{ maxHeight: '300px' }}\r\n />\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-gray-600\">\r\n Recording saved! Duration: {formatTime(recordingTime)}\r\n </p>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"flex flex-col gap-2\">\r\n <button\r\n onClick={() => {\r\n if (onRecordingComplete && recordedBlob && canvasThumbnailRef.current) {\r\n onRecordingComplete(recordedBlob, canvasThumbnailRef.current);\r\n onClose();\r\n }\r\n }}\r\n className=\"flex items-center justify-center gap-2 rounded-lg bg-green-600 px-6 py-3 text-white transition-colors hover:bg-green-700\"\r\n >\r\n Add to Canvas\r\n </button>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={downloadRecording}\r\n className=\"flex flex-1 items-center justify-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-white transition-colors hover:bg-blue-700\"\r\n >\r\n <Download className=\"h-5 w-5\" />\r\n Download\r\n </button>\r\n <button\r\n onClick={() => {\r\n setRecordedBlob(null);\r\n setRecordingTime(0);\r\n }}\r\n className=\"flex-1 rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n Re-record\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"rounded-lg bg-blue-50 p-3\">\r\n <p className=\"text-xs text-blue-900\">\r\n <strong>Tip:</strong> The canvas will be recorded automatically. The modal will\r\n disappear during recording so you can freely draw and edit.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { Microphone, Stop, Play, Trash } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype ObjectAudioRecorderProps = {\r\n elementId: string;\r\n elementType:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'text'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks';\r\n existingAudio?: string;\r\n onSave: (audioData: string) => void;\r\n onDelete: () => void;\r\n onClose: () => void;\r\n};\r\n\r\nexport const ObjectAudioRecorder: React.FC<ObjectAudioRecorderProps> = ({\r\n elementType,\r\n existingAudio,\r\n onSave,\r\n onDelete,\r\n onClose,\r\n}) => {\r\n const [isRecording, setIsRecording] = useState(false);\r\n const [audioBlob, setAudioBlob] = useState<Blob | null>(null);\r\n const [isPlaying, setIsPlaying] = useState(false);\r\n const [recordingTime, setRecordingTime] = useState(0);\r\n\r\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\r\n const chunksRef = useRef<Blob[]>([]);\r\n const timerRef = useRef<NodeJS.Timeout | null>(null);\r\n const audioRef = useRef<HTMLAudioElement | null>(null);\r\n\r\n useEffect(() => {\r\n // Load existing audio if available\r\n if (existingAudio && !audioBlob) {\r\n fetch(existingAudio)\r\n .then((res) => res.blob())\r\n .then((blob) => setAudioBlob(blob))\r\n .catch((err) => console.error('Error loading audio:', err));\r\n }\r\n }, [existingAudio, audioBlob]);\r\n\r\n const startRecording = async () => {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n },\r\n });\r\n\r\n const mediaRecorder = new MediaRecorder(stream);\r\n mediaRecorderRef.current = mediaRecorder;\r\n chunksRef.current = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunksRef.current.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n const blob = new Blob(chunksRef.current, { type: 'audio/webm' });\r\n setAudioBlob(blob);\r\n stream.getTracks().forEach((track) => track.stop());\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n };\r\n\r\n mediaRecorder.start();\r\n setIsRecording(true);\r\n setRecordingTime(0);\r\n\r\n // Start timer\r\n timerRef.current = setInterval(() => {\r\n setRecordingTime((prev) => prev + 1);\r\n }, 1000);\r\n } catch (error) {\r\n console.error('Error starting audio recording:', error);\r\n alert('Failed to start recording. Please allow microphone access.');\r\n }\r\n };\r\n\r\n const stopRecording = () => {\r\n if (mediaRecorderRef.current && isRecording) {\r\n mediaRecorderRef.current.stop();\r\n setIsRecording(false);\r\n }\r\n };\r\n\r\n const playAudio = () => {\r\n if (audioBlob) {\r\n const url = URL.createObjectURL(audioBlob);\r\n const audio = new Audio(url);\r\n audioRef.current = audio;\r\n\r\n audio.onended = () => {\r\n setIsPlaying(false);\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n audio.play();\r\n setIsPlaying(true);\r\n }\r\n };\r\n\r\n const stopPlaying = () => {\r\n if (audioRef.current) {\r\n audioRef.current.pause();\r\n audioRef.current.currentTime = 0;\r\n setIsPlaying(false);\r\n }\r\n };\r\n\r\n const handleSave = async () => {\r\n if (audioBlob) {\r\n // Convert blob to base64\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n const base64 = reader.result as string;\r\n onSave(base64);\r\n onClose();\r\n };\r\n reader.readAsDataURL(audioBlob);\r\n }\r\n };\r\n\r\n const handleDelete = () => {\r\n setAudioBlob(null);\r\n onDelete();\r\n };\r\n\r\n const formatTime = (seconds: number) => {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n };\r\n\r\n // Recording top bar (shown during recording)\r\n if (isRecording) {\r\n return (\r\n <div className=\"fixed top-4 left-1/2 z-103 flex -translate-x-1/2 items-center gap-4 rounded-full border border-gray-200 bg-white px-6 py-3 shadow-2xl\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"h-3 w-3 animate-pulse rounded-full bg-red-600\"></div>\r\n <span className=\"font-mono text-lg font-semibold text-gray-900\">\r\n {formatTime(recordingTime)}\r\n </span>\r\n </div>\r\n <div className=\"h-6 w-px bg-gray-300\"></div>\r\n <span className=\"text-sm text-gray-600\">Recording audio...</span>\r\n <button\r\n onClick={stopRecording}\r\n className=\"ml-2 flex items-center gap-2 rounded-full bg-red-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-red-700\"\r\n >\r\n <Stop className=\"h-4 w-4\" weight=\"fill\" />\r\n Stop\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-103 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-sm rounded-lg bg-white p-6 shadow-2xl\">\r\n <div className=\"mb-4\">\r\n <h3 className=\"text-lg font-semibold text-gray-900\">\r\n Record Audio for{' '}\r\n {elementType.charAt(0).toUpperCase() + elementType.slice(1).replace(/([A-Z])/g, ' $1')}\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">Record a voice note for this element</p>\r\n </div>\r\n\r\n <div className=\"mb-6\">\r\n {!audioBlob && (\r\n <div className=\"text-center\">\r\n <button\r\n onClick={startRecording}\r\n className=\"flex w-full items-center justify-center gap-2 rounded-lg bg-red-600 px-6 py-3 text-white transition-colors hover:bg-red-700\"\r\n >\r\n <Microphone className=\"h-5 w-5\" weight=\"fill\" />\r\n Start Recording\r\n </button>\r\n </div>\r\n )}\r\n\r\n {audioBlob && (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-center justify-center gap-3\">\r\n <button\r\n onClick={isPlaying ? stopPlaying : playAudio}\r\n className=\"flex items-center gap-2 rounded-lg bg-blue-600 px-6 py-3 text-white transition-colors hover:bg-blue-700\"\r\n >\r\n <Play className=\"h-5 w-5\" weight=\"fill\" />\r\n {isPlaying ? 'Playing...' : 'Play Audio'}\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n className=\"flex items-center gap-2 rounded-lg border border-red-300 bg-white px-4 py-3 text-red-600 transition-colors hover:bg-red-50\"\r\n >\r\n <Trash className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n <button\r\n onClick={handleSave}\r\n className=\"w-full rounded-lg bg-green-600 px-6 py-3 text-white transition-colors hover:bg-green-700\"\r\n >\r\n Save Audio\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end\">\r\n <button\r\n onClick={onClose}\r\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef } from 'react';\r\nimport { SpeakerHigh, SpeakerSimpleSlash } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype AudioIndicatorProps = {\r\n audioData: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n};\r\n\r\nexport const AudioIndicator: React.FC<AudioIndicatorProps> = ({ audioData, x, y, width }) => {\r\n const [isPlaying, setIsPlaying] = useState(false);\r\n const audioRef = useRef<HTMLAudioElement | null>(null);\r\n\r\n const handlePlayAudio = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n if (isPlaying && audioRef.current) {\r\n audioRef.current.pause();\r\n audioRef.current.currentTime = 0;\r\n setIsPlaying(false);\r\n } else {\r\n const audio = new Audio(audioData);\r\n audioRef.current = audio;\r\n\r\n audio.onended = () => {\r\n setIsPlaying(false);\r\n };\r\n\r\n audio.onerror = () => {\r\n console.error('Error playing audio');\r\n setIsPlaying(false);\r\n };\r\n\r\n audio.play();\r\n setIsPlaying(true);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handlePlayAudio}\r\n className={`absolute flex items-center justify-center rounded-full shadow-lg transition-all hover:scale-110 ${\r\n isPlaying ? 'bg-green-500 hover:bg-green-600' : 'bg-blue-500 hover:bg-blue-600'\r\n }`}\r\n style={{\r\n left: `${x + width - 35}px`,\r\n top: `${y + 5}px`,\r\n width: '30px',\r\n height: '30px',\r\n zIndex: 99,\r\n }}\r\n title={isPlaying ? 'Stop Audio' : 'Play Audio'}\r\n >\r\n {isPlaying ? (\r\n <SpeakerSimpleSlash className=\"h-4 w-4 text-white\" weight=\"fill\" />\r\n ) : (\r\n <SpeakerHigh className=\"h-4 w-4 text-white\" weight=\"fill\" />\r\n )}\r\n </button>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useMemo, useState, useEffect } from 'react';\r\nimport { Reorder } from 'framer-motion';\r\nimport {\r\n X,\r\n ArrowUp,\r\n ArrowDown,\r\n Image as ImageIcon,\r\n VideoCamera,\r\n Shapes,\r\n TextT,\r\n Cards,\r\n FrameCorners,\r\n Question,\r\n Stack,\r\n DotsSixVertical,\r\n} from '@phosphor-icons/react';\r\nimport { useSelector, useDispatch } from '@/store/hooks';\r\nimport { selectCurrentSlide, updateElementOrder } from '@/store/slices/canvasSlice';\r\n\r\ntype LayerItem = {\r\n id: string;\r\n type:\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'text'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks'\r\n | 'line';\r\n name: string;\r\n timestamp: number;\r\n};\r\n\r\ntype LayersPanelProps = {\r\n selectedElementId?: string;\r\n onClose: () => void;\r\n onSelectElement: (id: string, type: LayerItem['type']) => void;\r\n};\r\n\r\nexport const LayersPanel: React.FC<LayersPanelProps> = ({\r\n selectedElementId,\r\n onClose,\r\n onSelectElement,\r\n}) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n\r\n const layers = useMemo(() => {\r\n if (!currentSlide) return [];\r\n\r\n const allLayers: LayerItem[] = [];\r\n\r\n // Add all elements with their timestamps\r\n currentSlide.images?.forEach((img) => {\r\n allLayers.push({\r\n id: img.id,\r\n type: 'image',\r\n name: `Image`,\r\n timestamp: img.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.videos?.forEach((vid) => {\r\n allLayers.push({\r\n id: vid.id,\r\n type: 'video',\r\n name: `Video`,\r\n timestamp: vid.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.shapes?.forEach((shape) => {\r\n allLayers.push({\r\n id: shape.id,\r\n type: 'shape',\r\n name: `${shape.type} Shape`,\r\n timestamp: shape.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.texts?.forEach((text) => {\r\n allLayers.push({\r\n id: text.id,\r\n type: 'text',\r\n name: text.text.substring(0, 20) + (text.text.length > 20 ? '...' : ''),\r\n timestamp: text.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.flashcards?.forEach((fc) => {\r\n allLayers.push({\r\n id: fc.id,\r\n type: 'flashcard',\r\n name: `Flashcard (${fc.images.length} images)`,\r\n timestamp: fc.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.photoFrames?.forEach((pf) => {\r\n allLayers.push({\r\n id: pf.id,\r\n type: 'photoFrame',\r\n name: `Photo Frame`,\r\n timestamp: pf.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.multipleChoices?.forEach((mc) => {\r\n allLayers.push({\r\n id: mc.id,\r\n type: 'mcq',\r\n name: `Multiple Choice`,\r\n timestamp: mc.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.trueFalses?.forEach((tf) => {\r\n allLayers.push({\r\n id: tf.id,\r\n type: 'trueFalse',\r\n name: `True/False`,\r\n timestamp: tf.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.shortAnswers?.forEach((sa) => {\r\n allLayers.push({\r\n id: sa.id,\r\n type: 'shortAnswer',\r\n name: `Short Answer`,\r\n timestamp: sa.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.LongAnswer?.forEach((la) => {\r\n allLayers.push({\r\n id: la.id,\r\n type: 'longAnswer',\r\n name: `Long Answer`,\r\n timestamp: la.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.fillInTheBlanks?.forEach((fib) => {\r\n allLayers.push({\r\n id: fib.id,\r\n type: 'fillInTheBlanks',\r\n name: `Fill in the Blanks`,\r\n timestamp: fib.timestamp || 0,\r\n });\r\n });\r\n\r\n currentSlide.lines?.forEach((line) => {\r\n if (line.id) {\r\n allLayers.push({\r\n id: line.id,\r\n type: 'line',\r\n name: `Drawn Line`,\r\n timestamp: line.timestamp || 0,\r\n });\r\n }\r\n });\r\n\r\n // Sort by timestamp (oldest first = bottom layer), then reverse for display (top layers first)\r\n return allLayers.sort((a, b) => b.timestamp - a.timestamp);\r\n }, [currentSlide]);\r\n\r\n // Local state for drag reordering\r\n const [orderedLayers, setOrderedLayers] = useState<LayerItem[]>(layers);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Sync local state with layers when they change (but not during drag)\r\n useEffect(() => {\r\n if (!isDragging) {\r\n setOrderedLayers(layers);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [layers]);\r\n\r\n const getIcon = (type: LayerItem['type']) => {\r\n const iconClass = 'h-5 w-5';\r\n switch (type) {\r\n case 'image':\r\n return <ImageIcon className={iconClass} />;\r\n case 'video':\r\n return <VideoCamera className={iconClass} />;\r\n case 'shape':\r\n return <Shapes className={iconClass} />;\r\n case 'text':\r\n return <TextT className={iconClass} />;\r\n case 'flashcard':\r\n return <Cards className={iconClass} />;\r\n case 'photoFrame':\r\n return <FrameCorners className={iconClass} />;\r\n case 'line':\r\n return <span className={iconClass}>✏️</span>;\r\n default:\r\n return <Question className={iconClass} />;\r\n }\r\n };\r\n\r\n const handleMoveUp = (index: number) => {\r\n if (index === 0) return; // Already at top (in reversed display)\r\n\r\n const layer = orderedLayers[index];\r\n const layerAbove = orderedLayers[index - 1];\r\n\r\n // Swap timestamps to change order (higher timestamp = above)\r\n dispatch(\r\n updateElementOrder({\r\n id: layer.id,\r\n type: layer.type,\r\n newTimestamp: layerAbove.timestamp + 1,\r\n })\r\n );\r\n };\r\n\r\n const handleMoveDown = (index: number) => {\r\n if (index === orderedLayers.length - 1) return; // Already at bottom\r\n\r\n const layer = orderedLayers[index];\r\n const layerBelow = orderedLayers[index + 1];\r\n\r\n // Swap timestamps to change order (lower timestamp = below)\r\n dispatch(\r\n updateElementOrder({\r\n id: layer.id,\r\n type: layer.type,\r\n newTimestamp: layerBelow.timestamp - 1,\r\n })\r\n );\r\n };\r\n\r\n const handleReorder = (newOrder: LayerItem[]) => {\r\n setIsDragging(true);\r\n setOrderedLayers(newOrder);\r\n };\r\n\r\n const handleDragEnd = () => {\r\n setIsDragging(false);\r\n\r\n // Update timestamps for all layers based on their new order\r\n // The first item in the list should have the highest timestamp (top layer)\r\n const baseTimestamp = Date.now();\r\n orderedLayers.forEach((layer, index) => {\r\n const newTimestamp = baseTimestamp - index; // Higher index = lower timestamp = lower layer\r\n dispatch(\r\n updateElementOrder({\r\n id: layer.id,\r\n type: layer.type,\r\n newTimestamp,\r\n })\r\n );\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div className=\"fixed inset-0 z-9998 bg-black/30\" onClick={onClose} />\r\n\r\n {/* Panel */}\r\n <div className=\"fixed top-1/2 left-1/2 z-9999 w-96 -translate-x-1/2 -translate-y-1/2 rounded-lg border border-gray-200 bg-white shadow-2xl\">\r\n <div className=\"flex items-center justify-between border-b border-gray-200 p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Stack className=\"h-5 w-5 text-gray-700\" weight=\"bold\" />\r\n <h3 className=\"font-semibold text-gray-900\">Layers</h3>\r\n </div>\r\n <button\r\n onClick={onClose}\r\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600\"\r\n >\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"max-h-96 overflow-y-auto p-2\">\r\n {orderedLayers.length === 0 ? (\r\n <div className=\"p-8 text-center text-sm text-gray-500\">No elements on this slide</div>\r\n ) : (\r\n <Reorder.Group\r\n axis=\"y\"\r\n values={orderedLayers}\r\n onReorder={handleReorder}\r\n className=\"space-y-1\"\r\n >\r\n {orderedLayers.map((layer, index) => {\r\n const isSelected = layer.id === selectedElementId;\r\n\r\n return (\r\n <Reorder.Item\r\n key={layer.id}\r\n value={layer}\r\n onDragEnd={handleDragEnd}\r\n className={`flex cursor-grab items-center gap-2 rounded-lg p-2 transition-colors active:cursor-grabbing ${\r\n isSelected\r\n ? 'border border-blue-200 bg-blue-50'\r\n : 'border border-transparent hover:bg-gray-50'\r\n }`}\r\n whileDrag={{\r\n scale: 1.02,\r\n boxShadow: '0 8px 20px rgba(0,0,0,0.15)',\r\n backgroundColor: 'white',\r\n zIndex: 50,\r\n }}\r\n >\r\n {/* Drag handle indicator */}\r\n <div className=\"text-gray-400\">\r\n <DotsSixVertical className=\"h-4 w-4\" weight=\"bold\" />\r\n </div>\r\n\r\n {/* Clickable area for selection */}\r\n <div\r\n onClick={() => onSelectElement(layer.id, layer.type)}\r\n className=\"flex flex-1 cursor-pointer items-center gap-2\"\r\n >\r\n <div className={`${isSelected ? 'text-blue-600' : 'text-gray-600'}`}>\r\n {getIcon(layer.type)}\r\n </div>\r\n <span\r\n className={`text-sm ${isSelected ? 'font-medium text-blue-900' : 'text-gray-700'}`}\r\n >\r\n {layer.name}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex gap-1\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleMoveUp(index);\r\n }}\r\n disabled={index === 0}\r\n className=\"rounded p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 disabled:cursor-not-allowed disabled:opacity-30\"\r\n title=\"Move up (forward)\"\r\n >\r\n <ArrowUp className=\"h-4 w-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleMoveDown(index);\r\n }}\r\n disabled={index === orderedLayers.length - 1}\r\n className=\"rounded p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 disabled:cursor-not-allowed disabled:opacity-30\"\r\n title=\"Move down (backward)\"\r\n >\r\n <ArrowDown className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n </Reorder.Item>\r\n );\r\n })}\r\n </Reorder.Group>\r\n )}\r\n </div>\r\n\r\n <div className=\"border-t border-gray-200 p-3 text-xs text-gray-500\">\r\n <p>Drag to reorder • Top layers appear above bottom layers</p>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n","import { Group, Rect, Text } from 'react-konva';\r\nimport { MultipleChoice as MultipleChoiceType } from '@/store/slices/canvasSlice';\r\nimport { useSelector } from 'react-redux';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { useRef, useEffect, useState, memo } from 'react';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype MultipleChoiceLayerProps = {\r\n multipleChoice: MultipleChoiceType;\r\n handleMcqTransform: (mcqId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n mcqRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n handleDragEnd: (e: KonvaEventObject<DragEvent>) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nconst MultipleChoice = memo(\r\n ({\r\n multipleChoice,\r\n handleMcqTransform,\r\n handleSelect,\r\n mcqRefs,\r\n handleDragEnd,\r\n onContextMenu,\r\n }: MultipleChoiceLayerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const [selectedOptions, setSelectedOptions] = useState<Set<number>>(new Set());\r\n const [isChecked, setIsChecked] = useState(false);\r\n const [pressedButton, setPressedButton] = useState<string | null>(null);\r\n const groupRef = useRef<Konva.Group>(null);\r\n\r\n useEffect(() => {\r\n const node = groupRef.current;\r\n if (node) {\r\n mcqRefs.current.set(multipleChoice.id, node);\r\n return () => {\r\n mcqRefs.current.delete(multipleChoice.id);\r\n };\r\n }\r\n }, [multipleChoice.id]);\r\n\r\n const correctIndices = new Set(multipleChoice.data.responseOptions.correctIndex);\r\n const isMultipleAnswer = correctIndices.size > 1;\r\n\r\n const handleOptionClick = (index: number) => {\r\n if (isChecked) return;\r\n\r\n if (isMultipleAnswer) {\r\n setSelectedOptions((prev) => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(index)) {\r\n newSet.delete(index);\r\n } else {\r\n newSet.add(index);\r\n }\r\n return newSet;\r\n });\r\n } else {\r\n setSelectedOptions(new Set([index]));\r\n }\r\n };\r\n\r\n const handleCheckWork = () => {\r\n if (selectedOptions.size > 0) {\r\n setIsChecked(true);\r\n }\r\n };\r\n\r\n const handleReset = () => {\r\n setIsChecked(false);\r\n setSelectedOptions(new Set());\r\n };\r\n\r\n const isFullyCorrect =\r\n selectedOptions.size === correctIndices.size &&\r\n Array.from(selectedOptions).every((idx) => correctIndices.has(idx));\r\n const correctlySelected = Array.from(selectedOptions).filter((idx) => correctIndices.has(idx));\r\n const isPartiallyCorrect = isMultipleAnswer && correctlySelected.length > 0 && !isFullyCorrect;\r\n\r\n const getFeedbackMessage = () => {\r\n if (isFullyCorrect) {\r\n return '✓ Correct! Great job! 🎉';\r\n } else if (isPartiallyCorrect) {\r\n return `⚠ Partially correct (${correctlySelected.length}/${correctIndices.size})`;\r\n } else {\r\n return '✗ Try again!';\r\n }\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isFullyCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n if (isPartiallyCorrect) return { bg: '#fef3c7', text: '#92400e' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n const optionHeight = 55;\r\n const optionGap = 8;\r\n const padding = 24;\r\n const questionTitleHeight = 60;\r\n const feedbackHeight = 60;\r\n const instructionHeight = isMultipleAnswer && !isChecked ? 25 : 0;\r\n const buttonHeight = multipleChoice.data.feedbackMode === 'practice' ? 48 : 0;\r\n const buttonTopMargin = 12;\r\n\r\n const optionsStartY =\r\n questionTitleHeight + instructionHeight + (isChecked ? feedbackHeight : 0);\r\n\r\n const optionsHeight =\r\n multipleChoice.data.responseOptions.options.length * (optionHeight + optionGap);\r\n const totalHeight = optionsStartY + optionsHeight + buttonTopMargin + buttonHeight + padding;\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n name=\"mcq-element\"\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={multipleChoice.x}\r\n y={multipleChoice.y}\r\n rotation={multipleChoice.rotation}\r\n width={multipleChoice.width}\r\n height={multipleChoice.height}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: handleDragEnd,\r\n onClick: (e: KonvaEventObject<MouseEvent>) => handleSelect(multipleChoice.id),\r\n onTap: (e: KonvaEventObject<TouchEvent>) => handleSelect(multipleChoice.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n const mousePos = groupRef.current?.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const imageRect = {\r\n x: multipleChoice.x,\r\n y: multipleChoice.y,\r\n width: multipleChoice.width,\r\n height: multipleChoice.height,\r\n };\r\n if (\r\n mousePos.x >= imageRect.x &&\r\n mousePos.x <= imageRect.x + imageRect.width &&\r\n mousePos.y >= imageRect.y &&\r\n mousePos.y <= imageRect.y + imageRect.height\r\n ) {\r\n const reactEvent = e.evt as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent, multipleChoice.id, 'mcq');\r\n }\r\n }\r\n },\r\n }\r\n : {})}\r\n >\r\n <Rect\r\n fill=\"white\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n height={totalHeight}\r\n width={multipleChoice.width}\r\n onTransformEnd={(e) => handleMcqTransform(multipleChoice.id, e)}\r\n />\r\n\r\n {/* Question Title */}\r\n <Text\r\n x={padding}\r\n y={padding}\r\n text={multipleChoice.data.question}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n width={multipleChoice.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Instruction */}\r\n {isMultipleAnswer && !isChecked && multipleChoice.data.feedbackMode === 'practice' ? (\r\n <Text\r\n x={padding}\r\n y={padding + 35}\r\n text={`Select ${correctIndices.size} answers (${selectedOptions.size}/${correctIndices.size} selected)`}\r\n fontSize={14}\r\n fill=\"#6b7280\"\r\n width={multipleChoice.width - padding * 2}\r\n listening={false}\r\n />\r\n ) : null}\r\n\r\n {/* Feedback Message */}\r\n {isChecked && multipleChoice.data.feedbackMode === 'practice' ? (\r\n <>\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight + instructionHeight}\r\n width={multipleChoice.width - padding * 2}\r\n height={feedbackHeight}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={padding}\r\n y={questionTitleHeight + instructionHeight}\r\n width={multipleChoice.width - padding * 2}\r\n height={feedbackHeight}\r\n text={getFeedbackMessage()}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </>\r\n ) : null}\r\n\r\n {/* Options */}\r\n {multipleChoice.data.responseOptions.options.map((option, index) => {\r\n const isThisCorrect = correctIndices.has(index);\r\n const isSelected = selectedOptions.has(index);\r\n const yPos = optionsStartY + index * (optionHeight + optionGap);\r\n\r\n let borderColor = '#e5e7eb';\r\n let bgColor = '#ffffff';\r\n if (isChecked && isThisCorrect) {\r\n borderColor = '#22c55e';\r\n bgColor = '#dcfce7';\r\n } else if (isChecked && isSelected && !isThisCorrect) {\r\n borderColor = '#ef4444';\r\n bgColor = '#fee2e2';\r\n } else if (isSelected) {\r\n borderColor = '#096B76';\r\n bgColor = '#ecfeff';\r\n }\r\n\r\n return (\r\n <Group key={index}>\r\n {/* Option Box */}\r\n <Rect\r\n x={padding}\r\n y={yPos}\r\n width={multipleChoice.width - padding * 2}\r\n height={optionHeight}\r\n fill={bgColor}\r\n stroke={borderColor}\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n handleOptionClick(index);\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n handleOptionClick(index);\r\n }}\r\n />\r\n\r\n {/* Checkbox/Radio Circle */}\r\n <Rect\r\n x={padding + 12}\r\n y={yPos + (optionHeight - 20) / 2}\r\n width={20}\r\n height={20}\r\n fill={isSelected ? '#096B76' : 'white'}\r\n stroke={isSelected ? '#096B76' : '#d1d5db'}\r\n strokeWidth={2}\r\n cornerRadius={isMultipleAnswer ? 4 : 10}\r\n listening={false}\r\n />\r\n\r\n {/* Checkmark for selected */}\r\n {isSelected && (\r\n <Text\r\n x={padding + 12}\r\n y={yPos + (optionHeight - 20) / 2}\r\n width={20}\r\n height={20}\r\n text=\"✓\"\r\n fontSize={14}\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n\r\n {/* Option Text */}\r\n <Text\r\n x={padding + 44}\r\n y={yPos}\r\n width={multipleChoice.width - padding * 2 - 80}\r\n height={optionHeight}\r\n text={option}\r\n fontSize={16}\r\n fill=\"#111827\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n\r\n {/* Feedback icons */}\r\n {isChecked && isThisCorrect && (\r\n <Text\r\n x={multipleChoice.width - padding - 30}\r\n y={yPos + (optionHeight - 24) / 2}\r\n width={24}\r\n height={24}\r\n text=\"✓\"\r\n fontSize={20}\r\n fill=\"#22c55e\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n {isChecked && isSelected && !isThisCorrect && (\r\n <Text\r\n x={multipleChoice.width - padding - 30}\r\n y={yPos + (optionHeight - 24) / 2}\r\n width={24}\r\n height={24}\r\n text=\"✗\"\r\n fontSize={20}\r\n fill=\"#ef4444\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n </Group>\r\n );\r\n })}\r\n\r\n {/* Action Buttons */}\r\n {multipleChoice.data.feedbackMode === 'practice' && (\r\n <Group\r\n y={\r\n optionsStartY +\r\n multipleChoice.data.responseOptions.options.length * (optionHeight + optionGap) +\r\n 12\r\n }\r\n >\r\n {/* Check Work Button */}\r\n <Group\r\n onMouseDown={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onMouseUp={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n handleCheckWork();\r\n }}\r\n onMouseLeave={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n }}\r\n onTouchStart={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onTouchEnd={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n handleCheckWork();\r\n }}\r\n scaleX={pressedButton === 'check' ? 0.95 : 1}\r\n scaleY={pressedButton === 'check' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={(multipleChoice.width - padding * 2 - 8) / (isChecked ? 2 : 1)}\r\n height={48}\r\n fill={selectedOptions.size === 0 || isChecked ? '#9ca3af' : '#096B76'}\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={(multipleChoice.width - padding * 2 - 8) / (isChecked ? 2 : 1)}\r\n height={48}\r\n text={isChecked ? 'Submitted' : 'Check Work'}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n\r\n {/* Reset Button */}\r\n {isChecked && (\r\n <Group\r\n x={(multipleChoice.width - padding * 2) / 2 + 8}\r\n onMouseDown={() => setPressedButton('reset')}\r\n onMouseUp={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n onMouseLeave={() => setPressedButton(null)}\r\n onTouchStart={() => setPressedButton('reset')}\r\n onTouchEnd={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n scaleX={pressedButton === 'reset' ? 0.95 : 1}\r\n scaleY={pressedButton === 'reset' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={(multipleChoice.width - padding * 2 - 8) / 2}\r\n height={48}\r\n fill=\"#ef4444\"\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={(multipleChoice.width - padding * 2 - 8) / 2}\r\n height={48}\r\n text=\"Reset\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n )}\r\n </Group>\r\n );\r\n }\r\n);\r\nMultipleChoice.displayName = 'MultipleChoice';\r\nexport default MultipleChoice;\r\n","import { MultipleChoice } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { MutableRefObject, useRef, useState } from 'react';\r\nimport Konva from 'konva';\r\nimport { Group, Rect, Text } from 'react-konva';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { updateMultipleChoice } from '@/store/slices/canvasSlice';\r\nimport type { RootState } from '@/store/store';\r\n\r\nconst white = '#FFFFFF';\r\n\r\ntype MultipleChoiceDragAndDropProps = {\r\n multipleChoice: MultipleChoice;\r\n handleMcqTransform: (mcqId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n mcqRefs: MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nexport const MultipleChoiceDragAndDrop = ({\r\n multipleChoice,\r\n onContextMenu,\r\n handleMcqTransform,\r\n}: MultipleChoiceDragAndDropProps) => {\r\n const dispatch = useDispatch();\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const [isHovering, setIsHovering] = useState(false);\r\n const [droppedOptions, setDroppedOptions] = useState<Set<number>>(new Set());\r\n const [isChecked, setIsChecked] = useState(false);\r\n const [isPressed, setIsPressed] = useState(false);\r\n const [resetKey, setResetKey] = useState(0);\r\n\r\n const screenX = 340;\r\n const screenY = 100;\r\n const screenWidth = window.innerWidth * 0.5;\r\n const screenHeight = window.innerHeight * 0.5;\r\n\r\n // Drop zone boundaries (inside the dashed border)\r\n const dropZoneX = screenX + 20;\r\n const dropZoneY = screenY + 60;\r\n const dropZoneWidth = screenWidth - 40;\r\n const dropZoneHeight = screenHeight - 160;\r\n\r\n // Create a local ref to store the group node\r\n const groupRef = useRef<Konva.Group>(null);\r\n\r\n const handleDragEnd = (e: KonvaEventObject<DragEvent>) => {\r\n dispatch(\r\n updateMultipleChoice({\r\n id: multipleChoice.id,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n })\r\n );\r\n };\r\n\r\n const handleOptionDragMove = (e: KonvaEventObject<DragEvent>) => {\r\n const node = e.target;\r\n const optionX = node.x();\r\n const optionY = node.y();\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n\r\n // Check if option overlaps with drop zone\r\n const isOverDropZone =\r\n optionX + optionWidth > dropZoneX &&\r\n optionX < dropZoneX + dropZoneWidth &&\r\n optionY + optionHeight > dropZoneY &&\r\n optionY < dropZoneY + dropZoneHeight;\r\n\r\n setIsHovering(isOverDropZone);\r\n };\r\n\r\n const handleOptionDragEnd = (index: number, e: KonvaEventObject<DragEvent>) => {\r\n const node = e.target;\r\n const optionX = node.x();\r\n const optionY = node.y();\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n\r\n // Check if dropped in drop zone\r\n const isInDropZone =\r\n optionX + optionWidth > dropZoneX &&\r\n optionX < dropZoneX + dropZoneWidth &&\r\n optionY + optionHeight > dropZoneY &&\r\n optionY < dropZoneY + dropZoneHeight;\r\n\r\n if (isInDropZone) {\r\n setDroppedOptions((prev) => new Set(prev).add(index));\r\n } else {\r\n setDroppedOptions((prev) => {\r\n const newSet = new Set(prev);\r\n newSet.delete(index);\r\n return newSet;\r\n });\r\n }\r\n\r\n setIsHovering(false);\r\n };\r\n\r\n const handleCheckWork = () => {\r\n setIsChecked(true);\r\n };\r\n\r\n const handleReset = () => {\r\n setIsChecked(false);\r\n setDroppedOptions(new Set());\r\n setResetKey((prev) => prev + 1);\r\n };\r\n\r\n // Check if answer is correct - support multiple correct answers\r\n const correctIndices = new Set(multipleChoice.data.responseOptions.correctIndex);\r\n const isFullyCorrect =\r\n droppedOptions.size === correctIndices.size &&\r\n Array.from(droppedOptions).every((idx) => correctIndices.has(idx));\r\n\r\n // Check for partial correctness\r\n const correctlyDropped = Array.from(droppedOptions).filter((idx) => correctIndices.has(idx));\r\n const incorrectlyDropped = Array.from(droppedOptions).filter((idx) => !correctIndices.has(idx));\r\n const isPartiallyCorrect = correctlyDropped.length > 0 && !isFullyCorrect;\r\n\r\n // Feedback message\r\n const getFeedbackMessage = () => {\r\n if (isFullyCorrect) {\r\n return '✓ Correct! Great job!';\r\n } else if (isPartiallyCorrect) {\r\n return `⚠ Partially correct (${correctlyDropped.length}/${correctIndices.size})`;\r\n } else {\r\n return '✗ Try again!';\r\n }\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isFullyCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n if (isPartiallyCorrect) return { bg: '#fef3c7', text: '#92400e' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n name=\"mcq-element\"\r\n width={screenWidth}\r\n height={screenHeight}\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, multipleChoice.id, 'mcq');\r\n },\r\n }\r\n : {})}\r\n >\r\n <Group x={screenX} y={screenY} rotation={multipleChoice.rotation} onDragEnd={handleDragEnd}>\r\n {/* Background */}\r\n <Rect\r\n fill=\"white\"\r\n stroke={isHovering ? '#4CAF50' : '#e5e7eb'}\r\n strokeWidth={isHovering ? 4 : 2}\r\n cornerRadius={12}\r\n height={\r\n multipleChoice.data.feedbackMode === 'practice' ? screenHeight - 10 : screenHeight - 50\r\n }\r\n width={screenWidth}\r\n shadowColor={isHovering ? '#4CAF50' : 'transparent'}\r\n shadowBlur={isHovering ? 20 : 0}\r\n shadowOpacity={0.5}\r\n />\r\n\r\n {/* Question text */}\r\n <Text\r\n x={20}\r\n y={20}\r\n width={screenWidth - 40}\r\n text={multipleChoice.data.question}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n\r\n {/* Drop Zone - dashed border */}\r\n <Rect\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={dropZoneHeight}\r\n fill=\"transparent\"\r\n stroke={isHovering ? '#4CAF50' : '#075560'}\r\n strokeWidth={3}\r\n dash={[10, 10]}\r\n cornerRadius={8}\r\n />\r\n\r\n {/* Feedback Message */}\r\n {isChecked && (\r\n <>\r\n <Rect\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={60}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={60}\r\n text={getFeedbackMessage()}\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Drop Here text - only show when no options dropped and not checked */}\r\n {droppedOptions.size === 0 && !isChecked && (\r\n <Text\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={dropZoneHeight - 60}\r\n text={\r\n correctIndices.size > 1\r\n ? `Drop ${correctIndices.size} Correct Answers Here`\r\n : 'Drop Here'\r\n }\r\n fontSize={28}\r\n fontStyle=\"bold\"\r\n fill=\"#075560\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n )}\r\n\r\n {/* Instruction text when items are dropped */}\r\n {droppedOptions.size > 0 && !isChecked && (\r\n <Text\r\n x={20}\r\n y={screenHeight - 120}\r\n width={dropZoneWidth}\r\n text={`${droppedOptions.size} of ${correctIndices.size} answers selected`}\r\n fontSize={16}\r\n fill=\"#6b7280\"\r\n align=\"center\"\r\n />\r\n )}\r\n\r\n {/* Action Buttons */}\r\n {multipleChoice.data.feedbackMode === 'practice' ? (\r\n <Group x={20} y={screenHeight - 90}>\r\n {/* Check Work Button */}\r\n <Group\r\n onMouseDown={() => {\r\n setIsPressed(true);\r\n handleCheckWork();\r\n }}\r\n onMouseUp={() => setIsPressed(false)}\r\n onMouseLeave={() => setIsPressed(false)}\r\n onTouchStart={() => {\r\n setIsPressed(true);\r\n handleCheckWork();\r\n }}\r\n onTouchEnd={() => setIsPressed(false)}\r\n scaleX={isPressed ? 0.95 : 1}\r\n scaleY={isPressed ? 0.95 : 1}\r\n >\r\n <Rect\r\n fill=\"#075560\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n height={40}\r\n width={dropZoneWidth}\r\n />\r\n <Text\r\n text=\"Check Work\"\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n width={dropZoneWidth}\r\n height={40}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n\r\n {/* Reset Button */}\r\n {isChecked && (\r\n <Group y={50} onMouseDown={handleReset} onTouchStart={handleReset}>\r\n <Rect\r\n fill=\"#dc2626\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n height={40}\r\n width={dropZoneWidth}\r\n />\r\n <Text\r\n text=\"Reset\"\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n width={dropZoneWidth}\r\n height={40}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n ) : null}\r\n </Group>\r\n\r\n {/* Draggable Options */}\r\n {multipleChoice.data.responseOptions.options.map((option, index) => {\r\n const col = index % 2;\r\n const row = Math.floor(index / 2);\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n const gap = 10;\r\n\r\n const isDropped = droppedOptions.has(index);\r\n const isCorrectOption = correctIndices.has(index);\r\n const showFeedback = isChecked && isDropped;\r\n\r\n // Determine border color based on correctness\r\n let strokeColor = 'transparent';\r\n if (showFeedback) {\r\n strokeColor = isCorrectOption ? '#4CAF50' : '#ef4444';\r\n } else if (isDropped) {\r\n strokeColor = '#4CAF50';\r\n }\r\n\r\n return (\r\n <Group\r\n key={`${index}-${resetKey}`}\r\n x={400 + 20 + col * (optionWidth + gap)}\r\n y={screenY + screenHeight + 20 + row * (optionHeight + gap)}\r\n draggable={!isChecked}\r\n onDragMove={handleOptionDragMove}\r\n onDragEnd={(e) => handleOptionDragEnd(index, e)}\r\n opacity={isChecked && !isDropped ? 0.5 : 1}\r\n >\r\n <Rect\r\n width={optionWidth}\r\n height={optionHeight}\r\n fill=\"#075560\"\r\n stroke={strokeColor}\r\n strokeWidth={4}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n width={optionWidth}\r\n height={optionHeight}\r\n text={option}\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill={white}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n {/* Show checkmark or X for dropped options after checking */}\r\n {showFeedback && (\r\n <Text\r\n x={optionWidth - 30}\r\n y={5}\r\n width={25}\r\n height={25}\r\n text={isCorrectOption ? '✓' : '✗'}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill={isCorrectOption ? '#4CAF50' : '#ef4444'}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n </Group>\r\n );\r\n })}\r\n </Group>\r\n );\r\n};\r\n\r\nMultipleChoiceDragAndDrop.displayName = 'MultipleChoiceDragAndDrop';\r\n","import MultipleChoice from '../elements/MultipleChoice';\r\nimport { MultipleChoiceDragAndDrop } from '../elements/MultipleChoiceDragAndDrop';\r\nimport { MultipleChoice as MultipleChoiceType } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { MutableRefObject } from 'react';\r\n\r\ntype MultipleChoiceLayerProps = {\r\n multipleChoice: MultipleChoiceType[];\r\n handleMcqTransform: (mcqId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n mcqRefs: MutableRefObject<Map<string, Konva.Group>>;\r\n handleDragEnd: (e: KonvaEventObject<DragEvent>, mcqId: string) => void;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq'\r\n ) => void;\r\n};\r\n\r\nexport const MultipleChoiceLayer = ({\r\n multipleChoice,\r\n handleMcqTransform,\r\n handleSelect,\r\n mcqRefs,\r\n handleDragEnd,\r\n onContextMenu,\r\n}: MultipleChoiceLayerProps) => {\r\n return (\r\n <>\r\n {multipleChoice.map((mcq) =>\r\n mcq.data.responseType === 'classic' ? (\r\n <MultipleChoice\r\n key={mcq.id}\r\n multipleChoice={mcq}\r\n handleMcqTransform={handleMcqTransform}\r\n handleSelect={handleSelect}\r\n mcqRefs={mcqRefs}\r\n handleDragEnd={(e) => handleDragEnd(e, mcq.id)}\r\n onContextMenu={onContextMenu}\r\n />\r\n ) : (\r\n <MultipleChoiceDragAndDrop\r\n key={mcq.id}\r\n multipleChoice={mcq}\r\n handleMcqTransform={handleMcqTransform}\r\n handleSelect={handleSelect}\r\n mcqRefs={mcqRefs}\r\n onContextMenu={onContextMenu}\r\n />\r\n )\r\n )}\r\n </>\r\n );\r\n};\r\n","import { Group, Rect, Text } from 'react-konva';\r\nimport { TrueFalse as TrueFalseType } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { useRef, useEffect, useState, memo } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype TrueFalseLayerProps = {\r\n trueFalse: TrueFalseType;\r\n handleTrueFalseTransform: (trueFalseId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n trueFalseRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq' | 'trueFalse'\r\n ) => void;\r\n handleDragEnd: (e: KonvaEventObject<DragEvent>, trueFalseId: string) => void;\r\n};\r\n\r\nconst TrueFalse = memo(\r\n ({\r\n trueFalse,\r\n handleTrueFalseTransform,\r\n handleSelect,\r\n trueFalseRefs,\r\n onContextMenu,\r\n handleDragEnd,\r\n }: TrueFalseLayerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const [selectedAnswer, setSelectedAnswer] = useState<boolean | null>(null);\r\n const [isChecked, setIsChecked] = useState(false);\r\n const [pressedButton, setPressedButton] = useState<string | null>(null);\r\n\r\n // Create a local ref to store the group node\r\n const groupRef = useRef<Konva.Group>(null);\r\n\r\n // Update the refs map when the component mounts/unmounts\r\n useEffect(() => {\r\n const node = groupRef.current;\r\n if (node) {\r\n trueFalseRefs.current.set(trueFalse.id, node);\r\n return () => {\r\n trueFalseRefs.current.delete(trueFalse.id);\r\n };\r\n }\r\n }, [trueFalse.id]);\r\n\r\n const handleCheckWork = () => {\r\n if (selectedAnswer !== null) {\r\n setIsChecked(true);\r\n }\r\n };\r\n\r\n const handleReset = () => {\r\n setIsChecked(false);\r\n setSelectedAnswer(null);\r\n };\r\n\r\n const correctAnswer = trueFalse.data.responseOptions.correctAnswer;\r\n const isCorrect = selectedAnswer === correctAnswer;\r\n\r\n const handleOptionClick = (value: boolean) => {\r\n if (isChecked) return;\r\n setSelectedAnswer(value);\r\n };\r\n\r\n const getFeedbackMessage = () => {\r\n if (isCorrect) {\r\n return '✓ Correct! Great job! 🎉';\r\n }\r\n return '✗ Try again!';\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n const optionHeight = 70;\r\n const optionGap = 12;\r\n const padding = 24;\r\n const questionTitleHeight = 60;\r\n const feedbackHeight = 60;\r\n const buttonHeight = trueFalse.data.feedbackMode === 'practice' ? 48 : 0;\r\n const buttonTopMargin = 12;\r\n\r\n const optionsStartY = questionTitleHeight + (isChecked ? feedbackHeight : 0);\r\n const optionsHeight = 2 * (optionHeight + optionGap); // Two options: True and False\r\n const totalHeight = optionsStartY + optionsHeight + buttonTopMargin + buttonHeight + padding;\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n name=\"trueFalse-element\"\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={trueFalse.x}\r\n y={trueFalse.y}\r\n rotation={trueFalse.rotation}\r\n width={trueFalse.width}\r\n height={trueFalse.height}\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => handleDragEnd(e, trueFalse.id),\r\n onClick: (e: KonvaEventObject<MouseEvent>) => handleSelect(trueFalse.id),\r\n onTap: (e: KonvaEventObject<TouchEvent>) => handleSelect(trueFalse.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n const mousePos = groupRef.current?.getStage()?.getPointerPosition();\r\n if (mousePos) {\r\n const rect = {\r\n x: trueFalse.x,\r\n y: trueFalse.y,\r\n width: trueFalse.width,\r\n height: trueFalse.height,\r\n };\r\n if (\r\n mousePos.x >= rect.x &&\r\n mousePos.x <= rect.x + rect.width &&\r\n mousePos.y >= rect.y &&\r\n mousePos.y <= rect.y + rect.height\r\n ) {\r\n const reactEvent = e.evt as unknown as React.MouseEvent;\r\n onContextMenu(reactEvent, trueFalse.id, 'trueFalse');\r\n }\r\n }\r\n },\r\n }\r\n : {})}\r\n >\r\n <Rect\r\n fill=\"white\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n height={totalHeight}\r\n width={trueFalse.width}\r\n onTransformEnd={(e) => handleTrueFalseTransform(trueFalse.id, e)}\r\n />\r\n\r\n {/* Question Title */}\r\n <Text\r\n x={padding}\r\n y={padding}\r\n text={trueFalse.data.question}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n width={trueFalse.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Feedback Message */}\r\n {isChecked && trueFalse.data.feedbackMode === 'practice' ? (\r\n <>\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={trueFalse.width - padding * 2}\r\n height={feedbackHeight}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={trueFalse.width - padding * 2}\r\n height={feedbackHeight}\r\n text={getFeedbackMessage()}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </>\r\n ) : null}\r\n\r\n {/* True/False Options */}\r\n {[\r\n { label: 'True', value: true },\r\n { label: 'False', value: false },\r\n ].map((option, index) => {\r\n const isThisCorrect = correctAnswer === option.value;\r\n const isSelected = selectedAnswer === option.value;\r\n const yPos = optionsStartY + index * (optionHeight + optionGap);\r\n\r\n let borderColor = '#e5e7eb';\r\n let bgColor = '#ffffff';\r\n if (isChecked && isThisCorrect) {\r\n borderColor = '#22c55e';\r\n bgColor = '#dcfce7';\r\n } else if (isChecked && isSelected && !isThisCorrect) {\r\n borderColor = '#ef4444';\r\n bgColor = '#fee2e2';\r\n } else if (isSelected) {\r\n borderColor = '#096B76';\r\n bgColor = '#ecfeff';\r\n }\r\n\r\n return (\r\n <Group key={option.label}>\r\n {/* Option Box */}\r\n <Rect\r\n x={padding}\r\n y={yPos}\r\n width={trueFalse.width - padding * 2}\r\n height={optionHeight}\r\n fill={bgColor}\r\n stroke={borderColor}\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n handleOptionClick(option.value);\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n handleOptionClick(option.value);\r\n }}\r\n />\r\n\r\n {/* Radio Circle */}\r\n <Rect\r\n x={padding + 12}\r\n y={yPos + (optionHeight - 24) / 2}\r\n width={24}\r\n height={24}\r\n fill={isSelected ? '#096B76' : 'white'}\r\n stroke={isSelected ? '#096B76' : '#d1d5db'}\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n listening={false}\r\n />\r\n\r\n {/* Inner circle for selected */}\r\n {isSelected && (\r\n <Rect\r\n x={padding + 12 + 6}\r\n y={yPos + (optionHeight - 24) / 2 + 6}\r\n width={12}\r\n height={12}\r\n fill=\"white\"\r\n cornerRadius={6}\r\n listening={false}\r\n />\r\n )}\r\n\r\n {/* Option Text */}\r\n <Text\r\n x={padding + 48}\r\n y={yPos}\r\n width={trueFalse.width - padding * 2 - 80}\r\n height={optionHeight}\r\n text={option.label}\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n\r\n {/* Feedback icons */}\r\n {isChecked && isThisCorrect && (\r\n <Text\r\n x={trueFalse.width - padding - 30}\r\n y={yPos + (optionHeight - 24) / 2}\r\n width={24}\r\n height={24}\r\n text=\"✓\"\r\n fontSize={20}\r\n fill=\"#22c55e\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n {isChecked && isSelected && !isThisCorrect && (\r\n <Text\r\n x={trueFalse.width - padding - 30}\r\n y={yPos + (optionHeight - 24) / 2}\r\n width={24}\r\n height={24}\r\n text=\"✗\"\r\n fontSize={20}\r\n fill=\"#ef4444\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n </Group>\r\n );\r\n })}\r\n\r\n {/* Action Buttons */}\r\n {trueFalse.data.feedbackMode === 'practice' && (\r\n <Group y={optionsStartY + 2 * (optionHeight + optionGap) + 12}>\r\n {/* Check Work Button */}\r\n <Group\r\n onMouseDown={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onMouseUp={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n handleCheckWork();\r\n }}\r\n onMouseLeave={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n }}\r\n onTouchStart={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onTouchEnd={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n handleCheckWork();\r\n }}\r\n scaleX={pressedButton === 'check' ? 0.95 : 1}\r\n scaleY={pressedButton === 'check' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={(trueFalse.width - padding * 2 - 8) / (isChecked ? 2 : 1)}\r\n height={48}\r\n fill={selectedAnswer === null || isChecked ? '#9ca3af' : '#096B76'}\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={(trueFalse.width - padding * 2 - 8) / (isChecked ? 2 : 1)}\r\n height={48}\r\n text={isChecked ? 'Submitted' : 'Check Work'}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n\r\n {/* Reset Button */}\r\n {isChecked && (\r\n <Group\r\n x={(trueFalse.width - padding * 2) / 2 + 8}\r\n onMouseDown={() => setPressedButton('reset')}\r\n onMouseUp={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n onMouseLeave={() => setPressedButton(null)}\r\n onTouchStart={() => setPressedButton('reset')}\r\n onTouchEnd={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n scaleX={pressedButton === 'reset' ? 0.95 : 1}\r\n scaleY={pressedButton === 'reset' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={(trueFalse.width - padding * 2 - 8) / 2}\r\n height={48}\r\n fill=\"#ef4444\"\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={(trueFalse.width - padding * 2 - 8) / 2}\r\n height={48}\r\n text=\"Reset\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n )}\r\n </Group>\r\n );\r\n }\r\n);\r\n\r\nTrueFalse.displayName = 'TrueFalse';\r\nexport default TrueFalse;\r\n","import { TrueFalse as TrueFalseType } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { MutableRefObject, useRef, useState } from 'react';\r\nimport Konva from 'konva';\r\nimport { Group, Rect, Text } from 'react-konva';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { updateTrueFalse } from '@/store/slices/canvasSlice';\r\nimport type { RootState } from '@/store/store';\r\n\r\nconst white = '#FFFFFF';\r\n\r\ntype TrueFalseDragAndDropProps = {\r\n trueFalse: TrueFalseType;\r\n handleTrueFalseTransform: (trueFalseId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n trueFalseRefs: MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq' | 'trueFalse'\r\n ) => void;\r\n};\r\n\r\nexport const TrueFalseDragAndDrop = ({\r\n trueFalse,\r\n onContextMenu,\r\n handleTrueFalseTransform,\r\n}: TrueFalseDragAndDropProps) => {\r\n const dispatch = useDispatch();\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const [isHovering, setIsHovering] = useState(false);\r\n const [droppedAnswer, setDroppedAnswer] = useState<boolean | null>(null);\r\n const [isChecked, setIsChecked] = useState(false);\r\n const [isPressed, setIsPressed] = useState(false);\r\n const [resetKey, setResetKey] = useState(0);\r\n\r\n const screenX = 340;\r\n const screenY = 100;\r\n const screenWidth = window.innerWidth * 0.5;\r\n const screenHeight = window.innerHeight * 0.5;\r\n\r\n // Drop zone boundaries (inside the dashed border)\r\n const dropZoneX = screenX + 20;\r\n const dropZoneY = screenY + 60;\r\n const dropZoneWidth = screenWidth - 40;\r\n const dropZoneHeight = screenHeight - 160;\r\n\r\n // Create a local ref to store the group node\r\n const groupRef = useRef<Konva.Group>(null);\r\n\r\n const handleDragEnd = (e: KonvaEventObject<DragEvent>) => {\r\n dispatch(\r\n updateTrueFalse({\r\n id: trueFalse.id,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n })\r\n );\r\n };\r\n\r\n const handleOptionDragMove = (e: KonvaEventObject<DragEvent>) => {\r\n const node = e.target;\r\n const optionX = node.x();\r\n const optionY = node.y();\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n\r\n // Check if option overlaps with drop zone\r\n const isOverDropZone =\r\n optionX + optionWidth > dropZoneX &&\r\n optionX < dropZoneX + dropZoneWidth &&\r\n optionY + optionHeight > dropZoneY &&\r\n optionY < dropZoneY + dropZoneHeight;\r\n\r\n setIsHovering(isOverDropZone);\r\n };\r\n\r\n const handleOptionDragEnd = (value: boolean, e: KonvaEventObject<DragEvent>) => {\r\n const node = e.target;\r\n const optionX = node.x();\r\n const optionY = node.y();\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n\r\n // Check if dropped in drop zone\r\n const isInDropZone =\r\n optionX + optionWidth > dropZoneX &&\r\n optionX < dropZoneX + dropZoneWidth &&\r\n optionY + optionHeight > dropZoneY &&\r\n optionY < dropZoneY + dropZoneHeight;\r\n\r\n if (isInDropZone) {\r\n setDroppedAnswer(value);\r\n } else {\r\n setDroppedAnswer(null);\r\n }\r\n\r\n setIsHovering(false);\r\n };\r\n\r\n const handleCheckWork = () => {\r\n setIsChecked(true);\r\n };\r\n\r\n const handleReset = () => {\r\n setIsChecked(false);\r\n setDroppedAnswer(null);\r\n setResetKey((prev) => prev + 1);\r\n };\r\n\r\n // Check if answer is correct\r\n const correctAnswer = trueFalse.data.responseOptions.correctAnswer;\r\n const isCorrect = droppedAnswer === correctAnswer;\r\n\r\n // Feedback message\r\n const getFeedbackMessage = () => {\r\n if (isCorrect) {\r\n return '✓ Correct! Great job!';\r\n } else {\r\n return '✗ Try again!';\r\n }\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n name=\"trueFalse-element\"\r\n width={screenWidth}\r\n height={screenHeight}\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n {...(!isDrawingTool\r\n ? {\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n e.evt.preventDefault();\r\n onContextMenu(e.evt as unknown as React.MouseEvent, trueFalse.id, 'trueFalse');\r\n },\r\n }\r\n : {})}\r\n >\r\n <Group x={screenX} y={screenY} rotation={trueFalse.rotation} onDragEnd={handleDragEnd}>\r\n {/* Background */}\r\n <Rect\r\n fill=\"white\"\r\n stroke={isHovering ? '#4CAF50' : '#e5e7eb'}\r\n strokeWidth={isHovering ? 4 : 2}\r\n cornerRadius={12}\r\n height={\r\n trueFalse.data.feedbackMode === 'practice' ? screenHeight + 10 : screenHeight - 50\r\n }\r\n width={screenWidth}\r\n shadowColor={isHovering ? '#4CAF50' : 'transparent'}\r\n shadowBlur={isHovering ? 20 : 0}\r\n shadowOpacity={0.5}\r\n />\r\n\r\n {/* Question text */}\r\n <Text\r\n x={20}\r\n y={20}\r\n width={screenWidth - 40}\r\n text={trueFalse.data.question}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n\r\n {/* Drop Zone - dashed border */}\r\n <Rect\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={dropZoneHeight}\r\n fill=\"transparent\"\r\n stroke={isHovering ? '#4CAF50' : '#075560'}\r\n strokeWidth={3}\r\n dash={[10, 10]}\r\n cornerRadius={8}\r\n />\r\n\r\n {/* Feedback Message */}\r\n {isChecked && (\r\n <>\r\n <Rect\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={60}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={60}\r\n text={getFeedbackMessage()}\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Drop Here text - only show when no answer dropped and not checked */}\r\n {droppedAnswer === null && !isChecked && (\r\n <Text\r\n x={20}\r\n y={60}\r\n width={dropZoneWidth}\r\n height={dropZoneHeight - 60}\r\n text=\"Drop Your Answer Here\"\r\n fontSize={28}\r\n fontStyle=\"bold\"\r\n fill=\"#075560\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n />\r\n )}\r\n\r\n {/* Show dropped answer */}\r\n {droppedAnswer !== null && !isChecked && (\r\n <>\r\n <Text\r\n x={20}\r\n y={60 + (dropZoneHeight - 60) / 2 - 25}\r\n width={dropZoneWidth}\r\n text={droppedAnswer ? 'True' : 'False'}\r\n fontSize={32}\r\n fontStyle=\"bold\"\r\n fill=\"#075560\"\r\n align=\"center\"\r\n />\r\n <Text\r\n x={20}\r\n y={screenHeight - 120}\r\n width={dropZoneWidth}\r\n text=\"Answer selected\"\r\n fontSize={16}\r\n fill=\"#6b7280\"\r\n align=\"center\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Action Buttons */}\r\n {trueFalse.data.feedbackMode === 'practice' ? (\r\n <Group x={20} y={screenHeight - 90}>\r\n {/* Check Work Button */}\r\n <Group\r\n onMouseDown={() => {\r\n if (droppedAnswer !== null) {\r\n setIsPressed(true);\r\n handleCheckWork();\r\n }\r\n }}\r\n onMouseUp={() => setIsPressed(false)}\r\n onMouseLeave={() => setIsPressed(false)}\r\n onTouchStart={() => {\r\n if (droppedAnswer !== null) {\r\n setIsPressed(true);\r\n handleCheckWork();\r\n }\r\n }}\r\n onTouchEnd={() => setIsPressed(false)}\r\n scaleX={isPressed ? 0.95 : 1}\r\n scaleY={isPressed ? 0.95 : 1}\r\n >\r\n <Rect\r\n fill={droppedAnswer === null ? '#9ca3af' : '#075560'}\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n height={40}\r\n width={dropZoneWidth}\r\n />\r\n <Text\r\n text=\"Check Work\"\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n width={dropZoneWidth}\r\n height={40}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n\r\n {/* Reset Button */}\r\n {isChecked && (\r\n <Group y={50} onMouseDown={handleReset} onTouchStart={handleReset}>\r\n <Rect\r\n fill=\"#dc2626\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n height={40}\r\n width={dropZoneWidth}\r\n />\r\n <Text\r\n text=\"Reset\"\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n width={dropZoneWidth}\r\n height={40}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n ) : null}\r\n </Group>\r\n\r\n {/* Draggable Options */}\r\n {[\r\n { value: true, label: 'True' },\r\n { value: false, label: 'False' },\r\n ].map((option, index) => {\r\n const optionWidth = window.innerWidth * 0.2;\r\n const optionHeight = 50;\r\n const gap = 10;\r\n\r\n const isDropped = droppedAnswer === option.value;\r\n const isCorrectOption = correctAnswer === option.value;\r\n const showFeedback = isChecked && isDropped;\r\n\r\n // Determine border color based on correctness\r\n let strokeColor = 'transparent';\r\n if (showFeedback) {\r\n strokeColor = isCorrectOption ? '#4CAF50' : '#ef4444';\r\n } else if (isDropped) {\r\n strokeColor = '#4CAF50';\r\n }\r\n\r\n return (\r\n <Group\r\n key={`${option.value}-${resetKey}`}\r\n x={400 + 20 + index * (optionWidth + gap)}\r\n y={screenY + screenHeight + 20}\r\n draggable={!isChecked}\r\n onDragMove={handleOptionDragMove}\r\n onDragEnd={(e) => handleOptionDragEnd(option.value, e)}\r\n opacity={isChecked && !isDropped ? 0.5 : 1}\r\n >\r\n <Rect\r\n width={optionWidth}\r\n height={optionHeight}\r\n fill=\"#075560\"\r\n stroke={strokeColor}\r\n strokeWidth={4}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n width={optionWidth}\r\n height={optionHeight}\r\n text={option.label}\r\n fontSize={18}\r\n fontStyle=\"bold\"\r\n fill={white}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n {/* Show checkmark or X for dropped option after checking */}\r\n {showFeedback && (\r\n <Text\r\n x={optionWidth - 30}\r\n y={5}\r\n width={25}\r\n height={25}\r\n text={isCorrectOption ? '✓' : '✗'}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill={isCorrectOption ? '#4CAF50' : '#ef4444'}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n )}\r\n </Group>\r\n );\r\n })}\r\n </Group>\r\n );\r\n};\r\n\r\nTrueFalseDragAndDrop.displayName = 'TrueFalseDragAndDrop';\r\n","import { TrueFalse as TrueFalseType } from '@/store/slices/canvasSlice';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { MutableRefObject } from 'react';\r\nimport Konva from 'konva';\r\nimport TrueFalse from '../elements/TrueFalse';\r\nimport { TrueFalseDragAndDrop } from '../elements/TrueFalseDragAndDrop';\r\n\r\ntype TrueFalseLayerProps = {\r\n trueFalses: TrueFalseType[];\r\n handleTrueFalseTransform: (trueFalseId: string, e: KonvaEventObject<Event>) => void;\r\n handleSelect: (id: string) => void;\r\n trueFalseRefs: MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq' | 'trueFalse'\r\n ) => void;\r\n handleDragEnd: (e: KonvaEventObject<DragEvent>, trueFalseId: string) => void;\r\n};\r\n\r\nexport const TrueFalseLayer = ({\r\n trueFalses,\r\n handleTrueFalseTransform,\r\n handleSelect,\r\n trueFalseRefs,\r\n handleDragEnd,\r\n onContextMenu,\r\n}: TrueFalseLayerProps) => {\r\n return (\r\n <>\r\n {trueFalses.map((trueFalse) =>\r\n trueFalse.data.responseType === 'classic' ? (\r\n <TrueFalse\r\n key={trueFalse.id}\r\n trueFalse={trueFalse}\r\n handleTrueFalseTransform={handleTrueFalseTransform}\r\n handleSelect={handleSelect}\r\n trueFalseRefs={trueFalseRefs}\r\n onContextMenu={onContextMenu}\r\n handleDragEnd={handleDragEnd}\r\n />\r\n ) : (\r\n <TrueFalseDragAndDrop\r\n key={trueFalse.id}\r\n trueFalse={trueFalse}\r\n handleTrueFalseTransform={handleTrueFalseTransform}\r\n handleSelect={handleSelect}\r\n trueFalseRefs={trueFalseRefs}\r\n onContextMenu={onContextMenu}\r\n />\r\n )\r\n )}\r\n </>\r\n );\r\n};\r\n","import { Derived } from './derived'\nimport type { Store } from './store'\n\n/**\n * This is here to solve the pyramid dependency problem where:\n * A\n * / \\\n * B C\n * \\ /\n * D\n *\n * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is.\n *\n * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been\n * resolved.\n *\n * This is a record of stores, because derived stores are not able to write values to, but stores are\n */\nexport const __storeToDerived = new WeakMap<\n Store<unknown>,\n Set<Derived<unknown>>\n>()\nexport const __derivedToStore = new WeakMap<\n Derived<unknown>,\n Set<Store<unknown>>\n>()\n\nexport const __depsThatHaveWrittenThisTick = {\n current: [] as Array<Derived<unknown> | Store<unknown>>,\n}\n\nlet __isFlushing = false\nlet __batchDepth = 0\nconst __pendingUpdates = new Set<Store<unknown>>()\n// Add a map to store initial values before batch\nconst __initialBatchValues = new Map<Store<unknown>, unknown>()\n\nfunction __flush_internals(relatedVals: Set<Derived<unknown>>) {\n // First sort deriveds by dependency order\n const sorted = Array.from(relatedVals).sort((a, b) => {\n // If a depends on b, b should go first\n if (a instanceof Derived && a.options.deps.includes(b)) return 1\n // If b depends on a, a should go first\n if (b instanceof Derived && b.options.deps.includes(a)) return -1\n return 0\n })\n\n for (const derived of sorted) {\n if (__depsThatHaveWrittenThisTick.current.includes(derived)) {\n continue\n }\n\n __depsThatHaveWrittenThisTick.current.push(derived)\n derived.recompute()\n\n const stores = __derivedToStore.get(derived)\n if (stores) {\n for (const store of stores) {\n const relatedLinkedDerivedVals = __storeToDerived.get(store)\n if (!relatedLinkedDerivedVals) continue\n __flush_internals(relatedLinkedDerivedVals)\n }\n }\n }\n}\n\nfunction __notifyListeners(store: Store<unknown>) {\n const value = {\n prevVal: store.prevState as never,\n currentVal: store.state as never,\n }\n for (const listener of store.listeners) {\n listener(value)\n }\n}\n\nfunction __notifyDerivedListeners(derived: Derived<unknown>) {\n const value = {\n prevVal: derived.prevState as never,\n currentVal: derived.state as never,\n }\n for (const listener of derived.listeners) {\n listener(value)\n }\n}\n\n/**\n * @private only to be called from `Store` on write\n */\nexport function __flush(store: Store<unknown>) {\n // If we're starting a batch, store the initial values\n if (__batchDepth > 0 && !__initialBatchValues.has(store)) {\n __initialBatchValues.set(store, store.prevState)\n }\n\n __pendingUpdates.add(store)\n\n if (__batchDepth > 0) return\n if (__isFlushing) return\n\n try {\n __isFlushing = true\n\n while (__pendingUpdates.size > 0) {\n const stores = Array.from(__pendingUpdates)\n __pendingUpdates.clear()\n\n // First notify listeners with updated values\n for (const store of stores) {\n // Use initial batch values for prevState if we have them\n const prevState = __initialBatchValues.get(store) ?? store.prevState\n store.prevState = prevState\n __notifyListeners(store)\n }\n\n // Then update all derived values\n for (const store of stores) {\n const derivedVals = __storeToDerived.get(store)\n if (!derivedVals) continue\n\n __depsThatHaveWrittenThisTick.current.push(store)\n __flush_internals(derivedVals)\n }\n\n // Notify derived listeners after recomputing\n for (const store of stores) {\n const derivedVals = __storeToDerived.get(store)\n if (!derivedVals) continue\n\n for (const derived of derivedVals) {\n __notifyDerivedListeners(derived)\n }\n }\n }\n } finally {\n __isFlushing = false\n __depsThatHaveWrittenThisTick.current = []\n __initialBatchValues.clear()\n }\n}\n\nexport function batch(fn: () => void) {\n __batchDepth++\n try {\n fn()\n } finally {\n __batchDepth--\n if (__batchDepth === 0) {\n const pendingUpdateToFlush = __pendingUpdates.values().next().value\n if (pendingUpdateToFlush) {\n __flush(pendingUpdateToFlush) // Trigger flush of all pending updates\n }\n }\n }\n}\n","/**\n * @private\n */\nexport type AnyUpdater = (prev: any) => any\n\n/**\n * Type-safe updater that can be either a function or direct value\n */\nexport type Updater<T> = ((prev: T) => T) | T\n\n/**\n * @private\n */\nexport interface ListenerValue<T> {\n readonly prevVal: T\n readonly currentVal: T\n}\n\n/**\n * @private\n */\nexport type Listener<T> = (value: ListenerValue<T>) => void\n\n/**\n * Type guard to check if updater is a function\n */\nexport function isUpdaterFunction<T>(\n updater: Updater<T>,\n): updater is (prev: T) => T {\n return typeof updater === 'function'\n}\n","import { __flush } from './scheduler'\nimport { isUpdaterFunction } from './types'\nimport type { AnyUpdater, Listener, Updater } from './types'\n\nexport interface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n /**\n * Replace the default update function with a custom one.\n */\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n /**\n * Called when a listener subscribes to the store.\n *\n * @return a function to unsubscribe the listener\n */\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n /**\n * Called after the state has been updated, used to derive other state.\n */\n onUpdate?: () => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n prevState: TState\n options?: StoreOptions<TState, TUpdater>\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.prevState = initialState\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n /**\n * Update the store state safely with improved type checking\n */\n setState(updater: (prevState: TState) => TState): void\n setState(updater: TState): void\n setState(updater: TUpdater): void\n setState(updater: Updater<TState> | TUpdater): void {\n this.prevState = this.state\n\n if (this.options?.updateFn) {\n this.state = this.options.updateFn(this.prevState)(updater as TUpdater)\n } else {\n if (isUpdaterFunction(updater)) {\n this.state = updater(this.prevState)\n } else {\n this.state = updater as TState\n }\n }\n\n // Always run onUpdate, regardless of batching\n this.options?.onUpdate?.()\n\n // Attempt to flush\n __flush(this as never)\n }\n}\n","import { Store } from './store'\nimport { __derivedToStore, __storeToDerived } from './scheduler'\nimport type { Listener } from './types'\n\nexport type UnwrapDerivedOrStore<T> =\n T extends Derived<infer InnerD>\n ? InnerD\n : T extends Store<infer InnerS>\n ? InnerS\n : never\n\ntype UnwrapReadonlyDerivedOrStoreArray<\n TArr extends ReadonlyArray<Derived<any> | Store<any>>,\n> = TArr extends readonly []\n ? []\n : TArr extends readonly [infer Head, ...infer Tail]\n ? Head extends Derived<any> | Store<any>\n ? Tail extends ReadonlyArray<Derived<any> | Store<any>>\n ? [\n UnwrapDerivedOrStore<Head>,\n ...UnwrapReadonlyDerivedOrStoreArray<Tail>,\n ]\n : [UnwrapDerivedOrStore<Head>]\n : []\n : TArr extends ReadonlyArray<Derived<any> | Store<any>>\n ? Array<UnwrapDerivedOrStore<TArr[number]>>\n : []\n\n// Can't have currVal, as it's being evaluated from the current derived fn\nexport interface DerivedFnProps<\n TArr extends ReadonlyArray<Derived<any> | Store<any>> = ReadonlyArray<any>,\n TUnwrappedArr extends\n UnwrapReadonlyDerivedOrStoreArray<TArr> = UnwrapReadonlyDerivedOrStoreArray<TArr>,\n> {\n // `undefined` if it's the first run\n /**\n * `undefined` if it's the first run\n * @privateRemarks this also cannot be typed as TState, as it breaks the inferencing of the function's return type when an argument is used - even with `NoInfer` usage\n */\n prevVal: unknown | undefined\n prevDepVals: TUnwrappedArr | undefined\n currDepVals: TUnwrappedArr\n}\n\nexport interface DerivedOptions<\n TState,\n TArr extends ReadonlyArray<Derived<any> | Store<any>> = ReadonlyArray<any>,\n> {\n onSubscribe?: (\n listener: Listener<TState>,\n derived: Derived<TState>,\n ) => () => void\n onUpdate?: () => void\n deps: TArr\n /**\n * Values of the `deps` from before and after the current invocation of `fn`\n */\n fn: (props: DerivedFnProps<TArr>) => TState\n}\n\nexport class Derived<\n TState,\n const TArr extends ReadonlyArray<\n Derived<any> | Store<any>\n > = ReadonlyArray<any>,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n prevState: TState | undefined\n options: DerivedOptions<TState, TArr>\n\n /**\n * Functions representing the subscriptions. Call a function to cleanup\n * @private\n */\n _subscriptions: Array<() => void> = []\n\n lastSeenDepValues: Array<unknown> = []\n getDepVals = () => {\n const l = this.options.deps.length\n const prevDepVals = new Array<unknown>(l)\n const currDepVals = new Array<unknown>(l)\n for (let i = 0; i < l; i++) {\n const dep = this.options.deps[i]!\n prevDepVals[i] = dep.prevState\n currDepVals[i] = dep.state\n }\n this.lastSeenDepValues = currDepVals\n return {\n prevDepVals,\n currDepVals,\n prevVal: this.prevState ?? undefined,\n }\n }\n\n constructor(options: DerivedOptions<TState, TArr>) {\n this.options = options\n this.state = options.fn({\n prevDepVals: undefined,\n prevVal: undefined,\n currDepVals: this.getDepVals().currDepVals as never,\n })\n }\n\n registerOnGraph(\n deps: ReadonlyArray<Derived<any> | Store<any>> = this.options.deps,\n ) {\n for (const dep of deps) {\n if (dep instanceof Derived) {\n // First register the intermediate derived value if it's not already registered\n dep.registerOnGraph()\n // Then register this derived with the dep's underlying stores\n this.registerOnGraph(dep.options.deps)\n } else if (dep instanceof Store) {\n // Register the derived as related derived to the store\n let relatedLinkedDerivedVals = __storeToDerived.get(dep)\n if (!relatedLinkedDerivedVals) {\n relatedLinkedDerivedVals = new Set()\n __storeToDerived.set(dep, relatedLinkedDerivedVals)\n }\n relatedLinkedDerivedVals.add(this as never)\n\n // Register the store as a related store to this derived\n let relatedStores = __derivedToStore.get(this as never)\n if (!relatedStores) {\n relatedStores = new Set()\n __derivedToStore.set(this as never, relatedStores)\n }\n relatedStores.add(dep)\n }\n }\n }\n\n unregisterFromGraph(\n deps: ReadonlyArray<Derived<any> | Store<any>> = this.options.deps,\n ) {\n for (const dep of deps) {\n if (dep instanceof Derived) {\n this.unregisterFromGraph(dep.options.deps)\n } else if (dep instanceof Store) {\n const relatedLinkedDerivedVals = __storeToDerived.get(dep)\n if (relatedLinkedDerivedVals) {\n relatedLinkedDerivedVals.delete(this as never)\n }\n\n const relatedStores = __derivedToStore.get(this as never)\n if (relatedStores) {\n relatedStores.delete(dep)\n }\n }\n }\n }\n\n recompute = () => {\n this.prevState = this.state\n const depVals = this.getDepVals()\n this.state = this.options.fn(depVals as never)\n\n this.options.onUpdate?.()\n }\n\n checkIfRecalculationNeededDeeply = () => {\n for (const dep of this.options.deps) {\n if (dep instanceof Derived) {\n dep.checkIfRecalculationNeededDeeply()\n }\n }\n let shouldRecompute = false\n const lastSeenDepValues = this.lastSeenDepValues\n const { currDepVals } = this.getDepVals()\n for (let i = 0; i < currDepVals.length; i++) {\n if (currDepVals[i] !== lastSeenDepValues[i]) {\n shouldRecompute = true\n break\n }\n }\n\n if (shouldRecompute) {\n this.recompute()\n }\n }\n\n mount = () => {\n this.registerOnGraph()\n this.checkIfRecalculationNeededDeeply()\n\n return () => {\n this.unregisterFromGraph()\n for (const cleanup of this._subscriptions) {\n cleanup()\n }\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n}\n","import type { AnyFunction } from './types'\n\nexport function isFunction<T extends AnyFunction>(value: any): value is T {\n return typeof value === 'function'\n}\n\nexport function parseFunctionOrValue<T, TArgs extends Array<any>>(\n value: T | ((...args: TArgs) => T),\n ...args: TArgs\n): T {\n return isFunction(value) ? value(...args) : value\n}\n\nexport function createKey(key?: string): string {\n if (key) {\n return key\n }\n\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID()\n }\n\n return ''\n}\n","interface TanStackDevtoolsEvent<TEventName extends string, TPayload = any> {\n type: TEventName\n payload: TPayload\n pluginId?: string // Optional pluginId to filter events by plugin\n}\ndeclare global {\n var __TANSTACK_EVENT_TARGET__: EventTarget | null\n}\n\ntype AllDevtoolsEvents<TEventMap extends Record<string, any>> = {\n [Key in keyof TEventMap]: TanStackDevtoolsEvent<Key & string, TEventMap[Key]>\n}[keyof TEventMap]\n\nexport class EventClient<\n TEventMap extends Record<string, any>,\n TPluginId extends string = TEventMap extends Record<infer P, any>\n ? P extends `${infer Id}:${string}`\n ? Id\n : never\n : never,\n> {\n #enabled = true\n #pluginId: TPluginId\n #eventTarget: () => EventTarget\n #debug: boolean\n #queuedEvents: Array<TanStackDevtoolsEvent<string, any>>\n #connected: boolean\n #connectIntervalId: number | null\n #connectEveryMs: number\n #retryCount = 0\n #maxRetries = 5\n #onConnected = () => {\n this.debugLog('Connected to event bus')\n this.#connected = true\n this.debugLog('Emitting queued events', this.#queuedEvents)\n this.#queuedEvents.forEach((event) => this.emitEventToBus(event))\n this.#queuedEvents = []\n this.stopConnectLoop()\n this.#eventTarget().removeEventListener(\n 'tanstack-connect-success',\n this.#onConnected,\n )\n }\n #connectFunction = () => {\n this.#eventTarget().addEventListener(\n 'tanstack-connect-success',\n this.#onConnected,\n )\n if (this.#retryCount < this.#maxRetries) {\n this.#retryCount++\n this.dispatchCustomEvent('tanstack-connect', {})\n return\n }\n\n this.#eventTarget().removeEventListener(\n 'tanstack-connect',\n this.#connectFunction,\n )\n this.debugLog('Max retries reached, giving up on connection')\n this.stopConnectLoop()\n }\n\n constructor({\n pluginId,\n debug = false,\n enabled = true,\n reconnectEveryMs = 1000,\n }: {\n pluginId: TPluginId\n debug?: boolean\n reconnectEveryMs?: number\n enabled?: boolean\n }) {\n this.#pluginId = pluginId\n this.#enabled = enabled\n this.#eventTarget = this.getGlobalTarget\n this.#debug = debug\n this.debugLog(' Initializing event subscription for plugin', this.#pluginId)\n this.#queuedEvents = []\n this.#connected = false\n this.#connectIntervalId = null\n this.#connectEveryMs = reconnectEveryMs\n }\n\n private startConnectLoop() {\n if (this.#connectIntervalId !== null || this.#connected) return\n this.debugLog(`Starting connect loop (every ${this.#connectEveryMs}ms)`)\n\n this.#connectIntervalId = setInterval(\n this.#connectFunction,\n this.#connectEveryMs,\n ) as unknown as number\n }\n\n private stopConnectLoop() {\n if (this.#connectIntervalId === null) {\n return\n }\n clearInterval(this.#connectIntervalId)\n this.#connectIntervalId = null\n this.debugLog('Stopped connect loop')\n }\n\n private debugLog(...args: Array<any>) {\n if (this.#debug) {\n console.log(`🌴 [tanstack-devtools:${this.#pluginId}-plugin]`, ...args)\n }\n }\n private getGlobalTarget() {\n // server one is the global event target\n if (\n typeof globalThis !== 'undefined' &&\n globalThis.__TANSTACK_EVENT_TARGET__\n ) {\n this.debugLog('Using global event target')\n return globalThis.__TANSTACK_EVENT_TARGET__\n }\n // CLient event target is the browser window object\n if (\n typeof window !== 'undefined' &&\n typeof window.addEventListener !== 'undefined'\n ) {\n this.debugLog('Using window as event target')\n\n return window\n }\n // Protect against non-web environments like react-native\n const eventTarget =\n typeof EventTarget !== 'undefined' ? new EventTarget() : undefined\n\n // For non-web environments like react-native\n if (\n typeof eventTarget === 'undefined' ||\n typeof eventTarget.addEventListener === 'undefined'\n ) {\n this.debugLog(\n 'No event mechanism available, running in non-web environment',\n )\n return {\n addEventListener: () => {},\n removeEventListener: () => {},\n dispatchEvent: () => false,\n }\n }\n\n this.debugLog('Using new EventTarget as fallback')\n return eventTarget\n }\n\n getPluginId() {\n return this.#pluginId\n }\n\n private dispatchCustomEventShim(eventName: string, detail: any) {\n try {\n const event = new Event(eventName, {\n detail: detail,\n } as any)\n this.#eventTarget().dispatchEvent(event)\n } catch (e) {\n this.debugLog('Failed to dispatch shim event')\n }\n }\n\n private dispatchCustomEvent(eventName: string, detail?: any) {\n try {\n this.#eventTarget().dispatchEvent(new CustomEvent(eventName, { detail }))\n } catch (e) {\n this.dispatchCustomEventShim(eventName, detail)\n }\n }\n\n private emitEventToBus(event: TanStackDevtoolsEvent<string, any>) {\n this.debugLog('Emitting event to client bus', event)\n this.dispatchCustomEvent('tanstack-dispatch-event', event)\n }\n\n emit<\n TSuffix extends Extract<\n keyof TEventMap,\n `${TPluginId & string}:${string}`\n > extends `${TPluginId & string}:${infer S}`\n ? S\n : never,\n >(\n eventSuffix: TSuffix,\n payload: TEventMap[`${TPluginId & string}:${TSuffix}`],\n ) {\n if (!this.#enabled) {\n this.debugLog(\n 'Event bus client is disabled, not emitting event',\n eventSuffix,\n payload,\n )\n return\n }\n // wait to connect to the bus\n if (!this.#connected) {\n this.debugLog('Bus not available, will be pushed as soon as connected')\n this.#queuedEvents.push({\n type: `${this.#pluginId}:${eventSuffix}`,\n payload,\n pluginId: this.#pluginId,\n })\n // start connection to event bus\n if (typeof CustomEvent !== 'undefined') {\n this.#connectFunction()\n this.startConnectLoop()\n }\n return\n }\n // emit right now\n return this.emitEventToBus({\n type: `${this.#pluginId}:${eventSuffix}`,\n payload,\n pluginId: this.#pluginId,\n })\n }\n\n on<\n TSuffix extends Extract<\n keyof TEventMap,\n `${TPluginId & string}:${string}`\n > extends `${TPluginId & string}:${infer S}`\n ? S\n : never,\n >(\n eventSuffix: TSuffix,\n cb: (\n event: TanStackDevtoolsEvent<\n `${TPluginId & string}:${TSuffix}`,\n TEventMap[`${TPluginId & string}:${TSuffix}`]\n >,\n ) => void,\n ) {\n const eventName = `${this.#pluginId}:${eventSuffix}` as const\n if (!this.#enabled) {\n this.debugLog(\n 'Event bus client is disabled, not registering event',\n eventName,\n )\n return () => {}\n }\n const handler = (e: Event) => {\n this.debugLog('Received event from bus', (e as CustomEvent).detail)\n cb((e as CustomEvent).detail)\n }\n this.#eventTarget().addEventListener(eventName, handler)\n this.debugLog('Registered event to bus', eventName)\n return () => {\n this.#eventTarget().removeEventListener(eventName, handler)\n }\n }\n\n onAll(cb: (event: TanStackDevtoolsEvent<string, any>) => void) {\n if (!this.#enabled) {\n this.debugLog('Event bus client is disabled, not registering event')\n return () => {}\n }\n\n const handler = (e: Event) => {\n const event = (e as CustomEvent).detail\n\n cb(event)\n }\n this.#eventTarget().addEventListener('tanstack-devtools-global', handler)\n return () =>\n this.#eventTarget().removeEventListener(\n 'tanstack-devtools-global',\n handler,\n )\n }\n onAllPluginEvents(cb: (event: AllDevtoolsEvents<TEventMap>) => void) {\n if (!this.#enabled) {\n this.debugLog('Event bus client is disabled, not registering event')\n return () => {}\n }\n const handler = (e: Event) => {\n const event = (e as CustomEvent).detail\n if (this.#pluginId && event.pluginId !== this.#pluginId) {\n return\n }\n cb(event)\n }\n this.#eventTarget().addEventListener('tanstack-devtools-global', handler)\n return () =>\n this.#eventTarget().removeEventListener(\n 'tanstack-devtools-global',\n handler,\n )\n }\n}\n","import { EventClient } from '@tanstack/devtools-event-client'\nimport type { AsyncBatcher } from './async-batcher'\nimport type { AsyncDebouncer } from './async-debouncer'\nimport type { AsyncQueuer } from './async-queuer'\nimport type { AsyncRateLimiter } from './async-rate-limiter'\nimport type { AsyncThrottler } from './async-throttler'\nimport type { Debouncer } from './debouncer'\nimport type { Batcher } from './batcher'\nimport type { Queuer } from './queuer'\nimport type { RateLimiter } from './rate-limiter'\nimport type { Throttler } from './throttler'\n\nexport interface PacerEventMap {\n 'pacer:d-AsyncBatcher': AsyncBatcher<any>\n 'pacer:d-AsyncDebouncer': AsyncDebouncer<any>\n 'pacer:d-AsyncQueuer': AsyncQueuer<any>\n 'pacer:d-AsyncRateLimiter': AsyncRateLimiter<any>\n 'pacer:d-AsyncThrottler': AsyncThrottler<any>\n 'pacer:d-Batcher': Batcher<any>\n 'pacer:d-Debouncer': Debouncer<any>\n 'pacer:d-Queuer': Queuer<any>\n 'pacer:d-RateLimiter': RateLimiter<any>\n 'pacer:d-Throttler': Throttler<any>\n 'pacer:AsyncBatcher': AsyncBatcher<any>\n 'pacer:AsyncDebouncer': AsyncDebouncer<any>\n 'pacer:AsyncQueuer': AsyncQueuer<any>\n 'pacer:AsyncRateLimiter': AsyncRateLimiter<any>\n 'pacer:AsyncThrottler': AsyncThrottler<any>\n 'pacer:Batcher': Batcher<any>\n 'pacer:Debouncer': Debouncer<any>\n 'pacer:Queuer': Queuer<any>\n 'pacer:RateLimiter': RateLimiter<any>\n 'pacer:Throttler': Throttler<any>\n}\n\nexport type PacerEventName = keyof PacerEventMap extends `pacer:${infer T}`\n ? T\n : never\n\nclass PacerEventClient extends EventClient<PacerEventMap> {\n constructor(props?: { debug: boolean }) {\n super({\n pluginId: 'pacer',\n debug: props?.debug,\n })\n }\n}\n\nexport const emitChange = <\n TSuffix extends Extract<\n keyof PacerEventMap,\n `${string}:${string}`\n > extends `${string}:${infer S}`\n ? S\n : never,\n>(\n event: TSuffix,\n payload: PacerEventMap[`pacer:${TSuffix}`],\n) => {\n pacerEventClient.emit(event, payload)\n}\n\nexport const pacerEventClient = new PacerEventClient()\n","import { Store } from '@tanstack/store'\nimport { createKey, parseFunctionOrValue } from './utils'\nimport { emitChange, pacerEventClient } from './event-client'\nimport type { AnyFunction } from './types'\n\nexport interface ThrottlerState<TFn extends AnyFunction> {\n /**\n * Number of function executions that have been completed\n */\n executionCount: number\n /**\n * Whether the throttler is waiting for the timeout to trigger execution\n */\n isPending: boolean\n /**\n * The arguments from the most recent call to maybeExecute\n */\n lastArgs: Parameters<TFn> | undefined\n /**\n * Timestamp of the last function execution in milliseconds\n */\n lastExecutionTime: number\n /**\n * Number of times maybeExecute has been called (for reduction calculations)\n */\n maybeExecuteCount: number\n /**\n * Timestamp when the next execution can occur in milliseconds\n */\n nextExecutionTime: number | undefined\n /**\n * Current execution status - 'idle' when not active, 'pending' when waiting for timeout\n */\n status: 'disabled' | 'idle' | 'pending'\n}\n\nfunction getDefaultThrottlerState<\n TFn extends AnyFunction,\n>(): ThrottlerState<TFn> {\n return {\n executionCount: 0,\n isPending: false,\n lastArgs: undefined,\n lastExecutionTime: 0,\n nextExecutionTime: 0,\n status: 'idle',\n maybeExecuteCount: 0,\n }\n}\n\n/**\n * Options for configuring a throttled function\n */\nexport interface ThrottlerOptions<TFn extends AnyFunction> {\n /**\n * Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions.\n * Can be a boolean or a function that returns a boolean.\n * Defaults to true.\n */\n enabled?: boolean | ((throttler: Throttler<TFn>) => boolean)\n /**\n * Initial state for the throttler\n */\n initialState?: Partial<ThrottlerState<TFn>>\n /**\n * A key to identify the throttler.\n * If provided, the throttler will be identified by this key in the devtools and PacerProvider if applicable.\n */\n key?: string\n /**\n * Whether to execute on the leading edge of the timeout.\n * Defaults to true.\n */\n leading?: boolean\n /**\n * Callback function that is called after the function is executed\n */\n onExecute?: (args: Parameters<TFn>, throttler: Throttler<TFn>) => void\n /**\n * Whether to execute on the trailing edge of the timeout.\n * Defaults to true.\n */\n trailing?: boolean\n /**\n * Time window in milliseconds during which the function can only be executed once.\n * Can be a number or a function that returns a number.\n * Defaults to 0ms\n */\n wait: number | ((throttler: Throttler<TFn>) => number)\n}\n\nconst defaultOptions: Omit<\n Required<ThrottlerOptions<any>>,\n 'initialState' | 'onExecute' | 'key'\n> = {\n enabled: true,\n leading: true,\n trailing: true,\n wait: 0,\n}\n\n/**\n * A class that creates a throttled function.\n *\n * Throttling ensures a function is called at most once within a specified time window.\n * Unlike debouncing which waits for a pause in calls, throttling guarantees consistent\n * execution timing regardless of call frequency.\n *\n * Supports both leading and trailing edge execution:\n * - Leading: Execute immediately on first call (default: true)\n * - Trailing: Execute after wait period if called during throttle (default: true)\n *\n * For collapsing rapid-fire events where you only care about the last call, consider using Debouncer.\n *\n * State Management:\n * - Uses TanStack Store for reactive state management\n * - Use `initialState` to provide initial state values when creating the throttler\n * - Use `onExecute` callback to react to function execution and implement custom logic\n * - The state includes execution count, last execution time, pending status, and more\n * - State can be accessed via `throttler.store.state` when using the class directly\n * - When using framework adapters (React/Solid), state is accessed from `throttler.state`\n *\n * @example\n * ```ts\n * const throttler = new Throttler(\n * (id: string) => api.getData(id),\n * { wait: 1000 } // Execute at most once per second\n * );\n *\n * // First call executes immediately\n * throttler.maybeExecute('123');\n *\n * // Subsequent calls within 1000ms are throttled\n * throttler.maybeExecute('123'); // Throttled\n * ```\n */\nexport class Throttler<TFn extends AnyFunction> {\n readonly store: Store<Readonly<ThrottlerState<TFn>>> = new Store(\n getDefaultThrottlerState(),\n )\n key: string | undefined\n options: ThrottlerOptions<TFn>\n #timeoutId: NodeJS.Timeout | undefined\n\n constructor(\n public fn: TFn,\n initialOptions: ThrottlerOptions<TFn>,\n ) {\n this.key = createKey(initialOptions.key)\n this.options = {\n ...defaultOptions,\n ...initialOptions,\n }\n this.#setState(this.options.initialState ?? {})\n\n pacerEventClient.on('d-Throttler', (event) => {\n if (event.payload.key !== this.key) return\n this.#setState(event.payload.store.state as ThrottlerState<TFn>)\n this.setOptions(event.payload.options)\n })\n }\n\n /**\n * Updates the throttler options\n */\n setOptions = (newOptions: Partial<ThrottlerOptions<TFn>>): void => {\n this.options = { ...this.options, ...newOptions }\n\n // Cancel pending execution if the throttler is disabled\n if (!this.#getEnabled()) {\n this.cancel()\n }\n }\n\n #setState = (newState: Partial<ThrottlerState<TFn>>): void => {\n this.store.setState((state) => {\n const combinedState = {\n ...state,\n ...newState,\n }\n const { isPending } = combinedState\n return {\n ...combinedState,\n status: !this.#getEnabled()\n ? 'disabled'\n : isPending\n ? 'pending'\n : 'idle',\n }\n })\n emitChange('Throttler', this)\n }\n\n #getEnabled = (): boolean => {\n return !!parseFunctionOrValue(this.options.enabled, this)\n }\n\n #getWait = (): number => {\n return parseFunctionOrValue(this.options.wait, this)\n }\n\n /**\n * Attempts to execute the throttled function. The execution behavior depends on the throttler options:\n *\n * - If enough time has passed since the last execution (>= wait period):\n * - With leading=true: Executes immediately\n * - With leading=false: Waits for the next trailing execution\n *\n * - If within the wait period:\n * - With trailing=true: Schedules execution for end of wait period\n * - With trailing=false: Drops the execution\n *\n * @example\n * ```ts\n * const throttled = new Throttler(fn, { wait: 1000 });\n *\n * // First call executes immediately\n * throttled.maybeExecute('a', 'b');\n *\n * // Call during wait period - gets throttled\n * throttled.maybeExecute('c', 'd');\n * ```\n */\n maybeExecute = (...args: Parameters<TFn>): void => {\n this.#setState({\n maybeExecuteCount: this.store.state.maybeExecuteCount + 1,\n })\n\n const now = Date.now()\n const timeSinceLastExecution = now - this.store.state.lastExecutionTime\n const wait = this.#getWait()\n\n // Handle leading execution\n if (this.options.leading && timeSinceLastExecution >= wait) {\n this.#execute(...args)\n } else {\n // Store the most recent arguments for potential trailing execution\n this.#setState({\n lastArgs: args,\n })\n // Set up trailing execution if not already scheduled\n if (!this.#timeoutId && this.options.trailing) {\n // prevent large number if lastExecutionTime is undefined\n const _timeSinceLastExecution = this.store.state.lastExecutionTime\n ? now - this.store.state.lastExecutionTime\n : 0\n const timeoutDuration = wait - _timeSinceLastExecution\n this.#setState({ isPending: true })\n this.#timeoutId = setTimeout(() => {\n const { lastArgs } = this.store.state\n if (lastArgs !== undefined) {\n this.#execute(...lastArgs)\n }\n }, timeoutDuration)\n }\n }\n }\n\n #execute = (...args: Parameters<TFn>): void => {\n if (!this.#getEnabled()) return\n this.fn(...args) // EXECUTE!\n const lastExecutionTime = Date.now()\n const nextExecutionTime = lastExecutionTime + this.#getWait()\n this.#clearTimeout()\n this.#setState({\n executionCount: this.store.state.executionCount + 1,\n lastExecutionTime,\n nextExecutionTime,\n isPending: false,\n lastArgs: undefined,\n })\n this.options.onExecute?.(args, this)\n setTimeout(() => {\n if (!this.store.state.isPending) {\n this.#setState({ nextExecutionTime: undefined })\n }\n }, this.#getWait())\n }\n\n /**\n * Processes the current pending execution immediately\n */\n flush = (): void => {\n if (this.store.state.isPending && this.store.state.lastArgs) {\n this.#execute(...this.store.state.lastArgs)\n }\n }\n\n #clearTimeout = (): void => {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId)\n this.#timeoutId = undefined\n }\n }\n\n /**\n * Cancels any pending trailing execution and clears internal state.\n *\n * If a trailing execution is scheduled (due to throttling with trailing=true),\n * this will prevent that execution from occurring. The internal timeout and\n * stored arguments will be cleared.\n *\n * Has no effect if there is no pending execution.\n */\n cancel = (): void => {\n this.#clearTimeout()\n this.#setState({\n lastArgs: undefined,\n isPending: false,\n })\n }\n\n /**\n * Resets the throttler state to its default values\n */\n reset = (): void => {\n this.#setState(getDefaultThrottlerState<TFn>())\n }\n}\n\n/**\n * Creates a throttled function that limits how often the provided function can execute.\n *\n * Throttling ensures a function executes at most once within a specified time window,\n * regardless of how many times it is called. This is useful for rate-limiting\n * expensive operations or UI updates.\n *\n * The throttled function can be configured to execute on the leading and/or trailing\n * edge of the throttle window via options.\n *\n * For handling bursts of events, consider using debounce() instead. For hard execution\n * limits, consider using rateLimit().\n *\n * State Management:\n * - Uses TanStack Store for reactive state management\n * - Use `initialState` to provide initial state values when creating the throttler\n * - Use `onExecute` callback to react to function execution and implement custom logic\n * - The state includes execution count, last execution time, pending status, and more\n * - State can be accessed via the underlying Throttler instance's `store.state` property\n * - When using framework adapters (React/Solid), state is accessed from the hook's state property\n *\n * @example\n * ```ts\n * // Basic throttling - max once per second\n * const throttled = throttle(updateUI, { wait: 1000 });\n *\n * // Configure leading/trailing execution\n * const throttled = throttle(saveData, {\n * wait: 2000,\n * leading: true, // Execute immediately on first call\n * trailing: true // Execute again after delay if called during wait\n * });\n * ```\n */\nexport function throttle<TFn extends AnyFunction>(\n fn: TFn,\n initialOptions: ThrottlerOptions<TFn>,\n) {\n const throttler = new Throttler(fn, initialOptions)\n return throttler.maybeExecute\n}\n","import { defaultValidationLogic } from './ValidationLogic'\nimport type { ValidationLogicProps } from './ValidationLogic'\nimport type { FieldValidators } from './FieldApi'\nimport type { FormValidators } from './FormApi'\nimport type {\n GlobalFormValidationError,\n ValidationCause,\n ValidationError,\n ValidationSource,\n} from './types'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\n/**\n * @private\n */\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n * @private\n */\nexport function getBy(obj: any, path: any) {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart: any) => {\n if (current === null) return null\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n * @private\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n if (parent === null) {\n parent = {}\n }\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && typeof key === 'number') {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n * @private\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (!parent) return\n if (path.length === 1) {\n const finalPath = path[0]!\n if (Array.isArray(parent) && typeof finalPath === 'number') {\n return parent.filter((_, i) => i !== finalPath)\n }\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n if (key >= parent.length) {\n return parent\n }\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reLineOfOnlyDigits = /^(\\d+)$/gm\n// the second dot must be in a lookahead or the engine\n// will skip subsequent numbers (like foo.0.1.)\nconst reDigitsBetweenDots = /\\.(\\d+)(?=\\.)/gm\nconst reStartWithDigitThenDot = /^(\\d+)\\./gm\nconst reDotWithDigitsToEnd = /\\.(\\d+$)/gm\nconst reMultipleDots = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\n/**\n * @private\n */\nexport function makePathArray(str: string | Array<string | number>) {\n if (Array.isArray(str)) {\n return [...str]\n }\n\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return (\n str\n // Leading `[` may lead to wrong parsing down the line\n // (Example: '[0][1]' should be '0.1', not '.0.1')\n .replace(/(^\\[)|]/gm, '')\n .replace(/\\[/g, '.')\n .replace(reLineOfOnlyDigits, intReplace)\n .replace(reDigitsBetweenDots, `.${intReplace}.`)\n .replace(reStartWithDigitThenDot, `${intReplace}.`)\n .replace(reDotWithDigitsToEnd, `.${intReplace}`)\n .replace(reMultipleDots, '.')\n .split('.')\n .map((d) => {\n if (d.startsWith(intPrefix)) {\n const numStr = d.substring(intPrefix.length)\n const num = parseInt(numStr, 10)\n\n if (String(num) === numStr) {\n return num\n }\n return numStr\n }\n return d\n })\n )\n}\n\n/**\n * @private\n */\nexport function concatenatePaths(path1: string, path2: string): string {\n if (path1.length === 0) return path2\n if (path2.length === 0) return path1\n\n if (path2.startsWith('[')) {\n return path1 + path2\n }\n\n // In cases where parent and child withFieldGroup forms are both nested\n if (path2.startsWith('.')) {\n return path1 + path2\n }\n\n return `${path1}.${path2}`\n}\n\n/**\n * @private\n */\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\n/**\n * @private\n */\nexport interface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\n/**\n * @private\n */\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<\n | T['onChange']\n | T['onBlur']\n | T['onSubmit']\n | T['onMount']\n | T['onDynamic']\n >\n >\n : never {\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n return {\n cause: validator!.cause,\n validate: validator!.fn,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: false },\n runValidation,\n })\n}\n\n/**\n * @private\n */\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T> & {\n validationLogic?: any\n form?: any\n },\n): T extends FieldValidators<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<\n | T['onChangeAsync']\n | T['onBlurAsync']\n | T['onSubmitAsync']\n | T['onDynamicAsync']\n >\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n onDynamicAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n | FormValidators<any, any, any, any, any, any, any, any, any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const runValidation = (\n props: Parameters<ValidationLogicProps['runValidation']>[0],\n ) => {\n return props.validators.filter(Boolean).map((validator) => {\n const validatorCause = validator?.cause || cause\n\n let debounceMs = defaultDebounceMs\n\n switch (validatorCause) {\n case 'change':\n debounceMs = onChangeAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'blur':\n debounceMs = onBlurAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'dynamic':\n debounceMs = onDynamicAsyncDebounceMs ?? defaultDebounceMs\n break\n case 'submit':\n debounceMs = 0 // submit validators are always run immediately\n break\n default:\n break\n }\n\n if (cause === 'submit') {\n debounceMs = 0\n }\n\n return {\n cause: validatorCause,\n validate: validator!.fn,\n debounceMs: debounceMs,\n }\n })\n }\n\n return options.validationLogic({\n form: options.form,\n validators: options.validators,\n event: { type: cause, async: true },\n runValidation,\n })\n}\n\nexport const isGlobalFormValidationError = (\n error: unknown,\n): error is GlobalFormValidationError<unknown> => {\n return !!error && typeof error === 'object' && 'fields' in error\n}\n\nexport function evaluate<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n return objA.getTime() === objB.getTime()\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n const keysA = Object.keys(objA)\n const keysB = Object.keys(objB)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n for (const key of keysA) {\n // performs recursive search down the object tree\n\n if (\n !keysB.includes(key) ||\n !evaluate(objA[key as keyof T], objB[key as keyof T])\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.\n * @private\n */\nexport const determineFormLevelErrorSourceAndValue = ({\n newFormValidatorError,\n isPreviousErrorFromFormValidator,\n previousErrorValue,\n}: {\n newFormValidatorError: ValidationError\n isPreviousErrorFromFormValidator: boolean\n previousErrorValue: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // All falsy values are not considered errors\n if (newFormValidatorError) {\n return { newErrorValue: newFormValidatorError, newSource: 'form' }\n }\n\n // Clears form level error since it's now stale\n if (isPreviousErrorFromFormValidator) {\n return { newErrorValue: undefined, newSource: undefined }\n }\n\n // At this point, we have a preivous error which must have been set by the field validator, keep as is\n if (previousErrorValue) {\n return { newErrorValue: previousErrorValue, newSource: 'field' }\n }\n\n // No new or previous error, clear the error\n return { newErrorValue: undefined, newSource: undefined }\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the field level sync/async validation.\n * @private\n */\nexport const determineFieldLevelErrorSourceAndValue = ({\n formLevelError,\n fieldLevelError,\n}: {\n formLevelError: ValidationError\n fieldLevelError: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // At field level, we prioritize the field level error\n if (fieldLevelError) {\n return { newErrorValue: fieldLevelError, newSource: 'field' }\n }\n\n // If there is no field level error, and there is a form level error, we set the form level error\n if (formLevelError) {\n return { newErrorValue: formLevelError, newSource: 'form' }\n }\n\n return { newErrorValue: undefined, newSource: undefined }\n}\n\nexport function createFieldMap<T>(values: Readonly<T>): { [K in keyof T]: K } {\n const output: { [K in keyof T]: K } = {} as any\n\n for (const key in values) {\n output[key] = key\n }\n\n return output\n}\n\n/**\n * Merge the first parameter with the given overrides.\n * @private\n */\nexport function mergeOpts<T>(\n originalOpts: T | undefined | null,\n overrides: T,\n): T {\n if (originalOpts === undefined || originalOpts === null) {\n return overrides\n }\n\n return { ...originalOpts, ...overrides }\n}\n\n/*\n/ credit is due to https://github.com/lukeed/uuid for this code, with current npm\n/ attacks we didn't feel comfortable installing directly from npm. But big appreciation\n/ from the TanStack Form team <3.\n*/\n\nlet IDX = 256\nconst HEX: string[] = []\nlet BUFFER: number[] | undefined\n\nwhile (IDX--) {\n HEX[IDX] = (IDX + 256).toString(16).substring(1)\n}\n\nexport function uuid(): string {\n let i = 0\n let num: number\n let out = ''\n\n if (!BUFFER || IDX + 16 > 256) {\n BUFFER = new Array<number>(256)\n i = 256\n while (i--) {\n BUFFER[i] = (256 * Math.random()) | 0\n }\n i = 0\n IDX = 0\n }\n\n for (; i < 16; i++) {\n num = BUFFER[IDX + i] as number\n if (i === 6) out += HEX[(num & 15) | 64]\n else if (i === 8) out += HEX[(num & 63) | 128]\n else out += HEX[num]\n\n if (i & 1 && i > 1 && i < 11) out += '-'\n }\n\n IDX++\n return out\n}\n","import type { AnyFormApi, FormValidators } from './FormApi'\n\ninterface ValidationLogicValidatorsFn {\n // TODO: Type this properly\n fn: FormValidators<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >[keyof FormValidators<any, any, any, any, any, any, any, any, any, any>]\n cause: 'change' | 'blur' | 'submit' | 'mount' | 'server' | 'dynamic'\n}\n\nexport interface ValidationLogicProps {\n // TODO: Type this properly\n form: AnyFormApi\n // TODO: Type this properly\n validators:\n | FormValidators<any, any, any, any, any, any, any, any, any, any>\n | undefined\n | null\n event: {\n type: 'blur' | 'change' | 'submit' | 'mount' | 'server'\n fieldName?: string\n async: boolean\n }\n runValidation: (props: {\n validators: Array<ValidationLogicValidatorsFn | undefined>\n form: AnyFormApi\n }) => void\n}\n\ninterface RevalidateLogicProps {\n /**\n * @default 'submit'\n *\n * This is the mode that will be used before the form has been submitted.\n * It will run the validation logic on `submit` by default, but can be set to `change` or `blur`.\n */\n mode?: 'change' | 'blur' | 'submit'\n /**\n * @default 'change'\n *\n * This is the mode that will be used after the form has been submitted.\n * It will run the validation logic on `change` by default, but can be set to `blur` or `submit`.\n */\n modeAfterSubmission?: 'change' | 'blur' | 'submit'\n}\n\nexport type ValidationLogicFn = (props: ValidationLogicProps) => void\n\n/**\n * This forces a form's validation logic to be ran as if it were a React Hook Form validation logic.\n *\n * This means that it will only run the `onDynamic` validator, and it will not run any other validators and changes the validation\n * type based on the state of the form itself.\n *\n * When the form is not yet submitted, it will not run the validation logic.\n * When the form is submitted, it will run the validation logic on `change`\n */\nexport const revalidateLogic =\n ({\n mode = 'submit',\n modeAfterSubmission = 'change',\n }: RevalidateLogicProps = {}): ValidationLogicFn =>\n (props) => {\n const validatorNames = Object.keys(props.validators ?? {})\n if (validatorNames.length === 0) {\n // No validators is a valid case, just return\n return props.runValidation({\n validators: [],\n form: props.form,\n })\n }\n\n const dynamicValidator = {\n fn: props.event.async\n ? props.validators!['onDynamicAsync']\n : props.validators!['onDynamic'],\n cause: 'dynamic',\n } as const\n\n const validatorsToAdd = [] as ValidationLogicValidatorsFn[]\n\n const modeToWatch =\n props.form.state.submissionAttempts === 0 ? mode : modeAfterSubmission\n\n if ([modeToWatch, 'submit'].includes(props.event.type)) {\n validatorsToAdd.push(dynamicValidator)\n }\n\n let defaultValidators = [] as ValidationLogicValidatorsFn[]\n\n defaultValidationLogic({\n ...props,\n runValidation: (vProps) => {\n defaultValidators = vProps.validators as ValidationLogicValidatorsFn[]\n },\n })\n\n if (validatorsToAdd.length === 0) {\n return props.runValidation({\n validators: defaultValidators,\n form: props.form,\n })\n }\n\n return props.runValidation({\n validators: [...defaultValidators, ...validatorsToAdd],\n form: props.form,\n })\n }\n\nexport const defaultValidationLogic: ValidationLogicFn = (props) => {\n // Handle case where no validators are provided\n if (!props.validators) {\n return props.runValidation({\n validators: [],\n form: props.form,\n })\n }\n\n const isAsync = props.event.async\n\n const onMountValidator = isAsync\n ? undefined\n : ({ fn: props.validators.onMount, cause: 'mount' } as const)\n\n const onChangeValidator = {\n fn: isAsync ? props.validators.onChangeAsync : props.validators.onChange,\n cause: 'change',\n } as const\n\n const onBlurValidator = {\n fn: isAsync ? props.validators.onBlurAsync : props.validators.onBlur,\n cause: 'blur',\n } as const\n\n const onSubmitValidator = {\n fn: isAsync ? props.validators.onSubmitAsync : props.validators.onSubmit,\n cause: 'submit',\n } as const\n\n // Allows us to clear onServer errors\n const onServerValidator = isAsync\n ? undefined\n : ({ fn: () => undefined, cause: 'server' } as const)\n\n switch (props.event.type) {\n case 'mount': {\n // Run mount validation\n return props.runValidation({\n validators: [onMountValidator],\n form: props.form,\n })\n }\n case 'submit': {\n // Run change, blur, submit, server validation\n return props.runValidation({\n validators: [\n onChangeValidator,\n onBlurValidator,\n onSubmitValidator,\n onServerValidator,\n ],\n form: props.form,\n })\n }\n case 'server': {\n // Run server validation\n return props.runValidation({\n validators: [],\n form: props.form,\n })\n }\n case 'blur': {\n // Run blur, server validation\n return props.runValidation({\n validators: [onBlurValidator, onServerValidator],\n form: props.form,\n })\n }\n case 'change': {\n // Run change, server validation\n return props.runValidation({\n validators: [onChangeValidator, onServerValidator],\n form: props.form,\n })\n }\n default: {\n throw new Error(`Unknown validation event type: ${props.event.type}`)\n }\n }\n}\n","import type { ValidationSource } from './types'\n\nexport type TStandardSchemaValidatorValue<\n TData,\n TSource extends ValidationSource = ValidationSource,\n> = {\n value: TData\n validationSource: TSource\n}\n\nexport type TStandardSchemaValidatorIssue<\n TSource extends ValidationSource = ValidationSource,\n> = TSource extends 'form'\n ? {\n form: Record<string, StandardSchemaV1Issue[]>\n fields: Record<string, StandardSchemaV1Issue[]>\n }\n : TSource extends 'field'\n ? StandardSchemaV1Issue[]\n : never\n\nfunction prefixSchemaToErrors(\n issues: readonly StandardSchemaV1Issue[],\n formValue: unknown,\n) {\n const schema = new Map<string, StandardSchemaV1Issue[]>()\n\n for (const issue of issues) {\n const issuePath = issue.path ?? []\n\n let currentFormValue = formValue\n let path = ''\n\n for (let i = 0; i < issuePath.length; i++) {\n const pathSegment = issuePath[i]\n if (pathSegment === undefined) continue\n\n const segment =\n typeof pathSegment === 'object' ? pathSegment.key : pathSegment\n\n // Standard Schema doesn't specify if paths should use numbers or stringified numbers for array access.\n // However, if we follow the path it provides and encounter an array, then we can assume it's intended for array access.\n const segmentAsNumber = Number(segment)\n if (Array.isArray(currentFormValue) && !Number.isNaN(segmentAsNumber)) {\n path += `[${segmentAsNumber}]`\n } else {\n path += (i > 0 ? '.' : '') + String(segment)\n }\n\n if (typeof currentFormValue === 'object' && currentFormValue !== null) {\n currentFormValue = currentFormValue[segment as never]\n } else {\n currentFormValue = undefined\n }\n }\n schema.set(path, (schema.get(path) ?? []).concat(issue))\n }\n\n return Object.fromEntries(schema)\n}\n\nconst transformFormIssues = <TSource extends ValidationSource>(\n issues: readonly StandardSchemaV1Issue[],\n formValue: unknown,\n): TStandardSchemaValidatorIssue<TSource> => {\n const schemaErrors = prefixSchemaToErrors(issues, formValue)\n return {\n form: schemaErrors,\n fields: schemaErrors,\n } as TStandardSchemaValidatorIssue<TSource>\n}\n\nexport const standardSchemaValidators = {\n validate<TSource extends ValidationSource = ValidationSource>(\n {\n value,\n validationSource,\n }: TStandardSchemaValidatorValue<unknown, TSource>,\n schema: StandardSchemaV1,\n ): TStandardSchemaValidatorIssue<TSource> | undefined {\n const result = schema['~standard'].validate(value)\n\n if (result instanceof Promise) {\n throw new Error('async function passed to sync validator')\n }\n\n if (!result.issues) return\n\n if (validationSource === 'field')\n return result.issues as TStandardSchemaValidatorIssue<TSource>\n return transformFormIssues<TSource>(result.issues, value)\n },\n async validateAsync<TSource extends ValidationSource>(\n {\n value,\n validationSource,\n }: TStandardSchemaValidatorValue<unknown, TSource>,\n schema: StandardSchemaV1,\n ): Promise<TStandardSchemaValidatorIssue<TSource> | undefined> {\n const result = await schema['~standard'].validate(value)\n\n if (!result.issues) return\n\n if (validationSource === 'field')\n return result.issues as TStandardSchemaValidatorIssue<TSource>\n return transformFormIssues<TSource>(result.issues, value)\n },\n}\n\nexport const isStandardSchemaValidator = (\n validator: unknown,\n): validator is StandardSchemaV1 =>\n !!validator && '~standard' in (validator as object)\n\n/**\n * The Standard Schema interface.\n */\nexport type StandardSchemaV1<Input = unknown, Output = Input> = {\n /**\n * The Standard Schema properties.\n */\n readonly '~standard': StandardSchemaV1Props<Input, Output>\n}\n\n/**\n * The Standard Schema properties interface.\n */\ninterface StandardSchemaV1Props<Input = unknown, Output = Input> {\n /**\n * The version number of the standard.\n */\n readonly version: 1\n /**\n * The vendor name of the schema library.\n */\n readonly vendor: string\n /**\n * Validates unknown input values.\n */\n readonly validate: (\n value: unknown,\n ) => StandardSchemaV1Result<Output> | Promise<StandardSchemaV1Result<Output>>\n /**\n * Inferred types associated with the schema.\n */\n readonly types?: StandardSchemaV1Types<Input, Output> | undefined\n}\n/**\n * The result interface of the validate function.\n */\ntype StandardSchemaV1Result<Output> =\n | StandardSchemaV1SuccessResult<Output>\n | StandardSchemaV1FailureResult\n/**\n * The result interface if validation succeeds.\n */\ninterface StandardSchemaV1SuccessResult<Output> {\n /**\n * The typed output value.\n */\n readonly value: Output\n /**\n * The non-existent issues.\n */\n readonly issues?: undefined\n}\n/**\n * The result interface if validation fails.\n */\ninterface StandardSchemaV1FailureResult {\n /**\n * The issues of failed validation.\n */\n readonly issues: ReadonlyArray<StandardSchemaV1Issue>\n}\n/**\n * The issue interface of the failure output.\n */\nexport interface StandardSchemaV1Issue {\n /**\n * The error message of the issue.\n */\n readonly message: string\n /**\n * The path of the issue, if any.\n */\n readonly path?:\n | ReadonlyArray<PropertyKey | StandardSchemaV1PathSegment>\n | undefined\n}\n/**\n * The path segment interface of the issue.\n */\ninterface StandardSchemaV1PathSegment {\n /**\n * The key representing a path segment.\n */\n readonly key: PropertyKey\n}\n/**\n * The Standard Schema types interface.\n */\ninterface StandardSchemaV1Types<Input = unknown, Output = Input> {\n /**\n * The input type of the schema.\n */\n readonly input: Input\n /**\n * The output type of the schema.\n */\n readonly output: Output\n}\n","import type {\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type { AnyFieldMeta } from './FieldApi'\nimport type { DeepKeys } from './util-types'\n\ntype ArrayFieldMode = 'insert' | 'remove' | 'swap' | 'move'\n\nexport const defaultFieldMeta: AnyFieldMeta = {\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n isValid: true,\n isDefaultValue: true,\n errors: [],\n errorMap: {},\n errorSourceMap: {},\n}\n\nexport function metaHelper<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n>(\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n) {\n function handleArrayFieldMetaShift(\n field: DeepKeys<TFormData>,\n index: number,\n mode: ArrayFieldMode,\n secondIndex?: number,\n ) {\n const affectedFields = getAffectedFields(field, index, mode, secondIndex)\n\n const handlers = {\n insert: () => handleInsertMode(affectedFields, field, index),\n remove: () => handleRemoveMode(affectedFields),\n swap: () =>\n secondIndex !== undefined &&\n handleSwapMode(affectedFields, field, index, secondIndex),\n move: () =>\n secondIndex !== undefined &&\n handleMoveMode(affectedFields, field, index, secondIndex),\n }\n\n handlers[mode]()\n }\n\n function getFieldPath(field: DeepKeys<TFormData>, index: number): string {\n return `${field}[${index}]`\n }\n\n function getAffectedFields(\n field: DeepKeys<TFormData>,\n index: number,\n mode: ArrayFieldMode,\n secondIndex?: number,\n ): DeepKeys<TFormData>[] {\n const affectedFieldKeys = [getFieldPath(field, index)]\n\n if (mode === 'swap') {\n affectedFieldKeys.push(getFieldPath(field, secondIndex!))\n } else if (mode === 'move') {\n const [startIndex, endIndex] = [\n Math.min(index, secondIndex!),\n Math.max(index, secondIndex!),\n ]\n for (let i = startIndex; i <= endIndex; i++) {\n affectedFieldKeys.push(getFieldPath(field, i))\n }\n } else {\n const currentValue = formApi.getFieldValue(field)\n const fieldItems = Array.isArray(currentValue)\n ? (currentValue as Array<unknown>).length\n : 0\n for (let i = index + 1; i < fieldItems; i++) {\n affectedFieldKeys.push(getFieldPath(field, i))\n }\n }\n\n return Object.keys(formApi.fieldInfo).filter((fieldKey) =>\n affectedFieldKeys.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n }\n\n function updateIndex(\n fieldKey: string,\n direction: 'up' | 'down',\n ): DeepKeys<TFormData> {\n return fieldKey.replace(/\\[(\\d+)\\]/, (_, num) => {\n const currIndex = parseInt(num, 10)\n const newIndex =\n direction === 'up' ? currIndex + 1 : Math.max(0, currIndex - 1)\n return `[${newIndex}]`\n }) as DeepKeys<TFormData>\n }\n\n function shiftMeta(fields: DeepKeys<TFormData>[], direction: 'up' | 'down') {\n const sortedFields = direction === 'up' ? fields : [...fields].reverse()\n\n sortedFields.forEach((fieldKey) => {\n const nextFieldKey = updateIndex(fieldKey.toString(), direction)\n const nextFieldMeta = formApi.getFieldMeta(nextFieldKey)\n if (nextFieldMeta) {\n formApi.setFieldMeta(fieldKey, nextFieldMeta)\n } else {\n formApi.setFieldMeta(fieldKey, getEmptyFieldMeta())\n }\n })\n }\n\n const getEmptyFieldMeta = (): AnyFieldMeta => defaultFieldMeta\n\n const handleInsertMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n insertIndex: number,\n ) => {\n shiftMeta(fields, 'down')\n\n fields.forEach((fieldKey) => {\n if (fieldKey.toString().startsWith(getFieldPath(field, insertIndex))) {\n formApi.setFieldMeta(fieldKey, getEmptyFieldMeta())\n }\n })\n }\n\n const handleRemoveMode = (fields: DeepKeys<TFormData>[]) => {\n shiftMeta(fields, 'up')\n }\n\n const handleMoveMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n fromIndex: number,\n toIndex: number,\n ) => {\n // Store the original field meta that will be reapplied at the destination index\n const fromFields = new Map(\n Object.keys(formApi.fieldInfo)\n .filter((fieldKey) =>\n fieldKey.startsWith(getFieldPath(field, fromIndex)),\n )\n .map((fieldKey) => [\n fieldKey as DeepKeys<TFormData>,\n formApi.getFieldMeta(fieldKey as DeepKeys<TFormData>),\n ]),\n )\n\n shiftMeta(fields, fromIndex < toIndex ? 'up' : 'down')\n\n // Reapply the stored field meta at the destination index\n Object.keys(formApi.fieldInfo)\n .filter((fieldKey) => fieldKey.startsWith(getFieldPath(field, toIndex)))\n .forEach((fieldKey) => {\n const fromKey = fieldKey.replace(\n getFieldPath(field, toIndex),\n getFieldPath(field, fromIndex),\n ) as DeepKeys<TFormData>\n\n const fromMeta = fromFields.get(fromKey)\n if (fromMeta) {\n formApi.setFieldMeta(fieldKey as DeepKeys<TFormData>, fromMeta)\n }\n })\n }\n\n const handleSwapMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n index: number,\n secondIndex: number,\n ) => {\n fields.forEach((fieldKey) => {\n if (!fieldKey.toString().startsWith(getFieldPath(field, index))) return\n\n const swappedKey = fieldKey\n .toString()\n .replace(\n getFieldPath(field, index),\n getFieldPath(field, secondIndex),\n ) as DeepKeys<TFormData>\n\n const [meta1, meta2] = [\n formApi.getFieldMeta(fieldKey),\n formApi.getFieldMeta(swappedKey),\n ]\n\n if (meta1) formApi.setFieldMeta(swappedKey, meta1)\n if (meta2) formApi.setFieldMeta(fieldKey, meta2)\n })\n }\n\n return { handleArrayFieldMetaShift }\n}\n","import { EventClient } from '@tanstack/devtools-event-client'\n\nimport type { AnyFormOptions, AnyFormState } from './FormApi'\n\ntype ExtractEventNames<T> = T extends `${string}:${infer EventName}`\n ? EventName\n : never\n\nexport type BroadcastFormState = {\n id: string\n state: AnyFormState\n}\n\nexport type BroadcastFormApi = {\n id: string\n state: AnyFormState\n options: AnyFormOptions\n}\n\nexport type BroadcastFormSubmissionState =\n | {\n id: string\n submissionAttempt: number\n successful: false\n stage: 'validateAllFields' | 'validate'\n errors: any[]\n }\n | {\n id: string\n submissionAttempt: number\n successful: false\n stage: 'inflight'\n onError: unknown\n }\n | {\n id: string\n submissionAttempt: number\n successful: true\n }\n\nexport type BroadcastFormId = {\n id: string\n}\n\ntype EventMap = {\n 'form-devtools:form-state': BroadcastFormState\n 'form-devtools:form-api': BroadcastFormApi\n 'form-devtools:form-submission': BroadcastFormSubmissionState\n\n 'form-devtools:request-form-state': BroadcastFormId\n 'form-devtools:request-form-reset': BroadcastFormId\n 'form-devtools:request-form-force-submit': BroadcastFormId\n\n 'form-devtools:form-unmounted': BroadcastFormId\n}\n\nexport type EventClientEventMap = keyof EventMap\n\nexport type EventClientEventNames = ExtractEventNames<EventClientEventMap>\n\nclass FormEventClient extends EventClient<EventMap> {\n constructor() {\n super({\n pluginId: 'form-devtools',\n })\n }\n}\n\nexport const formEventClient = new FormEventClient()\n","import { Derived, Store, batch } from '@tanstack/store'\nimport { throttle } from '@tanstack/pacer'\nimport {\n deleteBy,\n determineFormLevelErrorSourceAndValue,\n evaluate,\n functionalUpdate,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n isGlobalFormValidationError,\n isNonEmptyArray,\n mergeOpts,\n setBy,\n uuid,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\n\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta, metaHelper } from './metaHelper'\nimport { formEventClient } from './EventClient'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n AnyFieldApi,\n AnyFieldMeta,\n AnyFieldMetaBase,\n FieldApi,\n} from './FieldApi'\nimport type {\n ExtractGlobalFormError,\n FieldManipulator,\n FormValidationError,\n FormValidationErrorMap,\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapKeys,\n} from './types'\nimport type { DeepKeys, DeepKeysOfType, DeepValue } from './util-types'\nimport type { Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FormErrorMapFromValidator<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n >\n>\n\nexport type FormValidateFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormValidateOrFn<TFormData> =\n | FormValidateFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormValidateOrFn<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ExtractGlobalFormError<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\n/**\n * @private\n */\nexport type FormValidateAsyncFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\nexport type FormValidator<TFormData, TType, TFn = unknown> = {\n validate(options: { value: TType }, fn: TFn): ValidationError\n validateAsync(\n options: { value: TType },\n fn: TFn,\n ): Promise<FormValidationError<TFormData>>\n}\n\ntype ValidationPromiseResult<TFormData> =\n | {\n fieldErrors: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n errorMapKey: ValidationErrorMapKeys\n }\n | undefined\n\n/**\n * @private\n */\nexport type FormAsyncValidateOrFn<TFormData> =\n | FormValidateAsyncFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormAsyncValidateOrFn<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? ExtractGlobalFormError<Awaited<ReturnType<TValidateOrFn>>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\nexport interface FormValidators<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n /**\n * Optional function that fires as soon as the component mounts.\n */\n onMount?: TOnMount\n /**\n * Optional function that checks the validity of your data whenever a value changes\n */\n onChange?: TOnChange\n /**\n * Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds.\n */\n onChangeAsyncDebounceMs?: number\n /**\n * Optional function that validates the form data when a field loses focus, returns a `FormValidationError`\n */\n onBlur?: TOnBlur\n /**\n * Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`\n */\n onBlurAsync?: TOnBlurAsync\n /**\n * The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds.\n */\n onBlurAsyncDebounceMs?: number\n onSubmit?: TOnSubmit\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface FormTransform<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n fn: (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n deps: unknown[]\n}\n\nexport interface FormListeners<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n onChange?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onChangeDebounceMs?: number\n\n onBlur?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onBlurDebounceMs?: number\n\n onMount?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n }) => void\n\n onSubmit?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n}\n\n/**\n * An object representing the base properties of a form, unrelated to any validators\n */\nexport interface BaseFormOptions<in out TFormData, in out TSubmitMeta = never> {\n /**\n * Set initial values for your form.\n */\n defaultValues?: TFormData\n /**\n * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n */\n onSubmitMeta?: TSubmitMeta\n}\n\n/**\n * An object representing the options for a form.\n */\nexport interface FormOptions<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> extends BaseFormOptions<TFormData, TSubmitMeta> {\n /**\n * The form name, used for devtools and identification\n */\n formId?: string\n /**\n * The default state for the form.\n */\n defaultState?: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.\n */\n asyncAlways?: boolean\n /**\n * Optional time in milliseconds if you want to introduce a delay before firing off an async action.\n */\n asyncDebounceMs?: number\n /**\n * If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined.\n */\n canSubmitWhenInvalid?: boolean\n /**\n * A list of validators to pass to the form\n */\n validators?: FormValidators<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n\n validationLogic?: ValidationLogicFn\n\n /**\n * form level listeners\n */\n listeners?: FormListeners<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\n /**\n * A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`\n */\n onSubmit?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => any | Promise<any>\n /**\n * Specify an action for scenarios where the user tries to submit an invalid form.\n */\n onSubmitInvalid?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n transform?: FormTransform<\n NoInfer<TFormData>,\n NoInfer<TOnMount>,\n NoInfer<TOnChange>,\n NoInfer<TOnChangeAsync>,\n NoInfer<TOnBlur>,\n NoInfer<TOnBlurAsync>,\n NoInfer<TOnSubmit>,\n NoInfer<TOnSubmitAsync>,\n NoInfer<TOnDynamic>,\n NoInfer<TOnDynamicAsync>,\n NoInfer<TOnServer>,\n NoInfer<TSubmitMeta>\n >\n}\n\nexport type AnyFormOptions = FormOptions<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object representing the validation metadata for a field. Not intended for public usage.\n */\nexport type ValidationMeta = {\n /**\n * An abort controller stored in memory to cancel previous async validation attempts.\n */\n lastAbortController: AbortController\n}\n\n/**\n * An object representing the field information for a specific field within the form.\n */\nexport type FieldInfo<TFormData> = {\n /**\n * An instance of the FieldAPI.\n */\n instance: FieldApi<\n TFormData,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n > | null\n /**\n * A record of field validation internal handling.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n}\n\n/**\n * An object representing the current state of the form.\n */\nexport type BaseFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * The current values of the form fields.\n */\n values: TFormData\n /**\n * The error map for the form itself.\n */\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * An internal mechanism used for keeping track of validation logic in a form.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n /**\n * A record of field metadata for each field in the form, not including the derived properties, like `errors` and such\n */\n fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>\n /**\n * A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.\n *\n * Goes back to `false` when submission completes for one of the following reasons:\n * - the validation step returned errors.\n * - the `onSubmit` function has completed.\n *\n * Note: if you're running async operations in your `onSubmit` function make sure to await them to ensure `isSubmitting` is set to `false` only when the async operation completes.\n *\n * This is useful for displaying loading indicators or disabling form inputs during submission.\n *\n */\n isSubmitting: boolean\n /**\n * A boolean indicating if the `onSubmit` function has completed successfully.\n *\n * Goes back to `false` at each new submission attempt.\n *\n * Note: you can use isSubmitting to check if the form is currently submitting.\n */\n isSubmitted: boolean\n /**\n * A boolean indicating if the form or any of its fields are currently validating.\n */\n isValidating: boolean\n /**\n * A counter for tracking the number of submission attempts.\n */\n submissionAttempts: number\n /**\n * A boolean indicating if the last submission was successful.\n */\n isSubmitSuccessful: boolean\n /**\n * @private, used to force a re-evaluation of the form state when options change\n */\n _force_re_eval?: boolean\n}\n\nexport type DerivedFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * A boolean indicating if the form is currently validating.\n */\n isFormValidating: boolean\n /**\n * A boolean indicating if the form is valid.\n */\n isFormValid: boolean\n /**\n * The error array for the form itself.\n */\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * A boolean indicating if any of the form fields are currently validating.\n */\n isFieldsValidating: boolean\n /**\n * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.\n */\n isFieldsValid: boolean\n /**\n * A boolean indicating if any of the form fields have been touched.\n */\n isTouched: boolean\n /**\n * A boolean indicating if any of the form fields have been blurred.\n */\n isBlurred: boolean\n /**\n * A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if all of the form's fields are the same as default values.\n */\n isDefaultValue: boolean\n /**\n * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.\n */\n isValid: boolean\n /**\n * A boolean indicating if the form can be submitted based on its current state.\n */\n canSubmit: boolean\n /**\n * A record of field metadata for each field in the form.\n */\n fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>\n}\n\nexport interface FormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >,\n DerivedFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n > {}\n\nexport type AnyFormState = FormState<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nfunction getDefaultFormState<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultState: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n): BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n> {\n return {\n values: defaultState.values ?? ({} as never),\n errorMap: defaultState.errorMap ?? {},\n fieldMetaBase: defaultState.fieldMetaBase ?? ({} as never),\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n isSubmitSuccessful: defaultState.isSubmitSuccessful ?? false,\n validationMetaMap: defaultState.validationMetaMap ?? {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n }\n}\n\n/**\n * @public\n *\n * A type representing the Form API with all generics set to `any` for convenience.\n */\nexport type AnyFormApi = FormApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the Form API. It handles the logic and interactions with the form state.\n *\n * Normally, you will not need to create a new `FormApi` instance directly. Instead, you will use a framework\n * hook/function like `useForm` or `createForm` to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling the `new FormApi` constructor.\n */\nexport class FormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> implements FieldManipulator<TFormData, TSubmitMeta>\n{\n /**\n * The options for the form.\n */\n options: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = {}\n baseStore!: Store<\n BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n fieldMetaDerived!: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>\n store!: Derived<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * A record of field information for each field in the form.\n */\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n\n get state() {\n return this.store.state\n }\n\n /**\n * @private\n */\n prevTransformArray: unknown[] = []\n\n /**\n * @private\n */\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n /**\n * @private\n */\n private _formId: string\n /**\n * @private\n */\n private _devtoolsSubmissionOverride: boolean\n\n /**\n * Constructs a new `FormApi` instance with the given form options.\n */\n constructor(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) {\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this._formId = opts?.formId ?? uuid()\n\n this._devtoolsSubmissionOverride = false\n\n this.baseStore = new Store(\n getDefaultFormState({\n ...(opts?.defaultState as any),\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n )\n\n this.fieldMetaDerived = new Derived({\n deps: [this.baseStore],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | Record<DeepKeys<TFormData>, AnyFieldMeta>\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n\n let originalMetaCount = 0\n\n const fieldMeta = {} as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >['fieldMeta']\n\n for (const fieldName of Object.keys(\n currBaseStore.fieldMetaBase,\n ) as Array<keyof typeof currBaseStore.fieldMetaBase>) {\n const currBaseMeta = currBaseStore.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase\n\n const prevBaseMeta = prevBaseStore?.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase | undefined\n\n const prevFieldInfo =\n prevVal?.[fieldName as never as keyof typeof prevVal]\n\n const curFieldVal = getBy(currBaseStore.values, fieldName)\n\n let fieldErrors = prevFieldInfo?.errors\n if (\n !prevBaseMeta ||\n currBaseMeta.errorMap !== prevBaseMeta.errorMap\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldErrors = Object.values(currBaseMeta.errorMap ?? {}).filter(\n (val) => val !== undefined,\n ) as never\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.getFieldInfo(fieldName)?.instance\n\n if (fieldInstance && !fieldInstance.options.disableErrorFlat) {\n fieldErrors = (fieldErrors as undefined | string[])?.flat(\n 1,\n ) as never\n }\n }\n\n // As primitives, we don't need to aggressively persist the same referential value for performance reasons\n const isFieldValid = !isNonEmptyArray(fieldErrors ?? [])\n const isFieldPristine = !currBaseMeta.isDirty\n const isDefaultValue =\n evaluate(\n curFieldVal,\n getBy(this.options.defaultValues, fieldName),\n ) ||\n evaluate(\n curFieldVal,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.getFieldInfo(fieldName)?.instance?.options.defaultValue,\n )\n\n if (\n prevFieldInfo &&\n prevFieldInfo.isPristine === isFieldPristine &&\n prevFieldInfo.isValid === isFieldValid &&\n prevFieldInfo.isDefaultValue === isDefaultValue &&\n prevFieldInfo.errors === fieldErrors &&\n currBaseMeta === prevBaseMeta\n ) {\n fieldMeta[fieldName] = prevFieldInfo\n originalMetaCount++\n continue\n }\n\n fieldMeta[fieldName] = {\n ...currBaseMeta,\n errors: fieldErrors,\n isPristine: isFieldPristine,\n isValid: isFieldValid,\n isDefaultValue: isDefaultValue,\n } as AnyFieldMeta\n }\n\n if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta\n\n if (\n prevVal &&\n originalMetaCount === Object.keys(currBaseStore.fieldMetaBase).length\n ) {\n return prevVal\n }\n\n return fieldMeta\n },\n })\n\n this.store = new Derived({\n deps: [this.baseStore, this.fieldMetaDerived],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n const currFieldMeta = currDepVals[1]\n\n // Computed state\n const fieldMetaValues = Object.values(currFieldMeta).filter(\n Boolean,\n ) as AnyFieldMeta[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field.isValidating,\n )\n\n const isFieldsValid = fieldMetaValues.every((field) => field.isValid)\n\n const isTouched = fieldMetaValues.some((field) => field.isTouched)\n const isBlurred = fieldMetaValues.some((field) => field.isBlurred)\n const isDefaultValue = fieldMetaValues.every(\n (field) => field.isDefaultValue,\n )\n\n const shouldInvalidateOnMount =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isTouched && currBaseStore.errorMap?.onMount\n\n const isDirty = fieldMetaValues.some((field) => field.isDirty)\n const isPristine = !isDirty\n\n const hasOnMountError = Boolean(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currBaseStore.errorMap?.onMount ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldMetaValues.some((f) => f?.errorMap?.onMount),\n )\n\n const isValidating = !!isFieldsValidating\n\n // As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons\n let errors = prevVal?.errors ?? []\n if (\n !prevBaseStore ||\n currBaseStore.errorMap !== prevBaseStore.errorMap\n ) {\n errors = Object.values(currBaseStore.errorMap).reduce<\n Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n >((prev, curr) => {\n if (curr === undefined) return prev\n\n if (curr && isGlobalFormValidationError(curr)) {\n prev.push(curr.form as never)\n return prev\n }\n prev.push(curr as never)\n return prev\n }, [])\n }\n\n const isFormValid = errors.length === 0\n const isValid = isFieldsValid && isFormValid\n const submitInvalid = this.options.canSubmitWhenInvalid ?? false\n const canSubmit =\n (currBaseStore.submissionAttempts === 0 &&\n !isTouched &&\n !hasOnMountError) ||\n (!isValidating && !currBaseStore.isSubmitting && isValid) ||\n submitInvalid\n\n let errorMap = currBaseStore.errorMap\n if (shouldInvalidateOnMount) {\n errors = errors.filter(\n (err) => err !== currBaseStore.errorMap.onMount,\n )\n errorMap = Object.assign(errorMap, { onMount: undefined })\n }\n\n if (\n prevVal &&\n prevBaseStore &&\n prevVal.errorMap === errorMap &&\n prevVal.fieldMeta === this.fieldMetaDerived.state &&\n prevVal.errors === errors &&\n prevVal.isFieldsValidating === isFieldsValidating &&\n prevVal.isFieldsValid === isFieldsValid &&\n prevVal.isFormValid === isFormValid &&\n prevVal.isValid === isValid &&\n prevVal.canSubmit === canSubmit &&\n prevVal.isTouched === isTouched &&\n prevVal.isBlurred === isBlurred &&\n prevVal.isPristine === isPristine &&\n prevVal.isDefaultValue === isDefaultValue &&\n prevVal.isDirty === isDirty &&\n evaluate(prevBaseStore, currBaseStore)\n ) {\n return prevVal\n }\n\n let state = {\n ...currBaseStore,\n errorMap,\n fieldMeta: this.fieldMetaDerived.state,\n errors,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n isBlurred,\n isPristine,\n isDefaultValue,\n isDirty,\n } as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n\n // Only run transform if state has shallowly changed - IE how React.useEffect works\n const transformArray = this.options.transform?.deps ?? []\n const shouldTransform =\n transformArray.length !== this.prevTransformArray.length ||\n transformArray.some((val, i) => val !== this.prevTransformArray[i])\n\n if (shouldTransform) {\n const newObj = Object.assign({}, this, { state })\n // This mutates the state\n this.options.transform?.fn(newObj)\n state = newObj.state\n this.prevTransformArray = transformArray\n }\n\n return state\n },\n })\n\n this.handleSubmit = this.handleSubmit.bind(this)\n\n this.update(opts || {})\n\n const debouncedDevtoolState = throttle(\n (state: AnyFormState) =>\n formEventClient.emit('form-state', {\n id: this._formId,\n state: state,\n }),\n {\n wait: 300,\n },\n )\n\n // devtool broadcasts\n this.store.subscribe(() => {\n debouncedDevtoolState(this.store.state)\n })\n\n // devtool requests\n formEventClient.on('request-form-state', (e) => {\n if (e.payload.id === this._formId) {\n formEventClient.emit('form-api', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n })\n\n formEventClient.on('request-form-reset', (e) => {\n if (e.payload.id === this._formId) {\n this.reset()\n }\n })\n\n formEventClient.on('request-form-force-submit', (e) => {\n if (e.payload.id === this._formId) {\n this._devtoolsSubmissionOverride = true\n this.handleSubmit()\n this._devtoolsSubmissionOverride = false\n }\n })\n }\n\n get formId(): string {\n return this._formId\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TFormData> & {\n formApi: AnyFormApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FormValidateOrFn<TFormData>\n : FormAsyncValidateOrFn<TFormData>\n value: TValue\n type: TType\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FormValidateFn<any>)(props.value) as never\n }\n\n mount = () => {\n const cleanupFieldMetaDerived = this.fieldMetaDerived.mount()\n const cleanupStoreDerived = this.store.mount()\n const cleanup = () => {\n cleanupFieldMetaDerived()\n cleanupStoreDerived()\n\n // broadcast form unmount for devtools\n formEventClient.emit('form-unmounted', {\n id: this._formId,\n })\n }\n\n this.options.listeners?.onMount?.({ formApi: this })\n\n const { onMount } = this.options.validators || {}\n\n // broadcast form state for devtools on mounting\n formEventClient.emit('form-api', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n\n // if no validation skip\n if (!onMount) return cleanup\n\n // validate\n this.validateSync('mount')\n return cleanup\n }\n\n /**\n * Updates the form options and form state.\n */\n update = (\n options?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => {\n if (!options) return\n\n const oldOptions = this.options\n\n // Options need to be updated first so that when the store is updated, the state is correct for the derived state\n this.options = options\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const shouldUpdateReeval = !!options.transform?.deps?.some(\n (val, i) => val !== this.prevTransformArray[i],\n )\n\n const shouldUpdateValues =\n options.defaultValues &&\n !evaluate(options.defaultValues, oldOptions.defaultValues) &&\n !this.state.isTouched\n\n const shouldUpdateState =\n !evaluate(options.defaultState, oldOptions.defaultState) &&\n !this.state.isTouched\n\n if (!shouldUpdateValues && !shouldUpdateState && !shouldUpdateReeval) return\n\n batch(() => {\n this.baseStore.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state as any,\n\n shouldUpdateState ? options.defaultState : {},\n\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n\n shouldUpdateReeval\n ? { _force_re_eval: !this.state._force_re_eval }\n : {},\n ),\n ),\n )\n })\n\n formEventClient.emit('form-api', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n\n /**\n * Resets the form state to the default values.\n * If values are provided, the form will be reset to those values instead and the default values will be updated.\n *\n * @param values - Optional values to reset the form to.\n * @param opts - Optional options to control the reset behavior.\n */\n reset = (values?: TFormData, opts?: { keepDefaultValues?: boolean }) => {\n const { fieldMeta: currentFieldMeta } = this.state\n const fieldMetaBase = this.resetFieldMeta(currentFieldMeta)\n\n if (values && !opts?.keepDefaultValues) {\n this.options = {\n ...this.options,\n defaultValues: values,\n }\n }\n\n this.baseStore.setState(() =>\n getDefaultFormState({\n ...(this.options.defaultState as any),\n values:\n values ??\n this.options.defaultValues ??\n this.options.defaultState?.values,\n fieldMetaBase,\n }),\n )\n }\n\n /**\n * Validates all fields using the correct handlers for a given validation cause.\n */\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n const fieldInstance = field.instance\n // Validate the field\n fieldValidationPromises.push(\n // Remember, `validate` is either a sync operation or a promise\n Promise.resolve().then(() =>\n fieldInstance.validate(cause, { skipFormValidation: true }),\n ),\n )\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.\n */\n validateArrayFieldsStartingFrom = async <\n TField extends DeepKeysOfType<TFormData, any[]>,\n >(\n field: TField,\n index: number,\n cause: ValidationCause,\n ) => {\n const currentValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(currentValue)\n ? Math.max((currentValue as Array<unknown>).length - 1, 0)\n : null\n\n // We have to validate all fields that have shifted (at least the current field)\n const fieldKeysToValidate = [`${field}[${index}]`]\n for (let i = index + 1; i <= (lastIndex ?? 0); i++) {\n fieldKeysToValidate.push(`${field}[${i}]`)\n }\n\n // We also have to include all fields that are nested in the shifted fields\n const fieldsToValidate = Object.keys(this.fieldInfo).filter((fieldKey) =>\n fieldKeysToValidate.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n\n // Validate the fields\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n fieldsToValidate.forEach((nestedField) => {\n fieldValidationPromises.push(\n Promise.resolve().then(() => this.validateField(nestedField, cause)),\n )\n })\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates a specified field in the form using the correct handlers for a given validation type.\n */\n validateField = <TField extends DeepKeys<TFormData>>(\n field: TField,\n cause: ValidationCause,\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.fieldInfo[field]?.instance\n if (!fieldInstance) return []\n\n // If the field is not touched (same logic as in validateAllFields)\n if (!fieldInstance.state.meta.isTouched) {\n // Mark it as touched\n fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n\n return fieldInstance.validate(cause)\n }\n\n /**\n * TODO: This code is copied from FieldApi, we should refactor to share\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n ): {\n hasErrored: boolean\n fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n } => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n let hasErrored = false as boolean\n\n // This map will only include fields that have errors in the current validation cycle\n const currentValidationErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n\n batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n\n const rawError = this.runValidator({\n validate: validateObj.validate,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n },\n type: 'validate',\n })\n\n const { formError, fieldErrors } = normalizeError<TFormData>(rawError)\n\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrors?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (newSource === 'form') {\n currentValidationErrorMap[field] = {\n ...currentValidationErrorMap[field],\n [errorMapKey]: newFormValidatorError,\n }\n }\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.errorMap?.[errorMapKey] !== formError) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n }\n\n if (formError || fieldErrors) {\n hasErrored = true\n }\n }\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n /**\n * when we have an error for onServer in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const serverErrKey = getErrorMapKey('server')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[serverErrKey] &&\n cause !== 'server' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [serverErrKey]: undefined,\n },\n }))\n }\n })\n\n return { hasErrored, fieldsErrorMap: currentValidationErrorMap }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n ): Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n if (!this.state.isFormValidating) {\n this.baseStore.setState((prev) => ({ ...prev, isFormValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const promises: Promise<ValidationPromiseResult<TFormData>>[] = []\n\n let fieldErrorsFromFormValidators:\n | Partial<Record<DeepKeys<TFormData>, ValidationError>>\n | undefined\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.state.validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.state.validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationPromiseResult<TFormData>>(async (resolve) => {\n let rawError!:\n | ValidationError\n | FormValidationError<unknown>\n | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate!,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n signal: controller.signal,\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n const { formError, fieldErrors: fieldErrorsFromNormalizeError } =\n normalizeError<TFormData>(rawError)\n\n if (fieldErrorsFromNormalizeError) {\n fieldErrorsFromFormValidators = fieldErrorsFromFormValidators\n ? {\n ...fieldErrorsFromFormValidators,\n ...fieldErrorsFromNormalizeError,\n }\n : fieldErrorsFromNormalizeError\n }\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrorsFromFormValidators?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n\n resolve(\n fieldErrorsFromFormValidators\n ? { fieldErrors: fieldErrorsFromFormValidators, errorMapKey }\n : undefined,\n )\n }),\n )\n }\n\n let results: ValidationPromiseResult<TFormData>[] = []\n\n const fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n if (promises.length) {\n results = await Promise.all(promises)\n for (const fieldValidationResult of results) {\n if (fieldValidationResult?.fieldErrors) {\n const { errorMapKey } = fieldValidationResult\n\n for (const [field, fieldError] of Object.entries(\n fieldValidationResult.fieldErrors,\n )) {\n const oldErrorMap =\n fieldsErrorMap[field as DeepKeys<TFormData>] || {}\n const newErrorMap = {\n ...oldErrorMap,\n [errorMapKey]: fieldError,\n }\n fieldsErrorMap[field as DeepKeys<TFormData>] = newErrorMap\n }\n }\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n isFormValidating: false,\n }))\n\n return fieldsErrorMap\n }\n\n /**\n * @private\n */\n validate = (\n cause: ValidationCause,\n ):\n | FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n | Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n // Attempt to sync validate first\n const { hasErrored, fieldsErrorMap } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return fieldsErrorMap\n }\n\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n */\n handleSubmit(): Promise<void>\n handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n async handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n this.baseStore.setState((old) => ({\n ...old,\n // Submission attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n isSubmitSuccessful: false, // Reset isSubmitSuccessful at the start of submission\n }))\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const submitMetaArg =\n submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n if (!this.state.canSubmit && !this._devtoolsSubmissionOverride) {\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n return\n }\n\n this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.baseStore.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n await this.validateAllFields('submit')\n\n if (!this.state.isFieldsValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validateAllFields',\n errors: (Object.values(this.state.fieldMeta) as AnyFieldMeta[])\n .map((meta: AnyFieldMeta) => meta.errors)\n .flat(),\n })\n return\n }\n\n await this.validate('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validate',\n errors: this.state.errors,\n })\n\n return\n }\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<TFormData>[]).forEach(\n (field) => {\n field.instance?.options.listeners?.onSubmit?.({\n value: field.instance.state.value,\n fieldApi: field.instance,\n })\n },\n )\n })\n\n this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })\n\n try {\n // Run the submit code\n await this.options.onSubmit?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n batch(() => {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitted: true,\n isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n }))\n\n formEventClient.emit('form-submission', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: true,\n })\n\n done()\n })\n } catch (err) {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n }))\n\n formEventClient.emit('form-submission', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'inflight',\n onError: err,\n })\n\n done()\n\n throw err\n }\n }\n\n /**\n * Gets the value of the specified field.\n */\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n /**\n * Gets the metadata of the specified field.\n */\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): AnyFieldMeta | undefined => {\n return this.state.fieldMeta[field]\n }\n\n /**\n * Gets the field info of the specified field.\n */\n getFieldInfo = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldInfo<TFormData> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instance: null,\n validationMetaMap: {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n })\n }\n\n /**\n * Updates the metadata of the specified field.\n */\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<AnyFieldMetaBase>,\n ) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: functionalUpdate(\n updater,\n prev.fieldMetaBase[field] as never,\n ),\n },\n }\n })\n }\n\n /**\n * resets every field's meta\n */\n resetFieldMeta = <TField extends DeepKeys<TFormData>>(\n fieldMeta: Record<TField, AnyFieldMeta>,\n ): Record<TField, AnyFieldMeta> => {\n return Object.keys(fieldMeta).reduce(\n (acc: Record<TField, AnyFieldMeta>, key) => {\n const fieldKey = key as TField\n acc[fieldKey] = defaultFieldMeta\n return acc\n },\n {} as Record<TField, AnyFieldMeta>,\n )\n }\n\n /**\n * Sets the value of the specified field and optionally updates the touched state.\n */\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: UpdateMetaOptions,\n ) => {\n const dontUpdateMeta = opts?.dontUpdateMeta ?? false\n const dontRunListeners = opts?.dontRunListeners ?? false\n const dontValidate = opts?.dontValidate ?? false\n\n batch(() => {\n if (!dontUpdateMeta) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n isDirty: true,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n onMount: undefined,\n },\n }))\n }\n\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n\n if (!dontRunListeners) {\n this.getFieldInfo(field).instance?.triggerOnChangeListener()\n }\n\n if (!dontValidate) {\n this.validateField(field, 'change')\n }\n }\n\n deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {\n const fieldStr = field.toString()\n return f !== fieldStr && f.startsWith(fieldStr)\n })\n\n const fieldsToDelete = [...subFieldsToDelete, field]\n\n // Cleanup the last fields\n this.baseStore.setState((prev) => {\n const newState = { ...prev }\n fieldsToDelete.forEach((f) => {\n newState.values = deleteBy(newState.values, f)\n delete this.fieldInfo[f as never]\n delete newState.fieldMetaBase[f as never]\n })\n\n return newState\n })\n }\n\n /**\n * Pushes a value into an array field.\n */\n pushFieldValue = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n options,\n )\n }\n\n insertFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return [\n ...(prev as DeepValue<TFormData, TField>[]).slice(0, index),\n value,\n ...(prev as DeepValue<TFormData, TField>[]).slice(index),\n ] as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n }\n\n // Shift down all meta after validating to make sure the new field has been mounted\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'insert')\n\n if (!dontValidate) {\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n }\n\n /**\n * Replaces a value into an array field at the specified index.\n */\n replaceFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n }\n\n /**\n * Removes a value from an array field at the specified index.\n */\n removeFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as Array<unknown>).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Shift up all meta\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'remove')\n\n if (lastIndex !== null) {\n const start = `${field}[${lastIndex}]`\n this.deleteField(start as never)\n }\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n }\n\n /**\n * Swaps the values at the specified indices within an array field.\n */\n swapFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Swap meta\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'swap', index2)\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the swapped fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n }\n\n /**\n * Moves the value at the first specified index to the second specified index within an array field.\n */\n moveFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const next: any = [...prev]\n next.splice(index2, 0, next.splice(index1, 1)[0])\n return next\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Move meta between index1 and index2\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'move', index2)\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the moved fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n }\n\n /**\n * Clear all values within an array field.\n */\n clearFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as unknown[]).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n [] as any,\n mergeOpts(options, { dontValidate: true }),\n )\n\n if (lastIndex !== null) {\n for (let i = 0; i <= lastIndex; i++) {\n const fieldKey = `${field}[${i}]`\n this.deleteField(fieldKey as never)\n }\n }\n\n const dontValidate = options?.dontValidate ?? false\n if (!dontValidate) {\n // validate array change\n this.validateField(field, 'change')\n }\n }\n\n /**\n * Resets the field value and meta to default state\n */\n resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: defaultFieldMeta,\n },\n values: this.options.defaultValues\n ? setBy(prev.values, field, getBy(this.options.defaultValues, field))\n : prev.values,\n }\n })\n }\n\n /**\n * Updates the form's errorMap\n */\n setErrorMap(\n errorMap: FormValidationErrorMap<\n TFormData,\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >,\n ) {\n batch(() => {\n Object.entries(errorMap).forEach(([key, value]) => {\n const errorMapKey = key as ValidationErrorMapKeys\n\n if (isGlobalFormValidationError(value)) {\n const { formError, fieldErrors } = normalizeError<TFormData>(value)\n\n for (const fieldName of Object.keys(\n this.fieldInfo,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(fieldName)\n if (!fieldMeta) continue\n\n this.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: fieldErrors?.[fieldName],\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: 'form',\n },\n }))\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n } else {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: value,\n },\n }))\n }\n })\n })\n }\n\n /**\n * Returns form and field level errors\n */\n getAllErrors = (): {\n form: {\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n }\n fields: Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >\n } => {\n return {\n form: {\n errors: this.state.errors,\n errorMap: this.state.errorMap,\n },\n fields: Object.entries(this.state.fieldMeta).reduce(\n (acc, [fieldName, fieldMeta]) => {\n if (\n Object.keys(fieldMeta as AnyFieldMeta).length &&\n (fieldMeta as AnyFieldMeta).errors.length\n ) {\n acc[fieldName as DeepKeys<TFormData>] = {\n errors: (fieldMeta as AnyFieldMeta).errors,\n errorMap: (fieldMeta as AnyFieldMeta).errorMap,\n }\n }\n\n return acc\n },\n {} as Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >,\n ),\n }\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchema = (schema: StandardSchemaV1<TFormData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchemaAsync = (\n schema: StandardSchemaV1<TFormData, unknown>,\n ) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n}\n\nfunction normalizeError<TFormData>(rawError?: FormValidationError<unknown>): {\n formError: ValidationError\n fieldErrors?: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n} {\n if (rawError) {\n if (isGlobalFormValidationError(rawError)) {\n const formError = normalizeError(rawError.form).formError\n const fieldErrors = rawError.fields\n return { formError, fieldErrors } as never\n }\n\n return { formError: rawError }\n }\n\n return { formError: undefined }\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n","import { Derived, batch } from '@tanstack/store'\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport {\n determineFieldLevelErrorSourceAndValue,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n mergeOpts,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\nimport type { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n FieldInfo,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateAsyncFn,\n FormValidateFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type {\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapSource,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FieldErrorMapFromValidator<\n TFormData,\n TName extends DeepKeys<TFormData>,\n TData extends DeepValue<TFormData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n>\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype StandardBrandedSchemaV1<T> = T & { __standardSchemaV1: true }\n\ntype UnwrapFormValidateOrFnForInner<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateFn<any, any, any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateAsyncFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype UnwrapFormAsyncValidateOrFnForInner<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldAsyncValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldAsyncValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormAsyncValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateAsyncFn<any, any, any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldListenerFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field listener function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => void\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * An optional function, that runs on the mount event of input.\n */\n onMount?: TOnMount\n /**\n * An optional function, that runs on the change event of input.\n *\n * @example z.string().min(1)\n */\n onChange?: TOnChange\n /**\n * An optional property similar to `onChange` but async validation\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * An optional number to represent how long the `onChangeAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onChangeAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the blur event of input.\n *\n * @example z.string().min(1)\n */\n onBlur?: TOnBlur\n /**\n * An optional property similar to `onBlur` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onBlurAsync?: TOnBlurAsync\n\n /**\n * An optional number to represent how long the `onBlurAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onBlurAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the submit event of form.\n *\n * @example z.string().min(1)\n */\n onSubmit?: TOnSubmit\n /**\n * An optional property similar to `onSubmit` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\nexport interface FieldListeners<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n onChange?: FieldListenerFn<TParentData, TName, TData>\n onChangeDebounceMs?: number\n onBlur?: FieldListenerFn<TParentData, TName, TData>\n onBlurDebounceMs?: number\n onMount?: FieldListenerFn<TParentData, TName, TData>\n onSubmit?: FieldListenerFn<TParentData, TName, TData>\n}\n\n/**\n * An object type representing the options for a field in a form.\n */\nexport interface FieldOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.\n */\n name: TName\n /**\n * An optional default value for the field.\n */\n defaultValue?: NoInfer<TData>\n /**\n * The default time to debounce async validation if there is not a more specific debounce time passed.\n */\n asyncDebounceMs?: number\n /**\n * If `true`, always run async validation, even if there are errors emitted during synchronous validation.\n */\n asyncAlways?: boolean\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n /**\n * A list of listeners which attach to the corresponding events\n */\n listeners?: FieldListeners<TParentData, TName, TData>\n /**\n * Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases.\n */\n disableErrorFlat?: boolean\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnDynamic extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnDynamicAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> extends FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > {\n form: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n}\n\nexport type FieldMetaBase<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * A flag indicating whether the field has been touched.\n */\n isTouched: boolean\n /**\n * A flag indicating whether the field has been blurred.\n */\n isBlurred: boolean\n /**\n * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>,\n UnwrapFieldValidateOrFn<TName, TOnDynamic, TFormOnDynamic>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnDynamicAsync, TFormOnDynamicAsync>\n >\n\n /**\n * @private allows tracking the source of the errors in the error map\n */\n errorSourceMap: ValidationErrorMapSource\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\nexport type AnyFieldMetaBase = FieldMetaBase<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport type FieldMetaDerived<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * An array of errors related to the field value.\n */\n errors: Array<\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnDynamic, TFormOnDynamic>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<\n TName,\n TOnDynamicAsync,\n TFormOnDynamicAsync\n >\n >\n >\n /**\n * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if the field is valid. Evaluates `true` if there are no field errors.\n */\n isValid: boolean\n /**\n * A flag indicating whether the field's current value is the default value\n */\n isDefaultValue: boolean\n}\n\nexport type AnyFieldMetaDerived = FieldMetaDerived<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n> &\n FieldMetaDerived<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n >\n\nexport type AnyFieldMeta = FieldMeta<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * The current value of the field.\n */\n value: TData\n /**\n * The current metadata of the field.\n */\n meta: FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n >\n}\n\n/**\n * @public\n *\n * A type representing the Field API with all generics set to `any` for convenience.\n */\nexport type AnyFieldApi = FieldApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the API for managing a form field.\n *\n * Normally, you will not need to create a new `FieldApi` instance directly.\n * Instead, you will use a framework hook/function like `useField` or `createField`\n * to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling\n * the `new FieldApi` constructor.\n */\nexport class FieldApi<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnDynamic extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnDynamicAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >['form']\n /**\n * The field name.\n */\n name!: DeepKeys<TParentData>\n /**\n * The field options.\n */\n options: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n > = {} as any\n /**\n * The field state store.\n */\n store!: Derived<\n FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n >\n >\n /**\n * The current field state.\n */\n get state() {\n return this.store.state\n }\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this.store = new Derived({\n deps: [this.form.store],\n fn: () => {\n const value = this.form.getFieldValue(this.name)\n const meta = this.form.getFieldMeta(this.name) ?? {\n ...defaultFieldMeta,\n ...opts.defaultMeta,\n }\n\n return {\n value,\n meta,\n } as FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n >\n },\n })\n\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TData> & {\n fieldApi: AnyFieldApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any>\n : FieldAsyncValidateOrFn<any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n /**\n * Mounts the field instance to the form.\n */\n mount = () => {\n const cleanup = this.store.mount()\n\n if ((this.options.defaultValue as unknown) !== undefined) {\n this.form.setFieldValue(this.name, this.options.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n const info = this.getInfo()\n info.instance = this as never\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n validationSource: 'field',\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n errorSourceMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorSourceMap,\n onMount: 'field',\n },\n }) as never,\n )\n }\n }\n\n this.options.listeners?.onMount?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n return cleanup\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => {\n this.options = opts as never\n\n const nameHasChanged = this.name !== opts.name\n this.name = opts.name\n\n // Default Value\n if ((this.state.value as unknown) === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n const defaultValue = (opts.defaultValue as unknown) ?? formDefault\n\n // The name is dynamic in array fields. It changes when the user performs operations like removing or reordering.\n // In this case, we don't want to force a default value if the store managed to find an existing value.\n if (nameHasChanged) {\n this.setValue((val) => (val as unknown) || defaultValue, {\n dontUpdateMeta: true,\n })\n } else if (defaultValue !== undefined) {\n this.setValue(defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this.form.getFieldMeta(this.name) === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n /**\n * Gets the current field value.\n * @deprecated Use `field.state.value` instead.\n */\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n /**\n * Sets the field value and run the `change` validator.\n */\n setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n this.form.setFieldValue(\n this.name,\n updater as never,\n mergeOpts(options, { dontRunListeners: true, dontValidate: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n\n if (!options?.dontValidate) {\n this.validate('change')\n }\n }\n\n getMeta = () => this.store.state.meta\n\n /**\n * Sets the field metadata.\n */\n setMeta = (\n updater: Updater<\n FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync\n >\n >,\n ) => this.form.setFieldMeta(this.name, updater)\n\n /**\n * Gets the field information object.\n */\n getInfo = () => this.form.getFieldInfo(this.name)\n\n /**\n * Pushes a new value to the field.\n */\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n options?: UpdateMetaOptions,\n ) => {\n this.form.pushFieldValue(\n this.name,\n value as any,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Inserts a value at the specified index, shifting the subsequent values to the right.\n */\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n options?: UpdateMetaOptions,\n ) => {\n this.form.insertFieldValue(\n this.name,\n index,\n value as any,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Replaces a value at the specified index.\n */\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n options?: UpdateMetaOptions,\n ) => {\n this.form.replaceFieldValue(\n this.name,\n index,\n value as any,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Removes a value at the specified index.\n */\n removeValue = (index: number, options?: UpdateMetaOptions) => {\n this.form.removeFieldValue(\n this.name,\n index,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Swaps the values at the specified indices.\n */\n swapValues = (\n aIndex: number,\n bIndex: number,\n options?: UpdateMetaOptions,\n ) => {\n this.form.swapFieldValues(\n this.name,\n aIndex,\n bIndex,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Moves the value at the first specified index to the second specified index.\n */\n moveValue = (aIndex: number, bIndex: number, options?: UpdateMetaOptions) => {\n this.form.moveFieldValues(\n this.name,\n aIndex,\n bIndex,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * Clear all values from the array.\n */\n clearValues = (options?: UpdateMetaOptions) => {\n this.form.clearFieldValues(\n this.name,\n mergeOpts(options, { dontRunListeners: true }),\n )\n\n if (!options?.dontRunListeners) {\n this.triggerOnChangeListener()\n }\n }\n\n /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n const linkedFields: AnyFieldApi[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (cause === 'change' && onChangeListenTo?.includes(this.name)) {\n linkedFields.push(field.instance)\n }\n if (cause === 'blur' && onBlurListenTo?.includes(this.name as string)) {\n linkedFields.push(field.instance)\n }\n }\n\n return linkedFields\n }\n\n /**\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n errorFromForm: ValidationErrorMap,\n ) => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this.form,\n validationLogic:\n this.form.options.validationLogic || defaultValidationLogic,\n })\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getSyncValidatorArray(cause, {\n ...field.options,\n form: field.form,\n validationLogic:\n field.form.options.validationLogic || defaultValidationLogic,\n })\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n SyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n batch(() => {\n const validateFieldFn = (\n field: AnyFieldApi,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const fieldLevelError = validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : undefined\n\n const formLevelError = errorFromForm[errorMapKey]\n\n const { newErrorValue, newSource } =\n determineFieldLevelErrorSourceAndValue({\n formLevelError,\n fieldLevelError,\n })\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (field.state.meta.errorMap?.[errorMapKey] !== newErrorValue) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n if (newErrorValue) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.meta.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldErrorMapFromValidator<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >,\n ) => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this.form,\n validationLogic:\n this.form.options.validationLogic || defaultValidationLogic,\n })\n\n // Get the field-specific error messages that are coming from the form's validator\n const asyncFormValidationResults = await formValidationResultPromise\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getAsyncValidatorArray(cause, {\n ...field.options,\n form: field.form,\n validationLogic:\n field.form.options.validationLogic || defaultValidationLogic,\n })\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n AsyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const validatesPromises: Promise<ValidationError | undefined>[] = []\n const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n const validateFieldAsyncFn = (\n field: AnyFieldApi,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds.validations[validateObj.cause]) {\n clearTimeout(this.timeoutIds.validations[validateObj.cause]!)\n }\n\n this.timeoutIds.validations[validateObj.cause] = setTimeout(\n async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n },\n validateObj.debounceMs,\n )\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n\n const fieldLevelError = normalizeError(rawError)\n const formLevelError =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n\n const { newErrorValue, newSource } =\n determineFieldLevelErrorSourceAndValue({\n formLevelError,\n fieldLevelError,\n })\n\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }\n })\n\n resolve(newErrorValue)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n opts?: { skipFormValidation?: boolean },\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n // Attempt to sync validate first\n const { fieldsErrorMap } = opts?.skipFormValidation\n ? { fieldsErrorMap: {} as never }\n : this.form.validateSync(cause)\n const { hasErrored } = this.validateSync(\n cause,\n fieldsErrorMap[this.name] ?? {},\n )\n\n if (hasErrored && !this.options.asyncAlways) {\n this.getInfo().validationMetaMap[\n getErrorMapKey(cause)\n ]?.lastAbortController.abort()\n return this.state.meta.errors\n }\n\n // No error? Attempt async validation\n const formValidationResultPromise = opts?.skipFormValidation\n ? Promise.resolve({})\n : this.form.validateAsync(cause)\n return this.validateAsync(cause, formValidationResultPromise)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater)\n }\n\n /**\n * Handles the blur event.\n */\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n if (!this.state.meta.isBlurred) {\n this.setMeta((prev) => ({ ...prev, isBlurred: true }))\n }\n this.validate('blur')\n\n this.triggerOnBlurListener()\n }\n\n /**\n * Updates the field's errorMap\n */\n setErrorMap(\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>,\n UnwrapFieldValidateOrFn<TName, TOnDynamic, TFormOnDynamic>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnDynamicAsync, TFormOnDynamicAsync>\n >,\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchema = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchemaAsync = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n private triggerOnBlurListener() {\n const formDebounceMs = this.form.options.listeners?.onBlurDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.blur) {\n clearTimeout(this.timeoutIds.formListeners.blur)\n }\n\n this.timeoutIds.formListeners.blur = setTimeout(() => {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }\n\n const fieldDebounceMs = this.options.listeners?.onBlurDebounceMs\n if (fieldDebounceMs && fieldDebounceMs > 0) {\n if (this.timeoutIds.listeners.blur) {\n clearTimeout(this.timeoutIds.listeners.blur)\n }\n\n this.timeoutIds.listeners.blur = setTimeout(() => {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n\n /**\n * @private\n */\n triggerOnChangeListener() {\n const formDebounceMs = this.form.options.listeners?.onChangeDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.change) {\n clearTimeout(this.timeoutIds.formListeners.change)\n }\n\n this.timeoutIds.formListeners.change = setTimeout(() => {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: this,\n })\n }\n\n const fieldDebounceMs = this.options.listeners?.onChangeDebounceMs\n if (fieldDebounceMs && fieldDebounceMs > 0) {\n if (this.timeoutIds.listeners.change) {\n clearTimeout(this.timeoutIds.listeners.change)\n }\n\n this.timeoutIds.listeners.change = setTimeout(() => {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n","import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js'\nimport type { Derived, Store } from '@tanstack/store'\n\nexport * from '@tanstack/store'\n\n/**\n * @private\n */\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\n\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n): TSelected\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Derived<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n): TSelected\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any> | Derived<TState, any>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as any,\n): TSelected {\n const slice = useSyncExternalStoreWithSelector(\n store.subscribe,\n () => store.state,\n () => store.state,\n selector,\n shallow,\n )\n\n return slice\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n if (objA.getTime() !== objB.getTime()) return false\n return true\n }\n\n const keysA = getOwnKeys(objA)\n if (keysA.length !== getOwnKeys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\nfunction getOwnKeys(obj: object): Array<string | symbol> {\n return (Object.keys(obj) as Array<string | symbol>).concat(\n Object.getOwnPropertySymbols(obj),\n )\n}\n","import { useEffect, useLayoutEffect } from 'react'\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect\n","import React, { useMemo, useState } from 'react'\nimport { useStore } from '@tanstack/react-store'\nimport { FieldApi, functionalUpdate } from '@tanstack/form-core'\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'\nimport type {\n DeepKeys,\n DeepValue,\n FieldAsyncValidateOrFn,\n FieldValidateOrFn,\n FieldValidators,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { FunctionComponent, ReactNode } from 'react'\nimport type { UseFieldOptions, UseFieldOptionsBound } from './types'\n\ninterface ReactFieldApi<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n> {\n /**\n * A pre-bound and type-safe sub-field component using this field as a root.\n */\n Field: FieldComponent<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n >\n}\n\n/**\n * A type representing a hook for using a field in a form with the given form data type.\n *\n * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field.\n */\nexport type UseField<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n> = <\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n>(\n opts: UseFieldOptionsBound<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >,\n) => FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n>\n\n/**\n * A hook for managing a field in a form.\n * @param opts An object with field options.\n *\n * @returns The `FieldApi` instance for the specified field.\n */\nexport function useField<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n>(\n opts: UseFieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n >,\n) {\n const [fieldApi] = useState(() => {\n const api = new FieldApi({\n ...opts,\n form: opts.form,\n name: opts.name,\n })\n\n const extendedApi: typeof api &\n ReactFieldApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n > = api as never\n\n extendedApi.Field = Field as never\n\n return extendedApi\n })\n\n useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi])\n\n /**\n * fieldApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n */\n useIsomorphicLayoutEffect(() => {\n fieldApi.update(opts)\n })\n\n useStore(\n fieldApi.store,\n opts.mode === 'array'\n ? (state) => {\n return [\n state.meta,\n Object.keys((state.value as unknown) ?? []).length,\n ]\n }\n : undefined,\n )\n\n return fieldApi\n}\n\n/**\n * @param children A render function that takes a field API instance and returns a React element.\n */\ninterface FieldComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n ExtendedApi = {},\n> extends UseFieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n > {\n children: (\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n > &\n ExtendedApi,\n ) => ReactNode\n}\n\ninterface FieldComponentBoundProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n ExtendedApi = {},\n> extends UseFieldOptionsBound<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > {\n children: (\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n > &\n ExtendedApi,\n ) => ReactNode\n}\n\n/**\n * A type alias representing a field component for a specific form data type.\n */\nexport type FieldComponent<\n in out TParentData,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnDynamicAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TPatentSubmitMeta,\n in out ExtendedApi = {},\n> = <\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n>({\n children,\n ...fieldOptions\n}: FieldComponentBoundProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta,\n ExtendedApi\n>) => ReactNode\n\n/**\n * A type alias representing a field component for a form lens data type.\n */\nexport type LensFieldComponent<\n in out TLensData,\n in out TParentSubmitMeta,\n in out ExtendedApi = {},\n> = <\n const TName extends DeepKeys<TLensData>,\n TData extends DeepValue<TLensData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<unknown, string, TData>,\n TOnChange extends undefined | FieldValidateOrFn<unknown, string, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<unknown, string, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<unknown, string, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<unknown, string, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<unknown, string, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<unknown, string, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<unknown, string, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<unknown, string, TData>,\n>({\n children,\n ...fieldOptions\n}: Omit<\n FieldComponentBoundProps<\n unknown,\n string,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n TParentSubmitMeta,\n ExtendedApi\n >,\n 'name' | 'validators'\n> & {\n name: TName\n validators?: Omit<\n FieldValidators<\n unknown,\n string,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >,\n 'onChangeListenTo' | 'onBlurListenTo'\n > & {\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TLensData>[]\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TLensData>[]\n }\n}) => ReactNode\n\n/**\n * A function component that takes field options and a render function as children and returns a React component.\n *\n * The `Field` component uses the `useField` hook internally to manage the field instance.\n */\nexport const Field = (<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TPatentSubmitMeta,\n>({\n children,\n ...fieldOptions\n}: FieldComponentProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TPatentSubmitMeta\n>): ReactNode => {\n const fieldApi = useField(fieldOptions as any)\n\n const jsxToDisplay = useMemo(\n () => functionalUpdate(children, fieldApi as any),\n /**\n * The reason this exists is to fix an issue with the React Compiler.\n * Namely, functionalUpdate is memoized where it checks for `fieldApi`, which is a static type.\n * This means that when `state.value` changes, it does not trigger a re-render. The useMemo explicitly fixes this problem\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [children, fieldApi, fieldApi.state.value, fieldApi.state.meta],\n )\n return (<>{jsxToDisplay}</>) as never\n}) satisfies FunctionComponent<\n FieldComponentProps<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n>\n","import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { useStore } from '@tanstack/react-store'\nimport { useId, useState } from 'react'\nimport { Field } from './useField'\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'\nimport type {\n AnyFormApi,\n AnyFormState,\n FormAsyncValidateOrFn,\n FormOptions,\n FormState,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { PropsWithChildren, ReactNode } from 'react'\nimport type { FieldComponent } from './useField'\nimport type { NoInfer } from '@tanstack/react-store'\n\n/**\n * Fields that are added onto the `FormAPI` from `@tanstack/form-core` and returned from `useForm`\n */\nexport interface ReactFormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta,\n> {\n /**\n * A React component to render form fields. With this, you can render and manage individual form fields.\n */\n Field: FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n /**\n * A `Subscribe` function that allows you to listen and react to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates.\n */\n Subscribe: <\n TSelected = NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n >(props: {\n selector?: (\n state: NoInfer<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n ) => TSelected\n children: ((state: NoInfer<TSelected>) => ReactNode) | ReactNode\n }) => ReactNode\n}\n\n/**\n * An extended version of the `FormApi` class that includes React-specific functionalities from `ReactFormApi`\n */\nexport type ReactFormExtendedApi<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n> = FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> &\n ReactFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\nfunction LocalSubscribe({\n form,\n selector,\n children,\n}: PropsWithChildren<{\n form: AnyFormApi\n selector: (state: AnyFormState) => AnyFormState\n}>) {\n const data = useStore(form.store, selector)\n\n return functionalUpdate(children, data)\n}\n\n/**\n * A custom React Hook that returns an extended instance of the `FormApi` class.\n *\n * This API encapsulates all the necessary functionalities related to the form. It allows you to manage form state, handle submissions, and interact with form fields\n */\nexport function useForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n>(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n) {\n const formId = useId()\n\n const [formApi] = useState(() => {\n const api = new FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >({ ...opts, formId: formId })\n\n const extendedApi: ReactFormExtendedApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = api as never\n\n extendedApi.Field = function APIField(props) {\n return <Field {...props} form={api} />\n }\n\n extendedApi.Subscribe = function Subscribe(props: any) {\n return (\n <LocalSubscribe\n form={api}\n selector={props.selector}\n children={props.children}\n />\n )\n }\n\n return extendedApi\n })\n\n useIsomorphicLayoutEffect(formApi.mount, [])\n\n /**\n * formApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n */\n useIsomorphicLayoutEffect(() => {\n formApi.update(opts)\n })\n\n return formApi\n}\n","import { useForm } from '@tanstack/react-form';\r\nimport type { AnyFieldApi } from '@tanstack/react-form';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n addMultipleChoice,\r\n addTrueFalse,\r\n addShortAnswer,\r\n addFillInTheBlanks,\r\n addLongAnswer,\r\n updateMultipleChoice,\r\n updateTrueFalse,\r\n updateShortAnswer,\r\n updateFillInTheBlanks,\r\n updateLongAnswer,\r\n MultipleChoice,\r\n setShowMcqForm,\r\n TrueFalse,\r\n ShortAnswer,\r\n LongAnswer,\r\n FillInTheBlanks,\r\n selectCurrentSlide,\r\n} from '@/store/slices/canvasSlice';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { useState } from 'react';\r\n\r\nfunction FieldInfo({ field }: { field: AnyFieldApi }) {\r\n return (\r\n <>\r\n {field.state.meta.isTouched && !field.state.meta.isValid ? (\r\n <em>{field.state.meta.errors.join(', ')}</em>\r\n ) : null}\r\n {field.state.meta.isValidating ? 'Validating...' : null}\r\n </>\r\n );\r\n}\r\n\r\nconst McqForm = ({\r\n editElement,\r\n}: {\r\n editElement?: MultipleChoice | TrueFalse | ShortAnswer | LongAnswer | FillInTheBlanks | null;\r\n}) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n\r\n // Determine if we're editing or creating\r\n const isEditing = !!editElement;\r\n\r\n // Set initial question type - use editElement's type if editing, otherwise use activityType from Redux\r\n const initialQuestionType =\r\n editElement?.data.questionType || currentSlide?.activityType || 'multiple-choice';\r\n const [questionType, setQuestionType] = useState(initialQuestionType);\r\n\r\n // Update questionType when editElement changes\r\n // useEffect(() => {\r\n // if (editElement?.data?.questionType) {\r\n // setQuestionType(editElement.data.questionType);\r\n // }\r\n // }, [editElement?.data?.questionType]);\r\n\r\n const form = useForm({\r\n defaultValues: {\r\n questionType: initialQuestionType,\r\n responseType: editElement?.data.responseType || 'classic',\r\n feedbackMode: editElement?.data.feedbackMode || 'practice',\r\n question: editElement?.data.question || '',\r\n responseOptions: {\r\n options: editElement?.data.responseOptions.options || ['', '', '', ''],\r\n correctIndex:\r\n editElement?.data.questionType === 'multiple-choice'\r\n ? (editElement as MultipleChoice).data.responseOptions.correctIndex || []\r\n : [],\r\n correctAnswer:\r\n editElement?.data.questionType === 'true-false'\r\n ? (editElement as TrueFalse).data.responseOptions.correctAnswer\r\n : false,\r\n correctShortAnswer:\r\n editElement?.data.questionType === 'short-answer' ||\r\n editElement?.data.questionType === 'fill-in-the-blank'\r\n ? (editElement as ShortAnswer | FillInTheBlanks).data.responseOptions\r\n .correctShortAnswer || ''\r\n : '',\r\n correctLongAnswer:\r\n editElement?.data.questionType === 'long-answer'\r\n ? (editElement as LongAnswer).data.responseOptions.correctLongAnswer || ''\r\n : '',\r\n },\r\n },\r\n\r\n onSubmit: async ({ value }) => {\r\n if (value.questionType === 'true-false') {\r\n const trueFalseData: TrueFalse = {\r\n id: isEditing ? editElement.id : uuidv4(),\r\n data: {\r\n questionType: value.questionType,\r\n responseType: value.responseType,\r\n feedbackMode: value.feedbackMode,\r\n question: value.question,\r\n responseOptions: {\r\n options: value.responseOptions.options,\r\n correctAnswer: value.responseOptions.correctAnswer ?? false,\r\n },\r\n },\r\n x: isEditing ? editElement.x : 500,\r\n y: isEditing ? editElement.y : 200,\r\n width: isEditing ? editElement.width : 400,\r\n height: isEditing ? editElement.height : 300,\r\n rotation: isEditing ? editElement.rotation : 0,\r\n };\r\n\r\n if (isEditing) {\r\n dispatch(updateTrueFalse(trueFalseData));\r\n } else {\r\n dispatch(addTrueFalse(trueFalseData));\r\n }\r\n } else if (value.questionType === 'multiple-choice') {\r\n const multipleChoiceData: MultipleChoice = {\r\n id: isEditing ? editElement.id : uuidv4(),\r\n data: {\r\n questionType: value.questionType,\r\n responseType: value.responseType,\r\n feedbackMode: value.feedbackMode,\r\n question: value.question,\r\n responseOptions: {\r\n options: value.responseOptions.options,\r\n correctIndex: value.responseOptions.correctIndex ?? [],\r\n },\r\n },\r\n x: isEditing ? editElement.x : 500,\r\n y: isEditing ? editElement.y : 200,\r\n width: isEditing ? editElement.width : 400,\r\n height: isEditing ? editElement.height : 400,\r\n rotation: isEditing ? editElement.rotation : 0,\r\n };\r\n\r\n if (isEditing) {\r\n dispatch(updateMultipleChoice(multipleChoiceData));\r\n } else {\r\n dispatch(addMultipleChoice(multipleChoiceData));\r\n }\r\n } else if (value.questionType === 'short-answer') {\r\n const shortAnswerData: ShortAnswer = {\r\n id: isEditing ? editElement.id : uuidv4(),\r\n data: {\r\n questionType: value.questionType,\r\n responseType: value.responseType,\r\n feedbackMode: value.feedbackMode,\r\n question: value.question,\r\n responseOptions: {\r\n options: value.responseOptions.options,\r\n correctShortAnswer: value.responseOptions.correctShortAnswer ?? '',\r\n },\r\n },\r\n x: isEditing ? editElement.x : 500,\r\n y: isEditing ? editElement.y : 200,\r\n width: isEditing ? editElement.width : 400,\r\n height: isEditing ? editElement.height : 400,\r\n rotation: isEditing ? editElement.rotation : 0,\r\n };\r\n\r\n if (isEditing) {\r\n dispatch(updateShortAnswer(shortAnswerData));\r\n } else {\r\n dispatch(addShortAnswer(shortAnswerData));\r\n }\r\n } else if (value.questionType === 'fill-in-the-blank') {\r\n const fillInTheBlankData: FillInTheBlanks = {\r\n id: isEditing ? editElement.id : uuidv4(),\r\n data: {\r\n questionType: value.questionType,\r\n responseType: value.responseType,\r\n feedbackMode: value.feedbackMode,\r\n question: value.question,\r\n responseOptions: {\r\n options: value.responseOptions.options,\r\n correctShortAnswer: value.responseOptions.correctShortAnswer ?? '',\r\n },\r\n },\r\n x: isEditing ? editElement.x : 500,\r\n y: isEditing ? editElement.y : 200,\r\n width: isEditing ? editElement.width : 400,\r\n height: isEditing ? editElement.height : 400,\r\n rotation: isEditing ? editElement.rotation : 0,\r\n };\r\n\r\n if (isEditing) {\r\n dispatch(updateFillInTheBlanks(fillInTheBlankData));\r\n } else {\r\n dispatch(addFillInTheBlanks(fillInTheBlankData));\r\n }\r\n } else if (value.questionType === 'long-answer') {\r\n const longAnswerData: LongAnswer = {\r\n id: isEditing ? editElement.id : uuidv4(),\r\n data: {\r\n questionType: value.questionType,\r\n responseType: value.responseType,\r\n feedbackMode: value.feedbackMode,\r\n question: value.question,\r\n responseOptions: {\r\n options: value.responseOptions.options,\r\n correctLongAnswer: value.responseOptions.correctLongAnswer ?? '',\r\n },\r\n },\r\n x: isEditing ? editElement.x : 500,\r\n y: isEditing ? editElement.y : 200,\r\n width: isEditing ? editElement.width : 400,\r\n height: isEditing ? editElement.height : 400,\r\n rotation: isEditing ? editElement.rotation : 0,\r\n };\r\n\r\n if (isEditing) {\r\n dispatch(updateLongAnswer(longAnswerData));\r\n } else {\r\n dispatch(addLongAnswer(longAnswerData));\r\n }\r\n }\r\n\r\n dispatch(setShowMcqForm(false));\r\n },\r\n });\r\n\r\n const handleShowMcqForm = () => {\r\n dispatch(setShowMcqForm(false));\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-106 flex w-full flex-col items-center justify-center gap-6 rounded-lg bg-black/50 p-6 shadow-lg\">\r\n <div className=\"h-fit max-h-[calc(100vh-300px)] w-full max-w-2xl overflow-y-auto rounded-lg bg-white p-6\">\r\n <form\r\n className=\"relative h-full max-h-[calc(100vh-300px)] w-full max-w-2xl rounded-lg bg-white p-6\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n form.handleSubmit();\r\n }}\r\n >\r\n <div className=\"flex items-center justify-between pb-4\">\r\n <button\r\n type=\"button\"\r\n className=\"absolute top-2 right-2 flex h-8 w-8 items-center justify-center rounded bg-red-500 hover:cursor-pointer hover:bg-red-600\"\r\n onClick={() => {\r\n handleShowMcqForm();\r\n }}\r\n >\r\n <span className=\"text-xl\">✕</span>\r\n </button>\r\n <h2 className=\"text-xl font-bold text-gray-900\">\r\n {isEditing ? 'Edit Question' : 'Add Question'}\r\n </h2>\r\n <div className=\"w-8\" />\r\n </div>\r\n\r\n <form.Field name=\"questionType\">\r\n {(field) => (\r\n <div className=\"flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Question Type\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n id={field.name}\r\n name={field.name}\r\n value={field.state.value}\r\n onBlur={field.handleBlur}\r\n onChange={(e) => {\r\n field.handleChange(e.target.value);\r\n setQuestionType(e.target.value);\r\n }}\r\n disabled={isEditing}\r\n className={`w-full appearance-none rounded-lg border border-gray-300 px-4 py-3 pr-10 text-gray-900 outline-none focus:border-[#096B76] focus:ring-2 focus:ring-[#096B76]/20 focus:outline-none ${\r\n isEditing ? 'cursor-not-allowed bg-gray-100 opacity-60' : 'bg-white'\r\n }`}\r\n >\r\n <option value=\"multiple-choice\">☰ Multiple Choice</option>\r\n <option value=\"true-false\">True/False</option>\r\n <option value=\"short-answer\">Short Answer</option>\r\n <option value=\"fill-in-the-blank\">Fill in the blank</option>\r\n <option value=\"long-answer\">Long Answer</option>\r\n </select>\r\n <div className=\"pointer-events-none absolute top-1/2 right-3 -translate-y-1/2\">\r\n <svg\r\n className=\"h-5 w-5 text-gray-400\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M19 9l-7 7-7-7\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n {isEditing && (\r\n <p className=\"text-xs text-gray-500 italic\">\r\n Question type cannot be changed when editing\r\n </p>\r\n )}\r\n <FieldInfo field={field} />\r\n </div>\r\n )}\r\n </form.Field>\r\n\r\n {/* Response Type */}\r\n {questionType &&\r\n !['short-answer', 'fill-in-the-blank', 'long-answer'].includes(questionType) && (\r\n <form.Field name=\"responseType\">\r\n {(field) => (\r\n <div className=\"flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Response Type\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n id={field.name}\r\n name={field.name}\r\n value={field.state.value}\r\n onBlur={field.handleBlur}\r\n onChange={(e) => field.handleChange(e.target.value)}\r\n className=\"w-full appearance-none rounded-lg border border-gray-300 bg-white px-4 py-3 pr-10 text-gray-900 outline-none focus:border-[#096B76] focus:ring-2 focus:ring-[#096B76]/20 focus:outline-none\"\r\n >\r\n <option value=\"classic\">Classic</option>\r\n <option value=\"drag-and-drop\">Drag and Drop</option>\r\n </select>\r\n <div className=\"pointer-events-none absolute top-1/2 right-3 -translate-y-1/2\">\r\n <svg\r\n className=\"h-5 w-5 text-gray-400\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M19 9l-7 7-7-7\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <FieldInfo field={field} />\r\n </div>\r\n )}\r\n </form.Field>\r\n )}\r\n\r\n {/* Feedback Mode */}\r\n <form.Field name=\"feedbackMode\">\r\n {(field) => (\r\n <div className=\"flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Feedback Mode\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n id={field.name}\r\n name={field.name}\r\n value={field.state.value}\r\n onBlur={field.handleBlur}\r\n onChange={(e) => field.handleChange(e.target.value)}\r\n disabled={questionType === 'long-answer'}\r\n className={`w-full appearance-none rounded-lg border border-gray-300 px-4 py-3 pr-10 text-gray-900 outline-none focus:border-[#096B76] focus:ring-2 focus:ring-[#096B76]/20 focus:outline-none ${\r\n questionType === 'long-answer'\r\n ? 'cursor-not-allowed bg-gray-100 opacity-60'\r\n : 'bg-white'\r\n }`}\r\n >\r\n <option value=\"practice\">Practice Mode</option>\r\n <option value=\"test\">Assessment Mode</option>\r\n </select>\r\n <div className=\"pointer-events-none absolute top-1/2 right-3 -translate-y-1/2\">\r\n <svg\r\n className=\"h-5 w-5 text-gray-400\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M19 9l-7 7-7-7\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n {questionType === 'long-answer' && (\r\n <p className=\"text-xs text-gray-500 italic\">\r\n Long answer questions are only available in Assessment Mode\r\n </p>\r\n )}\r\n <FieldInfo field={field} />\r\n </div>\r\n )}\r\n </form.Field>\r\n\r\n <form.Field\r\n name=\"question\"\r\n validators={{\r\n onChange: ({ value }) => (!value ? 'A question is required' : undefined),\r\n }}\r\n >\r\n {(field) => (\r\n <div className=\"mb-6 flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Question\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n className=\"w-full resize-none rounded-lg border border-gray-300 bg-white px-4 py-3 text-gray-900 outline-none focus:border-[#096B76] focus:ring-2 focus:ring-[#096B76]/20 focus:outline-none\"\r\n value={field.state.value}\r\n onChange={(e) => field.handleChange(e.target.value)}\r\n onBlur={field.handleBlur}\r\n />\r\n </div>\r\n {field.state.meta.errors.length > 0 && (\r\n <span className=\"text-sm font-semibold text-red-500\">\r\n {field.state.meta.errors.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </form.Field>\r\n\r\n {/* Find Questions Button */}\r\n <button\r\n type=\"button\"\r\n className=\"flex w-full items-center justify-center gap-2 rounded-lg border-2 border-gray-300 bg-white px-4 py-3 font-medium text-gray-900 transition-colors hover:border-gray-400 hover:bg-gray-50\"\r\n >\r\n <span>🔍</span>\r\n <span>Find Questions</span>\r\n </button>\r\n\r\n {questionType === 'true-false' && (\r\n // True/False Answer Selection\r\n <form.Field name=\"responseOptions.correctAnswer\">\r\n {(field) => (\r\n <div className=\"mb-6 flex flex-col gap-2\">\r\n <label className=\"text-sm font-semibold text-gray-900\">Correct Answer</label>\r\n <div className=\"flex gap-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => field.handleChange(true)}\r\n className={`flex flex-1 items-center justify-center gap-3 rounded-lg border-2 px-6 py-4 transition-colors ${\r\n field.state.value === true\r\n ? 'border-green-500 bg-green-50'\r\n : 'border-gray-300 bg-white hover:border-gray-400'\r\n }`}\r\n >\r\n <div\r\n className={`flex h-6 w-6 items-center justify-center rounded-full border-2 ${\r\n field.state.value === true\r\n ? 'border-green-500 bg-green-500'\r\n : 'border-gray-300'\r\n }`}\r\n >\r\n {field.state.value === true && (\r\n <div className=\"h-3 w-3 rounded-full bg-white\"></div>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold text-black\">True</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => field.handleChange(false)}\r\n className={`flex flex-1 items-center justify-center gap-3 rounded-lg border-2 px-6 py-4 transition-colors ${\r\n field.state.value === false\r\n ? 'border-green-500 bg-green-50'\r\n : 'border-gray-300 bg-white hover:border-gray-400'\r\n }`}\r\n >\r\n <div\r\n className={`flex h-6 w-6 items-center justify-center rounded-full border-2 ${\r\n field.state.value === false\r\n ? 'border-green-500 bg-green-500'\r\n : 'border-gray-300'\r\n }`}\r\n >\r\n {field.state.value === false && (\r\n <div className=\"h-3 w-3 rounded-full bg-white\"></div>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold text-black\">False</span>\r\n </button>\r\n </div>\r\n <p className=\"text-sm font-semibold text-gray-500\">\r\n Select the correct answer for this true/false question\r\n </p>\r\n </div>\r\n )}\r\n </form.Field>\r\n )}\r\n {questionType === 'multiple-choice' && (\r\n // Multiple Choice Options\r\n <form.Field\r\n name=\"responseOptions\"\r\n validators={{\r\n onChange: ({ value }) => {\r\n // Check if all options have text\r\n const emptyOptions = value.options.filter((opt: string) => !opt.trim());\r\n if (emptyOptions.length > 0) {\r\n return 'All options must have text';\r\n }\r\n // Check if at least one correct answer is selected\r\n if (!value.correctIndex || value.correctIndex.length === 0) {\r\n return 'Please select at least one correct answer';\r\n }\r\n return undefined;\r\n },\r\n }}\r\n >\r\n {(field) => {\r\n const handleOptionChange = (index: number, value: string) => {\r\n const newOptions = [...field.state.value.options];\r\n newOptions[index] = value;\r\n field.handleChange({\r\n ...field.state.value,\r\n options: newOptions,\r\n });\r\n };\r\n\r\n const handleAddOption = () => {\r\n if (field.state.value.options.length >= 6) {\r\n alert('Maximum 6 options allowed');\r\n return;\r\n }\r\n field.handleChange({\r\n ...field.state.value,\r\n options: [...field.state.value.options, ''],\r\n });\r\n };\r\n\r\n const handleRemoveOption = (index: number) => {\r\n if (field.state.value.options.length <= 2) {\r\n alert('Minimum 2 options required');\r\n return;\r\n }\r\n const newOptions = field.state.value.options.filter((_, i) => i !== index);\r\n const newCorrectIndex = field.state.value.correctIndex\r\n ?.filter((i) => i !== index)\r\n .map((i) => (i > index ? i - 1 : i));\r\n\r\n field.handleChange({\r\n ...field.state.value,\r\n options: newOptions,\r\n correctIndex: newCorrectIndex,\r\n });\r\n };\r\n\r\n const handleToggleCorrectAnswer = (index: number) => {\r\n const currentCorrectIndex = field.state.value.correctIndex || [];\r\n const isAlreadyCorrect = currentCorrectIndex.includes(index);\r\n\r\n if (isAlreadyCorrect) {\r\n field.handleChange({\r\n ...field.state.value,\r\n correctIndex: currentCorrectIndex.filter((i) => i !== index),\r\n });\r\n } else {\r\n if (currentCorrectIndex.length >= 6) {\r\n alert('Maximum 6 correct answers allowed');\r\n return;\r\n }\r\n field.handleChange({\r\n ...field.state.value,\r\n correctIndex: [...currentCorrectIndex, index],\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"mb-6 flex flex-col gap-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Response Options ({field.state.value.options.length}/6)\r\n </label>\r\n <button\r\n type=\"button\"\r\n onClick={handleAddOption}\r\n disabled={field.state.value.options.length >= 6}\r\n className=\"rounded-lg bg-[#096B76] px-3 py-1 text-sm font-semibold text-white transition-colors hover:bg-[#075862] disabled:cursor-not-allowed disabled:opacity-50\"\r\n >\r\n + Add Option\r\n </button>\r\n </div>\r\n <div className=\"flex flex-col gap-3\">\r\n {field.state.value.options.map((option, index) => {\r\n const isEmpty = !option.trim();\r\n const isCorrect = field.state.value.correctIndex?.includes(index);\r\n const hasError = field.state.meta.isTouched && isEmpty;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={`flex items-center gap-3 rounded-lg border-2 px-4 py-3 transition-colors ${\r\n hasError\r\n ? 'border-red-500 bg-red-50'\r\n : isCorrect\r\n ? 'border-green-500 bg-green-50'\r\n : 'border-gray-300 bg-white'\r\n }`}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => handleToggleCorrectAnswer(index)}\r\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors ${\r\n isCorrect\r\n ? 'border-green-500 bg-green-500'\r\n : 'border-gray-300 hover:border-green-500'\r\n }`}\r\n >\r\n {isCorrect && (\r\n <svg\r\n className=\"h-3 w-3 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={3}\r\n d=\"M5 13l4 4L19 7\"\r\n />\r\n </svg>\r\n )}\r\n </button>\r\n <input\r\n type=\"text\"\r\n placeholder={`Option ${index + 1}`}\r\n value={option}\r\n onChange={(e) => handleOptionChange(index, e.target.value)}\r\n onBlur={field.handleBlur}\r\n className=\"flex-1 border-none bg-transparent text-gray-900 placeholder:text-gray-400 focus:outline-none\"\r\n />\r\n {field.state.value.options.length > 2 && (\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRemoveOption(index)}\r\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded bg-red-500 text-white transition-colors hover:bg-red-600\"\r\n >\r\n <span className=\"text-sm\">✕</span>\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n <p className=\"text-sm font-semibold text-gray-500\">\r\n Click the box to mark the correct answer\r\n </p>\r\n {field.state.meta.errors.length > 0 && (\r\n <span className=\"text-sm font-semibold text-red-500\">\r\n {field.state.meta.errors.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }}\r\n </form.Field>\r\n )}\r\n {(questionType === 'short-answer' || questionType === 'fill-in-the-blank') && (\r\n <form.Field name=\"responseOptions.correctShortAnswer\">\r\n {(field) => (\r\n <div className=\"mb-6 flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Correct Short Answer\r\n </label>\r\n\r\n <input\r\n type=\"text\"\r\n placeholder=\"Type the expected correct answer...\"\r\n value={field.state.value}\r\n onChange={(e) => {\r\n field.handleChange(e.target.value);\r\n }}\r\n className=\"w-full rounded-lg border-2 border-gray-300 bg-white p-3 text-gray-900 transition-colors focus:border-[#096B76] focus:outline-none\"\r\n />\r\n\r\n <p className=\"text-sm font-semibold text-gray-500\">\r\n Learners must write this answer exactly (case-insensitive).\r\n </p>\r\n\r\n {field.state.meta.errors.length > 0 && (\r\n <span className=\"text-sm font-semibold text-red-500\">\r\n {field.state.meta.errors.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </form.Field>\r\n )}\r\n\r\n {questionType === 'long-answer' && (\r\n <form.Field name=\"responseOptions.correctLongAnswer\">\r\n {(field) => (\r\n <div className=\"mb-6 flex flex-col gap-2\">\r\n <label htmlFor={field.name} className=\"text-sm font-semibold text-gray-900\">\r\n Expected Long Answer (Optional)\r\n </label>\r\n\r\n <textarea\r\n placeholder=\"Type the expected answer or key points...\"\r\n value={field.state.value}\r\n onChange={(e) => {\r\n field.handleChange(e.target.value);\r\n }}\r\n rows={6}\r\n className=\"w-full rounded-lg border-2 border-gray-300 bg-white p-3 text-gray-900 transition-colors focus:border-[#096B76] focus:outline-none\"\r\n />\r\n\r\n <p className=\"text-sm font-semibold text-gray-500\">\r\n This will be used as a reference answer for manual grading.\r\n </p>\r\n\r\n {field.state.meta.errors.length > 0 && (\r\n <span className=\"text-sm font-semibold text-red-500\">\r\n {field.state.meta.errors.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </form.Field>\r\n )}\r\n\r\n {/* Save Button */}\r\n <form.Subscribe selector={(state) => [state.canSubmit, state.isSubmitting]}>\r\n {([canSubmit, isSubmitting]) => (\r\n <button\r\n type=\"submit\"\r\n disabled={!canSubmit}\r\n className=\"mt-2 mb-4 w-full rounded-lg bg-[#096B76] px-6 py-3 font-semibold text-white transition-colors hover:bg-[#075862] disabled:cursor-not-allowed disabled:opacity-50\"\r\n >\r\n {isSubmitting ? 'Saving...' : isEditing ? 'Update Question' : 'Save Question'}\r\n </button>\r\n )}\r\n </form.Subscribe>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default McqForm;\r\n","'use client';\r\n\r\nimport { useDispatch } from '@/store/hooks';\r\nimport { updateText, saveToHistory } from '@/store/slices/canvasSlice';\r\nimport { TextElement } from '@/store/slices/canvasSlice';\r\nimport { TextB, TextItalic, TextUnderline } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype FloatingTextToolbarProps = {\r\n text: TextElement;\r\n position: { x: number; y: number };\r\n};\r\n\r\nexport const FloatingTextToolbar = ({ text, position }: FloatingTextToolbarProps) => {\r\n const dispatch = useDispatch();\r\n\r\n const handleFontSizeChange = (delta: number) => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id: text.id,\r\n fontSize: Math.max(12, Math.min(72, text.fontSize + delta)),\r\n })\r\n );\r\n };\r\n\r\n const handleColorChange = (color: string) => {\r\n dispatch(saveToHistory());\r\n dispatch(updateText({ id: text.id, fill: color }));\r\n };\r\n\r\n const handleFontWeightToggle = () => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id: text.id,\r\n fontWeight: text.fontWeight === 'bold' ? 'normal' : 'bold',\r\n })\r\n );\r\n };\r\n\r\n const handleFontStyleToggle = () => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id: text.id,\r\n fontStyle: text.fontStyle === 'italic' ? 'normal' : 'italic',\r\n })\r\n );\r\n };\r\n\r\n const handleTextDecorationToggle = () => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateText({\r\n id: text.id,\r\n textDecoration: text.textDecoration === 'underline' ? '' : 'underline',\r\n })\r\n );\r\n };\r\n\r\n const handleFontFamilyChange = (fontFamily: string) => {\r\n dispatch(saveToHistory());\r\n dispatch(updateText({ id: text.id, fontFamily }));\r\n };\r\n\r\n return (\r\n <div\r\n className=\"fixed z-1001 flex items-center gap-1 rounded-lg border border-gray-200 bg-white p-2 shadow-2xl\"\r\n style={{\r\n left: `${position.x}px`,\r\n top: `${position.y - 60}px`,\r\n transform: 'translateX(-50%)',\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Font Family Dropdown */}\r\n <select\r\n value={text.fontFamily}\r\n onChange={(e) => handleFontFamilyChange(e.target.value)}\r\n className=\"rounded border border-gray-300 bg-white px-2 py-1 text-xs hover:bg-gray-50\"\r\n >\r\n <option value=\"Arial\">Arial</option>\r\n <option value=\"Helvetica\">Helvetica</option>\r\n <option value=\"Times New Roman\">Times</option>\r\n <option value=\"Courier New\">Courier</option>\r\n <option value=\"Georgia\">Georgia</option>\r\n <option value=\"Verdana\">Verdana</option>\r\n <option value=\"Comic Sans MS\">Comic Sans</option>\r\n </select>\r\n\r\n {/* Font Size Controls */}\r\n <div className=\"ml-1 flex items-center gap-0.5 border-l border-gray-200 pl-1\">\r\n <button\r\n onClick={() => handleFontSizeChange(-2)}\r\n className=\"flex h-7 w-7 items-center justify-center rounded text-sm font-bold hover:bg-gray-100\"\r\n title=\"Decrease font size\"\r\n >\r\n −\r\n </button>\r\n <span className=\"w-8 text-center text-xs font-medium\">{Math.round(text.fontSize)}</span>\r\n <button\r\n onClick={() => handleFontSizeChange(2)}\r\n className=\"flex h-7 w-7 items-center justify-center rounded text-sm font-bold hover:bg-gray-100\"\r\n title=\"Increase font size\"\r\n >\r\n +\r\n </button>\r\n </div>\r\n\r\n {/* Formatting Buttons */}\r\n <div className=\"ml-1 flex items-center gap-0.5 border-l border-gray-200 pl-1\">\r\n <button\r\n onClick={handleFontWeightToggle}\r\n className={`flex h-7 w-7 items-center justify-center rounded transition-colors ${\r\n text.fontWeight === 'bold'\r\n ? 'bg-blue-100 text-blue-600'\r\n : 'text-gray-700 hover:bg-gray-100'\r\n }`}\r\n title=\"Bold\"\r\n >\r\n <TextB size={16} weight=\"bold\" />\r\n </button>\r\n <button\r\n onClick={handleFontStyleToggle}\r\n className={`flex h-7 w-7 items-center justify-center rounded transition-colors ${\r\n text.fontStyle === 'italic'\r\n ? 'bg-blue-100 text-blue-600'\r\n : 'text-gray-700 hover:bg-gray-100'\r\n }`}\r\n title=\"Italic\"\r\n >\r\n <TextItalic size={16} weight=\"bold\" />\r\n </button>\r\n <button\r\n onClick={handleTextDecorationToggle}\r\n className={`flex h-7 w-7 items-center justify-center rounded transition-colors ${\r\n text.textDecoration === 'underline'\r\n ? 'bg-blue-100 text-blue-600'\r\n : 'text-gray-700 hover:bg-gray-100'\r\n }`}\r\n title=\"Underline\"\r\n >\r\n <TextUnderline size={16} weight=\"bold\" />\r\n </button>\r\n </div>\r\n\r\n {/* Color Picker */}\r\n <div className=\"ml-1 border-l border-gray-200 pl-1\">\r\n <div className=\"relative\">\r\n <input\r\n type=\"color\"\r\n value={text.fill}\r\n onChange={(e) => handleColorChange(e.target.value)}\r\n className=\"h-7 w-7 cursor-pointer rounded border border-gray-300\"\r\n title=\"Text color\"\r\n style={{\r\n padding: '2px',\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport { useEffect, useRef, useCallback, useMemo } from 'react';\r\nimport { TextElement } from '@/store/slices/canvasSlice';\r\n\r\ntype TextEditingAreaProps = {\r\n text: TextElement;\r\n editingValue: string;\r\n onEditingChange: (value: string) => void;\r\n onFinish: () => void;\r\n position: { top: number; left: number };\r\n scale: number;\r\n textareaRef: React.MutableRefObject<HTMLTextAreaElement | null>;\r\n};\r\n\r\nexport const TextEditingArea = ({\r\n text,\r\n editingValue,\r\n onEditingChange,\r\n onFinish,\r\n position,\r\n scale,\r\n textareaRef,\r\n}: TextEditingAreaProps) => {\r\n const localRef = useRef<HTMLTextAreaElement>(null);\r\n\r\n // Memoize textarea styles to ensure they update when text properties change\r\n const textareaStyles = useMemo(() => {\r\n return {\r\n fontSize: `${text.fontSize * scale}px`,\r\n fontFamily: text.fontFamily,\r\n fontStyle: text.fontStyle,\r\n fontWeight: text.fontWeight === 'bold' ? 'bold' : 'normal',\r\n textDecoration: text.textDecoration,\r\n color: text.fill,\r\n border: '2px solid #4A90E2',\r\n outline: 'none',\r\n padding: '5px',\r\n background: 'white',\r\n resize: 'none' as const,\r\n overflow: 'hidden' as const,\r\n width: 'auto',\r\n minWidth: '200px',\r\n minHeight: '50px',\r\n lineHeight: '1.2',\r\n transform: `rotate(${text.rotation}deg)`,\r\n transformOrigin: 'top left' as const,\r\n whiteSpace: 'pre' as const,\r\n overflowWrap: 'normal' as const,\r\n boxSizing: 'border-box' as const,\r\n };\r\n }, [\r\n text.fontSize,\r\n text.fontFamily,\r\n text.fontStyle,\r\n text.fontWeight,\r\n text.textDecoration,\r\n text.fill,\r\n text.rotation,\r\n scale,\r\n ]);\r\n\r\n // Auto-resize function for both width and height\r\n const autoResize = useCallback((textarea: HTMLTextAreaElement) => {\r\n // Reset height to auto to get accurate scrollHeight\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${textarea.scrollHeight}px`;\r\n\r\n // Auto-expand width based on content\r\n // Create a temporary span to measure text width\r\n const tempSpan = document.createElement('span');\r\n tempSpan.style.font = window.getComputedStyle(textarea).font;\r\n tempSpan.style.fontSize = textarea.style.fontSize;\r\n tempSpan.style.fontFamily = textarea.style.fontFamily;\r\n tempSpan.style.fontWeight = textarea.style.fontWeight;\r\n tempSpan.style.fontStyle = textarea.style.fontStyle;\r\n tempSpan.style.visibility = 'hidden';\r\n tempSpan.style.position = 'absolute';\r\n tempSpan.style.whiteSpace = 'pre';\r\n\r\n // Get the widest line by measuring each line's actual width in pixels\r\n const lines = textarea.value.split('\\n');\r\n let maxWidth = 0;\r\n\r\n document.body.appendChild(tempSpan);\r\n\r\n for (const line of lines) {\r\n tempSpan.textContent = line || ' '; // Use space for empty lines\r\n const lineWidth = tempSpan.offsetWidth;\r\n if (lineWidth > maxWidth) {\r\n maxWidth = lineWidth;\r\n }\r\n }\r\n\r\n document.body.removeChild(tempSpan);\r\n\r\n // Set width with padding consideration\r\n const padding = 10; // 5px on each side\r\n textarea.style.width = `${Math.max(200, maxWidth + padding + 20)}px`;\r\n }, []);\r\n\r\n // Force update textarea styles when text properties change\r\n useEffect(() => {\r\n const textarea = localRef.current;\r\n if (textarea) {\r\n // Directly set styles on the DOM element to ensure they apply\r\n textarea.style.fontSize = `${text.fontSize * scale}px`;\r\n textarea.style.fontFamily = text.fontFamily;\r\n textarea.style.fontStyle = text.fontStyle;\r\n textarea.style.fontWeight = text.fontWeight === 'bold' ? 'bold' : 'normal';\r\n textarea.style.textDecoration = text.textDecoration;\r\n textarea.style.color = text.fill;\r\n autoResize(textarea);\r\n }\r\n }, [\r\n editingValue,\r\n text.fontSize,\r\n text.fontFamily,\r\n text.fontStyle,\r\n text.fontWeight,\r\n text.textDecoration,\r\n text.fill,\r\n scale,\r\n autoResize,\r\n ]);\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: `${position.top}px`,\r\n left: `${position.left}px`,\r\n zIndex: 1000,\r\n }}\r\n >\r\n <textarea\r\n key={`${text.fontWeight}-${text.fontStyle}-${text.textDecoration}-${text.fontSize}-${text.fontFamily}`}\r\n ref={(el) => {\r\n localRef.current = el;\r\n textareaRef.current = el;\r\n if (el) {\r\n // Initial setup\r\n el.focus();\r\n // Set cursor to end of text\r\n const length = el.value.length;\r\n el.setSelectionRange(length, length);\r\n autoResize(el);\r\n }\r\n }}\r\n value={editingValue}\r\n onChange={(e) => {\r\n onEditingChange(e.target.value);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Escape') {\r\n onFinish();\r\n }\r\n }}\r\n style={textareaStyles}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\nimport { Group, Rect, Text } from 'react-konva';\r\nimport { Html } from 'react-konva-utils';\r\nimport Konva from 'konva';\r\nimport { useRef, useEffect, useState, memo } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype ShortAnswerProps = {\r\n shortAnswer: {\r\n id: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n data: {\r\n question: string;\r\n feedbackMode: string;\r\n responseOptions: {\r\n correctShortAnswer: string;\r\n };\r\n };\r\n };\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: KonvaEventObject<Event>) => void;\r\n saRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (e: React.MouseEvent, id: string, type: 'mcq' | 'shortAnswer') => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>) => void;\r\n};\r\n\r\nconst ShortAnswer = memo(\r\n ({\r\n shortAnswer,\r\n handleSelect,\r\n handleTransform,\r\n saRefs,\r\n onContextMenu,\r\n handleDragEnd,\r\n }: ShortAnswerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const groupRef = useRef<Konva.Group>(null);\r\n const [userInput, setUserInput] = useState('');\r\n const [submitted, setSubmitted] = useState(false);\r\n const [pressedButton, setPressedButton] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const node = groupRef.current;\r\n if (node) {\r\n saRefs.current.set(shortAnswer.id, node);\r\n return () => {\r\n saRefs.current.delete(shortAnswer.id);\r\n };\r\n }\r\n }, [shortAnswer.id, saRefs]);\r\n\r\n const correctAnswer =\r\n shortAnswer.data.responseOptions.correctShortAnswer?.trim().toLowerCase() || '';\r\n\r\n const isCorrect = submitted && userInput.trim().toLowerCase() === correctAnswer;\r\n\r\n const handleReset = () => {\r\n setSubmitted(false);\r\n setUserInput('');\r\n };\r\n\r\n const getFeedbackMessage = () => {\r\n if (isCorrect) {\r\n return '✓ Correct! 🎉';\r\n }\r\n return '✗ Try again!';\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n const padding = 24;\r\n const questionTitleHeight = 60;\r\n const feedbackHeight = submitted ? 50 : 0;\r\n const inputHeight = 50;\r\n const inputMargin = 12;\r\n const buttonHeight = shortAnswer.data.feedbackMode === 'practice' ? 48 : 0;\r\n const buttonTopMargin = 12;\r\n const placeholderHeight = 30;\r\n\r\n const totalHeight =\r\n questionTitleHeight +\r\n feedbackHeight +\r\n placeholderHeight +\r\n inputHeight +\r\n inputMargin +\r\n buttonTopMargin +\r\n buttonHeight +\r\n padding;\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={shortAnswer.x}\r\n y={shortAnswer.y}\r\n rotation={shortAnswer.rotation}\r\n width={shortAnswer.width}\r\n height={shortAnswer.height}\r\n name=\"sa-element\"\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: handleDragEnd,\r\n onClick: () => handleSelect(shortAnswer.id),\r\n onTap: () => handleSelect(shortAnswer.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n const mousePos = groupRef.current?.getStage()?.getPointerPosition();\r\n if (!mousePos) return;\r\n const rect = {\r\n x: shortAnswer.x,\r\n y: shortAnswer.y,\r\n width: shortAnswer.width,\r\n height: shortAnswer.height,\r\n };\r\n if (\r\n mousePos.x >= rect.x &&\r\n mousePos.x <= rect.x + rect.width &&\r\n mousePos.y >= rect.y &&\r\n mousePos.y <= rect.y + rect.height\r\n ) {\r\n onContextMenu(\r\n e.evt as unknown as React.MouseEvent,\r\n shortAnswer.id,\r\n 'shortAnswer'\r\n );\r\n }\r\n },\r\n }\r\n : {})}\r\n >\r\n <Rect\r\n fill=\"white\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n width={shortAnswer.width}\r\n height={totalHeight}\r\n onTransformEnd={(e) => handleTransform(shortAnswer.id, e)}\r\n />\r\n\r\n {/* Question Title */}\r\n <Text\r\n text={shortAnswer.data.question}\r\n x={padding}\r\n y={padding}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n width={shortAnswer.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Feedback Message */}\r\n {submitted && (\r\n <>\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={shortAnswer.width - padding * 2}\r\n height={feedbackHeight}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={shortAnswer.width - padding * 2}\r\n height={feedbackHeight}\r\n text={getFeedbackMessage()}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </>\r\n )}\r\n\r\n {/* Placeholder text for input */}\r\n <Text\r\n text=\"Answer:\"\r\n x={padding}\r\n y={questionTitleHeight + feedbackHeight + inputMargin}\r\n fontSize={14}\r\n fill=\"#6b7280\"\r\n width={shortAnswer.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Input Box (Visual Representation for Preview) */}\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight + feedbackHeight + placeholderHeight}\r\n width={shortAnswer.width - padding * 2}\r\n height={inputHeight}\r\n fill=\"#ffffff\"\r\n stroke={isCorrect ? '#22c55e' : submitted ? '#ef4444' : '#d1d5db'}\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n />\r\n\r\n {/* Interactive HTML Input (for actual typing) */}\r\n <Html\r\n divProps={{\r\n style: {\r\n position: 'absolute',\r\n top: `${questionTitleHeight + feedbackHeight + placeholderHeight}px`,\r\n left: `${padding}px`,\r\n width: `${shortAnswer.width - padding * 2}px`,\r\n height: `${inputHeight}px`,\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n },\r\n }}\r\n >\r\n <input\r\n type=\"text\"\r\n value={userInput}\r\n onChange={(e) => setUserInput(e.target.value)}\r\n disabled={submitted}\r\n placeholder=\"Type your answer...\"\r\n className=\"h-full w-full border-0 bg-white px-3 text-gray-900 focus:outline-none\"\r\n style={{\r\n fontSize: '16px',\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n }}\r\n />\r\n </Html>\r\n\r\n {/* Action Buttons */}\r\n {shortAnswer.data.feedbackMode === 'practice' && (\r\n <Group\r\n y={\r\n questionTitleHeight +\r\n feedbackHeight +\r\n placeholderHeight +\r\n inputHeight +\r\n inputMargin +\r\n buttonTopMargin\r\n }\r\n >\r\n {/* Check Button */}\r\n {!submitted && (\r\n <Group\r\n onMouseDown={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onMouseUp={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n if (userInput.length > 0) {\r\n setSubmitted(true);\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n }}\r\n onTouchStart={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onTouchEnd={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n if (userInput.length > 0) {\r\n setSubmitted(true);\r\n }\r\n }}\r\n scaleX={pressedButton === 'check' ? 0.95 : 1}\r\n scaleY={pressedButton === 'check' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={shortAnswer.width - padding * 2}\r\n height={48}\r\n fill={userInput.length === 0 ? '#9ca3af' : '#096B76'}\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={shortAnswer.width - padding * 2}\r\n height={48}\r\n text=\"Check\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n\r\n {/* Reset Button */}\r\n {submitted && (\r\n <Group\r\n onMouseDown={() => setPressedButton('reset')}\r\n onMouseUp={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n onMouseLeave={() => setPressedButton(null)}\r\n onTouchStart={() => setPressedButton('reset')}\r\n onTouchEnd={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n scaleX={pressedButton === 'reset' ? 0.95 : 1}\r\n scaleY={pressedButton === 'reset' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={shortAnswer.width - padding * 2}\r\n height={48}\r\n fill=\"#ef4444\"\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={shortAnswer.width - padding * 2}\r\n height={48}\r\n text=\"Reset\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n )}\r\n </Group>\r\n );\r\n }\r\n);\r\n\r\nShortAnswer.displayName = 'ShortAnswer';\r\nexport default ShortAnswer;\r\n","import ShortAnswer from '../elements/ShortAnswer';\r\nimport { ShortAnswer as ShortAnswerType } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\n\r\ntype ShortAnswerLayerProps = {\r\n shortAnswers: ShortAnswerType[];\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: KonvaEventObject<Event>) => void;\r\n saRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (e: React.MouseEvent, id: string, type: 'mcq' | 'shortAnswer') => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>, saId: string) => void;\r\n};\r\n\r\nexport const ShortAnswerLayer = ({\r\n shortAnswers,\r\n handleSelect,\r\n handleTransform,\r\n saRefs,\r\n onContextMenu,\r\n handleDragEnd,\r\n}: ShortAnswerLayerProps) => {\r\n return (\r\n <>\r\n {shortAnswers.map((shortAns) => (\r\n <ShortAnswer\r\n key={shortAns.id}\r\n shortAnswer={shortAns}\r\n handleSelect={handleSelect}\r\n handleTransform={handleTransform}\r\n saRefs={saRefs}\r\n onContextMenu={onContextMenu}\r\n handleDragEnd={(e) => handleDragEnd(e, shortAns.id)}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectCurrentSlide } from '../slices/canvasSlice';\r\nimport { useRef } from 'react';\r\nimport { updateFillInTheBlanks } from '../slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { useCallback } from 'react';\r\n\r\nexport const useFillInTheBlanksHandling = (onUpdate?: () => void) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const fillInTheBlanks = currentSlide?.fillInTheBlanks || [];\r\n const fibRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n\r\n const handleFillInTheBlanksDragEnd = useCallback(\r\n (e: Konva.KonvaEventObject<DragEvent>, fibId: string) => {\r\n const node = e.target;\r\n dispatch(\r\n updateFillInTheBlanks({\r\n id: fibId,\r\n x: node.x(),\r\n y: node.y(),\r\n })\r\n );\r\n onUpdate?.();\r\n },\r\n [dispatch, onUpdate]\r\n );\r\n\r\n return {\r\n fillInTheBlanks,\r\n fibRefs,\r\n handleFillInTheBlanksDragEnd,\r\n };\r\n};\r\n","'use client';\r\nimport { Group, Rect, Text } from 'react-konva';\r\nimport { Html } from 'react-konva-utils';\r\nimport Konva from 'konva';\r\nimport { useRef, useEffect, useState, memo } from 'react';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { FillInTheBlanks as FillInTheBlanksData } from '@/store/slices/canvasSlice';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype FillInTheBlanksProps = {\r\n fillInTheBlank: FillInTheBlanksData;\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: KonvaEventObject<Event>) => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>, fibId: string) => void;\r\n onContextMenu?: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq' | 'fillInTheBlanks'\r\n ) => void;\r\n};\r\n\r\nconst FillInTheBlanks = memo(\r\n ({\r\n fillInTheBlank,\r\n handleSelect,\r\n handleTransform,\r\n handleDragEnd,\r\n onContextMenu,\r\n }: FillInTheBlanksProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const groupRef = useRef<Konva.Group>(null);\r\n const [userInput, setUserInput] = useState('');\r\n const [submitted, setSubmitted] = useState(false);\r\n const [pressedButton, setPressedButton] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const node = groupRef.current;\r\n if (node) {\r\n return () => {};\r\n }\r\n }, [fillInTheBlank.id]);\r\n\r\n const correctAnswer =\r\n fillInTheBlank.data.responseOptions.correctShortAnswer?.trim().toLowerCase() || '';\r\n\r\n const isCorrect = submitted && userInput.trim().toLowerCase() === correctAnswer;\r\n\r\n const handleReset = () => {\r\n setSubmitted(false);\r\n setUserInput('');\r\n };\r\n\r\n const getFeedbackMessage = () => {\r\n if (isCorrect) {\r\n return '✓ Correct! 🎉';\r\n }\r\n return '✗ Try again!';\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n return { bg: '#fee2e2', text: '#991b1b' };\r\n };\r\n\r\n const padding = 24;\r\n const questionTitleHeight = 80;\r\n const feedbackHeight = submitted ? 50 : 0;\r\n const inputHeight = 45;\r\n const inputMargin = 8;\r\n const warningHeight = 20;\r\n const buttonHeight = fillInTheBlank.data.feedbackMode === 'practice' ? 48 : 0;\r\n const buttonTopMargin = 12;\r\n\r\n const totalHeight =\r\n questionTitleHeight +\r\n feedbackHeight +\r\n inputMargin +\r\n warningHeight +\r\n inputMargin +\r\n buttonTopMargin +\r\n buttonHeight +\r\n padding;\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={fillInTheBlank.x}\r\n y={fillInTheBlank.y}\r\n rotation={fillInTheBlank.rotation}\r\n width={fillInTheBlank.width}\r\n height={fillInTheBlank.height}\r\n name=\"fib-element\"\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: (e: KonvaEventObject<DragEvent>) => handleDragEnd(e, fillInTheBlank.id),\r\n onClick: () => handleSelect(fillInTheBlank.id),\r\n onTap: () => handleSelect(fillInTheBlank.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n const mousePos = groupRef.current?.getStage()?.getPointerPosition();\r\n if (!mousePos || !onContextMenu) return;\r\n const rect = {\r\n x: fillInTheBlank.x,\r\n y: fillInTheBlank.y,\r\n width: fillInTheBlank.width,\r\n height: fillInTheBlank.height,\r\n };\r\n if (\r\n mousePos.x >= rect.x &&\r\n mousePos.x <= rect.x + rect.width &&\r\n mousePos.y >= rect.y &&\r\n mousePos.y <= rect.y + rect.height\r\n ) {\r\n onContextMenu(\r\n e.evt as unknown as React.MouseEvent,\r\n fillInTheBlank.id,\r\n 'fillInTheBlanks'\r\n );\r\n }\r\n },\r\n }\r\n : {})}\r\n >\r\n <Rect\r\n fill=\"white\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n width={fillInTheBlank.width}\r\n height={totalHeight}\r\n onTransformEnd={(e) => handleTransform(fillInTheBlank.id, e)}\r\n />\r\n\r\n {/* Question Title with inline input placeholder */}\r\n <Text\r\n text={fillInTheBlank.data.question}\r\n x={padding}\r\n y={padding}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n width={fillInTheBlank.width - padding * 2 - 200}\r\n listening={false}\r\n />\r\n\r\n {/* Inline Input Box (Visual for preview) */}\r\n <Rect\r\n x={fillInTheBlank.width - padding - 180}\r\n y={padding + 10}\r\n width={180}\r\n height={inputHeight}\r\n fill=\"#ffffff\"\r\n stroke={isCorrect ? '#22c55e' : submitted ? '#ef4444' : '#096B76'}\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n />\r\n\r\n {/* Interactive HTML Input (for actual typing) */}\r\n <Html\r\n divProps={{\r\n style: {\r\n position: 'absolute',\r\n top: `${padding + 10}px`,\r\n left: `${fillInTheBlank.width - padding - 180}px`,\r\n width: '180px',\r\n height: `${inputHeight}px`,\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n },\r\n }}\r\n >\r\n <input\r\n type=\"text\"\r\n value={userInput}\r\n onChange={(e) => setUserInput(e.target.value)}\r\n disabled={submitted}\r\n placeholder=\"__________\"\r\n className=\"h-full w-full border-0 bg-white px-2 text-center text-gray-900 focus:outline-none\"\r\n style={{\r\n fontSize: '14px',\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n }}\r\n />\r\n </Html>\r\n\r\n {/* Feedback Message */}\r\n {submitted && (\r\n <>\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={feedbackHeight}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={feedbackHeight}\r\n text={getFeedbackMessage()}\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </>\r\n )}\r\n\r\n {/* Case sensitive warning */}\r\n <Text\r\n text=\"⚠️ Answer is case sensitive\"\r\n x={padding}\r\n y={questionTitleHeight + feedbackHeight + inputMargin}\r\n fontSize={10}\r\n fontStyle=\"italic\"\r\n fill=\"#6b7280\"\r\n width={fillInTheBlank.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Action Buttons */}\r\n {fillInTheBlank.data.feedbackMode === 'practice' && (\r\n <Group\r\n y={\r\n questionTitleHeight +\r\n feedbackHeight +\r\n inputMargin +\r\n warningHeight +\r\n inputMargin +\r\n buttonTopMargin\r\n }\r\n >\r\n {/* Check Button */}\r\n {!submitted && (\r\n <Group\r\n onMouseDown={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onMouseUp={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n if (userInput.length > 0) {\r\n setSubmitted(true);\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n }}\r\n onTouchStart={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton('check');\r\n }}\r\n onTouchEnd={(e) => {\r\n e.cancelBubble = true;\r\n setPressedButton(null);\r\n if (userInput.length > 0) {\r\n setSubmitted(true);\r\n }\r\n }}\r\n scaleX={pressedButton === 'check' ? 0.95 : 1}\r\n scaleY={pressedButton === 'check' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={48}\r\n fill={userInput.length === 0 ? '#9ca3af' : '#096B76'}\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={48}\r\n text=\"Check\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n\r\n {/* Reset Button */}\r\n {submitted && (\r\n <Group\r\n onMouseDown={() => setPressedButton('reset')}\r\n onMouseUp={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n onMouseLeave={() => setPressedButton(null)}\r\n onTouchStart={() => setPressedButton('reset')}\r\n onTouchEnd={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n scaleX={pressedButton === 'reset' ? 0.95 : 1}\r\n scaleY={pressedButton === 'reset' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={48}\r\n fill=\"#ef4444\"\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={fillInTheBlank.width - padding * 2}\r\n height={48}\r\n text=\"Reset\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n )}\r\n </Group>\r\n );\r\n }\r\n);\r\n\r\nFillInTheBlanks.displayName = 'FillInTheBlanks';\r\nexport default FillInTheBlanks;\r\n","import { FillInTheBlanks as FillInTheBlanksData } from '@/store/slices/canvasSlice';\r\nimport FillInTheBlanks from '../elements/FillInTheBlanks';\r\nimport Konva from 'konva';\r\n\r\nexport const FillInTheBlanksLayer = ({\r\n fillInTheBlanks,\r\n handleSelect,\r\n handleTransform,\r\n onContextMenu,\r\n handleDragEnd,\r\n}: {\r\n fillInTheBlanks: FillInTheBlanksData[];\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: Konva.KonvaEventObject<Event>) => void;\r\n onContextMenu?: (\r\n e: React.MouseEvent,\r\n elementId: string,\r\n elementType: 'image' | 'video' | 'shape' | 'mcq' | 'fillInTheBlanks'\r\n ) => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>, fibId: string) => void;\r\n}) => {\r\n return (\r\n <>\r\n {fillInTheBlanks.map((fillInTheBlank) => (\r\n <FillInTheBlanks\r\n key={fillInTheBlank.id}\r\n fillInTheBlank={fillInTheBlank}\r\n handleSelect={handleSelect}\r\n handleTransform={handleTransform}\r\n onContextMenu={onContextMenu}\r\n handleDragEnd={handleDragEnd}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n","'use client';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport Konva from 'konva';\r\nimport { Group, Rect, Text } from 'react-konva';\r\nimport { Html } from 'react-konva-utils';\r\nimport { memo, useState, useRef, useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport type { RootState } from '@/store/store';\r\n\r\ntype LongAnswerProps = {\r\n longAnswer: {\r\n id: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n data: {\r\n question: string;\r\n feedbackMode: string;\r\n responseOptions: {\r\n correctLongAnswer: string;\r\n };\r\n };\r\n };\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: KonvaEventObject<Event>) => void;\r\n saRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu?: (e: React.MouseEvent, id: string, type: 'mcq' | 'longAnswer') => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>) => void;\r\n};\r\n\r\nexport const LongAnswer = memo(\r\n ({\r\n longAnswer,\r\n handleSelect,\r\n handleTransform,\r\n saRefs,\r\n onContextMenu,\r\n handleDragEnd,\r\n }: LongAnswerProps) => {\r\n const tool = useSelector((state: RootState) => state.toolbar.selectedTool);\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n const groupRef = useRef<Konva.Group>(null);\r\n const [userInput, setUserInput] = useState('');\r\n const [submitted, setSubmitted] = useState(false);\r\n const [pressedButton, setPressedButton] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const node = groupRef.current;\r\n if (node) {\r\n saRefs.current.set(longAnswer.id, node);\r\n return () => {\r\n saRefs.current.delete(longAnswer.id);\r\n };\r\n }\r\n }, [longAnswer.id, saRefs]);\r\n\r\n const correctAnswer =\r\n longAnswer.data.responseOptions.correctLongAnswer?.trim().toLowerCase() || '';\r\n\r\n const isCorrect = submitted && userInput.trim().toLowerCase() === correctAnswer;\r\n\r\n const handleReset = () => {\r\n setSubmitted(false);\r\n setUserInput('');\r\n };\r\n\r\n const getFeedbackMessage = () => {\r\n if (isCorrect) {\r\n return '✓ Correct! 🎉';\r\n }\r\n return '✗ Needs review - this is a long answer question';\r\n };\r\n\r\n const getFeedbackColor = () => {\r\n if (isCorrect) return { bg: '#dcfce7', text: '#166534' };\r\n return { bg: '#fef3c7', text: '#92400e' };\r\n };\r\n\r\n const padding = 24;\r\n const questionTitleHeight = 60;\r\n const feedbackHeight = submitted ? 60 : 0;\r\n const textareaHeight = 120;\r\n const textareaMargin = 12;\r\n const buttonHeight = 48;\r\n const buttonTopMargin = 12;\r\n const placeholderHeight = 30;\r\n\r\n const totalHeight =\r\n questionTitleHeight +\r\n feedbackHeight +\r\n placeholderHeight +\r\n textareaHeight +\r\n textareaMargin +\r\n buttonTopMargin +\r\n buttonHeight +\r\n padding;\r\n\r\n return (\r\n <Group\r\n ref={groupRef}\r\n draggable={!isDrawingTool}\r\n listening={!isDrawingTool}\r\n x={longAnswer.x}\r\n y={longAnswer.y}\r\n rotation={longAnswer.rotation}\r\n width={longAnswer.width}\r\n height={longAnswer.height}\r\n name=\"la-element\"\r\n {...(!isDrawingTool\r\n ? {\r\n onDragEnd: handleDragEnd,\r\n onClick: () => handleSelect(longAnswer.id),\r\n onTap: () => handleSelect(longAnswer.id),\r\n onContextMenu: (e: KonvaEventObject<MouseEvent>) => {\r\n const mousePos = groupRef.current?.getStage()?.getPointerPosition();\r\n if (!mousePos || !onContextMenu) return;\r\n const rect = {\r\n x: longAnswer.x,\r\n y: longAnswer.y,\r\n width: longAnswer.width,\r\n height: longAnswer.height,\r\n };\r\n if (\r\n mousePos.x >= rect.x &&\r\n mousePos.x <= rect.x + rect.width &&\r\n mousePos.y >= rect.y &&\r\n mousePos.y <= rect.y + rect.height\r\n ) {\r\n onContextMenu(e.evt as unknown as React.MouseEvent, longAnswer.id, 'longAnswer');\r\n }\r\n },\r\n }\r\n : {})}\r\n >\r\n <Rect\r\n fill=\"white\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth={2}\r\n cornerRadius={12}\r\n width={longAnswer.width}\r\n height={totalHeight}\r\n onTransformEnd={(e) => handleTransform(longAnswer.id, e)}\r\n />\r\n\r\n {/* Question Title */}\r\n <Text\r\n text={longAnswer.data.question}\r\n x={padding}\r\n y={padding}\r\n fontSize={20}\r\n fontStyle=\"bold\"\r\n fill=\"#111827\"\r\n width={longAnswer.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Feedback Message */}\r\n {submitted && (\r\n <>\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={longAnswer.width - padding * 2}\r\n height={feedbackHeight}\r\n fill={getFeedbackColor().bg}\r\n cornerRadius={8}\r\n />\r\n <Text\r\n x={padding}\r\n y={questionTitleHeight}\r\n width={longAnswer.width - padding * 2}\r\n height={feedbackHeight}\r\n text={getFeedbackMessage()}\r\n fontSize={14}\r\n fontStyle=\"bold\"\r\n fill={getFeedbackColor().text}\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </>\r\n )}\r\n\r\n {/* Placeholder text for textarea */}\r\n <Text\r\n text=\"Answer (Extended response):\"\r\n x={padding}\r\n y={questionTitleHeight + feedbackHeight + textareaMargin}\r\n fontSize={14}\r\n fill=\"#6b7280\"\r\n width={longAnswer.width - padding * 2}\r\n listening={false}\r\n />\r\n\r\n {/* Textarea Box (Visual Representation for preview) */}\r\n <Rect\r\n x={padding}\r\n y={questionTitleHeight + feedbackHeight + placeholderHeight}\r\n width={longAnswer.width - padding * 2}\r\n height={textareaHeight}\r\n fill=\"#ffffff\"\r\n stroke=\"#d1d5db\"\r\n strokeWidth={2}\r\n cornerRadius={8}\r\n />\r\n\r\n {/* Interactive HTML Textarea (for actual typing) */}\r\n <Html\r\n divProps={{\r\n style: {\r\n position: 'absolute',\r\n top: `${questionTitleHeight + feedbackHeight + placeholderHeight}px`,\r\n left: `${padding}px`,\r\n width: `${longAnswer.width - padding * 2}px`,\r\n height: `${textareaHeight}px`,\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n },\r\n }}\r\n >\r\n <textarea\r\n value={userInput}\r\n onChange={(e) => setUserInput(e.target.value)}\r\n disabled={submitted}\r\n placeholder=\"Type your extended answer here...\r\n\r\nThis is for longer responses that require detailed explanations.\"\r\n className=\"h-full w-full resize-none border-0 bg-white p-3 text-gray-900 focus:outline-none\"\r\n style={{\r\n fontSize: '14px',\r\n pointerEvents: submitted ? 'none' : 'auto',\r\n }}\r\n />\r\n </Html>\r\n\r\n {/* Action Buttons */}\r\n <Group\r\n y={\r\n questionTitleHeight +\r\n feedbackHeight +\r\n placeholderHeight +\r\n textareaHeight +\r\n textareaMargin +\r\n buttonTopMargin\r\n }\r\n >\r\n {/* Reset Button (Always show for long answer) */}\r\n {submitted && (\r\n <Group\r\n onMouseDown={() => setPressedButton('reset')}\r\n onMouseUp={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n onMouseLeave={() => setPressedButton(null)}\r\n onTouchStart={() => setPressedButton('reset')}\r\n onTouchEnd={() => {\r\n setPressedButton(null);\r\n handleReset();\r\n }}\r\n scaleX={pressedButton === 'reset' ? 0.95 : 1}\r\n scaleY={pressedButton === 'reset' ? 0.95 : 1}\r\n >\r\n <Rect\r\n x={padding}\r\n width={longAnswer.width - padding * 2}\r\n height={48}\r\n fill=\"#ef4444\"\r\n cornerRadius={8}\r\n onClick={(e) => (e.cancelBubble = true)}\r\n onTap={(e) => (e.cancelBubble = true)}\r\n />\r\n <Text\r\n x={padding}\r\n width={longAnswer.width - padding * 2}\r\n height={48}\r\n text=\"Reset\"\r\n fontSize={16}\r\n fontStyle=\"bold\"\r\n fill=\"white\"\r\n align=\"center\"\r\n verticalAlign=\"middle\"\r\n listening={false}\r\n />\r\n </Group>\r\n )}\r\n </Group>\r\n </Group>\r\n );\r\n }\r\n);\r\n\r\nLongAnswer.displayName = 'LongAnswer';\r\nexport default LongAnswer;\r\n","import { KonvaEventObject } from 'konva/lib/Node';\r\nimport { LongAnswer as LongAnswerType } from '@/store/slices/canvasSlice';\r\nimport Konva from 'konva';\r\nimport { LongAnswer } from '../elements/LongAnswer';\r\n\r\ntype LongAnswerLayerProps = {\r\n longAnswer: LongAnswerType[];\r\n handleSelect: (id: string) => void;\r\n handleTransform: (id: string, e: KonvaEventObject<Event>) => void;\r\n saRefs: React.MutableRefObject<Map<string, Konva.Group>>;\r\n onContextMenu: (e: React.MouseEvent, id: string, type: 'mcq' | 'longAnswer') => void;\r\n handleDragEnd: (e: Konva.KonvaEventObject<DragEvent>, saId: string) => void;\r\n};\r\n\r\nexport const LongAnswerLayer = ({\r\n longAnswer,\r\n handleSelect,\r\n handleTransform,\r\n saRefs,\r\n onContextMenu,\r\n handleDragEnd,\r\n}: LongAnswerLayerProps) => {\r\n return (\r\n <>\r\n {longAnswer.map((longAns) => (\r\n <LongAnswer\r\n key={longAns.id}\r\n longAnswer={longAns}\r\n handleSelect={handleSelect}\r\n handleTransform={handleTransform}\r\n saRefs={saRefs}\r\n onContextMenu={onContextMenu}\r\n handleDragEnd={(e) => handleDragEnd(e, longAns.id)}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\r\nimport { Stage, Layer, Rect, Transformer, Line, Group } from 'react-konva';\r\nimport Konva from 'konva';\r\nimport { KonvaEventObject } from 'konva/lib/Node';\r\nimport { useSelector } from '@/store/hooks';\r\nimport {\r\n deleteFillInTheBlanks,\r\n duplicateFillInTheBlanks,\r\n selectCurrentSlide,\r\n selectCurrentSlideId,\r\n setShowMcqForm,\r\n removeLine,\r\n updateLineTransform,\r\n deleteLineById,\r\n duplicateLine,\r\n setShowFlashcardForm,\r\n} from '@/store/slices/canvasSlice';\r\nimport { useDirectDrawing } from '@/store/hooks/useDirectDrawing';\r\nimport DirectDrawingCanvas, { DirectDrawingCanvasHandle } from './DirectDrawingCanvas';\r\nimport { useImageHandling } from '@/store/hooks/useImageHandling';\r\nimport { useMcqHandling } from '@/store/hooks/useMcqHandling';\r\nimport { useTrueFalseHandling } from '@/store/hooks/useTrueFalseHandling';\r\nimport { useVideoHandling } from '@/store/hooks/useVideoHandling';\r\nimport { useShapeHandling } from '@/store/hooks/useShapeHandling';\r\nimport { useTextHandling } from '@/store/hooks/useTextHandling';\r\nimport { useShortAnswerHandling } from '@/store/hooks/useShortAnswerHandling';\r\nimport { useLongAnswerHandling } from '@/store/hooks/useLongAnswerHandling';\r\nimport { useFlashcardHandling } from '@/store/hooks/useFlashcardHandling';\r\nimport { usePhotoFrameHandling } from '@/store/hooks/usePhotoFrameHandling';\r\nimport { useTransformer } from '@/store/hooks/UseTransformer';\r\nimport { useSlideThumbnail } from '@/store/hooks/useSlideThumbnail';\r\nimport { ImageLayer } from '@/components/layers/ImageLayer';\r\nimport { VideoLayer } from '@/components/layers/VideoLayer';\r\nimport { ShapeLayer } from '@/components/layers/ShapeLayer';\r\nimport { TextLayer } from '@/components/layers/TextLayer';\r\nimport { FlashcardLayer } from '@/components/layers/FlashcardLayer';\r\nimport { PhotoFrameLayer } from '@/components/layers/PhotoFrameLayer';\r\nimport { ContextMenu, ContextMenuAction } from '@/components/ui/ContextMenu';\r\nimport { Submenu } from '@/components/ui/Submenu';\r\nimport { InputDialog } from '@/components/ui/InputDialog';\r\nimport { ColorPickerDialog } from '@/components/ui/ColorPickerDialog';\r\nimport { CropDialog } from '@/components/ui/CropDialog';\r\nimport { ScreenRecorder } from '@/components/ui/ScreenRecorder';\r\nimport { ObjectAudioRecorder } from '@/components/ui/ObjectAudioRecorder';\r\nimport { AudioIndicator } from '@/components/ui/AudioIndicator';\r\nimport { LayersPanel } from '@/components/ui/LayersPanel';\r\nimport { MultipleChoiceLayer } from '@/components/layers/MultipleChoiceLayer';\r\nimport { TrueFalseLayer } from '@/components/layers/TrueFalseLayer';\r\nimport McqForm from '@/components/elements/McqForm';\r\nimport { FloatingTextToolbar } from '@/components/ui/FloatingTextToolbar';\r\nimport { TextEditingArea } from '@/components/ui/TextEditingArea';\r\nimport { useAppDispatch } from '@/store/hooks';\r\nimport {\r\n deleteImage,\r\n duplicateImage,\r\n updateImage,\r\n deleteVideo,\r\n duplicateVideo,\r\n duplicateShape,\r\n deleteShape,\r\n updateShape,\r\n deleteText,\r\n duplicateText,\r\n duplicateMultipleChoice,\r\n deleteMultipleChoice,\r\n duplicateTrueFalse,\r\n deleteTrueFalse,\r\n duplicateShortAnswer,\r\n deleteShortAnswer,\r\n deleteLongAnswer,\r\n duplicateLongAnswer,\r\n saveToHistory,\r\n bringToFront,\r\n sendToBack,\r\n toggleLock,\r\n setLink,\r\n setAltText,\r\n setAudioData,\r\n deleteFlashcard,\r\n duplicateFlashcard,\r\n deletePhotoFrame,\r\n duplicatePhotoFrame,\r\n toggleImageDrawingMode,\r\n togglePhotoFrameDrawingMode,\r\n MultipleChoice,\r\n TrueFalse,\r\n ShortAnswer,\r\n LongAnswer,\r\n FillInTheBlanks,\r\n FlashcardElement as Flashcard,\r\n setEditingActivity,\r\n editFlashcard,\r\n} from '@/store/slices/canvasSlice';\r\nimport { ShortAnswerLayer } from '../layers/ShortAnswerLayer';\r\nimport { useFillInTheBlanksHandling } from '@/store/hooks/useFillInTheBlanksHandling';\r\nimport { FillInTheBlanksLayer } from '../layers/FillInTheBlanksLayer';\r\nimport { LongAnswerLayer } from '../layers/LongAnswerLayer';\r\n\r\n// Type definitions for better type safety\r\ntype ElementType =\r\n | 'image'\r\n | 'video'\r\n | 'shape'\r\n | 'text'\r\n | 'flashcard'\r\n | 'photoFrame'\r\n | 'mcq'\r\n | 'trueFalse'\r\n | 'shortAnswer'\r\n | 'longAnswer'\r\n | 'fillInTheBlanks'\r\n | 'line';\r\n\r\ntype MediaElement = {\r\n id: string;\r\n link?: string;\r\n altText?: string;\r\n audioData?: string;\r\n locked?: boolean;\r\n};\r\n\r\ntype LineElement = {\r\n id?: string;\r\n points?: number[];\r\n tool?: string;\r\n isSketch?: boolean;\r\n color?: string;\r\n strokeWidth?: number;\r\n timestamp?: number;\r\n x?: number;\r\n y?: number;\r\n scaleX?: number;\r\n scaleY?: number;\r\n rotation?: number;\r\n};\r\n\r\ntype BaseElement = {\r\n id: string;\r\n timestamp?: number;\r\n [key: string]: unknown;\r\n};\r\n\r\ntype CanvasElement = LineElement | BaseElement;\r\n\r\ntype CanvasElementItem = {\r\n type: string;\r\n timestamp: number;\r\n element: CanvasElement;\r\n index?: number;\r\n};\r\n\r\nexport type CanvasProps = {\r\n onStageReady?: (stageRef: React.RefObject<Konva.Stage | null>) => void;\r\n onSelectionChange?: (selectedId: string | null) => void;\r\n onTextEditingReady?: (startEditingFn: (textId: string) => void) => void;\r\n onDirectDrawingCanvasReady?: (canvasRef: React.RefObject<HTMLCanvasElement | null>) => void;\r\n};\r\n\r\nconst Canvas: React.FC<CanvasProps> = ({\r\n onStageReady,\r\n onSelectionChange,\r\n onTextEditingReady,\r\n onDirectDrawingCanvasReady,\r\n} = {}) => {\r\n const dispatch = useAppDispatch();\r\n const tool = useSelector((state) => state.toolbar.selectedTool);\r\n const isSketchMode = useSelector((state) => state.canvas.isSketchMode);\r\n const currentSlide = useSelector(selectCurrentSlide);\r\n const currentSlideId = useSelector(selectCurrentSlideId);\r\n const editingActivity = currentSlide?.editingActivity;\r\n const showMcqForm = currentSlide?.showMcqForm;\r\n const lines = currentSlide?.lines || [];\r\n const stageRef = useRef<Konva.Stage | null>(null);\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const [selectedId, setSelectedId] = useState<string | null>(null);\r\n const [previewUrl, setPreviewUrl] = useState<string>('');\r\n const [dimensions, setDimensions] = useState({ width: 1280, height: 1200 });\r\n\r\n const [contextMenu, setContextMenu] = useState<{\r\n x: number;\r\n y: number;\r\n elementId: string;\r\n elementType: ElementType;\r\n } | null>(null);\r\n\r\n const [floatingToolbarPosition, setFloatingToolbarPosition] = useState<{\r\n x: number;\r\n y: number;\r\n } | null>(null);\r\n\r\n const [editingOverlayPosition, setEditingOverlayPosition] = useState<{\r\n top: number;\r\n left: number;\r\n scale: number;\r\n } | null>(null);\r\n\r\n const [submenu, setSubmenu] = useState<{\r\n x: number;\r\n y: number;\r\n type: 'order' | 'lock';\r\n } | null>(null);\r\n\r\n const [dialog, setDialog] = useState<{\r\n type: 'link' | 'altText';\r\n defaultValue: string;\r\n } | null>(null);\r\n\r\n const [colorPickerDialog, setColorPickerDialog] = useState<{\r\n elementId: string;\r\n elementType: 'shape';\r\n defaultColor: string;\r\n } | null>(null);\r\n\r\n const [cropDialog, setCropDialog] = useState<{\r\n elementId: string;\r\n imageSrc: string;\r\n } | null>(null);\r\n\r\n const [showScreenRecorder, setShowScreenRecorder] = useState(false);\r\n\r\n const [showObjectAudioRecorder, setShowObjectAudioRecorder] = useState<{\r\n elementId: string;\r\n elementType: Exclude<ElementType, 'line'>;\r\n existingAudio?: string;\r\n } | null>(null);\r\n\r\n const [showLayersPanel, setShowLayersPanel] = useState(false);\r\n\r\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\r\n const directDrawingRef = useRef<DirectDrawingCanvasHandle | null>(null);\r\n const directDrawingCanvasRef = useRef<HTMLCanvasElement | null>(null);\r\n\r\n const { debouncedGenerateThumbnail } = useSlideThumbnail(currentSlideId, stageRef);\r\n\r\n useEffect(() => {\r\n const updateDimensions = () => {\r\n if (containerRef.current) {\r\n const rect = containerRef.current.getBoundingClientRect();\r\n setDimensions({\r\n width: rect.width,\r\n height: rect.height,\r\n });\r\n }\r\n };\r\n\r\n updateDimensions();\r\n\r\n const resizeObserver = new ResizeObserver(updateDimensions);\r\n if (containerRef.current) {\r\n resizeObserver.observe(containerRef.current);\r\n }\r\n\r\n window.addEventListener('resize', updateDimensions);\r\n\r\n return () => {\r\n resizeObserver.disconnect();\r\n window.removeEventListener('resize', updateDimensions);\r\n };\r\n }, []);\r\n\r\n // Reset stage cursor when tool changes to ensure proper cursor inheritance\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n const container = stageRef.current.container();\r\n if (container) {\r\n container.style.cursor = '';\r\n }\r\n }\r\n }, [tool]);\r\n\r\n const updatePreview = useCallback(() => {\r\n if (!stageRef.current) return;\r\n\r\n requestAnimationFrame(() => {\r\n if (!stageRef.current) return;\r\n\r\n const layers = stageRef.current.getLayers();\r\n layers.forEach((layer) => layer.batchDraw());\r\n\r\n const scale = 1 / 6;\r\n const url = stageRef.current.toDataURL({ pixelRatio: scale });\r\n setPreviewUrl(url);\r\n debouncedGenerateThumbnail();\r\n });\r\n }, [debouncedGenerateThumbnail]);\r\n\r\n const currentSlideIdRef = useRef(currentSlideId);\r\n useEffect(() => {\r\n if (currentSlideIdRef.current !== currentSlideId) {\r\n currentSlideIdRef.current = currentSlideId;\r\n updatePreview();\r\n }\r\n }, [currentSlideId, updatePreview]);\r\n\r\n const contentCountRef = useRef<{ slideId: string; count: number } | null>(null);\r\n const isInitialMountRef = useRef(true);\r\n\r\n useEffect(() => {\r\n if (!currentSlide) return;\r\n\r\n const newCount =\r\n (currentSlide.lines?.length || 0) +\r\n (currentSlide.images?.length || 0) +\r\n (currentSlide.videos?.length || 0) +\r\n (currentSlide.shapes?.length || 0) +\r\n (currentSlide.texts?.length || 0) +\r\n (currentSlide.flashcards?.length || 0) +\r\n (currentSlide.photoFrames?.length || 0) +\r\n (currentSlide.multipleChoices?.length || 0) +\r\n (currentSlide.trueFalses?.length || 0) +\r\n (currentSlide.shortAnswers?.length || 0) +\r\n (currentSlide.LongAnswer?.length || 0) +\r\n (currentSlide.fillInTheBlanks?.length || 0);\r\n\r\n const countChanged = contentCountRef.current?.count !== newCount;\r\n\r\n if (!isInitialMountRef.current && countChanged) {\r\n setTimeout(() => {\r\n updatePreview();\r\n }, 100);\r\n }\r\n\r\n contentCountRef.current = { slideId: currentSlideId, count: newCount };\r\n isInitialMountRef.current = false;\r\n }, [currentSlide, currentSlideId, updatePreview]);\r\n\r\n useEffect(() => {\r\n if (stageRef.current && onStageReady) {\r\n onStageReady(stageRef);\r\n }\r\n }, [onStageReady]);\r\n\r\n useEffect(() => {\r\n if (directDrawingCanvasRef.current && onDirectDrawingCanvasReady) {\r\n onDirectDrawingCanvasReady(directDrawingCanvasRef);\r\n }\r\n }, [onDirectDrawingCanvasReady]);\r\n\r\n const {\r\n startDrawing,\r\n draw,\r\n stopDrawing,\r\n setCanvasRef,\r\n tool: drawingTool,\r\n color: drawingColor,\r\n strokeWidth: drawingStrokeWidth,\r\n isSketchMode: drawingIsSketchMode,\r\n } = useDirectDrawing(updatePreview);\r\n\r\n const lineRefs = useRef<Map<string, Konva.Group>>(new Map());\r\n\r\n const { images, getLoadedImage, imageRefs, handleDragEnd, handleImageTransformEnd } =\r\n useImageHandling(updatePreview);\r\n const { videos, videoRefs, handleVideoClick, handleVideoDragEnd, handleVideoTransformEnd } =\r\n useVideoHandling(updatePreview);\r\n const {\r\n multipleChoice,\r\n handleMcqTransform,\r\n mcqRefs,\r\n handleDragEnd: handleMcqDragEnd,\r\n } = useMcqHandling(updatePreview);\r\n const { trueFalse, handleTrueFalseTransform, trueFalseRefs, handleTrueFalseDragEnd } =\r\n useTrueFalseHandling(updatePreview);\r\n const { shortAnswers, saRefs, handleShortAnswerDragEnd } = useShortAnswerHandling(updatePreview);\r\n const { longAnswers, handleLongAnswerDragEnd } = useLongAnswerHandling(updatePreview);\r\n const { fillInTheBlanks, handleFillInTheBlanksDragEnd } =\r\n useFillInTheBlanksHandling(updatePreview);\r\n const { transformerRef, boundBoxFunc } = useTransformer();\r\n const { shapes, shapeRefs, isDragging, handleShapeDragEnd, handleShapeResizeEnd } =\r\n useShapeHandling(updatePreview);\r\n\r\n const {\r\n texts,\r\n textRefs,\r\n handleDragEnd: handleTextDragEnd,\r\n handleTransformEnd: handleTextTransformEnd,\r\n handleDoubleClick: handleTextDoubleClick,\r\n startEditing,\r\n editingTextId,\r\n editingValue,\r\n handleEditingChange,\r\n finishEditing,\r\n } = useTextHandling(updatePreview, textareaRef);\r\n\r\n // Expose startEditing to parent\r\n useEffect(() => {\r\n if (onTextEditingReady) {\r\n onTextEditingReady(startEditing);\r\n }\r\n }, [onTextEditingReady, startEditing]);\r\n\r\n const reduxEditingTextId = useSelector((state) => state.canvas.editingTextId);\r\n useEffect(() => {\r\n if (reduxEditingTextId && reduxEditingTextId !== editingTextId) {\r\n startEditing(reduxEditingTextId);\r\n }\r\n }, [reduxEditingTextId, editingTextId, startEditing]);\r\n\r\n const {\r\n flashcards,\r\n flashcardRefs,\r\n handleDragEnd: handleFlashcardDragEnd,\r\n handleFlashcardTransformEnd,\r\n handleNext: handleFlashcardNext,\r\n handlePrevious: handleFlashcardPrevious,\r\n } = useFlashcardHandling(updatePreview);\r\n\r\n const {\r\n photoFrames,\r\n photoFrameRefs,\r\n handleDragEnd: handlePhotoFrameDragEnd,\r\n handlePhotoFrameTransformEnd,\r\n startCamera,\r\n capturePhoto,\r\n cameraStreams,\r\n } = usePhotoFrameHandling(updatePreview);\r\n\r\n useEffect(() => {\r\n if (!transformerRef.current) return;\r\n\r\n if (editingTextId) {\r\n transformerRef.current.nodes([]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n return;\r\n }\r\n\r\n if (selectedId) {\r\n const selectedVideo = videos.find((v) => v.id === selectedId);\r\n const isPlayingVideo = selectedVideo?.isPlaying;\r\n\r\n if (!isPlayingVideo) {\r\n const selectedNode =\r\n lineRefs.current.get(selectedId) ||\r\n imageRefs.current.get(selectedId) ||\r\n videoRefs.current.get(selectedId) ||\r\n shapeRefs.current.get(selectedId) ||\r\n textRefs.current.get(selectedId) ||\r\n mcqRefs.current.get(selectedId) ||\r\n flashcardRefs.current.get(selectedId) ||\r\n photoFrameRefs.current.get(selectedId);\r\n\r\n if (selectedNode) {\r\n const isLocked = (selectedNode as Konva.Node & { attrs?: { locked?: boolean } }).attrs\r\n ?.locked;\r\n\r\n if (selectedNode.visible() && isLocked !== true) {\r\n transformerRef.current.nodes([selectedNode]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n transformerRef.current.nodes([]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n }, [\r\n selectedId,\r\n editingTextId,\r\n videos,\r\n lineRefs,\r\n imageRefs,\r\n videoRefs,\r\n shapeRefs,\r\n textRefs,\r\n flashcardRefs,\r\n photoFrameRefs,\r\n photoFrames,\r\n mcqRefs,\r\n transformerRef,\r\n ]);\r\n\r\n const handleSelect = useCallback(\r\n (id: string) => {\r\n setSelectedId(id);\r\n onSelectionChange?.(id);\r\n },\r\n [onSelectionChange]\r\n );\r\n\r\n const handleDeselect = useCallback(() => {\r\n setSelectedId(null);\r\n onSelectionChange?.(null);\r\n if (transformerRef.current) {\r\n transformerRef.current.nodes([]);\r\n transformerRef.current.getLayer()?.batchDraw();\r\n }\r\n }, [transformerRef, onSelectionChange]);\r\n\r\n useEffect(() => {\r\n const transformer = transformerRef.current;\r\n return () => {\r\n if (transformer) {\r\n transformer.nodes([]);\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [currentSlideId]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (editingTextId) {\r\n const target = e.target as HTMLElement;\r\n if (target.tagName !== 'TEXTAREA') {\r\n finishEditing();\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [editingTextId, finishEditing]);\r\n\r\n useEffect(() => {\r\n const textId = editingTextId || selectedId;\r\n if (!textId || (selectedId && editingTextId)) {\r\n setFloatingToolbarPosition(null);\r\n return;\r\n }\r\n\r\n const textNode = textRefs.current.get(textId);\r\n const stage = stageRef.current;\r\n\r\n if (!textNode || !stage) {\r\n setFloatingToolbarPosition(null);\r\n return;\r\n }\r\n\r\n const stageBox = stage.container().getBoundingClientRect();\r\n const textPosition = textNode.absolutePosition();\r\n const scale = stage.scaleX();\r\n\r\n setFloatingToolbarPosition({\r\n x: stageBox.left + (textPosition.x + (textNode.width() * scale) / 2) * scale,\r\n y: stageBox.top + textPosition.y * scale,\r\n });\r\n }, [selectedId, editingTextId, texts, textRefs]);\r\n\r\n useEffect(() => {\r\n if (!editingTextId) {\r\n setEditingOverlayPosition(null);\r\n return;\r\n }\r\n\r\n const textNode = textRefs.current.get(editingTextId);\r\n const stage = stageRef.current;\r\n\r\n if (!textNode || !stage) {\r\n setEditingOverlayPosition(null);\r\n return;\r\n }\r\n\r\n const stageBox = stage.container().getBoundingClientRect();\r\n const textPosition = textNode.absolutePosition();\r\n const scale = stage.scaleX();\r\n\r\n setEditingOverlayPosition({\r\n top: stageBox.top + textPosition.y * scale,\r\n left: stageBox.left + textPosition.x * scale,\r\n scale,\r\n });\r\n }, [editingTextId, texts, textRefs]);\r\n\r\n const handleMouseDown = useCallback(\r\n (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n const targetClass = e.target.getClassName();\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n const clickedOnTransformer =\r\n targetClass === 'Transformer' || e.target.getParent()?.getClassName() === 'Transformer';\r\n const clickedOnImage = targetClass === 'Image';\r\n const clickedOnText = targetClass === 'Text';\r\n const clickedOnGroup =\r\n targetClass === 'Group' || e.target.getParent()?.getClassName() === 'Group';\r\n const clickedOnShape =\r\n targetClass === 'Circle' ||\r\n targetClass === 'Star' ||\r\n targetClass === 'RegularPolygon' ||\r\n targetClass === 'Ellipse' ||\r\n targetClass === 'Ring' ||\r\n targetClass === 'Wedge' ||\r\n targetClass === 'Arrow' ||\r\n targetClass === 'Line' ||\r\n targetClass === 'Arc' ||\r\n (targetClass === 'Rect' && e.target.attrs.id);\r\n const clickedOnMultipleChoice = targetClass === 'Group';\r\n\r\n console.log('🖱️ Canvas handleMouseDown:', {\r\n targetClass,\r\n clickedOnImage,\r\n clickedOnGroup,\r\n tool,\r\n targetId: e.target.attrs?.id,\r\n });\r\n\r\n if (\r\n clickedOnEmpty &&\r\n !clickedOnTransformer &&\r\n !clickedOnImage &&\r\n !clickedOnText &&\r\n !clickedOnGroup &&\r\n !clickedOnShape &&\r\n !clickedOnMultipleChoice\r\n ) {\r\n handleDeselect();\r\n }\r\n\r\n // When pen/eraser is selected, allow drawing even if clicking on objects\r\n const isDrawingTool = tool === 'pen' || tool === 'eraser';\r\n\r\n if (\r\n !isDrawingTool &&\r\n (clickedOnImage ||\r\n clickedOnText ||\r\n clickedOnTransformer ||\r\n clickedOnGroup ||\r\n clickedOnShape ||\r\n clickedOnMultipleChoice)\r\n ) {\r\n return;\r\n }\r\n\r\n const pos = e.target.getStage()?.getPointerPosition();\r\n if (!pos) return;\r\n\r\n const shapeTools = [\r\n 'rectangle',\r\n 'circle',\r\n 'ellipse',\r\n 'triangle',\r\n 'polygon',\r\n 'star',\r\n 'ring',\r\n 'wedge',\r\n 'arrow',\r\n 'line',\r\n 'arc',\r\n ];\r\n if (!shapeTools.includes(tool)) {\r\n startDrawing(pos);\r\n }\r\n },\r\n [tool, startDrawing, handleDeselect]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: KonvaEventObject<MouseEvent | TouchEvent>) => {\r\n if (isDragging) return;\r\n\r\n const pos = e.target.getStage()?.getPointerPosition();\r\n if (!pos) return;\r\n\r\n draw(pos);\r\n },\r\n [draw, isDragging]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n const handleImageDragEnd = useCallback(\r\n (e: KonvaEventObject<DragEvent>) => {\r\n handleDragEnd(e, updatePreview);\r\n },\r\n [handleDragEnd, updatePreview]\r\n );\r\n\r\n const handleVideoClickWithSelection = useCallback(\r\n (id: string) => {\r\n handleVideoClick(id);\r\n handleSelect(id);\r\n },\r\n [handleVideoClick, handleSelect]\r\n );\r\n\r\n const handleContextMenu = useCallback(\r\n (e: React.MouseEvent, elementId: string, elementType: ElementType) => {\r\n e.preventDefault();\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n elementId,\r\n elementType,\r\n });\r\n handleSelect(elementId);\r\n },\r\n [handleSelect]\r\n );\r\n\r\n const handleEditActivity = useCallback(\r\n (activity: MultipleChoice | TrueFalse | ShortAnswer | LongAnswer | FillInTheBlanks) => {\r\n dispatch(setEditingActivity(activity));\r\n dispatch(setShowMcqForm(true));\r\n },\r\n [dispatch]\r\n );\r\n\r\n const handleEditFlashcard = useCallback(\r\n (flashcard: Flashcard) => {\r\n dispatch(editFlashcard(flashcard));\r\n dispatch(setShowFlashcardForm(true));\r\n },\r\n [dispatch]\r\n );\r\n\r\n const handleContextMenuAction = useCallback(\r\n (action: ContextMenuAction, event?: React.MouseEvent) => {\r\n if (!contextMenu) return;\r\n\r\n const { elementId, elementType } = contextMenu;\r\n\r\n switch (action) {\r\n case 'order':\r\n if (event) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect();\r\n setSubmenu({\r\n x: rect.right + 5,\r\n y: rect.top,\r\n type: 'order',\r\n });\r\n }\r\n break;\r\n\r\n case 'lock':\r\n if (event) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect();\r\n setSubmenu({\r\n x: rect.right + 5,\r\n y: rect.top,\r\n type: 'lock',\r\n });\r\n }\r\n break;\r\n\r\n case 'link':\r\n setContextMenu(null);\r\n if (elementType === 'line') break; // Lines don't support links\r\n const currentElement = currentSlide\r\n ? elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === elementId)\r\n : currentSlide.videos.find((vid) => vid.id === elementId)\r\n : null;\r\n setDialog({\r\n type: 'link',\r\n defaultValue: (currentElement as MediaElement)?.link || '',\r\n });\r\n break;\r\n\r\n case 'voice':\r\n setContextMenu(null);\r\n if (elementType === 'line') break; // Lines don't support audio\r\n const currentAudioElement = currentSlide\r\n ? elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === elementId)\r\n : elementType === 'video'\r\n ? currentSlide.videos.find((vid) => vid.id === elementId)\r\n : elementType === 'text'\r\n ? currentSlide.texts.find((txt) => txt.id === elementId)\r\n : elementType === 'flashcard'\r\n ? currentSlide.flashcards.find((fc) => fc.id === elementId)\r\n : elementType === 'photoFrame'\r\n ? currentSlide.photoFrames.find((pf) => pf.id === elementId)\r\n : elementType === 'mcq'\r\n ? currentSlide.multipleChoices.find((mc) => mc.id === elementId)\r\n : elementType === 'fillInTheBlanks'\r\n ? currentSlide.fillInTheBlanks.find((fib) => fib.id === elementId)\r\n : elementType === 'longAnswer'\r\n ? currentSlide.LongAnswer.find((la) => la.id === elementId)\r\n : elementType === 'shortAnswer'\r\n ? currentSlide.shortAnswers.find((sa) => sa.id === elementId)\r\n : elementType === 'trueFalse'\r\n ? currentSlide.trueFalses.find((tf) => tf.id === elementId)\r\n : elementType === 'shape'\r\n ? currentSlide.shapes.find((shape) => shape.id === elementId)\r\n : null\r\n : null;\r\n setShowObjectAudioRecorder({\r\n elementId,\r\n elementType: elementType as Exclude<ElementType, 'line'>,\r\n existingAudio: (currentAudioElement as MediaElement)?.audioData,\r\n });\r\n break;\r\n\r\n case 'edit':\r\n setContextMenu(null);\r\n // Find the current activity based on element type and ID\r\n let activity = null;\r\n if (elementType === 'mcq') {\r\n activity = currentSlide?.multipleChoices.find((mc) => mc.id === elementId);\r\n } else if (elementType === 'trueFalse') {\r\n activity = currentSlide?.trueFalses.find((tf) => tf.id === elementId);\r\n } else if (elementType === 'shortAnswer') {\r\n activity = currentSlide?.shortAnswers.find((sa) => sa.id === elementId);\r\n } else if (elementType === 'longAnswer') {\r\n activity = currentSlide?.LongAnswer.find((la) => la.id === elementId);\r\n } else if (elementType === 'fillInTheBlanks') {\r\n activity = currentSlide?.fillInTheBlanks.find((fib) => fib.id === elementId);\r\n }\r\n if (activity) {\r\n handleEditActivity(activity);\r\n }\r\n break;\r\n\r\n case 'editFlashcard':\r\n setContextMenu(null);\r\n const flashcard = currentSlide?.flashcards.find((fc) => fc.id === elementId);\r\n if (flashcard) {\r\n handleEditFlashcard(flashcard);\r\n }\r\n break;\r\n\r\n case 'color':\r\n setContextMenu(null);\r\n const currentShape = currentSlide?.shapes.find((shape) => shape.id === elementId);\r\n setColorPickerDialog({\r\n elementId,\r\n elementType: 'shape',\r\n defaultColor: currentShape?.color || '#096B76',\r\n });\r\n break;\r\n\r\n case 'crop':\r\n setContextMenu(null);\r\n if (elementType === 'image') {\r\n const imageElement = currentSlide?.images.find((img) => img.id === elementId);\r\n if (imageElement) {\r\n setCropDialog({\r\n elementId,\r\n imageSrc: imageElement.src,\r\n });\r\n }\r\n }\r\n break;\r\n\r\n case 'draw':\r\n setContextMenu(null);\r\n if (elementType === 'image') {\r\n dispatch(toggleImageDrawingMode(elementId));\r\n } else if (elementType === 'photoFrame') {\r\n dispatch(togglePhotoFrameDrawingMode(elementId));\r\n }\r\n break;\r\n\r\n case 'duplicate':\r\n dispatch(saveToHistory());\r\n if (elementType === 'line') {\r\n dispatch(duplicateLine(elementId));\r\n } else if (elementType === 'image') {\r\n dispatch(duplicateImage(elementId));\r\n } else if (elementType === 'video') {\r\n dispatch(duplicateVideo(elementId));\r\n } else if (elementType === 'shape') {\r\n dispatch(duplicateShape(elementId));\r\n } else if (elementType === 'text') {\r\n dispatch(duplicateText(elementId));\r\n } else if (elementType === 'flashcard') {\r\n dispatch(duplicateFlashcard(elementId));\r\n } else if (elementType === 'photoFrame') {\r\n dispatch(duplicatePhotoFrame(elementId));\r\n } else if (elementType === 'mcq') {\r\n dispatch(duplicateMultipleChoice(elementId));\r\n } else if (elementType === 'trueFalse') {\r\n dispatch(duplicateTrueFalse(elementId));\r\n } else if (elementType === 'shortAnswer') {\r\n dispatch(duplicateShortAnswer(elementId));\r\n } else if (elementType === 'fillInTheBlanks') {\r\n dispatch(duplicateFillInTheBlanks(elementId));\r\n } else if (elementType === 'longAnswer') {\r\n dispatch(duplicateLongAnswer(elementId));\r\n }\r\n updatePreview();\r\n break;\r\n\r\n case 'infinite-clone':\r\n dispatch(saveToHistory());\r\n const cloneCount = 5;\r\n for (let i = 0; i < cloneCount; i++) {\r\n if (elementType === 'image') {\r\n dispatch(duplicateImage(elementId));\r\n } else if (elementType === 'video') {\r\n dispatch(duplicateVideo(elementId));\r\n } else if (elementType === 'shape') {\r\n dispatch(duplicateShape(elementId));\r\n } else if (elementType === 'text') {\r\n dispatch(duplicateText(elementId));\r\n } else if (elementType === 'flashcard') {\r\n dispatch(duplicateFlashcard(elementId));\r\n } else if (elementType === 'photoFrame') {\r\n dispatch(duplicatePhotoFrame(elementId));\r\n } else if (elementType === 'mcq') {\r\n dispatch(duplicateMultipleChoice(elementId));\r\n } else if (elementType === 'trueFalse') {\r\n dispatch(duplicateTrueFalse(elementId));\r\n } else if (elementType === 'shortAnswer') {\r\n dispatch(duplicateShortAnswer(elementId));\r\n } else if (elementType === 'fillInTheBlanks') {\r\n dispatch(duplicateFillInTheBlanks(elementId));\r\n } else if (elementType === 'longAnswer') {\r\n dispatch(duplicateLongAnswer(elementId));\r\n }\r\n }\r\n updatePreview();\r\n break;\r\n\r\n case 'make-response':\r\n setContextMenu(null);\r\n if (elementType === 'line') break; // Lines don't support links\r\n\r\n const responseLink = `#response-${elementId}`;\r\n dispatch(saveToHistory());\r\n dispatch(\r\n setLink({\r\n id: elementId,\r\n type: elementType as Exclude<ElementType, 'line'>,\r\n link: responseLink,\r\n })\r\n );\r\n\r\n const currentResponseElement = currentSlide\r\n ? elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === elementId)\r\n : elementType === 'video'\r\n ? currentSlide.videos.find((vid) => vid.id === elementId)\r\n : elementType === 'shape'\r\n ? currentSlide.shapes.find((shape) => shape.id === elementId)\r\n : elementType === 'flashcard'\r\n ? currentSlide.flashcards.find((fc) => fc.id === elementId)\r\n : elementType === 'photoFrame'\r\n ? currentSlide.photoFrames.find((pf) => pf.id === elementId)\r\n : currentSlide.multipleChoices.find((mc) => mc.id === elementId)\r\n : null;\r\n\r\n if (!currentResponseElement?.altText) {\r\n dispatch(\r\n setAltText({\r\n id: elementId,\r\n type: elementType as Exclude<ElementType, 'line'>,\r\n altText: 'Interactive response area',\r\n })\r\n );\r\n }\r\n\r\n updatePreview();\r\n console.log(`Element ${elementId} marked as interactive response area`);\r\n break;\r\n\r\n case 'accessibility':\r\n setContextMenu(null);\r\n if (elementType === 'line') break; // Lines don't support alt text\r\n const currentEl = currentSlide\r\n ? elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === elementId)\r\n : elementType === 'video'\r\n ? currentSlide.videos.find((vid) => vid.id === elementId)\r\n : elementType === 'shape'\r\n ? currentSlide.shapes.find((shape) => shape.id === elementId)\r\n : null\r\n : null;\r\n setDialog({\r\n type: 'altText',\r\n defaultValue: (currentEl as MediaElement)?.altText || '',\r\n });\r\n break;\r\n\r\n case 'layers':\r\n console.log('Layers button clicked, opening panel...');\r\n setContextMenu(null);\r\n setShowLayersPanel(true);\r\n console.log('showLayersPanel state set to:', true);\r\n break;\r\n\r\n case 'delete':\r\n dispatch(saveToHistory());\r\n if (elementType === 'line') {\r\n dispatch(deleteLineById(elementId));\r\n } else if (elementType === 'image') {\r\n dispatch(deleteImage(elementId));\r\n } else if (elementType === 'video') {\r\n dispatch(deleteVideo(elementId));\r\n } else if (elementType === 'shape') {\r\n dispatch(deleteShape(elementId));\r\n } else if (elementType === 'text') {\r\n dispatch(deleteText(elementId));\r\n } else if (elementType === 'flashcard') {\r\n dispatch(deleteFlashcard(elementId));\r\n } else if (elementType === 'photoFrame') {\r\n dispatch(deletePhotoFrame(elementId));\r\n } else if (elementType === 'mcq') {\r\n dispatch(deleteMultipleChoice(elementId));\r\n } else if (elementType === 'trueFalse') {\r\n dispatch(deleteTrueFalse(elementId));\r\n } else if (elementType === 'shortAnswer') {\r\n dispatch(deleteShortAnswer(elementId));\r\n } else if (elementType === 'longAnswer') {\r\n dispatch(deleteLongAnswer(elementId));\r\n } else if (elementType === 'fillInTheBlanks') {\r\n dispatch(deleteFillInTheBlanks(elementId));\r\n }\r\n handleDeselect();\r\n updatePreview();\r\n break;\r\n }\r\n },\r\n [contextMenu, dispatch, updatePreview, handleDeselect, currentSlide, handleEditActivity]\r\n );\r\n\r\n const handleCloseContextMenu = useCallback(() => {\r\n setContextMenu(null);\r\n setSubmenu(null);\r\n }, []);\r\n\r\n const handleSubmenuAction = useCallback(\r\n (action: string) => {\r\n if (!contextMenu) return;\r\n\r\n const { elementId, elementType } = contextMenu;\r\n\r\n dispatch(saveToHistory());\r\n\r\n switch (action) {\r\n case 'bring-to-front':\r\n if (elementType !== 'line') {\r\n dispatch(\r\n bringToFront({ id: elementId, type: elementType as Exclude<ElementType, 'line'> })\r\n );\r\n }\r\n break;\r\n case 'send-to-back':\r\n if (elementType !== 'line') {\r\n dispatch(\r\n sendToBack({ id: elementId, type: elementType as Exclude<ElementType, 'line'> })\r\n );\r\n }\r\n break;\r\n case 'lock':\r\n case 'unlock':\r\n if (elementType !== 'line') {\r\n dispatch(\r\n toggleLock({ id: elementId, type: elementType as Exclude<ElementType, 'line'> })\r\n );\r\n }\r\n break;\r\n }\r\n\r\n updatePreview();\r\n setContextMenu(null);\r\n setSubmenu(null);\r\n },\r\n [contextMenu, dispatch, updatePreview]\r\n );\r\n\r\n const handleDialogSave = useCallback(\r\n (value: string) => {\r\n if (!contextMenu || !dialog) return;\r\n\r\n const { elementId, elementType } = contextMenu;\r\n\r\n dispatch(saveToHistory());\r\n\r\n if (dialog.type === 'link' && elementType !== 'line') {\r\n dispatch(\r\n setLink({ id: elementId, type: elementType as Exclude<ElementType, 'line'>, link: value })\r\n );\r\n } else if (dialog.type === 'altText' && elementType !== 'line') {\r\n dispatch(\r\n setAltText({\r\n id: elementId,\r\n type: elementType as Exclude<ElementType, 'line'>,\r\n altText: value,\r\n })\r\n );\r\n }\r\n\r\n updatePreview();\r\n setDialog(null);\r\n },\r\n [contextMenu, dialog, dispatch, updatePreview]\r\n );\r\n\r\n const handleAudioSave = useCallback(\r\n (audioData: string) => {\r\n if (!showObjectAudioRecorder) return;\r\n\r\n const { elementId, elementType } = showObjectAudioRecorder;\r\n\r\n dispatch(saveToHistory());\r\n dispatch(setAudioData({ id: elementId, type: elementType, audioData }));\r\n\r\n updatePreview();\r\n setShowObjectAudioRecorder(null);\r\n },\r\n [showObjectAudioRecorder, dispatch, updatePreview]\r\n );\r\n\r\n const handleAudioDelete = useCallback(() => {\r\n if (!showObjectAudioRecorder) return;\r\n\r\n const { elementId, elementType } = showObjectAudioRecorder;\r\n\r\n dispatch(saveToHistory());\r\n dispatch(setAudioData({ id: elementId, type: elementType, audioData: '' }));\r\n\r\n updatePreview();\r\n }, [showObjectAudioRecorder, dispatch, updatePreview]);\r\n\r\n const handleColorChange = useCallback(\r\n (color: string) => {\r\n if (!colorPickerDialog) return;\r\n\r\n const { elementId } = colorPickerDialog;\r\n\r\n dispatch(saveToHistory());\r\n dispatch(updateShape({ id: elementId, color }));\r\n\r\n updatePreview();\r\n setColorPickerDialog(null);\r\n },\r\n [colorPickerDialog, dispatch, updatePreview]\r\n );\r\n\r\n const handleCropConfirm = useCallback(\r\n (croppedImageData: string) => {\r\n if (!cropDialog) return;\r\n\r\n const { elementId } = cropDialog;\r\n\r\n dispatch(saveToHistory());\r\n dispatch(updateImage({ id: elementId, src: croppedImageData }));\r\n\r\n updatePreview();\r\n setCropDialog(null);\r\n },\r\n [cropDialog, dispatch, updatePreview]\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className=\"fixed inset-0\"\r\n style={{\r\n cursor: tool === 'pen' ? 'crosshair' : tool === 'eraser' ? '' : 'default',\r\n }}\r\n >\r\n {/* DirectDrawingCanvas only for pen tool - eraser is now click-to-delete (Excalidraw-style) */}\r\n {tool === 'pen' && (\r\n <DirectDrawingCanvas\r\n ref={(ref) => {\r\n directDrawingRef.current = ref;\r\n setCanvasRef(ref);\r\n // Store the actual canvas element for recording\r\n if (ref) {\r\n const canvasElement = ref.getCanvasElement();\r\n if (canvasElement) {\r\n directDrawingCanvasRef.current = canvasElement;\r\n // Notify parent that the canvas is ready\r\n if (onDirectDrawingCanvasReady) {\r\n onDirectDrawingCanvasReady(directDrawingCanvasRef);\r\n }\r\n }\r\n }\r\n }}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n tool={drawingTool}\r\n color={drawingColor}\r\n strokeWidth={drawingStrokeWidth}\r\n isSketchMode={drawingIsSketchMode}\r\n />\r\n )}\r\n <Stage\r\n ref={stageRef}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n onMouseDown={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchStart={handleMouseDown}\r\n onTouchMove={handleMouseMove}\r\n onTouchEnd={handleMouseUp}\r\n >\r\n <Layer listening={false}>\r\n <Rect\r\n x={0}\r\n y={0}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n fill={currentSlide?.backgroundColor || 'white'}\r\n />\r\n </Layer>\r\n <Layer>\r\n {/* Render elements in order of their timestamps (creation order) */}\r\n {(() => {\r\n // Collect all elements with their types and timestamps\r\n const allElements: CanvasElementItem[] = [];\r\n\r\n // Add lines (drawings)\r\n lines.forEach((line, index) => {\r\n allElements.push({\r\n type: 'line',\r\n timestamp: line.timestamp || index,\r\n element: { ...line, id: (line as { id?: string }).id ?? `line-${index}` },\r\n index: index,\r\n });\r\n });\r\n\r\n // Add shapes\r\n shapes.forEach((shape) => {\r\n allElements.push({\r\n type: 'shape',\r\n timestamp: shape.timestamp || 0,\r\n element: shape,\r\n });\r\n });\r\n\r\n // Add images\r\n images.forEach((image) => {\r\n allElements.push({\r\n type: 'image',\r\n timestamp: image.timestamp || 0,\r\n element: image,\r\n });\r\n });\r\n\r\n // Add videos\r\n videos.forEach((video) => {\r\n allElements.push({\r\n type: 'video',\r\n timestamp: video.timestamp || 0,\r\n element: video,\r\n });\r\n });\r\n\r\n // Add texts\r\n texts.forEach((text) => {\r\n allElements.push({\r\n type: 'text',\r\n timestamp: text.timestamp || 0,\r\n element: text,\r\n });\r\n });\r\n\r\n // Add flashcards\r\n flashcards.forEach((flashcard) => {\r\n allElements.push({\r\n type: 'flashcard',\r\n timestamp: flashcard.timestamp || 0,\r\n element: flashcard,\r\n });\r\n });\r\n\r\n // Add photoFrames\r\n photoFrames.forEach((photoFrame) => {\r\n allElements.push({\r\n type: 'photoFrame',\r\n timestamp: photoFrame.timestamp || 0,\r\n element: photoFrame,\r\n });\r\n });\r\n\r\n // Add multipleChoices\r\n multipleChoice.forEach((mcq) => {\r\n allElements.push({\r\n type: 'mcq',\r\n timestamp: mcq.timestamp || 0,\r\n element: mcq,\r\n });\r\n });\r\n\r\n // Add trueFalse\r\n trueFalse.forEach((tf) => {\r\n allElements.push({\r\n type: 'trueFalse',\r\n timestamp: tf.timestamp || 0,\r\n element: tf,\r\n });\r\n });\r\n\r\n // Add shortAnswers\r\n shortAnswers.forEach((sa) => {\r\n allElements.push({\r\n type: 'shortAnswer',\r\n timestamp: sa.timestamp || 0,\r\n element: sa,\r\n });\r\n });\r\n\r\n // Add longAnswers\r\n longAnswers.forEach((la) => {\r\n allElements.push({\r\n type: 'longAnswer',\r\n timestamp: la.timestamp || 0,\r\n element: la,\r\n });\r\n });\r\n\r\n // Add fillInTheBlanks\r\n fillInTheBlanks.forEach((fib) => {\r\n allElements.push({\r\n type: 'fillInTheBlanks',\r\n timestamp: fib.timestamp || 0,\r\n element: fib,\r\n });\r\n });\r\n\r\n // Sort by timestamp (earliest first)\r\n allElements.sort((a, b) => a.timestamp - b.timestamp);\r\n\r\n // Render each element based on its type\r\n return allElements.map((item, index) => {\r\n const key = `${item.type}-${('id' in item.element && item.element.id) || item.index || index}`;\r\n const elementId = 'id' in item.element ? item.element.id : undefined;\r\n const isSelected = elementId && selectedId === elementId;\r\n\r\n switch (item.type) {\r\n case 'line':\r\n const line = item.element as LineElement;\r\n const lineIndex = item.index || 0;\r\n const isEraser = line.tool === 'eraser';\r\n const isPenSketch = line.isSketch && line.tool === 'pen';\r\n const isEraserSketch = line.isSketch && isEraser;\r\n const lineId = line.id || `line-${lineIndex}`;\r\n\r\n // Ensure line has x and y properties\r\n if (line.x === undefined) line.x = 0;\r\n if (line.y === undefined) line.y = 0;\r\n if (line.scaleX === undefined) line.scaleX = 1;\r\n if (line.scaleY === undefined) line.scaleY = 1;\r\n if (line.rotation === undefined) line.rotation = 0;\r\n\r\n // If eraser tool is active, show clickable line for deletion\r\n if (tool === 'eraser') {\r\n return (\r\n <Group\r\n key={key}\r\n x={line.x || 0}\r\n y={line.y || 0}\r\n scaleX={line.scaleX || 1}\r\n scaleY={line.scaleY || 1}\r\n rotation={line.rotation || 0}\r\n >\r\n <Line\r\n points={line.points || []}\r\n stroke={isPenSketch || isEraserSketch ? undefined : line.color}\r\n strokeWidth={isPenSketch || isEraserSketch ? 0 : (line.strokeWidth ?? 0)}\r\n name=\"drawing-line\"\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n fill={\r\n isPenSketch || isEraserSketch\r\n ? isEraser\r\n ? 'black'\r\n : line.color\r\n : undefined\r\n }\r\n closed={isPenSketch || isEraserSketch}\r\n tension={0}\r\n globalCompositeOperation={isEraser ? 'destination-out' : 'source-over'}\r\n listening={true}\r\n onClick={() => {\r\n dispatch(saveToHistory());\r\n dispatch(removeLine(lineIndex));\r\n }}\r\n onTap={() => {\r\n dispatch(saveToHistory());\r\n dispatch(removeLine(lineIndex));\r\n }}\r\n hitStrokeWidth={Math.max(20, (line.strokeWidth ?? 0) * 2)}\r\n onMouseEnter={(e: KonvaEventObject<MouseEvent>) => {\r\n const stage = e.target.getStage();\r\n if (stage) {\r\n stage.container().style.cursor =\r\n \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='%23ff000033' stroke='%23ff0000' stroke-width='2'/%3E%3C/svg%3E\\\") 12 12, pointer\";\r\n }\r\n }}\r\n onMouseLeave={(e: KonvaEventObject<MouseEvent>) => {\r\n const stage = e.target.getStage();\r\n if (stage) {\r\n stage.container().style.cursor =\r\n \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E\\\") 12 12, crosshair\";\r\n }\r\n }}\r\n />\r\n </Group>\r\n );\r\n }\r\n\r\n // Otherwise, wrap in Group for selection and movement\r\n return (\r\n <React.Fragment key={key}>\r\n <Group\r\n id={lineId}\r\n ref={(node) => {\r\n if (node) {\r\n lineRefs.current.set(lineId, node);\r\n } else {\r\n lineRefs.current.delete(lineId);\r\n }\r\n }}\r\n x={line.x || 0}\r\n y={line.y || 0}\r\n scaleX={line.scaleX || 1}\r\n scaleY={line.scaleY || 1}\r\n rotation={line.rotation || 0}\r\n draggable={tool === 'select'}\r\n listening={tool === 'select'}\r\n onClick={() => {\r\n if (tool === 'select') {\r\n console.log('Line clicked:', lineId);\r\n handleSelect(lineId);\r\n }\r\n }}\r\n onTap={() => {\r\n if (tool === 'select') {\r\n console.log('Line tapped:', lineId);\r\n handleSelect(lineId);\r\n }\r\n }}\r\n onDragEnd={(e) => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateLineTransform({\r\n id: lineId,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n scaleX: e.target.scaleX(),\r\n scaleY: e.target.scaleY(),\r\n rotation: e.target.rotation(),\r\n })\r\n );\r\n updatePreview();\r\n }}\r\n onTransformEnd={(e) => {\r\n dispatch(saveToHistory());\r\n dispatch(\r\n updateLineTransform({\r\n id: lineId,\r\n x: e.target.x(),\r\n y: e.target.y(),\r\n scaleX: e.target.scaleX(),\r\n scaleY: e.target.scaleY(),\r\n rotation: e.target.rotation(),\r\n })\r\n );\r\n updatePreview();\r\n }}\r\n onMouseEnter={(e: KonvaEventObject<MouseEvent>) => {\r\n if (tool === 'select') {\r\n const stage = e.target.getStage();\r\n if (stage) {\r\n stage.container().style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onMouseLeave={(e: KonvaEventObject<MouseEvent>) => {\r\n if (tool === 'select') {\r\n const stage = e.target.getStage();\r\n if (stage) {\r\n stage.container().style.cursor = 'default';\r\n }\r\n }\r\n }}\r\n onContextMenu={(e) => {\r\n const evt = e.evt as unknown as React.MouseEvent;\r\n evt.preventDefault();\r\n handleContextMenu(evt, lineId, 'line');\r\n }}\r\n >\r\n <Line\r\n points={line.points || []}\r\n stroke={isPenSketch || isEraserSketch ? undefined : line.color}\r\n strokeWidth={isPenSketch || isEraserSketch ? 0 : (line.strokeWidth ?? 0)}\r\n name=\"drawing-line\"\r\n lineCap=\"round\"\r\n lineJoin=\"round\"\r\n fill={\r\n isPenSketch || isEraserSketch\r\n ? isEraser\r\n ? 'black'\r\n : line.color\r\n : undefined\r\n }\r\n closed={isPenSketch || isEraserSketch}\r\n tension={0}\r\n globalCompositeOperation={isEraser ? 'destination-out' : 'source-over'}\r\n listening={true}\r\n hitStrokeWidth={20}\r\n />\r\n </Group>\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = lineRefs.current.get(selectedId);\r\n console.log(\r\n 'Line Transformer - selectedId:',\r\n selectedId,\r\n 'node found:',\r\n !!selectedNode\r\n );\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n console.log('Line Transformer attached to node');\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={false}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'shape':\r\n return (\r\n <React.Fragment key={key}>\r\n <ShapeLayer\r\n onSelect={handleSelect}\r\n shapes={[item.element as (typeof shapes)[number]]}\r\n shapeRefs={shapeRefs}\r\n handleShapeDragEnd={handleShapeDragEnd}\r\n handleShapeResizeEnd={handleShapeResizeEnd}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = shapeRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'image':\r\n return (\r\n <React.Fragment key={key}>\r\n <ImageLayer\r\n images={[item.element as (typeof images)[number]]}\r\n getLoadedImage={getLoadedImage}\r\n imageRefs={imageRefs}\r\n onDragEnd={handleImageDragEnd}\r\n onTransform={handleImageTransformEnd}\r\n onSelect={handleSelect}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = imageRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'video':\r\n return (\r\n <React.Fragment key={key}>\r\n <VideoLayer\r\n videos={[item.element as (typeof videos)[number]]}\r\n selectedId={selectedId}\r\n videoRefs={videoRefs}\r\n onVideoClick={handleVideoClickWithSelection}\r\n onDragEnd={handleVideoDragEnd}\r\n onTransformEnd={handleVideoTransformEnd}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = videoRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'text':\r\n return (\r\n <React.Fragment key={key}>\r\n <TextLayer\r\n texts={[item.element as (typeof texts)[number]]}\r\n textRefs={textRefs}\r\n onDragEnd={handleTextDragEnd}\r\n onTransformEnd={handleTextTransformEnd}\r\n onSelect={handleSelect}\r\n onContextMenu={handleContextMenu}\r\n onDoubleClick={handleTextDoubleClick}\r\n editingTextId={editingTextId}\r\n editingValue={editingValue}\r\n onEditingChange={handleEditingChange}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = textRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'flashcard':\r\n return (\r\n <React.Fragment key={key}>\r\n <FlashcardLayer\r\n flashcards={[item.element as (typeof flashcards)[number]]}\r\n flashcardRefs={flashcardRefs}\r\n selectedId={selectedId}\r\n onDragEnd={handleFlashcardDragEnd}\r\n onTransform={handleFlashcardTransformEnd}\r\n onSelect={handleSelect}\r\n onNext={handleFlashcardNext}\r\n onPrevious={handleFlashcardPrevious}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = flashcardRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'photoFrame':\r\n return (\r\n <React.Fragment key={key}>\r\n <PhotoFrameLayer\r\n photoFrames={[item.element as (typeof photoFrames)[number]]}\r\n photoFrameRefs={photoFrameRefs}\r\n selectedId={selectedId}\r\n onDragEnd={handlePhotoFrameDragEnd}\r\n onTransform={handlePhotoFrameTransformEnd}\r\n onSelect={handleSelect}\r\n onStartCamera={startCamera}\r\n onCapture={capturePhoto}\r\n cameraStreams={cameraStreams}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = photoFrameRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'mcq':\r\n return (\r\n <React.Fragment key={key}>\r\n <MultipleChoiceLayer\r\n handleMcqTransform={handleMcqTransform}\r\n multipleChoice={[item.element as (typeof multipleChoice)[number]]}\r\n handleSelect={handleSelect}\r\n mcqRefs={mcqRefs}\r\n handleDragEnd={handleMcqDragEnd}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = mcqRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'trueFalse':\r\n return (\r\n <React.Fragment key={key}>\r\n <TrueFalseLayer\r\n trueFalses={[item.element as (typeof trueFalse)[number]]}\r\n handleTrueFalseTransform={handleTrueFalseTransform}\r\n handleSelect={handleSelect}\r\n trueFalseRefs={trueFalseRefs}\r\n onContextMenu={handleContextMenu}\r\n handleDragEnd={handleTrueFalseDragEnd}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = trueFalseRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'shortAnswer':\r\n return (\r\n <React.Fragment key={key}>\r\n <ShortAnswerLayer\r\n shortAnswers={[item.element as (typeof shortAnswers)[number]]}\r\n handleSelect={handleSelect}\r\n handleTransform={handleMcqTransform}\r\n saRefs={saRefs}\r\n onContextMenu={handleContextMenu}\r\n handleDragEnd={handleShortAnswerDragEnd}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = saRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'longAnswer':\r\n return (\r\n <React.Fragment key={key}>\r\n <LongAnswerLayer\r\n longAnswer={[item.element as (typeof longAnswers)[number]]}\r\n handleSelect={handleSelect}\r\n handleTransform={handleMcqTransform}\r\n saRefs={saRefs}\r\n onContextMenu={handleContextMenu}\r\n handleDragEnd={handleLongAnswerDragEnd}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = saRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n case 'fillInTheBlanks':\r\n return (\r\n <React.Fragment key={key}>\r\n <FillInTheBlanksLayer\r\n fillInTheBlanks={[item.element as (typeof fillInTheBlanks)[number]]}\r\n handleSelect={handleSelect}\r\n handleTransform={handleMcqTransform}\r\n onContextMenu={handleContextMenu}\r\n handleDragEnd={handleFillInTheBlanksDragEnd}\r\n />\r\n {isSelected && !editingTextId && selectedId && (\r\n <Transformer\r\n ref={(node) => {\r\n if (node && transformerRef.current !== node) {\r\n transformerRef.current = node;\r\n const selectedNode = saRefs.current.get(selectedId);\r\n if (selectedNode && selectedNode.visible()) {\r\n node.nodes([selectedNode]);\r\n node.getLayer()?.batchDraw();\r\n }\r\n }\r\n }}\r\n boundBoxFunc={boundBoxFunc}\r\n borderStroke=\"#4A90E2\"\r\n borderStrokeWidth={2}\r\n anchorFill=\"#fff\"\r\n anchorStroke=\"#4A90E2\"\r\n anchorStrokeWidth={2}\r\n anchorSize={10}\r\n anchorCornerRadius={2}\r\n rotateEnabled={true}\r\n keepRatio={true}\r\n enabledAnchors={['top-left', 'top-right', 'bottom-left', 'bottom-right']}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n });\r\n })()}\r\n </Layer>\r\n </Stage>\r\n\r\n {previewUrl && !videos.some((v) => v.isRecorded && v.isPlaying) && (\r\n <img\r\n src={previewUrl}\r\n alt=\"Canvas Preview\"\r\n className=\"fixed top-4 right-4 z-50 rounded-lg border-2 border-gray-300 p-1 shadow-lg\"\r\n style={{\r\n maxWidth: '250px',\r\n maxHeight: '250px',\r\n }}\r\n />\r\n )}\r\n\r\n {contextMenu && (\r\n <ContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n type={contextMenu.elementType}\r\n onAction={handleContextMenuAction}\r\n onClose={handleCloseContextMenu}\r\n isDrawingMode={\r\n contextMenu.elementType === 'image'\r\n ? currentSlide?.images.find((img) => img.id === contextMenu.elementId)?.isDrawingMode\r\n : contextMenu.elementType === 'photoFrame'\r\n ? currentSlide?.photoFrames.find((f) => f.id === contextMenu.elementId)\r\n ?.isDrawingMode\r\n : false\r\n }\r\n />\r\n )}\r\n\r\n {submenu && contextMenu && (\r\n <Submenu\r\n x={submenu.x}\r\n y={submenu.y}\r\n items={\r\n submenu.type === 'order'\r\n ? [\r\n { label: 'Bring to Front', onClick: () => handleSubmenuAction('bring-to-front') },\r\n { label: 'Send to Back', onClick: () => handleSubmenuAction('send-to-back') },\r\n ]\r\n : [\r\n {\r\n label: (\r\n currentSlide\r\n ? contextMenu.elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === contextMenu.elementId)\r\n ?.locked\r\n : currentSlide.videos.find((vid) => vid.id === contextMenu.elementId)\r\n ?.locked\r\n : false\r\n )\r\n ? 'Unlock'\r\n : 'Lock',\r\n onClick: () =>\r\n handleSubmenuAction(\r\n (\r\n currentSlide\r\n ? contextMenu.elementType === 'image'\r\n ? currentSlide.images.find((img) => img.id === contextMenu.elementId)\r\n ?.locked\r\n : currentSlide.videos.find((vid) => vid.id === contextMenu.elementId)\r\n ?.locked\r\n : false\r\n )\r\n ? 'unlock'\r\n : 'lock'\r\n ),\r\n },\r\n ]\r\n }\r\n onClose={() => setSubmenu(null)}\r\n />\r\n )}\r\n\r\n {dialog && (\r\n <InputDialog\r\n title={dialog.type === 'link' ? 'Add Link' : 'Add Alt Text'}\r\n label={dialog.type === 'link' ? 'URL' : 'Alternative Text'}\r\n placeholder={dialog.type === 'link' ? 'https://example.com' : 'Describe this image/video'}\r\n defaultValue={dialog.defaultValue}\r\n onSave={handleDialogSave}\r\n onClose={() => setDialog(null)}\r\n />\r\n )}\r\n\r\n {colorPickerDialog && (\r\n <ColorPickerDialog\r\n defaultColor={colorPickerDialog.defaultColor}\r\n onConfirm={handleColorChange}\r\n onCancel={() => setColorPickerDialog(null)}\r\n />\r\n )}\r\n\r\n {cropDialog && (\r\n <CropDialog\r\n imageSrc={cropDialog.imageSrc}\r\n onConfirm={handleCropConfirm}\r\n onCancel={() => setCropDialog(null)}\r\n />\r\n )}\r\n\r\n {showScreenRecorder && (\r\n <ScreenRecorder onClose={() => setShowScreenRecorder(false)} stageRef={stageRef} />\r\n )}\r\n\r\n {showObjectAudioRecorder && (\r\n <ObjectAudioRecorder\r\n elementId={showObjectAudioRecorder.elementId}\r\n elementType={showObjectAudioRecorder.elementType}\r\n existingAudio={showObjectAudioRecorder.existingAudio}\r\n onSave={handleAudioSave}\r\n onDelete={handleAudioDelete}\r\n onClose={() => setShowObjectAudioRecorder(null)}\r\n />\r\n )}\r\n\r\n {showLayersPanel && (\r\n <LayersPanel\r\n selectedElementId={selectedId || undefined}\r\n onClose={() => setShowLayersPanel(false)}\r\n onSelectElement={(id) => {\r\n handleSelect(id);\r\n setShowLayersPanel(false);\r\n }}\r\n />\r\n )}\r\n\r\n {currentSlide?.images\r\n .filter((img) => img.audioData)\r\n .map((img) => (\r\n <AudioIndicator\r\n key={`audio-${img.id}`}\r\n audioData={img.audioData!}\r\n x={img.x}\r\n y={img.y}\r\n width={img.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.videos\r\n .filter((video) => video.audioData)\r\n .map((video) => (\r\n <AudioIndicator\r\n key={`audio-${video.id}`}\r\n audioData={video.audioData!}\r\n x={video.x}\r\n y={video.y}\r\n width={video.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.shapes\r\n ?.filter((shape) => shape.audioData)\r\n .map((shape) => (\r\n <AudioIndicator\r\n key={`audio-${shape.id}`}\r\n audioData={shape.audioData!}\r\n x={shape.x}\r\n y={shape.y}\r\n width={shape.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.texts\r\n ?.filter((text) => text.audioData)\r\n .map((text) => (\r\n <AudioIndicator\r\n key={`audio-${text.id}`}\r\n audioData={text.audioData!}\r\n x={text.x}\r\n y={text.y}\r\n width={text.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.flashcards\r\n ?.filter((fc) => fc.audioData)\r\n .map((fc) => (\r\n <AudioIndicator\r\n key={`audio-${fc.id}`}\r\n audioData={fc.audioData!}\r\n x={fc.x}\r\n y={fc.y}\r\n width={fc.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.photoFrames\r\n ?.filter((pf) => pf.audioData)\r\n .map((pf) => (\r\n <AudioIndicator\r\n key={`audio-${pf.id}`}\r\n audioData={pf.audioData!}\r\n x={pf.x}\r\n y={pf.y}\r\n width={pf.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.multipleChoices\r\n ?.filter((mc) => mc.audioData)\r\n .map((mc) => (\r\n <AudioIndicator\r\n key={`audio-${mc.id}`}\r\n audioData={mc.audioData!}\r\n x={mc.x}\r\n y={mc.y}\r\n width={mc.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.trueFalses\r\n ?.filter((tf) => tf.audioData)\r\n .map((tf) => (\r\n <AudioIndicator\r\n key={`audio-${tf.id}`}\r\n audioData={tf.audioData!}\r\n x={tf.x}\r\n y={tf.y}\r\n width={tf.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.shortAnswers\r\n ?.filter((sa) => sa.audioData)\r\n .map((sa) => (\r\n <AudioIndicator\r\n key={`audio-${sa.id}`}\r\n audioData={sa.audioData!}\r\n x={sa.x}\r\n y={sa.y}\r\n width={sa.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.LongAnswer?.filter((la) => la.audioData).map((la) => (\r\n <AudioIndicator\r\n key={`audio-${la.id}`}\r\n audioData={la.audioData!}\r\n x={la.x}\r\n y={la.y}\r\n width={la.width}\r\n />\r\n ))}\r\n\r\n {currentSlide?.fillInTheBlanks\r\n ?.filter((fib) => fib.audioData)\r\n .map((fib) => (\r\n <AudioIndicator\r\n key={`audio-${fib.id}`}\r\n audioData={fib.audioData!}\r\n x={fib.x}\r\n y={fib.y}\r\n width={fib.width}\r\n />\r\n ))}\r\n\r\n {showMcqForm && <McqForm editElement={editingActivity} />}\r\n\r\n {floatingToolbarPosition &&\r\n (() => {\r\n const textId = editingTextId || selectedId;\r\n if (!textId) return null;\r\n\r\n const selectedText = texts.find((t) => t.id === textId);\r\n if (!selectedText) return null;\r\n\r\n return <FloatingTextToolbar text={selectedText} position={floatingToolbarPosition} />;\r\n })()}\r\n\r\n {editingOverlayPosition &&\r\n editingTextId &&\r\n (() => {\r\n const text = texts.find((t) => t.id === editingTextId);\r\n if (!text) return null;\r\n\r\n return (\r\n <TextEditingArea\r\n key={editingTextId}\r\n text={text}\r\n editingValue={editingValue}\r\n onEditingChange={handleEditingChange}\r\n onFinish={finishEditing}\r\n position={{\r\n top: editingOverlayPosition.top,\r\n left: editingOverlayPosition.left,\r\n }}\r\n scale={editingOverlayPosition.scale}\r\n textareaRef={textareaRef}\r\n />\r\n );\r\n })()}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Canvas;\r\n","const VIDEO_DB_NAME = 'SchooplaVideoStorage';\r\nconst VIDEO_DB_VERSION = 1;\r\nconst VIDEO_STORE_NAME = 'videos';\r\n\r\ninterface VideoStorageEntry {\r\n id: string;\r\n blob: Blob;\r\n thumbnailDataUrl: string;\r\n timestamp: number;\r\n}\r\n\r\nexport const initVideoStorageDB = (): Promise<IDBDatabase> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(VIDEO_DB_NAME, VIDEO_DB_VERSION);\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve(request.result);\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(VIDEO_STORE_NAME)) {\r\n db.createObjectStore(VIDEO_STORE_NAME, { keyPath: 'id' });\r\n }\r\n };\r\n });\r\n};\r\n\r\nexport const saveVideoBlob = async (\r\n id: string,\r\n blob: Blob,\r\n thumbnailDataUrl: string\r\n): Promise<void> => {\r\n try {\r\n console.log('💾 Saving video blob to IndexedDB:', id);\r\n const db = await initVideoStorageDB();\r\n const transaction = db.transaction([VIDEO_STORE_NAME], 'readwrite');\r\n const store = transaction.objectStore(VIDEO_STORE_NAME);\r\n\r\n const entry: VideoStorageEntry = {\r\n id,\r\n blob,\r\n thumbnailDataUrl,\r\n timestamp: Date.now(),\r\n };\r\n\r\n await new Promise((resolve, reject) => {\r\n const request = store.put(entry);\r\n request.onsuccess = () => resolve(true);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n db.close();\r\n console.log('✅ Video blob saved successfully:', id);\r\n } catch (error) {\r\n console.error('Error saving video blob to IndexedDB:', error);\r\n throw error;\r\n }\r\n};\r\n\r\nexport const loadVideoBlob = async (\r\n id: string\r\n): Promise<{ blob: Blob; thumbnailDataUrl: string } | null> => {\r\n try {\r\n console.log('📂 Loading video blob from IndexedDB:', id);\r\n const db = await initVideoStorageDB();\r\n const transaction = db.transaction([VIDEO_STORE_NAME], 'readonly');\r\n const store = transaction.objectStore(VIDEO_STORE_NAME);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.get(id);\r\n request.onsuccess = () => {\r\n db.close();\r\n const entry = request.result as VideoStorageEntry | undefined;\r\n if (entry) {\r\n console.log('✅ Video blob loaded successfully:', id);\r\n resolve({ blob: entry.blob, thumbnailDataUrl: entry.thumbnailDataUrl });\r\n } else {\r\n console.warn('⚠️ Video blob not found:', id);\r\n resolve(null);\r\n }\r\n };\r\n request.onerror = () => {\r\n db.close();\r\n reject(request.error);\r\n };\r\n });\r\n } catch (error) {\r\n console.error('Error loading video blob from IndexedDB:', error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const loadAllVideoBlobs = async (): Promise<\r\n Map<string, { blob: Blob; thumbnailDataUrl: string }>\r\n> => {\r\n try {\r\n console.log('📂 Loading all video blobs from IndexedDB...');\r\n const db = await initVideoStorageDB();\r\n const transaction = db.transaction([VIDEO_STORE_NAME], 'readonly');\r\n const store = transaction.objectStore(VIDEO_STORE_NAME);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.getAll();\r\n request.onsuccess = () => {\r\n db.close();\r\n const entries = request.result as VideoStorageEntry[];\r\n const videoMap = new Map<string, { blob: Blob; thumbnailDataUrl: string }>();\r\n\r\n entries.forEach((entry) => {\r\n videoMap.set(entry.id, {\r\n blob: entry.blob,\r\n thumbnailDataUrl: entry.thumbnailDataUrl,\r\n });\r\n });\r\n\r\n console.log(`✅ Loaded ${videoMap.size} video blobs from IndexedDB`);\r\n resolve(videoMap);\r\n };\r\n request.onerror = () => {\r\n db.close();\r\n reject(request.error);\r\n };\r\n });\r\n } catch (error) {\r\n console.error('Error loading all video blobs from IndexedDB:', error);\r\n return new Map();\r\n }\r\n};\r\n\r\nexport const deleteVideoBlob = async (id: string): Promise<void> => {\r\n try {\r\n console.log('🗑️ Deleting video blob from IndexedDB:', id);\r\n const db = await initVideoStorageDB();\r\n const transaction = db.transaction([VIDEO_STORE_NAME], 'readwrite');\r\n const store = transaction.objectStore(VIDEO_STORE_NAME);\r\n\r\n await new Promise((resolve, reject) => {\r\n const request = store.delete(id);\r\n request.onsuccess = () => resolve(true);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n db.close();\r\n console.log('✅ Video blob deleted successfully:', id);\r\n } catch (error) {\r\n console.error('Error deleting video blob from IndexedDB:', error);\r\n throw error;\r\n }\r\n};\r\n\r\nexport const clearAllVideoBlobs = async (): Promise<void> => {\r\n try {\r\n console.log('🗑️ Clearing all video blobs from IndexedDB...');\r\n const db = await initVideoStorageDB();\r\n const transaction = db.transaction([VIDEO_STORE_NAME], 'readwrite');\r\n const store = transaction.objectStore(VIDEO_STORE_NAME);\r\n\r\n await new Promise((resolve, reject) => {\r\n const request = store.clear();\r\n request.onsuccess = () => resolve(true);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n db.close();\r\n console.log('✅ All video blobs cleared successfully');\r\n } catch (error) {\r\n console.error('Error clearing video blobs from IndexedDB:', error);\r\n throw error;\r\n }\r\n};\r\n\r\nexport const createVideoObjectURL = (blob: Blob): string => {\r\n return URL.createObjectURL(blob);\r\n};\r\n\r\nexport const revokeVideoObjectURL = (objectUrl: string): void => {\r\n if (objectUrl && objectUrl.startsWith('blob:')) {\r\n URL.revokeObjectURL(objectUrl);\r\n }\r\n};\r\n\r\nexport const getVideoBlobForUpload = async (id: string): Promise<Blob | null> => {\r\n const result = await loadVideoBlob(id);\r\n return result ? result.blob : null;\r\n};\r\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\n\r\nexport type ToolbarState = {\r\n selectedTool: string;\r\n penColor: string;\r\n strokeWidth: number;\r\n fontSize: number;\r\n fontFamily: string;\r\n fontStyle: string;\r\n fontWeight: string;\r\n textDecoration: string;\r\n textColor: string;\r\n};\r\n\r\nconst initialState: ToolbarState = {\r\n selectedTool: 'select',\r\n penColor: '#000000',\r\n strokeWidth: 12,\r\n fontSize: 24,\r\n fontFamily: 'Arial',\r\n fontStyle: 'normal',\r\n fontWeight: 'normal',\r\n textDecoration: '',\r\n textColor: '#000000',\r\n};\r\n\r\nconst toolbarSlice = createSlice({\r\n name: 'toolbar',\r\n initialState,\r\n reducers: {\r\n setTool: (state, action: PayloadAction<string>) => {\r\n state.selectedTool = action.payload;\r\n },\r\n setPenColor: (state, action: PayloadAction<string>) => {\r\n state.penColor = action.payload;\r\n },\r\n setStrokeWidth: (state, action: PayloadAction<number>) => {\r\n state.strokeWidth = action.payload;\r\n },\r\n setFontSize: (state, action: PayloadAction<number>) => {\r\n state.fontSize = action.payload;\r\n },\r\n setFontFamily: (state, action: PayloadAction<string>) => {\r\n state.fontFamily = action.payload;\r\n },\r\n setFontStyle: (state, action: PayloadAction<string>) => {\r\n state.fontStyle = action.payload;\r\n },\r\n setFontWeight: (state, action: PayloadAction<string>) => {\r\n state.fontWeight = action.payload;\r\n },\r\n setTextDecoration: (state, action: PayloadAction<string>) => {\r\n state.textDecoration = action.payload;\r\n },\r\n setTextColor: (state, action: PayloadAction<string>) => {\r\n state.textColor = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setTool,\r\n setPenColor,\r\n setStrokeWidth,\r\n setFontSize,\r\n setFontFamily,\r\n setFontStyle,\r\n setFontWeight,\r\n setTextDecoration,\r\n setTextColor,\r\n} = toolbarSlice.actions;\r\nexport default toolbarSlice.reducer;\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { X, Record, Stop, Download } from '@phosphor-icons/react/dist/ssr';\r\n\r\ntype CameraRecorderProps = {\r\n onClose: () => void;\r\n onRecordingComplete?: (videoBlob: Blob, thumbnailDataUrl: string) => void;\r\n};\r\n\r\nexport const CameraRecorder: React.FC<CameraRecorderProps> = ({ onClose, onRecordingComplete }) => {\r\n const [isRecording, setIsRecording] = useState(false);\r\n const [recordedBlob, setRecordedBlob] = useState<Blob | null>(null);\r\n const [recordingTime, setRecordingTime] = useState(0);\r\n const [cameraStream, setCameraStream] = useState<MediaStream | null>(null);\r\n const [isCameraReady, setIsCameraReady] = useState(false);\r\n\r\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\r\n const chunksRef = useRef<Blob[]>([]);\r\n const timerRef = useRef<NodeJS.Timeout | null>(null);\r\n const canvasThumbnailRef = useRef<string | null>(null);\r\n const cameraVideoRef = useRef<HTMLVideoElement | null>(null);\r\n\r\n // Initialize camera preview on mount\r\n useEffect(() => {\r\n const startCameraPreview = async () => {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n width: { ideal: 320 },\r\n height: { ideal: 240 },\r\n facingMode: 'user',\r\n },\r\n audio: false,\r\n });\r\n setCameraStream(stream);\r\n setIsCameraReady(true);\r\n\r\n // Attach stream to video element for preview\r\n if (cameraVideoRef.current) {\r\n cameraVideoRef.current.srcObject = stream;\r\n }\r\n } catch (error) {\r\n console.error('Error accessing camera:', error);\r\n alert('Failed to access camera. Please grant camera permission.');\r\n }\r\n };\r\n\r\n startCameraPreview();\r\n\r\n // Cleanup on unmount\r\n return () => {\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n if (cameraStream) {\r\n cameraStream.getTracks().forEach((track) => track.stop());\r\n }\r\n };\r\n }, []);\r\n\r\n const stopCamera = () => {\r\n if (cameraStream) {\r\n cameraStream.getTracks().forEach((track) => track.stop());\r\n setCameraStream(null);\r\n setIsCameraReady(false);\r\n }\r\n };\r\n\r\n const startRecording = async () => {\r\n try {\r\n let videoCameraStream: MediaStream | null = null;\r\n let audioStream: MediaStream | null = null;\r\n\r\n // Get camera stream for recording\r\n try {\r\n videoCameraStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n facingMode: 'user',\r\n },\r\n audio: false,\r\n });\r\n } catch (error) {\r\n console.error('Error accessing camera for recording:', error);\r\n alert('Failed to access camera for recording.');\r\n return;\r\n }\r\n\r\n // Get microphone audio\r\n try {\r\n audioStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n },\r\n });\r\n } catch (audioError) {\r\n console.warn('Microphone access denied:', audioError);\r\n }\r\n\r\n // Combine camera video + audio tracks\r\n const tracks = [...videoCameraStream.getVideoTracks()];\r\n if (audioStream) {\r\n tracks.push(...audioStream.getAudioTracks());\r\n }\r\n\r\n const finalStream = new MediaStream(tracks);\r\n\r\n // Choose mime type\r\n let mimeType = 'video/webm';\r\n if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9,opus')) {\r\n mimeType = 'video/webm;codecs=vp9,opus';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8,opus')) {\r\n mimeType = 'video/webm;codecs=vp8,opus';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {\r\n mimeType = 'video/webm;codecs=vp9';\r\n } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {\r\n mimeType = 'video/webm;codecs=vp8';\r\n }\r\n\r\n const mediaRecorder = new MediaRecorder(finalStream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 2500000, // 2.5 Mbps\r\n });\r\n\r\n mediaRecorderRef.current = mediaRecorder;\r\n chunksRef.current = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunksRef.current.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n const blob = new Blob(chunksRef.current, { type: mimeType });\r\n\r\n // Create thumbnail from video (first frame)\r\n const video = document.createElement('video');\r\n video.src = URL.createObjectURL(blob);\r\n video.muted = true;\r\n video.currentTime = 0.1;\r\n\r\n video.onseeked = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(video, 0, 0);\r\n canvasThumbnailRef.current = canvas.toDataURL('image/jpeg', 0.8);\r\n }\r\n URL.revokeObjectURL(video.src);\r\n };\r\n\r\n // Stop all streams\r\n finalStream.getTracks().forEach((track) => track.stop());\r\n if (videoCameraStream) {\r\n videoCameraStream.getTracks().forEach((track) => track.stop());\r\n }\r\n if (audioStream) {\r\n audioStream.getTracks().forEach((track) => track.stop());\r\n }\r\n\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n }\r\n\r\n setRecordedBlob(blob);\r\n\r\n // Stop the preview camera stream as well\r\n stopCamera();\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n console.error('MediaRecorder error:', event);\r\n };\r\n\r\n // Start recording\r\n mediaRecorder.start(1000);\r\n setIsRecording(true);\r\n setRecordingTime(0);\r\n\r\n timerRef.current = setInterval(() => {\r\n setRecordingTime((prev) => prev + 1);\r\n }, 1000);\r\n } catch (error) {\r\n console.error('Error starting camera recording:', error);\r\n alert('Failed to start recording. Please check permissions.');\r\n }\r\n };\r\n\r\n const stopRecording = () => {\r\n if (mediaRecorderRef.current && isRecording) {\r\n if (mediaRecorderRef.current.state !== 'inactive') {\r\n mediaRecorderRef.current.requestData();\r\n setTimeout(() => {\r\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {\r\n mediaRecorderRef.current.stop();\r\n }\r\n }, 100);\r\n }\r\n setIsRecording(false);\r\n }\r\n };\r\n\r\n const downloadRecording = () => {\r\n if (recordedBlob) {\r\n const url = URL.createObjectURL(recordedBlob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `camera-recording-${Date.now()}.webm`;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n\r\n const formatTime = (seconds: number) => {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 flex items-center justify-center\">\r\n <div className=\"relative w-full max-w-2xl overflow-hidden rounded-2xl shadow-2xl\">\r\n {/* Close button */}\r\n <button\r\n onClick={onClose}\r\n className=\"absolute top-4 right-4 z-10 rounded-full bg-white/90 p-2 text-gray-600 transition-colors hover:bg-white hover:text-gray-900\"\r\n >\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n\r\n {/* Camera Preview Box */}\r\n <div className=\"relative aspect-video bg-gray-900\">\r\n {!recordedBlob && (\r\n <>\r\n {/* Camera preview */}\r\n <video\r\n ref={cameraVideoRef}\r\n autoPlay\r\n muted\r\n playsInline\r\n className=\"h-full w-full object-cover\"\r\n />\r\n\r\n {/* Center button - Start Recording (shown when NOT recording) */}\r\n {!isRecording && (\r\n <>\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <button\r\n onClick={startRecording}\r\n disabled={!isCameraReady}\r\n className=\"flex h-20 w-20 items-center justify-center rounded-full bg-blue-500 text-white shadow-2xl transition-all hover:scale-110 hover:bg-blue-600 disabled:cursor-not-allowed disabled:opacity-50\"\r\n >\r\n <Record className=\"h-10 w-10\" weight=\"fill\" />\r\n </button>\r\n </div>\r\n\r\n {/* Helper text */}\r\n {!isCameraReady && (\r\n <div className=\"absolute top-1/3 left-1/2 -translate-x-1/2 text-center\">\r\n <p className=\"text-lg font-medium text-white\">Click to start camera</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Stop Recording button (shown when recording) */}\r\n {isRecording && (\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <button\r\n onClick={stopRecording}\r\n className=\"flex h-20 w-20 items-center justify-center rounded-full bg-red-600 text-white shadow-2xl transition-all hover:scale-110 hover:bg-red-700\"\r\n >\r\n <Stop className=\"h-10 w-10\" weight=\"fill\" />\r\n </button>\r\n\r\n {/* Recording timer */}\r\n <div className=\"absolute top-6 left-1/2 flex -translate-x-1/2 items-center gap-2 rounded-full bg-black/70 px-4 py-2 backdrop-blur-sm\">\r\n <div className=\"h-2 w-2 animate-pulse rounded-full bg-red-600\"></div>\r\n <span className=\"font-mono text-sm font-semibold text-white\">\r\n {formatTime(recordingTime)}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {recordedBlob && (\r\n <>\r\n {/* Video Preview */}\r\n <video\r\n src={URL.createObjectURL(recordedBlob)}\r\n controls\r\n className=\"h-full w-full object-cover\"\r\n />\r\n\r\n {/* Action Buttons Overlay */}\r\n <div className=\"absolute right-0 bottom-0 left-0 bg-linear-to-t from-black/80 via-black/50 to-transparent p-6\">\r\n <p className=\"mb-3 text-center text-sm text-white/80\">\r\n Duration: {formatTime(recordingTime)}\r\n </p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => {\r\n setRecordedBlob(null);\r\n setRecordingTime(0);\r\n }}\r\n className=\"flex-1 rounded-lg border-2 border-white/30 bg-white/10 px-4 py-2 text-sm font-medium text-white backdrop-blur-sm transition-colors hover:bg-white/20\"\r\n >\r\n Re-record\r\n </button>\r\n <button\r\n onClick={downloadRecording}\r\n className=\"flex flex-1 items-center justify-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-white transition-colors hover:bg-blue-700\"\r\n >\r\n <Download className=\"h-4 w-4\" />\r\n Download\r\n </button>\r\n <button\r\n onClick={() => {\r\n if (onRecordingComplete && recordedBlob && canvasThumbnailRef.current) {\r\n onRecordingComplete(recordedBlob, canvasThumbnailRef.current);\r\n onClose();\r\n }\r\n }}\r\n className=\"flex flex-1 items-center justify-center gap-2 rounded-lg bg-green-600 px-4 py-2 text-white transition-colors hover:bg-green-700\"\r\n >\r\n Add to Canvas\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport {\r\n X,\r\n Image as ImageIcon,\r\n Trash,\r\n Shuffle,\r\n ArrowsDownUp,\r\n Warning,\r\n} from '@phosphor-icons/react/dist/ssr';\r\nimport { FlashcardElement as Flashcard } from '@/store/slices/canvasSlice';\r\nconst MAX_IMAGES = 40;\r\n\r\ntype FlashcardConfigDialogProps = {\r\n onConfirm: (images: string[], order: 'sequential' | 'random', flashCardId?: string) => void;\r\n onCancel: () => void;\r\n editingFlashcard?: Flashcard | null;\r\n};\r\n\r\nexport const FlashcardConfigDialog: React.FC<FlashcardConfigDialogProps> = ({\r\n onConfirm,\r\n onCancel,\r\n editingFlashcard,\r\n}) => {\r\n const [images, setImages] = useState<string[]>(editingFlashcard?.images || []);\r\n const [order, setOrder] = useState<'sequential' | 'random'>(\r\n editingFlashcard?.order || 'sequential'\r\n );\r\n const [isDragging, setIsDragging] = useState(false);\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onCancel();\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, [onCancel]);\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n const remainingSlots = MAX_IMAGES - images.length;\r\n if (remainingSlots <= 0) {\r\n alert(`You can only upload a maximum of ${MAX_IMAGES} images`);\r\n return;\r\n }\r\n\r\n const fileArray = Array.from(files).slice(0, remainingSlots);\r\n if (fileArray.length < files.length) {\r\n alert(`Only ${remainingSlots} more images can be added (max ${MAX_IMAGES} total)`);\r\n }\r\n\r\n const readers = fileArray.map((file) => {\r\n return new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (event.target?.result) {\r\n resolve(event.target.result as string);\r\n } else {\r\n reject(new Error('Failed to read file'));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n\r\n Promise.all(readers).then((dataUrls) => {\r\n setImages((prev) => [...prev, ...dataUrls]);\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n });\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n\r\n const files = Array.from(e.dataTransfer.files).filter((file) => file.type.startsWith('image/'));\r\n if (files.length === 0) return;\r\n\r\n const remainingSlots = MAX_IMAGES - images.length;\r\n if (remainingSlots <= 0) {\r\n alert(`You can only upload a maximum of ${MAX_IMAGES} images`);\r\n return;\r\n }\r\n\r\n const filesToAdd = files.slice(0, remainingSlots);\r\n if (filesToAdd.length < files.length) {\r\n alert(`Only ${remainingSlots} more images can be added (max ${MAX_IMAGES} total)`);\r\n }\r\n\r\n const readers = filesToAdd.map((file) => {\r\n return new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (event.target?.result) {\r\n resolve(event.target.result as string);\r\n } else {\r\n reject(new Error('Failed to read file'));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n\r\n Promise.all(readers).then((dataUrls) => {\r\n setImages((prev) => [...prev, ...dataUrls]);\r\n });\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = () => {\r\n setIsDragging(false);\r\n };\r\n\r\n const handleRemoveImage = (index: number) => {\r\n setImages((prev) => prev.filter((_, i) => i !== index));\r\n };\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (images.length < 2) {\r\n alert('Please upload at least 2 images for the flashcard');\r\n return;\r\n }\r\n onConfirm(images, order, editingFlashcard?.id);\r\n };\r\n\r\n const dialogContent = (\r\n <div\r\n className=\"pointer-events-none fixed inset-0 z-100 flex items-center justify-center bg-black/50\"\r\n onMouseDown={(e) => {\r\n if (e.target === e.currentTarget) {\r\n onCancel();\r\n }\r\n e.stopPropagation();\r\n }}\r\n onMouseUp={(e) => e.stopPropagation()}\r\n onMouseMove={(e) => e.stopPropagation()}\r\n onTouchStart={(e) => e.stopPropagation()}\r\n onTouchMove={(e) => e.stopPropagation()}\r\n onTouchEnd={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n ref={dialogRef}\r\n className=\"pointer-events-auto max-h-[90vh] w-[650px] max-w-[90vw] overflow-hidden rounded-lg border border-gray-300 bg-white shadow-xl\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n <div className=\"border-b border-gray-200 px-6 py-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-black\">\r\n {editingFlashcard ? 'Edit Flashcard' : 'Create Flashcard'}\r\n </h3>\r\n <button onClick={onCancel} className=\"cursor-pointer text-black\">\r\n <X size={20} weight=\"bold\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <form\r\n onSubmit={handleSubmit}\r\n className=\"overflow-y-auto p-6\"\r\n style={{ maxHeight: 'calc(90vh - 140px)' }}\r\n >\r\n <div className=\"space-y-6\">\r\n {/* Upload Section */}\r\n <div>\r\n <label className=\"mb-2 flex items-center justify-between text-sm font-medium text-gray-900\">\r\n <span className=\"flex items-center gap-2\">\r\n <ImageIcon size={16} className=\"text-gray-900\" />\r\n Upload Images\r\n </span>\r\n <span className=\"flex items-center gap-1 rounded bg-gray-100 px-2 py-0.5 text-xs text-gray-600\">\r\n {images.length >= MAX_IMAGES ? (\r\n <span className=\"flex items-center gap-1 text-amber-600\">\r\n <Warning size={12} weight=\"fill\" />\r\n Max {MAX_IMAGES} images\r\n </span>\r\n ) : (\r\n <span>\r\n {images.length}/{MAX_IMAGES} images\r\n </span>\r\n )}\r\n </span>\r\n </label>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n multiple\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n id=\"flashcard-file-input\"\r\n />\r\n <label\r\n htmlFor=\"flashcard-file-input\"\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n className={`flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed px-6 py-8 transition-colors ${\r\n isDragging\r\n ? 'border-black bg-gray-50'\r\n : 'border-gray-300 bg-white hover:border-gray-400 hover:bg-gray-50'\r\n }`}\r\n >\r\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full border border-gray-300 bg-gray-100\">\r\n <ImageIcon size={24} className=\"text-gray-600\" />\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-sm font-medium text-gray-900\">\r\n {isDragging ? 'Drop your images here' : 'Click to upload or drag & drop'}\r\n </p>\r\n <p className=\"mt-1 text-xs text-gray-500\">PNG, JPG, GIF up to 10MB each</p>\r\n </div>\r\n </label>\r\n </div>\r\n\r\n {/* Order Selection */}\r\n <div>\r\n <label className=\"mb-2 flex items-center gap-2 text-sm font-medium text-gray-900\">\r\n <ArrowsDownUp size={16} className=\"text-gray-900\" />\r\n Display Order\r\n </label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setOrder('sequential')}\r\n className={`cursor-pointer rounded-lg border-2 p-4 transition-all ${\r\n order === 'sequential'\r\n ? 'border-black text-black'\r\n : 'border-gray-300 bg-white text-gray-900 hover:border-gray-400'\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center gap-2\">\r\n <ArrowsDownUp size={20} />\r\n <div className=\"text-center\">\r\n <p className=\"text-sm font-medium\">Sequential</p>\r\n <p className=\"mt-0.5 text-xs opacity-70\">Navigate in order</p>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setOrder('random')}\r\n className={`cursor-pointer rounded-lg border-2 p-4 transition-all ${\r\n order === 'random'\r\n ? 'border-black text-black'\r\n : 'border-gray-300 bg-white text-gray-900 hover:border-gray-400'\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center gap-2\">\r\n <Shuffle size={20} />\r\n <div className=\"text-center\">\r\n <p className=\"text-sm font-medium\">Random</p>\r\n <p className=\"mt-0.5 text-xs opacity-70\">Shuffle cards</p>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image Preview Grid */}\r\n {images.length > 0 && (\r\n <div>\r\n <label className=\"mb-2 flex items-center justify-between text-sm font-medium text-gray-900\">\r\n <span>Your Cards</span>\r\n <span className=\"rounded bg-black px-2 py-0.5 text-xs text-white\">\r\n {images.length} card{images.length !== 1 ? 's' : ''}\r\n </span>\r\n </label>\r\n <div className=\"grid max-h-72 grid-cols-3 gap-3 overflow-y-auto rounded-lg border border-gray-200 bg-gray-50 p-3\">\r\n {images.map((imgSrc, index) => (\r\n <div\r\n key={index}\r\n className=\"group relative aspect-square overflow-hidden rounded border border-gray-300 bg-white\"\r\n >\r\n <img\r\n src={imgSrc}\r\n alt={`Flashcard ${index + 1}`}\r\n className=\"h-full w-full object-cover\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRemoveImage(index)}\r\n className=\"absolute top-1 right-1 rounded bg-black p-1 text-white opacity-0 transition-opacity group-hover:opacity-100 hover:bg-gray-800\"\r\n >\r\n <Trash size={12} weight=\"bold\" />\r\n </button>\r\n <div className=\"absolute bottom-1 left-1 flex h-5 w-5 items-center justify-center rounded bg-black text-xs font-medium text-white opacity-0 transition-opacity group-hover:opacity-100\">\r\n {index + 1}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Info Message */}\r\n {images.length < 2 && (\r\n <div className=\"rounded-lg border border-gray-300 bg-gray-50 px-4 py-3\">\r\n <p className=\"text-sm text-gray-700\">\r\n Upload at least 2 images to create your flashcard deck\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"mt-6 flex gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n className=\"flex-1 rounded-lg border border-gray-300 bg-white px-4 py-2.5 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={images.length < 2}\r\n className=\"flex-1 rounded-lg bg-black px-4 py-2.5 text-sm font-medium text-white transition-colors hover:bg-gray-800 disabled:cursor-not-allowed disabled:bg-gray-300 disabled:text-gray-500\"\r\n >\r\n {editingFlashcard ? 'Save Changes' : 'Create Flashcard'}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n\r\n return createPortal(dialogContent, document.body);\r\n};\r\n","'use client';\r\nimport { useDispatch, useSelector } from '@/store/hooks';\r\nimport { useState } from 'react';\r\nimport Konva from 'konva';\r\nimport { saveVideoBlob } from '@/utils/videoStorage';\r\n\r\nimport { setTool, setPenColor, setStrokeWidth } from '@/store/slices/toolbarSlice';\r\nimport {\r\n Shape,\r\n clearCanvas,\r\n undo,\r\n redo,\r\n addImage,\r\n addVideo,\r\n addShape,\r\n addText,\r\n addFlashcard,\r\n updateFlashcard,\r\n addPhotoFrame,\r\n saveToHistory,\r\n setSketchMode,\r\n setBackgroundColor,\r\n setShowMcqForm,\r\n setShowFlashcardForm,\r\n setEditingTextId,\r\n setEditingActivity,\r\n setActivityType,\r\n editFlashcard,\r\n} from '@/store/slices/canvasSlice';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { ScreenRecorder } from '@/components/ui/ScreenRecorder';\r\nimport { CameraRecorder } from '@/components/ui/CameraRecorder';\r\nimport { FlashcardConfigDialog } from '@/components/ui/FlashcardConfigDialog';\r\n\r\n// icons\r\nimport {\r\n ArrowUDownRight,\r\n ArrowUUpLeft,\r\n Eraser,\r\n Image as ImageIcon,\r\n Pen,\r\n Star,\r\n Trash,\r\n Video,\r\n Square,\r\n Circle,\r\n Triangle,\r\n ArrowRight,\r\n Hexagon,\r\n Pizza,\r\n LineSegment,\r\n Circuitry,\r\n Record,\r\n Cards,\r\n Camera,\r\n ListChecksIcon,\r\n TextT,\r\n List,\r\n ToggleRight,\r\n Textbox,\r\n Article,\r\n TextUnderline,\r\n Selection,\r\n} from '@phosphor-icons/react/dist/ssr';\r\n\r\nexport type ToolbarProps = {\r\n isOpen?: boolean;\r\n onClose?: () => void;\r\n onScreenRecord?: () => void;\r\n stageRef?: React.RefObject<Konva.Stage | null>;\r\n onTextAdded?: (textId: string) => void;\r\n showToggleButton?: boolean;\r\n};\r\n\r\nconst Toolbar = ({\r\n isOpen: isOpenProp,\r\n onClose,\r\n onScreenRecord,\r\n stageRef,\r\n onTextAdded,\r\n showToggleButton = true, // Show toggle button by default\r\n}: ToolbarProps = {}) => {\r\n const dispatch = useDispatch();\r\n const currentSlide = useSelector((state) => {\r\n return state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId);\r\n });\r\n const videos = currentSlide?.videos || [];\r\n const editingFlashCard = currentSlide?.editingFlashcard;\r\n const tool = useSelector((state) => state.toolbar.selectedTool);\r\n const color = useSelector((state) => state.toolbar.penColor);\r\n const strokeWidth = useSelector((state) => state.toolbar.strokeWidth);\r\n const showMcqForm = currentSlide?.showMcqForm;\r\n const showFlashcardForm = currentSlide?.showFlashcardForm;\r\n const backgroundColor = currentSlide?.backgroundColor || '#ffffff';\r\n\r\n // Check if ANY recorded video is playing (to hide UI)\r\n const isAnyRecordedVideoPlaying = videos.some((v) => v.isRecorded && v.isPlaying);\r\n // Text formatting state - for default values when adding new text\r\n const fontSize = useSelector((state) => state.toolbar.fontSize);\r\n const fontFamily = useSelector((state) => state.toolbar.fontFamily);\r\n const fontStyle = useSelector((state) => state.toolbar.fontStyle);\r\n const fontWeight = useSelector((state) => state.toolbar.fontWeight);\r\n const textDecoration = useSelector((state) => state.toolbar.textDecoration);\r\n const textColor = useSelector((state) => state.toolbar.textColor);\r\n const [showScreenRecorder, setShowScreenRecorder] = useState(false);\r\n const [showCameraRecorder, setShowCameraRecorder] = useState(false);\r\n // const [showFlashcardDialog, setShowFlashcardDialog] = useState(false);\r\n\r\n // Internal state for toolbar visibility (if not controlled by parent)\r\n const [internalIsOpen, setInternalIsOpen] = useState(true);\r\n const isOpen = isOpenProp !== undefined ? isOpenProp : internalIsOpen;\r\n\r\n const handleToggle = () => {\r\n if (onClose && isOpen) {\r\n onClose();\r\n } else if (isOpenProp === undefined) {\r\n setInternalIsOpen(!internalIsOpen);\r\n }\r\n };\r\n\r\n // Convert HSL to HEX\r\n const hslToHex = (h: number, s: number, l: number) => {\r\n l /= 100;\r\n const a = (s * Math.min(l, 1 - l)) / 100;\r\n const f = (n: number) => {\r\n const k = (n + h / 30) % 12;\r\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\r\n return Math.round(255 * color)\r\n .toString(16)\r\n .padStart(2, '0');\r\n };\r\n return `#${f(0)}${f(8)}${f(4)}`;\r\n };\r\n\r\n const tools = [\r\n {\r\n name: 'select',\r\n icon: <Selection size={20} weight=\"bold\" />,\r\n label: 'Select',\r\n },\r\n { name: 'pen', icon: <Pen size={20} weight=\"bold\" />, label: 'Pen' },\r\n { name: 'eraser', icon: <Eraser size={20} weight=\"bold\" />, label: 'Eraser' },\r\n { name: 'text', icon: <TextT size={20} weight=\"bold\" />, label: 'Text' },\r\n ];\r\n\r\n // New shape tools\r\n const shapes = [\r\n { name: 'rectangle', icon: <Square size={20} weight=\"bold\" />, label: 'Rect' },\r\n { name: 'circle', icon: <Circle size={20} weight=\"bold\" />, label: 'Circle' },\r\n {\r\n name: 'ellipse',\r\n icon: <Circle size={20} weight=\"bold\" style={{ transform: 'scaleX(0.6)' }} />,\r\n label: 'Ellipse',\r\n },\r\n { name: 'triangle', icon: <Triangle size={20} weight=\"bold\" />, label: 'Tri' },\r\n { name: 'polygon', icon: <Hexagon size={20} weight=\"bold\" />, label: 'Hex' },\r\n { name: 'star', icon: <Star size={20} weight=\"bold\" />, label: 'Star' },\r\n { name: 'ring', icon: <Circle size={20} weight=\"bold\" />, label: 'Ring' },\r\n { name: 'wedge', icon: <Pizza size={20} weight=\"bold\" />, label: 'Wedge' },\r\n { name: 'arrow', icon: <ArrowRight size={20} weight=\"bold\" />, label: 'Arrow' },\r\n { name: 'line', icon: <LineSegment size={20} weight=\"bold\" />, label: 'Line' },\r\n { name: 'arc', icon: <Circuitry size={20} weight=\"bold\" />, label: 'Arc' },\r\n ];\r\n\r\n const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n // Switch to select tool when adding images\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n\r\n Array.from(files).forEach((file) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n const img = new window.Image();\r\n img.src = event.target?.result as string;\r\n\r\n img.onload = () => {\r\n const aspectRatio = img.width / img.height;\r\n const maxWidth = 300;\r\n const maxHeight = 300;\r\n\r\n let width = img.width;\r\n let height = img.height;\r\n\r\n if (width > maxWidth) {\r\n width = maxWidth;\r\n height = width / aspectRatio;\r\n }\r\n\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n width = height * aspectRatio;\r\n }\r\n\r\n // Save history before adding image\r\n dispatch(saveToHistory());\r\n\r\n // Center the image on the canvas\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n dispatch(\r\n addImage({\r\n id: uuidv4(),\r\n src: img.src,\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n draggable: true,\r\n rotation: 0,\r\n })\r\n );\r\n };\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n\r\n e.target.value = '';\r\n };\r\n\r\n const handleVideoUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (!files || files.length === 0) return;\r\n console.log('files', e);\r\n\r\n // Switch to select tool when adding videos\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n\r\n for (const file of Array.from(files)) {\r\n try {\r\n const objectUrl = URL.createObjectURL(file);\r\n const video = document.createElement('video');\r\n console.log('video', video);\r\n video.src = objectUrl;\r\n video.muted = true;\r\n video.playsInline = true;\r\n video.preload = 'auto';\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timeout = setTimeout(() => reject(new Error('Metadata load timeout')), 10000);\r\n video.onloadedmetadata = () => {\r\n clearTimeout(timeout);\r\n resolve();\r\n };\r\n video.onerror = () => {\r\n clearTimeout(timeout);\r\n reject(new Error('Failed to load video'));\r\n };\r\n });\r\n\r\n console.log('Video metadata loaded:', {\r\n duration: video.duration,\r\n width: video.videoWidth,\r\n height: video.videoHeight,\r\n });\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timeout = setTimeout(() => reject(new Error('Video load timeout')), 10000);\r\n if (video.readyState >= 2) {\r\n clearTimeout(timeout);\r\n resolve();\r\n } else {\r\n video.onloadeddata = () => {\r\n clearTimeout(timeout);\r\n resolve();\r\n };\r\n }\r\n });\r\n\r\n const seekTime = Math.min(0.8, video.duration / 2);\r\n console.log('Seeking to:', seekTime);\r\n video.currentTime = seekTime;\r\n\r\n await new Promise<void>((resolve) => {\r\n const timeout = setTimeout(() => {\r\n console.warn('Seek timeout, proceeding anyway');\r\n resolve();\r\n }, 5000);\r\n\r\n video.onseeked = () => {\r\n clearTimeout(timeout);\r\n console.log('Seek completed');\r\n resolve();\r\n };\r\n });\r\n\r\n const canvas = document.createElement('canvas');\r\n const aspectRatio = video.videoWidth / video.videoHeight;\r\n const maxWidth = 400;\r\n const maxHeight = 400;\r\n\r\n let width = video.videoWidth;\r\n let height = video.videoHeight;\r\n\r\n if (width > maxWidth) {\r\n width = maxWidth;\r\n height = width / aspectRatio;\r\n }\r\n\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n width = height * aspectRatio;\r\n }\r\n\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n const ctx = canvas.getContext('2d', { willReadFrequently: false });\r\n if (!ctx) throw new Error('Failed to get canvas context');\r\n\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n if (video.videoWidth === 0 || video.videoHeight === 0) {\r\n throw new Error('Video dimensions are invalid');\r\n }\r\n\r\n console.log('Drawing video to canvas:', { width, height });\r\n\r\n ctx.drawImage(video, 0, 0, width, height);\r\n\r\n const thumbnailDataUrl = canvas.toDataURL('image/jpeg', 0.8);\r\n\r\n console.log('Thumbnail generated, length:', thumbnailDataUrl.length);\r\n\r\n // Save history before adding video\r\n dispatch(saveToHistory());\r\n\r\n // Center the video on the canvas\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n const videoId = uuidv4();\r\n\r\n // Save video blob to IndexedDB for persistence\r\n await saveVideoBlob(videoId, file, thumbnailDataUrl);\r\n\r\n dispatch(\r\n addVideo({\r\n id: videoId,\r\n objectUrl,\r\n thumbnailDataUrl,\r\n videoBlob: file, // Store the original blob for publishing\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n draggable: true,\r\n isPlaying: false,\r\n rotation: 0,\r\n })\r\n );\r\n\r\n video.src = '';\r\n video.load();\r\n\r\n console.log(`Video uploaded: ${file.name}`);\r\n } catch (error) {\r\n console.error('Error processing video:', error);\r\n alert(`Failed to process video: ${file.name}`);\r\n }\r\n }\r\n e.target.value = '';\r\n };\r\n\r\n const handleFlashcardConfirm = (\r\n images: string[],\r\n order: 'sequential' | 'random',\r\n flashCardId?: string\r\n ) => {\r\n dispatch(saveToHistory());\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n\r\n const width = 300;\r\n const height = 300;\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n if (flashCardId) {\r\n dispatch(\r\n updateFlashcard({\r\n id: flashCardId,\r\n images,\r\n order,\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n rotation: 0,\r\n draggable: true,\r\n })\r\n );\r\n } else {\r\n dispatch(\r\n addFlashcard({\r\n id: `flashcard-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n images,\r\n currentIndex: 0,\r\n order,\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n rotation: 0,\r\n draggable: true,\r\n })\r\n );\r\n }\r\n\r\n dispatch(setShowFlashcardForm(false));\r\n };\r\n\r\n const handleAddPhotoFrame = () => {\r\n dispatch(saveToHistory());\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n\r\n // Calculate center position\r\n const width = 400;\r\n const height = 300;\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n dispatch(\r\n addPhotoFrame({\r\n id: `photoframe-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n rotation: 0,\r\n draggable: true,\r\n isCapturing: false,\r\n })\r\n );\r\n };\r\n\r\n const handleNewShape = (shape: { name: string }) => {\r\n const width = 100;\r\n const height = 100;\r\n\r\n // Center the shape on the canvas\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n // Add shape-specific properties based on shape type\r\n const shapeSpecificProps: Partial<Shape> = {};\r\n\r\n switch (shape.name) {\r\n case 'circle':\r\n case 'ring':\r\n case 'wedge':\r\n case 'arc':\r\n shapeSpecificProps.radius = 50;\r\n if (shape.name === 'ring' || shape.name === 'arc') {\r\n shapeSpecificProps.innerRadius = 25;\r\n shapeSpecificProps.outerRadius = 50;\r\n }\r\n if (shape.name === 'wedge' || shape.name === 'arc') {\r\n shapeSpecificProps.angle = shape.name === 'wedge' ? 60 : 90;\r\n }\r\n break;\r\n case 'ellipse':\r\n shapeSpecificProps.radiusX = 60;\r\n shapeSpecificProps.radiusY = 40;\r\n break;\r\n case 'triangle':\r\n shapeSpecificProps.radius = 50;\r\n shapeSpecificProps.sides = 3;\r\n break;\r\n case 'polygon':\r\n shapeSpecificProps.radius = 50;\r\n shapeSpecificProps.sides = 6;\r\n break;\r\n case 'star':\r\n shapeSpecificProps.innerRadius = 25;\r\n shapeSpecificProps.outerRadius = 50;\r\n shapeSpecificProps.numPoints = 5;\r\n break;\r\n case 'arrow':\r\n case 'line':\r\n shapeSpecificProps.points = [0, 0, 100, 0];\r\n if (shape.name === 'arrow') {\r\n shapeSpecificProps.pointerLength = 10;\r\n shapeSpecificProps.pointerWidth = 10;\r\n }\r\n break;\r\n }\r\n\r\n const newShape: Shape = {\r\n id: `shape-${Date.now()}`,\r\n type: shape.name,\r\n x: centerX,\r\n y: centerY,\r\n width: 100,\r\n height: 100,\r\n rotation: 0,\r\n color: color, // Use current pen color\r\n ...shapeSpecificProps,\r\n };\r\n\r\n // Save history before adding shape\r\n dispatch(saveToHistory());\r\n dispatch(setSketchMode(false));\r\n dispatch(setTool(shape.name));\r\n dispatch(addShape(newShape));\r\n };\r\n\r\n const handleToolSelect = (toolName: string) => {\r\n dispatch(setTool(toolName));\r\n if (toolName === 'select') {\r\n // Select tool: disable sketch mode, just for selecting and moving objects\r\n dispatch(setSketchMode(false));\r\n } else if (toolName === 'text') {\r\n dispatch(setSketchMode(false));\r\n // Automatically add text when text tool is selected\r\n dispatch(saveToHistory());\r\n\r\n const width = 200;\r\n const height = 50;\r\n const centerX = (window.innerWidth - width) / 2;\r\n const centerY = (window.innerHeight - height) / 2;\r\n\r\n const textId = `text-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n dispatch(\r\n addText({\r\n id: textId,\r\n text: '',\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n rotation: 0,\r\n draggable: true,\r\n fontSize,\r\n fontFamily,\r\n fontStyle,\r\n fontWeight,\r\n textDecoration,\r\n fill: textColor,\r\n align: 'left',\r\n })\r\n );\r\n\r\n // Set the editing text ID to trigger editing in Canvas\r\n setTimeout(() => {\r\n dispatch(setEditingTextId(textId));\r\n }, 100);\r\n\r\n // Also call the callback if provided (for backward compatibility)\r\n if (onTextAdded) {\r\n onTextAdded(textId);\r\n }\r\n } else {\r\n dispatch(setSketchMode(true));\r\n }\r\n };\r\n\r\n const handleClearCanvas = () => {\r\n dispatch(clearCanvas());\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n };\r\n\r\n const handleBackgroundColorChange = (newColor: string) => {\r\n dispatch(saveToHistory());\r\n dispatch(setBackgroundColor(newColor));\r\n };\r\n\r\n const handleScreenRecordClick = () => {\r\n // If parent provided onScreenRecord callback, use it\r\n if (onScreenRecord) {\r\n onScreenRecord();\r\n } else if (stageRef) {\r\n // Otherwise, handle internally if stageRef is available\r\n setShowScreenRecorder(true);\r\n } else {\r\n // Show warning if stageRef is not provided\r\n alert(\r\n 'Screen recording requires a stageRef prop. Please pass the stageRef from Canvas to the Toolbar component.'\r\n );\r\n }\r\n };\r\n\r\n const handleCameraRecordClick = () => {\r\n setShowCameraRecorder(true);\r\n };\r\n\r\n const handleRecordingComplete = async (videoBlob: Blob, thumbnailDataUrl: string) => {\r\n try {\r\n // Switch to select tool when adding recorded video\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n\r\n // Create object URL from blob\r\n const objectUrl = URL.createObjectURL(videoBlob);\r\n\r\n // Create video element to get dimensions\r\n const video = document.createElement('video');\r\n video.src = objectUrl;\r\n video.muted = true;\r\n video.playsInline = true;\r\n video.preload = 'auto';\r\n\r\n // Wait for metadata to load\r\n await new Promise<void>((resolve, reject) => {\r\n const timeout = setTimeout(() => reject(new Error('Metadata load timeout')), 10000);\r\n video.onloadedmetadata = () => {\r\n clearTimeout(timeout);\r\n resolve();\r\n };\r\n video.onerror = () => {\r\n clearTimeout(timeout);\r\n reject(new Error('Failed to load video'));\r\n };\r\n });\r\n\r\n // Use a reasonable size for the recorded video (similar to modal preview size)\r\n const maxWidth = 640; // Reasonable default width\r\n const videoAspect = video.videoWidth / video.videoHeight;\r\n\r\n const width = maxWidth;\r\n const height = width / videoAspect;\r\n\r\n // Get viewport dimensions for centering\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // Save history before adding video\r\n dispatch(saveToHistory());\r\n\r\n // Center the video on the canvas\r\n const centerX = (viewportWidth - width) / 2;\r\n const centerY = (viewportHeight - height) / 2;\r\n\r\n const videoId = uuidv4();\r\n\r\n // Save video blob to IndexedDB for persistence\r\n await saveVideoBlob(videoId, videoBlob, thumbnailDataUrl);\r\n\r\n dispatch(\r\n addVideo({\r\n id: videoId,\r\n objectUrl,\r\n thumbnailDataUrl,\r\n videoBlob: videoBlob, // Store the original blob for publishing\r\n x: centerX,\r\n y: centerY,\r\n width,\r\n height,\r\n draggable: true,\r\n isPlaying: false,\r\n rotation: 0,\r\n isRecorded: false,\r\n })\r\n );\r\n\r\n setShowScreenRecorder(false);\r\n setShowCameraRecorder(false);\r\n } catch (error) {\r\n console.error('Error adding recorded video to canvas:', error);\r\n alert('Failed to add video to canvas. Please try again.');\r\n }\r\n };\r\n\r\n const handleShowMcqForm = (activityType?: string) => {\r\n dispatch(setTool('select'));\r\n dispatch(setSketchMode(false));\r\n dispatch(setEditingActivity(null));\r\n if (activityType) {\r\n dispatch(setActivityType(activityType));\r\n }\r\n dispatch(setShowMcqForm(!showMcqForm));\r\n };\r\n\r\n const handleAddFlashcard = () => {\r\n dispatch(editFlashcard(null));\r\n dispatch(setShowFlashcardForm(true));\r\n };\r\n\r\n // Don't render anything if a recorded video is playing\r\n if (isAnyRecordedVideoPlaying) return null;\r\n\r\n return (\r\n <>\r\n {/* Hamburger Toggle Button - only show if enabled */}\r\n {showToggleButton && (\r\n <div\r\n className=\"fixed top-4 left-4 z-50 flex h-10 w-10 cursor-pointer flex-col items-center justify-center gap-1 rounded-lg transition-all\"\r\n aria-label=\"Toggle toolbar\"\r\n onClick={handleToggle}\r\n >\r\n <List size={32} />\r\n </div>\r\n )}\r\n\r\n {/* Toolbar Sidebar - only show if open */}\r\n {isOpen && (\r\n <div className=\"fixed top-16 left-4 z-50 h-[calc(100vh-6rem)] w-56 overflow-y-auto rounded-xl border border-gray-200 bg-white p-4 shadow-2xl\">\r\n {/* Tools Section */}\r\n <div className=\"mb-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">TOOLS</div>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {tools.map((t, index) => (\r\n <button\r\n key={index}\r\n onClick={() => handleToolSelect(t.name)}\r\n className={`flex flex-col items-center justify-center rounded-lg p-2 transition-all ${\r\n tool === t.name\r\n ? 'bg-blue-500 text-white shadow-md'\r\n : 'bg-gray-100 text-gray-700 hover:bg-gray-200'\r\n }`}\r\n title={t.label}\r\n >\r\n {t.icon}\r\n <span className=\"mt-1 text-[10px]\">{t.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Size Section */}\r\n <div className=\"mb-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">SIZE</div>\r\n <input\r\n type=\"range\"\r\n name=\"size\"\r\n id=\"size\"\r\n value={strokeWidth}\r\n className=\"h-2 w-full cursor-pointer rounded-full\"\r\n min={6}\r\n max={24}\r\n onChange={(e) => dispatch(setStrokeWidth(parseInt(e.target.value)))}\r\n />\r\n </div>\r\n\r\n {/* Shapes Section */}\r\n <div className=\"mb-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">SHAPES</div>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {shapes.map((shape) => (\r\n <button\r\n key={shape.name}\r\n onClick={() => handleNewShape(shape)}\r\n className={`flex flex-col items-center justify-center rounded-lg p-1.5 transition-all ${\r\n tool === shape.name\r\n ? 'bg-blue-500 text-white shadow-md'\r\n : 'bg-gray-100 text-gray-700 hover:bg-gray-200'\r\n }`}\r\n title={shape.label}\r\n >\r\n {shape.icon}\r\n <span className=\"mt-0.5 text-[9px]\">{shape.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Colors Section */}\r\n <div className=\"space-y-1\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">PEN COLOR</div>\r\n {/* Color Preview - Click to open native picker */}\r\n <div\r\n className=\"h-8 w-full cursor-pointer rounded-md border-2 border-gray-300 transition-transform hover:scale-[1.02]\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => document.getElementById('color-input')?.click()}\r\n />\r\n\r\n {/* Rainbow Slider */}\r\n <div className=\"relative\">\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"360\"\r\n defaultValue=\"0\"\r\n onChange={(e) => {\r\n const hue = parseInt(e.target.value);\r\n const hex = hslToHex(hue, 100, 50);\r\n dispatch(setPenColor(hex));\r\n }}\r\n className=\"h-2 w-full cursor-pointer appearance-none rounded-full\"\r\n style={{\r\n background:\r\n 'linear-gradient(to right, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%)',\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Hidden native color picker */}\r\n <input\r\n id=\"color-input\"\r\n type=\"color\"\r\n value={color}\r\n onChange={(e) => dispatch(setPenColor(e.target.value))}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n\r\n {/* Background Color Section */}\r\n <div className=\"space-y-1 border-t border-gray-200 pt-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">BACKGROUND</div>\r\n {/* Background Color Preview - Click to open native picker */}\r\n <div\r\n className=\"h-8 w-full cursor-pointer rounded-md border-2 border-gray-300 transition-transform hover:scale-[1.02]\"\r\n style={{ backgroundColor: backgroundColor }}\r\n onClick={() => document.getElementById('bg-color-input')?.click()}\r\n />\r\n\r\n {/* Hidden native color picker for background */}\r\n <input\r\n id=\"bg-color-input\"\r\n type=\"color\"\r\n value={backgroundColor}\r\n onChange={(e) => handleBackgroundColorChange(e.target.value)}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n\r\n {/* Media Section */}\r\n <div className=\"mb-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">MEDIA</div>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <label className=\"flex h-12 cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 text-gray-700 transition-colors hover:bg-gray-200\">\r\n <ImageIcon size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Image</span>\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n multiple\r\n onChange={handleImageUpload}\r\n className=\"hidden\"\r\n />\r\n </label>\r\n <label\r\n className={`flex h-12 cursor-pointer flex-col items-center justify-center rounded-lg transition-colors ${\r\n videos.length >= 1\r\n ? 'cursor-not-allowed bg-gray-50 text-gray-400'\r\n : 'bg-gray-100 text-gray-700 hover:bg-gray-200'\r\n }`}\r\n >\r\n <Video size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Video</span>\r\n <input\r\n type=\"file\"\r\n accept=\"video/*\"\r\n disabled={videos.length >= 1}\r\n multiple\r\n onChange={handleVideoUpload}\r\n className=\"hidden\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Internal Screen Recorder - only show if not using parent's onScreenRecord */}\r\n {!onScreenRecord && showScreenRecorder && stageRef && (\r\n <ScreenRecorder\r\n onClose={() => setShowScreenRecorder(false)}\r\n stageRef={stageRef}\r\n onRecordingComplete={handleRecordingComplete}\r\n />\r\n )}\r\n\r\n {/* Camera Recorder */}\r\n {showCameraRecorder && (\r\n <CameraRecorder\r\n onClose={() => setShowCameraRecorder(false)}\r\n onRecordingComplete={handleRecordingComplete}\r\n />\r\n )}\r\n\r\n {/* Flashcard Config Dialog */}\r\n {showFlashcardForm && (\r\n <FlashcardConfigDialog\r\n editingFlashcard={editingFlashCard}\r\n onConfirm={handleFlashcardConfirm}\r\n onCancel={() => dispatch(setShowFlashcardForm(false))}\r\n />\r\n )}\r\n\r\n {/* Activities */}\r\n <div className=\"mb-3 border-t border-gray-200 pt-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">ACTIVITIES</div>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n onClick={() => handleAddFlashcard()}\r\n className=\"flex h-12 cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 text-gray-700 transition-colors hover:bg-gray-200\"\r\n >\r\n <Cards size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Flashcard</span>\r\n </button>\r\n <button\r\n onClick={handleAddPhotoFrame}\r\n className=\"flex h-12 cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 text-gray-700 transition-colors hover:bg-gray-200\"\r\n >\r\n <Camera size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Frame</span>\r\n </button>\r\n <button\r\n onClick={() => handleShowMcqForm('multiple-choice')}\r\n className=\"flex cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"MCQ\"\r\n >\r\n <ListChecksIcon size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">MCQ</span>\r\n </button>\r\n <button\r\n onClick={() => handleShowMcqForm('true-false')}\r\n className=\"flex cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"True False\"\r\n >\r\n <ToggleRight size={20} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">True False</span>\r\n </button>\r\n <button\r\n onClick={() => handleShowMcqForm('short-answer')}\r\n className=\"flex cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"Short Answer\"\r\n >\r\n <Textbox size={20} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Short Answer</span>\r\n </button>\r\n <button\r\n onClick={() => handleShowMcqForm('long-answer')}\r\n className=\"flex cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"Long Answer\"\r\n >\r\n <Article size={20} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Long Answer</span>\r\n </button>\r\n <button\r\n onClick={() => handleShowMcqForm('fill-in-the-blank')}\r\n className=\"flex cursor-pointer flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"Fill in the blank\"\r\n >\r\n <TextUnderline size={20} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Fill in the blank</span>\r\n </button>\r\n </div>\r\n </div>\r\n {/* Actions */}\r\n <div className=\"mb-3 border-t border-gray-200 pt-3\">\r\n <div className=\"mb-2 text-xs font-semibold text-gray-500\">ACTIONS</div>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n onClick={() => dispatch(undo())}\r\n className=\"flex flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"Undo\"\r\n >\r\n <ArrowUUpLeft size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Undo</span>\r\n </button>\r\n <button\r\n onClick={() => dispatch(redo())}\r\n className=\"flex flex-col items-center justify-center rounded-lg bg-gray-100 p-2 text-gray-700 transition-colors hover:bg-gray-200\"\r\n title=\"Redo\"\r\n >\r\n <ArrowUDownRight size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Redo</span>\r\n </button>\r\n <button\r\n onClick={handleScreenRecordClick}\r\n className=\"flex flex-col items-center justify-center rounded-lg bg-blue-50 p-2 text-blue-600 transition-colors hover:bg-blue-100\"\r\n title=\"Screen Record\"\r\n >\r\n <Record size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Record</span>\r\n </button>\r\n <button\r\n onClick={handleCameraRecordClick}\r\n className=\"flex flex-col items-center justify-center rounded-lg bg-purple-50 p-2 text-purple-600 transition-colors hover:bg-purple-100\"\r\n title=\"Camera Record\"\r\n >\r\n <Camera size={18} weight=\"fill\" />\r\n <span className=\"mt-0.5 text-[10px]\">Camera</span>\r\n </button>\r\n <button\r\n onClick={() => handleClearCanvas()}\r\n className=\"flex flex-col items-center justify-center rounded-lg bg-red-50 p-2 text-red-600 transition-colors hover:bg-red-100\"\r\n title=\"Clear\"\r\n >\r\n <Trash size={18} weight=\"bold\" />\r\n <span className=\"mt-0.5 text-[10px]\">Clear</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default Toolbar;\r\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21.801 10A10 10 0 1 1 17 3.335', key: 'yps3ct' }],\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n];\n\n/**\n * @component @name CircleCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-check-big\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleCheckBig = createLucideIcon('circle-check-big', __iconNode);\n\nexport default CircleCheckBig;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm15 9-6 6', key: '1uzhvr' }],\n ['path', { d: 'm9 9 6 6', key: 'z0biqf' }],\n];\n\n/**\n * @component @name CircleX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleX = createLucideIcon('circle-x', __iconNode);\n\nexport default CircleX;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 11v6', key: 'nco0om' }],\n ['path', { d: 'M14 11v6', key: 'outv1u' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6', key: 'miytrc' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2', key: 'e791ji' }],\n];\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash2 = createLucideIcon('trash-2', __iconNode);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Slide } from '@/store/slices/canvasSlice';\r\nimport { Trash2, Copy } from 'lucide-react';\r\n\r\ntype SlideThumbnailProps = {\r\n slide: Slide;\r\n index: number;\r\n isSelected: boolean;\r\n isSingleSlide: boolean;\r\n onSelect: () => void;\r\n onDuplicate: () => void;\r\n onDelete: () => void;\r\n};\r\n\r\nexport const SlideThumbnail: React.FC<SlideThumbnailProps> = ({\r\n slide,\r\n index,\r\n isSelected,\r\n isSingleSlide,\r\n onSelect,\r\n onDuplicate,\r\n onDelete,\r\n}) => {\r\n return (\r\n <div\r\n className={`group relative cursor-pointer overflow-hidden rounded-lg border-2 transition-all ${\r\n isSelected\r\n ? 'border-blue-500 bg-blue-50 shadow-lg'\r\n : 'border-gray-300 bg-white hover:border-gray-400'\r\n }`}\r\n onClick={onSelect}\r\n >\r\n {/* Slide number badge */}\r\n <div className=\"bg-opacity-60 absolute top-2 left-2 z-10 rounded bg-black px-2 py-1 text-xs text-white\">\r\n {index + 1}\r\n </div>\r\n\r\n {/* Action buttons - show on hover */}\r\n <div className=\"absolute top-2 right-2 z-10 flex gap-1 opacity-0 transition-opacity group-hover:opacity-100\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDuplicate();\r\n }}\r\n className=\"rounded bg-blue-500 p-1.5 text-white shadow-md transition-colors hover:bg-blue-600\"\r\n title=\"Duplicate slide\"\r\n >\r\n <Copy size={14} />\r\n </button>\r\n {!isSingleSlide && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete();\r\n }}\r\n className=\"rounded bg-red-500 p-1.5 text-white shadow-md transition-colors hover:bg-red-600\"\r\n title=\"Delete slide\"\r\n >\r\n <Trash2 size={14} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Thumbnail preview */}\r\n <div className=\"flex aspect-video w-full items-center justify-center bg-gray-100\">\r\n {slide.thumbnail ? (\r\n <img\r\n src={slide.thumbnail}\r\n alt={`Slide ${index + 1}`}\r\n className=\"h-full w-full object-contain\"\r\n />\r\n ) : (\r\n <div className=\"text-sm text-gray-400\">No preview</div>\r\n )}\r\n </div>\r\n\r\n {/* Slide name/info */}\r\n <div className=\"truncate bg-white p-2 text-xs text-gray-700\">{slide.name}</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { useAppDispatch, useAppSelector } from '@/store/hooks';\r\nimport {\r\n selectAllSlides,\r\n selectCurrentSlideId,\r\n selectCanAddSlide,\r\n addSlide,\r\n deleteSlide,\r\n duplicateSlide,\r\n setCurrentSlide,\r\n} from '@/store/slices/canvasSlice';\r\nimport { SlideThumbnail } from './SlideThumbnail';\r\nimport { Plus } from 'lucide-react';\r\n\r\nexport const SlideNavigation: React.FC = () => {\r\n const dispatch = useAppDispatch();\r\n const slides = useAppSelector(selectAllSlides);\r\n const currentSlideId = useAppSelector(selectCurrentSlideId);\r\n const canAddSlide = useAppSelector(selectCanAddSlide);\r\n\r\n // Check if ANY recorded video is playing (to hide UI)\r\n const currentSlide = useAppSelector((state) =>\r\n state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId)\r\n );\r\n const videos = currentSlide?.videos || [];\r\n const isAnyRecordedVideoPlaying = videos.some((v) => v.isRecorded && v.isPlaying);\r\n\r\n const handleAddSlide = () => {\r\n if (canAddSlide) {\r\n dispatch(addSlide());\r\n }\r\n };\r\n\r\n const handleSelectSlide = (slideId: string) => {\r\n dispatch(setCurrentSlide(slideId));\r\n };\r\n\r\n const handleDuplicateSlide = (slideId: string) => {\r\n dispatch(duplicateSlide(slideId));\r\n };\r\n\r\n const handleDeleteSlide = (slideId: string) => {\r\n if (slides.length > 1) {\r\n dispatch(deleteSlide(slideId));\r\n }\r\n };\r\n\r\n // Don't render if a recorded video is playing\r\n if (isAnyRecordedVideoPlaying) return null;\r\n\r\n return (\r\n <div className=\"fixed top-0 right-0 z-50 flex h-screen w-80 flex-col border-l border-gray-300 bg-gray-50 shadow-lg\">\r\n {/* Header */}\r\n <div className=\"border-b border-gray-300 bg-white p-4\">\r\n <div className=\"mb-3 flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold text-gray-800\">Slides</h2>\r\n <span className=\"text-sm text-gray-600\">{slides.length}/20</span>\r\n </div>\r\n <button\r\n onClick={handleAddSlide}\r\n disabled={!canAddSlide}\r\n className={`flex w-full items-center justify-center gap-2 rounded-lg px-4 py-2 font-medium transition-colors ${\r\n canAddSlide\r\n ? 'bg-blue-500 text-white hover:bg-blue-600'\r\n : 'cursor-not-allowed bg-gray-300 text-gray-500'\r\n }`}\r\n >\r\n <Plus size={18} />\r\n Add Slide\r\n </button>\r\n </div>\r\n\r\n {/* Slides list */}\r\n <div className=\"flex-1 overflow-y-auto p-4\">\r\n <div className=\"space-y-3\">\r\n {slides.map((slide, index) => (\r\n <SlideThumbnail\r\n key={slide.id}\r\n slide={slide}\r\n index={index}\r\n isSelected={slide.id === currentSlideId}\r\n isSingleSlide={slides.length === 1}\r\n onSelect={() => handleSelectSlide(slide.id)}\r\n onDuplicate={() => handleDuplicateSlide(slide.id)}\r\n onDelete={() => handleDeleteSlide(slide.id)}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Footer info */}\r\n <div className=\"border-t border-gray-300 bg-white p-3 text-center text-xs text-gray-500\">\r\n Click a slide to edit • Use buttons to manage slides\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAppSelector } from '@/store/hooks';\r\nimport { selectAllSlides, Slide } from '@/store/slices/canvasSlice';\r\nimport { Upload, CheckCircle, XCircle } from 'lucide-react';\r\n\r\nexport interface PublishProgress {\r\n current: number;\r\n total: number;\r\n status: string;\r\n}\r\n\r\nexport interface PublishResponse {\r\n success: boolean;\r\n message: string;\r\n projectId?: string;\r\n url?: string;\r\n}\r\n\r\nexport interface PublishButtonProps {\r\n onPublish?: (\r\n slides: Slide[],\r\n onProgress?: (progress: PublishProgress) => void\r\n ) => Promise<PublishResponse>;\r\n label?: string;\r\n className?: string;\r\n}\r\n\r\nexport const PublishButton: React.FC<PublishButtonProps> = ({\r\n onPublish,\r\n label = 'Publish Slides',\r\n className,\r\n}) => {\r\n const slides = useAppSelector(selectAllSlides);\r\n\r\n // Check if ANY recorded video is playing (to hide UI)\r\n const currentSlide = useAppSelector((state) =>\r\n state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId)\r\n );\r\n const videos = currentSlide?.videos || [];\r\n const isAnyRecordedVideoPlaying = videos.some((v) => v.isRecorded && v.isPlaying);\r\n\r\n const [isPublishing, setIsPublishing] = useState(false);\r\n const [progress, setProgress] = useState<PublishProgress | null>(null);\r\n const [result, setResult] = useState<{\r\n type: 'success' | 'error';\r\n message: string;\r\n } | null>(null);\r\n\r\n const handlePublish = async () => {\r\n if (slides.length === 0) {\r\n setResult({\r\n type: 'error',\r\n message: 'No slides to publish',\r\n });\r\n return;\r\n }\r\n\r\n if (!onPublish) {\r\n setResult({\r\n type: 'error',\r\n message: 'No publish handler provided',\r\n });\r\n return;\r\n }\r\n\r\n setIsPublishing(true);\r\n setResult(null);\r\n\r\n try {\r\n const response = await onPublish(slides, (prog) => {\r\n setProgress(prog);\r\n });\r\n\r\n if (response.success) {\r\n setResult({\r\n type: 'success',\r\n message: response.message,\r\n });\r\n } else {\r\n setResult({\r\n type: 'error',\r\n message: response.message,\r\n });\r\n }\r\n } catch (error) {\r\n setResult({\r\n type: 'error',\r\n message: error instanceof Error ? error.message : 'An unexpected error occurred',\r\n });\r\n } finally {\r\n setIsPublishing(false);\r\n setTimeout(() => {\r\n setProgress(null);\r\n setResult(null);\r\n }, 3000);\r\n }\r\n };\r\n\r\n // Don't render if a recorded video is playing\r\n if (isAnyRecordedVideoPlaying) return null;\r\n\r\n return (\r\n <div className={className || 'fixed bottom-6 left-1/2 z-50 -translate-x-1/2 transform'}>\r\n <div className=\"flex min-w-[280px] flex-col items-center gap-3 rounded-lg bg-white p-4 shadow-lg\">\r\n <button\r\n onClick={handlePublish}\r\n disabled={isPublishing || slides.length === 0 || !onPublish}\r\n className={`flex items-center justify-center gap-2 rounded-lg px-6 py-3 font-medium transition-all ${\r\n isPublishing || slides.length === 0 || !onPublish\r\n ? 'cursor-not-allowed bg-gray-300 text-gray-500'\r\n : 'bg-green-500 text-white shadow-md hover:bg-green-600 hover:shadow-lg'\r\n }`}\r\n >\r\n {isPublishing ? (\r\n <>\r\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent\" />\r\n Publishing...\r\n </>\r\n ) : (\r\n <>\r\n <Upload size={20} />\r\n {label}\r\n </>\r\n )}\r\n </button>\r\n\r\n {/* Progress indicator */}\r\n {progress && (\r\n <div className=\"w-full\">\r\n <div className=\"mb-1 text-xs text-gray-600\">{progress.status}</div>\r\n <div className=\"h-2 w-full rounded-full bg-gray-200\">\r\n <div\r\n className=\"h-2 rounded-full bg-green-500 transition-all duration-300\"\r\n style={{\r\n width: `${(progress.current / progress.total) * 100}%`,\r\n }}\r\n />\r\n </div>\r\n <div className=\"mt-1 text-xs text-gray-500\">\r\n {progress.current} / {progress.total}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Result message */}\r\n {result && (\r\n <div\r\n className={`flex items-center gap-2 rounded-lg px-4 py-2 ${\r\n result.type === 'success' ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'\r\n }`}\r\n >\r\n {result.type === 'success' ? <CheckCircle size={18} /> : <XCircle size={18} />}\r\n <span className=\"text-sm font-medium\">{result.message}</span>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-xs text-gray-500\">\r\n {slides.length} slide{slides.length !== 1 ? 's' : ''} ready\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React from 'react';\r\n\r\nexport interface EditorRootProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * EditorRoot wraps the konva editor components and scopes all Tailwind styles\r\n * to prevent conflicts with host application styles.\r\n *\r\n * All konva-editor Tailwind utilities are scoped to the .konva-editor-root class\r\n * via the `important` setting in tailwind.config.js\r\n */\r\nexport function EditorRoot({ children, className = '', style }: EditorRootProps) {\r\n return (\r\n <div className={`konva-editor-root ${className}`.trim()} style={style}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport default EditorRoot;\r\n","import { Slide } from '@/store/slices/canvasSlice';\r\nimport { clearAllVideoBlobs } from './videoStorage';\r\n\r\nconst DB_NAME = 'SchooplaEditorDB';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'slides';\r\nconst LOCALSTORAGE_KEY = 'schoopla_current_slide_id';\r\n\r\nexport const initDB = (): Promise<IDBDatabase> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve(request.result);\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(STORE_NAME)) {\r\n db.createObjectStore(STORE_NAME, { keyPath: 'id' });\r\n }\r\n };\r\n });\r\n};\r\n\r\nexport const saveToIndexedDB = async (slides: Slide[]): Promise<void> => {\r\n try {\r\n console.log('💾 Saving to IndexedDB...', slides.length, 'slides');\r\n const db = await initDB();\r\n const transaction = db.transaction([STORE_NAME], 'readwrite');\r\n const store = transaction.objectStore(STORE_NAME);\r\n\r\n await new Promise((resolve, reject) => {\r\n const clearRequest = store.clear();\r\n clearRequest.onsuccess = () => resolve(true);\r\n clearRequest.onerror = () => reject(clearRequest.error);\r\n });\r\n\r\n for (const slide of slides) {\r\n await new Promise((resolve, reject) => {\r\n const addRequest = store.add(slide);\r\n addRequest.onsuccess = () => resolve(true);\r\n addRequest.onerror = () => reject(addRequest.error);\r\n });\r\n }\r\n\r\n db.close();\r\n console.log('✅ Saved to IndexedDB successfully');\r\n } catch (error) {\r\n console.error('Error saving to IndexedDB:', error);\r\n try {\r\n localStorage.setItem('schoopla_slides_backup', JSON.stringify(slides));\r\n } catch (e) {\r\n console.error('localStorage fallback failed:', e);\r\n }\r\n }\r\n};\r\n\r\nexport const loadFromIndexedDB = async (): Promise<Slide[] | null> => {\r\n try {\r\n console.log('📂 Loading from IndexedDB...');\r\n const db = await initDB();\r\n const transaction = db.transaction([STORE_NAME], 'readonly');\r\n const store = transaction.objectStore(STORE_NAME);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.getAll();\r\n request.onsuccess = () => {\r\n db.close();\r\n const slides = request.result as Slide[];\r\n console.log('✅ Loaded from IndexedDB:', slides.length, 'slides');\r\n if (slides.length > 0 && slides[0].images) {\r\n console.log(\r\n 'First slide images:',\r\n slides[0].images.map((img) => ({\r\n id: img.id,\r\n width: img.width,\r\n height: img.height,\r\n x: img.x,\r\n y: img.y,\r\n }))\r\n );\r\n }\r\n resolve(slides.length > 0 ? slides : null);\r\n };\r\n request.onerror = () => {\r\n db.close();\r\n reject(request.error);\r\n };\r\n });\r\n } catch (error) {\r\n console.error('Error loading from IndexedDB:', error);\r\n try {\r\n const backup = localStorage.getItem('schoopla_slides_backup');\r\n return backup ? JSON.parse(backup) : null;\r\n } catch (e) {\r\n console.error('localStorage fallback failed:', e);\r\n return null;\r\n }\r\n }\r\n};\r\n\r\nexport const clearLocalData = async (): Promise<void> => {\r\n try {\r\n const db = await initDB();\r\n const transaction = db.transaction([STORE_NAME], 'readwrite');\r\n const store = transaction.objectStore(STORE_NAME);\r\n\r\n await new Promise((resolve, reject) => {\r\n const clearRequest = store.clear();\r\n clearRequest.onsuccess = () => resolve(true);\r\n clearRequest.onerror = () => reject(clearRequest.error);\r\n });\r\n\r\n db.close();\r\n localStorage.removeItem('schoopla_slides_backup');\r\n localStorage.removeItem(LOCALSTORAGE_KEY);\r\n\r\n await clearAllVideoBlobs();\r\n } catch (error) {\r\n console.error('Error clearing local data:', error);\r\n }\r\n};\r\n\r\nexport const saveCurrentSlideId = (slideId: string): void => {\r\n try {\r\n localStorage.setItem(LOCALSTORAGE_KEY, slideId);\r\n } catch (error) {\r\n console.error('Error saving current slide ID:', error);\r\n }\r\n};\r\n\r\nexport const loadCurrentSlideId = (): string | null => {\r\n try {\r\n return localStorage.getItem(LOCALSTORAGE_KEY);\r\n } catch (error) {\r\n console.error('Error loading current slide ID:', error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const debounce = <T extends (...args: never[]) => unknown>(\r\n func: T,\r\n wait: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeout: NodeJS.Timeout | null = null;\r\n return (...args: Parameters<T>) => {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n };\r\n};\r\n","import { Middleware, UnknownAction, MiddlewareAPI, Dispatch } from '@reduxjs/toolkit';\r\nimport { saveToIndexedDB, saveCurrentSlideId, debounce } from '@/utils/persistence';\r\nimport { deleteVideoBlob, saveVideoBlob } from '@/utils/videoStorage';\r\nimport { RootState } from '../store';\r\nimport { Slide } from '../slices/canvasSlice';\r\n\r\nconst SAVE_TRIGGER_ACTIONS = [\r\n 'canvas/finalizeDrawing',\r\n 'canvas/setLines',\r\n 'canvas/removeLine',\r\n 'canvas/addImage',\r\n 'canvas/updateImage',\r\n 'canvas/deleteImage',\r\n 'canvas/duplicateImage',\r\n 'canvas/addVideo',\r\n 'canvas/updateVideo',\r\n 'canvas/deleteVideo',\r\n 'canvas/duplicateVideo',\r\n 'canvas/addShape',\r\n 'canvas/updateShape',\r\n 'canvas/deleteShape',\r\n 'canvas/duplicateShape',\r\n 'canvas/addText',\r\n 'canvas/updateText',\r\n 'canvas/deleteText',\r\n 'canvas/duplicateText',\r\n 'canvas/addFlashcard',\r\n 'canvas/updateFlashcard',\r\n 'canvas/deleteFlashcard',\r\n 'canvas/duplicateFlashcard',\r\n 'canvas/addPhotoFrame',\r\n 'canvas/updatePhotoFrame',\r\n 'canvas/deletePhotoFrame',\r\n 'canvas/duplicatePhotoFrame',\r\n 'canvas/toggleImageDrawingMode',\r\n 'canvas/addImageAnnotation',\r\n 'canvas/updateImageAnnotation',\r\n 'canvas/clearImageAnnotations',\r\n 'canvas/togglePhotoFrameDrawingMode',\r\n 'canvas/addPhotoFrameAnnotation',\r\n 'canvas/updatePhotoFrameAnnotation',\r\n 'canvas/clearPhotoFrameAnnotations',\r\n 'canvas/addMultipleChoice',\r\n 'canvas/updateMultipleChoice',\r\n 'canvas/deleteMultipleChoice',\r\n 'canvas/duplicateMultipleChoice',\r\n 'canvas/addTrueFalse',\r\n 'canvas/updateTrueFalse',\r\n 'canvas/deleteTrueFalse',\r\n 'canvas/duplicateTrueFalse',\r\n 'canvas/addShortAnswer',\r\n 'canvas/updateShortAnswer',\r\n 'canvas/deleteShortAnswer',\r\n 'canvas/duplicateShortAnswer',\r\n 'canvas/addLongAnswer',\r\n 'canvas/updateLongAnswer',\r\n 'canvas/deleteLongAnswer',\r\n 'canvas/duplicateLongAnswer',\r\n 'canvas/addFillInTheBlanks',\r\n 'canvas/updateFillInTheBlanks',\r\n 'canvas/deleteFillInTheBlanks',\r\n 'canvas/duplicateFillInTheBlanks',\r\n 'canvas/bringToFront',\r\n 'canvas/sendToBack',\r\n 'canvas/toggleLock',\r\n 'canvas/setLink',\r\n 'canvas/setAltText',\r\n 'canvas/setAudioData',\r\n 'canvas/updateElementOrder',\r\n 'canvas/updateLinePosition',\r\n 'canvas/updateLineTransform',\r\n 'canvas/setBackgroundColor',\r\n 'canvas/addSlide',\r\n 'canvas/deleteSlide',\r\n 'canvas/duplicateSlide',\r\n 'canvas/setCurrentSlide',\r\n 'canvas/updateSlideThumbnail',\r\n 'canvas/reorderSlides',\r\n];\r\n\r\nconst IMMEDIATE_SAVE_ACTIONS = ['canvas/clearCanvas'];\r\n\r\nconst debouncedSave = debounce((slides: Slide[], currentSlideId: string) => {\r\n saveToIndexedDB(slides);\r\n saveCurrentSlideId(currentSlideId);\r\n}, 500);\r\n\r\nconst immediateSave = (slides: Slide[], currentSlideId: string) => {\r\n saveToIndexedDB(slides);\r\n saveCurrentSlideId(currentSlideId);\r\n};\r\n\r\nlet isSaving = false;\r\n\r\nexport const persistenceMiddleware = ((store: MiddlewareAPI<Dispatch, RootState>) =>\r\n (next: Dispatch) =>\r\n (action: UnknownAction) => {\r\n if (action.type === 'canvas/deleteVideo' && action.payload) {\r\n const videoId = action.payload as string;\r\n deleteVideoBlob(videoId).catch((error) => {\r\n console.error('Error deleting video blob:', error);\r\n });\r\n }\r\n\r\n if (action.type === 'canvas/deleteSlide' && action.payload) {\r\n const slideId = action.payload as string;\r\n const state = store.getState();\r\n const slide = state.canvas.slides.find((s) => s.id === slideId);\r\n\r\n if (slide && slide.videos && slide.videos.length > 0) {\r\n slide.videos.forEach((video) => {\r\n deleteVideoBlob(video.id).catch((error) => {\r\n console.error('Error deleting video blob:', error);\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (action.type === 'canvas/duplicateVideo' && action.payload) {\r\n const originalVideoId = action.payload as string;\r\n const state = store.getState();\r\n const currentSlide = state.canvas.slides.find((s) => s.id === state.canvas.currentSlideId);\r\n const originalVideo = currentSlide?.videos.find((v) => v.id === originalVideoId);\r\n\r\n if (originalVideo && originalVideo.videoBlob) {\r\n setTimeout(() => {\r\n const newState = store.getState();\r\n const updatedSlide = newState.canvas.slides.find(\r\n (s) => s.id === newState.canvas.currentSlideId\r\n );\r\n const duplicatedVideo = updatedSlide?.videos.find(\r\n (v) =>\r\n v.id !== originalVideoId &&\r\n v.x === originalVideo.x + 20 &&\r\n v.y === originalVideo.y + 20\r\n );\r\n\r\n if (duplicatedVideo && originalVideo.videoBlob) {\r\n saveVideoBlob(\r\n duplicatedVideo.id,\r\n originalVideo.videoBlob,\r\n duplicatedVideo.thumbnailDataUrl\r\n ).catch((error) => {\r\n console.error('Error saving duplicated video blob:', error);\r\n });\r\n }\r\n }, 0);\r\n }\r\n }\r\n\r\n const result = next(action);\r\n\r\n // For immediate saves, use isSaving flag to prevent re-entry\r\n if (action.type && IMMEDIATE_SAVE_ACTIONS.includes(action.type)) {\r\n if (!isSaving) {\r\n isSaving = true;\r\n try {\r\n const state = store.getState();\r\n const { slides, currentSlideId } = state.canvas;\r\n immediateSave(slides, currentSlideId);\r\n } finally {\r\n setTimeout(() => {\r\n isSaving = false;\r\n }, 0);\r\n }\r\n }\r\n }\r\n // For debounced saves, always queue the save - debounce handles deduplication\r\n else if (action.type && SAVE_TRIGGER_ACTIONS.includes(action.type)) {\r\n const state = store.getState();\r\n const { slides, currentSlideId } = state.canvas;\r\n debouncedSave(slides, currentSlideId);\r\n }\r\n\r\n return result;\r\n }) as Middleware;\r\n","import { configureStore } from '@reduxjs/toolkit';\r\nimport { QueryClient } from '@tanstack/react-query';\r\nimport toolbarReducer from '@/store/slices/toolbarSlice';\r\nimport canvasReducer from '@/store/slices/canvasSlice';\r\nimport { persistenceMiddleware } from '@/store/middleware/persistenceMiddleware';\r\n\r\nconst queryClient = new QueryClient();\r\n\r\nexport const store = configureStore({\r\n reducer: {\r\n toolbar: toolbarReducer,\r\n canvas: canvasReducer,\r\n },\r\n middleware: (getDefaultMiddleware) =>\r\n getDefaultMiddleware({\r\n serializableCheck: false,\r\n }).concat(persistenceMiddleware),\r\n});\r\n\r\nexport type RootState = ReturnType<typeof store.getState>;\r\nexport type AppDispatch = typeof store.dispatch;\r\n\r\nexport { queryClient };\r\n","import Konva from 'konva';\r\n\r\nexport type ExportOptions = {\r\n format?: 'png' | 'jpeg';\r\n quality?: number;\r\n pixelRatio?: number;\r\n fileName?: string;\r\n};\r\n\r\nexport const exportSlideAsImage = (stage: Konva.Stage, options: ExportOptions = {}): void => {\r\n const {\r\n format = 'png',\r\n quality = 1.0,\r\n pixelRatio = 2,\r\n fileName = `slide-${Date.now()}`,\r\n } = options;\r\n\r\n try {\r\n const mimeType = format === 'png' ? 'image/png' : 'image/jpeg';\r\n const dataURL = stage.toDataURL({\r\n mimeType,\r\n quality,\r\n pixelRatio,\r\n });\r\n const link = document.createElement('a');\r\n link.download = `${fileName}.${format}`;\r\n link.href = dataURL;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n } catch (error) {\r\n console.error('Error exporting slide:', error);\r\n throw new Error('Failed to export slide');\r\n }\r\n};\r\n\r\nexport const exportSlideAsBlob = async (\r\n stage: Konva.Stage,\r\n options: Omit<ExportOptions, 'fileName'> = {}\r\n): Promise<Blob> => {\r\n const { format = 'png', quality = 1.0, pixelRatio = 2 } = options;\r\n\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const mimeType = format === 'png' ? 'image/png' : 'image/jpeg';\r\n const dataURL = stage.toDataURL({\r\n mimeType,\r\n quality,\r\n pixelRatio,\r\n });\r\n\r\n fetch(dataURL)\r\n .then((res) => res.blob())\r\n .then((blob) => resolve(blob))\r\n .catch((error) => reject(error));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n};\r\n\r\nexport const getSlideDataURL = (\r\n stage: Konva.Stage,\r\n options: Omit<ExportOptions, 'fileName'> = {}\r\n): string => {\r\n const { format = 'png', quality = 1.0, pixelRatio = 2 } = options;\r\n\r\n const mimeType = format === 'png' ? 'image/png' : 'image/jpeg';\r\n return stage.toDataURL({\r\n mimeType,\r\n quality,\r\n pixelRatio,\r\n });\r\n};\r\n","import { useEffect } from 'react';\r\nimport { useAppDispatch } from './index';\r\nimport { loadSlides } from '../slices/canvasSlice';\r\nimport { loadFromIndexedDB, loadCurrentSlideId } from '@/utils/persistence';\r\nimport { loadAllVideoBlobs, createVideoObjectURL } from '@/utils/videoStorage';\r\n\r\nexport const useSlidesPersistence = () => {\r\n const dispatch = useAppDispatch();\r\n\r\n useEffect(() => {\r\n const loadPersistedData = async () => {\r\n try {\r\n const slides = await loadFromIndexedDB();\r\n const savedCurrentSlideId = loadCurrentSlideId();\r\n\r\n if (slides && slides.length > 0) {\r\n const videoBlobs = await loadAllVideoBlobs();\r\n const restoredSlides = slides.map((slide) => {\r\n if (slide.videos && slide.videos.length > 0) {\r\n const restoredVideos = slide.videos.map((video) => {\r\n const videoData = videoBlobs.get(video.id);\r\n if (videoData) {\r\n const newObjectUrl = createVideoObjectURL(videoData.blob);\r\n return {\r\n ...video,\r\n objectUrl: newObjectUrl,\r\n thumbnailDataUrl: videoData.thumbnailDataUrl,\r\n videoBlob: videoData.blob,\r\n };\r\n } else {\r\n return video;\r\n }\r\n });\r\n return { ...slide, videos: restoredVideos };\r\n }\r\n return slide;\r\n });\r\n\r\n const validSlideId =\r\n savedCurrentSlideId && restoredSlides.find((s) => s.id === savedCurrentSlideId)\r\n ? savedCurrentSlideId\r\n : restoredSlides[0].id;\r\n\r\n dispatch(loadSlides({ slides: restoredSlides, currentSlideId: validSlideId }));\r\n }\r\n } catch (error) {\r\n console.error('Error loading persisted slides:', error);\r\n }\r\n };\r\n\r\n loadPersistedData();\r\n }, [dispatch]);\r\n};\r\n"]}
|