diff --git a/src/components/GenerationPreviewModal.vue b/src/components/GenerationPreviewModal.vue index 6d0d2b8..6cb1a22 100644 --- a/src/components/GenerationPreviewModal.vue +++ b/src/components/GenerationPreviewModal.vue @@ -3,6 +3,7 @@ import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue' import Dialog from 'primevue/dialog' import Button from 'primevue/button' import Tag from 'primevue/tag' +import { dataService } from '../services/dataService' const props = defineProps({ visible: { @@ -23,11 +24,40 @@ const props = defineProps({ } }) -const emit = defineEmits(['update:visible', 'reusePrompt', 'reuseAsset', 'useResultAsAsset']) +const emit = defineEmits(['update:visible', 'reusePrompt', 'reuseAsset', 'useResultAsAsset', 'liked']) const previewIndex = ref(0) const previewImage = computed(() => props.previewImages[previewIndex.value] || null) +// Like state management +const isTogglingLike = ref(false) +const localLikedStates = ref({}) // id -> bool + +const isLiked = computed(() => { + if (!previewImage.value?.gen) return false + const id = previewImage.value.gen.id || previewImage.value.gen._id + if (localLikedStates.value[id] !== undefined) return localLikedStates.value[id] + return previewImage.value.gen.is_liked || false +}) + +const toggleLike = async () => { + const id = previewImage.value?.gen?.id || previewImage.value?.gen?._id + if (!id || isTogglingLike.value) return + + isTogglingLike.value = true + try { + const response = await dataService.toggleLike(id) + // Assume response returns the new state or we just toggle it + const newState = response.is_liked !== undefined ? response.is_liked : !isLiked.value + localLikedStates.value[id] = newState + emit('liked', { id, is_liked: newState }) + } catch (e) { + console.error('Failed to toggle like', e) + } finally { + isTogglingLike.value = false + } +} + // Reset index when modal opens watch(() => props.visible, (newVal) => { if (newVal) { @@ -125,6 +155,13 @@ const onUseResultAsAsset = () => { class="max-w-full max-h-[85vh] object-contain shadow-2xl transition-transform duration-300" draggable="false" /> + + +