atagen

malice

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

Blame: web/src/lib/protection.ts

4929dcd34937atagen2026-10-26 04:43 UTC1
import { writable } from 'svelte/store';
4929dcd34937atagen2026-10-26 04:43 UTC2
import {
4929dcd34937atagen2026-10-26 04:43 UTC3
  isDismissed,
4929dcd34937atagen2026-10-26 04:43 UTC4
  requestPersistence,
4929dcd34937atagen2026-10-26 04:43 UTC5
  setDismissed,
4929dcd34937atagen2026-10-26 04:43 UTC6
  type InstallContext
4929dcd34937atagen2026-10-26 04:43 UTC7
} from './protection-model';
4929dcd34937atagen2026-10-26 04:43 UTC8
4929dcd34937atagen2026-10-26 04:43 UTC9
export const storageUnprotected = writable(false);
4929dcd34937atagen2026-10-26 04:43 UTC10
export const recoveryDismissed = writable(false);
4929dcd34937atagen2026-10-26 04:43 UTC11
4929dcd34937atagen2026-10-26 04:43 UTC12
export const isDeviceBuild = import.meta.env.VITE_MALICE_TARGET === 'device';
4929dcd34937atagen2026-10-26 04:43 UTC13
4929dcd34937atagen2026-10-26 04:43 UTC14
export function installContext(): InstallContext {
4929dcd34937atagen2026-10-26 04:43 UTC15
  const standalone =
4929dcd34937atagen2026-10-26 04:43 UTC16
    window.matchMedia('(display-mode: standalone)').matches ||
4929dcd34937atagen2026-10-26 04:43 UTC17
    (navigator as Navigator & { standalone?: boolean }).standalone === true;
4929dcd34937atagen2026-10-26 04:43 UTC18
  return { device: isDeviceBuild, standalone };
4929dcd34937atagen2026-10-26 04:43 UTC19
}
4929dcd34937atagen2026-10-26 04:43 UTC20
4929dcd34937atagen2026-10-26 04:43 UTC21
export function loadDismissals(account: string): void {
4929dcd34937atagen2026-10-26 04:43 UTC22
  recoveryDismissed.set(isDismissed(localStorage, 'recovery', account));
4929dcd34937atagen2026-10-26 04:43 UTC23
}
4929dcd34937atagen2026-10-26 04:43 UTC24
4929dcd34937atagen2026-10-26 04:43 UTC25
export async function protectStorage(account: string): Promise<void> {
4929dcd34937atagen2026-10-26 04:43 UTC26
  const result = await requestPersistence(navigator.storage).catch(() => null);
4929dcd34937atagen2026-10-26 04:43 UTC27
  storageUnprotected.set(isDeviceBuild && result !== null && !result.persisted && !isDismissed(localStorage, 'storage', account));
4929dcd34937atagen2026-10-26 04:43 UTC28
}
4929dcd34937atagen2026-10-26 04:43 UTC29
4929dcd34937atagen2026-10-26 04:43 UTC30
export function dismissStorageWarning(account: string): void {
4929dcd34937atagen2026-10-26 04:43 UTC31
  setDismissed(localStorage, 'storage', account);
4929dcd34937atagen2026-10-26 04:43 UTC32
  storageUnprotected.set(false);
4929dcd34937atagen2026-10-26 04:43 UTC33
}
4929dcd34937atagen2026-10-26 04:43 UTC34
4929dcd34937atagen2026-10-26 04:43 UTC35
export function dismissRecoveryPrompt(account: string): void {
4929dcd34937atagen2026-10-26 04:43 UTC36
  setDismissed(localStorage, 'recovery', account);
4929dcd34937atagen2026-10-26 04:43 UTC37
  recoveryDismissed.set(true);
4929dcd34937atagen2026-10-26 04:43 UTC38
}