Browse Source

add the 'unlink helloasso account' btn

Olivier Massot 2 months ago
parent
commit
6113151151

+ 2 - 1
i18n/lang/fr/general.json

@@ -830,5 +830,6 @@
   "connect_to_helloasso": "Connecter à HelloAsso",
   "your_helloasso_account_is_linked": "Votre compte HelloAsso a bien été lié.",
   "an_error_occured": "Une erreur s'est produite",
-  "please_contact_support": "Veuillez contacter le support technique pour plus d'informations."
+  "please_contact_support": "Veuillez contacter le support technique pour plus d'informations.",
+  "unlink_your_helloasso_account": "Déconnecter votre compte HelloAsso"
 }

+ 0 - 0
models/Organization/HelloAsso.ts → models/HelloAsso/HelloAsso.ts


+ 20 - 0
models/HelloAsso/UnlinkRequest.ts

@@ -0,0 +1,20 @@
+import { Uid, Str } from 'pinia-orm/dist/decorators'
+import { IdField } from '~/models/decorators'
+import { Num } from 'pinia-orm/decorators'
+import ApiResource from '~/models/ApiResource'
+
+/**
+ * AP2i Model : UnlinkRequest
+ *
+ * @see https://gitlab.2iopenservice.com/opentalent/ap2i/-/blob/develop/src/ApiResource/HelloAsso/UnlinkRequest.php
+ */
+export default class UnlinkRequest extends ApiResource {
+  static override entity = 'helloasso/unlink'
+
+  @Uid()
+  declare id: number | string
+
+  @IdField()
+  @Num(0, { notNullable: true })
+  declare organizationId: number
+}

+ 33 - 7
pages/helloasso/index.vue

@@ -17,7 +17,10 @@ Administration de la connexion Opentalent / HelloAsso
       <v-row>
         <v-col cols="12" class="d-flex justify-center align-center w-100 mt-6">
           <v-progress-circular
-            v-if="statusHelloAssoProfile === FETCHING_STATUS.PENDING"
+            v-if="
+              statusHelloAssoProfile === FETCHING_STATUS.PENDING ||
+              unlinkingPending
+            "
             indeterminate
             size="32"
           />
@@ -27,11 +30,16 @@ Administration de la connexion Opentalent / HelloAsso
             @click="onHelloAssoConnectClicked"
           />
 
-          <div v-else>
+          <div v-else class="d-flex flex-column align-center">
             <v-row>
               <v-icon icon="fas fa-check" color="success" class="mr-3" />
               {{ $t('your_helloasso_account_is_linked') }}
             </v-row>
+            <v-row>
+              <v-btn class="theme-warning mt-4" @click="onUnlinkAccountClick">
+                {{ $t('unlink_your_helloasso_account') }}
+              </v-btn>
+            </v-row>
           </div>
         </v-col>
       </v-row>
@@ -45,9 +53,12 @@ import HelloAssoProfile from '~/models/HelloAsso/HelloAssoProfile'
 import { useEntityManager } from '~/composables/data/useEntityManager'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { FETCHING_STATUS } from '~/types/enum/data'
+import UnlinkRequest from '~/models/HelloAsso/UnlinkRequest'
 
 const { em } = useEntityManager()
 
+const organizationProfile = useOrganizationProfileStore()
+
 const onHelloAssoConnectClicked = async () => {
   // Important de régénérer une URL avec un nouveau challenge à chaque
   // essai (entre autres pour supporter le HMR pendant les tests en local,
@@ -81,10 +92,8 @@ onMounted(() => {
 
 const { fetch } = useEntityFetch()
 
-const {
-  status: statusHelloAssoProfile,
-  refresh: refreshHelloAssoProfile,
-} = await fetch(HelloAssoProfile)
+const { status: statusHelloAssoProfile, refresh: refreshHelloAssoProfile } =
+  await fetch(HelloAssoProfile)
 
 const helloAssoProfile: ComputedRef<HelloAssoProfile | null> = computed(() => {
   if (statusHelloAssoProfile.value !== FETCHING_STATUS.SUCCESS) {
@@ -95,7 +104,7 @@ const helloAssoProfile: ComputedRef<HelloAssoProfile | null> = computed(() => {
 
 const onHelloAssoConnected = async () => {
   // On attend 200ms pour laisser en attente du message SSE
-  await new Promise(r => setTimeout(r, 200))
+  await new Promise((r) => setTimeout(r, 200))
 
   if (!helloAssoProfile.value || !helloAssoProfile.value.token) {
     // Fallback en cas de défaut de fonctionnement du SSE
@@ -103,6 +112,23 @@ const onHelloAssoConnected = async () => {
     await refreshHelloAssoProfile()
   }
 }
+
+const unlinkingPending: Ref<boolean> = ref(false)
+
+const onUnlinkAccountClick = async () => {
+  const unlinkRequest = em.newInstance(UnlinkRequest, {
+    organizationId: organizationProfile.id,
+  })
+
+  unlinkingPending.value = true
+
+  try {
+    await em.persist(unlinkRequest)
+    await refreshHelloAssoProfile()
+  } finally {
+    unlinkingPending.value = false
+  }
+}
 </script>
 
 <style scoped lang="scss">