fix: extract plan label from capabilities in SaveAndClose; try org endpoint on refresh
This commit is contained in:
@@ -220,10 +220,12 @@ public class UsageViewModel : INotifyPropertyChanged
|
|||||||
AppSettings.Default.Save();
|
AppSettings.Default.Save();
|
||||||
|
|
||||||
var usageUrl = $"https://claude.ai/api/organizations/{orgId}/usage";
|
var usageUrl = $"https://claude.ai/api/organizations/{orgId}/usage";
|
||||||
var ut = http.GetAsync(usageUrl);
|
var ut = http.GetAsync(usageUrl);
|
||||||
var ot = FetchAsync<OverageSpendLimit>(http, $"https://claude.ai/api/organizations/{orgId}/overage_spend_limit");
|
var ot = FetchAsync<OverageSpendLimit>(http, $"https://claude.ai/api/organizations/{orgId}/overage_spend_limit");
|
||||||
var pt = FetchAsync<PrepaidCredits>(http, $"https://claude.ai/api/organizations/{orgId}/prepaid/credits");
|
var pt = FetchAsync<PrepaidCredits>(http, $"https://claude.ai/api/organizations/{orgId}/prepaid/credits");
|
||||||
await Task.WhenAll(ut, ot, pt);
|
// Fetch org details as a fallback source for capabilities (bootstrap omits them via HttpClient)
|
||||||
|
var odt = http.GetAsync($"https://claude.ai/api/organizations/{orgId}");
|
||||||
|
await Task.WhenAll(ut, ot, pt, odt);
|
||||||
|
|
||||||
var usageResp = ut.Result;
|
var usageResp = ut.Result;
|
||||||
if (!usageResp.IsSuccessStatusCode)
|
if (!usageResp.IsSuccessStatusCode)
|
||||||
@@ -232,6 +234,32 @@ public class UsageViewModel : INotifyPropertyChanged
|
|||||||
var usageJson = await usageResp.Content.ReadAsStringAsync();
|
var usageJson = await usageResp.Content.ReadAsStringAsync();
|
||||||
var usage = JsonSerializer.Deserialize<UsageResponse>(usageJson, JsonOpts);
|
var usage = JsonSerializer.Deserialize<UsageResponse>(usageJson, JsonOpts);
|
||||||
|
|
||||||
|
// Try org endpoint for capabilities if bootstrap didn't return them
|
||||||
|
if (string.IsNullOrEmpty(planLabel) && odt.Result.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var orgJson = await odt.Result.Content.ReadAsStringAsync();
|
||||||
|
using var orgDoc = JsonDocument.Parse(orgJson);
|
||||||
|
if (orgDoc.RootElement.TryGetProperty("capabilities", out var orgCaps) &&
|
||||||
|
orgCaps.ValueKind == JsonValueKind.Array)
|
||||||
|
{
|
||||||
|
foreach (var cap in orgCaps.EnumerateArray())
|
||||||
|
{
|
||||||
|
var s = cap.GetString() ?? "";
|
||||||
|
if (s.StartsWith("claude_", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var name = s.Substring("claude_".Length);
|
||||||
|
if (name.Length > 0)
|
||||||
|
planLabel = char.ToUpper(name[0]) + name.Substring(1).ToLower();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { /* best-effort */ }
|
||||||
|
}
|
||||||
|
|
||||||
// Persist fresh usage so cache reflects live data
|
// Persist fresh usage so cache reflects live data
|
||||||
AppSettings.Default.UsageJson = usageJson;
|
AppSettings.Default.UsageJson = usageJson;
|
||||||
if (!string.IsNullOrEmpty(planLabel)) AppSettings.Default.PlanLabel = planLabel;
|
if (!string.IsNullOrEmpty(planLabel)) AppSettings.Default.PlanLabel = planLabel;
|
||||||
|
|||||||
Reference in New Issue
Block a user