mirror of
https://git.meshkee.com/Meshkee/dashboards.git
synced 2026-08-11 22:30:58 +04:30
Ship shared LocaleProvider, business/customer i18n, branding defaultLocale, curated home tiles with dual 30-day charts, and chart/page aura tokens; refresh PROJECT_CONTEXT. Co-authored-by: Cursor <cursoragent@cursor.com>
71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import type { ProductApi } from '../services/productService'
|
|
|
|
export interface ProductMonthActivity {
|
|
monthKey: string
|
|
label: string
|
|
added: number
|
|
updated: number
|
|
}
|
|
|
|
function toMonthKey(iso: string): string {
|
|
const date = new Date(iso)
|
|
const year = date.getFullYear()
|
|
const month = String(date.getMonth() + 1).padStart(2, '0')
|
|
return `${year}-${month}`
|
|
}
|
|
|
|
function formatMonthLabel(monthKey: string, locale: string): string {
|
|
const [year, month] = monthKey.split('-').map(Number)
|
|
return new Date(year, month - 1, 1).toLocaleString(locale === 'fa' ? 'fa-IR' : 'en-US', {
|
|
month: 'short',
|
|
calendar: 'gregory',
|
|
numberingSystem: 'latn',
|
|
})
|
|
}
|
|
|
|
export function buildLast12MonthKeys(): string[] {
|
|
const keys: string[] = []
|
|
const now = new Date()
|
|
|
|
for (let i = 11; i >= 0; i -= 1) {
|
|
const date = new Date(now.getFullYear(), now.getMonth() - i, 1)
|
|
const year = date.getFullYear()
|
|
const month = String(date.getMonth() + 1).padStart(2, '0')
|
|
keys.push(`${year}-${month}`)
|
|
}
|
|
|
|
return keys
|
|
}
|
|
|
|
export function aggregateProductActivity(
|
|
products: ProductApi[],
|
|
locale: string = 'en',
|
|
): ProductMonthActivity[] {
|
|
const monthKeys = buildLast12MonthKeys()
|
|
const added = new Map(monthKeys.map((key) => [key, 0]))
|
|
const updated = new Map(monthKeys.map((key) => [key, 0]))
|
|
|
|
for (const product of products) {
|
|
const createdKey = toMonthKey(product.createdAt)
|
|
if (added.has(createdKey)) {
|
|
added.set(createdKey, (added.get(createdKey) ?? 0) + 1)
|
|
}
|
|
|
|
const createdTime = new Date(product.createdAt).getTime()
|
|
const updatedTime = new Date(product.updatedAt).getTime()
|
|
if (updatedTime > createdTime) {
|
|
const updatedKey = toMonthKey(product.updatedAt)
|
|
if (updated.has(updatedKey)) {
|
|
updated.set(updatedKey, (updated.get(updatedKey) ?? 0) + 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
return monthKeys.map((monthKey) => ({
|
|
monthKey,
|
|
label: formatMonthLabel(monthKey, locale),
|
|
added: added.get(monthKey) ?? 0,
|
|
updated: updated.get(monthKey) ?? 0,
|
|
}))
|
|
}
|