import type { DebridProvider, RendererSettingsUpdate } from "../shared/types"; export type AccountToggleTarget = | { kind: "provider"; provider: DebridProvider } | { kind: "debridlink"; accountId: string } | { kind: "mega-api"; accountId: string } | { kind: "mega-web"; accountId: string }; export interface AccountToggleSettings { disabledProviders: DebridProvider[]; debridLinkDisabledKeyIds: string[]; megaDebridDisabledAccountIds: string[]; megaDebridApiDisabledAccountIds: string[]; megaDebridWebDisabledAccountIds: string[]; } function setListEntry(values: T[], value: T, present: boolean): T[] { return present ? [...new Set([...values, value])] : values.filter((entry) => entry !== value); } export function setAccountTargetEnabled( settings: T, target: AccountToggleTarget, enabled: boolean ): T { if (target.kind === "provider") { return { ...settings, disabledProviders: setListEntry(settings.disabledProviders, target.provider, !enabled) }; } if (target.kind === "debridlink") { return { ...settings, debridLinkDisabledKeyIds: setListEntry(settings.debridLinkDisabledKeyIds, target.accountId, !enabled) }; } const apiDisabled = target.kind === "mega-api" ? setListEntry(settings.megaDebridApiDisabledAccountIds, target.accountId, !enabled) : settings.megaDebridApiDisabledAccountIds; const webDisabled = target.kind === "mega-web" ? setListEntry(settings.megaDebridWebDisabledAccountIds, target.accountId, !enabled) : settings.megaDebridWebDisabledAccountIds; return { ...settings, megaDebridApiDisabledAccountIds: apiDisabled, megaDebridWebDisabledAccountIds: webDisabled, megaDebridDisabledAccountIds: [...new Set([...apiDisabled, ...webDisabled])] }; } export function buildAccountToggleSettingsUpdate(settings: AccountToggleSettings): RendererSettingsUpdate { return { disabledProviders: settings.disabledProviders, debridLinkDisabledKeyIds: settings.debridLinkDisabledKeyIds, megaDebridDisabledAccountIds: settings.megaDebridDisabledAccountIds, megaDebridApiDisabledAccountIds: settings.megaDebridApiDisabledAccountIds, megaDebridWebDisabledAccountIds: settings.megaDebridWebDisabledAccountIds }; } export class SerialTaskQueue { private tail: Promise = Promise.resolve(); public enqueue(task: () => Promise): Promise { const result = this.tail.then(task); this.tail = result.then(() => undefined, () => undefined); return result; } }