50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import i18n from '../i18n/config'
|
|
|
|
export type CardStatus = 'todo' | 'doing' | 'done'
|
|
|
|
export interface Card {
|
|
cardId: string
|
|
title: string
|
|
status: CardStatus | string
|
|
position: number
|
|
createdAt: string
|
|
}
|
|
|
|
export const STATUSES: CardStatus[] = ['todo', 'doing', 'done']
|
|
|
|
export function sortCards(cards: Card[]) {
|
|
return [...cards].sort((a, b) => {
|
|
if (a.status !== b.status) return a.status.localeCompare(b.status)
|
|
return a.position - b.position
|
|
})
|
|
}
|
|
|
|
export function classifyHealth(cards: Card[]) {
|
|
const todo = cards.filter((card) => card.status === 'todo').length
|
|
const doing = cards.filter((card) => card.status === 'doing').length
|
|
if (doing === 0) return 'idle'
|
|
if (todo > doing * 2) return 'backlogged'
|
|
return 'flowing'
|
|
}
|
|
|
|
export function prettyStatus(status: string) {
|
|
switch (status) {
|
|
case 'todo':
|
|
return i18n.t('status.todo')
|
|
case 'doing':
|
|
return i18n.t('status.doing')
|
|
case 'done':
|
|
return i18n.t('status.done')
|
|
default:
|
|
return status
|
|
}
|
|
}
|
|
|
|
export function relativeTime(timestamp: string) {
|
|
const delta = Math.max(0, Math.floor((Date.now() - new Date(timestamp).getTime()) / 1000))
|
|
if (delta < 60) return i18n.t('relativeTime.seconds', { count: delta })
|
|
if (delta < 3600) return i18n.t('relativeTime.minutes', { count: Math.floor(delta / 60) })
|
|
if (delta < 86400) return i18n.t('relativeTime.hours', { count: Math.floor(delta / 3600) })
|
|
return i18n.t('relativeTime.days', { count: Math.floor(delta / 86400) })
|
|
}
|