feat(map): پیوند آدرس پروژه از نشان به گوگل‌مپ — قالب رسمی Maps URLs با مختصات (?api=1&query=lat,lng)، بی‌نیاز از کلید API

This commit is contained in:
aramesh-site deploy
2026-10-09 17:41:07 +00:00
parent 00abef23df
commit f0f483a9d1
3 changed files with 12 additions and 13 deletions
+8 -9
View File
@@ -145,14 +145,13 @@ export function parseProjectsCsv(raw: string): MapProject[] {
export const MAP_PROJECTS: MapProject[] = parseProjectsCsv(RAW_CSV)
/** پیوند نشان روی نقشه برای سرویس نشان */
export function buildNeshanUrl(project: Pick<MapProject, 'lat' | 'lng'>, zoom = 17): string {
return `https://neshan.org/maps/@${project.lat},${project.lng},${zoom}z`
}
/** پیوند نقشه گوگل */
/**
* پیوند نقشهٔ گوگل روی مختصات پروژه — قالب رسمی Maps URLs با پارامتر query،
* بی‌نیاز از کلید API. یک سنجاق دقیق روی همان نقطه می‌نشاند و روی موبایل
* اپلیکیشن گوگل‌مپ را باز می‌کند.
*/
export function buildGoogleMapsUrl(project: Pick<MapProject, 'lat' | 'lng'>): string {
return `https://www.google.com/maps?q=${project.lat},${project.lng}`
return `https://www.google.com/maps/search/?api=1&query=${project.lat},${project.lng}`
}
const NAME_NOISE = ['آرامش', 'پروژه', 'مجتمع', 'گروه', 'ساختمانی', 'برج', 'مجموعه']
@@ -232,7 +231,7 @@ export function csvProjectToCard(project: MapProject, detailHref: string): Proje
title: project.name,
status: project.isNew ? 'progress' : 'done',
detailHref,
addressUrl: buildNeshanUrl(project),
addressUrl: buildGoogleMapsUrl(project),
}
}
@@ -247,6 +246,6 @@ export function apiProjectToCard(project: Project, detailHref: string): ProjectC
location: project.location || undefined,
image: project.image || undefined,
area: project.area || undefined,
addressUrl: matched ? buildNeshanUrl(matched) : undefined,
addressUrl: matched ? buildGoogleMapsUrl(matched) : undefined,
}
}
+2 -2
View File
@@ -6,7 +6,7 @@ import {
ISFAHAN_CENTER,
MAP_PROJECTS,
boundsForProjects,
buildNeshanUrl,
buildGoogleMapsUrl,
type MapProject,
} from '../data/mapProjects'
import { useLang } from '../i18n/lang'
@@ -80,7 +80,7 @@ export function ProjectsMapAll({
</Link>
{/* منطق دکمهٔ آدرس دست‌نخورده — فقط در ستون عمودی نشسته است */}
<a
href={buildNeshanUrl(activeProject)}
href={buildGoogleMapsUrl(activeProject)}
target="_blank"
rel="noopener noreferrer"
className={POPUP_SECONDARY_CLASS}
+2 -2
View File
@@ -1,7 +1,7 @@
import { useMemo } from 'react'
import { createPortal } from 'react-dom'
import { MdOpenInNew } from 'react-icons/md'
import { boundsForProjects, buildNeshanUrl, type MapProject } from '../data/mapProjects'
import { boundsForProjects, buildGoogleMapsUrl, type MapProject } from '../data/mapProjects'
import { useLang } from '../i18n/lang'
import { MapViewport } from './MapViewport'
import { POPUP_PRIMARY_CLASS, ProjectPopupCard } from './ProjectPopupCard'
@@ -48,7 +48,7 @@ export function ProjectsMapSingle({ location, images = [], className = '' }: Pro
<ProjectPopupCard project={activeProject} images={images} hideImageWhenEmpty onClose={closePopup}>
{/* منطق دکمهٔ آدرس دست‌نخورده است — تنها اکشن این کارت */}
<a
href={buildNeshanUrl(activeProject)}
href={buildGoogleMapsUrl(activeProject)}
target="_blank"
rel="noopener noreferrer"
className={POPUP_PRIMARY_CLASS}