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: [],
|
2022-04-15 16:32:24 +08:00
|
|
|
fetchingNotices: false,
|
2022-04-04 02:54:31 +08:00
|
|
|
filterBy: "all",
|
|
|
|
filters: ['all', 'active', 'expired']
|
|
|
|
} as {
|
|
|
|
notices: INotice[],
|
2022-04-15 16:32:24 +08:00
|
|
|
fetchingNotices: boolean,
|
2022-04-04 02:54:31 +08:00
|
|
|
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){
|
2022-04-15 16:32:24 +08:00
|
|
|
this.fetchingNotices = true;
|
2022-04-04 02:54:31 +08:00
|
|
|
await withClientQuery(GET_NOTICES_BY_CREATOR, { uid }, "noticesByCreator")
|
2022-04-08 16:30:42 +08:00
|
|
|
.then(payload => {
|
2022-04-15 16:32:24 +08:00
|
|
|
this.fetchingNotices = false
|
2022-04-08 16:30:42 +08:00
|
|
|
this.notices = payload?.map(n => modifyExpiry(n))
|
2022-04-15 16:32:24 +08:00
|
|
|
}).catch(err => this.fetchingNotices = false);
|
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;
|
|
|
|
}
|