This commit is contained in:
Paul Butler 2025-02-08 14:06:42 -05:00
parent 159da826e8
commit b602794beb

View File

@ -14,25 +14,17 @@ export function Base64EncoderDecoderContent() {
const router = useRouter() const router = useRouter()
const searchParams = useSearchParams() const searchParams = useSearchParams()
// Read input state from URL parameters // Read mode from URL parameters, other state stored locally
const mode = searchParams.get("mode") || "encode" const mode = searchParams.get("mode") || "encode"
const inputText = searchParams.get("input") || "" const [inputText, setInputText] = useState("")
const selectedEmoji = searchParams.get("emoji") || "😀" const [selectedEmoji, setSelectedEmoji] = useState("😀")
// Store output state locally
const [outputText, setOutputText] = useState("") const [outputText, setOutputText] = useState("")
const [errorText, setErrorText] = useState("") const [errorText, setErrorText] = useState("")
// Update URL when input state changes // Update URL when mode changes
const updateURL = (updates: Record<string, string>) => { const updateMode = (newMode: string) => {
const params = new URLSearchParams(searchParams) const params = new URLSearchParams(searchParams)
Object.entries(updates).forEach(([key, value]) => { params.set("mode", newMode)
if (value) {
params.set(key, value)
} else {
params.delete(key)
}
})
router.replace(`?${params.toString()}`) router.replace(`?${params.toString()}`)
} }
@ -50,29 +42,16 @@ export function Base64EncoderDecoderContent() {
}, [mode, selectedEmoji, inputText]) }, [mode, selectedEmoji, inputText])
const handleModeToggle = (checked: boolean) => { const handleModeToggle = (checked: boolean) => {
const newMode = checked ? "encode" : "decode" updateMode(checked ? "encode" : "decode")
const params = { setInputText("") // Clear input text when mode changes
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 // Handle initial URL state
useEffect(() => { useEffect(() => {
const params = new URLSearchParams(searchParams) if (!searchParams.has("mode")) {
if (!params.has("mode")) { updateMode("encode")
updateURL({ mode: "encode" })
} }
}, []) }, [searchParams, updateMode])
const isEncoding = mode === "encode" const isEncoding = mode === "encode"
@ -89,13 +68,13 @@ export function Base64EncoderDecoderContent() {
<Textarea <Textarea
placeholder={isEncoding ? "Enter text to encode" : "Paste an emoji to decode"} placeholder={isEncoding ? "Enter text to encode" : "Paste an emoji to decode"}
value={inputText} value={inputText}
onChange={(e) => handleInputChange(e.target.value)} onChange={(e) => setInputText(e.target.value)}
className="min-h-[100px]" className="min-h-[100px]"
/> />
<div className="font-bold text-sm">Pick an emoji</div> <div className="font-bold text-sm">Pick an emoji</div>
<EmojiSelector <EmojiSelector
onEmojiSelect={handleEmojiSelect} onEmojiSelect={setSelectedEmoji}
selectedEmoji={selectedEmoji} selectedEmoji={selectedEmoji}
emojiList={EMOJI_LIST} emojiList={EMOJI_LIST}
disabled={!isEncoding} disabled={!isEncoding}
@ -103,7 +82,7 @@ export function Base64EncoderDecoderContent() {
<div className="font-bold text-sm">Or pick a standard alphabet letter</div> <div className="font-bold text-sm">Or pick a standard alphabet letter</div>
<EmojiSelector <EmojiSelector
onEmojiSelect={handleEmojiSelect} onEmojiSelect={setSelectedEmoji}
selectedEmoji={selectedEmoji} selectedEmoji={selectedEmoji}
emojiList={ALPHABET_LIST} emojiList={ALPHABET_LIST}
disabled={!isEncoding} disabled={!isEncoding}