| | |
| | | handleResize(); |
| | | window.addEventListener('resize', handleResize); |
| | | |
| | | notify('Welcome to Rcs', 'info'); |
| | | notify.info('Welcome to Rcs'); |
| | | |
| | | return () => { |
| | | if (websocket) { |
| | |
| | | import React, { createContext, useContext, useState, useCallback } from 'react'; |
| | | import React, { createContext, useContext, useState, useCallback, useMemo } from 'react'; |
| | | import { Snackbar, Alert, Portal, Slide } from '@mui/material'; |
| | | |
| | | const NotificationContext = createContext(); |
| | |
| | | setNotification({ open: true, message, severity }); |
| | | }, []); |
| | | |
| | | const handleClose = () => { |
| | | setNotification({ ...notification, open: false }); |
| | | }; |
| | | const handleClose = useCallback(() => { |
| | | setNotification((prev) => ({ ...prev, open: false })); |
| | | }, []); |
| | | |
| | | const notify = useMemo(() => ({ |
| | | info: (msg) => showNotification(msg, 'info'), |
| | | success: (msg) => showNotification(msg, 'success'), |
| | | warning: (msg) => showNotification(msg, 'warning'), |
| | | error: (msg) => showNotification(msg, 'error'), |
| | | // Optional: If you prefer 'warn' instead of 'warning', uncomment the line below |
| | | // warn: (msg) => showNotification(msg, 'warning'), |
| | | }), [showNotification]); |
| | | |
| | | return ( |
| | | <NotificationContext.Provider value={showNotification}> |
| | | <NotificationContext.Provider value={notify}> |
| | | {children} |
| | | <Portal> |
| | | <Snackbar |
| | |
| | | TransitionComponent={SlideTransition} |
| | | anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} |
| | | sx={{ |
| | | // mt: 12, |
| | | zIndex: 2000, |
| | | }} |
| | | > |
| | | <Alert onClose={handleClose} severity={notification.severity} sx={{ width: '300px', zIndex: 2000 }}> |
| | | <Alert |
| | | onClose={handleClose} |
| | | severity={notification.severity} |
| | | sx={{ width: '300px', zIndex: 2000 }} |
| | | variant="filled" // Optional: Use filled variant for better visibility |
| | | > |
| | | {notification.message} |
| | | </Alert> |
| | | </Snackbar> |
| | |
| | | }; |
| | | |
| | | export const useNotification = () => { |
| | | return useContext(NotificationContext); |
| | | const context = useContext(NotificationContext); |
| | | if (!context) { |
| | | throw new Error('useNotification must be used within a NotificationProvider'); |
| | | } |
| | | return context; |
| | | }; |
| | |
| | | import ConfirmButton from '../../page/components/ConfirmButton'; |
| | | import { |
| | | DEVICE_TYPE, |
| | | DEVICE_Z_INDEX, |
| | | } from '../constants'; |
| | | import { useNotification } from '../Notification'; |
| | | |
| | | const ConfigSettings = (props) => { |
| | | const { sprite, setSpriteSettings, onSubmit } = props; |
| | | const { sprite, onSubmit } = props; |
| | | const notify = useNotification(); |
| | | const translate = useTranslate(); |
| | | |
| | | const { control, handleSubmit, reset, watch } = useForm({ |
| | | const { control, handleSubmit, reset, watch, setValue } = useForm({ |
| | | defaultValues: { |
| | | ...sprite.data |
| | | ...sprite.data, |
| | | }, |
| | | }); |
| | | |
| | | const updateSprite = (data) => { |
| | | }; |
| | | const rowValue = watch('row'); |
| | | const bayValue = watch('bay'); |
| | | |
| | | useEffect(() => { |
| | | if (rowValue != null && bayValue != null && rowValue !== '' && bayValue !== '') { |
| | | setValue('no', `${rowValue}-${bayValue}`); |
| | | } else { |
| | | setValue('no', ''); |
| | | } |
| | | }, [rowValue, bayValue, setValue]); |
| | | |
| | | const onFormSubmit = (data) => { |
| | | console.log(data); |
| | | if (sprite && sprite.data) { |
| | | Object.keys(data).forEach((key) => { |
| | | sprite.data[key] = data[key]; |
| | | }); |
| | | } |
| | | if (onSubmit) { |
| | | onSubmit(data); |
| | | } |
| | | console.log(sprite.data); |
| | | notify.info(translate('common.response.success')); |
| | | }; |
| | | |
| | | return ( |
| | | <> |
| | | <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}> |
| | | <Grid container spacing={1.4}> |
| | | |
| | | {sprite?.data?.type === DEVICE_TYPE.SHELF && ( |
| | | <> |
| | | <Grid item xs={6} pt={0} sx={{ |
| | | paddingTop: '8px !important', |
| | | }}> |
| | | <Grid item xs={6}> |
| | | <Controller |
| | | name="row" |
| | | control={control} |
| | |
| | | type="number" |
| | | fullWidth |
| | | onChange={(e) => { |
| | | const value = e.target.value; |
| | | field.onChange(e); |
| | | updateSprite(); |
| | | }} |
| | | /> |
| | | )} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6} pt={0} sx={{ |
| | | paddingTop: '8px !important', |
| | | }}> |
| | | <Grid item xs={6}> |
| | | <Controller |
| | | name="bay" |
| | | control={control} |
| | |
| | | type="number" |
| | | fullWidth |
| | | onChange={(e) => { |
| | | const value = e.target.value; |
| | | field.onChange(e); |
| | | }} |
| | | /> |
| | |
| | | <> |
| | | </> |
| | | )} |
| | | |
| | | <Grid item xs={12}> |
| | | <Divider /> |
| | | </Grid> |
| | |
| | | {translate('page.map.settings.config.base.no')} |
| | | </Typography> |
| | | </Grid> */} |
| | | <Grid item xs={6} pt={0} sx={{ |
| | | paddingTop: '8px !important', |
| | | }}> |
| | | |
| | | <Grid item xs={6}> |
| | | <Controller |
| | | name="no" |
| | | control={control} |
| | |
| | | {...field} |
| | | label="No" |
| | | type="text" |
| | | value={field.value || ''} |
| | | fullWidth |
| | | onChange={(e) => { |
| | | const value = e.target.value; |
| | | field.onChange(e); |
| | | }} |
| | | /> |
| | |
| | | |
| | | <Grid item xs={12} mt={2}> |
| | | <Stack direction="row" spacing={2}> |
| | | <Button variant="contained" color="primary" onClick={() => { |
| | | }}> |
| | | <Button variant="contained" color="primary" type="submit"> |
| | | {translate('ra.action.confirm')} |
| | | </Button> |
| | | </Stack> |
| | | </Grid> |
| | | |
| | | </Grid> |
| | | </Box> |
| | | </> |
| | | ) |
| | | } |
| | | ); |
| | | }; |
| | | |
| | | |
| | | export default ConfigSettings; |
| | | export default ConfigSettings; |