feat: json export and import
This commit is contained in:
@ -379,6 +379,72 @@
|
||||
stickyNotes.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
function exportCanvas() {
|
||||
const canvasState = {
|
||||
selectedDeck,
|
||||
shuffleMode,
|
||||
cards: cards.map(card => ({...card})),
|
||||
stickyNotes: stickyNotes.map(note => ({...note})),
|
||||
canvasOffset,
|
||||
deckPosition,
|
||||
maxZIndex,
|
||||
nextNoteId,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
|
||||
const dataStr = JSON.stringify(canvasState, null, 2);
|
||||
const dataBlob = new Blob([dataStr], { type: 'application/json' });
|
||||
const url = URL.createObjectURL(dataBlob);
|
||||
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = `canvas-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
URL.revokeObjectURL(url);
|
||||
}
|
||||
|
||||
function importCanvas() {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
input.accept = '.json';
|
||||
input.onchange = (event) => {
|
||||
const file = (event.target as HTMLInputElement).files?.[0];
|
||||
if (!file) return;
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
try {
|
||||
const canvasState = JSON.parse(e.target?.result as string);
|
||||
|
||||
// Validate the imported data structure
|
||||
if (!canvasState.cards || !Array.isArray(canvasState.cards)) {
|
||||
alert('Invalid canvas file format');
|
||||
return;
|
||||
}
|
||||
|
||||
// Restore state
|
||||
selectedDeck = canvasState.selectedDeck || 0;
|
||||
shuffleMode = canvasState.shuffleMode || 'normal';
|
||||
cards = canvasState.cards || [];
|
||||
stickyNotes = canvasState.stickyNotes || [];
|
||||
canvasOffset = canvasState.canvasOffset || { x: 0, y: 0 };
|
||||
deckPosition = canvasState.deckPosition || { x: 50, y: 300 };
|
||||
maxZIndex = canvasState.maxZIndex || cards.length;
|
||||
nextNoteId = canvasState.nextNoteId || 1;
|
||||
|
||||
} catch (error) {
|
||||
alert('Error reading canvas file: ' + error);
|
||||
}
|
||||
};
|
||||
reader.readAsText(file);
|
||||
};
|
||||
document.body.appendChild(input);
|
||||
input.click();
|
||||
document.body.removeChild(input);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="game-container">
|
||||
@ -408,6 +474,8 @@
|
||||
<button onclick={dealCards}>Deal Cards</button>
|
||||
<button onclick={flipAllCards}>Flip All</button>
|
||||
<button onclick={addStickyNote}>Add Note</button>
|
||||
<button onclick={exportCanvas}>Export</button>
|
||||
<button onclick={importCanvas}>Import</button>
|
||||
</div>
|
||||
|
||||
<div
|
||||
|
Reference in New Issue
Block a user