ente/src/services/searchService.ts

106 lines
2.9 KiB
TypeScript
Raw Normal View History

2021-05-20 07:50:20 +00:00
import HTTPService from './HTTPService';
2021-05-20 08:19:37 +00:00
import * as chrono from 'chrono-node';
import { getEndpoint } from 'utils/common/apiUtil';
2021-05-26 11:49:28 +00:00
import { getToken } from 'utils/common/key';
2021-05-28 16:25:19 +00:00
import { DateValue, Suggestion, SuggestionType } from 'components/SearchBar';
const ENDPOINT = getEndpoint();
2021-05-28 17:27:08 +00:00
const DIGITS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);
export type Bbox = [number, number, number, number];
export interface LocationSearchResponse {
place: string;
bbox: Bbox;
}
2021-05-20 07:50:20 +00:00
export const getMapboxToken = () => {
return process.env.NEXT_PUBLIC_MAPBOX_TOKEN;
};
2021-05-28 16:25:19 +00:00
export function parseHumanDate(humanDate: string): DateValue[] {
const date = chrono.parseDate(humanDate);
2021-05-28 17:02:16 +00:00
const date1 = chrono.parseDate(humanDate + ' 1');
2021-05-28 16:25:19 +00:00
if (date != null) {
2021-05-28 17:27:08 +00:00
const dates = [
2021-05-28 16:25:19 +00:00
{ month: date.getMonth() },
2021-05-28 17:27:08 +00:00
{ date: date.getDate(), month: date.getMonth() },
2021-05-28 16:25:19 +00:00
];
2021-05-28 17:27:08 +00:00
let reverse = false;
humanDate.split('').forEach((c) => {
if (DIGITS.has(c)) {
reverse = true;
}
});
if (reverse) {
return dates.reverse();
} else {
return dates;
}
2021-05-28 17:02:16 +00:00
} else if (date1) {
return [{ month: date1.getMonth() }];
2021-05-28 16:25:19 +00:00
} else {
return [];
}
2021-05-20 08:19:37 +00:00
}
2021-05-20 07:50:20 +00:00
export async function searchLocation(
searchPhrase: string
): Promise<LocationSearchResponse[]> {
2021-05-26 11:49:28 +00:00
const resp = await HTTPService.get(
`${ENDPOINT}/search/location`,
{
query: searchPhrase,
limit: 4,
},
{
'X-Auth-Token': getToken(),
}
);
return resp.data.results;
2021-05-20 07:50:20 +00:00
}
2021-05-28 16:25:19 +00:00
export function getHolidaySuggestion(searchPhrase: string): Suggestion[] {
return [
{
label: 'Christmas',
value: { month: 11, date: 25 },
type: SuggestionType.DATE,
},
{
label: 'Christmas Eve',
value: { month: 11, date: 24 },
type: SuggestionType.DATE,
},
{
label: 'New Year',
value: { month: 0, date: 1 },
type: SuggestionType.DATE,
},
{
label: 'New Year Eve',
value: { month: 11, date: 31 },
type: SuggestionType.DATE,
},
].filter((suggestion) =>
suggestion.label.toLowerCase().includes(searchPhrase.toLowerCase())
);
}
export function getYearSuggestion(searchPhrase: string): Suggestion[] {
if (searchPhrase.length == 4) {
try {
const year = parseInt(searchPhrase);
if (year >= 1970 && year <= new Date().getFullYear()) {
return [
{
label: searchPhrase,
value: { year },
type: SuggestionType.DATE,
},
];
}
} catch (e) {
//ignore
}
}
return [];
}