atagen

malice

public
Star0
Watch0
80e694c759dd0392548dd29b17590ae2decac8bc
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/pack-preferences.ts

132eeceeb362atagen2026-10-25 03:34 UTC1
import { get, writable } from 'svelte/store';
132eeceeb362atagen2026-10-25 03:34 UTC2
import { getAccountData, setAccountData } from './api';
132eeceeb362atagen2026-10-25 03:34 UTC3
import { parseDisabledPackImages, withImageEnabled } from './pack-preferences-model';
132eeceeb362atagen2026-10-25 03:34 UTC4
import type { DisabledPackImages } from './pack-preferences-model';
132eeceeb362atagen2026-10-25 03:34 UTC5
132eeceeb362atagen2026-10-25 03:34 UTC6
const EVENT_TYPE = 'dev.malice.pack_preferences';
132eeceeb362atagen2026-10-25 03:34 UTC7
132eeceeb362atagen2026-10-25 03:34 UTC8
export const disabledPackImages = writable<DisabledPackImages>({});
132eeceeb362atagen2026-10-25 03:34 UTC9
132eeceeb362atagen2026-10-25 03:34 UTC10
let loadGeneration = 0;
132eeceeb362atagen2026-10-25 03:34 UTC11
let accountGeneration = 0;
132eeceeb362atagen2026-10-25 03:34 UTC12
let pendingSaves = 0;
132eeceeb362atagen2026-10-25 03:34 UTC13
let persistedPreferences: DisabledPackImages = {};
132eeceeb362atagen2026-10-25 03:34 UTC14
let saveQueue: Promise<void> = Promise.resolve();
132eeceeb362atagen2026-10-25 03:34 UTC15
132eeceeb362atagen2026-10-25 03:34 UTC16
export async function loadPackPreferences(): Promise<void> {
132eeceeb362atagen2026-10-25 03:34 UTC17
  if (pendingSaves > 0) return;
132eeceeb362atagen2026-10-25 03:34 UTC18
  const generation = ++loadGeneration;
132eeceeb362atagen2026-10-25 03:34 UTC19
  const epoch = accountGeneration;
132eeceeb362atagen2026-10-25 03:34 UTC20
  try {
132eeceeb362atagen2026-10-25 03:34 UTC21
    const preferences = parseDisabledPackImages(await getAccountData(EVENT_TYPE));
132eeceeb362atagen2026-10-25 03:34 UTC22
    if (generation !== loadGeneration || epoch !== accountGeneration || pendingSaves > 0) return;
132eeceeb362atagen2026-10-25 03:34 UTC23
    persistedPreferences = preferences;
132eeceeb362atagen2026-10-25 03:34 UTC24
    disabledPackImages.set(preferences);
132eeceeb362atagen2026-10-25 03:34 UTC25
  } catch {}
132eeceeb362atagen2026-10-25 03:34 UTC26
}
132eeceeb362atagen2026-10-25 03:34 UTC27
132eeceeb362atagen2026-10-25 03:34 UTC28
export function setPackImageEnabled(packId: string, shortcode: string, enabled: boolean): Promise<void> {
132eeceeb362atagen2026-10-25 03:34 UTC29
  const previous = get(disabledPackImages);
132eeceeb362atagen2026-10-25 03:34 UTC30
  const next = withImageEnabled(previous, packId, shortcode, enabled);
132eeceeb362atagen2026-10-25 03:34 UTC31
  if (next === previous) return Promise.resolve();
132eeceeb362atagen2026-10-25 03:34 UTC32
132eeceeb362atagen2026-10-25 03:34 UTC33
  const epoch = accountGeneration;
132eeceeb362atagen2026-10-25 03:34 UTC34
  loadGeneration += 1;
132eeceeb362atagen2026-10-25 03:34 UTC35
  pendingSaves += 1;
132eeceeb362atagen2026-10-25 03:34 UTC36
  disabledPackImages.set(next);
132eeceeb362atagen2026-10-25 03:34 UTC37
132eeceeb362atagen2026-10-25 03:34 UTC38
  const save = saveQueue.then(async () => {
132eeceeb362atagen2026-10-25 03:34 UTC39
    if (epoch !== accountGeneration) return;
132eeceeb362atagen2026-10-25 03:34 UTC40
    await setAccountData(EVENT_TYPE, { disabled: next });
132eeceeb362atagen2026-10-25 03:34 UTC41
    if (epoch === accountGeneration) persistedPreferences = next;
132eeceeb362atagen2026-10-25 03:34 UTC42
  });
132eeceeb362atagen2026-10-25 03:34 UTC43
  saveQueue = save.catch(() => undefined);
132eeceeb362atagen2026-10-25 03:34 UTC44
  return save.catch((error: unknown) => {
132eeceeb362atagen2026-10-25 03:34 UTC45
    if (epoch === accountGeneration && get(disabledPackImages) === next) {
132eeceeb362atagen2026-10-25 03:34 UTC46
      loadGeneration += 1;
132eeceeb362atagen2026-10-25 03:34 UTC47
      disabledPackImages.set(persistedPreferences);
132eeceeb362atagen2026-10-25 03:34 UTC48
    }
132eeceeb362atagen2026-10-25 03:34 UTC49
    throw error;
132eeceeb362atagen2026-10-25 03:34 UTC50
  }).finally(() => {
132eeceeb362atagen2026-10-25 03:34 UTC51
    if (epoch === accountGeneration) pendingSaves -= 1;
132eeceeb362atagen2026-10-25 03:34 UTC52
  });
132eeceeb362atagen2026-10-25 03:34 UTC53
}
132eeceeb362atagen2026-10-25 03:34 UTC54
132eeceeb362atagen2026-10-25 03:34 UTC55
export function resetPackPreferences(): void {
132eeceeb362atagen2026-10-25 03:34 UTC56
  accountGeneration += 1;
132eeceeb362atagen2026-10-25 03:34 UTC57
  loadGeneration += 1;
132eeceeb362atagen2026-10-25 03:34 UTC58
  pendingSaves = 0;
132eeceeb362atagen2026-10-25 03:34 UTC59
  persistedPreferences = {};
132eeceeb362atagen2026-10-25 03:34 UTC60
  disabledPackImages.set({});
132eeceeb362atagen2026-10-25 03:34 UTC61
}