user.js 1.8 KB

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