Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1cf3f90fd6 | ||
|
|
3d8482cf21 | ||
|
|
44b7feb3c0 | ||
|
|
236990ca45 | ||
|
|
8d523cbb87 |
@@ -100,8 +100,12 @@ public partial class LoginWindow : Window
|
|||||||
window.chrome.webview.postMessage({email:e,orgId:null,planLabel,usage:(pu&&!pu.error?pu:null),debug:'no-org'});
|
window.chrome.webview.postMessage({email:e,orgId:null,planLabel,usage:(pu&&!pu.error?pu:null),debug:'no-org'});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const u=await(await fetch('/api/organizations/'+id+'/usage',h)).json();
|
const [u,ov,pp]=await Promise.all([
|
||||||
window.chrome.webview.postMessage({email:e,orgId:id,planLabel,usage:u,debug:'src:'+orgSrc+'|plan:'+(planLabel||'none')});
|
fetch('/api/organizations/'+id+'/usage',h).then(r=>r.json()).catch(()=>null),
|
||||||
|
fetch('/api/organizations/'+id+'/overage_spend_limit',h).then(r=>r.ok?r.json():null).catch(()=>null),
|
||||||
|
fetch('/api/organizations/'+id+'/prepaid/credits',h).then(r=>r.ok?r.json():null).catch(()=>null)
|
||||||
|
]);
|
||||||
|
window.chrome.webview.postMessage({email:e,orgId:id,planLabel,usage:u,overage:ov,prepaid:pp,debug:'src:'+orgSrc+'|plan:'+(planLabel||'none')});
|
||||||
}catch(ex){window.chrome.webview.postMessage({error:String(ex)});}})()";
|
}catch(ex){window.chrome.webview.postMessage({error:String(ex)});}})()";
|
||||||
|
|
||||||
await Browser.CoreWebView2.ExecuteScriptAsync(script);
|
await Browser.CoreWebView2.ExecuteScriptAsync(script);
|
||||||
@@ -128,6 +132,12 @@ public partial class LoginWindow : Window
|
|||||||
&& !string.IsNullOrEmpty(pl.GetString()))
|
&& !string.IsNullOrEmpty(pl.GetString()))
|
||||||
AppSettings.Default.PlanLabel = pl.GetString()!;
|
AppSettings.Default.PlanLabel = pl.GetString()!;
|
||||||
|
|
||||||
|
if (root.TryGetProperty("overage", out var ov) && ov.ValueKind == JsonValueKind.Object)
|
||||||
|
AppSettings.Default.OverageJson = ov.GetRawText();
|
||||||
|
|
||||||
|
if (root.TryGetProperty("prepaid", out var pp) && pp.ValueKind == JsonValueKind.Object)
|
||||||
|
AppSettings.Default.PrepaidJson = pp.GetRawText();
|
||||||
|
|
||||||
if (root.TryGetProperty("debug", out var dbg) && dbg.ValueKind == JsonValueKind.String)
|
if (root.TryGetProperty("debug", out var dbg) && dbg.ValueKind == JsonValueKind.String)
|
||||||
AppSettings.Default.DebugInfo = dbg.GetString() ?? "";
|
AppSettings.Default.DebugInfo = dbg.GetString() ?? "";
|
||||||
else if (root.TryGetProperty("error", out var err))
|
else if (root.TryGetProperty("error", out var err))
|
||||||
|
|||||||
+4
-2
@@ -34,8 +34,10 @@ public class WindowData
|
|||||||
|
|
||||||
public class ExtraUsage
|
public class ExtraUsage
|
||||||
{
|
{
|
||||||
[JsonPropertyName("is_enabled")] public bool IsEnabled { get; set; }
|
[JsonPropertyName("is_enabled")] public bool IsEnabled { get; set; }
|
||||||
[JsonPropertyName("currency")] public string? Currency { get; set; }
|
[JsonPropertyName("currency")] public string? Currency { get; set; }
|
||||||
|
[JsonPropertyName("used_credits")] public double? UsedCredits { get; set; }
|
||||||
|
[JsonPropertyName("monthly_limit")] public double? MonthlyLimit { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BootstrapResponse
|
public class BootstrapResponse
|
||||||
|
|||||||
@@ -247,17 +247,23 @@ public partial class PopupWindow : Window
|
|||||||
var prepaid = VM.Prepaid;
|
var prepaid = VM.Prepaid;
|
||||||
var currency = VM.ExtraUsage?.Currency ?? overage?.Currency ?? "$";
|
var currency = VM.ExtraUsage?.Currency ?? overage?.Currency ?? "$";
|
||||||
|
|
||||||
var spent = overage?.UsedCredits ?? 0;
|
// Fall back to extra_usage fields when the overage/prepaid endpoints return nothing.
|
||||||
var limit = overage?.MonthlyCreditLimit ?? 0;
|
// extra_usage.used_credits is in cents (e.g. 5231 = EUR 52.31); overage endpoint
|
||||||
var balance = prepaid?.Amount ?? 0;
|
// already returns the value in currency units, so only divide for the fallback path.
|
||||||
|
var spent = overage?.UsedCredits ?? (VM.ExtraUsage?.UsedCredits / 100.0) ?? 0;
|
||||||
|
var limit = overage?.MonthlyCreditLimit ?? VM.ExtraUsage?.MonthlyLimit ?? 0;
|
||||||
|
var balance = prepaid?.Amount ?? 0;
|
||||||
|
// Show "Unlimited" when no limit is configured (null monthly_limit)
|
||||||
|
bool unlimited = overage?.MonthlyCreditLimit == null && VM.ExtraUsage?.MonthlyLimit == null;
|
||||||
|
|
||||||
UIElement MakeRow(string label, string value)
|
UIElement MakeRow(string label, string value, bool highlight = false)
|
||||||
{
|
{
|
||||||
var row = new Grid { Margin = new Thickness(0, 3, 0, 3) };
|
var row = new Grid { Margin = new Thickness(0, 3, 0, 3) };
|
||||||
row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||||
row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
|
row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
|
||||||
var lbl = new TextBlock { Text = label, FontSize = 12, Foreground = secondary };
|
var lbl = new TextBlock { Text = label, FontSize = 12, Foreground = secondary };
|
||||||
var val = new TextBlock { Text = value, FontSize = 12, FontWeight = FontWeights.Medium, Foreground = text };
|
var val = new TextBlock { Text = value, FontSize = 12, FontWeight = FontWeights.Medium,
|
||||||
|
Foreground = highlight ? new SolidColorBrush(Color.FromRgb(0x4C, 0xAF, 0x50)) : text };
|
||||||
Grid.SetColumn(lbl, 0);
|
Grid.SetColumn(lbl, 0);
|
||||||
Grid.SetColumn(val, 1);
|
Grid.SetColumn(val, 1);
|
||||||
row.Children.Add(lbl);
|
row.Children.Add(lbl);
|
||||||
@@ -266,9 +272,10 @@ public partial class PopupWindow : Window
|
|||||||
}
|
}
|
||||||
|
|
||||||
var contentPanel = new StackPanel { Margin = new Thickness(12, 10, 12, 10) };
|
var contentPanel = new StackPanel { Margin = new Thickness(12, 10, 12, 10) };
|
||||||
contentPanel.Children.Add(MakeRow("Spent", $"{currency}{spent:F2}"));
|
contentPanel.Children.Add(MakeRow("Spent", $"{currency} {spent:F2}", spent > 0));
|
||||||
if (limit > 0) contentPanel.Children.Add(MakeRow("Limit", $"{currency}{limit:F2}"));
|
if (unlimited) contentPanel.Children.Add(MakeRow("Limit", "Unlimited"));
|
||||||
if (balance > 0) contentPanel.Children.Add(MakeRow("Balance", $"{currency}{balance:F2}"));
|
else if (limit > 0) contentPanel.Children.Add(MakeRow("Limit", $"{currency} {limit:F2}"));
|
||||||
|
if (balance > 0) contentPanel.Children.Add(MakeRow("Balance", $"{currency} {balance:F2}"));
|
||||||
|
|
||||||
if (limit > 0)
|
if (limit > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -147,7 +147,15 @@ public class UsageViewModel : INotifyPropertyChanged
|
|||||||
|
|
||||||
await Application.Current.Dispatcher.InvokeAsync(() =>
|
await Application.Current.Dispatcher.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
if (limits.Count > 0) { Limits = limits; Overage = overage; Prepaid = prepaid; ExtraUsage = extraUsage; }
|
if (limits.Count > 0)
|
||||||
|
{
|
||||||
|
Limits = limits;
|
||||||
|
Overage = overage;
|
||||||
|
Prepaid = prepaid;
|
||||||
|
// Only clear ExtraUsage if the API explicitly disables it; keep cached value
|
||||||
|
// if the HTTP endpoint omits the field (it often does for non-browser clients)
|
||||||
|
if (extraUsage != null) ExtraUsage = extraUsage;
|
||||||
|
}
|
||||||
if (!string.IsNullOrEmpty(planLabel)) PlanLabel = planLabel;
|
if (!string.IsNullOrEmpty(planLabel)) PlanLabel = planLabel;
|
||||||
if (!string.IsNullOrEmpty(email)) UserEmail = email;
|
if (!string.IsNullOrEmpty(email)) UserEmail = email;
|
||||||
IsSignedIn = true;
|
IsSignedIn = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user