import { useState, useEffect, useCallback } from 'react'; import { X, Heart, MessageCircle, Download, User, Code, Play, Package, Trash2, ExternalLink, Sparkles, Copy, Share2, Cpu, MessageSquare } from 'lucide-react'; import { MaterialDTO, MaterialType, UserDTO } from '../types'; import { DataService } from '../services/dataService'; import { GeminiService } from '../services/geminiService'; import { useToast } from './ToastProvider'; import Image from 'next/image'; interface Props { id: string; onClose: () => void; currentUser: UserDTO | null; } export const MaterialDetail: React.FC = ({ id, onClose, currentUser }) => { const [material, setMaterial] = useState(null); const [loading, setLoading] = useState(true); const [commentText, setCommentText] = useState(''); const [aiAnalysis, setAiAnalysis] = useState(''); const [analyzingCode, setAnalyzingCode] = useState(false); const [analyzing, setAnalyzing] = useState(false); const toast = useToast(); const getAvatar = (username: string, url?: string) => { if (url && url.trim()) return url; const svg = encodeURIComponent( ``+ ``+ ``+ `NM`+ `` ); return `data:image/svg+xml;utf8,${svg}`; }; const loadData = useCallback(async () => { try { setLoading(true); const data = await DataService.getMaterialById(id); setMaterial(data); } catch (error) { toast.error('Failed to load material details'); console.error('Error loading material:', error); } finally { setLoading(false); } }, [id, toast]); useEffect(() => { loadData(); }, [loadData]); const handleAiExplain = async () => { if (!material?.codeSnippet) return; try { setAnalyzing(true); const text = await GeminiService.explainCode(material.codeSnippet); setAiAnalysis(text); } catch (error) { toast.error('AI analysis failed'); console.error('Error getting AI analysis:', error); } finally { setAnalyzing(false); } }; const handleCopy = () => { if (material?.codeSnippet) { navigator.clipboard.writeText(material.codeSnippet); toast.success('Code copied to clipboard'); } }; const handleDownload = () => { toast.info(`Preparing secure download for protocol: ${material?.id}`); }; const handleComment = async () => { if (!commentText.trim() || !material) return; try { await DataService.addComment(material.id, commentText); setCommentText(''); toast.success('Comment added'); loadData(); } catch (error) { toast.error('Please login to comment'); } }; const handleDelete = async () => { if (confirm('CONFIRM DELETION PROTOCOL?')) { try { await DataService.deleteMaterial(id); toast.success('Material deleted'); onClose(); } catch (error: any) { toast.error(error?.message || 'Only author/admin can delete'); } } }; if (loading) return
LOADING_ASSET...
; if (!material) return null; return (
{material.type}

{material.title}

{material.tags.map(t => ( #{t} ))}
{material.type === MaterialType.CODE && (
                  {material.codeSnippet}
                
)} {material.type === MaterialType.VIDEO && (
)} {material.type === MaterialType.ASSET_ZIP && (

ENCRYPTED_ARCHIVE.ZIP

)} {material.type === MaterialType.CODE && (
{aiAnalysis && (

{aiAnalysis}

)}
)}
{currentUser?.id === material.author.id && ( )}
author

{material.author.username}

Joined {new Date(material.author.createdAt).toLocaleDateString()}

VIEWS

{material.stats.views}

DOWNLOADS

{material.stats.downloads}

Comm_Log ({material.comments.length})

{material.comments.map(c => (
{c.author.username} {new Date(c.createdAt).toLocaleDateString()}

{c.content}

))} {material.comments.length === 0 && (
NO_TRANSMISSIONS_YET
)}