'use client' import dynamic from 'next/dynamic' import { useState, useEffect, useRef, useMemo } from 'react' import { useRouter } from 'next/navigation' import { toast } from 'sonner' import { Download, Presentation } from 'lucide-react' import type { ExcalidrawElement } from '@excalidraw/excalidraw/element/types' import type { AppState, BinaryFiles } from '@excalidraw/excalidraw/types' import type { ExcalidrawImperativeAPI } from '@excalidraw/excalidraw/types' import '@excalidraw/excalidraw/index.css' const Excalidraw = dynamic( async () => (await import('@excalidraw/excalidraw')).Excalidraw, { ssr: false } ) interface CanvasBoardProps { initialData?: string canvasId?: string name: string } type PptxPayload = { type: string; filename: string; base64: string; slideCount?: number; theme?: string } function parseCanvasScene(initialData?: string): { pptx: PptxPayload | null elements: readonly ExcalidrawElement[] files: BinaryFiles } { if (!initialData) { return { pptx: null, elements: [], files: {} } } try { const parsed = JSON.parse(initialData) if (parsed && parsed.type === 'pptx' && parsed.base64) { return { pptx: parsed as PptxPayload, elements: [], files: {} } } if (parsed && Array.isArray(parsed)) { return { pptx: null, elements: parsed as ExcalidrawElement[], files: {} } } if (parsed && parsed.elements) { const files: BinaryFiles = parsed.files && typeof parsed.files === 'object' ? parsed.files : {} return { pptx: null, elements: parsed.elements as readonly ExcalidrawElement[], files } } } catch (e) { console.error('[CanvasBoard] Failed to parse canvas data:', e) } return { pptx: null, elements: [], files: {} } } function PptxViewer({ data, name }: { data: PptxPayload; name: string }) { const handleDownload = () => { try { const byteCharacters = atob(data.base64) const byteNumbers = new Array(byteCharacters.length) for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i) } const byteArray = new Uint8Array(byteNumbers) const blob = new Blob([byteArray], { type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = data.filename || `${name}.pptx` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } catch (e) { console.error('[PptxViewer] Download failed:', e) toast.error('Failed to download presentation') } } return (
PowerPoint Presentation {data.slideCount ? ` • ${data.slideCount} slides` : ''} {data.theme ? ` • ${data.theme} theme` : ''}
This file can be opened in Microsoft PowerPoint, Google Slides, or Keynote.