serializer.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { DataStoreSerializer, type Stringifiable } 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. /** Array of all data stores that are included in the DataStoreSerializer instance */
  13. export const getSerializerStores = () => [
  14. configStore,
  15. autoLikeStore,
  16. ];
  17. /** Array of IDs of all stores included in the DataStoreSerializer instance */
  18. export const getSerializerStoresIds = () => getSerializerStores().map(store => store.id);
  19. /** Returns the serializer for all data stores */
  20. export function getStoreSerializer() {
  21. if(!serializer)
  22. serializer = new DataStoreSerializer(getSerializerStores(), {
  23. addChecksum: true,
  24. ensureIntegrity: true,
  25. });
  26. return serializer;
  27. }
  28. /** Imports data from a file into all data stores */
  29. export async function importData(blob: File | Blob) {
  30. try {
  31. const serializer = getStoreSerializer();
  32. const data = await blob.text();
  33. await serializer.deserialize(data);
  34. if(await showPrompt({
  35. type: "confirm",
  36. message: t("import_success_confirm_reload"),
  37. }))
  38. await reloadTab();
  39. }
  40. catch(err) {
  41. error(err);
  42. await showPrompt({
  43. type: "alert",
  44. message: t("import_error_invalid"),
  45. });
  46. }
  47. }
  48. /** Downloads the current data stores as a single file */
  49. export async function downloadData(useEncoding = true) {
  50. const serializer = getStoreSerializer();
  51. const pad = (val: Stringifiable, len = 2) => String(val).padStart(len, "0");
  52. const d = new Date();
  53. const dateStr = `${pad(d.getFullYear(), 4)}${pad(d.getMonth() + 1)}${pad(d.getDate())}_${pad(d.getHours())}${pad(d.getMinutes())}`;
  54. const fileName = `BetterYTM ${packageJson.version} data export ${dateStr}.json`;
  55. const data = JSON.stringify(JSON.parse(await serializer.serialize(useEncoding)), undefined, 2);
  56. downloadFile(fileName, data, "application/json");
  57. }