1
1
import { parseWithZod } from "@conform-to/zod" ;
2
2
import { Anchor , Card , Container , Divider , Group , Stack } from "@mantine/core" ;
3
- import type {
4
- ActionFunctionArgs ,
5
- LinksFunction ,
6
- LoaderFunctionArgs ,
7
- MetaFunction ,
8
- } from "react-router" ;
9
- import {
10
- data ,
11
- Link ,
12
- redirect ,
13
- useActionData ,
14
- useLoaderData ,
15
- useNavigation ,
16
- } from "react-router" ;
3
+ import { data , Link , redirect , useNavigation } from "react-router" ;
17
4
import { getQuery , withQuery } from "ufo" ;
18
5
19
6
import Fa6SolidMagnifyingGlass from "~icons/fa6-solid/magnifying-glass" ;
@@ -27,8 +14,9 @@ import {
27
14
searchApiV1DataSearchGet ,
28
15
} from "../generated/api/client" ;
29
16
import type { SearchedNote , Topic } from "../generated/api/schemas" ;
17
+ import type { Route } from "./+types/_index" ;
30
18
31
- export const meta : MetaFunction = ( ) => {
19
+ export const meta : Route . MetaFunction = ( ) => {
32
20
return [
33
21
{ title : "BirdXplorer" } ,
34
22
{
@@ -43,7 +31,7 @@ export const meta: MetaFunction = () => {
43
31
] ;
44
32
} ;
45
33
46
- export const links : LinksFunction = ( ) => {
34
+ export const links : Route . LinksFunction = ( ) => {
47
35
return [
48
36
{
49
37
rel : "canonical" ,
@@ -52,7 +40,7 @@ export const links: LinksFunction = () => {
52
40
] ;
53
41
} ;
54
42
55
- export const loader = async ( args : LoaderFunctionArgs ) => {
43
+ export const loader = async ( args : Route . LoaderArgs ) => {
56
44
const rawSearchParams = getQuery ( args . request . url ) ;
57
45
const searchQuery =
58
46
await noteSearchParamSchema . safeParseAsync ( rawSearchParams ) ;
@@ -96,9 +84,10 @@ export const loader = async (args: LoaderFunctionArgs) => {
96
84
} ;
97
85
} ;
98
86
99
- export default function Index ( ) {
100
- const loaderData = useLoaderData < typeof loader > ( ) ;
101
- const lastResult = useActionData < typeof action > ( ) ;
87
+ export default function Index ( {
88
+ actionData,
89
+ loaderData,
90
+ } : Route . ComponentProps ) {
102
91
const isLoadingSearchResults = useNavigation ( ) . state !== "idle" ;
103
92
104
93
const {
@@ -121,7 +110,7 @@ export default function Index() {
121
110
< h2 className = "sr-only" > コミュニティノートを検索する</ h2 >
122
111
< SearchForm
123
112
defaultValue = { searchQuery ?? undefined }
124
- lastResult = { lastResult }
113
+ lastResult = { actionData }
125
114
topics = {
126
115
// react-router の型がうまく機能せず topics が unknown になったため
127
116
topics as Topic [ ]
@@ -203,7 +192,7 @@ export default function Index() {
203
192
) ;
204
193
}
205
194
206
- export const action = async ( { request } : ActionFunctionArgs ) => {
195
+ export const action = async ( { request } : Route . ActionArgs ) => {
207
196
const formData = await request . formData ( ) ;
208
197
const submission = parseWithZod ( formData , {
209
198
schema : noteSearchParamSchema ,
0 commit comments