fix(frontend): fetch user tier on admin rate-limits page

The Subscription Tier dropdown showed "PRO" for all users because
the tier was never fetched from the backend. Now fetches the tier
via getV2GetUserRateLimitTier after loading rate limits, and uses
postV2SetUserRateLimitTier (generated client) instead of raw fetch
for tier changes.
This commit is contained in:
Zamil Majdy
2026-03-29 13:55:49 +02:00
parent 3a40188024
commit 9264b42050

View File

@@ -2,10 +2,13 @@
import { useState } from "react";
import { useToast } from "@/components/molecules/Toast/use-toast";
import type { SetUserTierRequest } from "@/app/api/__generated__/models/setUserTierRequest";
import type { UserRateLimitResponse } from "@/app/api/__generated__/models/userRateLimitResponse";
import {
getV2GetUserRateLimit,
getV2GetUserRateLimitTier,
postV2ResetUserRateLimitUsage,
postV2SetUserRateLimitTier,
} from "@/app/api/__generated__/endpoints/admin/admin";
export interface UserOption {
@@ -55,7 +58,9 @@ export function useRateLimitManager() {
if (response.status !== 200) {
throw new Error("Failed to fetch rate limit");
}
setRateLimitData(response.data);
const tier = await fetchTier(response.data.user_id);
const data = tier ? { ...response.data, tier } : response.data;
setRateLimitData(data as typeof response.data);
setSelectedUser({
user_id: response.data.user_id,
user_email: response.data.user_email ?? response.data.user_id,
@@ -123,6 +128,18 @@ export function useRateLimitManager() {
}
}
async function fetchTier(userId: string): Promise<string | undefined> {
try {
const res = await getV2GetUserRateLimitTier({ user_id: userId });
if (res.status === 200) {
return res.data.tier;
}
} catch {
// Tier fetch is best-effort — falls back to "PRO" in the display.
}
return undefined;
}
async function fetchRateLimit(userId: string) {
setIsLoadingRateLimit(true);
try {
@@ -130,7 +147,10 @@ export function useRateLimitManager() {
if (response.status !== 200) {
throw new Error("Failed to fetch rate limit");
}
setRateLimitData(response.data);
// Fetch the user's tier in parallel so the dropdown shows the correct value.
const tier = await fetchTier(userId);
const data = tier ? { ...response.data, tier } : response.data;
setRateLimitData(data as typeof response.data);
} catch (error) {
console.error("Error fetching rate limit:", error);
toast({
@@ -181,19 +201,12 @@ export function useRateLimitManager() {
async function handleTierChange(newTier: string) {
if (!rateLimitData) return;
const response = await fetch(
"/api/proxy/api/copilot/admin/rate_limit/tier",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
user_id: rateLimitData.user_id,
tier: newTier,
}),
},
);
const response = await postV2SetUserRateLimitTier({
user_id: rateLimitData.user_id,
tier: newTier as SetUserTierRequest["tier"],
});
if (!response.ok) {
if (response.status !== 200) {
throw new Error("Failed to update tier");
}