ui phase 5

This commit is contained in:
hamid
2026-07-18 09:51:03 +03:30
parent 53b4e1b0a4
commit 4c70d8e424
42 changed files with 2834 additions and 548 deletions
@@ -32,6 +32,8 @@ interface NurseSearchResultDto {
nurseName: string | null;
avatarUrl: string | null;
distanceKm: number | null;
/** REQ-040 (proposed) — not yet served; absent until the backend lands it. */
topReviewTag?: string | null;
}
/** The b6/b7 aggregated `NursePublicProfileDto` (REQ-012) — the C3 profile payload. */
@@ -106,6 +108,7 @@ export const searchClientApi: SearchApi = {
nurseGender: dto.nurseGender,
cityId: dto.cityId,
districtId: dto.districtId,
topReviewTag: dto.topReviewTag ?? null,
})),
};
},
+3 -1
View File
@@ -16,7 +16,9 @@ interface ParamReader {
const GENDERS: readonly NurseGender[] = ['male', 'female'];
function parsePositiveInt(raw: string | null): number | undefined {
/** Exported so callers that carry client-only params alongside the filter set (e.g. `province_id`,
* a UI-only cascading-select prefill hint not part of `NurseSearchFilters`) can reuse the same parse. */
export function parsePositiveInt(raw: string | null): number | undefined {
if (raw == null) return undefined;
const value = Number(raw);
return Number.isInteger(value) && value > 0 ? value : undefined;
+3
View File
@@ -74,6 +74,9 @@ export interface NurseSearchResult {
cityId: number;
/** `null` = the nurse covers the whole city. */
districtId: number | null;
/** One-line top review tag (e.g. «منظم و دقیق») — optional, not yet served (REQ-040); `null`/absent
* hides the card's review-tag line. */
topReviewTag?: string | null;
}
/** One offered variant on the C3 profile — the bookable unit; reused by the ServicePriceRow. */