fix(admin): clear user route on modal close

This commit is contained in:
BADtochka
2026-06-06 20:05:47 +03:00
parent e0b3940b98
commit ae3d6a9b99
3 changed files with 99 additions and 96 deletions
+8
View File
@@ -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}
+50 -56
View File
@@ -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);