Newer
Older
navi-1 / webclient / src / composables / useTime.js
import { ref, onMounted, onUnmounted } from 'vue'

/**
 * Format a timestamp as a relative/short label (same logic as old client).
 * < 1 min  → "just now"
 * < 1 hour → "5m ago"
 * today    → "14:32"
 * older    → "12.04.2024"
 */
export function formatTimeLabel(ts) {
  if (!ts) return ''
  const d = new Date(ts)
  if (isNaN(d)) return ''
  const diff = Date.now() - d
  if (diff < 60_000)     return 'just now'
  if (diff < 3_600_000)  return `${Math.floor(diff / 60_000)}m ago`
  if (diff < 86_400_000) return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
  return d.toLocaleDateString()
}

/**
 * Reactive time label that auto-updates every minute.
 * Returns a ref that ticks so "5m ago" stays current.
 */
export function useTimeLabel(tsRef) {
  const label = ref(formatTimeLabel(tsRef.value))

  let timer = null

  function update() {
    label.value = formatTimeLabel(tsRef.value)
  }

  onMounted(() => {
    update()
    timer = setInterval(update, 30_000)
  })

  onUnmounted(() => {
    if (timer) clearInterval(timer)
  })

  return label
}