|
import {FunctionalComponent} from "preact";
|
|
import {useState} from "preact/hooks";
|
|
import cn from "classnames";
|
|
import {JSX} from "preact";
|
|
|
|
import style from "./style.module.scss";
|
|
import {Settings} from "preact-feather";
|
|
import {FeatherProps} from "preact-feather/src/types";
|
|
|
|
interface InputProps<T> {
|
|
type: "text" | "number" | "email" | "password";
|
|
icon: FunctionalComponent<FeatherProps>;
|
|
value: T;
|
|
placeholder?: string;
|
|
onChange: (value: T) => void;
|
|
className?: string;
|
|
disabled?: boolean;
|
|
id?: string;
|
|
name?: string;
|
|
}
|
|
|
|
export const Input: FunctionalComponent<InputProps<string | number>> = ({
|
|
type,
|
|
icon,
|
|
value,
|
|
placeholder,
|
|
onChange,
|
|
className,
|
|
disabled,
|
|
id,
|
|
name,
|
|
}) => {
|
|
const [focused, setFocused] = useState(false);
|
|
|
|
const inputClass = cn(style.input, "generic-input", className, {
|
|
focused,
|
|
disabled,
|
|
});
|
|
|
|
const handleInputChange: JSX.GenericEventHandler<HTMLInputElement> = (event) => {
|
|
console.log("handleInputChange")
|
|
const target = event.target as HTMLInputElement;
|
|
onChange(type === "number" ? (parseFloat(target.value) || 0) : target.value);
|
|
};
|
|
|
|
const Icon = icon;
|
|
|
|
return (
|
|
<div className={style.wrapper}>
|
|
<Icon className={style.icon} size={18}/>
|
|
<input
|
|
// required=""
|
|
// minLength="3"
|
|
// maxLength="15"
|
|
title="Le pseudo doit avoir une longueur comprise entre 3 et 15 caractères."
|
|
// tabIndex="10"
|
|
type={type}
|
|
id={id}
|
|
name={name}
|
|
value={value}
|
|
placeholder={placeholder}
|
|
// onChange={handleInputChange}
|
|
onInput={handleInputChange}
|
|
className={inputClass}
|
|
disabled={disabled}
|
|
onFocus={() => setFocused(true)}
|
|
onBlur={() => setFocused(false)}
|
|
/>
|
|
</div>
|
|
)
|
|
|
|
return (
|
|
<input
|
|
type={type}
|
|
id={id}
|
|
name={name}
|
|
value={value}
|
|
placeholder={placeholder}
|
|
onChange={handleInputChange}
|
|
className={inputClass}
|
|
disabled={disabled}
|
|
onFocus={() => setFocused(true)}
|
|
onBlur={() => setFocused(false)}
|
|
/>
|
|
);
|
|
}; |