import React, { useState, useEffect, useCallback } from 'react'; import { workshop as workshopApi } from '../services/api.js'; import { useAuth } from '../services/AuthContext.jsx'; import { state, deserialize } from '../engine/state.js'; import { rebuildGraph } from '../engine/audioEngine.js'; import { getPresets } from '../engine/presets.js'; const TAGS = ['ambient', 'bass', 'drums', 'pad', 'lead', 'fx', 'chiptune', 'experimental']; function ShareModal({ onClose, onShared }) { const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [selectedTags, setSelectedTags] = useState([]); const [selectedPreset, setSelectedPreset] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const presets = getPresets(); const handleShare = async () => { if (!title.trim()) { setError('Titulo requerido'); return; } if (!selectedPreset) { setError('Selecciona un preset para compartir'); return; } setLoading(true); setError(''); try { // Use the preset data directly (already serialized correctly) const patchData = { modules: selectedPreset.modules || [], connections: selectedPreset.connections || [], camera: selectedPreset.camera || { camX: 0, camY: 0, zoom: 1 }, masterVolume: selectedPreset.masterVolume ?? -6, }; await workshopApi.share({ title: title.trim(), description: description.trim(), tags: selectedTags, data: patchData, }); onShared?.(); onClose(); } catch (err) { setError(err.message); } setLoading(false); }; return (
e.stopPropagation()} style={{ gap: 14, maxHeight: '80vh', overflow: 'auto' }}>

Compartir Patch

{presets.length === 0 ? (

No tienes presets guardados. Ve al Sandbox, crea algo y guardalo con "Save" primero.

) : (
{presets.map((p, i) => ( ))}
)} setTitle(e.target.value)} />