pukaad-ui-lib 1.299.0 → 1.301.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.json +1 -1
- package/dist/runtime/components/card/card-place-item.d.vue.ts +24 -0
- package/dist/runtime/components/card/card-place-item.vue +108 -0
- package/dist/runtime/components/card/card-place-item.vue.d.ts +24 -0
- package/dist/runtime/components/card/card-review.d.vue.ts +15 -0
- package/dist/runtime/components/card/card-review.vue +66 -13
- package/dist/runtime/components/card/card-review.vue.d.ts +15 -0
- package/dist/runtime/components/display/display-rating-summary.d.vue.ts +2 -0
- package/dist/runtime/components/display/display-rating-summary.vue +3 -2
- package/dist/runtime/components/display/display-rating-summary.vue.d.ts +2 -0
- package/dist/runtime/components/drawer/drawer-profile-network.d.vue.ts +1 -1
- package/dist/runtime/components/drawer/drawer-profile-network.vue +157 -47
- package/dist/runtime/components/drawer/drawer-profile-network.vue.d.ts +1 -1
- package/dist/runtime/components/input/input-address.d.vue.ts +1 -1
- package/dist/runtime/components/input/input-address.vue.d.ts +1 -1
- package/dist/runtime/components/input/input-autocomplete.d.vue.ts +2 -2
- package/dist/runtime/components/input/input-autocomplete.vue.d.ts +2 -2
- package/dist/runtime/components/input/input-file.d.vue.ts +1 -1
- package/dist/runtime/components/input/input-file.vue.d.ts +1 -1
- package/dist/runtime/components/input/input-password.d.vue.ts +1 -1
- package/dist/runtime/components/input/input-password.vue.d.ts +1 -1
- package/dist/runtime/components/input/input-tag.d.vue.ts +1 -1
- package/dist/runtime/components/input/input-tag.vue.d.ts +1 -1
- package/dist/runtime/components/modal/modal-password-confirmed.d.vue.ts +1 -1
- package/dist/runtime/components/modal/modal-password-confirmed.vue.d.ts +1 -1
- package/dist/runtime/components/modal/modal-password-verify.d.vue.ts +1 -1
- package/dist/runtime/components/modal/modal-password-verify.vue.d.ts +1 -1
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface PlaceItem {
|
|
2
|
+
id?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
cover_image?: string;
|
|
5
|
+
rating?: number;
|
|
6
|
+
review_count?: number;
|
|
7
|
+
like_count?: number;
|
|
8
|
+
address?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
is_liked?: boolean;
|
|
11
|
+
}
|
|
12
|
+
type __VLS_ModelProps = {
|
|
13
|
+
modelValue?: PlaceItem;
|
|
14
|
+
};
|
|
15
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
16
|
+
"update:modelValue": (value: PlaceItem) => any;
|
|
17
|
+
} & {
|
|
18
|
+
"require-auth": () => any;
|
|
19
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
|
|
20
|
+
"onUpdate:modelValue"?: ((value: PlaceItem) => any) | undefined;
|
|
21
|
+
"onRequire-auth"?: (() => any) | undefined;
|
|
22
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
23
|
+
declare const _default: typeof __VLS_export;
|
|
24
|
+
export default _default;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="flex gap-[16px] items-start justify-between" @click="onClickCard">
|
|
3
|
+
<div class="flex gap-[8px] cursor-pointer flex-1 min-w-0">
|
|
4
|
+
<Image
|
|
5
|
+
v-if="modelValue?.cover_image"
|
|
6
|
+
:src="modelValue.cover_image"
|
|
7
|
+
width="114"
|
|
8
|
+
height="64"
|
|
9
|
+
class="rounded-[4px] object-cover flex-shrink-0"
|
|
10
|
+
/>
|
|
11
|
+
<div
|
|
12
|
+
v-else
|
|
13
|
+
class="w-[114px] h-[64px] bg-mercury flex items-center justify-center rounded-[4px] flex-shrink-0"
|
|
14
|
+
>
|
|
15
|
+
<Icon name="fa6-solid:map-location-dot" size="24" class="text-gray" />
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="flex flex-col gap-[4px] min-w-0">
|
|
19
|
+
<div class="font-body-large-prominent truncate">
|
|
20
|
+
{{ modelValue?.name }}
|
|
21
|
+
</div>
|
|
22
|
+
<div
|
|
23
|
+
class="flex gap-[4px] items-center text-gray font-body-small flex-wrap"
|
|
24
|
+
>
|
|
25
|
+
<InputRating
|
|
26
|
+
:size="10"
|
|
27
|
+
readonly
|
|
28
|
+
:model-value="modelValue?.rating || 0"
|
|
29
|
+
/>
|
|
30
|
+
<div>
|
|
31
|
+
{{ $convert.convertNumber(modelValue?.review_count || 0) }}
|
|
32
|
+
</div>
|
|
33
|
+
<div>•</div>
|
|
34
|
+
<div>
|
|
35
|
+
ถูกใจ {{ $convert.convertNumber(modelValue?.like_count || 0) }}
|
|
36
|
+
</div>
|
|
37
|
+
<div>•</div>
|
|
38
|
+
<div class="truncate">{{ modelValue?.address }}</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="font-body-small text-gray line-clamp-2">
|
|
41
|
+
{{ modelValue?.description }}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<Button
|
|
47
|
+
:variant="modelValue?.is_liked ? 'default' : 'outline'"
|
|
48
|
+
:color="modelValue?.is_liked ? 'default' : 'primary'"
|
|
49
|
+
class="flex-shrink-0"
|
|
50
|
+
@click.stop="onLikeToggle"
|
|
51
|
+
>
|
|
52
|
+
{{ modelValue?.is_liked ? "\u0E16\u0E39\u0E01\u0E43\u0E08\u0E41\u0E25\u0E49\u0E27" : "\u0E16\u0E39\u0E01\u0E43\u0E08" }}
|
|
53
|
+
</Button>
|
|
54
|
+
</div>
|
|
55
|
+
</template>
|
|
56
|
+
|
|
57
|
+
<script setup>
|
|
58
|
+
import { ref } from "vue";
|
|
59
|
+
import { useRouter } from "vue-router";
|
|
60
|
+
import { useCookie, useRuntimeConfig } from "nuxt/app";
|
|
61
|
+
import { useApi } from "../../composables/useApi";
|
|
62
|
+
const modelValue = defineModel({ type: Object, ...{ default: () => ({}) } });
|
|
63
|
+
const emit = defineEmits(["require-auth"]);
|
|
64
|
+
const router = useRouter();
|
|
65
|
+
const api = useApi();
|
|
66
|
+
const config = useRuntimeConfig();
|
|
67
|
+
const isLoading = ref(false);
|
|
68
|
+
const onClickCard = () => {
|
|
69
|
+
if (modelValue.value?.id) {
|
|
70
|
+
router.push(`/place/${modelValue.value.id}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const onLikeToggle = async () => {
|
|
74
|
+
const { APP_TYPE } = config.public;
|
|
75
|
+
const secId = useCookie(APP_TYPE === "OFFICE" ? "OFFICE_SEC_ID" : "SEC_ID");
|
|
76
|
+
if (!secId.value) {
|
|
77
|
+
emit("require-auth");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!modelValue.value?.id) return;
|
|
81
|
+
if (isLoading.value) return;
|
|
82
|
+
const placeId = modelValue.value.id;
|
|
83
|
+
const currentLiked = !!modelValue.value.is_liked;
|
|
84
|
+
modelValue.value.is_liked = !currentLiked;
|
|
85
|
+
if (modelValue.value.like_count !== void 0) {
|
|
86
|
+
modelValue.value.like_count += !currentLiked ? 1 : -1;
|
|
87
|
+
}
|
|
88
|
+
isLoading.value = true;
|
|
89
|
+
try {
|
|
90
|
+
const method = currentLiked ? "DELETE" : "POST";
|
|
91
|
+
const response = await api(`/personal/suggest-places/${placeId}/like`, { method });
|
|
92
|
+
if (response.data) {
|
|
93
|
+
modelValue.value.is_liked = response.data.is_liked;
|
|
94
|
+
if (modelValue.value.like_count !== void 0) {
|
|
95
|
+
modelValue.value.like_count = response.data.like_count;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
} catch (error) {
|
|
99
|
+
modelValue.value.is_liked = currentLiked;
|
|
100
|
+
if (modelValue.value.like_count !== void 0) {
|
|
101
|
+
modelValue.value.like_count += currentLiked ? 1 : -1;
|
|
102
|
+
}
|
|
103
|
+
console.error("Like toggle failed:", error);
|
|
104
|
+
} finally {
|
|
105
|
+
isLoading.value = false;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
</script>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface PlaceItem {
|
|
2
|
+
id?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
cover_image?: string;
|
|
5
|
+
rating?: number;
|
|
6
|
+
review_count?: number;
|
|
7
|
+
like_count?: number;
|
|
8
|
+
address?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
is_liked?: boolean;
|
|
11
|
+
}
|
|
12
|
+
type __VLS_ModelProps = {
|
|
13
|
+
modelValue?: PlaceItem;
|
|
14
|
+
};
|
|
15
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
16
|
+
"update:modelValue": (value: PlaceItem) => any;
|
|
17
|
+
} & {
|
|
18
|
+
"require-auth": () => any;
|
|
19
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
|
|
20
|
+
"onUpdate:modelValue"?: ((value: PlaceItem) => any) | undefined;
|
|
21
|
+
"onRequire-auth"?: (() => any) | undefined;
|
|
22
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
23
|
+
declare const _default: typeof __VLS_export;
|
|
24
|
+
export default _default;
|
|
@@ -4,22 +4,37 @@ type __VLS_Props = {
|
|
|
4
4
|
isProfile: boolean;
|
|
5
5
|
disabledLike?: boolean;
|
|
6
6
|
disabledMenu?: boolean;
|
|
7
|
+
/** ถ้ามี place context → like/unlike และ edit จัดการใน component เลย */
|
|
8
|
+
place?: {
|
|
9
|
+
id: string | number;
|
|
10
|
+
name?: string;
|
|
11
|
+
address?: string;
|
|
12
|
+
cover?: string;
|
|
13
|
+
};
|
|
7
14
|
};
|
|
8
15
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
16
|
delete: (item: CardReviewProps) => any;
|
|
10
17
|
edit: (item: CardReviewProps) => any;
|
|
11
18
|
"toggle-like": (item: CardReviewProps, liked: boolean) => any;
|
|
12
19
|
"select-image": (item: CardReviewProps, index: number) => any;
|
|
20
|
+
"review-updated": (data: unknown) => any;
|
|
13
21
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
22
|
onDelete?: ((item: CardReviewProps) => any) | undefined;
|
|
15
23
|
onEdit?: ((item: CardReviewProps) => any) | undefined;
|
|
16
24
|
"onToggle-like"?: ((item: CardReviewProps, liked: boolean) => any) | undefined;
|
|
17
25
|
"onSelect-image"?: ((item: CardReviewProps, index: number) => any) | undefined;
|
|
26
|
+
"onReview-updated"?: ((data: unknown) => any) | undefined;
|
|
18
27
|
}>, {
|
|
19
28
|
item: CardReviewProps;
|
|
20
29
|
disabledMenu: boolean;
|
|
21
30
|
isProfile: boolean;
|
|
22
31
|
disabledLike: boolean;
|
|
32
|
+
place: {
|
|
33
|
+
id: string | number;
|
|
34
|
+
name?: string;
|
|
35
|
+
address?: string;
|
|
36
|
+
cover?: string;
|
|
37
|
+
};
|
|
23
38
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
24
39
|
declare const _default: typeof __VLS_export;
|
|
25
40
|
export default _default;
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<Button
|
|
25
25
|
variant="text"
|
|
26
26
|
:color="liked ? 'primary' : 'default'"
|
|
27
|
-
:disabled="props.disabledLike"
|
|
27
|
+
:disabled="props.disabledLike || isLikeLoading"
|
|
28
28
|
:aria-pressed="liked"
|
|
29
29
|
@click="toggleLike"
|
|
30
30
|
>
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
v-if="!props.disabledMenu"
|
|
41
41
|
:state="menuType"
|
|
42
42
|
disabled-padding
|
|
43
|
-
@review-edit="
|
|
43
|
+
@review-edit="onEdit"
|
|
44
44
|
@review-delete="emit('delete', props.item)"
|
|
45
45
|
/>
|
|
46
46
|
</div>
|
|
@@ -57,7 +57,9 @@
|
|
|
57
57
|
:model-value="props.item.review?.rating"
|
|
58
58
|
/>
|
|
59
59
|
<div class="text-gray font-body-small">
|
|
60
|
-
{{
|
|
60
|
+
{{
|
|
61
|
+
convertDateTorelativeText(props.item.review?.created_at ?? "")
|
|
62
|
+
}}
|
|
61
63
|
</div>
|
|
62
64
|
</div>
|
|
63
65
|
</div>
|
|
@@ -93,14 +95,27 @@
|
|
|
93
95
|
:start-index="startIndex"
|
|
94
96
|
title="รูปภาพรีวิว"
|
|
95
97
|
/>
|
|
98
|
+
|
|
99
|
+
<!-- Drawer แก้ไขรีวิว (ใช้เมื่อมี place context) -->
|
|
100
|
+
<DrawerPostReview
|
|
101
|
+
v-if="props.place?.id"
|
|
102
|
+
v-model="isDrawerOpen"
|
|
103
|
+
:item="drawerItem"
|
|
104
|
+
@success="onReviewSuccess"
|
|
105
|
+
/>
|
|
96
106
|
</template>
|
|
97
107
|
|
|
98
108
|
<script setup>
|
|
99
109
|
import { computed, ref, watch } from "vue";
|
|
100
110
|
import { useRouter } from "vue-router";
|
|
111
|
+
import { useNuxtApp } from "nuxt/app";
|
|
101
112
|
import { useConvert } from "../../composables/useConvert";
|
|
113
|
+
import { useApi } from "../../composables/useApi";
|
|
102
114
|
const router = useRouter();
|
|
103
|
-
const { convertNumber,
|
|
115
|
+
const { convertNumber, convertDateTorelativeText } = useConvert();
|
|
116
|
+
const api = useApi();
|
|
117
|
+
const nuxtApp = useNuxtApp();
|
|
118
|
+
const $toast = nuxtApp.$toast;
|
|
104
119
|
const props = defineProps({
|
|
105
120
|
item: { type: Object, required: true, default: () => ({
|
|
106
121
|
review_id: "0",
|
|
@@ -129,13 +144,15 @@ const props = defineProps({
|
|
|
129
144
|
}) },
|
|
130
145
|
isProfile: { type: Boolean, required: true, default: false },
|
|
131
146
|
disabledLike: { type: Boolean, required: false, default: false },
|
|
132
|
-
disabledMenu: { type: Boolean, required: false, default: false }
|
|
147
|
+
disabledMenu: { type: Boolean, required: false, default: false },
|
|
148
|
+
place: { type: Object, required: false, default: void 0 }
|
|
133
149
|
});
|
|
134
|
-
const emit = defineEmits(["toggle-like", "select-image", "edit", "delete"]);
|
|
150
|
+
const emit = defineEmits(["toggle-like", "select-image", "edit", "delete", "review-updated"]);
|
|
135
151
|
const isOpen = ref(false);
|
|
136
152
|
const startIndex = ref(0);
|
|
137
153
|
const liked = ref(props.item.review?.liked ?? false);
|
|
138
154
|
const likeCount = ref(props.item.review?.like_count ?? 0);
|
|
155
|
+
const isLikeLoading = ref(false);
|
|
139
156
|
watch(
|
|
140
157
|
() => props.item.review?.liked,
|
|
141
158
|
(val) => {
|
|
@@ -148,6 +165,16 @@ watch(
|
|
|
148
165
|
likeCount.value = val ?? 0;
|
|
149
166
|
}
|
|
150
167
|
);
|
|
168
|
+
const isDrawerOpen = ref(false);
|
|
169
|
+
const drawerItem = computed(() => ({
|
|
170
|
+
placeId: String(props.place?.id ?? ""),
|
|
171
|
+
placeName: props.place?.name ?? "",
|
|
172
|
+
address: props.place?.address ?? "",
|
|
173
|
+
coverImage: props.place?.cover ?? "",
|
|
174
|
+
rating: props.item.review?.rating ?? 0,
|
|
175
|
+
description: props.item.review?.description ?? "",
|
|
176
|
+
photos: (props.item.review?.images ?? []).map((url) => ({ url }))
|
|
177
|
+
}));
|
|
151
178
|
const menuType = computed(
|
|
152
179
|
() => props.item.user?.is_my_review ? "my-review" : "report-review"
|
|
153
180
|
);
|
|
@@ -155,15 +182,41 @@ const navigateToProfile = (pathName) => {
|
|
|
155
182
|
if (!pathName) return;
|
|
156
183
|
router.push(`/@${pathName}`);
|
|
157
184
|
};
|
|
158
|
-
const toggleLike = () => {
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
185
|
+
const toggleLike = async () => {
|
|
186
|
+
if (isLikeLoading.value) return;
|
|
187
|
+
const newLiked = !liked.value;
|
|
188
|
+
liked.value = newLiked;
|
|
189
|
+
likeCount.value += newLiked ? 1 : -1;
|
|
190
|
+
emit("toggle-like", props.item, newLiked);
|
|
191
|
+
if (!props.place?.id) return;
|
|
192
|
+
isLikeLoading.value = true;
|
|
193
|
+
try {
|
|
194
|
+
const method = newLiked ? "post" : "delete";
|
|
195
|
+
const res = await api(
|
|
196
|
+
`/personal/suggest-places/${props.place.id}/reviews/${props.item.review_id}/like`,
|
|
197
|
+
{ method }
|
|
198
|
+
);
|
|
199
|
+
if (res?.data) {
|
|
200
|
+
liked.value = res.data.liked ?? newLiked;
|
|
201
|
+
likeCount.value = res.data.like_count ?? likeCount.value;
|
|
202
|
+
}
|
|
203
|
+
} catch {
|
|
204
|
+
liked.value = !newLiked;
|
|
205
|
+
likeCount.value += newLiked ? -1 : 1;
|
|
206
|
+
$toast.error("\u0E40\u0E01\u0E34\u0E14\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14 \u0E01\u0E23\u0E38\u0E13\u0E32\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07");
|
|
207
|
+
} finally {
|
|
208
|
+
isLikeLoading.value = false;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const onEdit = () => {
|
|
212
|
+
if (props.place?.id) {
|
|
213
|
+
isDrawerOpen.value = true;
|
|
162
214
|
} else {
|
|
163
|
-
|
|
164
|
-
liked.value = true;
|
|
215
|
+
emit("edit", props.item);
|
|
165
216
|
}
|
|
166
|
-
|
|
217
|
+
};
|
|
218
|
+
const onReviewSuccess = (data) => {
|
|
219
|
+
emit("review-updated", data);
|
|
167
220
|
};
|
|
168
221
|
const selectImage = (index) => {
|
|
169
222
|
startIndex.value = index;
|
|
@@ -4,22 +4,37 @@ type __VLS_Props = {
|
|
|
4
4
|
isProfile: boolean;
|
|
5
5
|
disabledLike?: boolean;
|
|
6
6
|
disabledMenu?: boolean;
|
|
7
|
+
/** ถ้ามี place context → like/unlike และ edit จัดการใน component เลย */
|
|
8
|
+
place?: {
|
|
9
|
+
id: string | number;
|
|
10
|
+
name?: string;
|
|
11
|
+
address?: string;
|
|
12
|
+
cover?: string;
|
|
13
|
+
};
|
|
7
14
|
};
|
|
8
15
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
16
|
delete: (item: CardReviewProps) => any;
|
|
10
17
|
edit: (item: CardReviewProps) => any;
|
|
11
18
|
"toggle-like": (item: CardReviewProps, liked: boolean) => any;
|
|
12
19
|
"select-image": (item: CardReviewProps, index: number) => any;
|
|
20
|
+
"review-updated": (data: unknown) => any;
|
|
13
21
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
22
|
onDelete?: ((item: CardReviewProps) => any) | undefined;
|
|
15
23
|
onEdit?: ((item: CardReviewProps) => any) | undefined;
|
|
16
24
|
"onToggle-like"?: ((item: CardReviewProps, liked: boolean) => any) | undefined;
|
|
17
25
|
"onSelect-image"?: ((item: CardReviewProps, index: number) => any) | undefined;
|
|
26
|
+
"onReview-updated"?: ((data: unknown) => any) | undefined;
|
|
18
27
|
}>, {
|
|
19
28
|
item: CardReviewProps;
|
|
20
29
|
disabledMenu: boolean;
|
|
21
30
|
isProfile: boolean;
|
|
22
31
|
disabledLike: boolean;
|
|
32
|
+
place: {
|
|
33
|
+
id: string | number;
|
|
34
|
+
name?: string;
|
|
35
|
+
address?: string;
|
|
36
|
+
cover?: string;
|
|
37
|
+
};
|
|
23
38
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
24
39
|
declare const _default: typeof __VLS_export;
|
|
25
40
|
export default _default;
|
|
@@ -7,6 +7,7 @@ export interface DisplayRatingSummaryProps {
|
|
|
7
7
|
totalReviews?: number | string;
|
|
8
8
|
distribution?: RatingDistribution[];
|
|
9
9
|
badge?: number;
|
|
10
|
+
hasReviewed?: boolean;
|
|
10
11
|
}
|
|
11
12
|
declare const __VLS_export: import("vue").DefineComponent<DisplayRatingSummaryProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
12
13
|
"write-review": () => any;
|
|
@@ -16,6 +17,7 @@ declare const __VLS_export: import("vue").DefineComponent<DisplayRatingSummaryPr
|
|
|
16
17
|
rating: number | string;
|
|
17
18
|
totalReviews: number | string;
|
|
18
19
|
distribution: RatingDistribution[];
|
|
20
|
+
hasReviewed: boolean;
|
|
19
21
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
20
22
|
declare const _default: typeof __VLS_export;
|
|
21
23
|
export default _default;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{{ convertNumber(Number(props.totalReviews)) }} รีวิว
|
|
13
13
|
</div>
|
|
14
14
|
</div>
|
|
15
|
-
<Button color="primary" @click="emit('write-review')">
|
|
15
|
+
<Button v-if="!props.hasReviewed" color="primary" @click="emit('write-review')">
|
|
16
16
|
<Icon name="pukaad:write-review" /> เขียนรีวิว
|
|
17
17
|
</Button>
|
|
18
18
|
</div>
|
|
@@ -63,7 +63,8 @@ const props = defineProps({
|
|
|
63
63
|
rating: { type: [Number, String], required: false, default: 0 },
|
|
64
64
|
totalReviews: { type: [Number, String], required: false, default: 0 },
|
|
65
65
|
distribution: { type: Array, required: false, default: () => [] },
|
|
66
|
-
badge: { type: Number, required: false }
|
|
66
|
+
badge: { type: Number, required: false },
|
|
67
|
+
hasReviewed: { type: Boolean, required: false, default: false }
|
|
67
68
|
});
|
|
68
69
|
const sortedDistribution = computed(
|
|
69
70
|
() => [...props.distribution].sort((a, b) => b.stars - a.stars)
|
|
@@ -7,6 +7,7 @@ export interface DisplayRatingSummaryProps {
|
|
|
7
7
|
totalReviews?: number | string;
|
|
8
8
|
distribution?: RatingDistribution[];
|
|
9
9
|
badge?: number;
|
|
10
|
+
hasReviewed?: boolean;
|
|
10
11
|
}
|
|
11
12
|
declare const __VLS_export: import("vue").DefineComponent<DisplayRatingSummaryProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
12
13
|
"write-review": () => any;
|
|
@@ -16,6 +17,7 @@ declare const __VLS_export: import("vue").DefineComponent<DisplayRatingSummaryPr
|
|
|
16
17
|
rating: number | string;
|
|
17
18
|
totalReviews: number | string;
|
|
18
19
|
distribution: RatingDistribution[];
|
|
20
|
+
hasReviewed: boolean;
|
|
19
21
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
20
22
|
declare const _default: typeof __VLS_export;
|
|
21
23
|
export default _default;
|
|
@@ -17,13 +17,19 @@
|
|
|
17
17
|
<ShadTabs v-model="activeTab" class="flex-1 flex flex-col h-full">
|
|
18
18
|
<ShadTabsList>
|
|
19
19
|
<ShadTabsTrigger value="followers" class="px-[16px] py-[8px]">
|
|
20
|
-
ผู้ติดตาม ({{
|
|
20
|
+
ผู้ติดตาม ({{
|
|
21
|
+
$convert.convertNumber(profileData?.follower_count || 0)
|
|
22
|
+
}})
|
|
21
23
|
</ShadTabsTrigger>
|
|
22
24
|
<ShadTabsTrigger value="following" class="px-[16px] py-[8px]">
|
|
23
|
-
กำลังติดตาม ({{
|
|
25
|
+
กำลังติดตาม ({{
|
|
26
|
+
$convert.convertNumber(profileData?.following_count || 0)
|
|
27
|
+
}})
|
|
24
28
|
</ShadTabsTrigger>
|
|
25
29
|
<ShadTabsTrigger value="favorites" class="px-[16px] py-[8px]">
|
|
26
|
-
สถานที่โปรด ({{
|
|
30
|
+
สถานที่โปรด ({{
|
|
31
|
+
$convert.convertNumber(profileData?.like_place_count || 0)
|
|
32
|
+
}})
|
|
27
33
|
</ShadTabsTrigger>
|
|
28
34
|
</ShadTabsList>
|
|
29
35
|
|
|
@@ -32,33 +38,62 @@
|
|
|
32
38
|
<ShadTabsContent value="followers" class="flex flex-col mt-0">
|
|
33
39
|
<template v-if="tabState.followers.loading">
|
|
34
40
|
<div class="flex justify-center py-[40px]">
|
|
35
|
-
<Icon
|
|
41
|
+
<Icon
|
|
42
|
+
name="lucide:loader-2"
|
|
43
|
+
size="24"
|
|
44
|
+
class="animate-spin text-gray"
|
|
45
|
+
/>
|
|
36
46
|
</div>
|
|
37
47
|
</template>
|
|
38
48
|
<template v-else-if="followers.length > 0">
|
|
39
49
|
<div class="flex flex-col gap-[16px]">
|
|
40
|
-
<template
|
|
41
|
-
|
|
50
|
+
<template
|
|
51
|
+
v-for="(user, index) in followers"
|
|
52
|
+
:key="user.id || index"
|
|
53
|
+
>
|
|
54
|
+
<CardUserItem
|
|
55
|
+
v-model="followers[index]"
|
|
56
|
+
@require-auth="emit('require-auth')"
|
|
57
|
+
/>
|
|
42
58
|
<Divider v-if="index !== followers.length - 1" />
|
|
43
59
|
</template>
|
|
44
60
|
</div>
|
|
45
|
-
<div
|
|
46
|
-
|
|
61
|
+
<div
|
|
62
|
+
v-if="tabState.followers.loadingMore"
|
|
63
|
+
class="flex justify-center py-[16px]"
|
|
64
|
+
>
|
|
65
|
+
<Icon
|
|
66
|
+
name="lucide:loader-2"
|
|
67
|
+
size="20"
|
|
68
|
+
class="animate-spin text-gray"
|
|
69
|
+
/>
|
|
47
70
|
</div>
|
|
48
71
|
</template>
|
|
49
72
|
<template v-else>
|
|
50
|
-
<div
|
|
51
|
-
|
|
73
|
+
<div
|
|
74
|
+
v-if="isMyProfile"
|
|
75
|
+
class="h-[200px] flex flex-col gap-[8px] items-center justify-center"
|
|
76
|
+
>
|
|
77
|
+
<div class="font-title-medium-prominent text-black">
|
|
78
|
+
กำลังมองหาผู้ติดตามอยู่ใช่ไหม
|
|
79
|
+
</div>
|
|
52
80
|
<div class="flex flex-col font-body-large text-gray items-center">
|
|
53
81
|
<div>เมื่อมีคนติดตามบัญชีนี้ ข้อมูลจะแสดงที่นี่</div>
|
|
54
82
|
<div>การโพสต์และการโต้ตอบกับผู้อื่นจะช่วยเพิ่มผู้ติดตาม</div>
|
|
55
83
|
</div>
|
|
56
84
|
</div>
|
|
57
|
-
<div
|
|
58
|
-
|
|
85
|
+
<div
|
|
86
|
+
v-else
|
|
87
|
+
class="h-[200px] flex flex-col gap-[8px] items-center justify-center"
|
|
88
|
+
>
|
|
89
|
+
<div
|
|
90
|
+
class="font-title-medium-prominent text-black flex gap-[4px]"
|
|
91
|
+
>
|
|
59
92
|
{{ profileData?.name }} ยังไม่มีผู้ติดตาม
|
|
60
93
|
</div>
|
|
61
|
-
<div class="font-body-large text-gray"
|
|
94
|
+
<div class="font-body-large text-gray">
|
|
95
|
+
เมื่อมีคนติดตามบัญชีนี้ ข้อมูลจะแสดงที่นี่
|
|
96
|
+
</div>
|
|
62
97
|
</div>
|
|
63
98
|
</template>
|
|
64
99
|
</ShadTabsContent>
|
|
@@ -67,36 +102,71 @@
|
|
|
67
102
|
<ShadTabsContent value="following" class="flex flex-col mt-0">
|
|
68
103
|
<template v-if="tabState.following.loading">
|
|
69
104
|
<div class="flex justify-center py-[40px]">
|
|
70
|
-
<Icon
|
|
105
|
+
<Icon
|
|
106
|
+
name="lucide:loader-2"
|
|
107
|
+
size="24"
|
|
108
|
+
class="animate-spin text-gray"
|
|
109
|
+
/>
|
|
71
110
|
</div>
|
|
72
111
|
</template>
|
|
73
112
|
<template v-else-if="following.length > 0">
|
|
74
113
|
<div class="flex flex-col gap-[16px]">
|
|
75
|
-
<template
|
|
76
|
-
|
|
114
|
+
<template
|
|
115
|
+
v-for="(user, index) in following"
|
|
116
|
+
:key="user.id || index"
|
|
117
|
+
>
|
|
118
|
+
<CardUserItem
|
|
119
|
+
v-model="following[index]"
|
|
120
|
+
@require-auth="emit('require-auth')"
|
|
121
|
+
/>
|
|
77
122
|
<Divider v-if="index !== following.length - 1" />
|
|
78
123
|
</template>
|
|
79
124
|
</div>
|
|
80
|
-
<div
|
|
81
|
-
|
|
125
|
+
<div
|
|
126
|
+
v-if="tabState.following.loadingMore"
|
|
127
|
+
class="flex justify-center py-[16px]"
|
|
128
|
+
>
|
|
129
|
+
<Icon
|
|
130
|
+
name="lucide:loader-2"
|
|
131
|
+
size="20"
|
|
132
|
+
class="animate-spin text-gray"
|
|
133
|
+
/>
|
|
82
134
|
</div>
|
|
83
135
|
</template>
|
|
84
136
|
<template v-else>
|
|
85
|
-
<div
|
|
137
|
+
<div
|
|
138
|
+
v-if="isMyProfile"
|
|
139
|
+
class="flex flex-col gap-[24px] items-center justify-center h-[200px]"
|
|
140
|
+
>
|
|
86
141
|
<div class="flex flex-col gap-[8px] items-center">
|
|
87
|
-
<div class="font-title-medium-prominent text-black"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
142
|
+
<div class="font-title-medium-prominent text-black">
|
|
143
|
+
ทันเหตุการณ์
|
|
144
|
+
</div>
|
|
145
|
+
<div
|
|
146
|
+
class="flex flex-col font-body-large text-gray items-center"
|
|
147
|
+
>
|
|
148
|
+
<div>
|
|
149
|
+
การติดตามบัญชีเป็นวิธีที่ง่ายในการสร้างลำดับเหตุการณ์
|
|
150
|
+
</div>
|
|
151
|
+
<div>
|
|
152
|
+
ของคุณและรู้ว่ามีอะไรเกิดขึ้นบ้างกับหัวข้อและผู้ที่คุณสนใจ
|
|
153
|
+
</div>
|
|
91
154
|
</div>
|
|
92
155
|
</div>
|
|
93
|
-
<Button color="primary" @click="emit('explore-profiles')"
|
|
156
|
+
<Button color="primary" @click="emit('explore-profiles')"
|
|
157
|
+
>ติดตามใครดี</Button
|
|
158
|
+
>
|
|
94
159
|
</div>
|
|
95
|
-
<div
|
|
160
|
+
<div
|
|
161
|
+
v-else
|
|
162
|
+
class="h-[200px] flex flex-col gap-[8px] items-center justify-center"
|
|
163
|
+
>
|
|
96
164
|
<div class="font-title-medium-prominent text-black">
|
|
97
165
|
{{ profileData?.name }} ไม่ได้กำลังติดตามใคร
|
|
98
166
|
</div>
|
|
99
|
-
<div class="font-body-large text-gray"
|
|
167
|
+
<div class="font-body-large text-gray">
|
|
168
|
+
เมื่อพวกเขาติดตามบัญชี ข้อมูลจะแสดงที่นี่
|
|
169
|
+
</div>
|
|
100
170
|
</div>
|
|
101
171
|
</template>
|
|
102
172
|
</ShadTabsContent>
|
|
@@ -105,30 +175,65 @@
|
|
|
105
175
|
<ShadTabsContent value="favorites" class="flex flex-col mt-0">
|
|
106
176
|
<template v-if="tabState.favorites.loading">
|
|
107
177
|
<div class="flex justify-center py-[40px]">
|
|
108
|
-
<Icon
|
|
178
|
+
<Icon
|
|
179
|
+
name="lucide:loader-2"
|
|
180
|
+
size="24"
|
|
181
|
+
class="animate-spin text-gray"
|
|
182
|
+
/>
|
|
109
183
|
</div>
|
|
110
184
|
</template>
|
|
111
185
|
<template v-else-if="favorites.length > 0">
|
|
112
|
-
<div class="flex flex-col
|
|
113
|
-
|
|
186
|
+
<div class="flex flex-col gap-[16px]">
|
|
187
|
+
<template
|
|
188
|
+
v-for="(place, index) in favorites"
|
|
189
|
+
:key="place.id || index"
|
|
190
|
+
>
|
|
191
|
+
<CardPlaceItem
|
|
192
|
+
v-model="favorites[index]"
|
|
193
|
+
@require-auth="emit('require-auth')"
|
|
194
|
+
/>
|
|
195
|
+
<Divider v-if="index !== favorites.length - 1" />
|
|
196
|
+
</template>
|
|
114
197
|
</div>
|
|
115
|
-
|
|
116
|
-
|
|
198
|
+
|
|
199
|
+
<div
|
|
200
|
+
v-if="tabState.favorites.loadingMore"
|
|
201
|
+
class="flex justify-center py-[16px]"
|
|
202
|
+
>
|
|
203
|
+
<Icon
|
|
204
|
+
name="lucide:loader-2"
|
|
205
|
+
size="20"
|
|
206
|
+
class="animate-spin text-gray"
|
|
207
|
+
/>
|
|
117
208
|
</div>
|
|
118
209
|
</template>
|
|
119
210
|
<template v-else>
|
|
120
|
-
<div
|
|
211
|
+
<div
|
|
212
|
+
v-if="isMyProfile"
|
|
213
|
+
class="flex flex-col gap-[24px] items-center justify-center h-[200px]"
|
|
214
|
+
>
|
|
121
215
|
<div class="flex flex-col gap-[8px] items-center">
|
|
122
|
-
<div class="font-title-medium-prominent text-black"
|
|
123
|
-
|
|
216
|
+
<div class="font-title-medium-prominent text-black">
|
|
217
|
+
ยังไม่มีสถานที่โปรด
|
|
218
|
+
</div>
|
|
219
|
+
<div class="font-body-large text-gray">
|
|
220
|
+
กดหัวใจที่สถานที่ใดก็ได้เพื่อบันทึกไว้ที่นี่
|
|
221
|
+
</div>
|
|
124
222
|
</div>
|
|
125
|
-
<Button color="primary" @click="emit('explore-places')"
|
|
223
|
+
<Button color="primary" @click="emit('explore-places')"
|
|
224
|
+
>ที่ไหนน่าสนใจ</Button
|
|
225
|
+
>
|
|
126
226
|
</div>
|
|
127
|
-
<div
|
|
227
|
+
<div
|
|
228
|
+
v-else
|
|
229
|
+
class="h-[200px] flex flex-col gap-[8px] items-center justify-center"
|
|
230
|
+
>
|
|
128
231
|
<div class="font-title-medium-prominent text-black">
|
|
129
232
|
@{{ profileData?.name }} ยังไม่มีสถานที่โปรด
|
|
130
233
|
</div>
|
|
131
|
-
<div class="font-body-large text-gray"
|
|
234
|
+
<div class="font-body-large text-gray">
|
|
235
|
+
เมื่อเขาบันทึกสถานที่ไว้จะแสดงที่นี่
|
|
236
|
+
</div>
|
|
132
237
|
</div>
|
|
133
238
|
</template>
|
|
134
239
|
</ShadTabsContent>
|
|
@@ -179,9 +284,12 @@ const fetchFollowers = async (isLoadMore = false) => {
|
|
|
179
284
|
s.page = 1;
|
|
180
285
|
}
|
|
181
286
|
try {
|
|
182
|
-
const res = await api(
|
|
183
|
-
|
|
184
|
-
|
|
287
|
+
const res = await api(
|
|
288
|
+
`/profiles/${props.profileId}/followers`,
|
|
289
|
+
{
|
|
290
|
+
query: { page: s.page, page_size: PAGE_SIZE }
|
|
291
|
+
}
|
|
292
|
+
);
|
|
185
293
|
if (res.meta) s.hasMore = s.page < res.meta.total_pages;
|
|
186
294
|
if (res.data?.profile) syncProfile(res.data.profile);
|
|
187
295
|
const items = res.data?.items || [];
|
|
@@ -204,9 +312,12 @@ const fetchFollowing = async (isLoadMore = false) => {
|
|
|
204
312
|
s.page = 1;
|
|
205
313
|
}
|
|
206
314
|
try {
|
|
207
|
-
const res = await api(
|
|
208
|
-
|
|
209
|
-
|
|
315
|
+
const res = await api(
|
|
316
|
+
`/profiles/${props.profileId}/following`,
|
|
317
|
+
{
|
|
318
|
+
query: { page: s.page, page_size: PAGE_SIZE }
|
|
319
|
+
}
|
|
320
|
+
);
|
|
210
321
|
if (res.meta) s.hasMore = s.page < res.meta.total_pages;
|
|
211
322
|
if (res.data?.profile) syncProfile(res.data.profile);
|
|
212
323
|
const items = res.data?.items || [];
|
|
@@ -229,10 +340,9 @@ const fetchFavorites = async (isLoadMore = false) => {
|
|
|
229
340
|
s.page = 1;
|
|
230
341
|
}
|
|
231
342
|
try {
|
|
232
|
-
const res = await api(
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
);
|
|
343
|
+
const res = await api(`/profiles/${props.profileId}/liked-places`, {
|
|
344
|
+
query: { page: s.page, page_size: PAGE_SIZE }
|
|
345
|
+
});
|
|
236
346
|
if (res.meta) s.hasMore = s.page < res.meta.total_pages;
|
|
237
347
|
if (res.data?.profile) syncProfile(res.data.profile);
|
|
238
348
|
const items = res.data?.items || [];
|
|
@@ -49,11 +49,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
49
49
|
label: string;
|
|
50
50
|
required: boolean;
|
|
51
51
|
name: string;
|
|
52
|
+
gap: string;
|
|
52
53
|
placeholder: string;
|
|
53
54
|
labelDetail: string;
|
|
54
55
|
placeholderDetail: string;
|
|
55
56
|
requiredDetail: boolean;
|
|
56
|
-
gap: string;
|
|
57
57
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
58
58
|
declare const _default: typeof __VLS_export;
|
|
59
59
|
export default _default;
|
|
@@ -49,11 +49,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
49
49
|
label: string;
|
|
50
50
|
required: boolean;
|
|
51
51
|
name: string;
|
|
52
|
+
gap: string;
|
|
52
53
|
placeholder: string;
|
|
53
54
|
labelDetail: string;
|
|
54
55
|
placeholderDetail: string;
|
|
55
56
|
requiredDetail: boolean;
|
|
56
|
-
gap: string;
|
|
57
57
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
58
58
|
declare const _default: typeof __VLS_export;
|
|
59
59
|
export default _default;
|
|
@@ -48,10 +48,10 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
48
48
|
pageSize: number;
|
|
49
49
|
id: string;
|
|
50
50
|
name: string;
|
|
51
|
-
description: string;
|
|
52
51
|
options: AutocompleteOption[] | string[] | number[];
|
|
53
|
-
|
|
52
|
+
description: string;
|
|
54
53
|
placeholder: string;
|
|
54
|
+
limit: number;
|
|
55
55
|
disabledErrorMessage: boolean;
|
|
56
56
|
disabledBorder: boolean;
|
|
57
57
|
showCounter: boolean;
|
|
@@ -48,10 +48,10 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
48
48
|
pageSize: number;
|
|
49
49
|
id: string;
|
|
50
50
|
name: string;
|
|
51
|
-
description: string;
|
|
52
51
|
options: AutocompleteOption[] | string[] | number[];
|
|
53
|
-
|
|
52
|
+
description: string;
|
|
54
53
|
placeholder: string;
|
|
54
|
+
limit: number;
|
|
55
55
|
disabledErrorMessage: boolean;
|
|
56
56
|
disabledBorder: boolean;
|
|
57
57
|
showCounter: boolean;
|
|
@@ -34,9 +34,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
|
|
|
34
34
|
fullWidth: boolean;
|
|
35
35
|
fullHeight: boolean;
|
|
36
36
|
name: string;
|
|
37
|
+
accept: string;
|
|
37
38
|
limit: number;
|
|
38
39
|
disabledErrorMessage: boolean;
|
|
39
|
-
accept: string;
|
|
40
40
|
labelIcon: string;
|
|
41
41
|
disabledDrop: boolean;
|
|
42
42
|
column: boolean;
|
|
@@ -34,9 +34,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
|
|
|
34
34
|
fullWidth: boolean;
|
|
35
35
|
fullHeight: boolean;
|
|
36
36
|
name: string;
|
|
37
|
+
accept: string;
|
|
37
38
|
limit: number;
|
|
38
39
|
disabledErrorMessage: boolean;
|
|
39
|
-
accept: string;
|
|
40
40
|
labelIcon: string;
|
|
41
41
|
disabledDrop: boolean;
|
|
42
42
|
column: boolean;
|
|
@@ -22,8 +22,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
22
22
|
}>, {
|
|
23
23
|
id: string;
|
|
24
24
|
name: string;
|
|
25
|
-
new: boolean;
|
|
26
25
|
disabledForgotPassword: boolean;
|
|
26
|
+
new: boolean;
|
|
27
27
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
28
28
|
declare const _default: typeof __VLS_export;
|
|
29
29
|
export default _default;
|
|
@@ -22,8 +22,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
22
22
|
}>, {
|
|
23
23
|
id: string;
|
|
24
24
|
name: string;
|
|
25
|
-
new: boolean;
|
|
26
25
|
disabledForgotPassword: boolean;
|
|
26
|
+
new: boolean;
|
|
27
27
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
28
28
|
declare const _default: typeof __VLS_export;
|
|
29
29
|
export default _default;
|
|
@@ -26,8 +26,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
26
26
|
}>, {
|
|
27
27
|
name: string;
|
|
28
28
|
state: "user" | "admin";
|
|
29
|
-
limit: number;
|
|
30
29
|
placeholder: string;
|
|
30
|
+
limit: number;
|
|
31
31
|
ignore: string[];
|
|
32
32
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
33
|
declare const _default: typeof __VLS_export;
|
|
@@ -26,8 +26,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
26
26
|
}>, {
|
|
27
27
|
name: string;
|
|
28
28
|
state: "user" | "admin";
|
|
29
|
-
limit: number;
|
|
30
29
|
placeholder: string;
|
|
30
|
+
limit: number;
|
|
31
31
|
ignore: string[];
|
|
32
32
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
33
|
declare const _default: typeof __VLS_export;
|
|
@@ -24,8 +24,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
24
24
|
}) => any) | undefined;
|
|
25
25
|
}>, {
|
|
26
26
|
title: string;
|
|
27
|
-
disabledForgotPassword: boolean;
|
|
28
27
|
confirmText: string;
|
|
28
|
+
disabledForgotPassword: boolean;
|
|
29
29
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
30
30
|
declare const _default: typeof __VLS_export;
|
|
31
31
|
export default _default;
|
|
@@ -24,8 +24,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
24
24
|
}) => any) | undefined;
|
|
25
25
|
}>, {
|
|
26
26
|
title: string;
|
|
27
|
-
disabledForgotPassword: boolean;
|
|
28
27
|
confirmText: string;
|
|
28
|
+
disabledForgotPassword: boolean;
|
|
29
29
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
30
30
|
declare const _default: typeof __VLS_export;
|
|
31
31
|
export default _default;
|
|
@@ -32,8 +32,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
32
32
|
}>, {
|
|
33
33
|
title: string;
|
|
34
34
|
mode: "login" | "secure";
|
|
35
|
-
disabledForgotPassword: boolean;
|
|
36
35
|
confirmText: string;
|
|
36
|
+
disabledForgotPassword: boolean;
|
|
37
37
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
38
38
|
declare const _default: typeof __VLS_export;
|
|
39
39
|
export default _default;
|
|
@@ -32,8 +32,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
32
32
|
}>, {
|
|
33
33
|
title: string;
|
|
34
34
|
mode: "login" | "secure";
|
|
35
|
-
disabledForgotPassword: boolean;
|
|
36
35
|
confirmText: string;
|
|
36
|
+
disabledForgotPassword: boolean;
|
|
37
37
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
38
38
|
declare const _default: typeof __VLS_export;
|
|
39
39
|
export default _default;
|