Skip to content

Commit 49a5c5f

Browse files
committed
Amélioration card de connexion avec spinner
1 parent 44f8bc0 commit 49a5c5f

File tree

2 files changed

+82
-24
lines changed

2 files changed

+82
-24
lines changed

src/components/UserAddItem.vue

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,79 @@
11
<template>
2-
<ion-card @click="signIn()" :button="true">
2+
<ion-card @click="signIn()" :button="true" :disabled="connect.isLoading">
33
<ion-avatar>
44
<ion-icon :icon="addCircleOutline" />
55
</ion-avatar>
6+
<ion-spinner class="loading-spinner" :class="connect.isLoading ? 'show' : ''" name="crescent" />
67
<ion-card-header>
7-
<ion-card-title class="ion-text-center">Connexion</ion-card-title>
8+
<ion-card-title class="ion-text-center">
9+
Connexion
10+
<ion-spinner v-if="connect.isLoading" />
11+
</ion-card-title>
812
</ion-card-header>
913
</ion-card>
1014
</template>
1115

1216
<script setup>
13-
import { useMainStore } from '@/store';
17+
import { useConnect, useMainStore, useUser } from '@/store'
1418
import { addCircleOutline } from 'ionicons/icons'
15-
import { tryAndToastError } from '@/helpers/toast'
1619
import { useIonRouter } from '@ionic/vue'
1720
18-
const store = useMainStore()
21+
const mainStore = useMainStore()
22+
const connect = useConnect()
23+
const user = useUser()
1924
const router = useIonRouter()
2025
2126
async function signIn() {
22-
await tryAndToastError(() => store.signIn({ silent: false }))
23-
router.push('/')
27+
await mainStore.signIn({ silent: false })
28+
if (user.userId) {
29+
router.push('/')
30+
}
2431
}
2532
</script>
2633

2734
<style lang="scss" scoped>
2835
ion-card {
29-
--avatar-size: 100px;
30-
--card-width: 182px;
31-
width: var(--card-width);
36+
--avatar-size: 120px;
37+
--card-width: 200px;
38+
3239
background: transparent;
40+
box-shadow: none;
41+
42+
&::part(native) {
43+
display: grid;
44+
grid-template: var(--avatar-size) auto / var(--card-width);
45+
}
3346
34-
ion-avatar {
47+
ion-avatar, ion-spinner.loading-spinner {
48+
grid-area: 1 / 1 / 2 / 2;
3549
display: block;
3650
margin: 10px auto 0;
3751
height: var(--avatar-size);
3852
width: var(--avatar-size);
3953
}
4054
55+
ion-spinner.loading-spinner {
56+
background: rgba(255,255,255,0.5);
57+
backdrop-filter: blur(3px);
58+
opacity: 0;
59+
transition: opacity 0.5s ease;
60+
61+
[data-theme=dark] & {
62+
background: rgba(0,0,0,0.5);
63+
}
64+
65+
&.show {
66+
opacity: 1;
67+
}
68+
}
69+
4170
ion-icon {
4271
display: block;
4372
font-size: var(--avatar-size);
44-
color: var(--ion-color-muted);
4573
}
46-
}
4774
75+
ion-card-header {
76+
grid-area: 2 / 1 / 3 / 2;
77+
}
78+
}
4879
</style>

src/components/UserSelectItem.vue

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<template>
2-
<ion-card @click="setUser()" :button="true">
2+
<ion-card @click="setUser()" :button="true" :disabled="connect.isLoading">
33
<ion-avatar>
44
<img v-if="userPhoto?.data" :src="`data:${userPhoto.content_type};base64,${userPhoto.data}`" />
55
<ion-icon v-else :icon="personCircleOutline"/>
66
</ion-avatar>
7+
<ion-spinner class="loading-spinner" :class="connect.isLoading ? 'show' : ''" name="crescent" />
78
<ion-card-header>
89
<ion-card-title class="ion-text-center">{{ props.user?._id }}</ion-card-title>
910
<ion-card-subtitle class="ion-text-center">
@@ -15,44 +16,70 @@
1516

1617
<script setup>
1718
import { personCircleOutline } from 'ionicons/icons'
18-
import { tryAndToastError } from '@/helpers/toast'
19-
import { useMainStore, useUser } from '@/store'
19+
import { useConnect, useMainStore, useUser } from '@/store'
2020
import { useIonRouter } from '@ionic/vue'
2121
2222
// eslint-disable-next-line no-undef
2323
const props = defineProps(['user'])
24-
const store = useMainStore()
24+
const mainStore = useMainStore()
25+
const connect = useConnect()
2526
const userStore = useUser()
2627
const router = useIonRouter()
2728
2829
const userPhoto = computed(() => props?.user?._attachments['photo.jpg'])
2930
3031
async function setUser() {
31-
router.push('/')
3232
userStore.setUser(props.user)
33-
await tryAndToastError(() => store.signIn({ silent: true }))
33+
await mainStore.signIn({ silent: true })
34+
router.push('/')
3435
}
3536
3637
</script>
3738
3839
<style lang="scss" scoped>
3940
ion-card {
40-
--avatar-size: 100px;
41-
--card-width: 182px;
42-
width: var(--card-width);
41+
--avatar-size: 120px;
42+
--card-width: 200px;
43+
4344
background: transparent;
45+
box-shadow: none;
4446
45-
ion-avatar {
47+
&::part(native) {
48+
display: grid;
49+
grid-template: var(--avatar-size) auto / var(--card-width);
50+
}
51+
52+
ion-avatar, ion-spinner.loading-spinner {
53+
grid-area: 1 / 1 / 2 / 2;
4654
display: block;
4755
margin: 10px auto 0;
56+
padding: 10px;
4857
height: var(--avatar-size);
4958
width: var(--avatar-size);
5059
}
5160
61+
ion-spinner.loading-spinner {
62+
background: rgba(255,255,255,0.5);
63+
backdrop-filter: blur(3px);
64+
opacity: 0;
65+
transition: opacity 0.5s ease;
66+
67+
[data-theme=dark] & {
68+
background: rgba(0,0,0,0.5);
69+
}
70+
71+
&.show {
72+
opacity: 1;
73+
}
74+
}
75+
5276
ion-icon {
5377
display: block;
5478
font-size: var(--avatar-size);
5579
}
56-
}
5780
81+
ion-card-header {
82+
grid-area: 2 / 1 / 3 / 2;
83+
}
84+
}
5885
</style>

0 commit comments

Comments
 (0)