thelounge/client/components/DateMarker.vue

78 lines
1.6 KiB
Vue
Raw Normal View History

<template>
2019-07-17 11:33:59 +02:00
<div :aria-label="localeDate" class="date-marker-container tooltipped tooltipped-s">
<div class="date-marker">
2019-11-20 23:16:58 +01:00
<span :aria-label="friendlyDate()" class="date-marker-text" />
</div>
</div>
</template>
2022-05-23 09:44:01 +02:00
<script lang="ts">
import dayjs from "dayjs";
import calendar from "dayjs/plugin/calendar";
import {
computed,
defineComponent,
getCurrentInstance,
onBeforeUnmount,
onMounted,
PropType,
} from "vue";
2020-03-16 18:58:40 +01:00
import eventbus from "../js/eventbus";
2022-05-23 09:44:01 +02:00
import {ClientMessage} from "../js/types";
dayjs.extend(calendar);
2022-05-23 09:44:01 +02:00
export default defineComponent({
name: "DateMarker",
props: {
2022-05-23 09:44:01 +02:00
message: {
type: Object as PropType<ClientMessage>,
required: true,
},
2022-05-23 09:44:01 +02:00
focused: Boolean,
},
2022-05-23 09:44:01 +02:00
setup(props) {
const localeDate = computed(() => dayjs(props.message.time).format("D MMMM YYYY"));
const hoursPassed = () => {
2022-05-23 11:27:10 +02:00
return (Date.now() - Date.parse(props.message.time.toString())) / 3600000;
2022-05-23 09:44:01 +02:00
};
const dayChange = () => {
// TODO: this is nasty. and maybe doesnt work?
const instance = getCurrentInstance();
instance?.proxy?.$forceUpdate();
2022-05-23 09:44:01 +02:00
if (hoursPassed() >= 48) {
eventbus.off("daychange", dayChange);
}
2022-05-23 09:44:01 +02:00
};
const friendlyDate = () => {
// See http://momentjs.com/docs/#/displaying/calendar-time/
2022-05-23 09:44:01 +02:00
return dayjs(props.message.time).calendar(null, {
sameDay: "[Today]",
lastDay: "[Yesterday]",
lastWeek: "D MMMM YYYY",
sameElse: "D MMMM YYYY",
});
2022-05-23 09:44:01 +02:00
};
onMounted(() => {
if (hoursPassed() < 48) {
eventbus.on("daychange", dayChange);
}
});
onBeforeUnmount(() => {
eventbus.off("daychange", dayChange);
});
return {
localeDate,
friendlyDate,
};
},
2022-05-23 09:44:01 +02:00
});
</script>