@selfcommunity/react-ui
Version:
React UI Components to integrate a Community created with SelfCommunity Platform.
170 lines (169 loc) • 10.3 kB
JavaScript
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" }) }))] }))] }))] })) })));
}