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
+15 -18
View File
@@ -1,21 +1,18 @@
import { useNavigate } from 'react-router'
import { MatchCardCompact } from '../match-card/MatchCardCompact'
import { buildMatchCardViewModel } from '../../features/matching/matchCardAdapter'
import { useCompareStore } from '../../stores/compareStore'
import type { UnifiedMatchResult } from '../../domain/unifiedResult'
import type { MatchCardAction } from '../match-card/MatchCardViewModel'
interface Props {
result: UnifiedMatchResult
isInCompare: boolean
onCompare: (propertyId: string) => void
}
export function UnifiedResultCard({ result, isInCompare, onCompare }: Props) {
export function UnifiedResultCard({ result }: Props) {
const navigate = useNavigate()
const isFuture = result.resultType === 'FUTURE_AVAILABILITY'
const compareId = !isFuture
? (result as { property: { id: string } }).property.id
: ''
const { addToCompare, removeFromCompare, isInCompare, isFull } = useCompareStore()
const inCompare = isInCompare(result.matchId)
const actions: MatchCardAction[] = [
{
@@ -26,17 +23,17 @@ export function UnifiedResultCard({ result, isInCompare, onCompare }: Props) {
disabled: true,
onClick: () => {},
},
...(!isFuture
? [
{
id: 'compare',
label: 'Vergleichen',
actionType: 'ADD_COMPARE' as const,
variant: (isInCompare ? 'primary' : 'secondary') as 'primary' | 'secondary',
onClick: () => onCompare(compareId),
},
]
: []),
{
id: 'compare',
label: inCompare ? 'Im Vergleich' : 'Vergleichen',
actionType: 'ADD_COMPARE',
variant: inCompare ? 'primary' : 'secondary',
disabled: !inCompare && isFull(),
onClick: () => {
if (inCompare) removeFromCompare(result.matchId)
else addToCompare(result)
},
},
{
id: 'details',
label: 'Details',