This commit is contained in:
@@ -38,6 +38,7 @@ import {
|
||||
toMuseumFloorFromSgs,
|
||||
toMuseumHallPoisFromSgs,
|
||||
toMuseumPoiFromSgs,
|
||||
toMuseumSpacePointFromSgs,
|
||||
toRouteReadinessFromSgsDiagnostics
|
||||
} from '@/data/adapters/sgsSdkGuideAdapter'
|
||||
|
||||
@@ -130,6 +131,7 @@ export interface GuideRepository {
|
||||
getFloors(): Promise<MuseumFloor[]>
|
||||
normalizeFloorId(labelOrId: string): string
|
||||
listPois(): Promise<MuseumPoi[]>
|
||||
listSpacePoints(): Promise<MuseumPoi[]>
|
||||
getPoiById(id: string): Promise<MuseumPoi | null>
|
||||
searchPois(keyword?: string): Promise<MuseumPoi[]>
|
||||
getLocationPreview(poiId: string): Promise<GuideLocationPreview | null>
|
||||
@@ -175,6 +177,10 @@ export class StaticGuideRepository implements GuideRepository {
|
||||
return this.poiCache
|
||||
}
|
||||
|
||||
async listSpacePoints() {
|
||||
return []
|
||||
}
|
||||
|
||||
async getPoiById(id: string) {
|
||||
const pois = await this.listPois()
|
||||
return pois.find((poi) => poi.id === id) || findPoiByNavIdNameFallback(pois, id)
|
||||
@@ -254,6 +260,7 @@ export class StaticGuideRepository implements GuideRepository {
|
||||
export class SgsSdkGuideRepository implements GuideRepository {
|
||||
private floorsCache: MuseumFloor[] | null = null
|
||||
private poiCache: MuseumPoi[] | null = null
|
||||
private spacePointCache: MuseumPoi[] | null = null
|
||||
private floorAliases: Map<string, string> | null = null
|
||||
|
||||
constructor(private readonly provider: SgsSdkApiProvider = defaultSgsSdkApiProvider) {}
|
||||
@@ -326,10 +333,45 @@ export class SgsSdkGuideRepository implements GuideRepository {
|
||||
return this.poiCache
|
||||
}
|
||||
|
||||
async listSpacePoints() {
|
||||
if (this.spacePointCache) return this.spacePointCache
|
||||
|
||||
const manifest = await this.provider.getManifest()
|
||||
const indoorFloors = manifest.floors.filter(isIndoorNavigableFloor)
|
||||
const indoorFloorIds = new Set(indoorFloors.map((floor) => String(floor.floorId)))
|
||||
this.floorAliases = buildSgsFloorAliases(indoorFloors)
|
||||
|
||||
const floorDataGroups = await Promise.all(
|
||||
indoorFloors.map(async (floor) => {
|
||||
const floorId = String(floor.floorId)
|
||||
const spaces = await this.provider.getFloorSpaces(floorId).catch(() => [])
|
||||
|
||||
return {
|
||||
floorId,
|
||||
spaces
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
const spacePoints = floorDataGroups
|
||||
.flatMap((group) => group.spaces.map((space) => toMuseumSpacePointFromSgs(space, manifest.floors, group.floorId)))
|
||||
.filter((poi): poi is MuseumPoi => Boolean(poi))
|
||||
.filter((poi) => indoorFloorIds.has(String(poi.floorId)) || isPoiOnIndoorNavigableFloor(poi))
|
||||
|
||||
this.spacePointCache = dedupePoisById(spacePoints)
|
||||
|
||||
return this.spacePointCache
|
||||
}
|
||||
|
||||
async getPoiById(id: string) {
|
||||
const pois = await this.listPois()
|
||||
return pois.find((poi) => poi.id === id)
|
||||
const matchedPoi = pois.find((poi) => poi.id === id)
|
||||
|| findPoiByNavIdNameFallback(pois, id)
|
||||
|
||||
if (matchedPoi) return matchedPoi
|
||||
|
||||
const spacePoints = await this.listSpacePoints()
|
||||
return spacePoints.find((poi) => poi.id === id || poi.spaceId === id || poi.sourceSpaceId === id)
|
||||
|| null
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user