From 46e3dbf857438d2e5f9b89fd987b872ad65305c4 Mon Sep 17 00:00:00 2001 From: wappon28dev Date: Wed, 4 Sep 2024 20:37:13 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20`/create`=20=E3=81=A8=E3=81=9D?= =?UTF-8?q?=E3=81=AE=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 307601 -> 307591 bytes package.json | 3 +- src/components/achievements/Card.tsx | 8 +- .../achievements/UnlockableCard.tsx | 4 +- src/lib/consts.ts | 2 +- src/pages/achievements/[id]/index.tsx | 2 +- src/pages/create/index.tsx | 238 +++++++++++++----- src/types/post-data/achievements.ts | 11 +- 8 files changed, 195 insertions(+), 73 deletions(-) diff --git a/bun.lockb b/bun.lockb index db6fe8a00c2c898db8c004daa5bc8b1c6c026f37..7361756c26d652611e5ee813b68e6d266a040500 100755 GIT binary patch delta 36992 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 diff --git a/package.json b/package.json index 0c79e6e..4cc8657 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "dependencies": { "@fontsource-variable/noto-sans-jp": "^5.0.19", "@generouted/react-router": "^1.19.3", + "@hookform/resolvers": "^3.9.0", "@iconify/react": "^4.1.1", "@nanostores/persistent": "^0.10.1", "@nanostores/react": "^0.7.2", @@ -66,6 +67,6 @@ "typescript": "^5.4.5", "vite": "^5.2.0", "vite-tsconfig-paths": "^4.3.2", - "wrangler": "^3.61.0" + "wrangler": "^3.73.0" } } diff --git a/src/components/achievements/Card.tsx b/src/components/achievements/Card.tsx index 6be41ab..9ceacc4 100644 --- a/src/components/achievements/Card.tsx +++ b/src/components/achievements/Card.tsx @@ -86,8 +86,12 @@ export function AchievementCard({ - #{achievement.tags[0].name} - #{achievement.tags[0].name} + {achievement.tags.map((t, idx) => ( + // eslint-disable-next-line react/no-array-index-key + + #{t} + + ))} ); } diff --git a/src/components/achievements/UnlockableCard.tsx b/src/components/achievements/UnlockableCard.tsx index 6ffa85b..91bc864 100644 --- a/src/components/achievements/UnlockableCard.tsx +++ b/src/components/achievements/UnlockableCard.tsx @@ -98,8 +98,8 @@ export function UnlockableCard({ - #{achievement.tags[0].name} - #{achievement.tags[0].name} + #{achievement.tags} + #{achievement.tags} ); } diff --git a/src/lib/consts.ts b/src/lib/consts.ts index e68d6fc..c35a3fc 100644 --- a/src/lib/consts.ts +++ b/src/lib/consts.ts @@ -34,4 +34,4 @@ export function getLocalStorageKey(key: string, trailingColon = false): string { return `${APP_NAME}.v${LOCAL_STORAGE_VERSION}.${key}${trailingColon ? ":" : ""}`; } -export const DB_VERSION = "1"; +export const DB_VERSION = "2"; diff --git a/src/pages/achievements/[id]/index.tsx b/src/pages/achievements/[id]/index.tsx index c420353..2da42ba 100644 --- a/src/pages/achievements/[id]/index.tsx +++ b/src/pages/achievements/[id]/index.tsx @@ -27,7 +27,7 @@ export default function Page(): ReactElement {

icon: {d.icon}

createdAt: {String(d.createdAt)}

updatedAt: {String(d.updatedAt)}

-

tags: {d.tags.map((tag) => tag.name).join(", ")}

+

tags: {d.tags.join(", ")}

); } diff --git a/src/pages/create/index.tsx b/src/pages/create/index.tsx index 1f72a0d..7b67420 100644 --- a/src/pages/create/index.tsx +++ b/src/pages/create/index.tsx @@ -1,5 +1,6 @@ /* eslint-disable react-refresh/only-export-components */ +import { yupResolver } from "@hookform/resolvers/yup"; import { Icon } from "@iconify/react"; import { TextField, @@ -11,9 +12,13 @@ import { Popover, } from "@radix-ui/themes"; import { useState, type ReactElement } from "react"; -import { useForm, type SubmitHandler } from "react-hook-form"; +import { type SubmitHandler, useForm } from "react-hook-form"; import styled from "styled-components"; -import { type Achievement } from "@/types/post-data/achievements"; +import { match } from "ts-pattern"; +import { useAchievements } from "@/hooks/db/achievements"; +import { useTeam } from "@/hooks/teams"; +import yup from "@/lib/yup-locate"; +import { type Achievement, yAchievement } from "@/types/post-data/achievements"; const FormStyle = styled(Flex)` margin-top: 4rem; @@ -34,7 +39,7 @@ const AvatarStyle = styled(Avatar)` border: 10px solid #e7e7e7; `; -const Button1 = styled(Box)` +const SubmitButton = styled.input` font-weight: 600; font-family: sans-serif; font-size: 1rem; @@ -57,6 +62,7 @@ const Button1 = styled(Box)` overflow: hidden; position: relative; z-index: 1; + cursor: pointer; box-shadow: 6px 6px 16px #b5bec9, @@ -92,6 +98,15 @@ const Button1 = styled(Box)` transform: scaleX(100%); transform: none; } + + &:disabled { + cursor: not-allowed; + opacity: 0.3; + color: #ffffff; + background-color: #00cdc2; + transform: scale(1.06); + box-shadow: none; + } `; const PlusButton = styled(IconButton)` @@ -108,7 +123,7 @@ const PlusButton = styled(IconButton)` } `; -const ImputStyle = styled(TextField.Root)` +const TextInput = styled(TextField.Root)<{ invalid: number }>` position: relative; background-color: #e7e7e7; margin-top: 0.6rem; @@ -119,50 +134,120 @@ const ImputStyle = styled(TextField.Root)` margin-left: 0.4rem; color: #737a89; } + border: 2px solid ${({ invalid }) => (invalid !== 0 ? "#e03b3b" : "unset")}; `; -export default function create(): ReactElement { - const [selectIcon, setSelectIcon] = useState( - "https://api.iconify.design/twemoji:trophy.svg", - ); +const MessageContainer = styled(Flex)` + justify-content: center; + align-items: center; + font-size: 0.8rem; + gap: 10px; +`; - const { register, handleSubmit, setValue } = useForm({ - mode: "onSubmit", +const ErrorMessageContainer = styled(MessageContainer)` + color: #e03b3b; +`; + +const SuccessMessageContainer = styled(MessageContainer)` + color: #00cdc2; +`; + +const ErrorMessage = styled(Text)` + color: #e03b3b; + font-size: 0.8rem; +`; + +const yAchievementForm = yAchievement.concat( + yup.object({ + id: yup.mixed().notRequired(), + createdAt: yup.mixed().notRequired(), + updatedAt: yup.mixed().notRequired(), + }), +); + +const ICON_URLS = [ + "https://api.iconify.design/twemoji:trophy.svg", + "https://api.iconify.design/twemoji:meat-on-bone.svg", + "https://api.iconify.design/twemoji:horse-racing-medium-skin-tone.svg", + "https://api.iconify.design/twemoji:steaming-bowl.svg", + "https://api.iconify.design/twemoji:shopping-cart.svg", + "https://api.iconify.design/twemoji:page-facing-up.svg", + "https://api.iconify.design/twemoji:laptop.svg", + "https://api.iconify.design/twemoji:zombie.svg", + "https://api.iconify.design/twemoji:face-with-symbols-on-mouth.svg", + "https://api.iconify.design/twemoji:broken-heart.svg", + "https://api.iconify.design/twemoji:fire.svg", + "https://api.iconify.design/twemoji:beer-mug.svg", + "https://api.iconify.design/twemoji:beetle.svg", + "https://api.iconify.design/twemoji:bathtub.svg", + "https://api.iconify.design/twemoji:broccoli.svg", + "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUqLcDsoa_vMqHK_IPFR4GoMT9RYnH6gtzw9nqHl2AfJeQI7Bm6vd2LphkvWznofSU0yXGcFCWEmO1owcCDJKqaijH4sDyK6r7gwjHUoqD-lVYxHPO9m6khg559gSY2FVv9qia_dHQPxbQ/s800/school_tani_otosu_boy.png", + "https://qr.paps.jp/8o3Og", + "https://i.imgur.com/5TaVIlf.gif", + "https://qr.paps.jp/fblo0", + "https://i.gifer.com/9ZNS.gif", +] as const; + +export default function Page(): ReactElement { + const { + register, + handleSubmit, + setValue, + getValues, + formState, + setError, + reset, + } = useForm({ + mode: "onBlur", + reValidateMode: "onChange", + resolver: yupResolver(yAchievementForm), + defaultValues: { + icon: ICON_URLS[0], + }, }); - const onSubmit: SubmitHandler = (data) => { - // eslint-disable-next-line no-console - console.log(data); - }; + const { errors, isSubmitting } = formState; + const { fetch, update } = useAchievements(useTeam); + + const [isPopoverOpened, setPopoverOpened] = useState(false); - const iconUrl = [ - "https://api.iconify.design/twemoji:trophy.svg", - "https://api.iconify.design/twemoji:meat-on-bone.svg", - "https://api.iconify.design/twemoji:horse-racing-medium-skin-tone.svg", - "https://api.iconify.design/twemoji:steaming-bowl.svg", - "https://api.iconify.design/twemoji:shopping-cart.svg", - "https://api.iconify.design/twemoji:page-facing-up.svg", - "https://api.iconify.design/twemoji:laptop.svg", - "https://api.iconify.design/twemoji:zombie.svg", - "https://api.iconify.design/twemoji:face-with-symbols-on-mouth.svg", - "https://api.iconify.design/twemoji:broken-heart.svg", - "https://api.iconify.design/twemoji:fire.svg", - "https://api.iconify.design/twemoji:beer-mug.svg", - "https://api.iconify.design/twemoji:beetle.svg", - "https://api.iconify.design/twemoji:bathtub.svg", - "https://api.iconify.design/twemoji:broccoli.svg", - "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUqLcDsoa_vMqHK_IPFR4GoMT9RYnH6gtzw9nqHl2AfJeQI7Bm6vd2LphkvWznofSU0yXGcFCWEmO1owcCDJKqaijH4sDyK6r7gwjHUoqD-lVYxHPO9m6khg559gSY2FVv9qia_dHQPxbQ/s800/school_tani_otosu_boy.png", - "https://qr.paps.jp/8o3Og", - "https://i.imgur.com/5TaVIlf.gif", - "https://qr.paps.jp/fblo0", - "https://i.gifer.com/9ZNS.gif", - ]; + const onSubmit: SubmitHandler< + yup.InferType + > = async (data) => { + try { + const achievements = await fetch(); + if (achievements == null) { + throw new Error( + "`achievements` is null! Maybe you forgot to call `init()`", + ); + } + + const achievement: Achievement = { + ...data, + tags: data.tags.filter((tag) => tag !== ""), + id: achievements.length + 1, + createdAt: new Date(), + updatedAt: new Date(), + }; + + await update([...achievements, achievement]); + reset(); + } catch (e) { + setError("root.submit", { message: String(e) }); + throw e; + } + }; return ( - // eslint-disable-next-line @typescript-eslint/no-misused-promises -
+ { + // eslint-disable-next-line no-console + console.error("Form validation failed", e); + })} + > - + @@ -170,18 +255,20 @@ export default function create(): ReactElement { - {iconUrl.map((url, index) => ( + {ICON_URLS.map((url) => ( { - setSelectIcon(url); setValue("icon", url); + setPopoverOpened(false); }} + radius="full" + size="4" + value={getValues("icon")} variant="ghost" {...register("icon")} - size="4" > @@ -194,65 +281,104 @@ export default function create(): ReactElement { mb="4vh" mt="4vh" size="9" - src={selectIcon} + src={getValues("icon")} /> 実績名 - + {errors.name?.message ?? ""} 実績につけるタグ - + {errors.tags?.message ?? ""} 実績につけるタグ - - 実績の詳細 + 実績の説明 - + {errors?.description?.message ?? ""} - - - + + {match(formState) + .with({ isDirty: false }, () => undefined) + .with({ isSubmitting: true }, () => ( + + +

実績を追加中...

+
+ )) + .with({ isSubmitSuccessful: true }, () => ( + + +

実績は正常に追加されました

+
+ )) + .when( + () => errors.root?.submit != null, + () => ( + + + + 追加中にエラーが発生しました:{" "} + {errors.root?.submit.message ?? ""} + + + ), + ) + .otherwise(() => undefined)}
); diff --git a/src/types/post-data/achievements.ts b/src/types/post-data/achievements.ts index 2d23a45..d6cdb49 100644 --- a/src/types/post-data/achievements.ts +++ b/src/types/post-data/achievements.ts @@ -6,16 +6,7 @@ export const yAchievement = yup.object().shape({ name: yup.string().required(), description: yup.string().required(), icon: yup.string().required(), - tags: yup - .array() - .of( - yup.object().shape({ - id: yup.number().required(), - name: yup.string().required(), - color: yup.string().required(), - }), - ) - .required(), + tags: yup.array().of(yup.string()).required(), createdAt: yup.date().required(), updatedAt: yup.date().required(), });