103 lines
2.8 KiB
TypeScript
103 lines
2.8 KiB
TypeScript
import ngeohash from "ngeohash";
|
|
|
|
import { IAddress, Address } from "@/types/address.model";
|
|
import { LocationType } from "@/types/user-location.model";
|
|
import { IUserPreferredLocation } from "@/types/current-user.model";
|
|
|
|
const GEOHASH_DEPTH = 9; // put enough accuracy, radius will be used anyway
|
|
|
|
export const addressToLocation = (
|
|
address: IAddress
|
|
): LocationType | undefined => {
|
|
if (!address.geom) return undefined;
|
|
const arr = address.geom.split(";");
|
|
if (arr.length < 2) return undefined;
|
|
return {
|
|
lon: parseFloat(arr[0]),
|
|
lat: parseFloat(arr[1]),
|
|
name: address.description,
|
|
};
|
|
};
|
|
|
|
export const coordsToGeoHash = (
|
|
lat: number | undefined,
|
|
lon: number | undefined,
|
|
depth = GEOHASH_DEPTH
|
|
): string | undefined => {
|
|
if (lat && lon && depth) {
|
|
return ngeohash.encode(lat, lon, GEOHASH_DEPTH);
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
export const geoHashToCoords = (
|
|
geohash: string | undefined | null
|
|
): { latitude: number; longitude: number } | undefined => {
|
|
if (!geohash) return undefined;
|
|
const { latitude, longitude } = ngeohash.decode(geohash);
|
|
return latitude && longitude ? { latitude, longitude } : undefined;
|
|
};
|
|
|
|
export const storeLocationInLocal = (location: IAddress | null): undefined => {
|
|
if (location) {
|
|
window.localStorage.setItem("location", JSON.stringify(location));
|
|
} else {
|
|
window.localStorage.removeItem("location");
|
|
}
|
|
};
|
|
|
|
export const getLocationFromLocal = (): IAddress | null => {
|
|
const locationString = window.localStorage.getItem("location");
|
|
if (!locationString) {
|
|
return null;
|
|
}
|
|
const location = JSON.parse(locationString) as IAddress;
|
|
if (!location.description || !location.geom) {
|
|
return null;
|
|
}
|
|
return location;
|
|
};
|
|
|
|
export const storeRadiusInLocal = (radius: number | null): undefined => {
|
|
if (radius) {
|
|
window.localStorage.setItem("radius", radius.toString());
|
|
} else {
|
|
window.localStorage.removeItem("radius");
|
|
}
|
|
};
|
|
|
|
export const getRadiusFromLocal = (): IAddress | null => {
|
|
const locationString = window.localStorage.getItem("location");
|
|
if (!locationString) {
|
|
return null;
|
|
}
|
|
const location = JSON.parse(locationString) as IAddress;
|
|
if (!location.description || !location.geom) {
|
|
return null;
|
|
}
|
|
return location;
|
|
};
|
|
|
|
export const storeUserLocationAndRadiusFromUserSettings = (
|
|
location: IUserPreferredLocation | null
|
|
): undefined => {
|
|
if (location) {
|
|
const latlon = geoHashToCoords(location.geohash);
|
|
if (latlon) {
|
|
storeLocationInLocal({
|
|
...new Address(),
|
|
geom: `${latlon.longitude};${latlon.latitude}`,
|
|
description: location.name || "",
|
|
type: "administrative",
|
|
});
|
|
}
|
|
if (location.range) {
|
|
storeRadiusInLocal(location.range);
|
|
} else {
|
|
console.debug("user has not set a radius");
|
|
}
|
|
} else {
|
|
console.debug("user has not set a location");
|
|
}
|
|
};
|