user.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. <UserAdoption>{({ user, logout }) => {
  14. if (user.loading) {
  15. return (
  16. <p>Loading...</p>
  17. )
  18. }
  19. if (user.error) {
  20. return (
  21. <LoginForm />
  22. )
  23. }
  24. const { name, email, id } = user.data.me
  25. return (
  26. <>
  27. <a href='' onClick={ev => setMenu(!menu)}>{name}</a>
  28. {menu || (
  29. <UserNavMenu />
  30. )}
  31. </>
  32. )
  33. }}
  34. </UserAdoption>
  35. )
  36. }
  37. const UserNavMenu = props => {
  38. const logout = async (ev, logout) => {
  39. ev.preventDefault()
  40. try {
  41. const id = await logout()
  42. } catch (error) {
  43. console.log(error)
  44. }
  45. }
  46. return (
  47. <>
  48. <section className='usermenu'>
  49. <h2>Welcome, {name}</h2>
  50. <Link href={{ path: 'user' }}><a>Edit user data</a></Link>
  51. <a
  52. href='' onClick={ev => {
  53. ev.preventDefault()
  54. this.logout(ev, logout)
  55. }}
  56. >Logout
  57. </a>
  58. </section>
  59. <style jsx>
  60. {`
  61. section.usermenu {
  62. position: absolute;
  63. background: rgba(127,0,0,0.5);
  64. }
  65. `}
  66. </style>
  67. </>
  68. )
  69. }
  70. const User = props => <a />
  71. export { UserNav }
  72. export default User