11import { useMemo } from 'react'
22import { MultiSeriesStackedBarChart } from '../components'
3- import type { UserUsage } from '../pipeline/aggregators/userUsageAggregator'
3+ import type { UserDailyUsage , UserUsage } from '../pipeline/aggregators/userUsageAggregator'
4+ import { fillDataForRange } from '../utils/fillDataForRange'
45import { formatAiu } from '../utils/format'
56
67type DailySummaryModelRow = {
@@ -47,49 +48,59 @@ function joinValues(values: string[]): string {
4748 return values . join ( ', ' )
4849}
4950
51+ function createEmptyUserDaily ( date : string ) : UserDailyUsage {
52+ return { date, requests : 0 , grossAmount : 0 , discountAmount : 0 , netAmount : 0 , aiuQuantity : 0 , aiuGrossAmount : 0 , aicNetAmount : 0 , models : { } }
53+ }
54+
5055export interface UserDetailsViewProps {
5156 user : UserUsage | null
5257 rangeStart ?: string | null
58+ rangeEnd ?: string | null
5359 onBackToUsers ?: ( ) => void
5460}
5561
56- export function UserDetailsView ( { user, rangeStart, onBackToUsers } : UserDetailsViewProps ) {
57- const dailyEntries = useMemo ( ( ) => {
62+ export function UserDetailsView ( { user, rangeStart, rangeEnd , onBackToUsers } : UserDetailsViewProps ) {
63+ const activeDailyEntries = useMemo ( ( ) => {
5864 if ( ! user ) return [ ]
5965 return Object . values ( user . daily ) . sort ( ( a , b ) => a . date . localeCompare ( b . date ) )
6066 } , [ user ] )
6167
68+ const chartDailyEntries = useMemo (
69+ ( ) => fillDataForRange ( activeDailyEntries , rangeStart ?? null , rangeEnd ?? null , createEmptyUserDaily ) ,
70+ [ activeDailyEntries , rangeStart , rangeEnd ] ,
71+ )
72+
6273 const modelNames = useMemo ( ( ) => {
6374 const names = new Set < string > ( )
64- for ( const day of dailyEntries ) {
75+ for ( const day of activeDailyEntries ) {
6576 for ( const model of Object . keys ( day . models ) ) {
6677 names . add ( model )
6778 }
6879 }
6980 return Array . from ( names ) . sort ( ( a , b ) => a . localeCompare ( b ) )
70- } , [ dailyEntries ] )
81+ } , [ activeDailyEntries ] )
7182
72- const labels = useMemo ( ( ) => dailyEntries . map ( ( day ) => day . date ) , [ dailyEntries ] )
83+ const labels = useMemo ( ( ) => chartDailyEntries . map ( ( day ) => day . date ) , [ chartDailyEntries ] )
7384
7485 const requestSeries = useMemo ( ( ) => {
7586 return modelNames . map ( ( model , index ) => ( {
7687 label : model ,
7788 color : MODEL_COLORS [ index % MODEL_COLORS . length ] ,
78- data : dailyEntries . map ( ( day ) => day . models [ model ] ?. requests ?? 0 ) ,
89+ data : chartDailyEntries . map ( ( day ) => day . models [ model ] ?. requests ?? 0 ) ,
7990 } ) )
80- } , [ dailyEntries , modelNames ] )
91+ } , [ chartDailyEntries , modelNames ] )
8192
8293 const aiuSeries = useMemo ( ( ) => {
8394 return modelNames . map ( ( model , index ) => ( {
8495 label : model ,
8596 color : MODEL_COLORS [ index % MODEL_COLORS . length ] ,
86- data : dailyEntries . map ( ( day ) => day . models [ model ] ?. aiuQuantity ?? 0 ) ,
97+ data : chartDailyEntries . map ( ( day ) => day . models [ model ] ?. aiuQuantity ?? 0 ) ,
8798 } ) )
88- } , [ dailyEntries , modelNames ] )
99+ } , [ chartDailyEntries , modelNames ] )
89100
90101 const dailySummaryGroups = useMemo ( ( ) => {
91102 const groups : DailySummaryGroup [ ] = [ ]
92- for ( const day of dailyEntries ) {
103+ for ( const day of activeDailyEntries ) {
93104 const dayModelNames = Object . keys ( day . models ) . sort ( ( a , b ) => a . localeCompare ( b ) )
94105 const rows : DailySummaryModelRow [ ] = [ ]
95106
@@ -112,7 +123,7 @@ export function UserDetailsView({ user, rangeStart, onBackToUsers }: UserDetails
112123 }
113124
114125 return groups
115- } , [ dailyEntries ] )
126+ } , [ activeDailyEntries ] )
116127
117128 const periodLabel = rangeStart
118129 ? new Date ( rangeStart + 'T00:00:00' ) . toLocaleString ( 'en-US' , { month : 'long' , year : 'numeric' } )
@@ -145,7 +156,7 @@ export function UserDetailsView({ user, rangeStart, onBackToUsers }: UserDetails
145156 < h2 className = "user-details__heading" > Username: { user . username } </ h2 >
146157 { user . organizations . length > 0 && < span className = "user-details__meta" > Organizations: { joinValues ( user . organizations ) } </ span > }
147158 { user . costCenters . length > 0 && < span className = "user-details__meta" > Cost Centers: { joinValues ( user . costCenters ) } </ span > }
148- < span className = "user-details__meta" > Days Active: { formatInt ( dailyEntries . length ) } </ span >
159+ < span className = "user-details__meta" > Days Active: { formatInt ( activeDailyEntries . length ) } </ span >
149160 </ div >
150161 </ div >
151162
0 commit comments