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