@@ -1470,15 +1470,32 @@ const buildXaiBillingSummary = (
14701470 return null ;
14711471 }
14721472
1473+ const includedUsedCents =
1474+ usedCents === null
1475+ ? null
1476+ : monthlyLimitCents !== null && monthlyLimitCents > 0
1477+ ? Math . min ( usedCents , monthlyLimitCents )
1478+ : usedCents ;
1479+ const onDemandUsedCents =
1480+ usedCents !== null && monthlyLimitCents !== null
1481+ ? Math . max ( 0 , usedCents - monthlyLimitCents )
1482+ : null ;
14731483 const usedPercent =
1474- monthlyLimitCents !== null && monthlyLimitCents > 0 && usedCents !== null
1475- ? ( usedCents / monthlyLimitCents ) * 100
1484+ monthlyLimitCents !== null && monthlyLimitCents > 0 && includedUsedCents !== null
1485+ ? ( includedUsedCents / monthlyLimitCents ) * 100
1486+ : null ;
1487+ const onDemandUsedPercent =
1488+ onDemandCapCents !== null && onDemandCapCents > 0 && onDemandUsedCents !== null
1489+ ? ( onDemandUsedCents / onDemandCapCents ) * 100
14761490 : null ;
14771491
14781492 return {
14791493 monthlyLimitCents,
14801494 usedCents,
1495+ includedUsedCents,
14811496 onDemandCapCents,
1497+ onDemandUsedCents,
1498+ onDemandUsedPercent,
14821499 billingPeriodStart,
14831500 billingPeriodEnd,
14841501 usedPercent,
@@ -1522,15 +1539,26 @@ const formatUsdFromCents = (cents: number | null): string => {
15221539
15231540const formatXaiRemainingAmount = ( billing : XaiBillingSummary ) : string => {
15241541 const remainingCents =
1525- billing . monthlyLimitCents !== null && billing . usedCents !== null
1526- ? Math . max ( 0 , billing . monthlyLimitCents - billing . usedCents )
1542+ billing . monthlyLimitCents !== null && billing . includedUsedCents !== null
1543+ ? Math . max ( 0 , billing . monthlyLimitCents - billing . includedUsedCents )
15271544 : null ;
15281545 const remaining = formatUsdFromCents ( remainingCents ) ;
15291546 const limit = formatUsdFromCents ( billing . monthlyLimitCents ) ;
15301547 if ( billing . monthlyLimitCents === null ) return remaining ;
15311548 return `${ remaining } / ${ limit } ` ;
15321549} ;
15331550
1551+ const formatXaiOnDemandAmount = ( billing : XaiBillingSummary ) : string => {
1552+ const remainingCents =
1553+ billing . onDemandCapCents !== null && billing . onDemandUsedCents !== null
1554+ ? Math . max ( 0 , billing . onDemandCapCents - billing . onDemandUsedCents )
1555+ : null ;
1556+ const remaining = formatUsdFromCents ( remainingCents ) ;
1557+ const cap = formatUsdFromCents ( billing . onDemandCapCents ) ;
1558+ if ( billing . onDemandCapCents === null ) return remaining ;
1559+ return `${ remaining } / ${ cap } ` ;
1560+ } ;
1561+
15341562const XAI_SUPERGROK_LIMIT_CENTS = 15_000 ;
15351563const XAI_SUPERGROK_HEAVY_LIMIT_CENTS = 150_000 ;
15361564
@@ -1566,11 +1594,16 @@ const renderXaiItems = (
15661594 const amountLabel = formatXaiRemainingAmount ( billing ) ;
15671595 const resetLabel = formatQuotaResetTime ( billing . billingPeriodEnd ) ;
15681596 const onDemandCap = billing . onDemandCapCents ?? 0 ;
1597+ const clampedOnDemandUsed =
1598+ billing . onDemandUsedPercent === null
1599+ ? null
1600+ : Math . max ( 0 , Math . min ( 100 , billing . onDemandUsedPercent ) ) ;
1601+ const onDemandRemaining =
1602+ clampedOnDemandUsed === null ? null : Math . max ( 0 , Math . min ( 100 , 100 - clampedOnDemandUsed ) ) ;
1603+ const onDemandPercentLabel =
1604+ onDemandRemaining === null ? '--' : `${ Math . round ( onDemandRemaining ) } %` ;
1605+ const onDemandAmountLabel = formatXaiOnDemandAmount ( billing ) ;
15691606 const plan = resolveXaiPlan ( billing . monthlyLimitCents ) ;
1570- const payAsYouGoLabel =
1571- onDemandCap > 0
1572- ? t ( 'xai_quota.pay_as_you_go_enabled' , { cap : formatUsdFromCents ( onDemandCap ) } )
1573- : t ( 'xai_quota.pay_as_you_go_disabled' ) ;
15741607
15751608 return h (
15761609 Fragment ,
@@ -1587,12 +1620,33 @@ const renderXaiItems = (
15871620 )
15881621 )
15891622 : null ,
1590- h (
1591- 'div' ,
1592- { key : 'pay-as-you-go' , className : styleMap . codexPlan } ,
1593- h ( 'span' , { className : styleMap . codexPlanLabel } , t ( 'xai_quota.pay_as_you_go_label' ) ) ,
1594- h ( 'span' , { className : styleMap . codexPlanValue } , payAsYouGoLabel )
1595- ) ,
1623+ onDemandCap > 0
1624+ ? h (
1625+ 'div' ,
1626+ { key : 'pay-as-you-go' , className : styleMap . quotaRow } ,
1627+ h (
1628+ 'div' ,
1629+ { className : styleMap . quotaRowHeader } ,
1630+ h ( 'span' , { className : styleMap . quotaModel } , t ( 'xai_quota.pay_as_you_go_label' ) ) ,
1631+ h (
1632+ 'div' ,
1633+ { className : styleMap . quotaMeta } ,
1634+ h ( 'span' , { className : styleMap . quotaPercent } , onDemandPercentLabel ) ,
1635+ h ( 'span' , { className : styleMap . quotaAmount } , onDemandAmountLabel )
1636+ )
1637+ ) ,
1638+ h ( QuotaProgressBar , {
1639+ percent : onDemandRemaining ,
1640+ highThreshold : QUOTA_PROGRESS_HIGH_THRESHOLD ,
1641+ mediumThreshold : QUOTA_PROGRESS_MEDIUM_THRESHOLD ,
1642+ } )
1643+ )
1644+ : h (
1645+ 'div' ,
1646+ { key : 'pay-as-you-go' , className : styleMap . codexPlan } ,
1647+ h ( 'span' , { className : styleMap . codexPlanLabel } , t ( 'xai_quota.pay_as_you_go_label' ) ) ,
1648+ h ( 'span' , { className : styleMap . codexPlanValue } , t ( 'xai_quota.pay_as_you_go_disabled' ) )
1649+ ) ,
15961650 h (
15971651 'div' ,
15981652 { key : 'monthly-credits' , className : styleMap . quotaRow } ,
0 commit comments