feat: F014 compare view — side-by-side decision table with AI summary

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-16 14:28:06 +02:00
parent 2cb29a1920
commit 2753d1717c
14 changed files with 884 additions and 350 deletions
+16 -15
View File
@@ -1,27 +1,28 @@
import { create } from 'zustand'
import type { UnifiedMatchResult } from '../domain/unifiedResult'
const MAX_COMPARE_ITEMS = 3
const MAX_COMPARE_ITEMS = 4
interface CompareState {
compareTray: string[]
addToCompare: (propertyId: string) => void
removeFromCompare: (propertyId: string) => void
compareItems: UnifiedMatchResult[]
addToCompare: (result: UnifiedMatchResult) => void
removeFromCompare: (matchId: string) => void
clearCompare: () => void
isInCompare: (propertyId: string) => boolean
isInCompare: (matchId: string) => boolean
isFull: () => boolean
}
export const useCompareStore = create<CompareState>((set, get) => ({
compareTray: [],
addToCompare: (propertyId) =>
compareItems: [],
addToCompare: (result) =>
set((state) => {
if (state.compareTray.length >= MAX_COMPARE_ITEMS) return state
if (state.compareTray.includes(propertyId)) return state
return { compareTray: [...state.compareTray, propertyId] }
if (state.compareItems.length >= MAX_COMPARE_ITEMS) return state
if (state.compareItems.some(i => i.matchId === result.matchId)) return state
return { compareItems: [...state.compareItems, result] }
}),
removeFromCompare: (propertyId) =>
set((state) => ({ compareTray: state.compareTray.filter(id => id !== propertyId) })),
clearCompare: () => set({ compareTray: [] }),
isInCompare: (propertyId) => get().compareTray.includes(propertyId),
isFull: () => get().compareTray.length >= MAX_COMPARE_ITEMS,
removeFromCompare: (matchId) =>
set((state) => ({ compareItems: state.compareItems.filter(i => i.matchId !== matchId) })),
clearCompare: () => set({ compareItems: [] }),
isInCompare: (matchId) => get().compareItems.some(i => i.matchId === matchId),
isFull: () => get().compareItems.length >= MAX_COMPARE_ITEMS,
}))