/
Api.ts
45 lines (38 loc) · 1.52 KB
/
Api.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { boundsToMapTileKeys } from '../Geo';
import { Bounds } from '../Geo/Bounds';
import { PlacesListFilter } from '../Places/ListFilter';
import { ApiResponse, get as xhrGet} from '../Xhr';
export function getPlaces(filter: PlacesListFilter): Promise<ApiResponse> {
if (filter.mapSpread) {
return getPlacesWitMapSpread(filter);
}
return xhrGet('places/list?' + filter.toQueryString());
}
const getPlacesWitMapSpread = async (filter: PlacesListFilter): Promise<ApiResponse> => {
const mapTiles: string[] = boundsToMapTileKeys(filter.bounds as Bounds, filter.zoom as number);
const apiResults: Promise<ApiResponse>[] = [];
for (const mapTile of mapTiles) {
let apiFilter = filter.cloneSetBounds(null);
apiFilter = apiFilter.cloneSetLimit(32);
apiFilter = apiFilter.cloneSetMapTiles([mapTile]);
const promise = new Promise(async (success) => {
try {
success(await xhrGet('places/list?' + apiFilter.toQueryString()));
} catch (error) {
success(new ApiResponse( 200, {places: []}));
}
});
apiResults.push(promise);
}
const responses = await Promise.all(apiResults);
const finalResponse: ApiResponse = responses.reduce((result: ApiResponse, response: ApiResponse): ApiResponse => {
result.statusCode = response.statusCode;
result.data.places = result.data.places.concat(response.data.places);
return result;
}, new ApiResponse(200, {places: []}));
finalResponse.data.places = finalResponse.data.places.sort((a, b) => {
if (a.rating > b.rating) { return -1; }
return 1;
});
return finalResponse;
};