{"version":3,"file":"index-f21f5400.js","sources":["../src/hooks/activityOrder/useOrderItem.js","../src/components/activity/OrderItemsTableRow.jsx","../src/components/activity/OrderItemsTable.jsx","../src/components/activity/AddOrderItem.jsx","../src/components/activity/ActivityOrderDescription.jsx","../src/hooks/activityOrder/useActivityOrder.js","../src/pages/order/OrderPage.jsx","../src/components/activity/OrderItemDetail.jsx","../src/hooks/useContacts.js","../src/components/Contacts/index.jsx","../src/pages/order/OrderItemPage.jsx","../src/pages/order/index.jsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { GetToken } from '@utils/storage';\nimport * as config from '@config';\n\nfunction useOrderItem() {\n const [fetching, setFetching] = useState(false);\n const [fetched, setFetched] = useState(false);\n const [orderItem, setOrderItem] = useState({});\n // verifying\n const [verifying, setVerifying] = useState(false);\n // verifyData\n const [verifyData, setVerifyData] = useState({\n readyToBook: false,\n readyToConfirm: false,\n });\n // updating booking info\n const [updating, setUpdating] = useState(false);\n // adding\n const [adding, setAdding] = useState(false);\n // deleting\n const [deleting, setDeleting] = useState(false);\n // confirming\n const [confirming, setConfirming] = useState(false);\n\n const fetchOrderItem = useCallback(async (itemId) => {\n setFetching(true);\n setFetched(false);\n try {\n const response = await fetch(`${config.apiURL}/order-items/${itemId}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to fetch order item');\n }\n\n const responseData = await response.json();\n const { orderItem } = responseData;\n if (orderItem) {\n setOrderItem(orderItem);\n }\n return orderItem;\n } catch (error) {\n console.error('Error fetching order item:', error);\n throw error;\n } finally {\n setFetching(false);\n setFetched(true);\n }\n }, []);\n\n const verifyOrderItem = useCallback(async (itemId) => {\n setVerifying(true);\n try {\n const response = await fetch(`${config.apiURL}/order-items/${itemId}/verify`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ envolopOnly: true }),\n });\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to verify order item');\n }\n const responseData = await response.json();\n setVerifyData(responseData);\n return responseData;\n } catch (error) {\n console.error('Error verify order item:', error);\n throw error;\n } finally {\n setVerifying(false);\n }\n }, []);\n\n const addOrderItem = useCallback(async (orderItemData) => {\n setAdding(true);\n try {\n const response = await fetch(`${config.apiURL}/order-items`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(orderItemData),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to create order item');\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n console.error('Error creating order item:', error);\n throw error;\n } finally {\n setAdding(false);\n }\n }, []);\n\n const updateOrderItem = useCallback(async (itemId, updateData) => {\n setUpdating(true);\n try {\n const response = await fetch(`${config.apiURL}/order-items/${itemId}`, {\n method: 'PATCH',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateData),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to update order item');\n }\n\n const updatedItem = await response.json();\n setOrderItem(updatedItem);\n return updatedItem;\n } catch (error) {\n console.error('Error updating order item:', error);\n throw error;\n } finally {\n setUpdating(false);\n }\n }, []);\n\n const deleteOrderItem = useCallback(async (itemId) => {\n setDeleting(true);\n try {\n const response = await fetch(`${config.apiURL}/order-items/${itemId}`, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to delete order item');\n }\n const responseData = await response.json();\n return responseData;\n } catch (error) {\n console.error('Error deleting order item:', error);\n throw error;\n } finally {\n setDeleting(false);\n }\n }, []);\n\n const confirmOrderItem = useCallback(async (itemId) => {\n setConfirming(true);\n try {\n const response = await fetch(`${config.apiURL}/order-items/${itemId}/confirm`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${GetToken()}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n orderItemID: itemId,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to confirm order item');\n }\n\n const responseData = await response.json();\n return responseData;\n } catch (error) {\n console.error('Error confirming order item:', error);\n throw error;\n } finally {\n setConfirming(false);\n }\n }, []);\n\n return {\n orderItem,\n verifyData,\n verifying,\n fetching,\n fetched,\n adding,\n updating,\n deleting,\n confirming,\n fetchOrderItem,\n addOrderItem,\n updateOrderItem,\n deleteOrderItem,\n verifyOrderItem,\n confirmOrderItem,\n };\n}\n\nexport default useOrderItem;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Table,\n Icon,\n Label,\n Modal,\n ModalHeader,\n ModalContent,\n ModalActions,\n TableBody,\n TableRow,\n TableCell,\n} from 'semantic-ui-react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport ActivityPricing from '@components/activity/ActivityPricing';\nimport styles from '@styles/OrderItemsTableRow.module.css';\nimport QtyController from '../QtyController';\nimport dayjs from 'dayjs';\nimport { DatePicker, Select, Typography, Button, App } from 'antd';\nimport useOrderItem from '../../hooks/activityOrder/useOrderItem';\nimport { LoadingOutlined } from '@ant-design/icons';\n\nfunction OrderItemsTableRow({ item = {}, callback = () => {} }) {\n const [req, setReq] = useState();\n const navigate = useNavigate();\n const { message } = App.useApp();\n\n const { verifying, verifyOrderItem, verifyData, updating, updateOrderItem, deleting, deleteOrderItem } =\n useOrderItem();\n\n useEffect(() => {\n console.log('Order item', item);\n if (item.ref) {\n handleVerify();\n }\n }, []);\n\n useEffect(() => {\n if (!!req) {\n handleBookingChange(req);\n }\n }, [req]);\n\n const handleVerify = () => {\n verifyOrderItem(item.id).catch((err) => {\n console.error(err);\n message?.error(err.message);\n });\n };\n\n const handleOnChangeSegment = (segmentID) => {\n setReq((prev) => {\n return { ...prev, segmentID };\n });\n };\n\n const handleOnChangeVariant = (variantID) => {\n setReq((prev) => {\n return { ...prev, variantID };\n });\n };\n\n const handleDateChange = (data, dateString) => {\n // console.log('Date change', dateString);\n setReq((prev) => {\n return { ...prev, date: dateString };\n });\n };\n\n const handleBookingChange = (req) => {\n // console.log(req);\n updateOrderItem(item.id, req)\n .then(() => {\n callback();\n handleVerify();\n })\n .catch((err) => {\n console.error(err);\n message?.error(err.message);\n });\n };\n\n const handleDelete = () => {\n if (confirm(`是否要移除 \"${item.activity.name}\" ?`) == true) {\n deleteOrderItem(item.id)\n .then((data) => {\n callback();\n const reply = data.reply;\n if (reply) {\n message?.success(reply);\n }\n })\n .catch((err) => {\n console.error(err);\n message?.error(err.message);\n });\n }\n };\n\n const Actions = ({ id = '' }) => {\n if (!id) {\n console.warn('Empty order item ID');\n return null;\n }\n if (!item.confirmed) {\n return (\n