import { Button, Dropdown, DropdownButton, Form, InputGroup, ListGroup, Offcanvas, } from "react-bootstrap"; import classNames from "classnames"; import styles from "~/components/RequestList/RequestList.module.scss"; import RequestSummary from "~/components/RequestSummary/RequestSummary"; import * as React from "react"; import { useCallback, useContext, useMemo, useState } from "react"; import { Method, RequestResponse } from "~/hooks/useRequests"; import { DarkModeContext } from "~/contexts/DarkMode"; import Filter from "~/components/Icons/Filter"; interface ListProps { requests: RequestResponse[]; selectedRequestIndex: number | null; setSelectedRequestIndex: (index: number) => void; } type EnabledMethods = { [method in Method]: boolean; }; export default function RequestList({ requests, selectedRequestIndex, setSelectedRequestIndex, }: ListProps) { const { darkMode } = useContext(DarkModeContext); const [showFilterOptions, setShowFilterOptions] = useState(false); const [search, setSearch] = useState(""); const [enableRegex, setEnableRegex] = useState(false); const [methods, setMethods] = useState({ GET: true, HEAD: true, POST: true, PUT: true, DELETE: true, CONNECT: true, OPTIONS: true, TRACE: true, PATCH: true, }); const toggleMethods = useCallback((method: Method | null) => { const enabled = method == null; const methods: EnabledMethods = { GET: enabled, HEAD: enabled, POST: enabled, PUT: enabled, DELETE: enabled, CONNECT: enabled, OPTIONS: enabled, TRACE: enabled, PATCH: enabled, }; if (method !== null) { methods[method] = true; } setMethods(methods); }, []); const enabledMethods: Method[] = useMemo( () => Object.entries(methods) .filter(([method, enabled]) => enabled) .map(([method]) => method), [methods] ); const methodLabel = useMemo(() => { if (enabledMethods.length == 1) { return enabledMethods[0]; } else if (enabledMethods.length === Object.keys(methods).length) { return "ANY"; } else { return "CUSTOM"; } }, [enabledMethods]); const filteredRequests = useMemo(() => { let searchRegex = new RegExp(""); try { searchRegex = new RegExp( enableRegex ? search : search.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i" ); } catch {} return requests .map<[number, RequestResponse]>((request, index) => [index, request]) .reverse() .filter( ([index, request]) => enabledMethods.length > 0 === null || enabledMethods.includes(request.request.method) ) .filter( ([index, request]) => search === "" || searchRegex.test(request.request.path) ); }, [requests, search, enabledMethods, enableRegex]); return (
toggleMethods(null)}> ANY {Object.entries(methods).map(([method, enabled]) => ( toggleMethods(method as Method)}> {method} ))} setSearch(target.value)} /> {filteredRequests.length > 0 ? ( filteredRequests.map(([index, requestResponse]) => { const selected = selectedRequestIndex === index; return ( setSelectedRequestIndex(index)} key={`request-${index}`} className={classNames({ "bg-primary": selected, "text-light": selected, "border-bottom": true, })} > ); }) ) : (

No requests

)}
setShowFilterOptions(false)} > Filter Options Search setSearch(target.value)} /> setEnableRegex(!enableRegex)} /> Method {Object.entries(methods).map(([method, enabled]) => ( setMethods({ ...methods, [method]: !enabled })} /> ))}
); }