From 3932bc2c3bfd3f26a0e3b76baed857b9f8de4ad7 Mon Sep 17 00:00:00 2001 From: Paul Butler Date: Sat, 8 Feb 2025 13:31:34 -0500 Subject: [PATCH] suspense boundary --- app/base64-encoder-decoder-content.tsx | 113 +++++++++++++++++++++++++ app/page.tsx | 113 ++----------------------- 2 files changed, 118 insertions(+), 108 deletions(-) create mode 100644 app/base64-encoder-decoder-content.tsx diff --git a/app/base64-encoder-decoder-content.tsx b/app/base64-encoder-decoder-content.tsx new file mode 100644 index 0000000..c7b08fa --- /dev/null +++ b/app/base64-encoder-decoder-content.tsx @@ -0,0 +1,113 @@ +"use client" + +import { useEffect, useState } from "react" +import { useRouter, useSearchParams } from "next/navigation" +import { Textarea } from "@/components/ui/textarea" +import { CardContent } from "@/components/ui/card" +import { Switch } from "@/components/ui/switch" +import { Label } from "@/components/ui/label" +import { decode, encode } from "./encoding" +import { EmojiSelector } from "@/components/emoji-selector" +import { EMOJI_LIST } from "./emoji" + +export function Base64EncoderDecoderContent() { + const router = useRouter() + const searchParams = useSearchParams() + + // Read input state from URL parameters + const mode = searchParams.get("mode") || "encode" + const inputText = searchParams.get("input") || "" + const selectedEmoji = searchParams.get("emoji") || "😀" + + // Store output state locally + const [outputText, setOutputText] = useState("") + const [errorText, setErrorText] = useState("") + + // Update URL when input state changes + const updateURL = (updates: Record) => { + const params = new URLSearchParams(searchParams) + Object.entries(updates).forEach(([key, value]) => { + if (value) { + params.set(key, value) + } else { + params.delete(key) + } + }) + router.replace(`?${params.toString()}`) + } + + // Convert input whenever it changes + useEffect(() => { + try { + const isEncoding = mode === "encode" + const output = isEncoding ? encode(selectedEmoji, inputText) : decode(inputText) + setOutputText(output) + setErrorText("") + } catch (e) { + setOutputText("") + setErrorText(`Error ${mode === "encode" ? "encoding" : "decoding"}: Invalid input`) + } + }, [mode, selectedEmoji, inputText]) + + const handleModeToggle = (checked: boolean) => { + const newMode = checked ? "encode" : "decode" + const params = { + mode: newMode, + input: "" + } + updateURL(newMode === "decode" ? params : { ...params, emoji: "" }) + } + + const handleEmojiSelect = (emoji: string) => { + updateURL({ emoji }) + } + + const handleInputChange = (value: string) => { + updateURL({ input: value }) + } + + // Handle initial URL state + useEffect(() => { + const params = new URLSearchParams(searchParams) + if (!params.has("mode")) { + updateURL({ mode: "encode" }) + } + }, []) + + const isEncoding = mode === "encode" + + return ( + +

This tool allows you to encode a hidden message into an emoji. You can copy and paste an emoji with a hidden message in it to decode the message.

+ +
+ + + +
+ +