'use client'; import { useEffect, useState } from 'react'; import { VirtualCanvas } from './VirtualCanvas'; import { useWebSocket } from '../../hooks/useWebSocket'; import { useCanvasStore } from '../../store/canvasStore'; import { PixelPlacedMessage, ChunkDataMessage } from '@gaplace/shared'; export function CanvasContainer() { const [userId] = useState(() => `user_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`); const canvasId = 'default'; // TODO: Make this dynamic const { selectedColor, selectedTool, setPixel, loadChunk, setUserCursor, removeUserCursor, setActiveUsers, setStats, } = useCanvasStore(); const { isConnected, connectionError, placePixel, loadChunk: requestChunk, moveCursor } = useWebSocket({ canvasId, userId, onPixelPlaced: (message: PixelPlacedMessage) => { setPixel(message.x, message.y, message.color, message.userId); }, onChunkData: (message: ChunkDataMessage) => { loadChunk(message.chunkX, message.chunkY, message.pixels); }, onUserList: (users: string[]) => { setActiveUsers(users); }, onCanvasStats: (stats: { totalPixels?: number; activeUsers?: number; lastActivity?: number; userPixels?: number }) => { setStats(stats.totalPixels || 0, stats.userPixels || 0); }, onCursorUpdate: (data: { userId: string; username: string; x: number; y: number; tool: string }) => { setUserCursor(data.userId, data.x, data.y, data.username, '#ff0000'); }, }); const handlePixelClick = (x: number, y: number) => { if (!isConnected) return; if (selectedTool === 'pixel') { placePixel(x, y, selectedColor); } }; const handleCursorMove = (x: number, y: number) => { if (!isConnected) return; moveCursor(x, y, selectedTool); }; const handleChunkNeeded = (chunkX: number, chunkY: number) => { if (!isConnected) return; requestChunk(chunkX, chunkY); }; const handleHoverChange = (x: number, y: number, pixelInfo: { color: string; userId?: string } | null) => { // Handle pixel hover for tooltips or UI updates }; if (connectionError) { return (
⚠️ Connection Error
{connectionError}
); } if (!isConnected) { return (
Connecting to GaPlace...
); } return (
{/* Connection status indicator */}
{isConnected ? 'Connected' : 'Disconnected'}
); }