user.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. if (user.loading) return (
  30. <p>Loading...</p>
  31. )
  32. if (user.error) return (
  33. <LoginForm>
  34. <style jsx>
  35. {`
  36. label {
  37. display: inline;
  38. }
  39. `}
  40. </style>
  41. </LoginForm>
  42. )
  43. const { name, email, id } = user.data.me
  44. return (
  45. <>
  46. <a href='' onClick={this.toggleMenu}>{name}</a>
  47. {this.state.menu || (
  48. <UserNavMenu />
  49. )}
  50. </>
  51. )
  52. }}
  53. </UserAdoption>
  54. )
  55. }
  56. }
  57. const UserNavMenu = props => (
  58. <>
  59. <section className='usermenu'>
  60. <h2>Welcome, {name}</h2>
  61. <Link href={{ path: 'user' }}><a>Edit user data</a></Link>
  62. <a href='' onClick={ev => {
  63. ev.preventDefault()
  64. this.logout(ev, logout)
  65. }}>Logout</a>
  66. </section>
  67. <style jsx>
  68. {`
  69. section.usermenu {
  70. position: absolute;
  71. background: rgba(127,0,0,0.5);
  72. }
  73. `}
  74. </style>
  75. </>
  76. )
  77. const User = props => <a />
  78. export { UserNav }
  79. export default User