Skip to content

Commit 8046590

Browse files
wins1eyJackTench
andauthored
Add split converter to website (#13)
* Add libresplit-converter submodule * Add wasm-pack dependency * Set up wasm compilation * Add converter to website * Remove wasm-pack * Remove submodule in favour of `npm link` * Add @libresplit/libresplit-converter dependency * Make dev server load wasm properly --------- Co-authored-by: Jack Tench <[email protected]>
1 parent d3fa72d commit 8046590

File tree

5 files changed

+100
-3
lines changed

5 files changed

+100
-3
lines changed

package-lock.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"preview": "vite preview"
1212
},
1313
"dependencies": {
14+
"@libresplit/libresplit-converter": "^0.1.2",
1415
"@radix-ui/react-dropdown-menu": "^2.1.16",
1516
"@radix-ui/react-navigation-menu": "^1.2.14",
1617
"@radix-ui/react-slot": "^1.2.3",

src/app/converter.tsx

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,91 @@
1+
import React, { useState } from "react";
2+
3+
import init, { convert } from "@libresplit/libresplit-converter";
4+
import wasmUrl from "@libresplit/libresplit-converter/libresplit_converter_bg.wasm?url";
5+
16
export function Converter() {
7+
const [selectedFile, setSelectedFile] = useState<File | null>(null);
8+
const [result, setResult] = useState<string | null>(null);
9+
10+
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
11+
const file = event.target.files?.[0] || null;
12+
setSelectedFile(file);
13+
};
14+
15+
const handleSubmit = async () => {
16+
if (!selectedFile) {
17+
alert("Please select a file before submitting!");
18+
return;
19+
}
20+
21+
try {
22+
const text = await selectedFile.text();
23+
24+
await init(wasmUrl);
25+
26+
const converted = convert(text);
27+
28+
setResult(converted);
29+
} catch (error) {
30+
console.error("Error processing file: ", error);
31+
alert("Failed to process file. See console for details.");
32+
}
33+
};
34+
35+
const handleDownload = () => {
36+
if (!result || !selectedFile) return;
37+
38+
const fileName = selectedFile.name.replace(/\.[^/.]+$/, ".json");
39+
40+
const blob = new Blob([result], { type: "application/json" });
41+
const url = URL.createObjectURL(blob);
42+
43+
const link = document.createElement("a");
44+
link.href = url;
45+
link.download = fileName;
46+
link.click();
47+
48+
URL.revokeObjectURL(url);
49+
};
50+
251
return (
3-
<div className="flex h-screen w-screen items-center justify-center">
4-
<p className="text-gray-500">Placeholder page for converter.</p>
52+
<div className="flex min-h-screen items-center justify-center bg-linear-to-tr from-gray-700 to-sky-900 p-6">
53+
<div className="w-full max-w-lg space-y-6 rounded-lg bg-gray-800 p-6 shadow-lg">
54+
<h1 className="text-center text-2xl font-bold text-white">
55+
LibreSplit Converter
56+
</h1>
57+
<div className="space-y-4">
58+
<input
59+
type="file"
60+
accept=".lss"
61+
onChange={handleFileChange}
62+
className="block w-full rounded-md border border-white px-3 py-2 text-white focus:ring focus:ring-indigo-500 focus:outline-none"
63+
/>
64+
<button
65+
onClick={handleSubmit}
66+
disabled={!selectedFile}
67+
className={
68+
'${selectedFile ? "bg-indigo-600 hover:bg-indigo-700" : "bg-gray-400 cursor-not-allowed"} w-full rounded-md px-4 py-2 font-semibold text-white'
69+
}
70+
>
71+
Convert
72+
</button>
73+
</div>
74+
{result && (
75+
<div className="space-y-4">
76+
<p className="text-center font-medium text-green-600">
77+
Conversion successful! Click the button below to download your
78+
LibreSplit file.
79+
</p>
80+
<button
81+
onClick={handleDownload}
82+
className="w-full rounded-md bg-green-600 px-4 py-2 font-semibold text-white hover:bg-green-700"
83+
>
84+
Download
85+
</button>
86+
</div>
87+
)}
88+
</div>
589
</div>
690
);
791
}

src/components/libresplit/AppNav.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export function AppNav() {
2626

2727
<NavigationMenuItem>
2828
<NavigationMenuLink asChild>
29-
<a href="https://converter.libresplit.org/">Converter</a>
29+
<Link to="/converter">Converter</Link>
3030
</NavigationMenuLink>
3131
</NavigationMenuItem>
3232
</NavigationMenuList>

vite.config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,9 @@ export default defineConfig({
1111
"@": path.resolve(__dirname, "./src"),
1212
},
1313
},
14+
server: {
15+
fs: {
16+
allow: [".."],
17+
},
18+
},
1419
});

0 commit comments

Comments
 (0)