import {BoundingBox, Point} from './interfaces'; import {NativeModules} from 'react-native'; const {YamapSuggests} = NativeModules; export type YamapSuggest = { title: string; subtitle?: string; uri?: string; }; export type YamapCoords = { lon: number; lat: number; }; export type YamapSuggestWithCoords = YamapSuggest & Partial; export enum SuggestTypes { YMKSuggestTypeUnspecified = 0b00, /** * Toponyms. */ YMKSuggestTypeGeo = 0b01, /** * Companies. */ YMKSuggestTypeBiz = 0b01 << 1, /** * Mass transit routes. */ YMKSuggestTypeTransit = 0b01 << 2, } export type SuggestOptions = { userPosition?: Point; boundingBox?: BoundingBox; suggestWords?: boolean; suggestTypes?: SuggestTypes[]; }; type SuggestFetcher = ( query: string, options?: SuggestOptions, ) => Promise>; const suggest: SuggestFetcher = (query, options) => { if (options) { return YamapSuggests.suggestWithOptions(query, options); } return YamapSuggests.suggest(query); }; type SuggestWithCoordsFetcher = ( query: string, options?: SuggestOptions, ) => Promise>; const suggestWithCoords: SuggestWithCoordsFetcher = async (query, options) => { const suggests = await suggest(query, options); return suggests.map(item => ({ ...item, ...getCoordsFromSuggest(item), })); }; type SuggestResetter = () => Promise; const reset: SuggestResetter = () => YamapSuggests.reset(); type LatLonGetter = (suggest: YamapSuggest) => YamapCoords | undefined; const getCoordsFromSuggest: LatLonGetter = suggest => { const coords = suggest.uri ?.split('?')[1] ?.split('&') ?.find(param => param.startsWith('ll')) ?.split('=')[1]; if (!coords) return; const splittedCoords = coords.split('%2C'); const lon = Number(splittedCoords[0]); const lat = Number(splittedCoords[1]); return {lat, lon}; }; const Suggest = { suggest, suggestWithCoords, reset, getCoordsFromSuggest, }; export default Suggest;