mirror of
https://github.com/ThisIsBenny/wishlist-app.git
synced 2025-06-07 05:57:41 +00:00
component refactored
Signed-off-by: Benny Samir Hierl <bennysamir@posteo.de>
This commit is contained in:
parent
daac056168
commit
1b05397559
4 changed files with 56 additions and 52 deletions
|
@ -61,19 +61,22 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Form } from 'vee-validate'
|
|
||||||
import { object, string, boolean } from 'yup'
|
|
||||||
import { useI18n } from 'vue-i18n'
|
|
||||||
import ImageTile from '@/components/ImageTile.vue'
|
|
||||||
import BaseButton from '@/components/BaseButton.vue'
|
|
||||||
import InputText from '@/components/InputText.vue'
|
|
||||||
import InputCheckbox from '@/components/InputCheckbox.vue'
|
|
||||||
import InputTextArea from '@/components/InputTextArea.vue'
|
|
||||||
import { IconSave } from '@/components/icons'
|
|
||||||
import { useEditMode } from '@/composables'
|
|
||||||
import { Wishlist } from '@/types'
|
import { Wishlist } from '@/types'
|
||||||
import { PropType } from 'vue'
|
import { PropType } from 'vue'
|
||||||
const { isActive: editModeIsActive } = useEditMode()
|
import { useRouter } from 'vue-router'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { Form } from 'vee-validate'
|
||||||
|
import { object, string, boolean } from 'yup'
|
||||||
|
import { useToast } from 'vue-toastification'
|
||||||
|
import {
|
||||||
|
BaseButton,
|
||||||
|
ImageTile,
|
||||||
|
InputText,
|
||||||
|
InputCheckbox,
|
||||||
|
InputTextArea,
|
||||||
|
} from '@/components'
|
||||||
|
import { IconSave } from '@/components/icons'
|
||||||
|
import { useEditMode, useWishlistStore } from '@/composables'
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
|
@ -81,7 +84,12 @@ defineProps({
|
||||||
requried: true,
|
requried: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
const emit = defineEmits(['update'])
|
|
||||||
|
const router = useRouter()
|
||||||
|
const toast = useToast()
|
||||||
|
|
||||||
|
const { isActive: editModeIsActive } = useEditMode()
|
||||||
|
const { update } = useWishlistStore()
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
@ -104,7 +112,13 @@ const schema = object({
|
||||||
.url(t('components.wishlist-header.main.form.image-src.error-url')),
|
.url(t('components.wishlist-header.main.form.image-src.error-url')),
|
||||||
})
|
})
|
||||||
|
|
||||||
const onSubmit = (values: any): void => {
|
const onSubmit = async (values: any): Promise<void> => {
|
||||||
emit('update', values)
|
try {
|
||||||
|
await update(values)
|
||||||
|
toast.success(t('common.wishlist.saved.text'))
|
||||||
|
router.push(`/${values.slugUrlText}`)
|
||||||
|
} catch (error) {
|
||||||
|
toast.error(t('common.wishlist.saving-failed.text'))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
10
src/components/index.ts
Normal file
10
src/components/index.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
export { default as BaseButton } from './BaseButton.vue'
|
||||||
|
export { default as Header } from './Header.vue'
|
||||||
|
export { default as ImagePreview } from './ImagePreview.vue'
|
||||||
|
export { default as ImageTile } from './ImageTile.vue'
|
||||||
|
export { default as InputCheckbox } from './InputCheckbox.vue'
|
||||||
|
export { default as InputText } from './InputText.vue'
|
||||||
|
export { default as InputTextArea } from './InputTextArea.vue'
|
||||||
|
export { default as Modal } from './Modal.vue'
|
||||||
|
export { default as WishlistHeader } from './WishlistHeader.vue'
|
||||||
|
export { default as WishlistItem } from './WishlistItem.vue'
|
|
@ -1,7 +1,9 @@
|
||||||
import { ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import useAxios, { CustomAxiosError } from '@/composables/useAxios'
|
import useAxios, { CustomAxiosError } from '@/composables/useAxios'
|
||||||
import { Wishlist, WishlistItem } from '@/types'
|
import { Wishlist, WishlistItem } from '@/types'
|
||||||
|
import { useEditMode } from './useEditMode'
|
||||||
const { client } = useAxios()
|
const { client } = useAxios()
|
||||||
|
const { isActive: editModeIsActive } = useEditMode()
|
||||||
|
|
||||||
//@ts-expect-error ...
|
//@ts-expect-error ...
|
||||||
const state = ref<Wishlist>({})
|
const state = ref<Wishlist>({})
|
||||||
|
@ -43,6 +45,15 @@ const itemBought = async (item: WishlistItem): Promise<void> => {
|
||||||
item.bought = true
|
item.bought = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const filteredItems = computed(() => {
|
||||||
|
if (!state.value || !state.value.items) {
|
||||||
|
return []
|
||||||
|
} else if (editModeIsActive.value) {
|
||||||
|
return state.value.items
|
||||||
|
}
|
||||||
|
return state.value.items.filter((item: WishlistItem) => item.bought === false)
|
||||||
|
})
|
||||||
|
|
||||||
export const useWishlistStore = () => {
|
export const useWishlistStore = () => {
|
||||||
return {
|
return {
|
||||||
state,
|
state,
|
||||||
|
@ -50,5 +61,6 @@ export const useWishlistStore = () => {
|
||||||
fetch,
|
fetch,
|
||||||
update,
|
update,
|
||||||
itemBought,
|
itemBought,
|
||||||
|
filteredItems,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +1,19 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { useToast } from 'vue-toastification'
|
import { WishlistItem as WishlistItemType } from '@/types'
|
||||||
import { Wishlist, WishlistItem as WishlistItemType } from '@/types'
|
import { useRoute } from 'vue-router'
|
||||||
import { computed } from 'vue'
|
import { useWishlistStore, useModal } from '@/composables'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
|
||||||
import { useWishlistStore, useModal, useEditMode } from '@/composables'
|
|
||||||
import WishlistItem from '@/components/WishlistItem.vue'
|
import WishlistItem from '@/components/WishlistItem.vue'
|
||||||
import WishlistHeader from '@/components/WishlistHeader.vue'
|
import WishlistHeader from '@/components/WishlistHeader.vue'
|
||||||
import { IconNoGift } from '../components/icons'
|
import { IconNoGift } from '../components/icons'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
|
||||||
const modal = useModal()
|
const modal = useModal()
|
||||||
const { isActive: editModeIsActive } = useEditMode()
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const toast = useToast()
|
|
||||||
|
|
||||||
const {
|
const { state, fetch, isReady, itemBought, filteredItems } = useWishlistStore()
|
||||||
state,
|
|
||||||
fetch,
|
|
||||||
isReady,
|
|
||||||
itemBought,
|
|
||||||
update: updateWishlist,
|
|
||||||
} = useWishlistStore()
|
|
||||||
await fetch(route.params.slug as string)
|
await fetch(route.params.slug as string)
|
||||||
|
|
||||||
const filteredItems = computed(() => {
|
|
||||||
if (!state.value || !state.value.items) {
|
|
||||||
return []
|
|
||||||
} else if (editModeIsActive.value) {
|
|
||||||
return state.value.items
|
|
||||||
}
|
|
||||||
return state.value.items.filter(
|
|
||||||
(item: WishlistItemType) => item.bought === false
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
const bought = async (item: WishlistItemType): Promise<void> => {
|
const bought = async (item: WishlistItemType): Promise<void> => {
|
||||||
const confirmed = await modal.show(
|
const confirmed = await modal.show(
|
||||||
t('pages.detail-view.confirmation-modal.title.text'),
|
t('pages.detail-view.confirmation-modal.title.text'),
|
||||||
|
@ -47,21 +25,11 @@ const bought = async (item: WishlistItemType): Promise<void> => {
|
||||||
itemBought(item)
|
itemBought(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleUpdateWishlist = async (values: Wishlist) => {
|
|
||||||
try {
|
|
||||||
await updateWishlist(values)
|
|
||||||
toast.success(t('common.wishlist.saved.text'))
|
|
||||||
router.push(`/${state.value?.slugUrlText}`)
|
|
||||||
} catch (error) {
|
|
||||||
toast.error(t('common.wishlist.saving-failed.text'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="isReady" class="h-full">
|
<div v-if="isReady" class="h-full">
|
||||||
<WishlistHeader v-model="state" @update="handleUpdateWishlist" />
|
<WishlistHeader v-model="state" />
|
||||||
<div
|
<div
|
||||||
v-if="filteredItems.length > 0"
|
v-if="filteredItems.length > 0"
|
||||||
class="flex flex-col space-y-14 py-10 md:space-y-8"
|
class="flex flex-col space-y-14 py-10 md:space-y-8"
|
||||||
|
|
Loading…
Add table
Reference in a new issue