フォームのバリデーションとニコ連携の画面変更 (#090) #355

マージ済み
みてるぞ が 11 個のコミットを feature/090 から main へマージ 2026-06-05 01:59:46 +09:00
3個のファイルの変更13行の追加12行の削除
コミット ba960de76f の変更だけを表示してゐます - すべてのコミットを表示
+5 -5
ファイルの表示
@@ -79,7 +79,7 @@ const PostEditForm: FC<Props> = ({ post, onSave }) => {
if (response?.status !== 409) if (response?.status !== 409)
{ {
const validationError = extractValidationError (e) const validationError = extractValidationError<PostFormField> (e)
if (validationError) if (validationError)
{ {
@@ -145,6 +145,8 @@ const PostEditForm: FC<Props> = ({ post, onSave }) => {
return ( return (
<form onSubmit={handleSubmit} className="max-w-xl pt-2 space-y-4"> <form onSubmit={handleSubmit} className="max-w-xl pt-2 space-y-4">
<FieldError messages={baseErrors}/>
{/* タイトル */} {/* タイトル */}
<div> <div>
<Label></Label> <Label></Label>
@@ -166,7 +168,7 @@ const PostEditForm: FC<Props> = ({ post, onSave }) => {
disabled={disabled} disabled={disabled}
value={parentPostIds} value={parentPostIds}
onChange={e => setParentPostIds (e.target.value)} onChange={e => setParentPostIds (e.target.value)}
alia-invalid={fieldErrors.parentPostIds && fieldErrors.parentPostIds.length > 0} aria-invalid={fieldErrors.parentPostIds && fieldErrors.parentPostIds.length > 0}
className={inputClass (fieldErrors.parentPostIds className={inputClass (fieldErrors.parentPostIds
&& fieldErrors.parentPostIds.length > 0)}/> && fieldErrors.parentPostIds.length > 0)}/>
<FieldError messages={fieldErrors.parentPostIds}/> <FieldError messages={fieldErrors.parentPostIds}/>
@@ -189,9 +191,7 @@ const PostEditForm: FC<Props> = ({ post, onSave }) => {
errors={fieldErrors.originalCreatedAt}/> errors={fieldErrors.originalCreatedAt}/>
{/* 送信 */} {/* 送信 */}
<Button <Button type="submit" disabled={disabled}>
type="submit"
disabled={disabled}>
</Button> </Button>
</form>) </form>)
+1 -1
ファイルの表示
@@ -4,7 +4,7 @@ type Props = { messages?: string[] }
export const FieldError: FC<Props> = ({ messages }: Props) => { export const FieldError: FC<Props> = ({ messages }: Props) => {
if (!(messages?.length)) if (!(messages) || messages.length === 0)
return null return null
return ( return (
+7 -6
ファイルの表示
@@ -2,11 +2,12 @@ import toCamel from 'camelcase-keys'
import { isApiError } from '@/lib/api' import { isApiError } from '@/lib/api'
export type FieldErrors = Partial<Record<string, string[]>> export type FieldErrors<T extends string = string> = Partial<Record<T, string[]>>
export type ValidationError = { message: string export type ValidationError<T extends string = string> =
fieldErrors: FieldErrors { message: string
baseErrors: string[] } fieldErrors: FieldErrors<T>
baseErrors: string[] }
type RawValidationError = { type?: string type RawValidationError = { type?: string
message?: string message?: string
@@ -14,7 +15,7 @@ type RawValidationError = { type?: string
baseErrors?: string[] } baseErrors?: string[] }
export const extractValidationError = (err: unknown) => { export const extractValidationError = <T extends string = string> (err: unknown) => {
if (!(isApiError (err)) || err.response?.status !== 422) if (!(isApiError (err)) || err.response?.status !== 422)
return null return null
@@ -25,6 +26,6 @@ export const extractValidationError = (err: unknown) => {
return null return null
return { message: data.message ?? '入力内容を確認してください.', return { message: data.message ?? '入力内容を確認してください.',
fieldErrors: (data.errors ?? { }) as FieldErrors, fieldErrors: (data.errors ?? { }) as FieldErrors<T>,
baseErrors: data.baseErrors ?? [] } baseErrors: data.baseErrors ?? [] }
} }