import { useDispatch, useSelect } from '@wordpress/data'
import { __ } from '@wordpress/i18n'
import { store, store_name } from '../../../store/backend'
import { Form } from '../../components/Form/Form'
import { createFormFromModel } from '../../components/Form/lib/createForm'
import { createFormMenuSectionsFromModel } from '../../components/Form/utils/utils'
import { useSidebar } from '../../components/Sidebar/SidebarContext'
import { ServiceNames } from '../../components/WebbaDataTable/cells/ServiceNames/ServiceNames'
import { getCellActions, syncConnectedTables } from '../../components/WebbaDataTable/helpers/getCellActions'
import { useWbkTable } from '../../components/WebbaDataTable/hooks/useWbkTable'
import { Menu } from '../../components/WebbaDataTable/Menu'
import { Table } from '../../components/WebbaDataTable/Table'
import { generateColumnDefsFromModel } from '../../components/WebbaDataTable/utils'
import { serviceCategoriesModel, servicesModel, unitsModel } from './model'
import { ServiceDetail } from '../../components/WebbaDataTable/cells/ServiceDetail/ServiceDetail'
import { useMemo, useState } from 'react'
import { SearchField } from '../../components/Filter/Fields/SearchField/SearchField'
import { getFilteredRowModel } from '@tanstack/react-table'
import { isForbidden } from '../../utils/errors'
import { FailedMessage } from '../../components/FailedMessage/FailedMessage'
import { useSettings } from '../../providers/SettingsProvider'
import { DurationCell } from '../../components/WebbaDataTable/cells/DurationCell/DurationCell'
import { ServiceImageCell } from '../../components/WebbaDataTable/cells/ServiceImageCell/ServiceImageCell'
import { formatPrice } from '../../utils/currency'
import { SuccessMessage } from '../../components/SuccessMessage/SuccessMessage'
import noItemsImage from '../../../../public/images/bookings-empty.png'
import { UnitPrices } from '../../components/WebbaDataTable/cells/UnitPrices/UnitPrices'
import './ServicesScreen.scss'
import { ProFeatuerWrapper } from '../../components/ProFeatuerWrapper/ProFeatuerWrapper'
import { ExtrasScreen } from '../Extras/ExtrasScreen'
import { UnitNames } from '../../components/WebbaDataTable/cells/UnitNames/UnitNames'
export const ServicesScreen = () => {
const formService = createFormFromModel(servicesModel)
const menuSectionsService = createFormMenuSectionsFromModel({
model: servicesModel,
form: formService,
modelName: 'services',
})
const columnsServiceCategory = generateColumnDefsFromModel(
serviceCategoriesModel,
{
list: {
cell: ServiceNames,
},
units: {
cell: UnitNames,
},
},
{
id: {
cell: ({ cell }) => {cell.row.original.id},
header: __('ID', 'webba-booking-lite'),
index: 0,
},
}
)
const formServiceCategory = createFormFromModel(serviceCategoriesModel)
const menuSectionsServiceCategory = createFormMenuSectionsFromModel({
model: serviceCategoriesModel,
form: formServiceCategory,
modelName: 'service_categories',
})
const columnsUnit = generateColumnDefsFromModel(unitsModel, {}, {
id: {
cell: ({ cell }) => {cell.row.original.id},
header: __('ID', 'webba-booking-lite'),
index: 0,
},
price: {
cell: UnitPrices
}
})
const formUnit = createFormFromModel(unitsModel)
const menuSectionsUnit = createFormMenuSectionsFromModel({
model: unitsModel,
form: formUnit,
modelName: 'units',
})
const { deleteItems, addItem, setToastNotification } = useDispatch(store)
const {
services,
serviceCategories,
units,
servicesLoading,
serviceCategoriesLoading,
unitsLoading,
} = useSelect(
(select) => ({
services: select(store).getItems('services'),
serviceCategories: select(store).getItems('service_categories'),
units: select(store).getItems('units'),
servicesLoading: select(store).getLoadingState('services'),
serviceCategoriesLoading:
select(store).getLoadingState('service_categories'),
unitsLoading: select(store).getLoadingState('units'),
}),
[]
)
const [search, setSearch] = useState('')
const [catSearch, setCatSearch] = useState('')
const [unitSearch, setUnitSearch] = useState('')
const sidebar = useSidebar()
const { plugin_url, plan_map } = useSelect(
// @ts-ignore
(select) => select(store_name).getPreset(),
[]
)
const settings = useSettings()
const columnsService = useMemo(
() =>
generateColumnDefsFromModel(
servicesModel,
{
image: {
cell: ServiceImageCell,
},
price: {
cell: ({ cell }) =>
(cell.row.original.price > 0 &&
formatPrice(
cell.row.original.price,
settings?.price_format,
settings?.price_separator,
settings?.price_fractional
)) ||
__('Free', 'webba-booking-lite'),
},
duration: {
cell: DurationCell,
},
},
{
id: {
cell: ({ cell }) => {cell.row.original.id},
header: __('ID', 'webba-booking-lite'),
index: 0,
},
}
).filter((col) => col.id !== 'email'),
[settings]
)
const tableService = useWbkTable({
columns: columnsService,
data: services,
selectable: true,
isAdmin: settings?.is_admin,
renderMenu: ({ cell }) => {
const { onDelete, onDuplicate, onSubmit } = getCellActions({
cell,
collectionName: 'services',
})
return (