serializer.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { DataStoreSerializer } from "@sv443-network/userutils";
  2. import { configStore } from "./config.js";
  3. import { autoLikeStore } from "./features/input.js";
  4. import { showPrompt } from "./dialogs/prompt.js";
  5. import { t } from "./utils/translations.js";
  6. import { error } from "./utils/logging.js";
  7. import { downloadFile } from "./utils/dom.js";
  8. import { reloadTab } from "./utils/misc.js";
  9. import packageJson from "../package.json" with { type: "json" };
  10. /** Central serializer for all data stores */
  11. let serializer: DataStoreSerializer | undefined;
  12. /** Returns the serializer for all data stores */
  13. export function getStoreSerializer() {
  14. if(!serializer) {
  15. serializer = new DataStoreSerializer([
  16. configStore,
  17. autoLikeStore,
  18. ], {
  19. addChecksum: true,
  20. ensureIntegrity: true,
  21. });
  22. }
  23. return serializer;
  24. }
  25. /** Imports data from a file into all data stores */
  26. export async function importData(blob: File | Blob) {
  27. try {
  28. const serializer = getStoreSerializer();
  29. const data = await blob.text();
  30. await serializer.deserialize(data);
  31. const reload = await showPrompt({
  32. type: "confirm",
  33. message: t("import_success_confirm_reload"),
  34. });
  35. reload && await reloadTab();
  36. }
  37. catch(err) {
  38. error(err);
  39. await showPrompt({
  40. type: "alert",
  41. message: t("import_error_invalid"),
  42. });
  43. }
  44. }
  45. /** Downloads the current data stores as a single file */
  46. export async function downloadData() {
  47. const serializer = getStoreSerializer();
  48. const pad = (num: number, len = 2) => String(num).padStart(len, "0");
  49. const d = new Date();
  50. const dateStr = `${pad(d.getFullYear(), 4)}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}_${pad(d.getHours())}-${pad(d.getMinutes())}`;
  51. const fileName = `BetterYTM ${packageJson.version} data export ${dateStr}.json`;
  52. const data = JSON.stringify(JSON.parse(await serializer.serialize()), undefined, 2);
  53. downloadFile(fileName, data, "application/json");
  54. }