From 833b7589d28ef27fb38be3690e0d5e9405ef67de Mon Sep 17 00:00:00 2001 From: Mahdi Date: Mon, 25 May 2026 20:22:51 +0330 Subject: [PATCH] add & edit time rezerv --- src/api/availability.ts | 16 +++++++++++++++- src/api/client.ts | 16 +++++++++++++--- .../owner/BusinessAvailabilityEditor.vue | 7 ++++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/api/availability.ts b/src/api/availability.ts index 89f15d2..42980eb 100644 --- a/src/api/availability.ts +++ b/src/api/availability.ts @@ -1,4 +1,5 @@ import { api } from './client'; +import { normalizeHmTime } from '@/utils/format'; export type AvailabilitySlot = { id?: string; @@ -15,8 +16,21 @@ export function setBusinessAvailability( businessId: string, slots: Omit[], ) { + const normalized = slots.map((slot) => { + const startTime = normalizeHmTime(String(slot.startTime ?? '')); + const endTime = normalizeHmTime(String(slot.endTime ?? '')); + if (!startTime || !endTime) { + throw new Error('فرمت ساعت نامعتبر است. از انتخابگر ساعت استفاده کنید.'); + } + return { + dayOfWeek: Number(slot.dayOfWeek), + startTime, + endTime, + }; + }); + return api(`/businesses/${businessId}/availability`, { method: 'PUT', - body: JSON.stringify({ slots }), + body: JSON.stringify({ slots: normalized }), }); } diff --git a/src/api/client.ts b/src/api/client.ts index ab98daf..64ad0fb 100644 --- a/src/api/client.ts +++ b/src/api/client.ts @@ -40,9 +40,19 @@ export async function api(path: string, options: ApiOptions = {}): Promise const body = (await res.json().catch(() => null)) as | { message?: string | string[] } | null; - const msg = Array.isArray(body?.message) - ? body.message.join(', ') - : body?.message ?? res.statusText; + let msg: string; + if (Array.isArray(body?.message)) { + const lines = body.message.map(String); + const timeErrors = lines.filter((l) => + /startTime|endTime/.test(l) && /regular expression|HH:mm/i.test(l), + ); + msg = + timeErrors.length > 0 + ? 'فرمت ساعت نامعتبر است. لطفاً دوباره بازه را اضافه و ذخیره کنید.' + : lines.join(' · '); + } else { + msg = body?.message ?? res.statusText; + } throw new ApiError(res.status, msg); } diff --git a/src/components/owner/BusinessAvailabilityEditor.vue b/src/components/owner/BusinessAvailabilityEditor.vue index 8e33437..31051e6 100644 --- a/src/components/owner/BusinessAvailabilityEditor.vue +++ b/src/components/owner/BusinessAvailabilityEditor.vue @@ -421,7 +421,12 @@ async function onSave() { message.value = 'ساعات پذیرش ذخیره شد.'; await load(); } catch (e) { - error.value = e instanceof ApiError ? e.message : 'خطا در ذخیره'; + error.value = + e instanceof ApiError + ? e.message + : e instanceof Error + ? e.message + : 'خطا در ذخیره'; } finally { saving.value = false; }