felicity-lims/frontend/vite/src/stores/notice.ts

74 lines
2.3 KiB
TypeScript
Raw Normal View History

2022-04-04 02:54:31 +08:00
import { defineStore } from 'pinia'
import {
GET_NOTICES_BY_CREATOR
} from '../graphql/notice.queries';
import { INotice } from "../models/notice"
import { subtractDates } from '../utils'
import { useApiUtil } from "../composables";
const { withClientQuery } = useApiUtil();
export const useNoticeStore = defineStore('notice', {
state: () => ({
notices: [],
filterBy: "all",
filters: ['all', 'active', 'expired']
} as {
notices: INotice[],
filterBy: string,
filters: string[]
}),
getters: {
getNotices: (state) => state.notices,
2022-04-08 16:30:42 +08:00
getMyNotices: (state) => (uid) => state.notices?.filter(n => n.createdByUid === uid),
2022-04-04 02:54:31 +08:00
getFilterBy: (state) => state.filterBy,
getFilters: (state) => state.filters
},
actions: {
async fetchMyNotices(uid: number){
await withClientQuery(GET_NOTICES_BY_CREATOR, { uid }, "noticesByCreator")
2022-04-08 16:30:42 +08:00
.then(payload => {
this.notices = payload?.map(n => modifyExpiry(n))
});
2022-04-04 02:54:31 +08:00
},
addNotice(notice: INotice){
2022-04-08 16:30:42 +08:00
this.notices?.unshift(modifyExpiry(notice));
2022-04-04 02:54:31 +08:00
},
updateNotice(notice: INotice){
2022-04-08 16:30:42 +08:00
const index = this.notices?.findIndex(x => x.uid === notice.uid);
2022-04-04 02:54:31 +08:00
if(index > -1) this.notices[index] = modifyExpiry(notice);
},
deleteNotice(notice: INotice){
2022-04-08 16:30:42 +08:00
const index = this.notices?.findIndex(x => x.uid === notice.uid);
if(index > -1) this.notices?.splice(index,1);
2022-04-04 02:54:31 +08:00
}
}
})
const hasExpired = (notice: INotice) => new Date() > new Date(notice.expiry)
const daysToExpiry = (notice: INotice) => subtractDates(new Date(), new Date(notice.expiry))
const modifyExpiry = (notice: INotice): INotice => {
const expired = hasExpired(notice);
const days = +daysToExpiry(notice);
notice.expired = expired
notice.dayToExpiration = days
if(expired === true) {
if(days === 0){
notice.status = "expired today"
} else {
notice.status = "expired " + days + " days ago"
}
} else {
if(days === 0){
notice.status = "expiring today"
} else {
notice.status = "expiring in " + days + " days"
}
}
return notice;
}