plugin v1.0.1
This commit is contained in:
1 parent
82e1ff025a
commit
bdfae5032b
3 files changed
+41
-76
No files matched your search
@@ -52,6 +52,7 @@ window.appState = appState;
|
||||
export function resetProjectState() {
|
||||
console.log("Executando resetProjectState completo...");
|
||||
|
||||
// 1. Reseta o estado global
|
||||
Object.assign(appState.global, {
|
||||
sliceToolActive: false,
|
||||
isPlaying: false,
|
||||
@@ -75,40 +76,35 @@ export function resetProjectState() {
|
||||
justReset: false,
|
||||
});
|
||||
|
||||
// 2. Reseta o estado do pattern
|
||||
Object.assign(appState.pattern, {
|
||||
tracks: [],
|
||||
activeTrackId: null,
|
||||
activePatternIndex: 0,
|
||||
});
|
||||
|
||||
// 3. 🔥 CRÍTICO: Reseta o estado de áudio na força bruta
|
||||
// Isso garante que os arrays fiquem vazios ANTES de qualquer salvamento de sessão
|
||||
if (appState.audio) {
|
||||
appState.audio.tracks = [];
|
||||
appState.audio.clips = [];
|
||||
appState.audio.audioEditorSeekTime = 0;
|
||||
}
|
||||
|
||||
// Chama a função original para garantir reinicialização de contextos se houver
|
||||
initializeAudioState();
|
||||
}
|
||||
|
||||
// --- NOVA IMPLEMENTAÇÃO DE PERSISTÊNCIA ---
|
||||
|
||||
/**
|
||||
* Helper: Gera a string XML do estado atual.
|
||||
* Precisamos "emprestar" a lógica do file.js sem baixar o arquivo.
|
||||
* A maneira mais limpa é importar generateXmlFromState de file.js,
|
||||
* mas como ela não é exportada lá, vamos usar uma estratégia via DOM
|
||||
* ou mover a lógica. Para simplificar sem quebrar o file.js,
|
||||
* vamos salvar apenas o "essencial" do patternState se o XML falhar,
|
||||
* mas o ideal é garantir que o XML seja gerado.
|
||||
* * NOTA: Para que isso funcione perfeitamente, certifique-se de exportar
|
||||
* 'generateXmlFromState' no seu file.js ou usar a lógica abaixo.
|
||||
*/
|
||||
import { generateXmlFromStateExported } from "./file.js"; // Vamos assumir que você vai exportar isso no file.js
|
||||
|
||||
export function saveStateToSession() {
|
||||
if (!window.ROOM_NAME) return;
|
||||
|
||||
// 1. Crie uma versão "limpa" dos tracks (PATTERN)
|
||||
// 1. Limpa Tracks do Pattern
|
||||
const cleanTracks = appState.pattern.tracks.map((track) => {
|
||||
return {
|
||||
id: track.id,
|
||||
name: track.name,
|
||||
samplePath: track.samplePath,
|
||||
patterns: track.patterns,
|
||||
patterns: track.patterns,
|
||||
activePatternIndex: track.activePatternIndex,
|
||||
volume: track.volume,
|
||||
pan: track.pan,
|
||||
@@ -117,24 +113,23 @@ export function saveStateToSession() {
|
||||
};
|
||||
});
|
||||
|
||||
// 2. Construa o objeto de estado final para salvar
|
||||
// 2. Constrói o objeto. 🔥 AQUI ADICIONAMOS O ÁUDIO
|
||||
const stateToSave = {
|
||||
pattern: {
|
||||
...appState.pattern,
|
||||
tracks: cleanTracks,
|
||||
...appState.pattern,
|
||||
tracks: cleanTracks,
|
||||
},
|
||||
// 🔥 FIX: Salvando o estado de Áudio (Tracks e Clips)
|
||||
// Salva o estado de Áudio para o F5 funcionar
|
||||
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
|
||||
syncMode: appState.global.syncMode,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -147,50 +142,4 @@ export function saveStateToSession() {
|
||||
} catch (e) {
|
||||
console.error("Falha ao salvar estado na sessão:", e);
|
||||
}
|
||||
}
|
||||
export async function loadStateFromSession() {
|
||||
const roomName = window.ROOM_NAME;
|
||||
if (!roomName) return false;
|
||||
|
||||
try {
|
||||
const raw = sessionStorage.getItem(`mmp_backup_${roomName}`);
|
||||
if (!raw) return false;
|
||||
|
||||
const backup = JSON.parse(raw);
|
||||
console.log(`[Session] Recuperando backup de ${new Date(backup.timestamp).toLocaleTimeString()}`);
|
||||
|
||||
// 1. Restaura Globais
|
||||
if (backup.global) {
|
||||
appState.global.bpm = backup.global.bpm;
|
||||
appState.global.compassoA = backup.global.compassoA;
|
||||
appState.global.compassoB = backup.global.compassoB;
|
||||
appState.global.bars = backup.global.bars;
|
||||
appState.global.syncMode = backup.global.syncMode || "global";
|
||||
|
||||
// Atualiza DOM imediatamente para evitar desincronia visual
|
||||
const bpmInput = document.getElementById("bpm-input");
|
||||
if(bpmInput) bpmInput.value = backup.global.bpm;
|
||||
// ... (outros inputs se necessário, mas o renderAll cuida da maioria)
|
||||
}
|
||||
|
||||
// 2. Restaura Pattern (XML é preferível)
|
||||
if (backup.xml) {
|
||||
await parseMmpContent(backup.xml);
|
||||
} else if (backup.patternRaw) {
|
||||
// Fallback simples (menos robusto que XML)
|
||||
console.warn("Restaurando de Pattern Raw (backup antigo/incompleto)");
|
||||
Object.assign(appState.pattern, backup.patternRaw);
|
||||
}
|
||||
|
||||
// 3. Restaura Áudio (Clipes + Gravações)
|
||||
if (backup.audio) {
|
||||
await applyAudioSnapshot(backup.audio);
|
||||
}
|
||||
|
||||
return true; // Sucesso
|
||||
|
||||
} catch (e) {
|
||||
console.error("Erro ao restaurar sessão:", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user