diff --git a/_data/samples-manifest.json b/_data/samples-manifest.json index 7b45b499..252c5c9b 100644 --- a/_data/samples-manifest.json +++ b/_data/samples-manifest.json @@ -8,6 +8,9 @@ }, "bassdrum_acoustic01_-_Copia.ogg": { "_isFile": true + }, + "bassdrum02_-_Copia.ogg": { + "_isFile": true } }, "samples": {}, diff --git a/creation.html b/creation.html index 324c2db7..c95cdb4c 100755 --- a/creation.html +++ b/creation.html @@ -805,45 +805,43 @@ } }); + import { appState } from "./assets/js/creations/state.js"; + import { sendAction } from "./assets/js/creations/socket.js"; // <--- sendAction vive aqui + import { renderAll } from "./assets/js/creations/ui.js"; + import * as Tone from "https://esm.sh/tone"; + document.addEventListener("DOMContentLoaded", () => { - // --- LÓGICA DE UPLOAD DE SAMPLE AVULSO --- + + // 1. Lógica de Upload de Sample const uploadSampleBtn = document.getElementById("upload-sample-btn"); const sampleInput = document.getElementById("sample-file-input"); if (uploadSampleBtn && sampleInput) { - - // 1. Botão clica no input invisível uploadSampleBtn.addEventListener("click", () => { sampleInput.click(); }); - // 2. Quando o arquivo é selecionado sampleInput.addEventListener("change", async () => { if (sampleInput.files.length === 0) return; - const file = sampleInput.files[0]; - - // Pergunta a categoria para organizar no servidor (opcional) - // O backend usa isso para criar pastas: samples/drums, samples/vocals, etc. + const category = prompt( "Em qual categoria este sample se encaixa? (Ex: drums, effects, vocals)", "imported" ); if (category === null) { - // Usuário cancelou sampleInput.value = ""; return; } - // Prepara o formulário const formData = new FormData(); - formData.append("sample_file", file); // Deve bater com 'sample_file' no Python - formData.append("subfolder", category); // Deve bater com 'subfolder' no Python + formData.append("sample_file", file); + formData.append("subfolder", category); - // Feedback Visual (ícone girando ou ficando transparente) + // UI Feedback const originalIcon = uploadSampleBtn.className; - uploadSampleBtn.className = "fa-solid fa-spinner fa-spin"; // Ícone de loading + uploadSampleBtn.className = "fa-solid fa-spinner fa-spin"; uploadSampleBtn.style.pointerEvents = "none"; try { @@ -851,27 +849,45 @@ method: "POST", body: formData }); - const result = await response.json(); if (response.ok) { alert("Sucesso! " + result.message); - sendAction({ type: "REFRESH_SAMPLE_BROWSER" }); + + // AGORA VAI FUNCIONAR POIS ESTAMOS NO MESMO ESCOPO DO IMPORT + sendAction({ type: "REFRESH_SAMPLE_BROWSER" }); + } else { alert("Erro ao enviar: " + (result.error || "Desconhecido")); } - } catch (error) { console.error("Erro no upload:", error); alert("Erro de conexão com o servidor."); } finally { - // Restaura o botão e limpa o input uploadSampleBtn.className = originalIcon; uploadSampleBtn.style.pointerEvents = "auto"; sampleInput.value = ""; } }); } + + // 2. Lógica de Download de ZIP (Se quiser manter junto) + const downloadPackageBtn = document.getElementById("download-package-btn"); + if (downloadPackageBtn) { + downloadPackageBtn.addEventListener("click", () => { + const params = new URLSearchParams(window.location.search); + let projectName = params.get("project"); + if (projectName) { + if (!projectName.toLowerCase().endsWith(".mmp")) projectName += ".mmp"; + const apiUrl = `https://alice.ufsj.edu.br:33002/api/download/${projectName}`; + downloadPackageBtn.style.opacity = "0.5"; + setTimeout(() => downloadPackageBtn.style.opacity = "1", 500); + window.location.href = apiUrl; + } else { + alert("Salve o projeto primeiro ou abra um projeto existente."); + } + }); + } });