jevstrudel.git / website / src / repl / components / panel / ImportPrebakeScriptButton.jsx
ImportPrebakeScriptButton.jsx50 lines · 1.6 KB · raw
1import { errorLogger } from '@strudel/core';
2import { storePrebakeScript } from '../../../settings.mjs';
3import { confirmDialog } from '@src/repl/util.mjs';
4
5async function importScript(script, updateEditor) {
6  const reader = new FileReader();
7  reader.readAsText(script);
8
9  reader.onload = () => {
10    const text = reader.result;
11    storePrebakeScript(text);
12    updateEditor && updateEditor(text);
13  };
14
15  reader.onerror = () => {
16    errorLogger(new Error('failed to import prebake script'), 'importScript');
17  };
18}
19
20export async function exportScript(script) {
21  const blob = new Blob([script], { type: 'application/javascript' });
22  const downloadLink = document.createElement('a');
23  downloadLink.href = window.URL.createObjectURL(blob);
24  const date = new Date().toISOString().split('T')[0];
25  downloadLink.download = `prebake_${date}.strudel`;
26  document.body.appendChild(downloadLink);
27  downloadLink.click();
28  document.body.removeChild(downloadLink);
29}
30
31export function ImportPrebakeScriptButton({ updateEditor }) {
32  const handleChange = async (e) => {
33    const file = e.target.files[0];
34    const confirmed = await confirmDialog('Warning: This will overwrite the current prebake.\nContinue?');
35    if (!confirmed) {
36      return;
37    }
38    try {
39      await importScript(file, updateEditor);
40    } catch (e) {
41      errorLogger(e);
42    }
43  };
44  return (
45    <label className="space-x-1 inline-flex items-center cursor-pointer">
46      <input type="file" accept=".strudel,.js" className="sr-only peer" onChange={handleChange} />
47      <span className="inline-flex items-center peer-hover:opacity-50 text-xs max-w-[300px]">import</span>
48    </label>
49  );
50}