Header.tsx 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. 'use client'
  2. import { BsCaretDownFill } from "react-icons/bs";
  3. import { useSession, signIn, signOut } from "next-auth/react"
  4. import { createRef, useEffect, useState } from "react";
  5. import { useQuery } from "@tanstack/react-query";
  6. import { trpc } from "@/lib/trpc";
  7. export default function Header() {
  8. const { data: session, status } = useSession()
  9. const [org, setOrg] = useState('')
  10. const [username, setUsername] = useState('')
  11. const [password, setPassword] = useState('')
  12. const [isLogInFail, setIsLogInFail] = useState(false)
  13. const orgQuery = trpc.org.bySlug.useQuery({ mode: org })
  14. const logOut = async () => {
  15. await signOut({ redirect: false })
  16. }
  17. const logIn = async () => {
  18. const loginUsername = orgQuery.data?.mail ? `${username}@${orgQuery.data?.mail}` : `${username}@cocorobo.cc`
  19. const loginPassword = btoa(password)
  20. // const res = await signIn('credentials', { redirect: false, loginUsername: 'lanlinling@szjky.com', loginPassword: 'MTIzNDU2' })
  21. const res = await signIn('credentials', { redirect: false, loginUsername, loginPassword })
  22. console.log(res)
  23. if (!res.ok) {
  24. setIsLogInFail(true)
  25. }
  26. }
  27. useEffect(() => {
  28. setIsLogInFail(false)
  29. }, [username, password, org])
  30. return (
  31. <div className="navbar bg-base-100 shadow-xl rounded-box justify-center min-h-4 relative">
  32. <div className="dropdown">
  33. <div tabIndex={0} role="button" className="btn btn-sm btn-wide btn-ghost">选择对话<BsCaretDownFill /></div>
  34. <ul tabIndex={0} className="dropdown-content menu bg-base-100 rounded-box z-[1] w-52 p-2 shadow">
  35. <li><a>Item 1</a></li>
  36. <li><a>Item 2</a></li>
  37. </ul>
  38. </div>
  39. {status === 'authenticated'
  40. ? (
  41. <div className="absolute right-4 flex gap-2">
  42. <div>
  43. <p>Hi, {session.user?.name}</p>
  44. </div>
  45. <button className='btn btn-sm' onClick={logOut}>退出登录</button>
  46. </div>
  47. ) : (
  48. <>
  49. <dialog className="modal modal-open" onCancel={event => event.preventDefault()}>
  50. <div className="modal-box">
  51. <h3 className="font-bold text-lg">您需要先登录</h3>
  52. <div className="w-full flex flex-col items-center gap-2 py-2">
  53. {isLogInFail && <div role="alert" className="alert alert-error">
  54. <span>账号或密码错误</span>
  55. </div>}
  56. <label className="form-control w-full max-w-xs">
  57. <div className="label">
  58. <span className="label-text">组织(选填)</span>
  59. {orgQuery?.data?.name && <span className="label-text-alt text-indigo-400">{orgQuery.data.name}</span>}
  60. </div>
  61. <input type="text" placeholder="" className="input input-bordered w-full max-w-xs" onChange={e => setOrg(e.target.value)} />
  62. </label>
  63. <label className="form-control w-full max-w-xs">
  64. <div className="label">
  65. <span className="label-text">用户名</span>
  66. </div>
  67. <input type="text" placeholder="" className="input input-bordered w-full max-w-xs" onChange={e => setUsername(e.target.value)} />
  68. </label>
  69. <label className="form-control w-full max-w-xs">
  70. <div className="label">
  71. <span className="label-text">密码</span>
  72. </div>
  73. <input type="password" placeholder="" className="input input-bordered w-full max-w-xs" onChange={e => setPassword(e.target.value)} />
  74. </label>
  75. <button className='btn btn-wide' disabled={!username || !password} onClick={logIn}>登录</button>
  76. </div>
  77. </div>
  78. </dialog>
  79. </>
  80. )
  81. }
  82. </div>
  83. )
  84. }