@plutonhq/core-frontend 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist-lib/components/Plan/Backups/Backups.module.scss.js +44 -42
  2. package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
  3. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts +3 -2
  4. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts.map +1 -1
  5. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js +29 -22
  6. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js.map +1 -1
  7. package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts +2 -1
  8. package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts.map +1 -1
  9. package/dist-lib/components/Plan/PlanProgress/PlanProgress.js +22 -18
  10. package/dist-lib/components/Plan/PlanProgress/PlanProgress.js.map +1 -1
  11. package/dist-lib/components/Plan/Restores/Restores.js +5 -5
  12. package/dist-lib/components/Plan/Restores/Restores.js.map +1 -1
  13. package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js +73 -73
  14. package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js.map +1 -1
  15. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
  16. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +50 -50
  17. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
  18. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +8 -8
  19. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
  20. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +34 -36
  21. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js.map +1 -1
  22. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts +2 -1
  23. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts.map +1 -1
  24. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js +62 -60
  25. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js.map +1 -1
  26. package/dist-lib/components/common/LogViewer/LogViewer.d.ts.map +1 -1
  27. package/dist-lib/components/common/LogViewer/LogViewer.js +51 -47
  28. package/dist-lib/components/common/LogViewer/LogViewer.js.map +1 -1
  29. package/dist-lib/components/common/LogViewer/LogViewer.module.scss.js +24 -24
  30. package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
  31. package/dist-lib/hooks/usePlanSingleActions.js +49 -37
  32. package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
  33. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  34. package/dist-lib/routes/PlanSingle/PlanSingle.js +68 -67
  35. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  36. package/dist-lib/services/backups.d.ts.map +1 -1
  37. package/dist-lib/services/backups.js +35 -34
  38. package/dist-lib/services/backups.js.map +1 -1
  39. package/dist-lib/services/plans.d.ts +5 -2
  40. package/dist-lib/services/plans.d.ts.map +1 -1
  41. package/dist-lib/services/plans.js +45 -43
  42. package/dist-lib/services/plans.js.map +1 -1
  43. package/dist-lib/services/restores.d.ts.map +1 -1
  44. package/dist-lib/services/restores.js +56 -55
  45. package/dist-lib/services/restores.js.map +1 -1
  46. package/dist-lib/services.js +19 -19
  47. package/dist-lib/styles/core-frontend.css +1 -1
  48. package/package.json +1 -1
  49. package/src/components/Plan/Backups/Backups.module.scss +2 -1
  50. package/src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx +27 -18
  51. package/src/components/Plan/PlanProgress/PlanProgress.tsx +13 -2
  52. package/src/components/Plan/Restores/Restores.tsx +1 -1
  53. package/src/components/Restore/RestoreFileSelector/RestoreFileSelector.tsx +4 -4
  54. package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +26 -19
  55. package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +1 -1
  56. package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +2 -2
  57. package/src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx +18 -14
  58. package/src/components/common/LogViewer/LogViewer.module.scss +1 -1
  59. package/src/components/common/LogViewer/LogViewer.tsx +18 -10
  60. package/src/hooks/usePlanSingleActions.tsx +21 -8
  61. package/src/routes/PlanSingle/PlanSingle.tsx +2 -0
  62. package/src/services/backups.ts +12 -4
  63. package/src/services/plans.ts +4 -3
  64. package/src/services/restores.ts +12 -4
@@ -1,7 +1,8 @@
1
1
  import { useQueryClient as d, useMutation as u, useQuery as p } from "@tanstack/react-query";
2
- import { toast as y } from "react-toastify";
2
+ import { toast as b } from "react-toastify";
3
3
  import { API_URL as c } from "../utils/constants.js";
4
- async function b({ backupId: e }) {
4
+ const h = /* @__PURE__ */ new Set();
5
+ async function g({ backupId: e }) {
5
6
  const n = await (await fetch(`${c}/backups/${e}/action/download`, {
6
7
  method: "POST",
7
8
  credentials: "include"
@@ -11,17 +12,17 @@ async function b({ backupId: e }) {
11
12
  throw new Error(n.error);
12
13
  return n;
13
14
  }
14
- function T() {
15
+ function R() {
15
16
  const e = d();
16
17
  return u({
17
- mutationFn: b,
18
+ mutationFn: g,
18
19
  onSuccess: (t, n) => {
19
20
  console.log("res :", n, t), e.invalidateQueries({ queryKey: ["plan", n.planId] });
20
21
  }
21
22
  });
22
23
  }
23
24
  async function $(e) {
24
- var w, f;
25
+ var f, w;
25
26
  const t = await fetch(`${c}/backups/${e}/action/download`, {
26
27
  method: "GET",
27
28
  credentials: "include"
@@ -31,19 +32,19 @@ async function $(e) {
31
32
  const l = await t.json();
32
33
  throw new Error(l.error);
33
34
  }
34
- const n = ((w = t.headers.get("content-disposition")) == null ? void 0 : w.split("filename=")[1]) || `backup-${e}.tar`, o = (f = t.body) == null ? void 0 : f.getReader(), r = new ReadableStream({
35
+ const n = ((f = t.headers.get("content-disposition")) == null ? void 0 : f.split("filename=")[1]) || `backup-${e}.tar`, o = (w = t.body) == null ? void 0 : w.getReader(), r = new ReadableStream({
35
36
  async start(l) {
36
37
  for (; ; ) {
37
- const { done: k, value: m } = await o.read();
38
- if (k) break;
39
- l.enqueue(m);
38
+ const { done: m, value: y } = await o.read();
39
+ if (m) break;
40
+ l.enqueue(y);
40
41
  }
41
42
  l.close(), o.releaseLock();
42
43
  }
43
44
  }), i = await new Response(r).blob(), a = window.URL.createObjectURL(i), s = document.createElement("a");
44
45
  s.href = a, s.download = n, document.body.appendChild(s), s.click(), s.remove(), window.URL.revokeObjectURL(a);
45
46
  }
46
- function R() {
47
+ function C() {
47
48
  return u({
48
49
  mutationFn: $,
49
50
  onSuccess: (e) => {
@@ -54,7 +55,7 @@ function R() {
54
55
  }
55
56
  });
56
57
  }
57
- async function g({ backupId: e }) {
58
+ async function B({ backupId: e }) {
58
59
  const n = await (await fetch(`${c}/backups/${e}/action/download`, {
59
60
  method: "DELETE",
60
61
  credentials: "include"
@@ -64,10 +65,10 @@ async function g({ backupId: e }) {
64
65
  throw new Error(n.error);
65
66
  return n;
66
67
  }
67
- function C() {
68
+ function O() {
68
69
  const e = d();
69
70
  return u({
70
- mutationFn: g,
71
+ mutationFn: B,
71
72
  onSuccess: (t, n) => {
72
73
  console.log("res :", n, t), e.invalidateQueries({ queryKey: ["plan", n.planId] });
73
74
  }
@@ -83,7 +84,7 @@ async function E(e) {
83
84
  throw new Error(o.error);
84
85
  return o;
85
86
  }
86
- function O() {
87
+ function P() {
87
88
  return u({
88
89
  mutationFn: E,
89
90
  onSuccess: (e) => {
@@ -91,7 +92,7 @@ function O() {
91
92
  }
92
93
  });
93
94
  }
94
- async function h({ id: e, sourceId: t, sourceType: n, planId: o }) {
95
+ async function k({ id: e, sourceId: t, sourceType: n, planId: o }) {
95
96
  const r = new URL(`${c}/backups/${e}/progress?sourceId=${t}&sourceType=${n}&planId=${o}`);
96
97
  return await (await fetch(r.toString(), {
97
98
  method: "GET",
@@ -102,7 +103,7 @@ function v(e) {
102
103
  const t = d();
103
104
  return p({
104
105
  queryKey: ["progress-backup", e.id],
105
- queryFn: () => h(e),
106
+ queryFn: () => k(e),
106
107
  refetchOnMount: !0,
107
108
  retry: !1,
108
109
  refetchInterval(n) {
@@ -110,7 +111,7 @@ function v(e) {
110
111
  const o = (i = n.state) == null ? void 0 : i.data;
111
112
  if ((a = o == null ? void 0 : o.events) == null ? void 0 : a.some((s) => s.phase === "finished" && s.completed === !0)) {
112
113
  const s = (o == null ? void 0 : o.planId) || e.planId;
113
- return s && (console.log("Invalidate Plan and Reload It :", s), t.invalidateQueries({ queryKey: ["plan", s] })), y.success("Process Complete!"), !1;
114
+ return h.has(e.id) || (h.add(e.id), s && (console.log("Invalidate Plan and Reload It :", s), t.invalidateQueries({ queryKey: ["plan", s] })), b.success("Process Complete!")), !1;
114
115
  }
115
116
  return 1e3;
116
117
  }
@@ -119,12 +120,12 @@ function v(e) {
119
120
  function L(e) {
120
121
  return p({
121
122
  queryKey: ["progress-backup", e.id],
122
- queryFn: () => h(e),
123
+ queryFn: () => k(e),
123
124
  refetchOnMount: !0,
124
125
  retry: !1
125
126
  });
126
127
  }
127
- async function B({ planId: e, backupId: t }) {
128
+ async function S({ planId: e, backupId: t }) {
128
129
  const o = await (await fetch(`${c}/backups/${t}/action/cancel?planId=${e}`, {
129
130
  method: "POST",
130
131
  credentials: "include"
@@ -134,9 +135,9 @@ async function B({ planId: e, backupId: t }) {
134
135
  throw new Error(o.error);
135
136
  return o;
136
137
  }
137
- function P() {
138
+ function D() {
138
139
  return u({
139
- mutationFn: B,
140
+ mutationFn: S,
140
141
  onSuccess: (e, t) => {
141
142
  console.log("res :", t, e);
142
143
  }
@@ -154,7 +155,7 @@ async function j({ backupId: e, updatePayload: t }) {
154
155
  throw new Error(r.error);
155
156
  return r;
156
157
  }
157
- function D() {
158
+ function G() {
158
159
  return u({
159
160
  mutationFn: j,
160
161
  onSuccess: (e, t) => {
@@ -172,7 +173,7 @@ async function F({ backupId: e }) {
172
173
  throw new Error(n.error);
173
174
  return n;
174
175
  }
175
- function G(e) {
176
+ function U(e) {
176
177
  return p({
177
178
  queryKey: ["snapshot-files", e.backupId],
178
179
  queryFn: () => F(e),
@@ -183,22 +184,22 @@ function G(e) {
183
184
  });
184
185
  }
185
186
  export {
186
- B as cancelBackup,
187
- g as cancelBackupDownload,
187
+ S as cancelBackup,
188
+ B as cancelBackupDownload,
188
189
  E as deleteBackup,
189
- b as generateBackupDownload,
190
+ g as generateBackupDownload,
190
191
  $ as getBackupDownload,
191
- h as getBackupProgress,
192
+ k as getBackupProgress,
192
193
  F as getSnapshotFiles,
193
194
  j as updateBackup,
194
- P as useCancelBackup,
195
- C as useCancelBackupDownload,
196
- O as useDeleteBackup,
197
- T as useDownloadBackup,
198
- R as useGetBackupDownload,
195
+ D as useCancelBackup,
196
+ O as useCancelBackupDownload,
197
+ P as useDeleteBackup,
198
+ R as useDownloadBackup,
199
+ C as useGetBackupDownload,
199
200
  v as useGetBackupProgress,
200
201
  L as useGetBackupProgressOnce,
201
- G as useGetSnapshotFiles,
202
- D as useUpdateBackup
202
+ U as useGetSnapshotFiles,
203
+ G as useUpdateBackup
203
204
  };
204
205
  //# sourceMappingURL=backups.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backups.js","sources":["../../src/services/backups.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport { API_URL } from '../utils/constants';\r\n\r\n// Generate Download\r\nexport async function generateBackupDownload({ backupId }: { backupId: string; planId: string }) {\r\n // const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/download`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDownloadBackup() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: generateBackupDownload,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n queryClient.invalidateQueries({ queryKey: ['plan', payload.planId] });\r\n },\r\n });\r\n}\r\n\r\n// Get Download\r\nexport async function getBackupDownload(id: string) {\r\n // const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${id}/action/download`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n if (!res.ok) {\r\n const data = await res.json();\r\n throw new Error(data.error);\r\n }\r\n\r\n const filename = res.headers.get('content-disposition')?.split('filename=')[1] || `backup-${id}.tar`;\r\n\r\n // Use streams API\r\n const reader = res.body?.getReader();\r\n const stream = new ReadableStream({\r\n async start(controller) {\r\n while (true) {\r\n const { done, value } = await reader!.read();\r\n if (done) break;\r\n controller.enqueue(value);\r\n }\r\n controller.close();\r\n reader!.releaseLock();\r\n },\r\n });\r\n\r\n // Create download from stream\r\n const blob = await new Response(stream).blob();\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport function useGetBackupDownload() {\r\n return useMutation({\r\n mutationFn: getBackupDownload,\r\n onSuccess: (res) => {\r\n console.log('# Backup Downloaded! :', res);\r\n },\r\n onError: (res) => {\r\n console.log('# Download Failed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Cancel Download\r\nexport async function cancelBackupDownload({ backupId }: { backupId: string; planId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/download`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useCancelBackupDownload() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: cancelBackupDownload,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n queryClient.invalidateQueries({ queryKey: ['plan', payload.planId] });\r\n },\r\n });\r\n}\r\n\r\n// Remove Backup\r\nexport async function deleteBackup(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${id}`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDeleteBackup() {\r\n return useMutation({\r\n mutationFn: deleteBackup,\r\n onSuccess: (res) => {\r\n console.log('# Backup Removed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Get Backup Progress\r\nexport async function getBackupProgress({ id, sourceId, sourceType, planId }: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n const url = new URL(`${API_URL}/backups/${id}/progress?sourceId=${sourceId}&sourceType=${sourceType}&planId=${planId}`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n return data;\r\n}\r\n\r\nexport function useGetBackupProgress(payload: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n const queryClient = useQueryClient();\r\n return useQuery({\r\n queryKey: ['progress-backup', payload.id],\r\n queryFn: () => getBackupProgress(payload),\r\n refetchOnMount: true,\r\n retry: false,\r\n refetchInterval(query) {\r\n // console.log('query :', query.state?.data);\r\n const progressData = query.state?.data;\r\n\r\n // Check if backup is finished by looking for a \"finished\" phase event\r\n const isFinished = progressData?.events?.some((event: any) => event.phase === 'finished' && event.completed === true);\r\n\r\n if (isFinished) {\r\n const planId = progressData?.planId || payload.planId;\r\n if (planId) {\r\n console.log('Invalidate Plan and Reload It :', planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n }\r\n toast.success('Process Complete!');\r\n return false;\r\n }\r\n\r\n return 1000;\r\n },\r\n });\r\n}\r\n\r\nexport function useGetBackupProgressOnce(payload: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n return useQuery({\r\n queryKey: ['progress-backup', payload.id],\r\n queryFn: () => getBackupProgress(payload),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Cancel Backup\r\nexport async function cancelBackup({ planId, backupId }: { planId: string; backupId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/cancel?planId=${planId}`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useCancelBackup() {\r\n return useMutation({\r\n mutationFn: cancelBackup,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n },\r\n });\r\n}\r\n\r\n// Update Backup Title and Description\r\nexport async function updateBackup({ backupId, updatePayload }: { backupId: string; updatePayload: { title?: string; description?: string } }) {\r\n console.log('updatePayload :', updatePayload);\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${backupId}`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n body: JSON.stringify(updatePayload),\r\n headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useUpdateBackup() {\r\n return useMutation({\r\n mutationFn: updateBackup,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n },\r\n });\r\n}\r\n\r\n// Get Snapshot Files\r\nexport async function getSnapshotFiles({ backupId }: { backupId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/files`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useGetSnapshotFiles(payload: { backupId: string }) {\r\n return useQuery({\r\n queryKey: ['snapshot-files', payload.backupId],\r\n queryFn: () => getSnapshotFiles(payload),\r\n refetchOnMount: true,\r\n staleTime: 1000 * 60 * 60, // Cache the data for 60 minutes\r\n retry: false,\r\n });\r\n}\r\n"],"names":["generateBackupDownload","backupId","data","API_URL","useDownloadBackup","queryClient","useQueryClient","useMutation","res","payload","getBackupDownload","id","filename","_a","reader","_b","stream","controller","done","value","blob","url","link","useGetBackupDownload","cancelBackupDownload","useCancelBackupDownload","deleteBackup","header","useDeleteBackup","getBackupProgress","sourceId","sourceType","planId","useGetBackupProgress","useQuery","query","progressData","event","toast","useGetBackupProgressOnce","cancelBackup","useCancelBackup","updateBackup","updatePayload","useUpdateBackup","getSnapshotFiles","useGetSnapshotFiles"],"mappings":"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"}
1
+ {"version":3,"file":"backups.js","sources":["../../src/services/backups.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport { API_URL } from '../utils/constants';\r\n\r\nconst notifiedBackupProgress = new Set<string>();\r\n\r\n// Generate Download\r\nexport async function generateBackupDownload({ backupId }: { backupId: string; planId: string }) {\r\n // const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/download`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDownloadBackup() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: generateBackupDownload,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n queryClient.invalidateQueries({ queryKey: ['plan', payload.planId] });\r\n },\r\n });\r\n}\r\n\r\n// Get Download\r\nexport async function getBackupDownload(id: string) {\r\n // const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${id}/action/download`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n if (!res.ok) {\r\n const data = await res.json();\r\n throw new Error(data.error);\r\n }\r\n\r\n const filename = res.headers.get('content-disposition')?.split('filename=')[1] || `backup-${id}.tar`;\r\n\r\n // Use streams API\r\n const reader = res.body?.getReader();\r\n const stream = new ReadableStream({\r\n async start(controller) {\r\n while (true) {\r\n const { done, value } = await reader!.read();\r\n if (done) break;\r\n controller.enqueue(value);\r\n }\r\n controller.close();\r\n reader!.releaseLock();\r\n },\r\n });\r\n\r\n // Create download from stream\r\n const blob = await new Response(stream).blob();\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport function useGetBackupDownload() {\r\n return useMutation({\r\n mutationFn: getBackupDownload,\r\n onSuccess: (res) => {\r\n console.log('# Backup Downloaded! :', res);\r\n },\r\n onError: (res) => {\r\n console.log('# Download Failed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Cancel Download\r\nexport async function cancelBackupDownload({ backupId }: { backupId: string; planId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/download`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useCancelBackupDownload() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: cancelBackupDownload,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n queryClient.invalidateQueries({ queryKey: ['plan', payload.planId] });\r\n },\r\n });\r\n}\r\n\r\n// Remove Backup\r\nexport async function deleteBackup(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${id}`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDeleteBackup() {\r\n return useMutation({\r\n mutationFn: deleteBackup,\r\n onSuccess: (res) => {\r\n console.log('# Backup Removed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Get Backup Progress\r\nexport async function getBackupProgress({ id, sourceId, sourceType, planId }: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n const url = new URL(`${API_URL}/backups/${id}/progress?sourceId=${sourceId}&sourceType=${sourceType}&planId=${planId}`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n return data;\r\n}\r\n\r\nexport function useGetBackupProgress(payload: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n const queryClient = useQueryClient();\r\n return useQuery({\r\n queryKey: ['progress-backup', payload.id],\r\n queryFn: () => getBackupProgress(payload),\r\n refetchOnMount: true,\r\n retry: false,\r\n refetchInterval(query) {\r\n // Only refetch if the browser tab is active\r\n // if (document.hidden) return false;\r\n\r\n // console.log('query :', query.state?.data);\r\n const progressData = query.state?.data;\r\n\r\n // Check if backup is finished by looking for a \"finished\" phase event\r\n const isFinished = progressData?.events?.some((event: any) => event.phase === 'finished' && event.completed === true);\r\n\r\n if (isFinished) {\r\n const planId = progressData?.planId || payload.planId;\r\n if (!notifiedBackupProgress.has(payload.id)) {\r\n notifiedBackupProgress.add(payload.id);\r\n if (planId) {\r\n console.log('Invalidate Plan and Reload It :', planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n }\r\n toast.success('Process Complete!');\r\n }\r\n return false;\r\n }\r\n\r\n return 1000;\r\n },\r\n });\r\n}\r\n\r\nexport function useGetBackupProgressOnce(payload: { id: string; sourceId: string; sourceType: string; planId: string }) {\r\n return useQuery({\r\n queryKey: ['progress-backup', payload.id],\r\n queryFn: () => getBackupProgress(payload),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Cancel Backup\r\nexport async function cancelBackup({ planId, backupId }: { planId: string; backupId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/action/cancel?planId=${planId}`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useCancelBackup() {\r\n return useMutation({\r\n mutationFn: cancelBackup,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n },\r\n });\r\n}\r\n\r\n// Update Backup Title and Description\r\nexport async function updateBackup({ backupId, updatePayload }: { backupId: string; updatePayload: { title?: string; description?: string } }) {\r\n console.log('updatePayload :', updatePayload);\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/backups/${backupId}`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n body: JSON.stringify(updatePayload),\r\n headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useUpdateBackup() {\r\n return useMutation({\r\n mutationFn: updateBackup,\r\n onSuccess: (res, payload) => {\r\n console.log('res :', payload, res);\r\n },\r\n });\r\n}\r\n\r\n// Get Snapshot Files\r\nexport async function getSnapshotFiles({ backupId }: { backupId: string }) {\r\n const res = await fetch(`${API_URL}/backups/${backupId}/files`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\nexport function useGetSnapshotFiles(payload: { backupId: string }) {\r\n return useQuery({\r\n queryKey: ['snapshot-files', payload.backupId],\r\n queryFn: () => getSnapshotFiles(payload),\r\n refetchOnMount: true,\r\n staleTime: 1000 * 60 * 60, // Cache the data for 60 minutes\r\n retry: false,\r\n });\r\n}\r\n"],"names":["notifiedBackupProgress","generateBackupDownload","backupId","data","API_URL","useDownloadBackup","queryClient","useQueryClient","useMutation","res","payload","getBackupDownload","id","filename","_a","reader","_b","stream","controller","done","value","blob","url","link","useGetBackupDownload","cancelBackupDownload","useCancelBackupDownload","deleteBackup","header","useDeleteBackup","getBackupProgress","sourceId","sourceType","planId","useGetBackupProgress","useQuery","query","progressData","event","toast","useGetBackupProgressOnce","cancelBackup","useCancelBackup","updateBackup","updatePayload","useUpdateBackup","getSnapshotFiles","useGetSnapshotFiles"],"mappings":"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"}
@@ -35,6 +35,9 @@ export declare function prunePlan(id: string): Promise<any>;
35
35
  export declare function usePrunePlan(): import("@tanstack/react-query").UseMutationResult<any, Error, string, unknown>;
36
36
  export declare function unlockPlan(id: string): Promise<any>;
37
37
  export declare function useUnlockPlan(): import("@tanstack/react-query").UseMutationResult<any, Error, string, unknown>;
38
- export declare function checkActiveBackups(planId: string): Promise<any>;
39
- export declare function useCheckActiveBackups(): import("@tanstack/react-query").UseMutationResult<any, Error, string, unknown>;
38
+ export declare function checkActiveBackupsOrRestore(planId: string, type?: 'backup' | 'restore'): Promise<any>;
39
+ export declare function useCheckActiveBackupsOrRestore(): import("@tanstack/react-query").UseMutationResult<any, Error, {
40
+ planId: string;
41
+ type: "backup" | "restore";
42
+ }, unknown>;
40
43
  //# sourceMappingURL=plans.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/services/plans.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,iBAYhC;AAED,wBAAgB,WAAW,+DAO1B;AAGD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,gBAiB7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,8DAQpC;AAGD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,gBAc/C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,8DAO5C;AAGD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBAsChD;AAED,wBAAgB,kBAAkB,oFAUjC;AAGD,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,gBAcxD;AAED,wBAAgB,aAAa,4FAU5B;AAGD,wBAAsB,UAAU,CAAC,aAAa,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,gBAelF;AAED,wBAAgB,aAAa;QAjByB,MAAM;UAAQ,OAAO,CAAC,IAAI,CAAC;YAgChF;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,gBAYnG;AAED,wBAAgB,aAAa;QAdoC,MAAM;sBAAoB,OAAO;YAuBjG;AAGD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,gBAY7C;AAED,wBAAgB,gBAAgB,mFAU/B;AAGD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,gBAYzC;AAED,wBAAgB,YAAY,mFAU3B;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,gBAY1C;AAED,wBAAgB,aAAa,mFAU5B;AAGD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,gBAYzC;AAED,wBAAgB,YAAY,mFAc3B;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,gBAY1C;AAED,wBAAgB,aAAa,mFAc5B;AAGD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,gBAYtD;AAED,wBAAgB,qBAAqB,mFAMpC"}
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/services/plans.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,iBAYhC;AAED,wBAAgB,WAAW,+DAO1B;AAGD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,gBAiB7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,8DAQpC;AAGD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,gBAc/C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,8DAO5C;AAGD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBAsChD;AAED,wBAAgB,kBAAkB,oFAUjC;AAGD,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,gBAcxD;AAED,wBAAgB,aAAa,4FAU5B;AAGD,wBAAsB,UAAU,CAAC,aAAa,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,gBAelF;AAED,wBAAgB,aAAa;QAjByB,MAAM;UAAQ,OAAO,CAAC,IAAI,CAAC;YAgChF;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,gBAYnG;AAED,wBAAgB,aAAa;QAdoC,MAAM;sBAAoB,OAAO;YAuBjG;AAGD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,gBAY7C;AAED,wBAAgB,gBAAgB,mFAU/B;AAGD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,gBAYzC;AAED,wBAAgB,YAAY,mFAU3B;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,gBAY1C;AAED,wBAAgB,aAAa,mFAU5B;AAGD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,gBAYzC;AAED,wBAAgB,YAAY,mFAc3B;AAGD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,gBAY1C;AAED,wBAAgB,aAAa,mFAc5B;AAGD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,QAAQ,GAAG,SAAoB,gBAatG;AAED,wBAAgB,8BAA8B;YAGC,MAAM;UAAQ,QAAQ,GAAG,SAAS;YAGhF"}
@@ -1,8 +1,8 @@
1
1
  import { useQuery as d, useMutation as r, useQueryClient as c } from "@tanstack/react-query";
2
2
  import { toast as l } from "react-toastify";
3
- import { API_URL as s } from "../utils/constants.js";
3
+ import { API_URL as a } from "../utils/constants.js";
4
4
  async function g() {
5
- const e = new URL(`${s}/plans`), o = await (await fetch(e.toString(), {
5
+ const e = new URL(`${a}/plans`), o = await (await fetch(e.toString(), {
6
6
  method: "GET",
7
7
  credentials: "include"
8
8
  })).json();
@@ -10,7 +10,7 @@ async function g() {
10
10
  throw new Error(o.error);
11
11
  return o;
12
12
  }
13
- function Q() {
13
+ function F() {
14
14
  return d({
15
15
  queryKey: ["plans"],
16
16
  queryFn: () => g(),
@@ -21,17 +21,17 @@ function Q() {
21
21
  async function P(e) {
22
22
  if (!e)
23
23
  throw new Error("ID Not Provided.");
24
- const n = new URL(`${s}/plans/${e}`), o = await fetch(n.toString(), {
24
+ const n = new URL(`${a}/plans/${e}`), o = await fetch(n.toString(), {
25
25
  method: "GET",
26
26
  credentials: "include"
27
27
  }), t = await o.json();
28
28
  if (!t.success) {
29
- const a = new Error(t.error);
30
- throw a.status = o.status, a;
29
+ const s = new Error(t.error);
30
+ throw s.status = o.status, s;
31
31
  }
32
32
  return t;
33
33
  }
34
- function b(e) {
34
+ function Q(e) {
35
35
  return d({
36
36
  queryKey: ["plan", e],
37
37
  queryFn: () => P(e),
@@ -41,13 +41,13 @@ function b(e) {
41
41
  });
42
42
  }
43
43
  async function j(e) {
44
- const n = new URL(`${s}/plans/${e}/logs`), o = await fetch(n.toString(), {
44
+ const n = new URL(`${a}/plans/${e}/logs`), o = await fetch(n.toString(), {
45
45
  method: "GET",
46
46
  credentials: "include"
47
47
  }), t = await o.json();
48
48
  if (!t.success) {
49
- const a = new Error(t.error);
50
- throw a.status = o.status, a;
49
+ const s = new Error(t.error);
50
+ throw s.status = o.status, s;
51
51
  }
52
52
  return t;
53
53
  }
@@ -61,7 +61,7 @@ function U(e) {
61
61
  }
62
62
  async function E(e) {
63
63
  var w, y;
64
- const n = await fetch(`${s}/plans/${e}/logs/download`, {
64
+ const n = await fetch(`${a}/plans/${e}/logs/download`, {
65
65
  method: "GET",
66
66
  credentials: "include"
67
67
  // headers: header,
@@ -70,7 +70,7 @@ async function E(e) {
70
70
  const u = await n.json();
71
71
  throw new Error(u.error);
72
72
  }
73
- const o = ((w = n.headers.get("content-disposition")) == null ? void 0 : w.split("filename=")[1]) || `plan-${e}.log`, t = (y = n.body) == null ? void 0 : y.getReader(), a = new ReadableStream({
73
+ const o = ((w = n.headers.get("content-disposition")) == null ? void 0 : w.split("filename=")[1]) || `plan-${e}.log`, t = (y = n.body) == null ? void 0 : y.getReader(), s = new ReadableStream({
74
74
  async start(u) {
75
75
  for (; ; ) {
76
76
  const { done: h, value: m } = await t.read();
@@ -79,7 +79,7 @@ async function E(e) {
79
79
  }
80
80
  u.close(), t.releaseLock();
81
81
  }
82
- }), f = await new Response(a).blob(), p = window.URL.createObjectURL(f), i = document.createElement("a");
82
+ }), f = await new Response(s).blob(), p = window.URL.createObjectURL(f), i = document.createElement("a");
83
83
  i.href = p, i.download = o, document.body.appendChild(i), i.click(), i.remove(), window.URL.revokeObjectURL(p);
84
84
  }
85
85
  function A() {
@@ -93,10 +93,10 @@ function A() {
93
93
  }
94
94
  });
95
95
  }
96
- async function q(e) {
96
+ async function k(e) {
97
97
  const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" });
98
98
  console.log("newPlan :", e);
99
- const t = await (await fetch(`${s}/plans`, {
99
+ const t = await (await fetch(`${a}/plans`, {
100
100
  method: "POST",
101
101
  credentials: "include",
102
102
  headers: n,
@@ -109,16 +109,16 @@ async function q(e) {
109
109
  function B() {
110
110
  const e = c();
111
111
  return r({
112
- mutationFn: q,
112
+ mutationFn: k,
113
113
  onSuccess: (n) => {
114
114
  console.log("# Plan Created! :", n), e.invalidateQueries({ queryKey: ["plans"] });
115
115
  }
116
116
  });
117
117
  }
118
- async function S(e) {
118
+ async function q(e) {
119
119
  const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" });
120
120
  console.log("newPlan :", e);
121
- const t = await (await fetch(`${s}/plans/${e.id}`, {
121
+ const t = await (await fetch(`${a}/plans/${e.id}`, {
122
122
  method: "PUT",
123
123
  credentials: "include",
124
124
  headers: n,
@@ -131,7 +131,7 @@ async function S(e) {
131
131
  function G() {
132
132
  const e = c();
133
133
  return r({
134
- mutationFn: S,
134
+ mutationFn: q,
135
135
  onSuccess: (n) => {
136
136
  var t;
137
137
  console.log("# Plan Updated! :", n);
@@ -140,27 +140,27 @@ function G() {
140
140
  }
141
141
  });
142
142
  }
143
- async function k({ id: e, removeRemoteData: n }) {
144
- const o = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), a = await (await fetch(`${s}/plans/${e}?removeData=${n}`, {
143
+ async function S({ id: e, removeRemoteData: n }) {
144
+ const o = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), s = await (await fetch(`${a}/plans/${e}?removeData=${n}`, {
145
145
  method: "DELETE",
146
146
  credentials: "include",
147
147
  headers: o
148
148
  })).json();
149
- if (!a.success)
150
- throw new Error(a.error);
151
- return a;
149
+ if (!s.success)
150
+ throw new Error(s.error);
151
+ return s;
152
152
  }
153
153
  function D() {
154
154
  const e = c();
155
155
  return r({
156
- mutationFn: k,
156
+ mutationFn: S,
157
157
  onSuccess: (n) => {
158
158
  console.log("# Plan Removed! :", n), e.invalidateQueries({ queryKey: ["plans"] });
159
159
  }
160
160
  });
161
161
  }
162
162
  async function $(e) {
163
- const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${s}/plans/${e}/action/backup`, {
163
+ const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${a}/plans/${e}/action/backup`, {
164
164
  method: "POST",
165
165
  credentials: "include",
166
166
  headers: n
@@ -179,7 +179,7 @@ function H() {
179
179
  });
180
180
  }
181
181
  async function v(e) {
182
- const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${s}/plans/${e}/action/pause`, {
182
+ const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${a}/plans/${e}/action/pause`, {
183
183
  method: "POST",
184
184
  credentials: "include",
185
185
  headers: n
@@ -198,7 +198,7 @@ function M() {
198
198
  });
199
199
  }
200
200
  async function C(e) {
201
- const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${s}/plans/${e}/action/resume`, {
201
+ const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${a}/plans/${e}/action/resume`, {
202
202
  method: "POST",
203
203
  credentials: "include",
204
204
  headers: n
@@ -217,7 +217,7 @@ function N() {
217
217
  });
218
218
  }
219
219
  async function T(e) {
220
- const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${s}/plans/${e}/action/prune`, {
220
+ const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${a}/plans/${e}/action/prune`, {
221
221
  method: "POST",
222
222
  credentials: "include",
223
223
  headers: n
@@ -239,7 +239,7 @@ function J() {
239
239
  });
240
240
  }
241
241
  async function R(e) {
242
- const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${s}/plans/${e}/action/unlock`, {
242
+ const n = new Headers({ "Content-Type": "application/json", Accept: "application/json" }), t = await (await fetch(`${a}/plans/${e}/action/unlock`, {
243
243
  method: "POST",
244
244
  credentials: "include",
245
245
  headers: n
@@ -260,26 +260,28 @@ function x() {
260
260
  }
261
261
  });
262
262
  }
263
- async function L(e) {
264
- const n = new URL(`${s}/plans/${e}/checkactive`), t = await (await fetch(n.toString(), {
263
+ async function L(e, n = "backup") {
264
+ const o = new URL(`${a}/plans/${e}/checkactive`);
265
+ o.searchParams.append("type", n);
266
+ const s = await (await fetch(o.toString(), {
265
267
  method: "GET",
266
268
  credentials: "include"
267
269
  })).json();
268
- if (!t.success)
269
- throw new Error(t.error);
270
- return t;
270
+ if (!s.success)
271
+ throw new Error(s.error);
272
+ return s;
271
273
  }
272
274
  function _() {
273
275
  return r({
274
276
  // queryKey: ['planActiveBackups-' + planId],
275
- mutationFn: L
277
+ mutationFn: ({ planId: e, type: n }) => L(e, n)
276
278
  // refetchOnMount: true,
277
279
  });
278
280
  }
279
281
  export {
280
- L as checkActiveBackups,
281
- q as createPlan,
282
- k as deletePlan,
282
+ L as checkActiveBackupsOrRestore,
283
+ k as createPlan,
284
+ S as deletePlan,
283
285
  E as downloadPlanLogs,
284
286
  g as getAllPlans,
285
287
  j as getPlanLogs,
@@ -289,14 +291,14 @@ export {
289
291
  T as prunePlan,
290
292
  C as resumePlan,
291
293
  R as unlockPlan,
292
- S as updatePlan,
293
- _ as useCheckActiveBackups,
294
+ q as updatePlan,
295
+ _ as useCheckActiveBackupsOrRestore,
294
296
  B as useCreatePlan,
295
297
  D as useDeletePlan,
296
298
  A as useGetDownloadLogs,
297
- b as useGetPlan,
299
+ Q as useGetPlan,
298
300
  U as useGetPlanLogs,
299
- Q as useGetPlans,
301
+ F as useGetPlans,
300
302
  M as usePausePlan,
301
303
  H as usePerformBackup,
302
304
  J as usePrunePlan,
@@ -1 +1 @@
1
- {"version":3,"file":"plans.js","sources":["../../src/services/plans.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport { API_URL } from '../utils/constants';\r\nimport { NewPlanSettings, Plan } from '../@types/plans';\r\n\r\n// Get All Plans\r\nexport async function getAllPlans() {\r\n const url = new URL(`${API_URL}/plans`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlans() {\r\n return useQuery({\r\n queryKey: ['plans'],\r\n queryFn: () => getAllPlans(),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Get Single Plan\r\nexport async function getSinglePlan(id: string) {\r\n if (!id) {\r\n throw new Error('ID Not Provided.');\r\n }\r\n const url = new URL(`${API_URL}/plans/${id}`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n const error = new Error(data.error) as Error & { status?: number };\r\n error.status = res.status;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlan(id: string) {\r\n return useQuery({\r\n queryKey: ['plan', id],\r\n queryFn: () => getSinglePlan(id),\r\n refetchOnMount: true,\r\n retry: false,\r\n staleTime: 0,\r\n });\r\n}\r\n\r\n// Get Plan Logs\r\nexport async function getPlanLogs(planId: string) {\r\n const url = new URL(`${API_URL}/plans/${planId}/logs`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n const error = new Error(data.error) as Error & { status?: number };\r\n error.status = res.status;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlanLogs(planId: string) {\r\n return useQuery({\r\n queryKey: ['planLogs', planId],\r\n queryFn: () => getPlanLogs(planId),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Download Plan Logs\r\nexport async function downloadPlanLogs(id: string) {\r\n const res = await fetch(`${API_URL}/plans/${id}/logs/download`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n if (!res.ok) {\r\n const data = await res.json();\r\n throw new Error(data.error);\r\n }\r\n\r\n const filename = res.headers.get('content-disposition')?.split('filename=')[1] || `plan-${id}.log`;\r\n\r\n // Use streams API\r\n const reader = res.body?.getReader();\r\n const stream = new ReadableStream({\r\n async start(controller) {\r\n while (true) {\r\n const { done, value } = await reader!.read();\r\n if (done) break;\r\n controller.enqueue(value);\r\n }\r\n controller.close();\r\n reader!.releaseLock();\r\n },\r\n });\r\n\r\n // Create download from stream\r\n const blob = await new Response(stream).blob();\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport function useGetDownloadLogs() {\r\n return useMutation({\r\n mutationFn: downloadPlanLogs,\r\n onSuccess: (res) => {\r\n console.log('# Logs Downloaded! :', res);\r\n },\r\n onError: (res) => {\r\n console.log('# Logs Download Failed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Create New Plan\r\nexport async function createPlan(newPlan: NewPlanSettings) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n console.log('newPlan :', newPlan);\r\n const res = await fetch(`${API_URL}/plans`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n body: JSON.stringify(newPlan),\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error || data.result);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useCreatePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: createPlan,\r\n onSuccess: (res) => {\r\n // TODO: Should Display a Notification Bubble.\r\n console.log('# Plan Created! :', res);\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// UpdatePlan\r\nexport async function updatePlan(updatePayload: { id: string; data: Partial<Plan> }) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n console.log('newPlan :', updatePayload);\r\n const res = await fetch(`${API_URL}/plans/${updatePayload.id}`, {\r\n method: 'PUT',\r\n credentials: 'include',\r\n headers: header,\r\n body: JSON.stringify({ plan: updatePayload.data }),\r\n });\r\n const data = await res.json();\r\n console.log('data :', data);\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useUpdatePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: updatePlan,\r\n onSuccess: (res) => {\r\n // TODO: Should Display a Notification Bubble.\r\n console.log('# Plan Updated! :', res);\r\n const planID = res?.result?.id;\r\n if (planID) {\r\n queryClient.invalidateQueries({ queryKey: ['plan', planID] });\r\n }\r\n\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Remove Plan\r\nexport async function deletePlan({ id, removeRemoteData }: { id: string; removeRemoteData: boolean }) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}?removeData=${removeRemoteData}`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDeletePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: deletePlan,\r\n onSuccess: (res) => {\r\n console.log('# Plan Removed! :', res);\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Perform Backup\r\nexport async function performBackup(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/backup`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePerformBackup() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: performBackup,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Started! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Pause Backup\r\nexport async function pausePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/pause`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePausePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: pausePlan,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Paused! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Resume Backup\r\nexport async function resumePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/resume`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useResumePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: resumePlan,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Resumed! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Prune Backup Plan\r\nexport async function prunePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/prune`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePrunePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: prunePlan,\r\n onError: (error: Error) => {\r\n console.log('error :', error?.message);\r\n toast.error(error.message || `Error Removing Old Backups.`);\r\n },\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Pruned! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(res?.message || `Removed Old Backups Successfully!`, { autoClose: 5000 });\r\n },\r\n });\r\n}\r\n\r\n// Unlock Backup Plan\r\nexport async function unlockPlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/unlock`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useUnlockPlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: unlockPlan,\r\n onError: (error: Error) => {\r\n console.log('error :', error?.message);\r\n toast.error(error.message || `Error Removing stale locks.`);\r\n },\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Pruned! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(`Removed Stale locks Successfully!`, { autoClose: 5000 });\r\n },\r\n });\r\n}\r\n\r\n// Get Backup Progress\r\nexport async function checkActiveBackups(planId: string) {\r\n const url = new URL(`${API_URL}/plans/${planId}/checkactive`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useCheckActiveBackups() {\r\n return useMutation({\r\n // queryKey: ['planActiveBackups-' + planId],\r\n mutationFn: checkActiveBackups,\r\n // refetchOnMount: true,\r\n });\r\n}\r\n"],"names":["getAllPlans","url","API_URL","data","useGetPlans","useQuery","getSinglePlan","id","res","error","useGetPlan","getPlanLogs","planId","useGetPlanLogs","downloadPlanLogs","filename","_a","reader","_b","stream","controller","done","value","blob","link","useGetDownloadLogs","useMutation","createPlan","newPlan","header","useCreatePlan","queryClient","useQueryClient","updatePlan","updatePayload","useUpdatePlan","planID","deletePlan","removeRemoteData","useDeletePlan","performBackup","usePerformBackup","pausePlan","usePausePlan","resumePlan","useResumePlan","prunePlan","usePrunePlan","toast","unlockPlan","useUnlockPlan","checkActiveBackups","useCheckActiveBackups"],"mappings":"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"}
1
+ {"version":3,"file":"plans.js","sources":["../../src/services/plans.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport { API_URL } from '../utils/constants';\r\nimport { NewPlanSettings, Plan } from '../@types/plans';\r\n\r\n// Get All Plans\r\nexport async function getAllPlans() {\r\n const url = new URL(`${API_URL}/plans`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlans() {\r\n return useQuery({\r\n queryKey: ['plans'],\r\n queryFn: () => getAllPlans(),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Get Single Plan\r\nexport async function getSinglePlan(id: string) {\r\n if (!id) {\r\n throw new Error('ID Not Provided.');\r\n }\r\n const url = new URL(`${API_URL}/plans/${id}`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n const error = new Error(data.error) as Error & { status?: number };\r\n error.status = res.status;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlan(id: string) {\r\n return useQuery({\r\n queryKey: ['plan', id],\r\n queryFn: () => getSinglePlan(id),\r\n refetchOnMount: true,\r\n retry: false,\r\n staleTime: 0,\r\n });\r\n}\r\n\r\n// Get Plan Logs\r\nexport async function getPlanLogs(planId: string) {\r\n const url = new URL(`${API_URL}/plans/${planId}/logs`);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n const error = new Error(data.error) as Error & { status?: number };\r\n error.status = res.status;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\nexport function useGetPlanLogs(planId: string) {\r\n return useQuery({\r\n queryKey: ['planLogs', planId],\r\n queryFn: () => getPlanLogs(planId),\r\n refetchOnMount: true,\r\n retry: false,\r\n });\r\n}\r\n\r\n// Download Plan Logs\r\nexport async function downloadPlanLogs(id: string) {\r\n const res = await fetch(`${API_URL}/plans/${id}/logs/download`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n // headers: header,\r\n });\r\n // Check if response is ok\r\n if (!res.ok) {\r\n const data = await res.json();\r\n throw new Error(data.error);\r\n }\r\n\r\n const filename = res.headers.get('content-disposition')?.split('filename=')[1] || `plan-${id}.log`;\r\n\r\n // Use streams API\r\n const reader = res.body?.getReader();\r\n const stream = new ReadableStream({\r\n async start(controller) {\r\n while (true) {\r\n const { done, value } = await reader!.read();\r\n if (done) break;\r\n controller.enqueue(value);\r\n }\r\n controller.close();\r\n reader!.releaseLock();\r\n },\r\n });\r\n\r\n // Create download from stream\r\n const blob = await new Response(stream).blob();\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport function useGetDownloadLogs() {\r\n return useMutation({\r\n mutationFn: downloadPlanLogs,\r\n onSuccess: (res) => {\r\n console.log('# Logs Downloaded! :', res);\r\n },\r\n onError: (res) => {\r\n console.log('# Logs Download Failed! :', res);\r\n },\r\n });\r\n}\r\n\r\n// Create New Plan\r\nexport async function createPlan(newPlan: NewPlanSettings) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n console.log('newPlan :', newPlan);\r\n const res = await fetch(`${API_URL}/plans`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n body: JSON.stringify(newPlan),\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error || data.result);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useCreatePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: createPlan,\r\n onSuccess: (res) => {\r\n // TODO: Should Display a Notification Bubble.\r\n console.log('# Plan Created! :', res);\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// UpdatePlan\r\nexport async function updatePlan(updatePayload: { id: string; data: Partial<Plan> }) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n console.log('newPlan :', updatePayload);\r\n const res = await fetch(`${API_URL}/plans/${updatePayload.id}`, {\r\n method: 'PUT',\r\n credentials: 'include',\r\n headers: header,\r\n body: JSON.stringify({ plan: updatePayload.data }),\r\n });\r\n const data = await res.json();\r\n console.log('data :', data);\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useUpdatePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: updatePlan,\r\n onSuccess: (res) => {\r\n // TODO: Should Display a Notification Bubble.\r\n console.log('# Plan Updated! :', res);\r\n const planID = res?.result?.id;\r\n if (planID) {\r\n queryClient.invalidateQueries({ queryKey: ['plan', planID] });\r\n }\r\n\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Remove Plan\r\nexport async function deletePlan({ id, removeRemoteData }: { id: string; removeRemoteData: boolean }) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}?removeData=${removeRemoteData}`, {\r\n method: 'DELETE',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useDeletePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: deletePlan,\r\n onSuccess: (res) => {\r\n console.log('# Plan Removed! :', res);\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Perform Backup\r\nexport async function performBackup(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/backup`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePerformBackup() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: performBackup,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Started! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Pause Backup\r\nexport async function pausePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/pause`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePausePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: pausePlan,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Paused! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Resume Backup\r\nexport async function resumePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/resume`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useResumePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: resumePlan,\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Resumed! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n queryClient.invalidateQueries({ queryKey: ['plans'] });\r\n },\r\n });\r\n}\r\n\r\n// Prune Backup Plan\r\nexport async function prunePlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/prune`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function usePrunePlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: prunePlan,\r\n onError: (error: Error) => {\r\n console.log('error :', error?.message);\r\n toast.error(error.message || `Error Removing Old Backups.`);\r\n },\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Pruned! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(res?.message || `Removed Old Backups Successfully!`, { autoClose: 5000 });\r\n },\r\n });\r\n}\r\n\r\n// Unlock Backup Plan\r\nexport async function unlockPlan(id: string) {\r\n const header = new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' });\r\n const res = await fetch(`${API_URL}/plans/${id}/action/unlock`, {\r\n method: 'POST',\r\n credentials: 'include',\r\n headers: header,\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useUnlockPlan() {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: unlockPlan,\r\n onError: (error: Error) => {\r\n console.log('error :', error?.message);\r\n toast.error(error.message || `Error Removing stale locks.`);\r\n },\r\n onSuccess: (res, planId) => {\r\n console.log('# Backup Pruned! :', res, planId);\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(`Removed Stale locks Successfully!`, { autoClose: 5000 });\r\n },\r\n });\r\n}\r\n\r\n// Get Backup Progress\r\nexport async function checkActiveBackupsOrRestore(planId: string, type: 'backup' | 'restore' = 'backup') {\r\n const url = new URL(`${API_URL}/plans/${planId}/checkactive`);\r\n url.searchParams.append('type', type);\r\n\r\n const res = await fetch(url.toString(), {\r\n method: 'GET',\r\n credentials: 'include',\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n throw new Error(data.error);\r\n }\r\n return data;\r\n}\r\n\r\nexport function useCheckActiveBackupsOrRestore() {\r\n return useMutation({\r\n // queryKey: ['planActiveBackups-' + planId],\r\n mutationFn: ({ planId, type }: { planId: string; type: 'backup' | 'restore' }) => checkActiveBackupsOrRestore(planId, type),\r\n // refetchOnMount: true,\r\n });\r\n}\r\n"],"names":["getAllPlans","url","API_URL","data","useGetPlans","useQuery","getSinglePlan","id","res","error","useGetPlan","getPlanLogs","planId","useGetPlanLogs","downloadPlanLogs","filename","_a","reader","_b","stream","controller","done","value","blob","link","useGetDownloadLogs","useMutation","createPlan","newPlan","header","useCreatePlan","queryClient","useQueryClient","updatePlan","updatePayload","useUpdatePlan","planID","deletePlan","removeRemoteData","useDeletePlan","performBackup","usePerformBackup","pausePlan","usePausePlan","resumePlan","useResumePlan","prunePlan","usePrunePlan","toast","unlockPlan","useUnlockPlan","checkActiveBackupsOrRestore","type","useCheckActiveBackupsOrRestore"],"mappings":";;;AAMA,eAAsBA,IAAc;AACjC,QAAMC,IAAM,IAAI,IAAI,GAAGC,CAAO,QAAQ,GAMhCC,IAAO,OAJD,MAAM,MAAMF,EAAI,YAAY;AAAA,IACrC,QAAQ;AAAA,IACR,aAAa;AAAA,EAAA,CACf,GACsB,KAAA;AACvB,MAAI,CAACE,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASC,IAAc;AAC3B,SAAOC,EAAS;AAAA,IACb,UAAU,CAAC,OAAO;AAAA,IAClB,SAAS,MAAML,EAAA;AAAA,IACf,gBAAgB;AAAA,IAChB,OAAO;AAAA,EAAA,CACT;AACJ;AAGA,eAAsBM,EAAcC,GAAY;AAC7C,MAAI,CAACA;AACF,UAAM,IAAI,MAAM,kBAAkB;AAErC,QAAMN,IAAM,IAAI,IAAI,GAAGC,CAAO,UAAUK,CAAE,EAAE,GAEtCC,IAAM,MAAM,MAAMP,EAAI,YAAY;AAAA,IACrC,QAAQ;AAAA,IACR,aAAa;AAAA,EAAA,CACf,GACKE,IAAO,MAAMK,EAAI,KAAA;AACvB,MAAI,CAACL,EAAK,SAAS;AAChB,UAAMM,IAAQ,IAAI,MAAMN,EAAK,KAAK;AAClC,UAAAM,EAAM,SAASD,EAAI,QACbC;AAAA,EACT;AACA,SAAON;AACV;AAEO,SAASO,EAAWH,GAAY;AACpC,SAAOF,EAAS;AAAA,IACb,UAAU,CAAC,QAAQE,CAAE;AAAA,IACrB,SAAS,MAAMD,EAAcC,CAAE;AAAA,IAC/B,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,WAAW;AAAA,EAAA,CACb;AACJ;AAGA,eAAsBI,EAAYC,GAAgB;AAC/C,QAAMX,IAAM,IAAI,IAAI,GAAGC,CAAO,UAAUU,CAAM,OAAO,GAE/CJ,IAAM,MAAM,MAAMP,EAAI,YAAY;AAAA,IACrC,QAAQ;AAAA,IACR,aAAa;AAAA,EAAA,CACf,GACKE,IAAO,MAAMK,EAAI,KAAA;AACvB,MAAI,CAACL,EAAK,SAAS;AAChB,UAAMM,IAAQ,IAAI,MAAMN,EAAK,KAAK;AAClC,UAAAM,EAAM,SAASD,EAAI,QACbC;AAAA,EACT;AACA,SAAON;AACV;AAEO,SAASU,EAAeD,GAAgB;AAC5C,SAAOP,EAAS;AAAA,IACb,UAAU,CAAC,YAAYO,CAAM;AAAA,IAC7B,SAAS,MAAMD,EAAYC,CAAM;AAAA,IACjC,gBAAgB;AAAA,IAChB,OAAO;AAAA,EAAA,CACT;AACJ;AAGA,eAAsBE,EAAiBP,GAAY;;AAChD,QAAMC,IAAM,MAAM,MAAM,GAAGN,CAAO,UAAUK,CAAE,kBAAkB;AAAA,IAC7D,QAAQ;AAAA,IACR,aAAa;AAAA;AAAA,EAAA,CAEf;AAED,MAAI,CAACC,EAAI,IAAI;AACV,UAAML,IAAO,MAAMK,EAAI,KAAA;AACvB,UAAM,IAAI,MAAML,EAAK,KAAK;AAAA,EAC7B;AAEA,QAAMY,MAAWC,IAAAR,EAAI,QAAQ,IAAI,qBAAqB,MAArC,gBAAAQ,EAAwC,MAAM,aAAa,OAAM,QAAQT,CAAE,QAGtFU,KAASC,IAAAV,EAAI,SAAJ,gBAAAU,EAAU,aACnBC,IAAS,IAAI,eAAe;AAAA,IAC/B,MAAM,MAAMC,GAAY;AACrB,iBAAa;AACV,cAAM,EAAE,MAAAC,GAAM,OAAAC,EAAA,IAAU,MAAML,EAAQ,KAAA;AACtC,YAAII,EAAM;AACV,QAAAD,EAAW,QAAQE,CAAK;AAAA,MAC3B;AACA,MAAAF,EAAW,MAAA,GACXH,EAAQ,YAAA;AAAA,IACX;AAAA,EAAA,CACF,GAGKM,IAAO,MAAM,IAAI,SAASJ,CAAM,EAAE,KAAA,GAClClB,IAAM,OAAO,IAAI,gBAAgBsB,CAAI,GACrCC,IAAO,SAAS,cAAc,GAAG;AACvC,EAAAA,EAAK,OAAOvB,GACZuB,EAAK,WAAWT,GAChB,SAAS,KAAK,YAAYS,CAAI,GAC9BA,EAAK,MAAA,GACLA,EAAK,OAAA,GACL,OAAO,IAAI,gBAAgBvB,CAAG;AACjC;AAEO,SAASwB,IAAqB;AAClC,SAAOC,EAAY;AAAA,IAChB,YAAYZ;AAAA,IACZ,WAAW,CAACN,MAAQ;AACjB,cAAQ,IAAI,wBAAwBA,CAAG;AAAA,IAC1C;AAAA,IACA,SAAS,CAACA,MAAQ;AACf,cAAQ,IAAI,6BAA6BA,CAAG;AAAA,IAC/C;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBmB,EAAWC,GAA0B;AACxD,QAAMC,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB;AAC7F,UAAQ,IAAI,aAAaD,CAAO;AAOhC,QAAMzB,IAAO,OAND,MAAM,MAAM,GAAGD,CAAO,UAAU;AAAA,IACzC,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS2B;AAAA,IACT,MAAM,KAAK,UAAUD,CAAO;AAAA,EAAA,CAC9B,GACsB,KAAA;AACvB,MAAI,CAACzB,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,SAASA,EAAK,MAAM;AAE5C,SAAOA;AACV;AAEO,SAAS2B,IAAgB;AAC7B,QAAMC,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYC;AAAA,IACZ,WAAW,CAACnB,MAAQ;AAEjB,cAAQ,IAAI,qBAAqBA,CAAG,GACpCuB,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBE,EAAWC,GAAoD;AAClF,QAAML,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB;AAC7F,UAAQ,IAAI,aAAaK,CAAa;AAOtC,QAAM/B,IAAO,OAND,MAAM,MAAM,GAAGD,CAAO,UAAUgC,EAAc,EAAE,IAAI;AAAA,IAC7D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASL;AAAA,IACT,MAAM,KAAK,UAAU,EAAE,MAAMK,EAAc,MAAM;AAAA,EAAA,CACnD,GACsB,KAAA;AAEvB,MADA,QAAQ,IAAI,UAAU/B,CAAI,GACtB,CAACA,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASgC,IAAgB;AAC7B,QAAMJ,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYO;AAAA,IACZ,WAAW,CAACzB,MAAQ;;AAEjB,cAAQ,IAAI,qBAAqBA,CAAG;AACpC,YAAM4B,KAASpB,IAAAR,KAAA,gBAAAA,EAAK,WAAL,gBAAAQ,EAAa;AAC5B,MAAIoB,KACDL,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQK,CAAM,GAAG,GAG/DL,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBM,EAAW,EAAE,IAAA9B,GAAI,kBAAA+B,KAA+D;AACnG,QAAMT,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,eAAe+B,CAAgB,IAAI;AAAA,IAC9E,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAST;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASoC,IAAgB;AAC7B,QAAMR,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYW;AAAA,IACZ,WAAW,CAAC7B,MAAQ;AACjB,cAAQ,IAAI,qBAAqBA,CAAG,GACpCuB,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBS,EAAcjC,GAAY;AAC7C,QAAMsB,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,kBAAkB;AAAA,IAC7D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASsB;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASsC,IAAmB;AAChC,QAAMV,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYc;AAAA,IACZ,WAAW,CAAChC,GAAKI,MAAW;AACzB,cAAQ,IAAI,uBAAuBJ,GAAKI,CAAM,GAC9CmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQnB,CAAM,GAAG,GAC5DmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBW,EAAUnC,GAAY;AACzC,QAAMsB,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,iBAAiB;AAAA,IAC5D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASsB;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASwC,IAAe;AAC5B,QAAMZ,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYgB;AAAA,IACZ,WAAW,CAAClC,GAAKI,MAAW;AACzB,cAAQ,IAAI,sBAAsBJ,GAAKI,CAAM,GAC7CmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQnB,CAAM,GAAG,GAC5DmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBa,EAAWrC,GAAY;AAC1C,QAAMsB,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,kBAAkB;AAAA,IAC7D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASsB;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAAS0C,IAAgB;AAC7B,QAAMd,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYkB;AAAA,IACZ,WAAW,CAACpC,GAAKI,MAAW;AACzB,cAAQ,IAAI,uBAAuBJ,GAAKI,CAAM,GAC9CmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQnB,CAAM,GAAG,GAC5DmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,GAAG;AAAA,IACxD;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBe,EAAUvC,GAAY;AACzC,QAAMsB,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,iBAAiB;AAAA,IAC5D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASsB;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAAS4C,IAAe;AAC5B,QAAMhB,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYoB;AAAA,IACZ,SAAS,CAACrC,MAAiB;AACxB,cAAQ,IAAI,WAAWA,KAAA,gBAAAA,EAAO,OAAO,GACrCuC,EAAM,MAAMvC,EAAM,WAAW,6BAA6B;AAAA,IAC7D;AAAA,IACA,WAAW,CAACD,GAAKI,MAAW;AACzB,cAAQ,IAAI,sBAAsBJ,GAAKI,CAAM,GAC7CmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQnB,CAAM,GAAG,GAC5DoC,EAAM,SAAQxC,KAAA,gBAAAA,EAAK,YAAW,qCAAqC,EAAE,WAAW,KAAM;AAAA,IACzF;AAAA,EAAA,CACF;AACJ;AAGA,eAAsByC,EAAW1C,GAAY;AAC1C,QAAMsB,IAAS,IAAI,QAAQ,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB,GAMvF1B,IAAO,OALD,MAAM,MAAM,GAAGD,CAAO,UAAUK,CAAE,kBAAkB;AAAA,IAC7D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAASsB;AAAA,EAAA,CACX,GACsB,KAAA;AACvB,MAAI,CAAC1B,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAAS+C,IAAgB;AAC7B,QAAMnB,IAAcC,EAAA;AACpB,SAAON,EAAY;AAAA,IAChB,YAAYuB;AAAA,IACZ,SAAS,CAACxC,MAAiB;AACxB,cAAQ,IAAI,WAAWA,KAAA,gBAAAA,EAAO,OAAO,GACrCuC,EAAM,MAAMvC,EAAM,WAAW,6BAA6B;AAAA,IAC7D;AAAA,IACA,WAAW,CAACD,GAAKI,MAAW;AACzB,cAAQ,IAAI,sBAAsBJ,GAAKI,CAAM,GAC7CmB,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQnB,CAAM,GAAG,GAC5DoC,EAAM,QAAQ,qCAAqC,EAAE,WAAW,KAAM;AAAA,IACzE;AAAA,EAAA,CACF;AACJ;AAGA,eAAsBG,EAA4BvC,GAAgBwC,IAA6B,UAAU;AACtG,QAAMnD,IAAM,IAAI,IAAI,GAAGC,CAAO,UAAUU,CAAM,cAAc;AAC5D,EAAAX,EAAI,aAAa,OAAO,QAAQmD,CAAI;AAMpC,QAAMjD,IAAO,OAJD,MAAM,MAAMF,EAAI,YAAY;AAAA,IACrC,QAAQ;AAAA,IACR,aAAa;AAAA,EAAA,CACf,GACsB,KAAA;AACvB,MAAI,CAACE,EAAK;AACP,UAAM,IAAI,MAAMA,EAAK,KAAK;AAE7B,SAAOA;AACV;AAEO,SAASkD,IAAiC;AAC9C,SAAO3B,EAAY;AAAA;AAAA,IAEhB,YAAY,CAAC,EAAE,QAAAd,GAAQ,MAAAwC,QAA2DD,EAA4BvC,GAAQwC,CAAI;AAAA;AAAA,EAAA,CAE5H;AACJ;"}