All files / publisher/components/Filter Filter.tsx

80% Statements 8/10
75% Branches 3/4
100% Functions 3/3
80% Lines 8/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59                          20x 20x   20x                             1x 1x 1x                     1x 1x                          
import { useSearchParams } from "react-router-dom";
import { useSetRecoilState } from "recoil";
import { Button, Icon } from "@canonical/react-components";
 
import type { RecoilState } from "recoil";
 
type Props = {
  state: RecoilState<string>;
  label: string;
  placeholder: string;
};
 
function Filter({ state, label, placeholder }: Props): React.JSX.Element {
  const [searchParams, setSearchParams] = useSearchParams();
  const setFilter = useSetRecoilState(state);
 
  return (
    <div className="p-search-box">
      <label className="u-off-screen" htmlFor="search">
        {label}
      </label>
      <input
        required
        type="search"
        id="search"
        name="search"
        className="p-search-box__input"
        placeholder={placeholder}
        autoComplete="off"
        value={searchParams.get("filter") || ""}
        onChange={(e) => {
          if (e.target.value) {
            setSearchParams({ filter: e.target.value });
            setFilter(e.target.value);
          } else E{
            setSearchParams();
            setFilter("");
          }
        }}
      />
      <Button
        type="reset"
        className="p-search-box__reset"
        onClick={() => {
          setSearchParams();
          setFilter("");
        }}
      >
        <Icon name="close">Clear filter</Icon>
      </Button>
      <Button type="submit" className="p-search-box__button">
        <Icon name="search">Search</Icon>
      </Button>
    </div>
  );
}
 
export default Filter;