feat: add Base64 encoder/decoder tool component

- Implemented a new Base64 tool with encoding and decoding functionalities.
- Updated the tool index to include the new Base64 component with appropriate description and icon.
This commit is contained in:
typist
2025-10-28 04:38:42 +08:00
parent da20e34dc9
commit 37489a4698
2 changed files with 79 additions and 1 deletions

View File

@@ -0,0 +1,70 @@
import { useState, type FC } from "react";
import { Textarea } from "@/components/ui/textarea";
import { Button } from "@/components/ui/button";
import { toast } from "sonner";
import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
const Tool: FC = () => {
const [decoded, setDecoded] = useState<string>("");
const [encoded, setEncoded] = useState<string>("");
const encode = () => {
try {
const encoded64 = btoa(decoded);
setEncoded(encoded64);
setDecoded("");
toast.success("encoded successfully");
} catch (error: unknown) {
if (error instanceof Error) {
toast.error(error.message);
} else {
toast.error("encoding failed");
}
}
};
const decode = () => {
try {
const decoded64 = atob(encoded);
setDecoded(decoded64);
setEncoded("");
toast.success("decoded successfully");
} catch (error: unknown) {
if (error instanceof Error) {
toast.error(error.message);
} else {
toast.error("decoding failed");
}
}
};
return (
<div className="h-[50vh] flex flex-row gap-4 pt-[20vh]">
<Textarea
className="flex-1 resize-none"
placeholder="Enter the original text"
value={decoded}
onChange={(e) => setDecoded(e.target.value)}
/>
<div className="flex flex-col gap-2 justify-center">
<Button onClick={encode}>
<ArrowRightIcon className="size-4" />
Encode
</Button>
<Button onClick={decode}>
<ArrowLeftIcon className="size-4" />
Decode
</Button>
</div>
<Textarea
className="flex-1 resize-none"
placeholder="Enter the Base64 encoded text"
value={encoded}
onChange={(e) => setEncoded(e.target.value)}
/>
</div>
);
};
export default Tool;

View File

@@ -1,8 +1,9 @@
import type { ReactNode } from 'react'; import type { ReactNode } from 'react';
import { FileJson, Hash } from 'lucide-react' import { FileJson, Hash, Binary } from 'lucide-react'
import UUID from './uuid' import UUID from './uuid'
import JSON from './json' import JSON from './json'
import Base64 from './base64'
export interface Tool { export interface Tool {
path: string; path: string;
@@ -26,5 +27,12 @@ export const tools: Tool[] = [
description: "Format and validate JSON", description: "Format and validate JSON",
icon: <FileJson />, icon: <FileJson />,
component: <JSON />, component: <JSON />,
},
{
path: "base64",
name: "Base64 Encoder/Decoder",
description: "Encode and decode Base64",
icon: <Binary />,
component: <Base64 />,
} }
]; ];