84 lines
2.1 KiB
TypeScript
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,
|
|
});
|
|
}
|