This PR moves the entire project to Typescript. Due to the ~1000 ignores this will lead to a messy codebase for a while, but the churn is worth it – all of those ignore comments are places that were never type-safe previously. closes #1282
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import { SearchIcon } from "outline-icons";
|
|
import * as React from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { useTheme } from "styled-components";
|
|
import Input, { Props as InputProps } from "./Input";
|
|
|
|
type Props = InputProps & {
|
|
placeholder?: string;
|
|
value?: string;
|
|
onChange: (event: React.ChangeEvent<HTMLInputElement>) => unknown;
|
|
onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => unknown;
|
|
};
|
|
|
|
export default function InputSearch(props: Props) {
|
|
const { t } = useTranslation();
|
|
const theme = useTheme();
|
|
const [isFocused, setIsFocused] = React.useState(false);
|
|
const handleFocus = React.useCallback(() => {
|
|
setIsFocused(true);
|
|
}, []);
|
|
|
|
const handleBlur = React.useCallback(() => {
|
|
setIsFocused(false);
|
|
}, []);
|
|
|
|
const { placeholder = `${t("Search")}…`, onKeyDown, ...rest } = props;
|
|
|
|
return (
|
|
<Input
|
|
type="search"
|
|
placeholder={placeholder}
|
|
icon={
|
|
<SearchIcon
|
|
color={isFocused ? theme.inputBorderFocused : theme.inputBorder}
|
|
/>
|
|
}
|
|
onKeyDown={onKeyDown}
|
|
onFocus={handleFocus}
|
|
onBlur={handleBlur}
|
|
margin={0}
|
|
labelHidden
|
|
{...rest}
|
|
/>
|
|
);
|
|
}
|