) {
@@ -46,12 +50,14 @@ export default function CardNaming({
;
}
export default function CardResult({ store }: CardResultProps) {
+ const [cards, setCards] = useLocalStorage("mycards", initialCards);
const navigate = useNavigate();
useEffect(() => {
- console.log(store);
+ const registration = store["register"] as CardRegistration;
+ const naming = store["naming"] as NameQuery;
+
+ const newCard: Card = {
+ uuid: v4(),
+ ...registration,
+ holderName: naming.cardName || registration.cardType,
+ createdAt: new Date(),
+ expiration: registration.expirationDate,
+ };
+
+ console.log("newCard", newCard);
+
+ cards ? setCards([...cards, newCard]) : setCards([newCard]);
navigate("/mycards");
- }, []);
+ }, [cards]);
return <>>;
}
diff --git a/src/domains/RegisterPage/RegisterPage.tsx b/src/domains/RegisterPage/RegisterPage.tsx
index 9ce7ee270..06d6014ee 100644
--- a/src/domains/RegisterPage/RegisterPage.tsx
+++ b/src/domains/RegisterPage/RegisterPage.tsx
@@ -1,6 +1,6 @@
import useFunnel from "../../hooks/useFunnel/useFunnel";
import CardRegister from "./CardRegister/CardRegister";
-import CardNaming from "./CardNaming/CardNaming";
+import CardNaming, { CardQuery } from "./CardNaming/CardNaming";
import CardResult from "./CardResult/CardResult";
export default function RegisterPage() {
@@ -21,6 +21,7 @@ export default function RegisterPage() {
{
setStep("result", value);
}}
diff --git a/src/domains/component/PlaticCard/PlasticCard.module.css b/src/domains/component/PlaticCard/PlasticCard.module.css
index 0046541d0..2d2c3d04c 100644
--- a/src/domains/component/PlaticCard/PlasticCard.module.css
+++ b/src/domains/component/PlaticCard/PlasticCard.module.css
@@ -1,4 +1,5 @@
.card__container {
+ position: relative;
width: 185px;
height: 115px;
border-radius: 4px;
diff --git a/src/hooks/useCards.ts b/src/hooks/useCards.ts
new file mode 100644
index 000000000..7de42453d
--- /dev/null
+++ b/src/hooks/useCards.ts
@@ -0,0 +1,42 @@
+import { useMemo } from "react";
+import { initialCards } from "../constants";
+import { Card } from "../domains/RegisterPage/CardRegister/types";
+import useLocalStorage from "./useLocalStorage";
+
+type useCardsArgs = {
+ sortByKey?: keyof Card;
+ sortMethod?: "asc" | "dcs";
+};
+
+export default function useCards({
+ sortByKey = "createdAt",
+ sortMethod = "asc",
+}: useCardsArgs) {
+ const [cards, setCards] = useLocalStorage("mycards", initialCards);
+
+ const sortedCards = useMemo(() => {
+ const isAscended = sortMethod === "asc";
+ return cards.sort((a, b) => {
+ const keyA = isAscended
+ ? a[sortByKey].toString()
+ : b[sortByKey].toString();
+ const keyB = isAscended
+ ? b[sortByKey].toString()
+ : a[sortByKey].toString();
+
+ if (keyA < keyB) return -1;
+ if (keyA > keyB) return 1;
+
+ return 0;
+ });
+ }, [cards, sortByKey, sortMethod]);
+
+ function deleteCard(uuid: string) {
+ return function deleteCard() {
+ const filtered = sortedCards.filter((value) => uuid !== value.uuid);
+ setCards(filtered);
+ };
+ }
+
+ return { cards: sortedCards, setCards, deleteCard };
+}
diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts
new file mode 100644
index 000000000..4f52ccfb5
--- /dev/null
+++ b/src/hooks/useLocalStorage.ts
@@ -0,0 +1,17 @@
+import { useCallback, useLayoutEffect, useState } from "react";
+
+export default function useLocalStorage(key: string, initialValue: T) {
+ const [store, setStore] = useState(initialValue);
+
+ const setStorage = useCallback((value: T) => {
+ setStore(value);
+ localStorage.setItem(key, JSON.stringify(value));
+ }, []);
+
+ useLayoutEffect(() => {
+ const existed = localStorage.getItem(key);
+ if (existed) return setStore(JSON.parse(existed));
+ }, []);
+
+ return [store, setStorage] as const;
+}
diff --git a/src/utils.ts b/src/utils.ts
index 5c98b789d..01cbae940 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -15,3 +15,11 @@ export function isNumberFromString(number: string) {
export function compareShallowValues(obj1: T, obj2: T) {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
+
+export function omitObj(obj: Record, keys: string[]) {
+ const copied = { ...obj };
+
+ keys.forEach((key) => delete copied[key]);
+
+ return copied as T;
+}
diff --git a/yarn.lock b/yarn.lock
index c92e86e7f..33a0989ec 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15293,6 +15293,7 @@ __metadata:
react-scripts: ^5.0.1
storybook: ^7.6.17
typescript: ^5.2.2
+ uuid: ^9.0.1
vite: ^5.1.4
languageName: unknown
linkType: soft
@@ -17916,7 +17917,7 @@ __metadata:
languageName: node
linkType: hard
-"uuid@npm:^9.0.0":
+"uuid@npm:^9.0.0, uuid@npm:^9.0.1":
version: 9.0.1
resolution: "uuid@npm:9.0.1"
bin: