diff --git a/package.json b/package.json index d9dbfa5..0e4c23d 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "fp-ts": "^2.11.9", "fuse.js": "^6.5.3", "html-entities": "^2.3.3", + "js-base64": "^3.7.2", "next": "12.1.0", "react": "17.0.2", "react-ace": "^9.5.0", diff --git a/src/components/pages/encoders-decoders/base64/Content.tsx b/src/components/pages/encoders-decoders/base64/Content.tsx new file mode 100644 index 0000000..7db2009 --- /dev/null +++ b/src/components/pages/encoders-decoders/base64/Content.tsx @@ -0,0 +1,53 @@ +import { encode, decode, isValid } from "js-base64"; +import { ComponentPropsWithoutRef, memo, useCallback, useState } from "react"; + +import { Main, MainItem, TextField } from "@/components/common"; + +type TextFieldValue = ComponentPropsWithoutRef["value"]; +type OnTextFieldChange = NonNullable["onChange"]>; + +type Props = { + decoded: TextFieldValue; + encoded: TextFieldValue; + onDecodedChange: OnTextFieldChange; + onEncodedChange: OnTextFieldChange; +}; + +const StyledComponent = ({ decoded, encoded, onDecodedChange, onEncodedChange }: Props) => ( +
+ + + + + + +
+); + +export const Component = memo(StyledComponent); + +const Container = () => { + const [decoded, setDecoded] = useState("Hello there !"); + const [encoded, setEncoded] = useState("SGVsbG8gdGhlcmUgIQ=="); + + const onDecodedChange: Props["onDecodedChange"] = useCallback(({ currentTarget: { value } }) => { + setDecoded(value); + setEncoded(encode(value)); + }, []); + + const onEncodedChange: Props["onEncodedChange"] = useCallback(({ currentTarget: { value } }) => { + setEncoded(value); + + const newDecoded = decode(value); + + if (isValid(value) && !newDecoded.includes("�")) { + setDecoded(newDecoded); + } else { + setDecoded(""); + } + }, []); + + return ; +}; + +export default Container; diff --git a/src/components/pages/encoders-decoders/base64/index.ts b/src/components/pages/encoders-decoders/base64/index.ts new file mode 100644 index 0000000..ae1b8af --- /dev/null +++ b/src/components/pages/encoders-decoders/base64/index.ts @@ -0,0 +1,3 @@ +import Content from "./Content"; + +export { Content }; diff --git a/src/data/tools.tsx b/src/data/tools.tsx index 239e4eb..fc1fdd7 100644 --- a/src/data/tools.tsx +++ b/src/data/tools.tsx @@ -73,8 +73,8 @@ const toolGroups = [ longTitle: "Base 64 Encoder / Decoder", description: "Encode and decode Base64 data", keywords: "base64 encoder decocder", - href: pagesPath.$url(), - disabled: true, + href: pagesPath.encoders_decoders.base64.$url(), + disabled: false, }, { icon: , diff --git a/src/libs/$path.ts b/src/libs/$path.ts index 8fe4fff..d61c174 100644 --- a/src/libs/$path.ts +++ b/src/libs/$path.ts @@ -14,6 +14,12 @@ export const pagesPath = { }, }, encoders_decoders: { + base64: { + $url: (url?: { hash?: string }) => ({ + pathname: "/encoders-decoders/base64" as const, + hash: url?.hash, + }), + }, html: { $url: (url?: { hash?: string }) => ({ pathname: "/encoders-decoders/html" as const, diff --git a/src/pages/encoders-decoders/base64.tsx b/src/pages/encoders-decoders/base64.tsx new file mode 100644 index 0000000..c299591 --- /dev/null +++ b/src/pages/encoders-decoders/base64.tsx @@ -0,0 +1,7 @@ +import type { NextPage } from "next"; + +import { Content } from "@/components/pages/encoders-decoders/base64"; + +const Page: NextPage = Content; + +export default Page; diff --git a/yarn.lock b/yarn.lock index 9fda584..43c236f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1625,6 +1625,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +js-base64@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745" + integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"