From 4573359f6de4b0c78b887027aa5a1eb2ac46529c Mon Sep 17 00:00:00 2001
From: Yoan VALLET <ext.sopra.yvallet@grandlyon.com>
Date: Tue, 2 Jun 2020 19:57:17 +0200
Subject: [PATCH] feat: rework oauth konnector flow

---
 .../Konnector/KonnectorLoading.tsx            |  9 +--
 .../Konnector/KonnectorNotFound.tsx           |  1 -
 .../Konnector/KonnectorResult.tsx             | 81 +++++++++++--------
 .../KonnectorViewer/KonnectorViewerCard.tsx   | 36 ++++-----
 src/doctypes/io-cozy-accounts.ts              | 16 +++-
 5 files changed, 77 insertions(+), 66 deletions(-)

diff --git a/src/components/ContentComponents/Konnector/KonnectorLoading.tsx b/src/components/ContentComponents/Konnector/KonnectorLoading.tsx
index 9f24e828a..55b52201c 100644
--- a/src/components/ContentComponents/Konnector/KonnectorLoading.tsx
+++ b/src/components/ContentComponents/Konnector/KonnectorLoading.tsx
@@ -37,7 +37,6 @@ const KonnectorLoading: React.FC<KonnectorLoadingProps> = ({
   t,
 }: KonnectorLoadingProps) => {
   const callbackResponse = (state: string) => {
-    console.log('event', state)
     handleKonnectorLoading(state)
   }
 
@@ -46,13 +45,7 @@ const KonnectorLoading: React.FC<KonnectorLoadingProps> = ({
     async function getData() {
       if (!isKonnectorRunning(trigger)) {
         const konnectorJob = new KonnectorJob(client, trigger)
-        const test = await konnectorJob.launch()
-        console.log(test)
-        console.log(konnectorJob)
-        const result = konnectorJob.getStatus()
-        console.log(result)
-        const result2 = konnectorJob.jobWatcher
-        console.log(result2)
+        await konnectorJob.launch()
         konnectorJob.jobWatcher.on(ERROR_EVENT, () => {
           callbackResponse(ERROR_EVENT)
         })
diff --git a/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx b/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx
index c7c876d06..cfe6ea899 100644
--- a/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx
+++ b/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx
@@ -14,7 +14,6 @@ const KonnectorNotFound: React.FC<KonnectorNotFoundProps> = ({
 }: KonnectorNotFoundProps) => {
   const openKonnectorURL = () => {
     // TODO - Use getstoreinstallationurl from client - https://docs.cozy.io/en/cozy-client/api/cozy-client/#getstoreinstallationurl-string
-    console.log(window.location)
     const hostname = window.location.origin.replace('ecolyo', 'store')
     const url = hostname + '/#/discover/' + konnectorSlug
     window.open(url, '_blank')
diff --git a/src/components/ContentComponents/Konnector/KonnectorResult.tsx b/src/components/ContentComponents/Konnector/KonnectorResult.tsx
index fa5f3161a..320e62197 100644
--- a/src/components/ContentComponents/Konnector/KonnectorResult.tsx
+++ b/src/components/ContentComponents/Konnector/KonnectorResult.tsx
@@ -8,17 +8,21 @@ import StyledButton from 'components/CommonKit/Button/StyledButton'
 import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
 
 import { Account, Konnector, Trigger } from 'doctypes'
-import {
-  getKonnectorJobError,
-  getKonnectorStatus,
-  getLastSuccessDate,
-} from 'cozy-harvest-lib/dist/helpers/triggers'
 import { TriggerService } from 'services/triggersService'
 import { AccountService } from 'services/accountService'
 
+import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers'
+import {
+  KonnectorJob,
+  ERROR_EVENT,
+  LOGIN_SUCCESS_EVENT,
+  SUCCESS_EVENT,
+} from 'cozy-harvest-lib/dist/models/KonnectorJob'
+
 interface KonnectorResultProps {
   account: Account
   konnector: Konnector
+  handleJobState: Function
   client: Client
   t: Function
 }
@@ -26,30 +30,54 @@ interface KonnectorResultProps {
 const KonnectorResult: React.FC<KonnectorResultProps> = ({
   account,
   konnector,
+  handleJobState,
   client,
   t,
 }: KonnectorResultProps) => {
+  const [trigger, setTrigger] = useState<Trigger | null>(null)
   const [updating, setUpdating] = useState<boolean>(false)
   const [lastExecutionDate, setLastExecutionDate] = useState<string>('-')
   const [status, setStatus] = useState<string>('')
 
   const context = useContext(AppContext)
 
+  const updateState = async (trigger: Trigger) => {
+    const triggerState = await TriggerService.fetchTriggerState(client, trigger)
+    if (triggerState) {
+      // TODO - format date
+      setLastExecutionDate(new Date(triggerState.last_execution).toDateString())
+      setStatus(triggerState.status)
+      handleJobState(triggerState.status)
+      await context.refreshFluidTypes()
+    }
+  }
+
+  const callbackResponse = async (state: string) => {
+    if (trigger) {
+      await updateState(trigger)
+    }
+    setUpdating(false)
+  }
+
   // TODO - rework
   const updateKonnector = async () => {
     setUpdating(true)
-    try {
-      const triggersServices = new TriggerService(client, account, konnector)
-      if (trigger !== null) {
-        triggersServices.setTrigger(trigger)
-      }
-      const job = await triggersServices.launchTrigger()
-      if (!job) {
-        throw new Error(`Error during trigger launching`)
-      }
-      setlaunchedJob(job)
-    } catch (error) {
-      setUpdating(false)
+    setStatus('')
+    setLastExecutionDate('-')
+    handleJobState('')
+
+    if (trigger && !isKonnectorRunning(trigger)) {
+      const konnectorJob = new KonnectorJob(client, trigger)
+      await konnectorJob.launch()
+      konnectorJob.jobWatcher.on(ERROR_EVENT, () => {
+        callbackResponse(ERROR_EVENT)
+      })
+      konnectorJob.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
+        callbackResponse(LOGIN_SUCCESS_EVENT)
+      })
+      konnectorJob.jobWatcher.on(SUCCESS_EVENT, () => {
+        callbackResponse(SUCCESS_EVENT)
+      })
     }
   }
 
@@ -57,7 +85,7 @@ const KonnectorResult: React.FC<KonnectorResultProps> = ({
     setUpdating(true)
     try {
       if (account) {
-        const delAccount = await AccountService.deleteAccount(client, account)
+        await AccountService.deleteAccount(client, account)
         await context.refreshFluidTypes()
       }
     } catch (error) {
@@ -72,22 +100,9 @@ const KonnectorResult: React.FC<KonnectorResultProps> = ({
         client,
         account
       )
-      console.log(_trigger)
       if (subscribed && _trigger) {
-        console.log('trigger', _trigger)
-        const triggerState = await TriggerService.fetchTriggerState(
-          client,
-          _trigger
-        )
-        if (subscribed && triggerState) {
-          console.log(triggerState)
-          // TODO - format date
-          setLastExecutionDate(
-            new Date(triggerState.last_execution).toDateString()
-          )
-          setStatus(triggerState.status)
-          await context.refreshFluidTypes()
-        }
+        setTrigger(_trigger)
+        await updateState(_trigger)
       }
     }
     getData()
diff --git a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx b/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx
index e0d85934d..30c6db57f 100644
--- a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx
+++ b/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx
@@ -65,26 +65,22 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     )
   }
 
-  // TODO - rework
-  const getIcon = (jobState: string) => {
-    switch (jobState) {
-      case JobState.Errored:
-        return failurePicto
-      default:
-        return ''
-    }
-  }
-  // TODO - rework
-  const getKonnectorStateMarkup = (jobState: string) => {
-    const iconSrc = getIcon(jobState)
-    if (iconSrc === '') return ''
-    return <img className="state-icon" src={iconSrc}></img>
+  const getKonnectorStateMarkup = () => {
+    return jobState === JobState.Errored ? (
+      <img className="state-icon" src={failurePicto}></img>
+    ) : (
+      ''
+    )
   }
 
   const handleConnexion = (_account: Account) => {
     setAccount(_account)
   }
 
+  const handleJobState = (_jobState: JobState) => {
+    setJobState(_jobState)
+  }
+
   useEffect(() => {
     let subscribed = true
     async function getData() {
@@ -94,8 +90,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
           konnector.slug
         )
         if (subscribed && _account) {
-          console.log(konnector.slug)
-          console.log(_account)
           setAccount(_account)
         }
       }
@@ -121,9 +115,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
                 <StyledIcon className="icon" icon={iconType} size={49} />
               )}
             </div>
-            <div className="state-picto">
-              {getKonnectorStateMarkup(jobState)}
-            </div>
+            <div className="state-picto">{getKonnectorStateMarkup()}</div>
             <div className="accordion-info">
               <div className="accordion-title text-16-normal">
                 {!account
@@ -150,7 +142,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
                 handleConnexion={handleConnexion}
               />
             ) : (
-              <KonnectorResult account={account} konnector={konnector} />
+              <KonnectorResult
+                account={account}
+                konnector={konnector}
+                handleJobState={handleJobState}
+              />
             )}
           </div>
         </div>
diff --git a/src/doctypes/io-cozy-accounts.ts b/src/doctypes/io-cozy-accounts.ts
index a0fc3b34a..d1ec94730 100644
--- a/src/doctypes/io-cozy-accounts.ts
+++ b/src/doctypes/io-cozy-accounts.ts
@@ -1,12 +1,20 @@
 export const ACCOUNTS_DOCTYPE = 'io.cozy.accounts'
 
+type AuthLoginData = {
+  credentials_encrypted: string
+  login: string
+}
+
+type OAuthData = {
+  access_token: string
+  refresh_token: string
+  scope: string | null
+}
+
 export type Account = {
   _id: string
   account_type: string
-  auth: {
-    credentials_encrypted: string
-    login: string
-  }
+  auth: AuthLoginData | OAuthData
   identifier: string
   state?: string | null
 }
-- 
GitLab