import * as React from 'react'; import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; import pick from 'lodash/pick'; import { isRxDocument } from 'rxdb'; import Icon from '@wcpos/components/src/icon'; import Modal from '@wcpos/components/src/modal'; import useSnackbar from '@wcpos/components/src/snackbar'; import Text from '@wcpos/components/src/text'; import Form from '@wcpos/react-native-jsonschema-form'; import log from '@wcpos/utils/src/logger'; import { CountrySelect, StateSelect } from './country-state-select'; import { useT } from '../../../contexts/translations'; import usePushDocument from '../contexts/use-push-document'; import { useCollection } from '../hooks/use-collection'; interface AddNewCustomerProps { onAdd?: (doc: import('@wcpos/database').CustomerDocument) => void; } /** * */ const AddNewCustomer = ({ onAdd }: AddNewCustomerProps) => { const [opened, setOpened] = React.useState(false); const [customerData, setCustomerData] = React.useState({}); const { collection } = useCollection('customers'); const pushDocument = usePushDocument(); const addSnackbar = useSnackbar(); const billingCountry = get(customerData, ['billing', 'country']); const shippingCountry = get(customerData, ['shipping', 'country']); const [loading, setLoading] = React.useState(false); const t = useT(); /** * */ const handleSave = React.useCallback(async () => { try { setLoading(true); const doc = await collection.insert(customerData); const success = await pushDocument(doc); if (isRxDocument(success)) { onAdd(doc); addSnackbar({ message: t('Customer {id} saved', { _tags: 'core', id: success.id }), }); } setOpened(false); } catch (error) { log.error(error); addSnackbar({ message: t('There was an error: {message}', { _tags: 'core', message: error.message }), }); } finally { setLoading(false); } }, [addSnackbar, collection, customerData, onAdd, pushDocument, t]); /** * */ const handleChange = React.useCallback((changes) => { setCustomerData(changes); }, []); /** * */ const schema = React.useMemo(() => { const _schema = { ...collection.schema.jsonSchema, properties: pick(collection.schema.jsonSchema.properties, [ // 'id', 'email', 'first_name', 'last_name', 'role', 'username', 'password', 'billing', 'shipping', 'meta_data', ]), }; return _schema; }, [collection.schema.jsonSchema]); /** * */ const uiSchema = React.useMemo(() => { return { 'ui:title': null, 'ui:description': null, 'ui:order': ['first_name', 'last_name', 'email', '*'], first_name: { 'ui:label': t('First Name', { _tags: 'core' }), }, last_name: { 'ui:label': t('Last Name', { _tags: 'core' }), }, email: { 'ui:label': t('Email', { _tags: 'core' }), }, role: { 'ui:label': t('Role', { _tags: 'core' }), }, username: { 'ui:label': t('Username', { _tags: 'core' }), }, password: { 'ui:label': t('Password', { _tags: 'core' }), }, billing: { 'ui:title': t('Billing Address', { _tags: 'core' }), 'ui:description': null, 'ui:collapsible': 'closed', 'ui:order': [ 'first_name', 'last_name', 'email', 'company', 'phone', 'address_1', 'address_2', 'city', 'postcode', 'state', 'country', ], first_name: { 'ui:label': t('First Name', { _tags: 'core' }), }, last_name: { 'ui:label': t('Last Name', { _tags: 'core' }), }, email: { 'ui:label': t('Email', { _tags: 'core' }), }, address_1: { 'ui:label': t('Address 1', { _tags: 'core' }), }, address_2: { 'ui:label': t('Address 2', { _tags: 'core' }), }, city: { 'ui:label': t('City', { _tags: 'core' }), }, state: { 'ui:label': t('State', { _tags: 'core' }), 'ui:widget': (props) => , }, postcode: { 'ui:label': t('Postcode', { _tags: 'core' }), }, country: { 'ui:label': t('Country', { _tags: 'core' }), 'ui:widget': CountrySelect, }, company: { 'ui:label': t('Company', { _tags: 'core' }), }, phone: { 'ui:label': t('Phone', { _tags: 'core' }), }, }, shipping: { 'ui:title': t('Shipping Address', { _tags: 'core' }), 'ui:description': null, 'ui:collapsible': 'closed', 'ui:order': [ 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'city', 'postcode', 'state', 'country', ], first_name: { 'ui:label': t('First Name', { _tags: 'core' }), }, last_name: { 'ui:label': t('Last Name', { _tags: 'core' }), }, address_1: { 'ui:label': t('Address 1', { _tags: 'core' }), }, address_2: { 'ui:label': t('Address 2', { _tags: 'core' }), }, city: { 'ui:label': t('City', { _tags: 'core' }), }, state: { 'ui:label': t('State', { _tags: 'core' }), 'ui:widget': (props) => , }, postcode: { 'ui:label': t('Postcode', { _tags: 'core' }), }, country: { 'ui:label': t('Country', { _tags: 'core' }), 'ui:widget': CountrySelect, }, company: { 'ui:label': t('Company', { _tags: 'core' }), }, }, meta_data: { 'ui:title': t('Meta Data', { _tags: 'core' }), 'ui:description': null, 'ui:collapsible': 'closed', }, }; }, [billingCountry, shippingCountry, t]); return ( <> setOpened(true)} tooltip={t('Add new customer', { _tags: 'core' })} /> setOpened(false)} title={t('Add New Customer', { _tags: 'core' })} primaryAction={{ label: t('Add Customer', { _tags: 'core' }), action: handleSave, loading, disabled: isEmpty(customerData.email), }} secondaryActions={[ { label: t('Cancel', { _tags: 'core' }), action: () => setOpened(false) }, ]} >
); }; export default AddNewCustomer;