diff --git a/apps/admin/src/sections/user/user-subscription/index.tsx b/apps/admin/src/sections/user/user-subscription/index.tsx index 92d3612..7b56804 100644 --- a/apps/admin/src/sections/user/user-subscription/index.tsx +++ b/apps/admin/src/sections/user/user-subscription/index.tsx @@ -54,6 +54,10 @@ function toUserSubscribePayload(values: SubscriptionFormValues) { }; } +function resolvePlanSpeed(row: API.UserSubscribe) { + return row.plan_speed_limit ?? row.subscribe?.speed_limit ?? 0; +} + export default function UserSubscription({ userId }: { userId: number }) { const { t } = useTranslation("user"); const [loading, setLoading] = useState(false); @@ -315,10 +319,11 @@ export default function UserSubscription({ userId }: { userId: number }) { cell: ({ row }) => { const userSpeed = row.original.speed_limit ?? 0; const effectiveSpeed = row.original.effective_speed ?? 0; - const planSpeed = row.original.subscribe?.speed_limit ?? 0; + const planSpeed = resolvePlanSpeed(row.original); const speed = effectiveSpeed || userSpeed || planSpeed; - const source = - userSpeed > 0 + const source = row.original.is_throttled + ? t("effectiveSpeed", "Effective Speed") + : userSpeed > 0 ? t("userOverride", "User Override") : t("subscriptionDefault", "Subscription Default"); @@ -335,6 +340,16 @@ export default function UserSubscription({ userId }: { userId: number }) { {source} + + {t("userOverride", "User Override")}:{" "} + + + {" "} + / {t("subscriptionDefault", "Subscription Default")}:{" "} + + + + ); }, diff --git a/apps/admin/src/sections/user/user-subscription/subscription-detail.tsx b/apps/admin/src/sections/user/user-subscription/subscription-detail.tsx index 24b6085..48c8d15 100644 --- a/apps/admin/src/sections/user/user-subscription/subscription-detail.tsx +++ b/apps/admin/src/sections/user/user-subscription/subscription-detail.tsx @@ -87,11 +87,12 @@ function SpeedLimitCard({ subscriptionId }: { subscriptionId: number }) { if (detail.status !== 1) return null; - const baseSpeed = detail.subscribe?.speed_limit ?? 0; + const baseSpeed = + detail.plan_speed_limit ?? detail.subscribe?.speed_limit ?? 0; const userSpeed = detail.speed_limit ?? 0; const effectiveSpeed = detail.effective_speed ?? 0; const isThrottled = detail.is_throttled; - const rules = detail.traffic_limit || []; + const rules = detail.user_traffic_limit || detail.traffic_limit || []; const hasLimitConfig = baseSpeed > 0 || userSpeed > 0 || effectiveSpeed > 0 || rules.length > 0; diff --git a/apps/admin/src/sections/user/user-subscription/subscription-form.tsx b/apps/admin/src/sections/user/user-subscription/subscription-form.tsx index f7e49f2..9b81260 100644 --- a/apps/admin/src/sections/user/user-subscription/subscription-form.tsx +++ b/apps/admin/src/sections/user/user-subscription/subscription-form.tsx @@ -40,6 +40,12 @@ interface Props { type SubscriptionTrafficLimitRule = API.UserSubscribeTrafficLimitRule; +function getUserTrafficLimitRules( + data?: Pick +) { + return data?.user_traffic_limit || data?.traffic_limit || []; +} + const defaultLimitRule: SubscriptionTrafficLimitRule = { stat_type: "day", stat_value: 1, @@ -98,7 +104,7 @@ export function SubscriptionForm({ traffic: initialData?.traffic || 0, speed_limit: initialData?.speed_limit || 0, device_limit: initialData?.device_limit || 0, - traffic_limit: initialData?.traffic_limit || [], + traffic_limit: getUserTrafficLimitRules(initialData), upload: initialData?.upload || 0, download: initialData?.download || 0, expired_at: initialData?.expire_time || 0, diff --git a/packages/ui/src/services/admin/typings.d.ts b/packages/ui/src/services/admin/typings.d.ts index 90e4e26..0280f6e 100644 --- a/packages/ui/src/services/admin/typings.d.ts +++ b/packages/ui/src/services/admin/typings.d.ts @@ -2664,11 +2664,13 @@ declare namespace API { download: number; upload: number; speed_limit?: number; + plan_speed_limit?: number; device_limit?: number; effective_speed?: number; is_throttled?: boolean; throttle_rule?: string; traffic_limit?: UserSubscribeTrafficLimitRule[]; + user_traffic_limit?: UserSubscribeTrafficLimitRule[]; token: string; status: number; short: string; @@ -2699,8 +2701,10 @@ declare namespace API { download: number; upload: number; speed_limit?: number; + plan_speed_limit?: number; device_limit?: number; traffic_limit?: UserSubscribeTrafficLimitRule[]; + user_traffic_limit?: UserSubscribeTrafficLimitRule[]; token: string; status: number; effective_speed: number;