Initial commit: dashboard
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import { apiRequest } from "@/lib/meshkee-api";
|
||||
|
||||
export type MeshkeeCityLevel = "country" | "province" | "city";
|
||||
|
||||
export interface MeshkeeCity {
|
||||
id: string;
|
||||
parentId: string | null;
|
||||
level: MeshkeeCityLevel;
|
||||
nameFa: string;
|
||||
nameEn: string;
|
||||
landlineCode: string | null;
|
||||
slug: string;
|
||||
sortOrder: number;
|
||||
}
|
||||
|
||||
export function cityLabel(city: Pick<MeshkeeCity, "nameEn" | "nameFa">) {
|
||||
if (city.nameFa && city.nameFa !== city.nameEn) {
|
||||
return `${city.nameEn} / ${city.nameFa}`;
|
||||
}
|
||||
return city.nameEn;
|
||||
}
|
||||
|
||||
export function matchCityName(
|
||||
cities: MeshkeeCity[],
|
||||
name: string,
|
||||
): MeshkeeCity | undefined {
|
||||
const needle = name.trim().toLowerCase();
|
||||
if (!needle) return undefined;
|
||||
return cities.find(
|
||||
(city) =>
|
||||
city.nameEn.toLowerCase() === needle ||
|
||||
city.nameFa.toLowerCase() === needle ||
|
||||
city.slug.toLowerCase() === needle,
|
||||
);
|
||||
}
|
||||
|
||||
export async function listMeshkeeCities(params: {
|
||||
level?: MeshkeeCityLevel;
|
||||
parentId?: string;
|
||||
parentSlug?: string;
|
||||
signal?: AbortSignal;
|
||||
}) {
|
||||
const query = new URLSearchParams();
|
||||
if (params.level) query.set("level", params.level);
|
||||
if (params.parentId) query.set("parentId", params.parentId);
|
||||
if (params.parentSlug) query.set("parentSlug", params.parentSlug);
|
||||
|
||||
const data = await apiRequest<{ items: Record<string, unknown>[] }>(
|
||||
`/cities?${query}`,
|
||||
{ signal: params.signal },
|
||||
);
|
||||
|
||||
return (data.items ?? []).map((row) => ({
|
||||
id: String(row.id),
|
||||
parentId: row.parentId == null ? null : String(row.parentId),
|
||||
level: String(row.level ?? "city") as MeshkeeCityLevel,
|
||||
nameFa: String(row.nameFa ?? ""),
|
||||
nameEn: String(row.nameEn ?? ""),
|
||||
landlineCode:
|
||||
row.landlineCode == null ? null : String(row.landlineCode),
|
||||
slug: String(row.slug ?? ""),
|
||||
sortOrder: Number(row.sortOrder ?? 0),
|
||||
})) satisfies MeshkeeCity[];
|
||||
}
|
||||
|
||||
export async function listIranProvinces(signal?: AbortSignal) {
|
||||
return listMeshkeeCities({
|
||||
level: "province",
|
||||
parentSlug: "iran",
|
||||
signal,
|
||||
});
|
||||
}
|
||||
|
||||
export async function listCitiesInProvince(
|
||||
provinceId: string,
|
||||
signal?: AbortSignal,
|
||||
) {
|
||||
return listMeshkeeCities({
|
||||
level: "city",
|
||||
parentId: provinceId,
|
||||
signal,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user