pushy

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-06-28 11:30:01 +08:00
parent b03b204861
commit bac7168b1e
100 changed files with 5958 additions and 1976 deletions
+83
View File
@@ -34,6 +34,8 @@ export const UserProvider = ({ children }) => {
const [activity, setActivity] = useState([]);
const [activityPagination, setActivityPagination] = useState(PAGINATION_INIT);
const [activityLoading, setActivityLoading] = useState(false);
const [bans, setBans] = useState([]);
const [bansLoading, setBansLoading] = useState(false);
const request = useCallback(async (fn) => {
setLoading(true);
@@ -289,10 +291,90 @@ export const UserProvider = ({ children }) => {
}
}, []);
// ─── POST /api/admin/users/:id/ban ────────────────────────────────────────
const banUser = useCallback(
(userId, payload) =>
request(async () => {
const res = await api.post(`${BASE}/users/${userId}/ban`, payload);
setUsers((prev) =>
prev.map((u) => (u.user_id === userId ? { ...u, is_banned: true } : u))
);
if (user?.user_id === userId) setUser((prev) => prev ? { ...prev, is_banned: true } : prev);
toast.success("User banned successfully.");
return res.data;
}),
[request, user]
);
// ─── POST /api/admin/users/:id/unban ──────────────────────────────────────
const unbanUser = useCallback(
(userId, payload) =>
request(async () => {
const res = await api.post(`${BASE}/users/${userId}/unban`, payload);
setUsers((prev) =>
prev.map((u) => (u.user_id === userId ? { ...u, is_banned: false } : u))
);
if (user?.user_id === userId) setUser((prev) => prev ? { ...prev, is_banned: false } : prev);
toast.success("User unbanned successfully.");
return res.data;
}),
[request, user]
);
// ─── POST /api/admin/users/bulk/ban ───────────────────────────────────────
const bulkBanUsers = useCallback(
({ ids, ...payload }) =>
request(async () => {
const res = await api.post(`${BASE}/users/bulk/ban`, { ids, ...payload });
const { banned_ids } = res.data?.data ?? {};
if (banned_ids?.length) {
setUsers((prev) =>
prev.map((u) => (banned_ids.includes(u.user_id) ? { ...u, is_banned: true } : u))
);
toast.success(`${banned_ids.length} user(s) banned.`);
}
return res.data;
}),
[request]
);
// ─── POST /api/admin/users/bulk/unban ─────────────────────────────────────
const bulkUnbanUsers = useCallback(
({ ids, lift_reason } = {}) =>
request(async () => {
const res = await api.post(`${BASE}/users/bulk/unban`, { ids, lift_reason });
const { unbanned_ids } = res.data?.data ?? {};
if (unbanned_ids?.length) {
setUsers((prev) =>
prev.map((u) => (unbanned_ids.includes(u.user_id) ? { ...u, is_banned: false } : u))
);
toast.success(`${unbanned_ids.length} user(s) unbanned.`);
}
return res.data;
}),
[request]
);
// ─── GET /api/admin/users/:id/bans ────────────────────────────────────────
const fetchUserBans = useCallback(async (userId) => {
setBansLoading(true);
try {
const res = await api.get(`${BASE}/users/${userId}/bans`);
setBans(res.data?.data ?? []);
return res.data?.data;
} catch (err) {
toast.error(err?.response?.data?.message ?? "Could not load ban history.");
return [];
} finally {
setBansLoading(false);
}
}, []);
return (
<UserContext.Provider value={{
users, user, sessions, achievements, achievementsLoading, pagination, attributes, loading, error,
activity, activityPagination, activityLoading,
bans, bansLoading,
setPagination,
fetchUsers, fetchArchivedUsers, fetchUser,
addStaffUser, updateUser,
@@ -302,6 +384,7 @@ export const UserProvider = ({ children }) => {
fetchUserFieldValues,
fetchUserAchievements,
fetchActivity, fetchUserActivity,
banUser, unbanUser, bulkBanUsers, bulkUnbanUsers, fetchUserBans,
}}>
{children}
</UserContext.Provider>