1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2024-11-24 05:54:18 +00:00
pds-2021-g2-nest/nest_frontend/objects/Condition.js

162 lines
3.5 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) {
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(),
}
}
}