import { TimelineInfo } from "@/services/timeline"; import React from "react"; import { Container, Row } from "react-bootstrap"; import { useHistory, useLocation } from "react-router"; import { Link } from "react-router-dom"; import { getHttpSearchClient } from "@/http/search"; import SearchInput from "../common/SearchInput"; import { HttpNetworkError } from "@/http/common"; import { useAvatar } from "@/services/user"; import BlobImage from "../common/BlobImage"; const TimelineSearchResultItemView: React.FC<{ timeline: TimelineInfo }> = ({ timeline, }) => { const link = timeline.name.startsWith("@") ? `users/${timeline.owner.username}` : `timelines/${timeline.name}`; const avatar = useAvatar(timeline.owner.username); return (

{timeline.title} {timeline.name}

{timeline.owner.nickname} @{timeline.owner.username}
); }; const SearchPage: React.FC = () => { const history = useHistory(); const location = useLocation(); const searchParams = new URLSearchParams(location.search); const queryParam = searchParams.get("q"); const [searchText, setSearchText] = React.useState(""); const [state, setState] = React.useState< TimelineInfo[] | "init" | "loading" | "network-error" | "error" >("init"); React.useEffect(() => { if (queryParam != null && queryParam.length > 0) { setSearchText(queryParam); setState("loading"); void getHttpSearchClient() .searchTimelines(queryParam) .then( (ts) => { setState(ts); }, (e) => { if (e instanceof HttpNetworkError) { setState("network-error"); } else { setState("error"); } } ); } }, [queryParam]); return ( { if (searchText.length > 0) { history.push(`/search?q=${searchText}`); } }} /> {(() => { switch (state) { case "init": { return "Input something and search!"; } case "loading": { return "Loading!"; } case "network-error": { return "Network error!"; } case "error": { return "Unknown error!"; } default: { return state.map((t) => ( )); } } })()} ); }; export default SearchPage;