feat (v1.0.0): initial refactor and redesign
This commit is contained in:
parent
3058aa1ab4
commit
fe9b50b30e
134 changed files with 17792 additions and 3670 deletions
119
app/ai/usage/components/utils.ts
Normal file
119
app/ai/usage/components/utils.ts
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
import { CCData, DailyData, HeatmapDay, TimeRangeKey } from '@/lib/types'
|
||||
import { AIService } from '@/lib/services'
|
||||
import type { HeatmapPalette } from '@/app/ai/theme'
|
||||
|
||||
export const getModelLabel = (modelName: string): string => {
|
||||
return AIService.getModelLabel(modelName)
|
||||
}
|
||||
|
||||
export const formatCurrency = (value: number) => `$${value.toFixed(2)}`
|
||||
export const formatTokens = (value: number) => `${value.toFixed(1)}M`
|
||||
|
||||
export const computeStreak = (daily: DailyData[]): number => {
|
||||
return AIService.computeStreak(daily)
|
||||
}
|
||||
|
||||
export const formatStreakCompact = (days: number) => {
|
||||
return AIService.formatStreakCompact(days)
|
||||
}
|
||||
|
||||
export const computeFilledDailyRange = (daily: DailyData[]): DailyData[] => {
|
||||
return AIService.computeFilledDailyRange(daily)
|
||||
}
|
||||
|
||||
export const buildDailyTrendData = (daily: DailyData[]) => {
|
||||
const trendData = AIService.buildDailyTrendData(daily)
|
||||
return trendData.map(day => ({
|
||||
date: day.date,
|
||||
cost: day.totalCost,
|
||||
tokens: day.totalTokens / 1000000,
|
||||
inputTokens: day.inputTokensNormalized,
|
||||
outputTokens: day.outputTokensNormalized,
|
||||
cacheTokens: day.cacheTokensNormalized,
|
||||
costTrend: day.costTrend,
|
||||
tokensTrend: day.tokensTrend,
|
||||
}))
|
||||
}
|
||||
|
||||
export const prepareHeatmapData = (daily: DailyData[]): (HeatmapDay | null)[][] => {
|
||||
return AIService.prepareHeatmapData(daily)
|
||||
}
|
||||
|
||||
export const getHeatmapColor = (maxCost: number, value: number, palette: HeatmapPalette) => {
|
||||
return AIService.getHeatmapColor(maxCost, value, palette)
|
||||
}
|
||||
|
||||
export const buildModelUsageData = (daily: DailyData[]) => {
|
||||
return AIService.buildModelUsageData(daily)
|
||||
}
|
||||
|
||||
export const buildTokenTypeData = (totals: CCData['totals']) => {
|
||||
return AIService.buildTokenTypeData(totals)
|
||||
}
|
||||
|
||||
export const buildTokenCompositionData = (daily: DailyData[]) => {
|
||||
return AIService.buildTokenCompositionData(daily)
|
||||
}
|
||||
|
||||
export const filterDailyByRange = (
|
||||
daily: DailyData[],
|
||||
range: TimeRangeKey,
|
||||
options?: { endDate?: Date }
|
||||
) => {
|
||||
return AIService.filterDailyByRange(daily, range, options)
|
||||
}
|
||||
|
||||
export const computeTotalsFromDaily = (daily: DailyData[]) => {
|
||||
return AIService.computeTotalsFromDaily(daily)
|
||||
}
|
||||
|
||||
const toUtcDate = (isoDate: string) => new Date(`${isoDate}T00:00:00Z`)
|
||||
|
||||
export const formatTooltipDate = (isoDate: string): string => {
|
||||
const date = toUtcDate(isoDate)
|
||||
if (Number.isNaN(date.getTime())) return isoDate
|
||||
return date.toLocaleDateString('en-US', {
|
||||
weekday: 'long',
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
year: 'numeric',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
}
|
||||
|
||||
export const formatAxisLabel = (isoDate: string, range: TimeRangeKey): string => {
|
||||
const date = toUtcDate(isoDate)
|
||||
if (Number.isNaN(date.getTime())) return isoDate
|
||||
|
||||
switch (range) {
|
||||
case '7d':
|
||||
return date.toLocaleDateString('en-US', {
|
||||
weekday: 'long',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
case '1m':
|
||||
case '3m':
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
case '6m':
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
case '1y':
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
year: 'numeric',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
default:
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue