summaryrefslogtreecommitdiff
path: root/lib/bidding/detail/table/bidding-detail-content.tsx
blob: 895016a2966f166efd881933eb7135b73d6cb9fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'use client'

import * as React from 'react'
import { Bidding } from '@/db/schema'
import { QuotationDetails, QuotationVendor } from '@/lib/bidding/detail/service'

import { BiddingDetailVendorTableContent } from './bidding-detail-vendor-table'
import { BiddingDetailItemsDialog } from './bidding-detail-items-dialog'
import { BiddingDetailTargetPriceDialog } from './bidding-detail-target-price-dialog'
import { BiddingPreQuoteItemDetailsDialog } from '../../../bidding/pre-quote/table/bidding-pre-quote-item-details-dialog'
import { getPrItemsForBidding } from '../../../bidding/pre-quote/service'
import { useToast } from '@/hooks/use-toast'
import { useTransition } from 'react'

interface BiddingDetailContentProps {
  bidding: Bidding
  quotationDetails: QuotationDetails | null
  quotationVendors: QuotationVendor[]
  prItems: any[]
}

export function BiddingDetailContent({
  bidding,
  quotationDetails,
  quotationVendors,
  prItems
}: BiddingDetailContentProps) {
  const { toast } = useToast()
  const [isPending, startTransition] = useTransition()
  
  const [dialogStates, setDialogStates] = React.useState({
    items: false,
    targetPrice: false,
    selectionReason: false,
    award: false
  })

  const [, setRefreshTrigger] = React.useState(0)
  
  // PR 아이템 다이얼로그 관련 state
  const [isItemDetailsDialogOpen, setIsItemDetailsDialogOpen] = React.useState(false)
  const [selectedVendorForDetails, setSelectedVendorForDetails] = React.useState<QuotationVendor | null>(null)
  const [prItemsForDialog, setPrItemsForDialog] = React.useState<any[]>([])

  const handleRefresh = React.useCallback(() => {
    setRefreshTrigger(prev => prev + 1)
  }, [])

  const openDialog = React.useCallback((type: keyof typeof dialogStates) => {
    setDialogStates(prev => ({ ...prev, [type]: true }))
  }, [])

  const closeDialog = React.useCallback((type: keyof typeof dialogStates) => {
    setDialogStates(prev => ({ ...prev, [type]: false }))
  }, [])

  const handleViewItemDetails = React.useCallback((vendor: QuotationVendor) => {
    startTransition(async () => {
      try {
        // PR 아이템 정보 로드
        const prItemsData = await getPrItemsForBidding(bidding.id)
        setPrItemsForDialog(prItemsData)
        setSelectedVendorForDetails(vendor)
        setIsItemDetailsDialogOpen(true)
      } catch (error) {
        console.error('Failed to load PR items:', error)
        toast({
          title: '오류',
          description: '품목 정보를 불러오는데 실패했습니다.',
          variant: 'destructive',
        })
      }
    })
  }, [bidding.id, toast])

  return (
    <div className="space-y-6">
      <BiddingDetailVendorTableContent
        biddingId={bidding.id}
        bidding={bidding}
        vendors={quotationVendors}
        onRefresh={handleRefresh}
        onOpenTargetPriceDialog={() => openDialog('targetPrice')}
        onOpenSelectionReasonDialog={() => openDialog('selectionReason')}
        onViewItemDetails={handleViewItemDetails}
        onEdit={undefined}
      />

      <BiddingDetailItemsDialog
        open={dialogStates.items}
        onOpenChange={(open) => closeDialog('items')}
        prItems={prItems}
        bidding={bidding}
      />

      <BiddingDetailTargetPriceDialog
        open={dialogStates.targetPrice}
        onOpenChange={(open) => closeDialog('targetPrice')}
        quotationDetails={quotationDetails}
        bidding={bidding}
        onSuccess={handleRefresh}
      />

      <BiddingPreQuoteItemDetailsDialog
        open={isItemDetailsDialogOpen}
        onOpenChange={setIsItemDetailsDialogOpen}
        biddingId={bidding.id}
        biddingCompanyId={selectedVendorForDetails?.id || 0}
        companyName={selectedVendorForDetails?.vendorName || ''}
        prItems={prItemsForDialog}
        currency={bidding.currency || 'KRW'}
      />
    </div>
  )
}