plugin v1.0.1

This commit is contained in:
JotaChina committed 2025-11-23 17:48:27 -03:00
1 parent 7dd21b5ddc
commit 82e1ff025a
3 files changed
+71 -46

No files matched your search

+40 -35
View File
@@ -100,49 +100,54 @@ export function resetProjectState() {
import { generateXmlFromStateExported } from "./file.js"; // Vamos assumir que você vai exportar isso no file.js
export function saveStateToSession() {
// Só salva se estiver em uma sala (contexto colaborativo/online)
if (!window.ROOM_NAME) return;
try {
// 1. Snapshot do Áudio (inclui blobs Base64 das gravações)
const audioSnap = getAudioSnapshot();
// 2. Snapshot do Pattern (XML)
// Se não conseguirmos o XML exato, salvamos os dados brutos do pattern
let xmlContent = null;
try {
// Tenta usar a função exportada (veja nota abaixo sobre file.js)
if(typeof generateXmlFromStateExported === 'function') {
xmlContent = generateXmlFromStateExported();
}
} catch(e) {
console.warn("Não foi possível gerar XML para backup:", e);
}
const stateToSave = {
timestamp: Date.now(),
xml: xmlContent,
// Fallback: Salva o pattern bruto se o XML falhar
patternRaw: !xmlContent ? appState.pattern : null,
audio: audioSnap,
global: {
bpm: appState.global.bpm, // Pega do state, que deve estar syncado com o DOM
compassoA: appState.global.compassoA,
compassoB: appState.global.compassoB,
bars: appState.global.bars,
syncMode: appState.global.syncMode
}
// 1. Crie uma versão "limpa" dos tracks (PATTERN)
const cleanTracks = appState.pattern.tracks.map((track) => {
return {
id: track.id,
name: track.name,
samplePath: track.samplePath,
patterns: track.patterns,
activePatternIndex: track.activePatternIndex,
volume: track.volume,
pan: track.pan,
instrumentName: track.instrumentName,
instrumentXml: track.instrumentXml,
};
});
const roomName = window.ROOM_NAME;
sessionStorage.setItem(`mmp_backup_${roomName}`, JSON.stringify(stateToSave));
// console.log("Estado salvo na sessão local (F5 safe).");
// 2. Construa o objeto de estado final para salvar
const stateToSave = {
pattern: {
...appState.pattern,
tracks: cleanTracks,
},
// 🔥 FIX: Salvando o estado de Áudio (Tracks e Clips)
audio: {
tracks: appState.audio.tracks || [],
clips: appState.audio.clips || [],
// Adicione outras props de áudio se necessário (ex: seekTime, etc)
},
global: {
bpm: document.getElementById("bpm-input").value,
compassoA: document.getElementById("compasso-a-input").value,
compassoB: document.getElementById("compasso-b-input").value,
bars: document.getElementById("bars-input").value,
syncMode: appState.global.syncMode, // É bom salvar isso também
},
};
try {
const roomName = window.ROOM_NAME || "default_room";
sessionStorage.setItem(
`temp_state_${roomName}`,
JSON.stringify(stateToSave)
);
} catch (e) {
console.error("Falha crítica ao salvar sessão (Quota Excedida?):", e);
console.error("Falha ao salvar estado na sessão:", e);
}
}
export async function loadStateFromSession() {
const roomName = window.ROOM_NAME;
if (!roomName) return false;