@yourgoods/ui-smart 0.3.0 → 0.5.0

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.
@@ -0,0 +1,272 @@
1
+ import { defineComponent as ye, ref as a, reactive as _, computed as u, watch as Z, onMounted as Ce, createElementBlock as S, openBlock as g, Fragment as ge, createVNode as n, unref as o, withCtx as m, createCommentVNode as ee, createElementVNode as r, toDisplayString as V, createBlock as B, resolveDynamicComponent as $, createTextVNode as z } from "vue";
2
+ import { C as I, p as D, g as Ve } from "./index-D0TK0qAd.js";
3
+ import { PDialog as be, PInput as M, IconEyeMd as O, IconEyeClosedMd as U, PButton as F, PTopBar as Te, IconCrossMd as Ie, PTeleportContainer as xe } from "@profeat/ui-kit";
4
+ function ke(b) {
5
+ return { showPasswordRateLimitToast: (P) => {
6
+ if (!P) return;
7
+ const { attemptsLeft: l, retryAfterSec: y } = P;
8
+ if (l === 2) {
9
+ b("on-toast", {
10
+ color: "error",
11
+ text: "Осталось 2 попытки. Ввод пароля будет заблокирован на 5 минут."
12
+ });
13
+ return;
14
+ }
15
+ if (l === 1) {
16
+ b("on-toast", {
17
+ color: "error",
18
+ text: "Осталась 1 попытка. После исчерпания лимита ввод пароля будет заблокирован на 1 час."
19
+ });
20
+ return;
21
+ }
22
+ if (l === 0) {
23
+ const v = y && y > 0 ? y : 3600;
24
+ b("on-toast", {
25
+ color: "error",
26
+ text: `Достигнут лимит попыток ввода пароля. Попробуйте снова через ${Math.ceil(v / 60)} минут.`
27
+ });
28
+ return;
29
+ }
30
+ } };
31
+ }
32
+ const Ee = { class: "text-center w-full" }, he = { class: "dialogTitle" }, Le = {
33
+ key: 0,
34
+ class: "dialogDefaultContainer"
35
+ }, De = { class: "dialogDefaultContainerInsideContent" }, Ne = { class: "dialogDefaultContainerTextHint" }, Re = { class: "input-wrapper" }, _e = {
36
+ key: 1,
37
+ class: "dialogDefaultContainer"
38
+ }, Se = { class: "dialogDefaultContainerInsideContent" }, Be = { class: "input-wrapper" }, $e = { class: "input-wrapper" }, ze = { style: { width: "100%", display: "flex" } }, se = 8, Fe = /* @__PURE__ */ ye({
39
+ __name: "ProfilePasswordDialog",
40
+ props: {
41
+ modelValue: { type: Boolean },
42
+ title: { default: "Смена пароля" },
43
+ hintText: { default: "Введите ваш текущий пароль" },
44
+ oldPassword: { default: "" }
45
+ },
46
+ emits: ["update:modelValue", "submit", "edit", "close", "on-update-jwt", "on-password-error", "on-password-success", "on-toast"],
47
+ setup(b, { emit: H }) {
48
+ const P = b, l = H, y = a(!0), v = a(P.modelValue), p = _({ oldPassword: P.oldPassword ?? "" }), i = a(""), f = a(""), j = _({ oldPassword: !1 }), w = _({ newPassword: !1, newPasswordConfirm: !1 }), c = a(I.OLD), C = a(null), A = a(!1), x = a(!1), { showPasswordRateLimitToast: te } = ke(l), k = a(!1), oe = u(() => k.value ? "text" : "password"), ae = () => k.value = !k.value, E = a(!1), h = a(!1), le = u(() => E.value ? "text" : "password"), re = u(() => h.value ? "text" : "password"), ne = () => {
49
+ E.value = !E.value;
50
+ }, ie = () => {
51
+ h.value = !h.value;
52
+ }, G = (t) => {
53
+ if (!t) return;
54
+ te(t);
55
+ const e = t.secondsRemaining ?? 0;
56
+ e > 0 && (x.value = !0, setTimeout(() => {
57
+ x.value = !1;
58
+ }, e * 1e3));
59
+ }, L = a(!1), de = u(() => L.value ? "Неверный текущий пароль" : j.oldPassword && !p.oldPassword.trim() ? "Введите пароль" : ""), ue = u(() => !p.oldPassword.trim()), we = u(() => A.value || !i.value.trim() || !f.value.trim() ? !0 : Q.value);
60
+ Z(
61
+ () => P.modelValue,
62
+ (t) => v.value = t
63
+ ), Z(v, (t) => l("update:modelValue", t));
64
+ const ce = async (t = "email") => {
65
+ var s;
66
+ const e = await Ve("/users/profile/session/get-edit-session", { params: { field: t } });
67
+ return ((s = e.data) == null ? void 0 : s.data) ?? e.data;
68
+ }, N = async (t = "email") => {
69
+ var s;
70
+ const e = await D("/users/profile/session/create-if-not-exists", { field: t, oldValue: p.oldPassword });
71
+ return ((s = e.data) == null ? void 0 : s.data) ?? e.data;
72
+ }, ve = async () => {
73
+ await D("/users/profile/password/init", { never_: "never" });
74
+ }, pe = async () => {
75
+ await D("/users/profile/password/update", {
76
+ sessionId: C.value,
77
+ newPassword: i.value.trim(),
78
+ confirmPassword: f.value.trim()
79
+ });
80
+ }, W = async (t = "password") => {
81
+ try {
82
+ const e = await ce(t);
83
+ if (C.value = e.sessionId, c.value = e.step, !e.sessionId) {
84
+ const s = await N(t);
85
+ C.value = s.sessionId, c.value = s.step;
86
+ }
87
+ } catch {
88
+ const s = await N(t);
89
+ C.value = s.sessionId, c.value = s.step;
90
+ }
91
+ }, R = () => {
92
+ l("close"), v.value = !1;
93
+ }, q = (t) => {
94
+ j[t] = !0, L.value = !1;
95
+ }, fe = async () => {
96
+ var t, e, s;
97
+ L.value = !1;
98
+ try {
99
+ await W("password");
100
+ const T = await D("/users/profile/password/match", {
101
+ sessionId: C.value,
102
+ password: p.oldPassword
103
+ }), d = ((t = T.data) == null ? void 0 : t.data) ?? T.data, X = d == null ? void 0 : d.passwordRateLimit;
104
+ if (X && G(X), !(d != null && d.success)) {
105
+ L.value = !0;
106
+ return;
107
+ }
108
+ const Y = await N("password");
109
+ C.value = Y.sessionId, c.value = Y.step;
110
+ } catch (T) {
111
+ const d = (s = (e = T.response) == null ? void 0 : e.data) == null ? void 0 : s.passwordRateLimit;
112
+ d && G(d), console.error(T);
113
+ }
114
+ }, me = async () => {
115
+ if (!Q.value)
116
+ try {
117
+ await pe(), c.value = I.COMPLETED, l("on-update-jwt", "password", "edit", i.value), l("on-toast", { color: "success", text: "Пароль изменён" }), l("close");
118
+ } catch {
119
+ }
120
+ }, Pe = async () => {
121
+ i.value = "", f.value = "", w.newPassword = !1, w.newPasswordConfirm = !1, c.value = I.OLD, p.oldPassword = "", l("close");
122
+ }, J = u(() => w.newPassword ? i.value.trim() ? i.value.trim().length < se ? `Пароль слишком короткий. Введите хотя бы ${se} символов` : "" : "Введите пароль" : ""), K = u(() => w.newPasswordConfirm ? f.value.trim() ? f.value !== i.value ? "Пароли не совпадают" : "" : "Повторите пароль" : ""), Q = u(() => !!J.value || !!K.value);
123
+ return Ce(async () => {
124
+ y.value = !0;
125
+ try {
126
+ await ve(), await W("password");
127
+ } finally {
128
+ y.value = !1;
129
+ }
130
+ }), (t, e) => (g(), S(ge, null, [
131
+ n(o(be), {
132
+ modelValue: v.value,
133
+ "onUpdate:modelValue": [
134
+ e[9] || (e[9] = (s) => v.value = s),
135
+ R
136
+ ],
137
+ width: "small",
138
+ "auto-height": !0,
139
+ "close-on-click-outside": !0,
140
+ "onClick:outside": R
141
+ }, {
142
+ header: m(() => [
143
+ r("div", Ee, [
144
+ n(o(Te), {
145
+ "slot-left": !1,
146
+ size: "small",
147
+ borded: !0,
148
+ "no-padding": !1
149
+ }, {
150
+ title: m(() => [
151
+ r("span", he, V(t.title), 1)
152
+ ]),
153
+ "right-button": m(() => [
154
+ n(o(Ie), {
155
+ class: "cross",
156
+ onClick: R
157
+ })
158
+ ]),
159
+ _: 1
160
+ })
161
+ ])
162
+ ]),
163
+ default: m(() => [
164
+ c.value === o(I).OLD ? (g(), S("div", Le, [
165
+ r("div", De, [
166
+ r("div", Ne, V(t.hintText), 1),
167
+ r("div", Re, [
168
+ n(o(M), {
169
+ modelValue: p.oldPassword,
170
+ "onUpdate:modelValue": e[0] || (e[0] = (s) => p.oldPassword = s),
171
+ size: "large",
172
+ "text-size": "medium",
173
+ label: "Текущий пароль",
174
+ type: oe.value,
175
+ error: de.value,
176
+ disabled: x.value,
177
+ onBlur: e[1] || (e[1] = (s) => q("oldPassword")),
178
+ onInput: e[2] || (e[2] = (s) => q("oldPassword"))
179
+ }, null, 8, ["modelValue", "type", "error", "disabled"]),
180
+ (g(), B($(k.value ? o(O) : o(U)), {
181
+ class: "icon-locked",
182
+ onClick: ae
183
+ }))
184
+ ]),
185
+ n(o(F), {
186
+ style: { width: "100%" },
187
+ disabled: ue.value || x.value,
188
+ onClick: fe
189
+ }, {
190
+ default: m(() => e[10] || (e[10] = [
191
+ z(V("Продолжить"))
192
+ ])),
193
+ _: 1,
194
+ __: [10]
195
+ }, 8, ["disabled"])
196
+ ])
197
+ ])) : ee("", !0),
198
+ c.value === o(I).NEW ? (g(), S("div", _e, [
199
+ r("div", Se, [
200
+ e[14] || (e[14] = r("div", { class: "dialogDefaultContainerTextHint" }, V("Установите новый пароль для защиты аккаунта. Пароль должен содержать не менее 8 символов."), -1)),
201
+ r("div", Be, [
202
+ n(o(M), {
203
+ modelValue: i.value,
204
+ "onUpdate:modelValue": e[3] || (e[3] = (s) => i.value = s),
205
+ size: "large",
206
+ "text-size": "medium",
207
+ label: "Новый пароль",
208
+ type: le.value,
209
+ error: J.value,
210
+ onBlur: e[4] || (e[4] = (s) => w.newPassword = !0),
211
+ onInput: e[5] || (e[5] = (s) => w.newPassword = !0)
212
+ }, null, 8, ["modelValue", "type", "error"]),
213
+ (g(), B($(E.value ? o(O) : o(U)), {
214
+ class: "icon-locked",
215
+ onClick: ne
216
+ }))
217
+ ]),
218
+ r("div", $e, [
219
+ n(o(M), {
220
+ modelValue: f.value,
221
+ "onUpdate:modelValue": e[6] || (e[6] = (s) => f.value = s),
222
+ size: "large",
223
+ "text-size": "medium",
224
+ label: "Повторите новый пароль",
225
+ type: re.value,
226
+ error: K.value,
227
+ onBlur: e[7] || (e[7] = (s) => w.newPasswordConfirm = !0),
228
+ onInput: e[8] || (e[8] = (s) => w.newPasswordConfirm = !0)
229
+ }, null, 8, ["modelValue", "type", "error"]),
230
+ (g(), B($(h.value ? o(O) : o(U)), {
231
+ class: "icon-locked",
232
+ onClick: ie
233
+ }))
234
+ ]),
235
+ r("div", ze, [
236
+ n(o(F), {
237
+ style: { width: "100%" },
238
+ color: "secondary",
239
+ disabled: A.value,
240
+ onClick: Pe
241
+ }, {
242
+ default: m(() => e[11] || (e[11] = [
243
+ z(V("Отмена"))
244
+ ])),
245
+ _: 1,
246
+ __: [11]
247
+ }, 8, ["disabled"]),
248
+ e[13] || (e[13] = r("div", { style: { width: "5%" } }, null, -1)),
249
+ n(o(F), {
250
+ style: { width: "100%" },
251
+ disabled: we.value,
252
+ onClick: me
253
+ }, {
254
+ default: m(() => e[12] || (e[12] = [
255
+ z(V("Сохранить"))
256
+ ])),
257
+ _: 1,
258
+ __: [12]
259
+ }, 8, ["disabled"])
260
+ ])
261
+ ])
262
+ ])) : ee("", !0)
263
+ ]),
264
+ _: 1
265
+ }, 8, ["modelValue"]),
266
+ n(o(xe))
267
+ ], 64));
268
+ }
269
+ });
270
+ export {
271
+ Fe as default
272
+ };