{"version":3,"file":"useResizeHandler.cjs","sources":["../../../src/hooks/useResizeHandler.ts"],"sourcesContent":["import { useEffect, useRef, useCallback, type RefObject } from \"react\";\nimport { Application, Sprite, Container } from \"pixi.js\";\nimport ResourceManager from '../managers/ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n// Default debounce time\nconst DEFAULT_DEBOUNCE_TIME = 100;\n\n// Cancellation flag interface\ninterface CancellationFlags {\n    isCancelled: boolean;\n}\n\ninterface ResizeHandlerProps {\n    sliderRef: RefObject<HTMLDivElement | null>;\n    appRef: RefObject<Application | null>;\n    slidesRef: RefObject<Sprite[]>;\n    textContainersRef: RefObject<Container[]>;\n    backgroundDisplacementSpriteRef: RefObject<Sprite | null>;\n    cursorDisplacementSpriteRef: RefObject<Sprite | null>;\n    resourceManager?: ResourceManager | null;\n    debounceTime?: number;\n}\n\n/**\n * Hook to handle resize events for the slider\n * Ensures proper scaling and positioning of all visual elements when the window resizes\n */\nconst useResizeHandler = ({\n                              sliderRef,\n                              appRef,\n                              slidesRef,\n                              textContainersRef,\n                              backgroundDisplacementSpriteRef,\n                              cursorDisplacementSpriteRef,\n                              resourceManager,\n                              debounceTime = DEFAULT_DEBOUNCE_TIME\n                          }: ResizeHandlerProps) => {\n    // Cancellation flag to prevent race conditions\n    const cancellationRef = useRef<CancellationFlags>({ isCancelled: false });\n\n    // Store debounce timer\n    const resizeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    /**\n     * Calculate sprite scale based on dimensions with improved error handling\n     */\n    const calculateSpriteScale = useCallback((\n        sprite: Sprite,\n        containerWidth: number,\n        containerHeight: number\n    ): boolean => {\n        try {\n            // Validate texture and dimensions\n            if (!sprite.texture || !sprite.texture.width || !sprite.texture.height) {\n                if (isDevelopment) {\n                    console.warn('Invalid sprite or texture for scaling', {\n                        textureExists: !!sprite.texture,\n                        width: sprite.texture?.width,\n                        height: sprite.texture?.height\n                    });\n                }\n                return false;\n            }\n\n            const imageWidth = sprite.texture.width;\n            const imageHeight = sprite.texture.height;\n\n            // Skip invalid container dimensions\n            if (!containerWidth || !containerHeight) {\n                if (isDevelopment) {\n                    console.warn('Invalid container dimensions for sprite scaling', {\n                        containerWidth,\n                        containerHeight\n                    });\n                }\n                return false;\n            }\n\n            // Calculate scale based on aspect ratios\n            const imageAspect = imageWidth / imageHeight;\n            const containerAspect = containerWidth / containerHeight;\n\n            const scale = imageAspect > containerAspect\n                ? containerHeight / imageHeight\n                : containerWidth / imageWidth;\n\n            // Apply scale and center sprite\n            sprite.scale.set(scale);\n\n            // Store base scale for future reference\n            (sprite as any).baseScale = scale;\n\n            // Center the sprite\n            sprite.x = containerWidth / 2;\n            sprite.y = containerHeight / 2;\n\n            // Track with ResourceManager\n            if (resourceManager) {\n                resourceManager.trackDisplayObject(sprite);\n            }\n\n            return true;\n        } catch (error) {\n            if (isDevelopment) {\n                console.error('Unexpected error in sprite scaling:', error);\n            }\n            return false;\n        }\n    }, [resourceManager]);\n\n    /**\n     * Center a container within the slider\n     */\n    const centerContainer = useCallback((\n        container: Container,\n        width: number,\n        height: number\n    ): void => {\n        try {\n            container.x = width / 2;\n            container.y = height / 2;\n\n            // Track the updated container with ResourceManager\n            if (resourceManager) {\n                resourceManager.trackDisplayObject(container);\n            }\n        } catch (error) {\n            if (isDevelopment) {\n                console.error('Error centering container:', error);\n            }\n        }\n    }, [resourceManager]);\n\n    /**\n     * Main resize handler function with comprehensive error handling\n     */\n    const handleResize = useCallback(() => {\n        // Reset cancellation flag\n        cancellationRef.current.isCancelled = false;\n\n        // Validate essential references\n        if (!sliderRef.current || !appRef.current) {\n            if (isDevelopment) {\n                console.warn('useResizeHandler: Missing essential references');\n            }\n            return;\n        }\n\n        try {\n            const app = appRef.current;\n            const containerWidth = sliderRef.current.clientWidth;\n            const containerHeight = sliderRef.current.clientHeight;\n\n            if (isDevelopment) {\n                console.log(`Resizing to: ${containerWidth}x${containerHeight}`);\n            }\n\n            // Clear any existing resize timer\n            if (resizeTimerRef.current !== null) {\n                if (resourceManager) {\n                    resourceManager.clearTimeout(resizeTimerRef.current);\n                } else {\n                    clearTimeout(resizeTimerRef.current);\n                }\n                resizeTimerRef.current = null;\n            }\n\n            // Debounced resize function\n            const resizeFn = () => {\n                // Check for cancellation\n                if (cancellationRef.current.isCancelled) return;\n\n                try {\n                    // Resize renderer\n                    app.renderer.resize(containerWidth, containerHeight);\n\n                    // Update slides\n                    slidesRef.current.forEach((sprite) => {\n                        calculateSpriteScale(sprite, containerWidth, containerHeight);\n                    });\n\n                    // Update text containers\n                    textContainersRef.current.forEach((container) => {\n                        centerContainer(container, containerWidth, containerHeight);\n                    });\n\n                    // Update displacement sprites\n                    if (backgroundDisplacementSpriteRef.current) {\n                        centerContainer(\n                            backgroundDisplacementSpriteRef.current,\n                            containerWidth,\n                            containerHeight\n                        );\n                    }\n\n                    if (cursorDisplacementSpriteRef.current) {\n                        centerContainer(\n                            cursorDisplacementSpriteRef.current,\n                            containerWidth,\n                            containerHeight\n                        );\n                    }\n\n                    if (isDevelopment) {\n                        console.log('Resize handler completed successfully');\n                    }\n                } catch (error) {\n                    if (isDevelopment) {\n                        console.error('Error in resize handler execution:', error);\n                    }\n                }\n            };\n\n            // Set timeout using ResourceManager or window\n            if (resourceManager) {\n                resizeTimerRef.current = resourceManager.setTimeout(resizeFn, debounceTime);\n            } else {\n                // Use type assertion since browser's setTimeout returns number while Node's returns Timeout\n                resizeTimerRef.current = window.setTimeout(resizeFn, debounceTime) as unknown as ReturnType<typeof setTimeout>;\n            }\n        } catch (error) {\n            if (isDevelopment) {\n                console.error('Unexpected error in resize handling:', error);\n            }\n        }\n    }, [\n        sliderRef,\n        appRef,\n        slidesRef,\n        textContainersRef,\n        backgroundDisplacementSpriteRef,\n        cursorDisplacementSpriteRef,\n        resourceManager,\n        debounceTime,\n        calculateSpriteScale,\n        centerContainer\n    ]);\n\n    // Main effect for resize handling\n    useEffect(() => {\n        // Skip during server-side rendering\n        if (typeof window === 'undefined') return;\n\n        // Add resize event listener\n        window.addEventListener(\"resize\", handleResize);\n\n        // Initial resize\n        handleResize();\n\n        // Cleanup function\n        return () => {\n            // Set cancellation flag\n            cancellationRef.current.isCancelled = true;\n\n            // Remove resize listener\n            window.removeEventListener(\"resize\", handleResize);\n\n            // Clear any pending resize timer\n            if (resizeTimerRef.current !== null) {\n                if (resourceManager) {\n                    resourceManager.clearTimeout(resizeTimerRef.current);\n                } else {\n                    clearTimeout(resizeTimerRef.current);\n                }\n                resizeTimerRef.current = null;\n            }\n        };\n    }, [handleResize, resourceManager]);\n\n    // No return value needed as this hook sets up the resize handler\n};\n\nexport default useResizeHandler;"],"names":["useRef","useCallback","useEffect"],"mappings":"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"}