feat(map): پیوند آدرس پروژه از نشان به گوگلمپ — قالب رسمی Maps URLs با مختصات (?api=1&query=lat,lng)، بینیاز از کلید API
This commit is contained in:
@@ -145,14 +145,13 @@ export function parseProjectsCsv(raw: string): MapProject[] {
|
|||||||
|
|
||||||
export const MAP_PROJECTS: MapProject[] = parseProjectsCsv(RAW_CSV)
|
export const MAP_PROJECTS: MapProject[] = parseProjectsCsv(RAW_CSV)
|
||||||
|
|
||||||
/** پیوند نشان روی نقشه برای سرویس نشان */
|
/**
|
||||||
export function buildNeshanUrl(project: Pick<MapProject, 'lat' | 'lng'>, zoom = 17): string {
|
* پیوند نقشهٔ گوگل روی مختصات پروژه — قالب رسمی Maps URLs با پارامتر query،
|
||||||
return `https://neshan.org/maps/@${project.lat},${project.lng},${zoom}z`
|
* بینیاز از کلید API. یک سنجاق دقیق روی همان نقطه مینشاند و روی موبایل
|
||||||
}
|
* اپلیکیشن گوگلمپ را باز میکند.
|
||||||
|
*/
|
||||||
/** پیوند نقشه گوگل */
|
|
||||||
export function buildGoogleMapsUrl(project: Pick<MapProject, 'lat' | 'lng'>): string {
|
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 = ['آرامش', 'پروژه', 'مجتمع', 'گروه', 'ساختمانی', 'برج', 'مجموعه']
|
const NAME_NOISE = ['آرامش', 'پروژه', 'مجتمع', 'گروه', 'ساختمانی', 'برج', 'مجموعه']
|
||||||
@@ -232,7 +231,7 @@ export function csvProjectToCard(project: MapProject, detailHref: string): Proje
|
|||||||
title: project.name,
|
title: project.name,
|
||||||
status: project.isNew ? 'progress' : 'done',
|
status: project.isNew ? 'progress' : 'done',
|
||||||
detailHref,
|
detailHref,
|
||||||
addressUrl: buildNeshanUrl(project),
|
addressUrl: buildGoogleMapsUrl(project),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,6 +246,6 @@ export function apiProjectToCard(project: Project, detailHref: string): ProjectC
|
|||||||
location: project.location || undefined,
|
location: project.location || undefined,
|
||||||
image: project.image || undefined,
|
image: project.image || undefined,
|
||||||
area: project.area || undefined,
|
area: project.area || undefined,
|
||||||
addressUrl: matched ? buildNeshanUrl(matched) : undefined,
|
addressUrl: matched ? buildGoogleMapsUrl(matched) : undefined,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
ISFAHAN_CENTER,
|
ISFAHAN_CENTER,
|
||||||
MAP_PROJECTS,
|
MAP_PROJECTS,
|
||||||
boundsForProjects,
|
boundsForProjects,
|
||||||
buildNeshanUrl,
|
buildGoogleMapsUrl,
|
||||||
type MapProject,
|
type MapProject,
|
||||||
} from '../data/mapProjects'
|
} from '../data/mapProjects'
|
||||||
import { useLang } from '../i18n/lang'
|
import { useLang } from '../i18n/lang'
|
||||||
@@ -80,7 +80,7 @@ export function ProjectsMapAll({
|
|||||||
</Link>
|
</Link>
|
||||||
{/* منطق دکمهٔ آدرس دستنخورده — فقط در ستون عمودی نشسته است */}
|
{/* منطق دکمهٔ آدرس دستنخورده — فقط در ستون عمودی نشسته است */}
|
||||||
<a
|
<a
|
||||||
href={buildNeshanUrl(activeProject)}
|
href={buildGoogleMapsUrl(activeProject)}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className={POPUP_SECONDARY_CLASS}
|
className={POPUP_SECONDARY_CLASS}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { createPortal } from 'react-dom'
|
import { createPortal } from 'react-dom'
|
||||||
import { MdOpenInNew } from 'react-icons/md'
|
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 { useLang } from '../i18n/lang'
|
||||||
import { MapViewport } from './MapViewport'
|
import { MapViewport } from './MapViewport'
|
||||||
import { POPUP_PRIMARY_CLASS, ProjectPopupCard } from './ProjectPopupCard'
|
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}>
|
<ProjectPopupCard project={activeProject} images={images} hideImageWhenEmpty onClose={closePopup}>
|
||||||
{/* منطق دکمهٔ آدرس دستنخورده است — تنها اکشن این کارت */}
|
{/* منطق دکمهٔ آدرس دستنخورده است — تنها اکشن این کارت */}
|
||||||
<a
|
<a
|
||||||
href={buildNeshanUrl(activeProject)}
|
href={buildGoogleMapsUrl(activeProject)}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className={POPUP_PRIMARY_CLASS}
|
className={POPUP_PRIMARY_CLASS}
|
||||||
|
|||||||
Reference in New Issue
Block a user