"use client"; import * as React from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { Skeleton } from "./ui/skeleton"; import { Input } from "@/components/ui/input"; import { UsersService, UserSearchResults } from "@/lib/api/client"; const searchOnFields = ["id", "email", "forename", "surname"]; const FormSchema = z.object({ keyword: z.string().optional(), searchOn: z.enum(["id", "email", "forename", "surname"]).optional(), searchResults: z .string() .min(1, { message: "Must return at least 1 result", }) .optional(), }); export default function SearchUsers() { const [searchResults, setSearchResults] = React.useState({ results: [], }); const [error, setError] = React.useState(null); const [loading, setLoading] = React.useState(false); const form = useForm>({ resolver: zodResolver(FormSchema), defaultValues: { keyword: ".com", searchOn: "email", searchResults: "10", }, }); const onSubmit = async (data: z.infer) => { console.log(data); try { setLoading(true); // set loading state setError(null); // clear error state if it exists const maxResults = data.searchResults ? parseInt(data.searchResults) : 10; const response = await UsersService.usersSearchUsers({ keyword: data.keyword, searchOn: data.searchOn, maxResults: maxResults, }); setLoading(false); console.log(response); setSearchResults(response); setError(null); } catch (error) { console.log("Error received", error); setLoading(false); setSearchResults({ results: [] }); setError(error); } }; return (
FastAPI data Data coming from FastAPI backend
( Keyword The keyword to search. )} /> ( Max results Set maximum number of results to return. )} /> ( Search field {searchOnFields.map((item) => ( {item.charAt(0).toUpperCase() + item.slice(1)} ))} The field to search on. )} />
{loading ? ( ) : null} {searchResults.results.length >= 1 ? ( // Render the results if searchResults is set
{/* Replace this with your code to render the results */}
{JSON.stringify(searchResults, null, 2)}
) : null} {/* This can be handled better to understand what type of error is occurring rather than just a blanket handler */} {error ? (
Couldn't find any results that match your criteria. Please try again.
) : null}
); }