b4d398270f
- Part A: Replace InquiryStatus badges with WhatsApp-style unread indicators (isRead, unreadCount, lastReadAt on Inquiry; markThreadAsRead in service + hook) - Part B: RelatedPropertyCardPanel — reposition "Objekt ansehen", add "Weitere Matches" section via matchService.getAdditionalMatchesForInquiry - Part C: PreparationWizard 4-step dialog — property selection, report generation progress, field editing + ReportObjectFieldSelector, PDF preview + finalize - Part D: OfferCreationWizard 4-step dialog triggered from first tenant message — data capture, field editing, viewing appointments, PDF generation + attach to reply - Part E: LatentInquiryReportPreview (2-page A4 doc), ReportObjectFieldSelector (5 accordion groups, 35+ optional fields), mapImageUrl on Property domain Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
import { MockupInquiryProvider } from '../provider/MockupInquiryProvider'
|
|
import type { InquiryFilters } from '../provider/IInquiryProvider'
|
|
import type { Inquiry, Attachment } from '../domain/inquiry'
|
|
|
|
const provider = MockupInquiryProvider
|
|
|
|
export interface InquiryReplyPayload {
|
|
subject?: string
|
|
body: string
|
|
attachments?: Attachment[]
|
|
}
|
|
|
|
type ServiceResult<T> = { data: T; error: null } | { data: null; error: string }
|
|
|
|
export const inquiryService = {
|
|
async getActiveInquiries(filters?: InquiryFilters): Promise<ServiceResult<Inquiry[]>> {
|
|
try {
|
|
const data = await provider.getAll(filters)
|
|
return { data, error: null }
|
|
} catch (e) {
|
|
return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
|
|
}
|
|
},
|
|
|
|
async getInquiryById(id: string): Promise<ServiceResult<Inquiry | null>> {
|
|
try {
|
|
const data = await provider.getById(id)
|
|
return { data, error: null }
|
|
} catch (e) {
|
|
return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
|
|
}
|
|
},
|
|
|
|
async sendInquiryReply(
|
|
inquiryId: string,
|
|
payload: InquiryReplyPayload,
|
|
): Promise<ServiceResult<Inquiry>> {
|
|
try {
|
|
const data = await provider.addMessage(inquiryId, {
|
|
senderType: 'supply_user',
|
|
senderName: 'Wincasa AG',
|
|
subject: payload.subject,
|
|
body: payload.body,
|
|
attachments: payload.attachments ?? [],
|
|
})
|
|
return { data, error: null }
|
|
} catch (e) {
|
|
return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
|
|
}
|
|
},
|
|
|
|
async markThreadAsRead(id: string): Promise<ServiceResult<Inquiry>> {
|
|
try {
|
|
const data = await provider.markThreadAsRead(id)
|
|
return { data, error: null }
|
|
} catch (e) {
|
|
return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
|
|
}
|
|
},
|
|
|
|
async getUnreadCount(): Promise<ServiceResult<number>> {
|
|
try {
|
|
const data = await provider.getUnreadCount()
|
|
return { data, error: null }
|
|
} catch (e) {
|
|
return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
|
|
}
|
|
},
|
|
}
|