Advertisement
fabiobiondi

React Pro - Real World App - Ch7. 02 - Login Custom Hook

Mar 17th, 2023 (edited)
722
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // pages/login/LoginPage.tsx
  2. import { ChangeEvent, FormEvent, useState } from 'react';
  3. import { useLogin } from './hooks/useLogin';
  4.  
  5. export function LoginPage() {
  6.  
  7.   const {
  8.     formData, isValid, changeHandler
  9.   } = useLogin();
  10.  
  11.  
  12.   function doLogin(e: FormEvent<HTMLFormElement>) {
  13.     e.preventDefault();
  14.     console.log(formData)
  15.   }
  16.  
  17.  
  18.   return (
  19.     <div className="page-sm">
  20.       <h1 className="title">LOGIN</h1>
  21.  
  22.       <form className="flex flex-col gap-3" onSubmit={doLogin}>
  23.         <input
  24.           type="text"
  25.           placeholder="username"
  26.           value={formData.username}
  27.           onChange={changeHandler}
  28.           name="username"
  29.         />
  30.         <input
  31.           type="password"
  32.           placeholder="password"
  33.           value={formData.password}
  34.           onChange={changeHandler}
  35.           name="password"
  36.         />
  37.         <button disabled={!isValid} className="btn primary" type="submit">SIGN IN</button>
  38.       </form>
  39.  
  40.       <pre>{JSON.stringify(formData, null, 2)}</pre>
  41.     </div>
  42.   )
  43. }
  44.  
  45.  
  46. // ====================================
  47. // pages/login/hooks/useLogin.tsx
  48. import { ChangeEvent, useState } from 'react';
  49.  
  50. export function useLogin() {
  51.   const [formData, setFormData] = useState({ username: 'a', password: 'b'})
  52.  
  53.   function changeHandler(e: ChangeEvent<HTMLInputElement>) {
  54.     const value = e.currentTarget.value;
  55.     const name = e.currentTarget.name;
  56.     setFormData(s => ({ ...s, [name]: value }))
  57.   }
  58.  
  59.   const isValid = formData.username.length && formData.password.length;
  60.  
  61.   return {
  62.     formData,
  63.     isValid,
  64.     changeHandler
  65.   }
  66. }
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement