mirror of
https://github.com/pds-nest/nest.git
synced 2024-11-25 06:24:19 +00:00
164 lines
3.6 KiB
JavaScript
164 lines
3.6 KiB
JavaScript
import {
|
|
faAt,
|
|
faClock,
|
|
faHashtag,
|
|
faLocationArrow,
|
|
faQuestionCircle,
|
|
IconDefinition,
|
|
} from "@fortawesome/free-solid-svg-icons"
|
|
import TimeRay from "./TimeRay"
|
|
import MapArea from "./MapArea"
|
|
|
|
|
|
/**
|
|
* Condition class for an undefined/unknown condition.
|
|
*
|
|
* See [the Condition spec](https://gitlab.steffo.eu/nest/g2-progetto/-/wikis/sprint-2/Specifica-delle-Conditions).
|
|
*/
|
|
export class Condition {
|
|
content
|
|
type
|
|
id
|
|
|
|
constructor(type, content, id = null) {
|
|
this.content = content
|
|
this.type = type
|
|
this.id = id
|
|
}
|
|
|
|
static fromRaw(data) {
|
|
console.debug("Trying to serialize condition: ", data)
|
|
|
|
if(data.type === 0) return ConditionHashtag.fromRaw(data)
|
|
else if(data.type === 2) return ConditionTime.fromRaw(data)
|
|
else if(data.type === 3) return ConditionLocation.fromRaw(data)
|
|
else if(data.type === 5) return ConditionUser.fromRaw(data)
|
|
else return new Condition(data.type, data.content, data.id)
|
|
}
|
|
|
|
/**
|
|
* Get the condition as an object readable by the backend.
|
|
*
|
|
* @returns {{id, type, content}}
|
|
*/
|
|
serialize() {
|
|
return {
|
|
type: this.type,
|
|
content: this.content,
|
|
id: this.id,
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display parameters for the badge representing this condition.
|
|
*
|
|
* @returns {{color: string, icon: IconDefinition, title, content}}
|
|
*/
|
|
display() {
|
|
return {
|
|
color: "Grey",
|
|
icon: faQuestionCircle,
|
|
title: this.id,
|
|
children: this.content,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Require a tweet to contain a specific hashtag to be gathered.
|
|
*/
|
|
export class ConditionHashtag extends Condition {
|
|
constructor(hashtag, id = null) {
|
|
super(0, hashtag, id)
|
|
}
|
|
|
|
static fromRaw(data) {
|
|
return new ConditionHashtag(data.content, data.id)
|
|
}
|
|
|
|
display() {
|
|
return {
|
|
color: "Grey",
|
|
icon: faHashtag,
|
|
title: this.id,
|
|
children: this.content,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Require a tweet to be posted by a certain user to be gathered.
|
|
*/
|
|
export class ConditionUser extends Condition {
|
|
constructor(user, id = null) {
|
|
super(5, user, id)
|
|
}
|
|
|
|
static fromRaw(data) {
|
|
return new ConditionUser(data.content, data.id)
|
|
}
|
|
|
|
display() {
|
|
return {
|
|
color: "Green",
|
|
icon: faAt,
|
|
title: this.id,
|
|
children: this.content,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Require a tweet to be posted before or after a certain time to be gathered.
|
|
*/
|
|
export class ConditionTime extends Condition {
|
|
timeRay
|
|
|
|
constructor(timeRay, id = null) {
|
|
super(2, timeRay.toString(), id)
|
|
this.timeRay = timeRay
|
|
}
|
|
|
|
static fromRaw(data) {
|
|
return new ConditionTime(TimeRay.fromRaw(data.content), data.id)
|
|
}
|
|
|
|
display() {
|
|
return {
|
|
color: "Yellow",
|
|
icon: faClock,
|
|
title: this.id,
|
|
children: this.content,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Require a tweet to have coordinates associated and to be posted within the {@link MapArea}.
|
|
*/
|
|
export class ConditionLocation extends Condition {
|
|
mapArea
|
|
|
|
constructor(mapArea, id = null) {
|
|
super(3, mapArea.toString(), id)
|
|
this.mapArea = mapArea
|
|
}
|
|
|
|
static fromRaw(data) {
|
|
return new ConditionLocation(MapArea.fromRaw(data.content), data.id)
|
|
}
|
|
|
|
display() {
|
|
return {
|
|
color: "Red",
|
|
icon: faLocationArrow,
|
|
title: this.id,
|
|
children: this.mapArea.toHumanString(),
|
|
}
|
|
}
|
|
}
|
|
|