index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <LayoutContainer>
  3. <v-card>
  4. <v-row>
  5. <v-col cols="12" md="4" class="d-flex justify-center">
  6. <v-img src="/images/logos/Logo-HelloAsso.svg" class="logo" />
  7. </v-col>
  8. <v-col cols="12" md="8" class="presentation">
  9. {{ $t('helloasso_presentation') }}
  10. </v-col>
  11. </v-row>
  12. <v-row>
  13. <v-col cols="12" class="d-flex justify-center align-center w-100 mt-6">
  14. <UiButtonHelloAssoConnect
  15. v-if="!helloAssoProfile || !helloAssoProfile.token"
  16. @click="onHelloAssoConnectClicked"
  17. />
  18. <div v-else>
  19. <v-row>
  20. <v-icon icon="fas fa-check" color="success" class="mr-3" />
  21. {{ $t('your_helloasso_account_is_linked') }}
  22. </v-row>
  23. <v-row>
  24. Token : {{ helloAssoProfile.token.slice(0, 30) }}...
  25. </v-row>
  26. </div>
  27. </v-col>
  28. </v-row>
  29. </v-card>
  30. </LayoutContainer>
  31. </template>
  32. <script setup lang="ts">
  33. import AuthUrl from '~/models/ApiResources/HelloAsso/AuthUrl'
  34. import HelloAssoProfile from '~/models/ApiResources/HelloAsso/HelloAssoProfile'
  35. import { useEntityManager } from '~/composables/data/useEntityManager'
  36. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  37. const { em } = useEntityManager()
  38. const onHelloAssoConnectClicked = async () => {
  39. // Important de régénérer une URL avec un nouveau challenge à chaque
  40. // essai (entre autres pour supporter le HMR pendant les tests en local,
  41. // ou en cas d'erreur et de ré-essai)
  42. const authUrl = await em.fetch(AuthUrl)
  43. navigateTo(authUrl.authUrl, {
  44. external: true,
  45. open: {
  46. target: '_blank',
  47. windowFeatures: {
  48. popup: true,
  49. width: 900,
  50. height: 600,
  51. },
  52. },
  53. })
  54. }
  55. onMounted(() => {
  56. window.addEventListener('message', (event) => {
  57. if (event.origin !== window.location.origin) {
  58. return
  59. }
  60. if (!event.data || !event.data.code) {
  61. return
  62. }
  63. onHelloAssoConnected()
  64. })
  65. })
  66. const { fetch } = useEntityFetch()
  67. const { data: helloAssoProfile, refresh: refreshHelloAsso } = await fetch(HelloAssoProfile)
  68. const onHelloAssoConnected = async () => {
  69. console.log('Helloasso connected')
  70. await refreshHelloAsso()
  71. }
  72. </script>
  73. <style scoped lang="scss">
  74. .v-card {
  75. padding: 48px;
  76. max-width: 70%;
  77. margin: 36px auto;
  78. @media (max-width: 600px) {
  79. max-width: 90%;
  80. }
  81. }
  82. .logo {
  83. max-width: 80%;
  84. }
  85. .presentation {
  86. border-left: 3px solid rgb(var(--v-theme-info));
  87. padding: 0 24px;
  88. color: rgb(var(--v-theme-on-neutral));
  89. }
  90. .authDialog {
  91. max-width: 90%;
  92. }
  93. </style>