import React, { useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSearch, faXmark, faSpinner, } from '@fortawesome/free-solid-svg-icons'; import TypeDocument from './TypeDocument'; import TypeAnswer from './TypeAnswer'; import TypeQuestionAnswer from './TypeQuestionAnswer'; import TypeNotFound from './TypeNotFound'; import { FeaturedResultsItem, QueryResultItem } from '@aws-sdk/client-kendra'; import { sendQuery } from '../lib/fetcher'; import { useForm } from 'react-hook-form'; import './ItemList.css'; const API_ENDPOINT = process.env.REACT_APP_API_ENDPOINT!; interface Query { query: string; } function ItemList() { const [items, setItems] = useState([]); const [featuredResults, setFeaturedResults] = useState( [] ); const [loading, setLoading] = useState(false); const [queryOnce, setQueryOnce] = useState(false); const { register, watch, handleSubmit, setValue } = useForm(); const watchQuery = watch('query', ''); const onSubmit = async (data: Query) => { if (data.query.length === 0) return; setQueryOnce(true); setLoading(true); setItems([]); setFeaturedResults([]); const result = await sendQuery(API_ENDPOINT, data.query); setItems(result.ResultItems ?? []); setFeaturedResults(result.FeaturedResultsItems ?? []); setLoading(false); }; return (

Kendra 検索サンプル

{watchQuery.length > 0 && ( { setValue('query', ''); }} /> )}
{queryOnce && !loading && items.length === 0 && featuredResults.length === 0 && } {loading && (
)} {/* 通常の検索結果より先に、FeaturedResultsを表示する */} {!loading && featuredResults.map((item) => { return ; })} {!loading && items.map((item: QueryResultItem) => { switch (item.Type) { case 'DOCUMENT': return ; case 'ANSWER': return ; case 'QUESTION_ANSWER': return ; default: return <>Unknown Type: {item.Type}; } })}
); } export default ItemList;