This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
website/components/design/Input/Input.tsx

81 lines
2.4 KiB
TypeScript
Raw Normal View History

import { useState } from "react"
import Link from "next/link"
import useTranslation from "next-translate/useTranslation"
import classNames from "clsx"
import { FormState } from "../FormState"
export interface InputProps extends React.ComponentPropsWithRef<"input"> {
label: string
error?: string | null
showForgotPassword?: boolean
2022-01-14 23:15:51 +01:00
className?: string
}
export const getInputType = (inputType: string): string => {
return inputType === "password" ? "text" : "password"
}
export const Input: React.FC<InputProps> = (props) => {
const {
label,
name,
2022-01-14 23:15:51 +01:00
className,
type = "text",
showForgotPassword = false,
error,
...rest
} = props
const { t } = useTranslation()
const [inputType, setInputType] = useState(type)
const handlePassword = (): void => {
const oppositeType = getInputType(inputType)
setInputType(oppositeType)
}
return (
<div className="flex flex-col">
<div className={classNames("mb-2 mt-6 flex justify-between", className)}>
<label className="pl-1" htmlFor={name}>
2022-12-13 22:31:32 +01:00
{label}
</label>
{type === "password" && showForgotPassword ? (
2022-12-13 22:31:32 +01:00
<Link
href="/authentication/forgot-password"
className="text-center font-headline text-xs text-green-800 hover:underline dark:text-green-400 sm:text-sm"
data-cy="forgot-password-link"
2022-12-13 22:31:32 +01:00
>
{t("authentication:forgot-password")}
2022-12-13 22:31:32 +01:00
</Link>
) : null}
</div>
<div className="relative mt-0">
2022-12-13 22:31:32 +01:00
<input
data-cy={`input-${name ?? "name"}`}
className="h-11 w-full rounded-lg border border-transparent bg-[#f1f1f1] px-3 font-paragraph leading-10 text-[#2a2a2a] caret-green-600 focus:border focus:shadow-green focus:outline-none"
2022-12-13 22:31:32 +01:00
{...rest}
id={name}
name={name}
type={inputType}
/>
{type === "password" && (
2022-12-13 22:31:32 +01:00
<div
data-cy="password-eye"
2022-12-13 22:31:32 +01:00
onClick={handlePassword}
style={{
backgroundImage: `url('/images/svg/icons/input/${inputType}.svg')`,
2022-12-13 22:31:32 +01:00
}}
className="absolute right-4 top-3 z-10 h-5 w-5 cursor-pointer bg-[#f1f1f1] bg-cover"
/>
2022-12-13 22:31:32 +01:00
)}
<FormState
id={`error-${name ?? "input"}`}
state={error == null ? "idle" : "error"}
2022-12-13 22:31:32 +01:00
message={error}
/>
</div>
2022-12-13 22:31:32 +01:00
</div>
)
}