fix(admin): clear user route on modal close
This commit is contained in:
@@ -422,6 +422,13 @@
|
|||||||
usersStore.openUser(uid);
|
usersStore.openUser(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function closeUserCard() {
|
||||||
|
usersStore.closeUser({ skipPush: true });
|
||||||
|
if (active === "users" || active === "payments") {
|
||||||
|
onSectionChange(active);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function resolvedAvatarUrl(user) {
|
function resolvedAvatarUrl(user) {
|
||||||
return userAvatarUrl(user) || (user?.email ? gravatarCache.gravatarUrl(user.email) : "");
|
return userAvatarUrl(user) || (user?.email ? gravatarCache.gravatarUrl(user.email) : "");
|
||||||
}
|
}
|
||||||
@@ -892,4 +899,5 @@
|
|||||||
{trafficPercentValue}
|
{trafficPercentValue}
|
||||||
{trafficLeftLabel}
|
{trafficLeftLabel}
|
||||||
{trafficOfLabel}
|
{trafficOfLabel}
|
||||||
|
onClose={closeUserCard}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
export let userTelegramProfileLink = () => "";
|
export let userTelegramProfileLink = () => "";
|
||||||
export let userTelegramProfileLinkKind = () => "";
|
export let userTelegramProfileLinkKind = () => "";
|
||||||
export let openTelegramProfileLink = () => false;
|
export let openTelegramProfileLink = () => false;
|
||||||
|
export let onClose = () => usersStore.closeUser();
|
||||||
|
|
||||||
let avatarPreviewOpen = false;
|
let avatarPreviewOpen = false;
|
||||||
let avatarPreviewUrl = "";
|
let avatarPreviewUrl = "";
|
||||||
@@ -184,7 +185,7 @@
|
|||||||
: ""}
|
: ""}
|
||||||
description={openedUser?.username ? "@" + openedUser.username : ""}
|
description={openedUser?.username ? "@" + openedUser.username : ""}
|
||||||
closeLabel={at("close", {}, "Закрыть")}
|
closeLabel={at("close", {}, "Закрыть")}
|
||||||
onclose={usersStore.closeUser}
|
onclose={onClose}
|
||||||
class="admin-dialog admin-user-dialog"
|
class="admin-dialog admin-user-dialog"
|
||||||
>
|
>
|
||||||
{#if openedUser}
|
{#if openedUser}
|
||||||
|
|||||||
@@ -16,17 +16,6 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
usersSort: "",
|
usersSort: "",
|
||||||
usersLoading: false,
|
usersLoading: false,
|
||||||
|
|
||||||
..._closedUserModalState(),
|
|
||||||
userReferralsPageSize: USERS_PAGE_SIZE,
|
|
||||||
userLogsPageSize: USER_LOGS_PAGE_SIZE,
|
|
||||||
});
|
|
||||||
|
|
||||||
let _activeRef = "stats"; // fallback if active isn't tracked
|
|
||||||
let _pathContext = null;
|
|
||||||
let _openUserRequestId = 0;
|
|
||||||
|
|
||||||
function _closedUserModalState() {
|
|
||||||
return {
|
|
||||||
openedUser: null,
|
openedUser: null,
|
||||||
openedUserDetail: null,
|
openedUserDetail: null,
|
||||||
userDetailLoading: false,
|
userDetailLoading: false,
|
||||||
@@ -42,6 +31,7 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
userReferrals: [],
|
userReferrals: [],
|
||||||
userReferralsTotal: 0,
|
userReferralsTotal: 0,
|
||||||
userReferralsPage: 0,
|
userReferralsPage: 0,
|
||||||
|
userReferralsPageSize: USERS_PAGE_SIZE,
|
||||||
userReferralsInviter: null,
|
userReferralsInviter: null,
|
||||||
userDetailTab: "profile",
|
userDetailTab: "profile",
|
||||||
premiumUnlimitedDraft: false,
|
premiumUnlimitedDraft: false,
|
||||||
@@ -52,32 +42,18 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
hwidDeviceLimitDraft: "",
|
hwidDeviceLimitDraft: "",
|
||||||
grantTrafficGbDraft: "",
|
grantTrafficGbDraft: "",
|
||||||
grantTrafficKindDraft: "regular",
|
grantTrafficKindDraft: "regular",
|
||||||
|
|
||||||
userLogs: [],
|
userLogs: [],
|
||||||
userLogsTotal: 0,
|
userLogsTotal: 0,
|
||||||
userLogsPage: 0,
|
userLogsPage: 0,
|
||||||
userLogsLoading: false,
|
userLogsLoading: false,
|
||||||
userLogsLoaded: false,
|
userLogsLoaded: false,
|
||||||
userLogsUserId: null,
|
userLogsUserId: null,
|
||||||
};
|
userLogsPageSize: USER_LOGS_PAGE_SIZE,
|
||||||
}
|
});
|
||||||
|
|
||||||
function _openingUserModalState(user, userId) {
|
let _activeRef = "stats"; // fallback if active isn't tracked
|
||||||
return {
|
let _pathContext = null;
|
||||||
..._closedUserModalState(),
|
|
||||||
openedUser: user,
|
|
||||||
userDetailLoading: true,
|
|
||||||
userDetailTab: "subscription",
|
|
||||||
userLogsUserId: userId,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function _isCurrentUserRequest(s, requestId, userId) {
|
|
||||||
return (
|
|
||||||
requestId === _openUserRequestId &&
|
|
||||||
Boolean(s.openedUser) &&
|
|
||||||
s.openedUser.user_id === userId
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setActive(active) {
|
function setActive(active) {
|
||||||
_activeRef = active;
|
_activeRef = active;
|
||||||
@@ -148,15 +124,31 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
const userId =
|
const userId =
|
||||||
typeof userOrId === "object" && userOrId !== null ? userOrId.user_id : Number(userOrId);
|
typeof userOrId === "object" && userOrId !== null ? userOrId.user_id : Number(userOrId);
|
||||||
if (!userId) return;
|
if (!userId) return;
|
||||||
const requestId = ++_openUserRequestId;
|
|
||||||
_setPathContext(opts.pathContext);
|
_setPathContext(opts.pathContext);
|
||||||
const openedUser =
|
|
||||||
typeof userOrId === "object" && userOrId !== null ? userOrId : { user_id: userId };
|
|
||||||
|
|
||||||
state.update((s) => ({
|
state.update((s) => ({
|
||||||
...s,
|
...s,
|
||||||
..._openingUserModalState(openedUser, userId),
|
openedUser:
|
||||||
userActionBusy: s.userActionBusy,
|
typeof userOrId === "object" && userOrId !== null ? userOrId : { user_id: userId },
|
||||||
|
openedUserDetail: null,
|
||||||
|
userMessageDraft: "",
|
||||||
|
userMessageConfirmOpen: false,
|
||||||
|
userExtendDays: 30,
|
||||||
|
userExtendHwidDevices: true,
|
||||||
|
userDetailLoading: true,
|
||||||
|
userDetailTab: "subscription",
|
||||||
|
userReferralsOpen: false,
|
||||||
|
userReferralsLoading: false,
|
||||||
|
userReferrals: [],
|
||||||
|
userReferralsTotal: 0,
|
||||||
|
userReferralsPage: 0,
|
||||||
|
userReferralsInviter: null,
|
||||||
|
userLogs: [],
|
||||||
|
userLogsTotal: 0,
|
||||||
|
userLogsPage: 0,
|
||||||
|
userLogsLoading: false,
|
||||||
|
userLogsLoaded: false,
|
||||||
|
userLogsUserId: userId,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!opts.skipPush) _pushUserPath(userId);
|
if (!opts.skipPush) _pushUserPath(userId);
|
||||||
@@ -169,9 +161,7 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
const hasHwidLimit =
|
const hasHwidLimit =
|
||||||
sub?.hwid_device_limit !== null && sub?.hwid_device_limit !== undefined;
|
sub?.hwid_device_limit !== null && sub?.hwid_device_limit !== undefined;
|
||||||
const hwidLimit = hasHwidLimit ? Number(sub?.hwid_device_limit) : null;
|
const hwidLimit = hasHwidLimit ? Number(sub?.hwid_device_limit) : null;
|
||||||
state.update((s) => {
|
state.update((s) => ({
|
||||||
if (!_isCurrentUserRequest(s, requestId, userId)) return s;
|
|
||||||
return {
|
|
||||||
...s,
|
...s,
|
||||||
openedUserDetail: res,
|
openedUserDetail: res,
|
||||||
openedUser: res.user ? { ...res.user, ...s.openedUser, ...res.user } : s.openedUser,
|
openedUser: res.user ? { ...res.user, ...s.openedUser, ...res.user } : s.openedUser,
|
||||||
@@ -184,37 +174,41 @@ export function createUsersStore({ api, onToast, at, routePrefix = "" }) {
|
|||||||
hwidDeviceLimitDraft: hasHwidLimit && hwidLimit > 0 ? String(hwidLimit) : "",
|
hwidDeviceLimitDraft: hasHwidLimit && hwidLimit > 0 ? String(hwidLimit) : "",
|
||||||
grantTrafficGbDraft: "",
|
grantTrafficGbDraft: "",
|
||||||
grantTrafficKindDraft: "regular",
|
grantTrafficKindDraft: "regular",
|
||||||
};
|
}));
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
let shouldClearPath = false;
|
onToast(res?.error || "load_failed");
|
||||||
let shouldShowError = false;
|
state.update((s) => ({ ...s, openedUser: null }));
|
||||||
state.update((s) => {
|
if (!opts.skipPush) _pushUserPath(null);
|
||||||
if (!_isCurrentUserRequest(s, requestId, userId)) return s;
|
|
||||||
shouldShowError = true;
|
|
||||||
shouldClearPath = true;
|
|
||||||
_pathContext = null;
|
_pathContext = null;
|
||||||
return { ...s, ..._closedUserModalState() };
|
|
||||||
});
|
|
||||||
if (shouldShowError) onToast(res?.error || "load_failed");
|
|
||||||
if (shouldClearPath && !opts.skipPush) _pushUserPath(null);
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
state.update((s) => {
|
state.update((s) => ({ ...s, userDetailLoading: false }));
|
||||||
if (!_isCurrentUserRequest(s, requestId, userId)) return s;
|
|
||||||
return { ...s, userDetailLoading: false };
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeUser(opts = {}) {
|
function closeUser(opts = {}) {
|
||||||
let wasOpen = false;
|
let wasOpen = false;
|
||||||
_openUserRequestId += 1;
|
|
||||||
state.update((s) => {
|
state.update((s) => {
|
||||||
wasOpen = Boolean(s.openedUser);
|
wasOpen = Boolean(s.openedUser);
|
||||||
return {
|
return {
|
||||||
...s,
|
...s,
|
||||||
..._closedUserModalState(),
|
openedUser: null,
|
||||||
|
openedUserDetail: null,
|
||||||
|
userDeleteOpen: false,
|
||||||
|
userBanConfirmOpen: false,
|
||||||
|
userMessageConfirmOpen: false,
|
||||||
|
userReferralsOpen: false,
|
||||||
|
userReferralsLoading: false,
|
||||||
|
userReferrals: [],
|
||||||
|
userReferralsTotal: 0,
|
||||||
|
userReferralsPage: 0,
|
||||||
|
userReferralsInviter: null,
|
||||||
|
userLogs: [],
|
||||||
|
userLogsTotal: 0,
|
||||||
|
userLogsPage: 0,
|
||||||
|
userLogsLoading: false,
|
||||||
|
userLogsLoaded: false,
|
||||||
|
userLogsUserId: null,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
if (wasOpen && !opts.skipPush) _pushUserPath(null);
|
if (wasOpen && !opts.skipPush) _pushUserPath(null);
|
||||||
|
|||||||
Reference in New Issue
Block a user