|
|
@@ -43,18 +43,20 @@
|
|
|
<div class="col-2">
|
|
|
<q-avatar
|
|
|
:style="
|
|
|
- avatarColors[provider.provider_id % avatarColors.length]
|
|
|
+ avatarColors[
|
|
|
+ providerInfo.provider_id % avatarColors.length
|
|
|
+ ]
|
|
|
"
|
|
|
>
|
|
|
<img
|
|
|
- v-if="getProfileMediaUrl(provider)"
|
|
|
+ v-if="getProfileMediaUrl(providerInfo)"
|
|
|
style="object-fit: cover; border-radius: 50%"
|
|
|
- :src="getProfileMediaUrl(provider)"
|
|
|
+ :src="getProfileMediaUrl(providerInfo)"
|
|
|
/>
|
|
|
|
|
|
<span v-else>
|
|
|
{{
|
|
|
- getFirstName(provider.provider_name)
|
|
|
+ getFirstName(providerInfo.provider_name)
|
|
|
?.slice(0, 2)
|
|
|
.toUpperCase() ?? "??"
|
|
|
}}
|
|
|
@@ -64,11 +66,11 @@
|
|
|
|
|
|
<div class="col-3 column">
|
|
|
<div class="font12 fontbold text-text">
|
|
|
- {{ getFirstName(provider?.provider_name) ?? "—" }}
|
|
|
+ {{ getFirstName(providerInfo?.provider_name) ?? "—" }}
|
|
|
</div>
|
|
|
|
|
|
<div class="font10 fontmedium text-grey-7">
|
|
|
- {{ provider?.district ?? "—" }}
|
|
|
+ {{ providerDistrict ?? "—" }}
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -83,11 +85,11 @@
|
|
|
|
|
|
<span class="font9 fontmedium q-ml-xs">
|
|
|
{{
|
|
|
- (provider?.average_rating != null
|
|
|
- ? Number(provider.average_rating).toFixed(1)
|
|
|
+ (providerInfo?.average_rating != null
|
|
|
+ ? Number(providerInfo.average_rating).toFixed(1)
|
|
|
: "") +
|
|
|
" (" +
|
|
|
- (provider?.total_reviews ?? 0) +
|
|
|
+ (providerInfo?.total_reviews ?? 0) +
|
|
|
")"
|
|
|
}}
|
|
|
</span>
|
|
|
@@ -101,7 +103,7 @@
|
|
|
/>
|
|
|
|
|
|
<span class="font9 fontmedium q-ml-xs">
|
|
|
- {{ provider?.total_services ?? 0 }}
|
|
|
+ {{ providerInfo?.total_services ?? 0 }}
|
|
|
</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -140,7 +142,7 @@
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
- v-if="loadingAvailability"
|
|
|
+ v-if="loadingAvailability || loadingProvider"
|
|
|
class="row items-center justify-center q-py-lg"
|
|
|
>
|
|
|
<q-spinner-dots
|
|
|
@@ -271,6 +273,7 @@ import {
|
|
|
import { date, useDialogPluginComponent, useQuasar } from "quasar";
|
|
|
import { getClientProviderBlocks } from "src/api/schedule";
|
|
|
import { getFirstName } from "src/helpers/utils";
|
|
|
+import { getPerfilPrestador } from "src/api/dashboard";
|
|
|
import { getProfileMediaUrl } from "src/helpers/profileMedia";
|
|
|
|
|
|
import {
|
|
|
@@ -303,12 +306,15 @@ const { dialogRef } = useDialogPluginComponent();
|
|
|
const servicePackage = useServicePackageStore();
|
|
|
const store = userStore();
|
|
|
|
|
|
+const providerInfo = ref({ ...props.provider });
|
|
|
+
|
|
|
const blockedDays = ref([]);
|
|
|
const bookings = ref([]);
|
|
|
const favoriteId = ref(null);
|
|
|
const favoriteLoading = ref(false);
|
|
|
const isFavorite = ref(false);
|
|
|
const loadingAvailability = ref(true);
|
|
|
+const loadingProvider = ref(true);
|
|
|
const loadingReviews = ref(true);
|
|
|
const providerClientBlocks = ref({
|
|
|
existing_schedules: [],
|
|
|
@@ -322,6 +328,10 @@ const availableWeekDays = computed(() => [
|
|
|
...new Set(workingDays.value.map((wd) => wd.day)),
|
|
|
]);
|
|
|
|
|
|
+const providerDistrict = computed(
|
|
|
+ () => providerInfo.value?.district ?? providerInfo.value?.provider_district,
|
|
|
+);
|
|
|
+
|
|
|
const blockedDateSet = computed(
|
|
|
() =>
|
|
|
new Set(
|
|
|
@@ -350,14 +360,14 @@ const getWeekStart = (dateStr) => {
|
|
|
const cartHasAnotherProvider = () =>
|
|
|
servicePackage.items.length > 0 &&
|
|
|
Number(servicePackage.items[0].provider_id) !==
|
|
|
- Number(props.provider.provider_id);
|
|
|
+ Number(providerInfo.value.provider_id);
|
|
|
|
|
|
const getServicePackageWeekCount = (selectedDate) => {
|
|
|
const weekStart = getWeekStart(selectedDate);
|
|
|
|
|
|
return servicePackage.items.filter(
|
|
|
(item) =>
|
|
|
- Number(item.provider_id) === Number(props.provider.provider_id) &&
|
|
|
+ Number(item.provider_id) === Number(providerInfo.value.provider_id) &&
|
|
|
getWeekStart(item.date) === weekStart,
|
|
|
).length;
|
|
|
};
|
|
|
@@ -420,10 +430,10 @@ const loadAvailability = async () => {
|
|
|
};
|
|
|
|
|
|
const [wd, bd, clientBlocks] = await Promise.all([
|
|
|
- getProviderWorkingDays(props.provider.provider_id),
|
|
|
- getProviderBlockedDays(props.provider.provider_id),
|
|
|
+ getProviderWorkingDays(providerInfo.value.provider_id),
|
|
|
+ getProviderBlockedDays(providerInfo.value.provider_id),
|
|
|
clientId
|
|
|
- ? getClientProviderBlocks(clientId, props.provider.provider_id)
|
|
|
+ ? getClientProviderBlocks(clientId, providerInfo.value.provider_id)
|
|
|
: Promise.resolve(defaultClientBlocks),
|
|
|
]);
|
|
|
|
|
|
@@ -446,6 +456,44 @@ const loadAvailability = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+const loadProviderProfile = async () => {
|
|
|
+ const providerId = props.provider?.provider_id ?? props.provider?.id;
|
|
|
+
|
|
|
+ if (!providerId) {
|
|
|
+ loadingProvider.value = false;
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ loadingProvider.value = true;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const payload = await getPerfilPrestador(providerId);
|
|
|
+
|
|
|
+ providerInfo.value = { ...props.provider, ...payload };
|
|
|
+ } catch {
|
|
|
+ providerInfo.value = { ...props.provider };
|
|
|
+ } finally {
|
|
|
+ loadingProvider.value = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ const hasAnyPrice = [
|
|
|
+ "daily_price_8h",
|
|
|
+ "daily_price_6h",
|
|
|
+ "daily_price_4h",
|
|
|
+ "daily_price_2h",
|
|
|
+ ].some((key) => providerInfo.value?.[key] != null);
|
|
|
+
|
|
|
+ if (!hasAnyPrice) {
|
|
|
+ $q.notify({
|
|
|
+ message: t("scheduling_page.provider_unavailable"),
|
|
|
+ type: "warning",
|
|
|
+ });
|
|
|
+
|
|
|
+ dialogRef.value?.hide();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
const loadFavoriteState = async () => {
|
|
|
const clientId = store.user?.client?.id;
|
|
|
if (!clientId) return;
|
|
|
@@ -453,7 +501,7 @@ const loadFavoriteState = async () => {
|
|
|
try {
|
|
|
const favorites = await getClientFavoriteProviders(clientId);
|
|
|
const match = (favorites ?? []).find(
|
|
|
- (f) => Number(f.provider_id) === Number(props.provider.provider_id),
|
|
|
+ (f) => Number(f.provider_id) === Number(providerInfo.value.provider_id),
|
|
|
);
|
|
|
|
|
|
isFavorite.value = !!match;
|
|
|
@@ -468,7 +516,7 @@ const loadReviews = async () => {
|
|
|
loadingReviews.value = true;
|
|
|
|
|
|
try {
|
|
|
- const all = await getProviderReceivedReviews(props.provider.provider_id);
|
|
|
+ const all = await getProviderReceivedReviews(providerInfo.value.provider_id);
|
|
|
|
|
|
reviews.value = (all ?? []).slice(0, 10);
|
|
|
} catch {
|
|
|
@@ -515,7 +563,7 @@ const onDateSelected = (val) => {
|
|
|
const servicePackageBookingBlocks = servicePackage.items
|
|
|
.filter(
|
|
|
(item) =>
|
|
|
- Number(item.provider_id) === Number(props.provider.provider_id) &&
|
|
|
+ Number(item.provider_id) === Number(providerInfo.value.provider_id) &&
|
|
|
normalizeDate(item.date) === valFormatted,
|
|
|
)
|
|
|
.map((item) => ({
|
|
|
@@ -544,7 +592,7 @@ const onDateSelected = (val) => {
|
|
|
component: ServiceSelectionSheet,
|
|
|
componentProps: {
|
|
|
partialBlocks,
|
|
|
- provider: props.provider,
|
|
|
+ provider: providerInfo.value,
|
|
|
selectedDate: val,
|
|
|
scheduleType: 'default'
|
|
|
},
|
|
|
@@ -593,7 +641,7 @@ const onDateSelected = (val) => {
|
|
|
});
|
|
|
|
|
|
if (!servicePackage.provider) {
|
|
|
- servicePackage.setProvider({ ...props.provider });
|
|
|
+ servicePackage.setProvider({ ...providerInfo.value });
|
|
|
}
|
|
|
|
|
|
$q.notify({
|
|
|
@@ -612,7 +660,7 @@ const onDateSelected = (val) => {
|
|
|
|
|
|
$q.dialog({
|
|
|
component: ServicePackageSummaryDialog,
|
|
|
- componentProps: { initialBooking: booking, provider: props.provider },
|
|
|
+ componentProps: { initialBooking: booking, provider: providerInfo.value },
|
|
|
}).onOk(() => {
|
|
|
dialogRef.value.hide();
|
|
|
});
|
|
|
@@ -624,7 +672,7 @@ const openProviderInfo = () => {
|
|
|
$q.dialog({
|
|
|
component: ProfileInfoDialog,
|
|
|
componentProps: {
|
|
|
- provider: props.provider,
|
|
|
+ provider: providerInfo.value,
|
|
|
},
|
|
|
});
|
|
|
};
|
|
|
@@ -660,7 +708,7 @@ const toggleFavorite = async () => {
|
|
|
} else {
|
|
|
const created = await createClientFavoriteProvider({
|
|
|
client_id: clientId,
|
|
|
- provider_id: props.provider.provider_id,
|
|
|
+ provider_id: providerInfo.value.provider_id,
|
|
|
});
|
|
|
|
|
|
favoriteId.value = created?.id ?? null;
|
|
|
@@ -682,6 +730,7 @@ const toggleFavorite = async () => {
|
|
|
};
|
|
|
|
|
|
onMounted(() => {
|
|
|
+ loadProviderProfile();
|
|
|
loadAvailability();
|
|
|
loadFavoriteState();
|
|
|
loadReviews();
|