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 { useForm } from 'react-hook-form'; import './ItemList.css'; import useQuery from '../lib/useQuery'; 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', ''); // [Auth 拡張実装] アクセストークン設定の処理があるため、useQueryを新設 const { send } = useQuery(); const onSubmit = async (data: Query) => { if (data.query.length === 0) return; setQueryOnce(true); setLoading(true); setItems([]); const result = await send(data.query); setItems(result?.ResultItems ?? []); setFeaturedResults(result?.FeaturedResultsItems ?? []); setLoading(false); }; return (

Kendra Auth 検索サンプル

{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;