1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2024-11-24 14:04:19 +00:00
pds-2021-g2-nest/nest_frontend/components/base/InputWithIcon.js

50 lines
1.6 KiB
JavaScript
Raw Normal View History

2021-05-11 14:37:15 +00:00
import React, { useState } from "react"
2021-04-21 01:57:18 +00:00
import Style from "./InputWithIcon.module.css"
import classNames from "classnames"
2021-05-22 02:17:02 +00:00
import makeIcon from "../../utils/makeIcon"
2021-04-21 01:57:18 +00:00
/**
* Like an {@link Input}, but with an icon on the left side.
*
* Has a state which stores whether the inner input element is focused or not to change the style of the whole element
* on focus.
*
* @param icon - The FontAwesome IconDefinition of the icon that should be rendered in the input.
* @param className - Additional class(es) to be added to the outer container.
* @param props - Additional props to be passed to the outer container.
* @returns {JSX.Element}
* @constructor
*/
export default function InputWithIcon({ icon, className, ...props }) {
2021-05-11 14:37:15 +00:00
const [isFocused, setFocused] = useState(false)
2021-04-21 01:57:18 +00:00
return (
<div className={classNames(Style.InputWithIcon, isFocused ? Style.Focused : null, className)}>
<div className={Style.IconPart}>
2021-05-22 02:17:02 +00:00
{makeIcon(icon)}
2021-04-21 01:57:18 +00:00
</div>
<input
className={Style.InputPart}
2021-04-21 01:57:18 +00:00
onFocus={
event => {
setFocused(true)
if(props.onFocus) {
props.onFocus(event)
2021-04-21 01:57:18 +00:00
}
}
}
onBlur={
event => {
setFocused(false)
if(props.onBlur) {
props.onBlur(event)
2021-04-21 01:57:18 +00:00
}
}
}
{...props}
/>
</div>
)
}