mirror of https://github.com/MaxLeiter/Drift
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
import { Input, Button, useToasts } from "@geist-ui/core"
 | 
						|
import Cookies from "js-cookie"
 | 
						|
import { useState } from "react"
 | 
						|
 | 
						|
const Password = () => {
 | 
						|
    const [password, setPassword] = useState<string>('')
 | 
						|
    const [newPassword, setNewPassword] = useState<string>('')
 | 
						|
    const [confirmPassword, setConfirmPassword] = useState<string>('')
 | 
						|
 | 
						|
    const { setToast } = useToasts()
 | 
						|
 | 
						|
    const handlePasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {
 | 
						|
        setPassword(e.target.value)
 | 
						|
    }
 | 
						|
 | 
						|
    const handleNewPasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {
 | 
						|
        setNewPassword(e.target.value)
 | 
						|
    }
 | 
						|
 | 
						|
    const handleConfirmPasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {
 | 
						|
        setConfirmPassword(e.target.value)
 | 
						|
    }
 | 
						|
 | 
						|
    const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
 | 
						|
        e.preventDefault()
 | 
						|
        if (!password || !newPassword || !confirmPassword) {
 | 
						|
            setToast({
 | 
						|
                text: "Please fill out all fields",
 | 
						|
                type: "error",
 | 
						|
            })
 | 
						|
        }
 | 
						|
 | 
						|
        if (newPassword !== confirmPassword) {
 | 
						|
            setToast({
 | 
						|
                text: "New password and confirm password do not match",
 | 
						|
                type: "error",
 | 
						|
            })
 | 
						|
        }
 | 
						|
 | 
						|
        const res = await fetch("/server-api/auth/change-password", {
 | 
						|
            method: "PUT",
 | 
						|
            headers: {
 | 
						|
                "Content-Type": "application/json",
 | 
						|
                "Authorization": `Bearer ${Cookies.get("drift-token")}`,
 | 
						|
            },
 | 
						|
            body: JSON.stringify({
 | 
						|
                oldPassword: password,
 | 
						|
                newPassword,
 | 
						|
            }),
 | 
						|
        })
 | 
						|
 | 
						|
 | 
						|
        if (res.status === 200) {
 | 
						|
            setToast({
 | 
						|
                text: "Password updated successfully",
 | 
						|
                type: "success",
 | 
						|
            })
 | 
						|
            setPassword('')
 | 
						|
            setNewPassword('')
 | 
						|
            setConfirmPassword('')
 | 
						|
        } else {
 | 
						|
            const data = await res.json()
 | 
						|
 | 
						|
            setToast({
 | 
						|
                text: data.error ?? "Failed to update password",
 | 
						|
                type: "error",
 | 
						|
            })
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return (
 | 
						|
        <form
 | 
						|
            style={{
 | 
						|
                display: "flex",
 | 
						|
                flexDirection: "column",
 | 
						|
                gap: "var(--gap)",
 | 
						|
                maxWidth: "300px",
 | 
						|
            }}
 | 
						|
            onSubmit={onSubmit}
 | 
						|
        >
 | 
						|
            <div>
 | 
						|
                <label htmlFor="current-password">Current password</label>
 | 
						|
                <Input onChange={handlePasswordChange} minLength={6} maxLength={128} value={password} id="current-password" htmlType="password" required autoComplete="current-password" placeholder="Current Password" width={"100%"} />
 | 
						|
            </div>
 | 
						|
            <div>
 | 
						|
                <label htmlFor="new-password">New password</label>
 | 
						|
                <Input onChange={handleNewPasswordChange} minLength={6} maxLength={128} value={newPassword} id="new-password" htmlType="password" required autoComplete="new-password" placeholder="New Password" width={"100%"} />
 | 
						|
            </div>
 | 
						|
            <div>
 | 
						|
                <label htmlFor="confirm-password">Confirm password</label>
 | 
						|
                <Input onChange={handleConfirmPasswordChange} minLength={6} maxLength={128} value={confirmPassword} id="confirm-password" htmlType="password" required autoComplete="confirm-password" placeholder="Confirm Password" width={"100%"} />
 | 
						|
            </div>
 | 
						|
            <Button htmlType="submit" auto>Change Password</Button>
 | 
						|
        </form>)
 | 
						|
}
 | 
						|
 | 
						|
export default Password |