naive-ui
Version:
A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast
89 lines • 2.66 kB
JavaScript
import { computed, createTextVNode, defineComponent, h } from 'vue';
import { format, formatDistanceStrict, fromUnixTime } from 'date-fns';
import { formatInTimeZone } from 'date-fns-tz';
import { useLocale } from "../../_mixins/index.mjs";
export const timeProps = {
time: {
type: [Number, Date],
default: undefined // For unix or non unix mode, it should be different default value
},
type: {
type: String,
default: 'datetime'
},
to: {
type: [Number, Date],
default: undefined // the same as `time` prop
},
unix: Boolean,
format: String,
text: Boolean,
timeZone: String
};
export default defineComponent({
name: 'Time',
props: timeProps,
setup(props) {
const now = Date.now();
const {
localeRef,
dateLocaleRef
} = useLocale('Time');
const mergedFormatRef = computed(() => {
const {
timeZone
} = props;
if (timeZone) {
return (time, _format, options) => {
return formatInTimeZone(time, timeZone, _format, options);
};
}
return format;
});
const dateFnsOptionsRef = computed(() => {
return {
locale: dateLocaleRef.value.locale
};
});
const mergedTimeRef = computed(() => {
const {
time
} = props;
if (props.unix) {
if (time === undefined) return now;
return fromUnixTime(typeof time === 'number' ? time : time.valueOf());
}
return time !== null && time !== void 0 ? time : now;
});
const mergedToRef = computed(() => {
const {
to
} = props;
if (props.unix) {
if (to === undefined) return now;
return fromUnixTime(typeof to === 'number' ? to : to.valueOf());
}
return to !== null && to !== void 0 ? to : now;
});
const renderedTimeRef = computed(() => {
if (props.format) {
return mergedFormatRef.value(mergedTimeRef.value, props.format, dateFnsOptionsRef.value);
} else if (props.type === 'date') {
return mergedFormatRef.value(mergedTimeRef.value, localeRef.value.dateFormat, dateFnsOptionsRef.value);
} else if (props.type === 'datetime') {
return mergedFormatRef.value(mergedTimeRef.value, localeRef.value.dateTimeFormat, dateFnsOptionsRef.value);
} else {
return formatDistanceStrict(mergedTimeRef.value, mergedToRef.value, {
addSuffix: true,
locale: dateLocaleRef.value.locale
});
}
});
return {
renderedTime: renderedTimeRef
};
},
render() {
return this.text ? createTextVNode(this.renderedTime) : h('time', [this.renderedTime]);
}
});