import { Deserializable } from "../client/util/SerializationHelper"; import { serializable, custom } from "serializr"; import { ObjectField } from "./ObjectField"; import { ToScriptString, ToString, Copy } from "./FieldSymbols"; import { Scripting, scriptingGlobal } from "../client/util/Scripting"; import { Utils } from "../Utils"; function url() { return custom( function (value: URL) { return value.origin === window.location.origin ? value.pathname : value.href; }, function (jsonValue: string) { return new URL(jsonValue, window.location.origin); } ); } export abstract class URLField extends ObjectField { @serializable(url()) readonly url: URL; constructor(url: string); constructor(url: URL); constructor(url: URL | string) { super(); if (typeof url === "string") { url = url.startsWith("http") ? new URL(url) : new URL(url, window.location.origin); } this.url = url; } [ToScriptString]() { if (Utils.prepend(this.url.pathname) === this.url.href) { return `new ${this.constructor.name}("${this.url.pathname}")`; } return `new ${this.constructor.name}("${this.url.href}")`; } [ToString]() { if (Utils.prepend(this.url.pathname) === this.url.href) { return this.url.pathname; } return this.url.href; } [Copy](): this { return new (this.constructor as any)(this.url); } } export const nullAudio = "https://actions.google.com/sounds/v1/alarms/beep_short.ogg"; @scriptingGlobal @Deserializable("audio") export class AudioField extends URLField { } @scriptingGlobal @Deserializable("image") export class ImageField extends URLField { } @scriptingGlobal @Deserializable("video") export class VideoField extends URLField { } @scriptingGlobal @Deserializable("pdf") export class PdfField extends URLField { } @scriptingGlobal @Deserializable("web") export class WebField extends URLField { } @scriptingGlobal @Deserializable("map") export class MapField extends URLField { } @scriptingGlobal @Deserializable("youtube") export class YoutubeField extends URLField { } @scriptingGlobal @Deserializable("webcam") export class WebCamField extends URLField { }