Files

84 lines
2.1 KiB
TypeScript

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,
});
}