chore: refactor notifications component to use ts and setup
This commit is contained in:
parent
3e7f598ee8
commit
315da424ec
1 changed files with 76 additions and 78 deletions
|
@ -46,95 +46,93 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts" setup>
|
||||||
import {defineComponent} from 'vue'
|
import {computed, onMounted, onUnmounted, ref} from 'vue'
|
||||||
|
|
||||||
import NotificationService from '@/services/notification'
|
import NotificationService from '@/services/notification'
|
||||||
import User from '@/components/misc/user.vue'
|
import User from '@/components/misc/user.vue'
|
||||||
import names from '@/models/constants/notificationNames.json'
|
import names from '@/models/constants/notificationNames.json'
|
||||||
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
|
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
|
||||||
import {mapState} from 'vuex'
|
import {useStore} from 'vuex'
|
||||||
|
import {useRouter} from 'vue-router'
|
||||||
|
|
||||||
const LOAD_NOTIFICATIONS_INTERVAL = 10000
|
const LOAD_NOTIFICATIONS_INTERVAL = 10000
|
||||||
|
|
||||||
export default defineComponent({
|
const store = useStore()
|
||||||
name: 'notifications',
|
const router = useRouter()
|
||||||
components: {User},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
notificationService: new NotificationService(),
|
|
||||||
allNotifications: [],
|
|
||||||
showNotifications: false,
|
|
||||||
interval: null,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.loadNotifications()
|
|
||||||
document.addEventListener('click', this.hidePopup)
|
|
||||||
this.interval = setInterval(this.loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
|
||||||
},
|
|
||||||
beforeUnmount() {
|
|
||||||
document.removeEventListener('click', this.hidePopup)
|
|
||||||
clearInterval(this.interval)
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
unreadNotifications() {
|
|
||||||
return this.notifications.filter(n => n.readAt === null).length
|
|
||||||
},
|
|
||||||
notifications() {
|
|
||||||
return this.allNotifications ? this.allNotifications.filter(n => n.name !== '') : []
|
|
||||||
},
|
|
||||||
...mapState({
|
|
||||||
userInfo: state => state.auth.info,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
hidePopup(e) {
|
|
||||||
if (this.showNotifications) {
|
|
||||||
closeWhenClickedOutside(e, this.$refs.popup, () => this.showNotifications = false)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async loadNotifications() {
|
|
||||||
// We're recreating the notification service here to make sure it uses the latest api user token
|
|
||||||
const notificationService = new NotificationService()
|
|
||||||
this.allNotifications = await notificationService.getAll()
|
|
||||||
},
|
|
||||||
to(n, index) {
|
|
||||||
const to = {
|
|
||||||
name: '',
|
|
||||||
params: {},
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (n.name) {
|
const allNotifications = ref([])
|
||||||
case names.TASK_COMMENT:
|
const showNotifications = ref(false)
|
||||||
case names.TASK_ASSIGNED:
|
const popup = ref(null)
|
||||||
to.name = 'task.detail'
|
|
||||||
to.params.id = n.notification.task.id
|
|
||||||
break
|
|
||||||
case names.TASK_DELETED:
|
|
||||||
// Nothing
|
|
||||||
break
|
|
||||||
case names.LIST_CREATED:
|
|
||||||
to.name = 'task.index'
|
|
||||||
to.params.listId = n.notification.list.id
|
|
||||||
break
|
|
||||||
case names.TEAM_MEMBER_ADDED:
|
|
||||||
to.name = 'teams.edit'
|
|
||||||
to.params.id = n.notification.team.id
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
return async () => {
|
const unreadNotifications = computed(() => {
|
||||||
if (to.name !== '') {
|
return notifications.value.filter(n => n.readAt === null).length
|
||||||
this.$router.push(to)
|
|
||||||
}
|
|
||||||
|
|
||||||
n.read = true
|
|
||||||
this.allNotifications[index] = await this.notificationService.update(n)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
const notifications = computed(() => {
|
||||||
|
return allNotifications.value ? allNotifications.value.filter(n => n.name !== '') : []
|
||||||
|
})
|
||||||
|
const userInfo = computed(() => store.state.auth.info)
|
||||||
|
|
||||||
|
let interval: number
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadNotifications()
|
||||||
|
document.addEventListener('click', hidePopup)
|
||||||
|
interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
document.removeEventListener('click', hidePopup)
|
||||||
|
clearInterval(interval)
|
||||||
|
})
|
||||||
|
|
||||||
|
async function loadNotifications() {
|
||||||
|
// We're recreating the notification service here to make sure it uses the latest api user token
|
||||||
|
const notificationService = new NotificationService()
|
||||||
|
allNotifications.value = await notificationService.getAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
function hidePopup(e) {
|
||||||
|
if (showNotifications.value) {
|
||||||
|
closeWhenClickedOutside(e, popup.value, () => showNotifications.value = false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function to(n, index) {
|
||||||
|
const to = {
|
||||||
|
name: '',
|
||||||
|
params: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (n.name) {
|
||||||
|
case names.TASK_COMMENT:
|
||||||
|
case names.TASK_ASSIGNED:
|
||||||
|
to.name = 'task.detail'
|
||||||
|
to.params.id = n.notification.task.id
|
||||||
|
break
|
||||||
|
case names.TASK_DELETED:
|
||||||
|
// Nothing
|
||||||
|
break
|
||||||
|
case names.LIST_CREATED:
|
||||||
|
to.name = 'task.index'
|
||||||
|
to.params.listId = n.notification.list.id
|
||||||
|
break
|
||||||
|
case names.TEAM_MEMBER_ADDED:
|
||||||
|
to.name = 'teams.edit'
|
||||||
|
to.params.id = n.notification.team.id
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return async () => {
|
||||||
|
if (to.name !== '') {
|
||||||
|
router.push(to)
|
||||||
|
}
|
||||||
|
|
||||||
|
n.read = true
|
||||||
|
const notificationService = new NotificationService()
|
||||||
|
allNotifications.value[index] = await notificationService.update(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
Loading…
Reference in a new issue