[Front-end] Address model refactoring

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2022-04-21 11:43:24 +02:00
parent 0c49ddc65b
commit dc75a9beb3
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
1 changed files with 82 additions and 69 deletions

View File

@ -65,80 +65,93 @@ export class Address implements IAddress {
}
get poiInfos(): IPoiInfo {
/* generate name corresponding to poi type */
let name = "";
let alternativeName = "";
let poiIcon: IPOIIcon = poiIcons.default;
// Google Maps doesn't have a type
if (this.type == null && this.description === this.street) {
this.type = "house";
}
switch (this.type) {
case "house":
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAddress;
break;
case "street":
case "secondary":
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultStreet;
break;
case "zone":
case "city":
case "administrative":
name = this.postalCode
? `${this.description} (${this.postalCode})`
: this.description;
alternativeName = [this.region, this.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAdministrative;
break;
default:
// POI
name = this.description;
alternativeName = "";
if (this.street && this.street.trim()) {
alternativeName = `${this.street}`;
if (this.locality) {
alternativeName += ` (${this.locality})`;
}
} else if (this.locality && this.locality.trim()) {
alternativeName = `${this.locality}, ${this.region}, ${this.country}`;
} else if (this.region && this.region.trim()) {
alternativeName = `${this.region}, ${this.country}`;
} else if (this.country && this.country.trim()) {
alternativeName = this.country;
}
poiIcon = this.iconForPOI;
break;
}
return { name, alternativeName, poiIcon };
return addressToPoiInfos(this);
}
get fullName(): string {
const { name, alternativeName } = this.poiInfos;
if (name && alternativeName) {
return `${name}, ${alternativeName}`;
}
if (name) {
return name;
}
return "";
return addressFullName(this);
}
get iconForPOI(): IPOIIcon {
if (this.type == null) {
return poiIcons.default;
}
const type = this.type.split(":").pop() || "";
if (poiIcons[type]) return poiIcons[type];
return poiIcons.default;
return iconForAddress(this);
}
}
export function addressToPoiInfos(address: IAddress): IPoiInfo {
/* generate name corresponding to poi type */
let name = "";
let alternativeName = "";
let poiIcon: IPOIIcon = poiIcons.default;
let addressType = address.type;
// Google Maps doesn't have a type
if (address.type == null && address.description === address.street) {
addressType = "house";
}
switch (addressType) {
case "house":
name = address.description;
alternativeName = [address.postalCode, address.locality, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAddress;
break;
case "street":
case "secondary":
name = address.description;
alternativeName = [address.postalCode, address.locality, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultStreet;
break;
case "zone":
case "city":
case "administrative":
name = address.postalCode
? `${address.description} (${address.postalCode})`
: address.description;
alternativeName = [address.region, address.country]
.filter((zone) => zone)
.join(", ");
poiIcon = poiIcons.defaultAdministrative;
break;
default:
// POI
name = address.description;
alternativeName = "";
if (address.street && address.street.trim()) {
alternativeName = `${address.street}`;
if (address.locality) {
alternativeName += ` (${address.locality})`;
}
} else if (address.locality && address.locality.trim()) {
alternativeName = `${address.locality}, ${address.region}, ${address.country}`;
} else if (address.region && address.region.trim()) {
alternativeName = `${address.region}, ${address.country}`;
} else if (address.country && address.country.trim()) {
alternativeName = address.country;
}
poiIcon = iconForAddress(address);
break;
}
return { name, alternativeName, poiIcon };
}
export function iconForAddress(address: IAddress): IPOIIcon {
if (address.type == null) {
return poiIcons.default;
}
const type = address.type.split(":").pop() || "";
if (poiIcons[type]) return poiIcons[type];
return poiIcons.default;
}
export function addressFullName(address: IAddress): string {
const { name, alternativeName } = addressToPoiInfos(address);
if (name && alternativeName) {
return `${name}, ${alternativeName}`;
}
if (name) {
return name;
}
return "";
}