mirror of
https://github.com/coder/coder.git
synced 2026-10-25 09:42:55 +08:00
This just implements a basic sign-in flow, using the new endpoints in #29 :  This brings over several dependencies that are necessary: - `formik` - `yep` Ports over some v1 code to bootstrap it: - `FormTextField` - `PasswordField` - `CoderIcon` And implements basic sign-in: Fixes #37 Fixes #43 This does not implement it navbar integration (importantly - there is no way to sign out yet, unless you manually delete your `session_token`). I'll do that in the next PR - figured this was big enough to get reviewed.
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import IconButton from "@material-ui/core/IconButton"
|
|
import InputAdornment from "@material-ui/core/InputAdornment"
|
|
import { makeStyles } from "@material-ui/core/styles"
|
|
import TextField, { TextFieldProps } from "@material-ui/core/TextField"
|
|
import VisibilityOffOutlined from "@material-ui/icons/VisibilityOffOutlined"
|
|
import VisibilityOutlined from "@material-ui/icons/VisibilityOutlined"
|
|
import React, { useCallback, useState } from "react"
|
|
|
|
type PasswordFieldProps = Omit<TextFieldProps, "InputProps" | "type">
|
|
|
|
export const PasswordField: React.FC<PasswordFieldProps> = ({ variant = "outlined", ...rest }) => {
|
|
const styles = useStyles()
|
|
const [showPassword, setShowPassword] = useState<boolean>(false)
|
|
|
|
const handleVisibilityChange = useCallback(() => setShowPassword((showPassword) => !showPassword), [])
|
|
const VisibilityIcon = showPassword ? VisibilityOffOutlined : VisibilityOutlined
|
|
|
|
return (
|
|
<TextField
|
|
{...rest}
|
|
type={showPassword ? "text" : "password"}
|
|
variant={variant}
|
|
InputProps={{
|
|
endAdornment: (
|
|
<InputAdornment position="end">
|
|
<IconButton aria-label="toggle password visibility" onClick={handleVisibilityChange} size="small">
|
|
<VisibilityIcon className={styles.visibilityIcon} />
|
|
</IconButton>
|
|
</InputAdornment>
|
|
),
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
|
|
const useStyles = makeStyles({
|
|
visibilityIcon: {
|
|
fontSize: 20,
|
|
},
|
|
})
|