1- import { Button , makeStyles } from '@fluentui/react-components'
2- import { ArrowLeftRegular } from '@fluentui/react-icons'
1+ import {
2+ Button ,
3+ makeStyles ,
4+ Menu ,
5+ MenuButton ,
6+ MenuItem ,
7+ MenuList ,
8+ MenuPopover ,
9+ MenuTrigger ,
10+ } from '@fluentui/react-components'
11+ import {
12+ ArrowClockwiseRegular ,
13+ ArrowLeftRegular ,
14+ MoreVerticalRegular ,
15+ SignOutRegular ,
16+ } from '@fluentui/react-icons'
317import * as React from 'react'
418import { _t , fetchTranslations } from '../../helpers/translate'
519import { Email } from '../../models/email'
@@ -35,6 +49,23 @@ const useStyles = makeStyles({
3549 marginTop : '5px' ,
3650 marginLeft : '10px' ,
3751 } ,
52+ spinner : {
53+ padding : '4px' ,
54+ } ,
55+ kebab : {
56+ minWidth : '0'
57+ } ,
58+ kebabButton : {
59+ '& div' : {
60+ display : 'flex' ,
61+ flexDirection : 'row' ,
62+ alignItems : 'center' ,
63+ justifyContent : 'space-between' ,
64+ '& > span' : {
65+ marginRight : '5px'
66+ }
67+ }
68+ } ,
3869} )
3970
4071const App : React . FC < AppProps > = ( _props : AppProps ) => {
@@ -43,15 +74,17 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
4374 const [ loading , setLoading ] = React . useState (
4475 ! ! localStorage . getItem ( 'odoo_access_token' )
4576 )
77+ const [ logged , setLogged ] = React . useState ( false )
4678
4779 // pages used to go back
4880 const [ currentPage , setCurrentPage ] = React . useState ( null )
49- const [ pages , setPages ] = React . useState ( ( ) => [ ] )
81+ const [ pagesPartner , setPagesPartner ] : [ [ any , Partner | null ] [ ] , any ] =
82+ React . useState ( ( ) => [ ] )
5083
5184 let email = new Email ( )
5285
53- const pushPage = ( page ) => {
54- setPages ( ( prevPages ) => [ ...prevPages , page ] )
86+ const pushPage = ( page , partner : Partner = null ) => {
87+ setPagesPartner ( ( prevPages ) => [ ...prevPages , [ page , partner ] ] )
5588 setCurrentPage ( page )
5689 }
5790
@@ -88,8 +121,9 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
88121
89122 const logout = ( ) => {
90123 setLoading ( false )
124+ setLogged ( false )
91125 localStorage . removeItem ( 'odoo_access_token' )
92- setPages ( [ ] )
126+ setPagesPartner ( [ ] )
93127 setCurrentPage ( < Login onLogin = { loadEmailContacts } /> )
94128 }
95129
@@ -103,12 +137,12 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
103137 key = { `partner-${ partner . key } ` }
104138 partner = { partner }
105139 email = { email }
106- onLogout = { logout }
107140 onSearch = { onSearchPartners }
108141 pushPage = { pushPage }
109142 goBack = { goBack }
110143 updatePartner = { updatePartner }
111- />
144+ /> ,
145+ partner
112146 )
113147
114148 // fetch the leads, tickets, tasks, etc
@@ -135,15 +169,17 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
135169 key = { `partner-${ partner . key } ` }
136170 partner = { partner }
137171 email = { email }
138- onLogout = { logout }
139172 onSearch = { onSearchPartners }
140173 pushPage = { pushPage }
141174 goBack = { goBack }
142175 updatePartner = { updatePartner }
143176 />
144177 )
145178
146- setPages ( ( prevPages ) => [ ...prevPages . slice ( 0 , - 1 ) , newCard ] )
179+ setPagesPartner ( ( prevPages ) => [
180+ ...prevPages . slice ( 0 , - 1 ) ,
181+ [ newCard , partner ] ,
182+ ] )
147183 setCurrentPage ( newCard )
148184 }
149185
@@ -169,15 +205,15 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
169205 email = { email }
170206 />
171207 )
172- setPages ( [ searchRecords ] )
208+ setPagesPartner ( [ [ searchRecords , null ] ] )
173209 setCurrentPage ( searchRecords )
174210 }
175211
176212 /**
177213 * Fetch the information about the contact in the email.
178214 * (to know if they exist in the database...)
179215 */
180- const loadEmailContacts = async ( ) => {
216+ const loadEmailContacts = async ( autoOpen = true ) => {
181217 const token = localStorage . getItem ( 'odoo_access_token' )
182218 if ( ! token ?. length ) {
183219 logout ( )
@@ -207,26 +243,42 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
207243
208244 fetchTranslations ( )
209245 setEmailContacts ( searchedPartners )
210- if ( searchedPartners . length === 1 ) {
246+ if ( searchedPartners . length === 1 && autoOpen ) {
211247 setPartner ( searchedPartners [ 0 ] )
212248 }
213249
250+ setLogged ( true )
214251 setLoading ( false )
215252 }
216253
217254 const goBack = ( backCount : number = 1 ) => {
218- if ( pages . length === 2 && email . contacts . length >= 2 ) {
219- // the contact could have been created, reload its information
220- loadEmailContacts ( )
221- return
222- }
223- setPages ( ( prevPages ) => {
224- const page = prevPages [ prevPages . length - 1 - backCount ]
255+ setPagesPartner ( ( prevPages ) => {
256+ if ( prevPages . length === 2 ) {
257+ // the contact could have been created, reload the view
258+ setTimeout ( ( ) => loadEmailContacts ( false ) )
259+ return [ ]
260+ }
261+ const [ page , _partner ] = prevPages [ prevPages . length - 1 - backCount ]
225262 setCurrentPage ( page )
226263 return prevPages . slice ( 0 , prevPages . length - backCount )
227264 } )
228265 }
229266
267+ const onRefresh = async ( ) => {
268+ const partner = pagesPartner [ pagesPartner . length - 1 ] [ 1 ]
269+ const [ newPartner , error ] = await Partner . getPartner (
270+ partner . name ,
271+ partner . email ,
272+ partner . id
273+ )
274+
275+ if ( error . code ) {
276+ showError ( error . message )
277+ return
278+ }
279+ updatePartner ( newPartner )
280+ }
281+
230282 // set the logged state if needed, without blocking the rendering
231283 React . useEffect ( ( ) => {
232284 loadEmailContacts ( )
@@ -249,9 +301,10 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
249301
250302 return (
251303 < div className = { styles . root } >
252- < div className = { styles . header } >
253- { pages . length > 1 && (
304+ { logged && (
305+ < div className = { styles . header } >
254306 < Button
307+ disabled = { pagesPartner . length <= 1 }
255308 className = { styles . goBack }
256309 icon = { < ArrowLeftRegular /> }
257310 title = { _t ( 'Go back' ) }
@@ -260,9 +313,49 @@ const App: React.FC<AppProps> = (_props: AppProps) => {
260313 appearance = "subtle"
261314 onClick = { ( ) => goBack ( ) }
262315 />
263- ) }
264- < GlobalLoading />
265- </ div >
316+
317+ < GlobalLoading />
318+
319+ < Menu >
320+ < MenuTrigger disableButtonEnhancement >
321+ < MenuButton
322+ appearance = "subtle"
323+ icon = { < MoreVerticalRegular /> }
324+ size = "medium"
325+ />
326+ </ MenuTrigger >
327+
328+ < MenuPopover className = { styles . kebab } >
329+ < MenuList >
330+ < MenuItem
331+ className = { styles . kebabButton }
332+ onClick = { onRefresh }
333+ disabled = {
334+ ! pagesPartner . length ||
335+ ! pagesPartner [
336+ pagesPartner . length - 1
337+ ] [ 1 ]
338+ }
339+ >
340+ < div >
341+ < span > { _t ( 'Refresh' ) } </ span >
342+ < ArrowClockwiseRegular />
343+ </ div >
344+ </ MenuItem >
345+ < MenuItem
346+ className = { styles . kebabButton }
347+ onClick = { ( ) => logout ( ) }
348+ >
349+ < div >
350+ < span > { _t ( 'Log out' ) } </ span >
351+ < SignOutRegular />
352+ </ div >
353+ </ MenuItem >
354+ </ MenuList >
355+ </ MenuPopover >
356+ </ Menu >
357+ </ div >
358+ ) }
266359 { loading ? < Loading /> : currentPage }
267360 < Error />
268361 </ div >
0 commit comments