From f9a825b577f4266d9bd7e42baea9e28848bcd03c Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Tue, 4 Oct 2022 23:30:17 +0200 Subject: [PATCH] feat: useList composable --- src/router/index.ts | 1 + src/services/list.ts | 71 ++++++++++++++++++++++++++- src/views/list/settings/delete.vue | 24 ++++----- src/views/list/settings/duplicate.vue | 43 +++++----------- src/views/list/settings/edit.vue | 17 +++---- 5 files changed, 104 insertions(+), 52 deletions(-) diff --git a/src/router/index.ts b/src/router/index.ts index d031f34b5..1fa329511 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -300,6 +300,7 @@ const router = createRouter({ meta: { showAsModal: true, }, + props: route => ({ listId: Number(route.params.listId as string) }), }, { path: '/lists/:listId/settings/share', diff --git a/src/services/list.ts b/src/services/list.ts index 1d353de76..46f110399 100644 --- a/src/services/list.ts +++ b/src/services/list.ts @@ -1,8 +1,22 @@ +import {computed, ref, shallowReactive, unref, watch} from 'vue' +import {useRouter} from 'vue-router' +import {useI18n} from 'vue-i18n' +import type {MaybeRef} from '@vueuse/core' + +import {success} from '@/message' + import AbstractService from './abstractService' import ListModel from '@/models/list' -import type {IList} from '@/modelTypes/IList' import TaskService from './task' import {colorFromHex} from '@/helpers/color/colorFromHex' +import ListDuplicateModel from '@/models/listDuplicateModel' +import ListDuplicateService from './listDuplicateService' + +import {useListStore} from '@/stores/lists' +import {useNamespaceStore} from '@/stores/namespaces' + +import type {IList} from '@/modelTypes/IList' +import type {INamespace} from '@/modelTypes/INamespace' export default class ListService extends AbstractService { constructor() { @@ -62,4 +76,59 @@ export default class ListService extends AbstractService { cancel() } } +} + +export function useList(listId?: MaybeRef) { + const {t} = useI18n({useScope: 'global'}) + const router = useRouter() + + const listStore = useListStore() + const namespaceStore = useNamespaceStore() + + const currentListId = computed(() => unref(listId)) + const list = ref(new ListModel()) + + const listDuplicateService = shallowReactive(new ListDuplicateService()) + const isDuplicatingList = computed(() => listDuplicateService.loading) + + // load list + watch(() => unref(listId), async (watchedListId) => { + if (watchedListId === undefined) { + return + } + list.value = listStore.getListById(watchedListId) || list.value + + // TODO: load list from server + + }, {immediate: true}) + + async function duplicateList(namespaceId: INamespace['id']) { + const listDuplicate = new ListDuplicateModel({ + listId: currentListId.value, + namespaceId: namespaceId, + }) + + const duplicate = await listDuplicateService.create(listDuplicate) + + namespaceStore.addListToNamespace(duplicate.list) + listStore.setList(duplicate.list) + success({message: t('list.duplicate.success')}) + router.push({name: 'list.index', params: {listId: duplicate.list.id}}) + } + + async function deleteList() { + if (!list.value) { + return + } + + await listStore.deleteList(list.value) + success({message: t('list.delete.success')}) + router.push({name: 'home'}) + } + + return { + duplicateList, + + isDuplicatingList, + } } \ No newline at end of file diff --git a/src/views/list/settings/delete.vue b/src/views/list/settings/delete.vue index 857201919..dd2d046eb 100644 --- a/src/views/list/settings/delete.vue +++ b/src/views/list/settings/delete.vue @@ -27,34 +27,36 @@ diff --git a/src/views/list/settings/edit.vue b/src/views/list/settings/edit.vue index 4db978e6e..6284c5e38 100644 --- a/src/views/list/settings/edit.vue +++ b/src/views/list/settings/edit.vue @@ -70,7 +70,7 @@ export default { name: 'list-setting-edit' }