UNPKG

@selfcommunity/react-ui

Version:

React UI Components to integrate a Community created with SelfCommunity Platform.

170 lines (169 loc) • 10.3 kB
import { __rest } from "tslib"; import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; import { styled } from '@mui/material'; import { useThemeProps } from '@mui/system'; import classNames from 'classnames'; import { Box, Button, FormControl, FormControlLabel, Icon, IconButton, InputAdornment, Popover, Radio, RadioGroup, TextField, Typography } from '@mui/material'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { PREFIX, unitType } from './constants'; import { DateTimePickerTabs, LocalizationProvider, MobileDateTimePicker } from '@mui/x-date-pickers'; import { SCCourseTypologyType } from '@selfcommunity/types'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import { useSCContext } from '@selfcommunity/react-core'; import itLocale from 'date-fns/locale/it'; import enLocale from 'date-fns/locale/en-US'; import { CourseService } from '@selfcommunity/api-services'; import { SCOPE_SC_UI } from '../../constants/Errors'; import { Logger } from '@selfcommunity/utils'; import { getDripDelayAndUnit } from '../../utils/course'; import { useIsDisabled } from '../EditCourse/hooks'; const messages = defineMessages({ pickerPlaceholder: { id: 'ui.lessonReleaseMenu.scheduled.picker.placeholder', defaultMessage: 'ui.lessonReleaseMenu.scheduled.picker.placeholder' }, pickerCancelMessage: { id: 'ui.lessonReleaseMenu.scheduled.picker.cancel', defaultMessage: 'ui.lessonReleaseMenu.scheduled.picker.cancel' }, pickerClearMessage: { id: 'ui.lessonReleaseMenu.scheduled.picker.clear', defaultMessage: 'ui.lessonReleaseMenu.scheduled.picker.clear' }, pickerOkMessage: { id: 'ui.lessonReleaseMenu.scheduled.picker.ok', defaultMessage: 'ui.lessonReleaseMenu.scheduled.picker.ok' } }); const classes = { root: `${PREFIX}-root`, label: `${PREFIX}-label`, picker: `${PREFIX}-picker`, popoverRoot: `${PREFIX}-popover-root`, popoverContent: `${PREFIX}-popover-content`, popoverSelection: `${PREFIX}-popover-selection`, popoverAction: `${PREFIX}-popover-action` }; const Root = styled(FormControl, { name: PREFIX, slot: 'Root', overridesResolver: (_props, styles) => [styles.root] })(() => ({})); const PopoverRoot = styled(Popover, { name: PREFIX, slot: 'PopoverRoot', overridesResolver: (_props, styles) => styles.popoverRoot })(() => ({})); export default function LessonReleaseMenu(inProps) { // PROPS const props = useThemeProps({ props: inProps, name: PREFIX }); const { className = null, course, section, onSuccess } = props, rest = __rest(props, ["className", "course", "section", "onSuccess"]); // CONTEXT const scContext = useSCContext(); // STATE const [drippedAt, setDrippedAt] = useState(null); const { delay, _unit } = getDripDelayAndUnit((section === null || section === void 0 ? void 0 : section.drip_delay) || 0); const [dripDelay, setDripDelay] = useState(delay); const [unit, setUnit] = useState(_unit); const [anchorEl, setAnchorEl] = useState(null); const [open, setOpen] = useState(false); // HOOKS const { isDisabled } = useIsDisabled(); //INTL const intl = useIntl(); const handleUnitChange = (e) => { setUnit(e.target.value); }; // EFFECTS useEffect(() => { if (section && section.dripped_at) { setDrippedAt(new Date(section.dripped_at)); } else { setDrippedAt(null); } }, [section, setDrippedAt]); useEffect(() => { if (section) { setDripDelay(delay); } }, [section, setDripDelay]); // HANDLERS const handleClick = (event) => { setAnchorEl(event.currentTarget); setOpen(true); }; const handleClose = () => { setOpen(false); }; const handleValueChange = (e) => { setDripDelay(e.target.value); }; const handleSave = () => { const _delay = unit === unitType.DAYS ? dripDelay : dripDelay * 7; CourseService.patchCourseSection(course.id, section.id, { drip_delay: _delay }) .then((data) => { setOpen(false); onSuccess(data); }) .catch((e) => { Logger.error(SCOPE_SC_UI, e); }); }; const handleUpdate = (value) => { CourseService.patchCourseSection(course.id, section.id, { dripped_at: value ? value.toISOString() : null }) .then((data) => { setOpen(false); onSuccess(data); }) .catch((e) => { Logger.error(SCOPE_SC_UI, e); }); }; const placeholderStructured = dripDelay > 0 ? intl.formatMessage({ id: `ui.lessonReleaseMenu.structured.label.${unit}`, defaultMessage: `ui.lessonReleaseMenu.structured.label.${unit}` }, { total: dripDelay }) : intl.formatMessage({ id: 'ui.lessonReleaseMenu.now.label', defaultMessage: 'ui.lessonReleaseMenu.now.label' }); return (_jsx(Root, Object.assign({ className: classNames(className, classes.root) }, rest, { children: course && course.type === SCCourseTypologyType.SCHEDULED ? (_jsx(LocalizationProvider, Object.assign({ dateAdapter: AdapterDateFns, adapterLocale: scContext.settings.locale.default === 'it' ? itLocale : enLocale, localeText: { okButtonLabel: `${intl.formatMessage(messages.pickerOkMessage)}`, cancelButtonLabel: `${intl.formatMessage(messages.pickerCancelMessage)}`, clearButtonLabel: `${intl.formatMessage(messages.pickerClearMessage)}` } }, { children: _jsx(MobileDateTimePicker, { className: classes.picker, disablePast: true, label: drippedAt && (_jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.scheduled.picker.placeholder", defaultMessage: "ui.lessonReleaseMenu.scheduled.picker.placeholder" })), value: drippedAt, slots: { //actionBar: PickerActionBar, tabs: (props) => _jsx(DateTimePickerTabs, Object.assign({}, props)), textField: (params) => (_jsx(TextField, Object.assign({}, params, { error: false, InputProps: Object.assign(Object.assign({}, params.InputProps), { placeholder: `${intl.formatMessage(messages.pickerPlaceholder)}`, endAdornment: (_jsx(InputAdornment, Object.assign({ position: "end" }, { children: _jsx(IconButton, Object.assign({ disabled: isDisabled }, { children: _jsx(Icon, { children: "expand_more" }) })) }))) }) }))) }, slotProps: { tabs: { hidden: false }, toolbar: { // eslint-disable-next-line @typescript-eslint/ban-ts-ignore,@typescript-eslint/ban-ts-comment // @ts-ignore toolbarTitle: (_jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.scheduled.picker.placeholder", defaultMessage: "ui.lessonReleaseMenu.scheduled.picker.placeholder" })) }, actionBar: { actions: ['cancel', 'clear', 'accept'] } }, onChange: (value) => setDrippedAt(value), onAccept: handleUpdate, onClear: () => setDrippedAt(null), disabled: isDisabled }) }))) : (_jsxs(_Fragment, { children: [_jsx(TextField, { size: "small", value: placeholderStructured, onClick: isDisabled ? undefined : handleClick, InputProps: { endAdornment: (_jsx(InputAdornment, Object.assign({ position: "end" }, { children: _jsx(IconButton, Object.assign({ onClick: handleClick, disabled: isDisabled }, { children: _jsx(Icon, { children: "expand_more" }) })) }))) }, disabled: isDisabled }), _jsxs(PopoverRoot, Object.assign({ className: classes.popoverRoot, open: open, anchorEl: anchorEl, onClose: handleClose, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' } }, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: _jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.dialog.title", defaultMessage: "ui.lessonReleaseMenu.dialog.title" }) })), _jsxs(Box, Object.assign({ className: classes.popoverContent }, { children: [_jsxs(Box, Object.assign({ className: classes.popoverSelection }, { children: [_jsx(TextField, { type: "number", value: dripDelay, onChange: handleValueChange, InputProps: { inputProps: { min: 0 } } }), _jsx(FormControl, { children: _jsxs(RadioGroup, Object.assign({ value: unit, onChange: handleUnitChange }, { children: [_jsx(FormControlLabel, { value: unitType.DAYS, control: _jsx(Radio, { size: "small" }), label: _jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.dialog.days", defaultMessage: "ui.lessonReleaseMenu.dialog.days" }) }), _jsx(FormControlLabel, { value: unitType.WEEKS, control: _jsx(Radio, { size: "small" }), label: _jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.dialog.weeks", defaultMessage: "ui.lessonReleaseMenu.dialog.weeks" }) })] })) })] })), _jsx(Typography, Object.assign({ variant: "body1" }, { children: dripDelay > 0 ? (_jsx(FormattedMessage, { id: `ui.lessonReleaseMenu.dialog.info.structured.${unit}`, defaultMessage: `ui.lessonReleaseMenu.dialog.info.structured.${unit}`, values: { total: dripDelay } })) : (_jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.dialog.info.now", defaultMessage: "ui.lessonReleaseMenu.dialog.info.now" })) })), _jsx(Button, Object.assign({ className: classes.popoverAction, variant: "contained", disabled: section.drip_delay === dripDelay, onClick: handleSave }, { children: _jsx(FormattedMessage, { id: "ui.lessonReleaseMenu.dialog.button.done", defaultMessage: "ui.lessonReleaseMenu.dialog.button.done" }) }))] }))] }))] })) }))); }