import { custom, serializable } from 'serializr'; import { ClientUtils } from '../ClientUtils'; import { scriptingGlobal } from '../client/util/ScriptingGlobals'; import { Deserializable } from '../client/util/SerializationHelper'; import { Copy, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols'; import { ObjectField } from './ObjectField'; function url() { return custom( (value: URL) => (value?.origin === window.location.origin ? value.pathname : value?.href), (jsonValue: string) => new URL(jsonValue, window.location.origin) ); } export abstract class URLField extends ObjectField { @serializable(url()) readonly url: URL; constructor(urlVal: string); constructor(urlVal: URL); constructor(urlVal: URL | string) { super(); this.url = typeof urlVal !== 'string' ? urlVal // it's an URL : urlVal.startsWith('http') ? new URL(urlVal) : new URL(urlVal, window.location.origin); } [ToScriptString]() { if (ClientUtils.prepend(this.url?.pathname) === this.url?.href) { return `new ${this.constructor.name}("${this.url.pathname}")`; } return `new ${this.constructor.name}("${this.url?.href}")`; } [ToJavascriptString]() { if (ClientUtils.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 (ClientUtils.prepend(this.url?.pathname) === this.url?.href) { return this.url.pathname; } return this.url?.href; } [Copy](): this { // eslint-disable-next-line @typescript-eslint/no-explicit-any 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('csv') export class CsvField extends URLField {} @scriptingGlobal @Deserializable('youtube') export class YoutubeField extends URLField {}