/**
* Utility functions for VChart components
*/
import type { TikTokVideoData } from './types';
/**
* Format large numbers with K/M notation
*/
export function formatNumber(value: number): string {
if (value >= 1000000) {
return (value / 1000000).toFixed(1) + 'M';
}
if (value >= 1000) {
return (value / 1000).toFixed(1) + 'K';
}
return value.toString();
}
/**
* Format date to short string
*/
export function formatDate(dateString: string): string {
const date = new Date(dateString);
return date.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric'
});
}
/**
* Calculate total engagement
*/
export function calculateTotalEngagement(data: TikTokVideoData[]): {
totalLikes: number;
totalComments: number;
totalShares: number;
totalViews: number;
} {
return data.reduce((acc, item) => ({
totalLikes: acc.totalLikes + item.likes,
totalComments: acc.totalComments + item.comments,
totalShares: acc.totalShares + item.shares,
totalViews: acc.totalViews + item.views
}), {
totalLikes: 0,
totalComments: 0,
totalShares: 0,
totalViews: 0
});
}
/**
* Get top N videos by metric
*/
export function getTopVideos(
data: TikTokVideoData[],
metric: 'views' | 'likes' | 'comments' | 'shares',
limit: number = 10
): TikTokVideoData[] {
return [...data]
.sort((a, b) => b[metric] - a[metric])
.slice(0, limit);
}
/**
* Calculate average watch percentage
*/
export function calculateAverageWatchPercent(data: TikTokVideoData[]): number {
if (data.length === 0) return 0;
const sum = data.reduce((acc, item) => acc + item.watchPercent, 0);
return sum / data.length;
}
/**
* Truncate text to max length
*/
export function truncateText(text: string, maxLength: number): string {
if (text.length <= maxLength) return text;
return text.substring(0, maxLength) + '...';
}
/**
* Validate TikTok video data
*/
export function validateVideoData(data: any): data is TikTokVideoData {
return (
typeof data === 'object' &&
typeof data.videoId === 'string' &&
typeof data.title === 'string' &&
typeof data.views === 'number' &&
typeof data.likes === 'number' &&
typeof data.comments === 'number' &&
typeof data.shares === 'number' &&
typeof data.watchPercent === 'number' &&
typeof data.datePublished === 'string' &&
typeof data.duration === 'number'
);
}