Files
property-match/src/components/match-center/NeedSelectionPanel.tsx
T
Benjamin Sutter 5a1f412ce3 feat: anonymes Suchprofil — Toggle im Speichern-Schritt, supply-side Masking
- Toggle 'Anonymes Suchprofil' im AISearchSavePreview (nicht in Suchmaske)
- Box wechselt zu lila wenn aktiv, Text erklärt was anonymisiert wird
- isAnonymous wird via buildNeedInput in gespeichertes Need geschrieben
- MatchListCard + NeedSelectionPanel: zeigen 'Anonyme Anfrage' (lila) statt Firmenname

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 00:04:17 +02:00

58 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Box, Chip, Typography } from '@mui/material'
import { useNeeds } from '../../hooks/useNeeds'
import { useMatchCenterStore } from '../../stores/matchCenterStore'
import { MatchCenterSkeleton } from './MatchCenterSkeleton'
import type { Match } from '../../domain/match'
import type { Need } from '../../domain/need'
interface Props { matches: Match[] }
export function NeedSelectionPanel({ matches }: Props) {
const { data: needs = [], isLoading } = useNeeds()
const { selectedNeedId, setSelectedNeed } = useMatchCenterStore()
if (isLoading) return <MatchCenterSkeleton />
return (
<Box sx={{ overflowY: 'auto', flex: 1 }}>
{needs.map((need: Need) => {
const pendingCount = matches.filter(m => m.needId === need.id && m.status === 'PENDING_REVIEW').length
const isSelected = selectedNeedId === need.id
return (
<Box
key={need.id}
onClick={() => setSelectedNeed(isSelected ? null : need.id)}
sx={{
p: 1.5,
cursor: 'pointer',
borderBottom: '1px solid #f1f5f9',
borderRight: isSelected ? '3px solid #d97706' : '3px solid transparent',
bgcolor: isSelected ? '#fef3c7' : 'transparent',
'&:hover': { bgcolor: isSelected ? '#fef3c7' : '#f8fafc' },
}}
>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 0.5 }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.75, flex: 1, mr: 0.5, minWidth: 0 }}>
<Typography variant="body2" sx={{ fontWeight: 600, lineHeight: 1.3 }} noWrap>
{need.isAnonymous ? 'Anonyme Anfrage' : need.companyName}
</Typography>
{need.isAnonymous && (
<Chip label="Anonym" size="small" sx={{ bgcolor: '#f5f3ff', color: '#6d28d9', fontSize: 9, height: 16, fontWeight: 700, flexShrink: 0, border: '1px solid #ddd6fe' }} />
)}
</Box>
{pendingCount > 0 && (
<Chip label={pendingCount} size="small"
sx={{ bgcolor: '#d97706', color: 'white', fontSize: 10, height: 18, minWidth: 22 }} />
)}
</Box>
<Typography variant="caption" color="text.secondary" sx={{ display: 'block' }}>
{need.requiredArea.min}{need.requiredArea.max} m² · {need.preferredLocations.slice(0, 2).join(', ')}
</Typography>
<Chip label={need.assetType} size="small" sx={{ mt: 0.5, fontSize: 10, height: 18 }} />
</Box>
)
})}
</Box>
)
}