Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(message): update timestamp message every minute #300

Merged
merged 2 commits into from
Nov 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions components/tailored/messaging/group/Group.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@
<span v-on:click="showQuickProfile">
<UiUsername :username="username" :badge="badge" />
</span>
<TypographyText :text="$dayjs(group.at).from()" />
<TypographyText :text="timestamp" />
</div>
<div class="group-messages">
<TailoredMessagingMessage v-for="message in group.messages" :group="group" :message="message" :from="username" :key="message.id" />
<TailoredMessagingMessage
v-for="message in group.messages"
:group="group"
:message="message"
:from="username"
:key="message.id"
/>
</div>
</div>
</div>
</div>
23 changes: 23 additions & 0 deletions components/tailored/messaging/group/Group.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
<script lang="ts">
import Vue, { PropType } from 'vue'

import { Config } from '~/config'

import { Group } from '~/types/messaging'
import { User } from '~/types/ui/user'
import {
getUsernameFromState,
getAddressFromState,
refreshTimestampInterval,
} from '~/utilities/Messaging'

export default Vue.extend({
Expand All @@ -16,6 +19,12 @@ export default Vue.extend({
// default: () => {},
},
},
data() {
return {
timestampRefreshInterval: null,
timestamp: this.$dayjs(this.group.at).from(),
}
},
computed: {
address() {
return getAddressFromState(this.group.from, this.$store.state)
Expand All @@ -41,6 +50,20 @@ export default Vue.extend({
this.$store.commit('ui/quickProfile', true)
},
},
created() {
const setTimestamp = (timePassed: string) => {
this.$data.timestamp = timePassed
}

this.$data.timestampRefreshInterval = refreshTimestampInterval(
this.group.at,
setTimestamp,
Config.chat.timestampUpdateInterval
)
},
beforeDestroy() {
clearInterval(this.$data.refreshTimestampEveryMinute)
},
})
</script>
<style scoped lang="less" src="./Group.less"></style>
71 changes: 55 additions & 16 deletions components/tailored/messaging/message/Message.html
Original file line number Diff line number Diff line change
@@ -1,35 +1,74 @@
<div class="is-message" @contextmenu="contextMenu">
<div @mouseenter="mouseOver" @mouseleave="mouseOver"
:class="`message-container ${messageHover ? 'message-hover' : '' } ${message.pinned ? 'pinned-message' : ''}`">

<div
@mouseenter="mouseOver"
@mouseleave="mouseOver"
:class="`message-container ${messageHover ? 'message-hover' : '' } ${message.pinned ? 'pinned-message' : ''}`"
>
<div v-if="message.pinned" class="pinned-badge">
<archive-icon size="0.85x" />
Archived
</div>
<div v-if="hideActions" class="inline-meta">
<div class="sat-icon-container satellite-icon-helper">
<UiCircle type="random" :seed="$mock.users.filter(u => u.name === from)[0].address" :size="23" />
<UiCircle
type="random"
:seed="$mock.users.filter(u => u.name === from)[0].address"
:size="23"
/>
</div>
<UiUsername :username="from" :badge="$mock.users.filter(u => u.name === from)[0].badge" />
<TypographyText :text="$dayjs(message.at).from()" />
<UiUsername
:username="from"
:badge="$mock.users.filter(u => u.name === from)[0].badge"
/>
<TypographyText :text="timestamp" />
</div>
<TailoredMessagingMessageActions
v-if="messageHover && !hideActions"
:setReplyChatbarContent="setReplyChatbarContent"
:emojiReaction="emojiReaction"
:editMessage="editMessage"
:messageOwner="this.$props.message.from" />
<VueMarkdown v-if="!messageEdit && message.type === 'text'" :source="message.payload" class="markdown" />
<UiImage v-else-if="message.type === 'image'" :source="message.payload.url" alt="" />
:messageOwner="this.$props.message.from"
/>
<VueMarkdown
v-if="!messageEdit && message.type === 'text'"
:source="message.payload"
class="markdown"
/>
<UiImage
v-else-if="message.type === 'image'"
:source="message.payload.url"
alt=""
/>
<!-- Only for video types we can't embed directly without doing something sketchy, like sending it to a server somewhere to extract the HTML5 video-->
<UiEmbedsEmbeddedLinkContent v-if="message.type === 'text'" :data="message.payload" />
<UiEmbedsVideoPlayer v-else-if="message.type === 'video'" :data="message.payload" />
<UiEmbedsAudioPlayer v-else-if="message.type === 'audio'" :data="message.payload" />
<UiEmbedsEmbeddedLinkContent
v-if="message.type === 'text'"
:data="message.payload"
/>
<UiEmbedsVideoPlayer
v-else-if="message.type === 'video'"
:data="message.payload"
/>
<UiEmbedsAudioPlayer
v-else-if="message.type === 'audio'"
:data="message.payload"
/>
<UiEmbedsFile v-else-if="message.type === 'file'" :data="message.payload" />
<TailoredMessagingMessageReactions v-if="!hideActions && hasReactions" :message="this.$props.message"
<TailoredMessagingMessageReactions
v-if="!hideActions && hasReactions"
:message="this.$props.message"
:group="this.$props.group"
:key="`${this.$props.message.id}-${hasReactions ? this.$props.message.reactions.length : 0}`" />
:key="`${this.$props.message.id}-${hasReactions ? this.$props.message.reactions.length : 0}`"
/>
</div>
<TailoredMessagingMessageReply :message="message" :group="group" v-if="!hideActions" :from="from" />
<TailoredMessagingMessageEdit v-if="messageEdit" :message="message.payload" @commitMessage="saveMessage" />
<TailoredMessagingMessageReply
:message="message"
:group="group"
v-if="!hideActions"
:from="from"
/>
<TailoredMessagingMessageEdit
v-if="messageEdit"
:message="message.payload"
@commitMessage="saveMessage"
/>
</div>
19 changes: 19 additions & 0 deletions components/tailored/messaging/message/Message.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import { ArchiveIcon } from 'satellite-lucide-icons'

import VueMarkdown from 'vue-markdown'
import { ContextMenu } from '~/components/mixins/UI/ContextMenu'

import { Config } from '~/config'
import { UIMessage, Group } from '~/types/messaging'
import { refreshTimestampInterval } from '~/utilities/Messaging'

declare module 'vue/types/vue' {
interface Vue {
Expand Down Expand Up @@ -76,6 +79,8 @@ export default Vue.extend({
{ text: 'Save Image', func: (this as any).testFunc },
{ text: 'Copy Link', func: (this as any).testFunc },
],
timestampRefreshInterval: null,
timestamp: this.$dayjs(this.$props.message.at).from(),
}
},
computed: {
Expand Down Expand Up @@ -180,6 +185,20 @@ export default Vue.extend({
})
},
},
created() {
const setTimestamp = (timePassed: string) => {
this.$data.timestamp = timePassed
}

this.$data.timestampRefreshInterval = refreshTimestampInterval(
this.$props.message.at,
setTimestamp,
Config.chat.timestampUpdateInterval
)
},
beforeDestroy() {
clearInterval(this.$data.refreshTimestampEveryMinute)
},
})
</script>
<style lang="less" src="./Message.less"></style>
1 change: 1 addition & 0 deletions config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ export const Config = {
chat: {
defaultMessageLimit: 50,
defalutLoadMoreLimit: 20,
timestampUpdateInterval: 60 * 1000,
},
routingMiddleware: {
prerequisitesCheckBypass: ['auth', 'setup'],
Expand Down
12 changes: 12 additions & 0 deletions utilities/Messaging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,3 +203,15 @@ export function getAddressFromState(

return address
}

export function refreshTimestampInterval(
timestamp: number,
action: (timePassed: string) => any,
interval: number
) {
return setInterval(() => {
const updatedTimestamp = dayjs(timestamp).fromNow()

action(updatedTimestamp)
}, interval)
}