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}