mirror of
https://github.com/vercel/commerce.git
synced 2025-07-22 12:24:18 +00:00
.vscode
assets
components
auth
ForgotPassword.tsx
LoginView.tsx
SignUpView.tsx
index.ts
cart
common
icons
product
ui
wishlist
config
framework
lib
pages
public
.editorconfig
.env.template
.gitignore
.prettierignore
.prettierrc
README.md
codegen.json
commerce.config.json
ecosystem.config.js
global.d.ts
license.md
next-env.d.ts
next.config.js
package.json
postcss.config.js
start.js
tailwind.config.js
tsconfig.json
yarn.lock
79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
import { FC, useEffect, useState, useCallback } from 'react'
|
|
import { validate } from 'email-validator'
|
|
import { useUI } from '@components/ui/context'
|
|
import { Logo, Button, Input } from '@components/ui'
|
|
|
|
interface Props {}
|
|
|
|
const ForgotPassword: FC<Props> = () => {
|
|
// Form State
|
|
const [email, setEmail] = useState('')
|
|
const [loading, setLoading] = useState(false)
|
|
const [message, setMessage] = useState('')
|
|
const [dirty, setDirty] = useState(false)
|
|
const [disabled, setDisabled] = useState(false)
|
|
|
|
const { setModalView, closeModal } = useUI()
|
|
|
|
const handleResetPassword = async (e: React.SyntheticEvent<EventTarget>) => {
|
|
e.preventDefault()
|
|
|
|
if (!dirty && !disabled) {
|
|
setDirty(true)
|
|
handleValidation()
|
|
}
|
|
}
|
|
|
|
const handleValidation = useCallback(() => {
|
|
// Unable to send form unless fields are valid.
|
|
if (dirty) {
|
|
setDisabled(!validate(email))
|
|
}
|
|
}, [email, dirty])
|
|
|
|
useEffect(() => {
|
|
handleValidation()
|
|
}, [handleValidation])
|
|
|
|
return (
|
|
<form
|
|
onSubmit={handleResetPassword}
|
|
className="w-80 flex flex-col justify-between p-3"
|
|
>
|
|
<div className="flex justify-center pb-12 ">
|
|
<Logo width="64px" height="64px" />
|
|
</div>
|
|
<div className="flex flex-col space-y-4">
|
|
{message && (
|
|
<div className="text-red border border-red p-3">{message}</div>
|
|
)}
|
|
|
|
<Input placeholder="Email" onChange={setEmail} type="email" />
|
|
<div className="pt-2 w-full flex flex-col">
|
|
<Button
|
|
variant="slim"
|
|
type="submit"
|
|
loading={loading}
|
|
disabled={disabled}
|
|
>
|
|
Recover Password
|
|
</Button>
|
|
</div>
|
|
|
|
<span className="pt-3 text-center text-sm">
|
|
<span className="text-accents-7">Do you have an account?</span>
|
|
{` `}
|
|
<a
|
|
className="text-accent-9 font-bold hover:underline cursor-pointer"
|
|
onClick={() => setModalView('LOGIN_VIEW')}
|
|
>
|
|
Log In
|
|
</a>
|
|
</span>
|
|
</div>
|
|
</form>
|
|
)
|
|
}
|
|
|
|
export default ForgotPassword
|