diff --git a/src/components/settings/CategoryCreateUpdate.vue b/src/components/settings/CategoryCreateUpdate.vue index 117de3f..4b2a320 100644 --- a/src/components/settings/CategoryCreateUpdate.vue +++ b/src/components/settings/CategoryCreateUpdate.vue @@ -9,6 +9,8 @@ import {useSpaceStore} from "@/stores/spaceStore"; import {CategoryType, CategoryTypeName} from "@/models/enums"; import emojiRegex from 'emoji-regex' import {useCategoriesStore} from "@/stores/categories-store"; +import {CreateCategoryDTO, UpdateCategoryDTO} from "@/models/category"; +import ConfirmDialog from '@/components/ConfirmDialog.vue' const route = useRoute() @@ -17,14 +19,21 @@ const toolbar = useToolbarStore(); const toast = useToast(); const spaceStore = useSpaceStore(); const categoriesStore = useCategoriesStore(); -const categoryId = ref(route.params.id) +const tgApp = window.Telegram.WebApp + + +const categoryId = ref(route.params.id as string) const mode = computed(() => { return categoryId.value ? "edit" : "create" }) const categoryType = ref(CategoryType.EXPENSE) -const categoryName = ref() +const isCategoryTypeError = ref(false) +const categoryName = ref('') +const isCategoryNameError = ref(false) const categoryIcon = ref("🛍️") -const categoryDescription = ref() +const isCategoryIconError = ref(false) +const categoryDescription = ref('') +const isCategoryDescriptionError = ref(false) // Генерим опции: [{ label: "Расходы", value: "EXPENSE" }, ...] @@ -82,22 +91,123 @@ function handleCompositionEnd(e: CompositionEvent) { handleInput(e as unknown as Event) } +const validateForm = (): boolean => { + if (!categoryType.value) { + isCategoryTypeError.value = true + return false; + } + if (categoryName.value.length == 0) { + isCategoryNameError.value = true + return false; + } + if (categoryIcon.value.length == 0) { + isCategoryIconError.value = true + return false; + } + console.log(categoryDescription.value.length) + if (categoryDescription.value.length == 0) { + isCategoryDescriptionError.value = true + return false; + } + return true; +} + +const buildUpdate = (): UpdateCategoryDTO => { + if (validateForm()) { + return { + type: categoryType.value, + name: categoryName.value, + description: categoryDescription.value, + icon: categoryIcon.value, + } as UpdateCategoryDTO + } else { + throw Error("Error while validating form") + } +} + +const buildCreate = (): CreateCategoryDTO => { + if (validateForm()) { + return { + type: categoryType.value, + name: categoryName.value, + description: categoryDescription.value, + icon: categoryIcon.value, + } as CreateCategoryDTO + } else { + throw Error("Error while validating form") + } +} + +const moveUser = async () => { + if (window.history.length > 1) { + console.log('moved back') + router.back() + } else { + console.log('moved forward') + await router.push('/categories') + } +} + +const isDeleteAlertVisible = ref(false) +const deleteAlertMessage = ref('Do you really want to delete the category?') +const deleteCategory = async () => { + if (spaceStore.selectedSpaceId) { + await categoriesService.deleteCategory(spaceStore.selectedSpaceId, Number(categoryId.value)) + await categoriesStore.fetchCategories(spaceStore.selectedSpaceId) + await moveUser() + } +} + + onMounted(async () => { if (mode.value === "edit") { await fetchCategory() toolbar.registerHandler('deleteCategory', () => { + if (tgApp.initData) { + tgApp.showConfirm(deleteAlertMessage, async (confirmed: boolean) => { + if (confirmed) { + await deleteCategory() + } + }) + } else { + isDeleteAlertVisible.value = true + } }) toolbar.registerHandler('updateCategory', async () => { if (spaceStore.selectedSpaceId) { // await categoriesStore.fetchCategories(spaceStore.selectedSpaceId) - router.back() + try { + let updateDTO = buildUpdate() + await categoriesService.updateCategory(spaceStore.selectedSpaceId, updateDTO) + console.log(updateDTO) + await moveUser() + } catch (e) { + toast.add({ + severity: "error", + summary: "Error while updating category", + detail: e, + life: 3000, + }) + } } }) } else { toolbar.registerHandler('createCategory', async () => { if (spaceStore.selectedSpaceId) { // await categoriesStore.fetchCategories(spaceStore.selectedSpaceId) - router.back() + try { + let createDTO = buildCreate() + await categoriesService.createCategory(spaceStore.selectedSpaceId, createDTO) + console.log(createDTO) + await moveUser() + } catch (e) { + toast.add({ + severity: "error", + summary: "Error while creating category", + detail: e, + life: 3000 + }) + } } }) @@ -108,7 +218,11 @@ onMounted(async () => {