user.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Query, Mutation } from 'react-apollo'
  2. import { adopt } from 'react-adopt'
  3. import Link from 'next/link'
  4. import { CURRENT_USER, USER_LOGOUT } from '../lib/graphql'
  5. import LoginForm from './login'
  6. const UserAdoption = adopt({
  7. user: ({ render }) => <Query query={CURRENT_USER}>{render}</Query>,
  8. logout: ({ render }) => <Mutation mutation={USER_LOGOUT} refetchQueries={[{ query: CURRENT_USER }]}>{render}</Mutation>
  9. })
  10. const UserNav = props => {
  11. const [menu, setMenu] = React.useState(false)
  12. return (
  13. <>
  14. <UserAdoption>{({ user, logout }) => {
  15. if (user.loading) {
  16. return (
  17. <p>Loading...</p>
  18. )
  19. }
  20. if (user.error) {
  21. return (
  22. <LoginForm />
  23. )
  24. }
  25. const { name, email, id } = user.data.me
  26. return (
  27. <>
  28. <a
  29. href='' onClick={ev => {
  30. ev.preventDefault()
  31. setMenu(!menu)
  32. }}
  33. >{name}
  34. </a>
  35. {menu ? (
  36. <UserNavMenu />
  37. ) : null}
  38. </>
  39. )
  40. }}
  41. </UserAdoption>
  42. </>
  43. )
  44. }
  45. const myStyle = (
  46. <style jsx>
  47. {`
  48. section.usermenu {
  49. position: absolute;
  50. background: rgba(127,0,0,0.5);
  51. }
  52. `}
  53. </style>
  54. )
  55. const UserNavMenu = props => {
  56. const logout = async (ev, logout) => {
  57. ev.preventDefault()
  58. try {
  59. const id = await logout()
  60. } catch (error) {
  61. console.log(error)
  62. }
  63. }
  64. return (
  65. <>
  66. <section className='usermenu'>
  67. <h2>Welcome, {name}</h2>
  68. <Link href={{ pathname: 'user' }}><a>Edit user data</a></Link>
  69. <a
  70. href='' onClick={ev => {
  71. ev.preventDefault()
  72. this.logout(ev, logout)
  73. }}
  74. >Logout
  75. </a>
  76. </section>
  77. </>
  78. )
  79. }
  80. const User = props => <a />
  81. export { UserNav }
  82. export default User