diff --git a/package-lock.json b/package-lock.json index e180277..b6e684e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "libresplit-website", "version": "0.0.0", "dependencies": { + "@libresplit/libresplit-converter": "^0.1.2", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-slot": "^1.2.3", @@ -696,6 +697,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@libresplit/libresplit-converter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@libresplit/libresplit-converter/-/libresplit-converter-0.1.2.tgz", + "integrity": "sha512-mi5k0ACymnjl7rl+O8GzHspHdnte+llzb8670Yw0eqiHBxhhOzD8l3nOnXrYwIohNvzyjqz5zitMW74cTwfeLg==", + "license": "GPL-3.0-or-later" + }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", diff --git a/package.json b/package.json index 6c04174..14508e4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "preview": "vite preview" }, "dependencies": { + "@libresplit/libresplit-converter": "^0.1.2", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-slot": "^1.2.3", diff --git a/src/app/converter.tsx b/src/app/converter.tsx index ac5be87..29788c3 100644 --- a/src/app/converter.tsx +++ b/src/app/converter.tsx @@ -1,7 +1,91 @@ +import React, { useState } from "react"; + +import init, { convert } from "@libresplit/libresplit-converter"; +import wasmUrl from "@libresplit/libresplit-converter/libresplit_converter_bg.wasm?url"; + export function Converter() { + const [selectedFile, setSelectedFile] = useState(null); + const [result, setResult] = useState(null); + + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0] || null; + setSelectedFile(file); + }; + + const handleSubmit = async () => { + if (!selectedFile) { + alert("Please select a file before submitting!"); + return; + } + + try { + const text = await selectedFile.text(); + + await init(wasmUrl); + + const converted = convert(text); + + setResult(converted); + } catch (error) { + console.error("Error processing file: ", error); + alert("Failed to process file. See console for details."); + } + }; + + const handleDownload = () => { + if (!result || !selectedFile) return; + + const fileName = selectedFile.name.replace(/\.[^/.]+$/, ".json"); + + const blob = new Blob([result], { type: "application/json" }); + const url = URL.createObjectURL(blob); + + const link = document.createElement("a"); + link.href = url; + link.download = fileName; + link.click(); + + URL.revokeObjectURL(url); + }; + return ( -
-

Placeholder page for converter.

+
+
+

+ LibreSplit Converter +

+
+ + +
+ {result && ( +
+

+ Conversion successful! Click the button below to download your + LibreSplit file. +

+ +
+ )} +
); } diff --git a/src/components/libresplit/AppNav.tsx b/src/components/libresplit/AppNav.tsx index 9b2a763..d52c815 100644 --- a/src/components/libresplit/AppNav.tsx +++ b/src/components/libresplit/AppNav.tsx @@ -26,7 +26,7 @@ export function AppNav() { - Converter + Converter diff --git a/vite.config.ts b/vite.config.ts index 90378c9..705e935 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -11,4 +11,9 @@ export default defineConfig({ "@": path.resolve(__dirname, "./src"), }, }, + server: { + fs: { + allow: [".."], + }, + }, });