@burdenoff/microfe-files 2026.527.4 → 2026.528.1
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.
- package/dist/files/components/ConfirmDialog.js +40 -77
- package/dist/files/components/ConfirmDialog.js.map +1 -1
- package/dist/files/components/EmptyState.js +34 -48
- package/dist/files/components/EmptyState.js.map +1 -1
- package/dist/files/components/ShareDialog.js +176 -195
- package/dist/files/components/ShareDialog.js.map +1 -1
- package/dist/generated/wspace-operations.js +12 -1
- package/dist/generated/wspace-operations.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,216 +1,197 @@
|
|
|
1
1
|
import { tWithFallback as e } from "../utils/i18n.js";
|
|
2
2
|
import { useEffect as t, useState as n } from "react";
|
|
3
|
-
import { Calendar as r, Check as i, Copy as a, Download as o, Link as s, Loader2 as c, Lock as l, Mail as u
|
|
4
|
-
import { Fragment as
|
|
5
|
-
import { useI18n as
|
|
3
|
+
import { Calendar as r, Check as i, Copy as a, Download as o, Link as s, Loader2 as c, Lock as l, Mail as u } from "lucide-react";
|
|
4
|
+
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
5
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { Button as h, OptionalFields as g, ResponsiveDialog as _, ResponsiveDialogContent as v, ResponsiveDialogFooter as y, ResponsiveDialogHeader as b, ResponsiveDialogTitle as x } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/files/components/ShareDialog.tsx
|
|
7
|
-
function
|
|
8
|
-
let { t:
|
|
8
|
+
function S({ item: S, itemType: C, onClose: w, onCreateShare: T, isLoading: E }) {
|
|
9
|
+
let { t: D } = m(), [O, k] = n(null), [A, j] = n(null), [M, N] = n(!1), [P, F] = n(7), [I, L] = n(0), [R, z] = n(!1), [B, V] = n(""), [H, U] = n(""), [W, G] = n(null);
|
|
9
10
|
return t(() => {
|
|
10
|
-
|
|
11
|
-
e
|
|
12
|
-
};
|
|
13
|
-
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
14
|
-
}, [v]), t(() => {
|
|
15
|
-
if (E) {
|
|
16
|
-
let e = setTimeout(() => D(!1), 2e3);
|
|
11
|
+
if (M) {
|
|
12
|
+
let e = setTimeout(() => N(!1), 2e3);
|
|
17
13
|
return () => clearTimeout(e);
|
|
18
14
|
}
|
|
19
|
-
}, [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
children: /* @__PURE__ */
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}),
|
|
47
|
-
/* @__PURE__ */ m("div", {
|
|
48
|
-
className: "space-y-4",
|
|
49
|
-
children: [
|
|
50
|
-
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("label", {
|
|
51
|
-
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
52
|
-
children: [/* @__PURE__ */ p(r, { className: "size-4" }), e(x, "files.shareDialog.expiry.label", "Link expires in")]
|
|
53
|
-
}), /* @__PURE__ */ m("select", {
|
|
54
|
-
value: O,
|
|
55
|
-
onChange: (e) => k(Number(e.target.value)),
|
|
56
|
-
className: "w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200",
|
|
57
|
-
children: [
|
|
58
|
-
/* @__PURE__ */ p("option", {
|
|
59
|
-
value: 0,
|
|
60
|
-
children: e(x, "files.shareDialog.expiry.options.never", "Never")
|
|
61
|
-
}),
|
|
62
|
-
/* @__PURE__ */ p("option", {
|
|
63
|
-
value: 1,
|
|
64
|
-
children: e(x, "files.shareDialog.expiry.options.oneDay", "1 day")
|
|
65
|
-
}),
|
|
66
|
-
/* @__PURE__ */ p("option", {
|
|
67
|
-
value: 7,
|
|
68
|
-
children: e(x, "files.shareDialog.expiry.options.sevenDays", "7 days")
|
|
69
|
-
}),
|
|
70
|
-
/* @__PURE__ */ p("option", {
|
|
71
|
-
value: 30,
|
|
72
|
-
children: e(x, "files.shareDialog.expiry.options.thirtyDays", "30 days")
|
|
73
|
-
}),
|
|
74
|
-
/* @__PURE__ */ p("option", {
|
|
75
|
-
value: 90,
|
|
76
|
-
children: e(x, "files.shareDialog.expiry.options.ninetyDays", "90 days")
|
|
77
|
-
})
|
|
78
|
-
]
|
|
79
|
-
})] }),
|
|
80
|
-
/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("label", {
|
|
81
|
-
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
82
|
-
children: [/* @__PURE__ */ p(o, { className: "size-4" }), e(x, "files.shareDialog.downloads.label", "Maximum downloads")]
|
|
83
|
-
}), /* @__PURE__ */ p("input", {
|
|
84
|
-
type: "number",
|
|
85
|
-
min: "0",
|
|
86
|
-
value: A,
|
|
87
|
-
onChange: (e) => j(Number(e.target.value)),
|
|
88
|
-
"aria-label": e(x, "files.shareDialog.downloads.label", "Maximum downloads"),
|
|
89
|
-
placeholder: e(x, "files.shareDialog.downloads.placeholder", "Unlimited"),
|
|
90
|
-
className: "w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
91
|
-
})] }),
|
|
92
|
-
/* @__PURE__ */ m("div", { children: [
|
|
93
|
-
/* @__PURE__ */ m("label", {
|
|
94
|
-
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
95
|
-
children: [/* @__PURE__ */ p(l, { className: "size-4" }), e(x, "files.shareDialog.password.label", "Password protection")]
|
|
15
|
+
}, [M]), /* @__PURE__ */ f(_, {
|
|
16
|
+
open: !0,
|
|
17
|
+
onOpenChange: (e) => {
|
|
18
|
+
e || w();
|
|
19
|
+
},
|
|
20
|
+
children: /* @__PURE__ */ p(v, { children: [/* @__PURE__ */ f(b, { children: /* @__PURE__ */ f(x, { children: e(D, "files.shareDialog.title", "Share {{itemType}} \"{{name}}\"", {
|
|
21
|
+
itemType: e(D, C === "folder" ? "files.shareDialog.itemType.folder" : "files.shareDialog.itemType.file", C === "folder" ? "folder" : "file"),
|
|
22
|
+
name: S.name
|
|
23
|
+
}) }) }), A === null ? /* @__PURE__ */ p(d, { children: [
|
|
24
|
+
W && /* @__PURE__ */ f("div", {
|
|
25
|
+
className: "mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text",
|
|
26
|
+
children: W
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ p("div", {
|
|
29
|
+
className: "space-y-4",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("label", {
|
|
32
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
33
|
+
children: [/* @__PURE__ */ f(r, { className: "size-4" }), e(D, "files.shareDialog.expiry.label", "Link expires in")]
|
|
34
|
+
}), /* @__PURE__ */ p("select", {
|
|
35
|
+
value: P,
|
|
36
|
+
onChange: (e) => F(Number(e.target.value)),
|
|
37
|
+
className: "w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ f("option", {
|
|
40
|
+
value: 0,
|
|
41
|
+
children: e(D, "files.shareDialog.expiry.options.never", "Never")
|
|
96
42
|
}),
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
-
|
|
99
|
-
children:
|
|
100
|
-
type: "checkbox",
|
|
101
|
-
checked: M,
|
|
102
|
-
onChange: (e) => N(e.target.checked),
|
|
103
|
-
"aria-label": e(x, "files.shareDialog.password.require", "Require password"),
|
|
104
|
-
className: "rounded transition-colors duration-200"
|
|
105
|
-
}), /* @__PURE__ */ p("span", {
|
|
106
|
-
className: "text-sm text-text-secondary",
|
|
107
|
-
children: e(x, "files.shareDialog.password.require", "Require password")
|
|
108
|
-
})]
|
|
43
|
+
/* @__PURE__ */ f("option", {
|
|
44
|
+
value: 1,
|
|
45
|
+
children: e(D, "files.shareDialog.expiry.options.oneDay", "1 day")
|
|
109
46
|
}),
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
onChange: (e) => F(e.target.value),
|
|
114
|
-
"aria-label": e(x, "files.shareDialog.password.label", "Password protection"),
|
|
115
|
-
placeholder: e(x, "files.shareDialog.password.placeholder", "Enter password"),
|
|
116
|
-
className: "w-full mt-2 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
117
|
-
}), /* @__PURE__ */ p("p", {
|
|
118
|
-
className: "mt-1 text-xs text-text-tertiary",
|
|
119
|
-
children: e(x, "files.shareDialog.password.help", "Password must be at least 8 characters and contain uppercase, lowercase, and number")
|
|
120
|
-
})] })
|
|
121
|
-
] }),
|
|
122
|
-
/* @__PURE__ */ m("div", { children: [
|
|
123
|
-
/* @__PURE__ */ m("label", {
|
|
124
|
-
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
125
|
-
children: [/* @__PURE__ */ p(u, { className: "size-4" }), e(x, "files.shareDialog.invite.label", "Invite specific person (optional)")]
|
|
47
|
+
/* @__PURE__ */ f("option", {
|
|
48
|
+
value: 7,
|
|
49
|
+
children: e(D, "files.shareDialog.expiry.options.sevenDays", "7 days")
|
|
126
50
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
onChange: (e) => L(e.target.value),
|
|
131
|
-
"aria-label": e(x, "files.shareDialog.invite.label", "Invite specific person (optional)"),
|
|
132
|
-
placeholder: "user@example.com",
|
|
133
|
-
className: "w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
51
|
+
/* @__PURE__ */ f("option", {
|
|
52
|
+
value: 30,
|
|
53
|
+
children: e(D, "files.shareDialog.expiry.options.thirtyDays", "30 days")
|
|
134
54
|
}),
|
|
135
|
-
/* @__PURE__ */
|
|
136
|
-
|
|
137
|
-
children: e(
|
|
55
|
+
/* @__PURE__ */ f("option", {
|
|
56
|
+
value: 90,
|
|
57
|
+
children: e(D, "files.shareDialog.expiry.options.ninetyDays", "90 days")
|
|
138
58
|
})
|
|
139
|
-
]
|
|
140
|
-
]
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
59
|
+
]
|
|
60
|
+
})] }),
|
|
61
|
+
/* @__PURE__ */ p("div", { children: [
|
|
62
|
+
/* @__PURE__ */ p("label", {
|
|
63
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
64
|
+
children: [/* @__PURE__ */ f(u, { className: "size-4" }), e(D, "files.shareDialog.invite.label", "Invite specific person (optional)")]
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ f("input", {
|
|
67
|
+
type: "email",
|
|
68
|
+
value: H,
|
|
69
|
+
onChange: (e) => U(e.target.value),
|
|
70
|
+
"aria-label": e(D, "files.shareDialog.invite.label", "Invite specific person (optional)"),
|
|
71
|
+
placeholder: "user@example.com",
|
|
72
|
+
className: "w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ f("p", {
|
|
75
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
76
|
+
children: e(D, "files.shareDialog.invite.help", "Leave empty for public link")
|
|
77
|
+
})
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ f(g, {
|
|
80
|
+
title: e(D, "files.shareDialog.advanced.title", "Advanced"),
|
|
81
|
+
description: e(D, "files.shareDialog.advanced.description", "Download limits and password protection"),
|
|
82
|
+
children: /* @__PURE__ */ p("div", {
|
|
83
|
+
className: "space-y-4",
|
|
84
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("label", {
|
|
85
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
86
|
+
children: [/* @__PURE__ */ f(o, { className: "size-4" }), e(D, "files.shareDialog.downloads.label", "Maximum downloads")]
|
|
87
|
+
}), /* @__PURE__ */ f("input", {
|
|
88
|
+
type: "number",
|
|
89
|
+
min: "0",
|
|
90
|
+
value: I,
|
|
91
|
+
onChange: (e) => L(Number(e.target.value)),
|
|
92
|
+
"aria-label": e(D, "files.shareDialog.downloads.label", "Maximum downloads"),
|
|
93
|
+
placeholder: e(D, "files.shareDialog.downloads.placeholder", "Unlimited"),
|
|
94
|
+
className: "w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
95
|
+
})] }), /* @__PURE__ */ p("div", { children: [
|
|
96
|
+
/* @__PURE__ */ p("label", {
|
|
97
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary mb-2",
|
|
98
|
+
children: [/* @__PURE__ */ f(l, { className: "size-4" }), e(D, "files.shareDialog.password.label", "Password protection")]
|
|
99
|
+
}),
|
|
100
|
+
/* @__PURE__ */ p("div", {
|
|
101
|
+
className: "flex items-center gap-2",
|
|
102
|
+
children: [/* @__PURE__ */ f("input", {
|
|
103
|
+
type: "checkbox",
|
|
104
|
+
checked: R,
|
|
105
|
+
onChange: (e) => z(e.target.checked),
|
|
106
|
+
"aria-label": e(D, "files.shareDialog.password.require", "Require password"),
|
|
107
|
+
className: "rounded transition-colors duration-200"
|
|
108
|
+
}), /* @__PURE__ */ f("span", {
|
|
109
|
+
className: "text-sm text-text-secondary",
|
|
110
|
+
children: e(D, "files.shareDialog.password.require", "Require password")
|
|
111
|
+
})]
|
|
112
|
+
}),
|
|
113
|
+
R && /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f("input", {
|
|
114
|
+
type: "password",
|
|
115
|
+
value: B,
|
|
116
|
+
onChange: (e) => V(e.target.value),
|
|
117
|
+
"aria-label": e(D, "files.shareDialog.password.label", "Password protection"),
|
|
118
|
+
placeholder: e(D, "files.shareDialog.password.placeholder", "Enter password"),
|
|
119
|
+
className: "w-full min-h-11 mt-2 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200"
|
|
120
|
+
}), /* @__PURE__ */ f("p", {
|
|
121
|
+
className: "mt-1 text-xs text-text-tertiary",
|
|
122
|
+
children: e(D, "files.shareDialog.password.help", "Password must be at least 8 characters and contain uppercase, lowercase, and number")
|
|
123
|
+
})] })
|
|
124
|
+
] })]
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ p(y, { children: [/* @__PURE__ */ f(h, {
|
|
130
|
+
type: "button",
|
|
131
|
+
variant: "outline",
|
|
132
|
+
onClick: w,
|
|
133
|
+
children: e(D, "files.common.actions.cancel", "Cancel")
|
|
134
|
+
}), /* @__PURE__ */ f(h, {
|
|
135
|
+
type: "button",
|
|
136
|
+
onClick: async () => {
|
|
137
|
+
try {
|
|
138
|
+
G(null);
|
|
139
|
+
let e = P > 0 ? new Date(Date.now() + P * 24 * 60 * 60 * 1e3).toISOString() : void 0, t = H ? "EMAIL_INVITE" : "PUBLIC_LINK", n = await T({
|
|
140
|
+
...C === "file" ? { fileId: S.id } : { folderId: S.id },
|
|
141
|
+
shareType: t,
|
|
142
|
+
accessLevel: "DOWNLOAD",
|
|
143
|
+
expiresAt: e,
|
|
144
|
+
maxDownloads: I > 0 ? I : void 0,
|
|
145
|
+
password: R && B ? B : void 0,
|
|
146
|
+
invitedEmail: H || void 0
|
|
147
|
+
});
|
|
148
|
+
j(t), k(n.publicUrl || "");
|
|
149
|
+
} catch (e) {
|
|
150
|
+
G(e instanceof Error ? e.message : "Failed to create share");
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
disabled: E || R && !B,
|
|
154
|
+
children: E ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(c, { className: "size-4 animate-spin" }), e(D, "files.shareDialog.actions.creating", "Creating...")] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(s, { className: "size-4" }), e(D, "files.shareDialog.actions.createLink", "Create share link")] })
|
|
155
|
+
})] })
|
|
156
|
+
] }) : /* @__PURE__ */ f(d, { children: /* @__PURE__ */ p("div", {
|
|
157
|
+
className: "space-y-4",
|
|
158
|
+
children: [/* @__PURE__ */ f("div", {
|
|
159
|
+
className: "bg-status-success-bg-subtle border border-status-success-border rounded-lg p-4",
|
|
160
|
+
children: A === "EMAIL_INVITE" ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f("p", {
|
|
161
|
+
className: "text-sm font-medium text-status-success-text mb-2",
|
|
162
|
+
children: e(D, "files.shareDialog.success.invitationSent", "Invitation sent successfully!")
|
|
163
|
+
}), /* @__PURE__ */ f("p", {
|
|
164
|
+
className: "text-sm text-text-secondary",
|
|
165
|
+
children: e(D, "files.shareDialog.success.invitationSentTo", "An invitation has been sent to {{email}}", { email: H })
|
|
166
|
+
})] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f("p", {
|
|
167
|
+
className: "text-sm font-medium text-status-success-text mb-2",
|
|
168
|
+
children: e(D, "files.shareDialog.success.linkCreated", "Share link created successfully!")
|
|
169
|
+
}), /* @__PURE__ */ p("div", {
|
|
170
|
+
className: "flex flex-col sm:flex-row items-stretch sm:items-center gap-2",
|
|
171
|
+
children: [/* @__PURE__ */ f("input", {
|
|
172
|
+
type: "text",
|
|
173
|
+
value: O || "",
|
|
174
|
+
readOnly: !0,
|
|
175
|
+
"aria-label": e(D, "files.shareDialog.success.linkCreated", "Share link"),
|
|
176
|
+
className: "flex-1 min-h-11 px-3 py-2 bg-bg-surface border border-status-success-border rounded-lg text-sm"
|
|
177
|
+
}), /* @__PURE__ */ f(h, {
|
|
150
178
|
type: "button",
|
|
151
179
|
onClick: async () => {
|
|
152
|
-
|
|
153
|
-
z(null);
|
|
154
|
-
let e = O > 0 ? new Date(Date.now() + O * 24 * 60 * 60 * 1e3).toISOString() : void 0, t = I ? "EMAIL_INVITE" : "PUBLIC_LINK", n = await y({
|
|
155
|
-
..._ === "file" ? { fileId: g.id } : { folderId: g.id },
|
|
156
|
-
shareType: t,
|
|
157
|
-
accessLevel: "DOWNLOAD",
|
|
158
|
-
expiresAt: e,
|
|
159
|
-
maxDownloads: A > 0 ? A : void 0,
|
|
160
|
-
password: M && P ? P : void 0,
|
|
161
|
-
invitedEmail: I || void 0
|
|
162
|
-
});
|
|
163
|
-
T(t), C(n.publicUrl || "");
|
|
164
|
-
} catch (e) {
|
|
165
|
-
z(e instanceof Error ? e.message : "Failed to create share");
|
|
166
|
-
}
|
|
180
|
+
O && (await navigator.clipboard.writeText(O), N(!0));
|
|
167
181
|
},
|
|
168
|
-
|
|
169
|
-
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover disabled:bg-bg-muted disabled:text-text-tertiary disabled:cursor-not-allowed transition-colors duration-200",
|
|
170
|
-
children: b ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(c, { className: "size-4 animate-spin" }), e(x, "files.shareDialog.actions.creating", "Creating...")] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(s, { className: "size-4" }), e(x, "files.shareDialog.actions.createLink", "Create share link")] })
|
|
182
|
+
children: M ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(i, { className: "size-4" }), e(D, "files.shareDialog.actions.copied", "Copied!")] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(a, { className: "size-4" }), e(D, "files.common.actions.copy", "Copy")] })
|
|
171
183
|
})]
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
className: "text-sm font-medium text-status-success-text mb-2",
|
|
179
|
-
children: e(x, "files.shareDialog.success.invitationSent", "Invitation sent successfully!")
|
|
180
|
-
}), /* @__PURE__ */ p("p", {
|
|
181
|
-
className: "text-sm text-text-secondary",
|
|
182
|
-
children: e(x, "files.shareDialog.success.invitationSentTo", "An invitation has been sent to {{email}}", { email: I })
|
|
183
|
-
})] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("p", {
|
|
184
|
-
className: "text-sm font-medium text-status-success-text mb-2",
|
|
185
|
-
children: e(x, "files.shareDialog.success.linkCreated", "Share link created successfully!")
|
|
186
|
-
}), /* @__PURE__ */ m("div", {
|
|
187
|
-
className: "flex items-center gap-2",
|
|
188
|
-
children: [/* @__PURE__ */ p("input", {
|
|
189
|
-
type: "text",
|
|
190
|
-
value: S || "",
|
|
191
|
-
readOnly: !0,
|
|
192
|
-
"aria-label": e(x, "files.shareDialog.success.linkCreated", "Share link"),
|
|
193
|
-
className: "flex-1 px-3 py-2 bg-bg-surface border border-status-success-border rounded-lg text-sm"
|
|
194
|
-
}), /* @__PURE__ */ p("button", {
|
|
195
|
-
type: "button",
|
|
196
|
-
onClick: async () => {
|
|
197
|
-
S && (await navigator.clipboard.writeText(S), D(!0));
|
|
198
|
-
},
|
|
199
|
-
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200",
|
|
200
|
-
children: E ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(i, { className: "size-4" }), e(x, "files.shareDialog.actions.copied", "Copied!")] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(a, { className: "size-4" }), e(x, "files.common.actions.copy", "Copy")] })
|
|
201
|
-
})]
|
|
202
|
-
})] })
|
|
203
|
-
}), /* @__PURE__ */ p("button", {
|
|
204
|
-
type: "button",
|
|
205
|
-
onClick: v,
|
|
206
|
-
className: "w-full px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200",
|
|
207
|
-
children: e(x, "files.common.actions.done", "Done")
|
|
208
|
-
})]
|
|
184
|
+
})] })
|
|
185
|
+
}), /* @__PURE__ */ f(y, { children: /* @__PURE__ */ f(h, {
|
|
186
|
+
type: "button",
|
|
187
|
+
onClick: w,
|
|
188
|
+
className: "w-full",
|
|
189
|
+
children: e(D, "files.common.actions.done", "Done")
|
|
209
190
|
}) })]
|
|
210
|
-
})
|
|
191
|
+
}) })] })
|
|
211
192
|
});
|
|
212
193
|
}
|
|
213
194
|
//#endregion
|
|
214
|
-
export {
|
|
195
|
+
export { S as ShareDialog };
|
|
215
196
|
|
|
216
197
|
//# sourceMappingURL=ShareDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareDialog.js","names":[],"sources":["../../../src/files/components/ShareDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n X,\n Link,\n Mail,\n Calendar,\n Download,\n Lock,\n Copy,\n Check,\n Loader2,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { tWithFallback } from \"../utils/i18n\";\n\nexport interface ShareDialogInput {\n fileId?: string;\n folderId?: string;\n shareType: \"PUBLIC_LINK\" | \"EMAIL_INVITE\";\n accessLevel: \"VIEW\" | \"DOWNLOAD\" | \"EDIT\";\n expiresAt?: string;\n maxDownloads?: number;\n password?: string;\n invitedEmail?: string;\n}\n\ninterface ShareDialogProps {\n item: FileItem | FolderItem;\n itemType: \"file\" | \"folder\";\n onClose: () => void;\n onCreateShare: (\n input: ShareDialogInput,\n ) => Promise<{ publicUrl: string; token: string }>;\n isLoading?: boolean;\n}\n\nexport function ShareDialog({\n item,\n itemType,\n onClose,\n onCreateShare,\n isLoading,\n}: ShareDialogProps) {\n const { t } = useI18n();\n const [shareUrl, setShareUrl] = useState<string | null>(null);\n const [shareType, setShareType] = useState<\n \"PUBLIC_LINK\" | \"EMAIL_INVITE\" | null\n >(null);\n const [copied, setCopied] = useState(false);\n const [expiryDays, setExpiryDays] = useState<number>(7);\n const [maxDownloads, setMaxDownloads] = useState<number>(0);\n const [hasPassword, setHasPassword] = useState(false);\n const [password, setPassword] = useState(\"\");\n const [invitedEmail, setInvitedEmail] = useState(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const titleId = `share-dialog-title-${item.id}`;\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [onClose]);\n\n const handleCreateShare = async () => {\n try {\n setErrorMessage(null);\n const expiresAt =\n expiryDays > 0\n ? new Date(\n Date.now() + expiryDays * 24 * 60 * 60 * 1000,\n ).toISOString()\n : undefined;\n\n const type: ShareDialogInput[\"shareType\"] = invitedEmail\n ? \"EMAIL_INVITE\"\n : \"PUBLIC_LINK\";\n\n const shareInput: ShareDialogInput = {\n ...(itemType === \"file\" ? { fileId: item.id } : { folderId: item.id }),\n shareType: type,\n accessLevel: \"DOWNLOAD\",\n expiresAt,\n maxDownloads: maxDownloads > 0 ? maxDownloads : undefined,\n password: hasPassword && password ? password : undefined,\n invitedEmail: invitedEmail || undefined,\n };\n\n const result = await onCreateShare(shareInput);\n\n setShareType(type);\n setShareUrl(result.publicUrl || \"\");\n } catch (error) {\n setErrorMessage(\n error instanceof Error ? error.message : \"Failed to create share\",\n );\n }\n };\n\n const handleCopyLink = async () => {\n if (shareUrl) {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n }\n };\n\n // Cleanup timeout on unmount to prevent React state update warning\n useEffect(() => {\n if (copied) {\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [copied]);\n\n return (\n <div\n className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-[100] animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n >\n <div className=\"bg-bg-surface rounded-lg shadow-xl p-6 w-full max-w-md mx-4 animate-in zoom-in-95 duration-200\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 id={titleId} className=\"text-lg font-semibold text-text-primary\">\n {tWithFallback(\n t,\n \"files.shareDialog.title\",\n 'Share {{itemType}} \"{{name}}\"',\n {\n itemType: tWithFallback(\n t,\n itemType === \"folder\"\n ? \"files.shareDialog.itemType.folder\"\n : \"files.shareDialog.itemType.file\",\n itemType === \"folder\" ? \"folder\" : \"file\",\n ),\n name: item.name,\n },\n )}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-secondary transition-colors duration-200\"\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.actions.close\",\n \"Close share dialog\",\n )}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n {shareType === null ? (\n <>\n {errorMessage && (\n <div className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n\n {/* Share Settings */}\n <div className=\"space-y-4\">\n {/* Expiry */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Calendar className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.label\",\n \"Link expires in\",\n )}\n </label>\n <select\n value={expiryDays}\n onChange={(e) => setExpiryDays(Number(e.target.value))}\n className=\"w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n >\n <option value={0}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.never\",\n \"Never\",\n )}\n </option>\n <option value={1}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.oneDay\",\n \"1 day\",\n )}\n </option>\n <option value={7}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.sevenDays\",\n \"7 days\",\n )}\n </option>\n <option value={30}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.thirtyDays\",\n \"30 days\",\n )}\n </option>\n <option value={90}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.ninetyDays\",\n \"90 days\",\n )}\n </option>\n </select>\n </div>\n\n {/* Max Downloads */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Download className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.downloads.label\",\n \"Maximum downloads\",\n )}\n </label>\n <input\n type=\"number\"\n min=\"0\"\n value={maxDownloads}\n onChange={(e) => setMaxDownloads(Number(e.target.value))}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.downloads.label\",\n \"Maximum downloads\",\n )}\n placeholder={tWithFallback(\n t,\n \"files.shareDialog.downloads.placeholder\",\n \"Unlimited\",\n )}\n className=\"w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n </div>\n\n {/* Password Protection */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Lock className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.password.label\",\n \"Password protection\",\n )}\n </label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={hasPassword}\n onChange={(e) => setHasPassword(e.target.checked)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.password.require\",\n \"Require password\",\n )}\n className=\"rounded transition-colors duration-200\"\n />\n <span className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.password.require\",\n \"Require password\",\n )}\n </span>\n </div>\n {hasPassword && (\n <>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.password.label\",\n \"Password protection\",\n )}\n placeholder={tWithFallback(\n t,\n \"files.shareDialog.password.placeholder\",\n \"Enter password\",\n )}\n className=\"w-full mt-2 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n <p className=\"mt-1 text-xs text-text-tertiary\">\n {tWithFallback(\n t,\n \"files.shareDialog.password.help\",\n \"Password must be at least 8 characters and contain uppercase, lowercase, and number\",\n )}\n </p>\n </>\n )}\n </div>\n\n {/* Invited Email */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Mail className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.invite.label\",\n \"Invite specific person (optional)\",\n )}\n </label>\n <input\n type=\"email\"\n value={invitedEmail}\n onChange={(e) => setInvitedEmail(e.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.invite.label\",\n \"Invite specific person (optional)\",\n )}\n placeholder=\"user@example.com\"\n className=\"w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n <p className=\"mt-1 text-xs text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.invite.help\",\n \"Leave empty for public link\",\n )}\n </p>\n </div>\n </div>\n\n {/* Create Button */}\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n >\n {tWithFallback(t, \"files.common.actions.cancel\", \"Cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={handleCreateShare}\n disabled={isLoading || (hasPassword && !password)}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover disabled:bg-bg-muted disabled:text-text-tertiary disabled:cursor-not-allowed transition-colors duration-200\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.creating\",\n \"Creating...\",\n )}\n </>\n ) : (\n <>\n <Link className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.createLink\",\n \"Create share link\",\n )}\n </>\n )}\n </button>\n </div>\n </>\n ) : (\n <>\n {/* Share Created Success */}\n <div className=\"space-y-4\">\n <div className=\"bg-status-success-bg-subtle border border-status-success-border rounded-lg p-4\">\n {shareType === \"EMAIL_INVITE\" ? (\n <>\n <p className=\"text-sm font-medium text-status-success-text mb-2\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.invitationSent\",\n \"Invitation sent successfully!\",\n )}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.invitationSentTo\",\n \"An invitation has been sent to {{email}}\",\n { email: invitedEmail },\n )}\n </p>\n </>\n ) : (\n <>\n <p className=\"text-sm font-medium text-status-success-text mb-2\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.linkCreated\",\n \"Share link created successfully!\",\n )}\n </p>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={shareUrl || \"\"}\n readOnly\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.success.linkCreated\",\n \"Share link\",\n )}\n className=\"flex-1 px-3 py-2 bg-bg-surface border border-status-success-border rounded-lg text-sm\"\n />\n <button\n type=\"button\"\n onClick={handleCopyLink}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200\"\n >\n {copied ? (\n <>\n <Check className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.copied\",\n \"Copied!\",\n )}\n </>\n ) : (\n <>\n <Copy className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.common.actions.copy\",\n \"Copy\",\n )}\n </>\n )}\n </button>\n </div>\n </>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200\"\n >\n {tWithFallback(t, \"files.common.actions.done\", \"Done\")}\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAqCA,SAAgB,EAAY,EAC1B,SACA,aACA,YACA,kBACA,gBACmB;CACnB,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAU,KAAe,EAAwB,KAAK,EACvD,CAAC,GAAW,KAAgB,EAEhC,KAAK,EACD,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,CAAC,GAAY,KAAiB,EAAiB,EAAE,EACjD,CAAC,GAAc,KAAmB,EAAiB,EAAE,EACrD,CAAC,GAAa,KAAkB,EAAS,GAAM,EAC/C,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAc,KAAmB,EAAS,GAAG,EAC9C,CAAC,GAAc,KAAmB,EAAwB,KAAK,EAC/D,IAAU,sBAAsB,EAAK;AAgE3C,QA9DA,QAAgB;EACd,IAAM,KAAgB,MAAyB;AAC7C,GAAI,EAAM,QAAQ,YAChB,GAAS;;AAKb,SADA,SAAS,iBAAiB,WAAW,EAAa,QACrC,SAAS,oBAAoB,WAAW,EAAa;IACjE,CAAC,EAAQ,CAAC,EA6Cb,QAAgB;AACd,MAAI,GAAQ;GACV,IAAM,IAAQ,iBAAiB,EAAU,GAAM,EAAE,IAAK;AACtD,gBAAa,aAAa,EAAM;;IAGjC,CAAC,EAAO,CAAC,EAGV,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,cAAW;EACX,mBAAiB;YAEjB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,IAAI;KAAS,WAAU;eACxB,EACC,GACA,2BACA,mCACA;MACE,UAAU,EACR,GACA,MAAa,WACT,sCACA,mCACJ,MAAa,WAAW,WAAW,OACpC;MACD,MAAM,EAAK;MACZ,CACF;KACE,CAAA,EACL,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;KACV,cAAY,EACV,GACA,mCACA,qBACD;eAED,kBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;KACjB,CAAA,CACL;OAEL,MAAc,OACb,kBAAA,GAAA,EAAA,UAAA;IACG,KACC,kBAAC,OAAD;KAAK,WAAU;eACZ;KACG,CAAA;IAIR,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAC9B,EACC,GACA,kCACA,kBACD,CACK;UACR,kBAAC,UAAD;OACE,OAAO;OACP,WAAW,MAAM,EAAc,OAAO,EAAE,OAAO,MAAM,CAAC;OACtD,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAO;mBACZ,EACC,GACA,0CACA,QACD;SACM,CAAA;QACT,kBAAC,UAAD;SAAQ,OAAO;mBACZ,EACC,GACA,2CACA,QACD;SACM,CAAA;QACT,kBAAC,UAAD;SAAQ,OAAO;mBACZ,EACC,GACA,8CACA,SACD;SACM,CAAA;QACT,kBAAC,UAAD;SAAQ,OAAO;mBACZ,EACC,GACA,+CACA,UACD;SACM,CAAA;QACT,kBAAC,UAAD;SAAQ,OAAO;mBACZ,EACC,GACA,+CACA,UACD;SACM,CAAA;QACF;SACL,EAAA,CAAA;MAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAC9B,EACC,GACA,qCACA,oBACD,CACK;UACR,kBAAC,SAAD;OACE,MAAK;OACL,KAAI;OACJ,OAAO;OACP,WAAW,MAAM,EAAgB,OAAO,EAAE,OAAO,MAAM,CAAC;OACxD,cAAY,EACV,GACA,qCACA,oBACD;OACD,aAAa,EACX,GACA,2CACA,YACD;OACD,WAAU;OACV,CAAA,CACE,EAAA,CAAA;MAGN,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAC1B,EACC,GACA,oCACA,sBACD,CACK;;OACR,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,SAAD;SACE,MAAK;SACL,SAAS;SACT,WAAW,MAAM,EAAe,EAAE,OAAO,QAAQ;SACjD,cAAY,EACV,GACA,sCACA,mBACD;SACD,WAAU;SACV,CAAA,EACF,kBAAC,QAAD;SAAM,WAAU;mBACb,EACC,GACA,sCACA,mBACD;SACI,CAAA,CACH;;OACL,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM;QAC5C,cAAY,EACV,GACA,oCACA,sBACD;QACD,aAAa,EACX,GACA,0CACA,iBACD;QACD,WAAU;QACV,CAAA,EACF,kBAAC,KAAD;QAAG,WAAU;kBACV,EACC,GACA,mCACA,sFACD;QACC,CAAA,CACH,EAAA,CAAA;OAED,EAAA,CAAA;MAGN,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAC1B,EACC,GACA,kCACA,oCACD,CACK;;OACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;QAChD,cAAY,EACV,GACA,kCACA,oCACD;QACD,aAAY;QACZ,WAAU;QACV,CAAA;OACF,kBAAC,KAAD;QAAG,WAAU;kBACV,EACC,GACA,iCACA,8BACD;QACC,CAAA;OACA,EAAA,CAAA;MACF;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,WAAU;gBAET,EAAc,GAAG,+BAA+B,SAAS;MACnD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SA7RY,YAAY;AACpC,WAAI;AACF,UAAgB,KAAK;QACrB,IAAM,IACJ,IAAa,IACT,IAAI,KACF,KAAK,KAAK,GAAG,IAAa,KAAK,KAAK,KAAK,IAC1C,CAAC,aAAa,GACf,KAAA,GAEA,IAAsC,IACxC,iBACA,eAYE,IAAS,MAAM,EAVgB;SACnC,GAAI,MAAa,SAAS,EAAE,QAAQ,EAAK,IAAI,GAAG,EAAE,UAAU,EAAK,IAAI;SACrE,WAAW;SACX,aAAa;SACb;SACA,cAAc,IAAe,IAAI,IAAe,KAAA;SAChD,UAAU,KAAe,IAAW,IAAW,KAAA;SAC/C,cAAc,KAAgB,KAAA;SAC/B,CAE6C;AAG9C,QADA,EAAa,EAAK,EAClB,EAAY,EAAO,aAAa,GAAG;gBAC5B,GAAO;AACd,UACE,aAAiB,QAAQ,EAAM,UAAU,yBAC1C;;;MA+PS,UAAU,KAAc,KAAe,CAAC;MACxC,WAAU;gBAET,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAS,WAAU,uBAAwB,CAAA,EAC1C,EACC,GACA,sCACA,cACD,CACA,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAC1B,EACC,GACA,wCACA,oBACD,CACA,EAAA,CAAA;MAEE,CAAA,CACL;;IACL,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACZ,MAAc,iBACb,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,GACA,4CACA,gCACD;MACC,CAAA,EACJ,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,GACA,8CACA,4CACA,EAAE,OAAO,GAAc,CACxB;MACC,CAAA,CACH,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,GACA,yCACA,mCACD;MACC,CAAA,EACJ,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OACE,MAAK;OACL,OAAO,KAAY;OACnB,UAAA;OACA,cAAY,EACV,GACA,yCACA,aACD;OACD,WAAU;OACV,CAAA,EACF,kBAAC,UAAD;OACE,MAAK;OACL,SAlUC,YAAY;AACjC,QAAI,MACF,MAAM,UAAU,UAAU,UAAU,EAAS,EAC7C,EAAU,GAAK;;OAgUG,WAAU;iBAET,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA,EAC3B,EACC,GACA,oCACA,UACD,CACA,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAC1B,EACC,GACA,6BACA,OACD,CACA,EAAA,CAAA;OAEE,CAAA,CACL;QACL,EAAA,CAAA;KAED,CAAA,EAEN,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;eAET,EAAc,GAAG,6BAA6B,OAAO;KAC/C,CAAA,CACL;OACL,CAAA,CAED;;EACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"ShareDialog.js","names":[],"sources":["../../../src/files/components/ShareDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n Link,\n Mail,\n Calendar,\n Download,\n Lock,\n Copy,\n Check,\n Loader2,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogFooter,\n OptionalFields,\n Button,\n} from \"@burdenoff/fe-libs/ui\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { tWithFallback } from \"../utils/i18n\";\n\nexport interface ShareDialogInput {\n fileId?: string;\n folderId?: string;\n shareType: \"PUBLIC_LINK\" | \"EMAIL_INVITE\";\n accessLevel: \"VIEW\" | \"DOWNLOAD\" | \"EDIT\";\n expiresAt?: string;\n maxDownloads?: number;\n password?: string;\n invitedEmail?: string;\n}\n\ninterface ShareDialogProps {\n item: FileItem | FolderItem;\n itemType: \"file\" | \"folder\";\n onClose: () => void;\n onCreateShare: (\n input: ShareDialogInput,\n ) => Promise<{ publicUrl: string; token: string }>;\n isLoading?: boolean;\n}\n\nexport function ShareDialog({\n item,\n itemType,\n onClose,\n onCreateShare,\n isLoading,\n}: ShareDialogProps) {\n const { t } = useI18n();\n const [shareUrl, setShareUrl] = useState<string | null>(null);\n const [shareType, setShareType] = useState<\n \"PUBLIC_LINK\" | \"EMAIL_INVITE\" | null\n >(null);\n const [copied, setCopied] = useState(false);\n const [expiryDays, setExpiryDays] = useState<number>(7);\n const [maxDownloads, setMaxDownloads] = useState<number>(0);\n const [hasPassword, setHasPassword] = useState(false);\n const [password, setPassword] = useState(\"\");\n const [invitedEmail, setInvitedEmail] = useState(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const handleCreateShare = async () => {\n try {\n setErrorMessage(null);\n const expiresAt =\n expiryDays > 0\n ? new Date(\n Date.now() + expiryDays * 24 * 60 * 60 * 1000,\n ).toISOString()\n : undefined;\n\n const type: ShareDialogInput[\"shareType\"] = invitedEmail\n ? \"EMAIL_INVITE\"\n : \"PUBLIC_LINK\";\n\n const shareInput: ShareDialogInput = {\n ...(itemType === \"file\" ? { fileId: item.id } : { folderId: item.id }),\n shareType: type,\n accessLevel: \"DOWNLOAD\",\n expiresAt,\n maxDownloads: maxDownloads > 0 ? maxDownloads : undefined,\n password: hasPassword && password ? password : undefined,\n invitedEmail: invitedEmail || undefined,\n };\n\n const result = await onCreateShare(shareInput);\n\n setShareType(type);\n setShareUrl(result.publicUrl || \"\");\n } catch (error) {\n setErrorMessage(\n error instanceof Error ? error.message : \"Failed to create share\",\n );\n }\n };\n\n const handleCopyLink = async () => {\n if (shareUrl) {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n }\n };\n\n useEffect(() => {\n if (copied) {\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [copied]);\n\n return (\n <ResponsiveDialog\n open\n onOpenChange={(next: boolean) => {\n if (!next) onClose();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {tWithFallback(\n t,\n \"files.shareDialog.title\",\n 'Share {{itemType}} \"{{name}}\"',\n {\n itemType: tWithFallback(\n t,\n itemType === \"folder\"\n ? \"files.shareDialog.itemType.folder\"\n : \"files.shareDialog.itemType.file\",\n itemType === \"folder\" ? \"folder\" : \"file\",\n ),\n name: item.name,\n },\n )}\n </ResponsiveDialogTitle>\n </ResponsiveDialogHeader>\n\n {shareType === null ? (\n <>\n {errorMessage && (\n <div className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* Expiry — smart-default field, visible above the fold */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Calendar className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.label\",\n \"Link expires in\",\n )}\n </label>\n <select\n value={expiryDays}\n onChange={(e) => setExpiryDays(Number(e.target.value))}\n className=\"w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n >\n <option value={0}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.never\",\n \"Never\",\n )}\n </option>\n <option value={1}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.oneDay\",\n \"1 day\",\n )}\n </option>\n <option value={7}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.sevenDays\",\n \"7 days\",\n )}\n </option>\n <option value={30}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.thirtyDays\",\n \"30 days\",\n )}\n </option>\n <option value={90}>\n {tWithFallback(\n t,\n \"files.shareDialog.expiry.options.ninetyDays\",\n \"90 days\",\n )}\n </option>\n </select>\n </div>\n\n {/* Invited Email — smart-default; \"leave empty for public link\" */}\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Mail className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.invite.label\",\n \"Invite specific person (optional)\",\n )}\n </label>\n <input\n type=\"email\"\n value={invitedEmail}\n onChange={(e) => setInvitedEmail(e.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.invite.label\",\n \"Invite specific person (optional)\",\n )}\n placeholder=\"user@example.com\"\n className=\"w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n <p className=\"mt-1 text-xs text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.invite.help\",\n \"Leave empty for public link\",\n )}\n </p>\n </div>\n\n {/* Advanced: ACL overrides + retention */}\n <OptionalFields\n title={tWithFallback(\n t,\n \"files.shareDialog.advanced.title\",\n \"Advanced\",\n )}\n description={tWithFallback(\n t,\n \"files.shareDialog.advanced.description\",\n \"Download limits and password protection\",\n )}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Download className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.downloads.label\",\n \"Maximum downloads\",\n )}\n </label>\n <input\n type=\"number\"\n min=\"0\"\n value={maxDownloads}\n onChange={(e) => setMaxDownloads(Number(e.target.value))}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.downloads.label\",\n \"Maximum downloads\",\n )}\n placeholder={tWithFallback(\n t,\n \"files.shareDialog.downloads.placeholder\",\n \"Unlimited\",\n )}\n className=\"w-full min-h-11 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n </div>\n\n <div>\n <label className=\"flex items-center gap-2 text-sm font-medium text-text-primary mb-2\">\n <Lock className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.password.label\",\n \"Password protection\",\n )}\n </label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={hasPassword}\n onChange={(e) => setHasPassword(e.target.checked)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.password.require\",\n \"Require password\",\n )}\n className=\"rounded transition-colors duration-200\"\n />\n <span className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.password.require\",\n \"Require password\",\n )}\n </span>\n </div>\n {hasPassword && (\n <>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.password.label\",\n \"Password protection\",\n )}\n placeholder={tWithFallback(\n t,\n \"files.shareDialog.password.placeholder\",\n \"Enter password\",\n )}\n className=\"w-full min-h-11 mt-2 px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:border-action-primary-border text-sm transition-colors duration-200\"\n />\n <p className=\"mt-1 text-xs text-text-tertiary\">\n {tWithFallback(\n t,\n \"files.shareDialog.password.help\",\n \"Password must be at least 8 characters and contain uppercase, lowercase, and number\",\n )}\n </p>\n </>\n )}\n </div>\n </div>\n </OptionalFields>\n </div>\n\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n {tWithFallback(t, \"files.common.actions.cancel\", \"Cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={handleCreateShare}\n disabled={isLoading || (hasPassword && !password)}\n >\n {isLoading ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.creating\",\n \"Creating...\",\n )}\n </>\n ) : (\n <>\n <Link className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.createLink\",\n \"Create share link\",\n )}\n </>\n )}\n </Button>\n </ResponsiveDialogFooter>\n </>\n ) : (\n <>\n <div className=\"space-y-4\">\n <div className=\"bg-status-success-bg-subtle border border-status-success-border rounded-lg p-4\">\n {shareType === \"EMAIL_INVITE\" ? (\n <>\n <p className=\"text-sm font-medium text-status-success-text mb-2\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.invitationSent\",\n \"Invitation sent successfully!\",\n )}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.invitationSentTo\",\n \"An invitation has been sent to {{email}}\",\n { email: invitedEmail },\n )}\n </p>\n </>\n ) : (\n <>\n <p className=\"text-sm font-medium text-status-success-text mb-2\">\n {tWithFallback(\n t,\n \"files.shareDialog.success.linkCreated\",\n \"Share link created successfully!\",\n )}\n </p>\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n <input\n type=\"text\"\n value={shareUrl || \"\"}\n readOnly\n aria-label={tWithFallback(\n t,\n \"files.shareDialog.success.linkCreated\",\n \"Share link\",\n )}\n className=\"flex-1 min-h-11 px-3 py-2 bg-bg-surface border border-status-success-border rounded-lg text-sm\"\n />\n <Button type=\"button\" onClick={handleCopyLink}>\n {copied ? (\n <>\n <Check className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.shareDialog.actions.copied\",\n \"Copied!\",\n )}\n </>\n ) : (\n <>\n <Copy className=\"size-4\" />\n {tWithFallback(\n t,\n \"files.common.actions.copy\",\n \"Copy\",\n )}\n </>\n )}\n </Button>\n </div>\n </>\n )}\n </div>\n\n <ResponsiveDialogFooter>\n <Button type=\"button\" onClick={onClose} className=\"w-full\">\n {tWithFallback(t, \"files.common.actions.done\", \"Done\")}\n </Button>\n </ResponsiveDialogFooter>\n </div>\n </>\n )}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1078,7 +1078,18 @@ e`
|
|
|
1078
1078
|
}
|
|
1079
1079
|
}
|
|
1080
1080
|
}
|
|
1081
|
-
${p}
|
|
1081
|
+
${p}`, e`
|
|
1082
|
+
query GetUserStorageUsage {
|
|
1083
|
+
getUserStorageUsage {
|
|
1084
|
+
userId
|
|
1085
|
+
currentBytes
|
|
1086
|
+
limitBytes
|
|
1087
|
+
planId
|
|
1088
|
+
planName
|
|
1089
|
+
source
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
`;
|
|
1082
1093
|
//#endregion
|
|
1083
1094
|
export { h as AccessShareDocument, _ as useBulkDeleteFilesMutation, y as useCompleteUploadMutation, x as useCopyFileMutation, C as useCreateFolderMutation, T as useCreateFolderShareMutation, D as useCreateShareMutation, k as useDeleteFileMutation, j as useDeleteFileVersionMutation, N as useDeleteFolderMutation, ve as useGetFileVersionDownloadUrlLazyQuery, be as useGetFileVersionsQuery, se as useGetFilesBinPageQuery, le as useGetFilesFolderBrowsePageQuery, de as useGetFilesRecentPageQuery, pe as useGetFilesRootBrowsePageQuery, me as useGetFilesStarredPageQuery, Se as useGetFoldersQuery, F as useInitiateUploadMutation, L as useMoveFileMutation, z as useMoveFolderMutation, V as usePermanentlyDeleteFileMutation, H as usePermanentlyDeleteFolderMutation, W as useRestoreFileMutation, K as useRestoreFileVersionMutation, J as useRestoreFolderMutation, ge as useSearchFilesPageQuery, X as useToggleFileStarredMutation, Q as useToggleFolderStarredMutation, re as useUpdateFileMutation, ae as useUpdateFolderMutation };
|
|
1084
1095
|
|