audiobookshelf/client/plugins/format-date-safe.client.js

37 lines
989 B
JavaScript

// Wrap app.$formatDate to accept ISO strings / numbers safely
import Vue from 'vue'
import { parseISO, isValid } from 'date-fns'
import format from 'date-fns/format'
export default ({ app }) => {
const use = (impl) => (v, p) => {
let d = v instanceof Date ? v : null
if (!d && typeof v === 'string') {
const k = parseISO(v)
if (isValid(k)) d = k
}
if (!d && (typeof v === 'number' || typeof v === 'string')) {
const k = new Date(v)
if (isValid(k)) d = k
}
if (!d) return ''
try {
return impl(d, p)
} catch {
try {
return format(d, p || 'yyyy-MM-dd')
} catch {
return ''
}
}
}
if (typeof app.$formatDate === 'function') {
const safe = use((d, p) => app.$formatDate(d, p))
app.$formatDate = safe
Vue.prototype.$formatDate = safe
} else {
const safe = use((d, p) => format(d, p || 'yyyy-MM-dd'))
app.$formatDate = safe
Vue.prototype.$formatDate = safe
}
}