1- import React , { useState , Fragment } from "react" ;
1+ import React , { useState , Fragment , useEffect } from "react" ;
22import inject from "hocs/inject" ;
33import { makeStyles } from "@material-ui/core/styles" ;
4+ import { useRouter } from "next/router" ;
45import IconButton from "@material-ui/core/IconButton" ;
56import Button from "@material-ui/core/Button" ;
67import ButtonBase from "@material-ui/core/ButtonBase" ;
@@ -9,6 +10,13 @@ import Popover from "@material-ui/core/Popover";
910import useViewer from "hooks/viewer/useViewer" ;
1011import ViewerInfo from "@reactioncommerce/components/ViewerInfo/v1" ;
1112import Link from "components/Link" ;
13+ import Modal from "@material-ui/core/Modal" ;
14+ import Login from "../Entry/Login" ;
15+ import SignUp from "../Entry/SignUp" ;
16+ import ChangePassword from "../Entry/ChangePassword" ;
17+ import ForgotPassword from "../Entry/ForgotPassword" ;
18+ import ResetPassword from "../Entry/ResetPassword" ;
19+ import getAccountsHandler from "../../lib/accountsServer.js" ;
1220
1321const useStyles = makeStyles ( ( theme ) => ( {
1422 accountDropdown : {
@@ -17,34 +25,92 @@ const useStyles = makeStyles((theme) => ({
1725 } ,
1826 marginBottom : {
1927 marginBottom : theme . spacing ( 2 )
28+ } ,
29+ paper : {
30+ position : "absolute" ,
31+ width : 380 ,
32+ backgroundColor : theme . palette . background . paper ,
33+ border : "2px solid #000" ,
34+ boxShadow : theme . shadows [ 5 ] ,
35+ padding : theme . spacing ( 2 , 4 , 3 ) ,
36+ top : "50%" ,
37+ left : "50%" ,
38+ transform : "translate(-50%, -50%)" ,
39+ display : "flex" ,
40+ alignItems : "center" ,
41+ justifyContent : "center"
2042 }
2143} ) ) ;
2244
2345const AccountDropdown = ( ) => {
46+ const router = useRouter ( ) ;
47+ const resetToken = router ?. query ?. resetToken ;
2448 const classes = useStyles ( ) ;
49+ const [ open , setOpen ] = React . useState ( false ) ;
2550 const [ anchorElement , setAnchorElement ] = useState ( null ) ;
26- const [ viewer ] = useViewer ( ) ;
51+ const [ modalValue , setModalValue ] = useState ( "" ) ;
52+ const [ viewer , , refetch ] = useViewer ( ) ;
53+ const { accountsClient } = getAccountsHandler ( ) ;
2754 const isAuthenticated = viewer && viewer . _id ;
2855
56+ const onClose = ( ) => {
57+ setAnchorElement ( null ) ;
58+ } ;
59+
60+ useEffect ( ( ) => {
61+ if ( ! resetToken ) return ;
62+ setOpen ( true ) ;
63+ setModalValue ( "reset-password" ) ;
64+ } , [ resetToken ] ) ;
65+
66+ const openModal = ( value ) => {
67+ setModalValue ( value ) ;
68+ setOpen ( true ) ;
69+ onClose ( ) ;
70+ } ;
71+
72+ const closeModal = ( ) => {
73+ setOpen ( false ) ;
74+ } ;
75+
76+ const handleSignOut = async ( ) => {
77+ await accountsClient . logout ( ) ;
78+ await refetch ( ) ;
79+ onClose ( ) ;
80+ } ;
81+
2982 const toggleOpen = ( event ) => {
3083 setAnchorElement ( event . currentTarget ) ;
3184 } ;
3285
33- const onClose = ( ) => {
34- setAnchorElement ( null ) ;
86+ const getModalComponent = ( ) => {
87+ let comp = Login ;
88+ if ( modalValue === "signup" ) {
89+ comp = SignUp ;
90+ } else if ( modalValue === "change-password" ) {
91+ comp = ChangePassword ;
92+ } else if ( modalValue === "forgot-password" ) {
93+ comp = ForgotPassword ;
94+ } else if ( modalValue === "reset-password" ) {
95+ comp = ResetPassword ;
96+ }
97+ return React . createElement ( comp , { closeModal, openModal, resetToken } ) ;
3598 } ;
3699
37100 return (
38101 < Fragment >
39- { isAuthenticated ?
102+ < Modal open = { open } onClose = { closeModal } aria-labelledby = "entry-modal" aria-describedby = "entry-modal" >
103+ < div className = { classes . paper } > { getModalComponent ( ) } </ div >
104+ </ Modal >
105+ { isAuthenticated ? (
40106 < ButtonBase onClick = { toggleOpen } >
41107 < ViewerInfo viewer = { viewer } />
42108 </ ButtonBase >
43- :
109+ ) : (
44110 < IconButton color = "inherit" onClick = { toggleOpen } >
45111 < AccountIcon />
46112 </ IconButton >
47- }
113+ ) }
48114
49115 < Popover
50116 anchorEl = { anchorElement }
@@ -56,7 +122,7 @@ const AccountDropdown = () => {
56122 onClose = { onClose }
57123 >
58124 < div className = { classes . accountDropdown } >
59- { isAuthenticated ?
125+ { isAuthenticated ? (
60126 < Fragment >
61127 < div className = { classes . marginBottom } >
62128 < Link href = "/profile/address" >
@@ -66,26 +132,26 @@ const AccountDropdown = () => {
66132 </ Link >
67133 </ div >
68134 < div className = { classes . marginBottom } >
69- < Button color = "primary" fullWidth href = { `/ change-password?email= ${ encodeURIComponent ( viewer . emailRecords [ 0 ] . address ) } ` } >
135+ < Button color = "primary" fullWidth onClick = { ( ) => openModal ( " change-password" ) } >
70136 Change Password
71137 </ Button >
72138 </ div >
73- < Button color = "primary" fullWidth href = "/logout" variant = "contained" >
139+ < Button color = "primary" fullWidth onClick = { handleSignOut } variant = "contained" >
74140 Sign Out
75141 </ Button >
76142 </ Fragment >
77- :
143+ ) : (
78144 < Fragment >
79145 < div className = { classes . authContent } >
80- < Button color = "primary" fullWidth href = "/signin" variant = "contained" >
146+ < Button color = "primary" fullWidth variant = "contained" onClick = { ( ) => openModal ( "login" ) } >
81147 Sign In
82148 </ Button >
83149 </ div >
84- < Button color = "primary" fullWidth href = "/ signup">
150+ < Button color = "primary" fullWidth onClick = { ( ) => openModal ( " signup") } >
85151 Create Account
86152 </ Button >
87153 </ Fragment >
88- }
154+ ) }
89155 </ div >
90156 </ Popover >
91157 </ Fragment >
0 commit comments