gancio/plugins/time.js

170 lines
5.6 KiB
JavaScript

import { DateTime, Settings } from 'luxon'
export default ({ app, store }, inject) => {
const zone = Settings.defaultZoneName = store.state.settings.instance_timezone
Settings.defaultLocale = app.i18n.locale || store.state.settings.instance_locale
const time = {
format (date, format) {
return DateTime.fromISO(date, {
zone: store.state.settings.instance_timezone,
locale: app.i18n.locale || store.state.settings.instance_locale
}).toFormat(format || '')
},
unixFormat (timestamp, format='EEEE d MMMM HH:mm') {
return DateTime.fromSeconds(timestamp, {
zone: store.state.settings.instance_timezone,
locale: app.i18n.locale || store.state.settings.instance_locale
}).toFormat(format)
},
fromUnix (timestamp) {
return DateTime.fromSeconds(timestamp, { zone })
},
fromDateInput (date, time) {
const [hour, minute] = time.split(':')
return DateTime.fromJSDate(date, { zone })
.set({ hour: Number(hour), minute: Number(minute), second: 0 })
.toUnixInteger()
},
currentMonth () {
return DateTime.local({ zone }).month
},
currentYear () {
return DateTime.local({ zone }).year
},
when (event) {
const currentYear = app.$time.currentYear()
const opt = {
zone: store.state.settings.instance_timezone,
locale: app.i18n.locale || store.state.settings.instance_locale
}
const start = DateTime.fromSeconds(event.start_datetime, opt)
let time = start.toFormat('EEEE d MMMM HH:mm')
const end = event.end_datetime && DateTime.fromSeconds(event.end_datetime, opt)
if (end) {
time += event.multidate ? `${end.toFormat('EEEE d MMMM')}` : `-${end.toFormat('HH:mm')}`
}
if (currentYear !== start.year) {
time += ` (${start.year})`
}
return time
},
nowUnix () {
const opt = {
zone,
locale: app.i18n.locale || store.state.settings.instance_locale
}
return DateTime.local(opt).toUnixInteger()
},
startMonth () { return DateTime.local({ zone }).startOf('month').toUnixInteger() },
startOfDay (date) { return DateTime.fromJSDate(date, { zone }).startOf('day').toUnixInteger()},
endOfDay (date) { return DateTime.fromJSDate(date, { zone }).endOf('day').toUnixInteger()},
recurrentDetail (event) {
const parent = event.parent
if (!parent.recurrent || !parent.recurrent.frequency) return 'error!'
const { frequency, type } = parent.recurrent
let recurrent
if (frequency === '1w' || frequency === '2w') {
recurrent = app.i18n.t(`event.recurrent_${frequency}_days`, { days: DateTime.fromSeconds(parent.start_datetime).toFormat('EEEE') })
} else if (frequency === '1m' || frequency === '2m') {
const d = type === 'ordinal' ? DateTime.fromSeconds(parent.start_datetime).day : DateTime.fromSeconds(parent.start_datetime).toFormat('EEEE')
if (type === 'ordinal') {
recurrent = app.i18n.t(`event.recurrent_${frequency}_days`, { days: d })
} else {
recurrent = app.i18n.t(`event.recurrent_${frequency}_ordinal`,
{ n: app.i18n.t('ordinal.' + type), days: d })
}
}
return recurrent
},
currentTimestamp () {
return DateTime.local().toUnixInteger()
},
from (timestamp) {
const opt = {
zone: store.state.settings.instance_timezone,
locale: app.i18n.locale || store.state.settings.instance_locale
}
return DateTime.fromSeconds(timestamp, opt).toRelative()
},
/**
* @description build v-calendar attributes
* @link https://vcalendar.io/attributes.html
*/
attributesFromEvents(events) {
const attributes = []
const opt = {
zone: store.state.settings.instance_timezone,
locale: app.i18n.locale || store.state.settings.instance_locale
}
const now = DateTime.local(opt).toUnixInteger()
for (const e of events) {
const tmp = DateTime.fromSeconds(e.start_datetime, opt)
const start = DateTime.local().set({ year: tmp.year, month: tmp.month, day: tmp.day })
// merge events with same date
const key = `${start.month}${start.day}`
const c = (e.end_datetime || e.start_datetime) < now ? 'vc-past' : ''
if (e.multidate === true && e.end_datetime) {
attributes.push({
dates: { start: start.toJSDate(), end: DateTime.fromSeconds(e.end_datetime).toJSDate() },
highlight: {
start: { fillMode: 'outline' },
base: { fillMode: 'light' },
end: { fillMode: 'outline' },
}
})
continue
}
const i = attributes.find(a => a.day === key)
if (!i) {
attributes.push({
day: key,
key: e.id, n: 1,
dates: start.toJSDate(),
dot: { color: 'teal', class: c }
})
continue
}
i.n++
if (i.n >= 20) {
i.dot = { color: 'purple', class: c }
} else if (i.n >= 10) {
i.dot = { color: 'red', class: c }
} else if (i.n >= 5) {
i.dot = { color: 'orange', class: c }
} else if (i.n >= 3) {
i.dot = { color: 'yellow', class: c }
} else {
i.dot = { color: 'teal', class: c }
}
}
// add a bar to highlight today
attributes.push({ key: 'today', dates: new Date(), highlight: { color: 'green', fillMode: 'outline' }})
return attributes
}
}
inject('time', time)
}