84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
const SUPPORT_DRAFT_STORAGE_PREFIX = "rw_webapp_support_draft_v1";
|
|
const SUPPORT_DRAFT_TTL_MS = 14 * 24 * 60 * 60 * 1000;
|
|
const DEFAULT_SCOPE = "anonymous";
|
|
|
|
function safeStorage() {
|
|
if (typeof window === "undefined") return null;
|
|
try {
|
|
return window.localStorage || null;
|
|
} catch (_error) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function draftKey(kind, scope, id = "new") {
|
|
return [
|
|
SUPPORT_DRAFT_STORAGE_PREFIX,
|
|
encodeURIComponent(String(kind || "draft")),
|
|
encodeURIComponent(String(scope || DEFAULT_SCOPE)),
|
|
encodeURIComponent(String(id || "new")),
|
|
].join(":");
|
|
}
|
|
|
|
function normalizeDraftEnvelope(value) {
|
|
if (!value || typeof value !== "object") return null;
|
|
const updatedAt = Number(value.updatedAt || 0);
|
|
if (!updatedAt || Date.now() - updatedAt > SUPPORT_DRAFT_TTL_MS) return null;
|
|
return value.draft && typeof value.draft === "object" ? value.draft : null;
|
|
}
|
|
|
|
export function supportDraftScope(user = {}) {
|
|
const id = String(user?.user_id ?? user?.id ?? user?.telegram_id ?? "").trim();
|
|
return id || DEFAULT_SCOPE;
|
|
}
|
|
|
|
export function readSupportDraft(kind, scope, id = "new") {
|
|
const storage = safeStorage();
|
|
if (!storage) return null;
|
|
const key = draftKey(kind, scope, id);
|
|
|
|
try {
|
|
const raw = storage.getItem(key);
|
|
if (!raw) return null;
|
|
|
|
const draft = normalizeDraftEnvelope(JSON.parse(raw));
|
|
if (!draft) storage.removeItem(key);
|
|
return draft;
|
|
} catch (_error) {
|
|
try {
|
|
storage.removeItem(key);
|
|
} catch (_removeError) {
|
|
void _removeError;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function writeSupportDraft(kind, scope, id = "new", draft = {}) {
|
|
const storage = safeStorage();
|
|
if (!storage) return;
|
|
|
|
try {
|
|
storage.setItem(
|
|
draftKey(kind, scope, id),
|
|
JSON.stringify({
|
|
updatedAt: Date.now(),
|
|
draft: draft && typeof draft === "object" ? draft : {},
|
|
})
|
|
);
|
|
} catch (_error) {
|
|
void _error;
|
|
}
|
|
}
|
|
|
|
export function clearSupportDraft(kind, scope, id = "new") {
|
|
const storage = safeStorage();
|
|
if (!storage) return;
|
|
|
|
try {
|
|
storage.removeItem(draftKey(kind, scope, id));
|
|
} catch (_error) {
|
|
void _error;
|
|
}
|
|
}
|