From fa98e2ad9262f0c227e730dcabdbb0cee02ed5b7 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Thu, 20 May 2021 14:12:23 +0200 Subject: [PATCH] feat: deleteall --- client/src/app/api/eventsApi.js | 5 +++ .../editors/list/EventListWrapper.jsx | 39 +++++++++++++++++++ client/src/features/menu/EventListMenu.jsx | 3 ++ .../src/features/menu/MenuActionButtons.jsx | 20 ++++++++-- server/controllers/eventsController.js | 17 ++++++++ server/routes/eventsRouter.js | 3 ++ 6 files changed, 83 insertions(+), 4 deletions(-) diff --git a/client/src/app/api/eventsApi.js b/client/src/app/api/eventsApi.js index f9b30c035..17a2ada40 100644 --- a/client/src/app/api/eventsApi.js +++ b/client/src/app/api/eventsApi.js @@ -37,3 +37,8 @@ export const requestDelete = async (eventId) => { const res = await axios.delete(eventsURL + '/' + eventId); return res; }; + +export const requestDeleteAll = async () => { + const res = await axios.delete(eventsURL + '/all'); + return res; +}; diff --git a/client/src/features/editors/list/EventListWrapper.jsx b/client/src/features/editors/list/EventListWrapper.jsx index c7f28f705..efae46062 100644 --- a/client/src/features/editors/list/EventListWrapper.jsx +++ b/client/src/features/editors/list/EventListWrapper.jsx @@ -6,6 +6,7 @@ import { requestPost, requestPut, requestDelete, + requestDeleteAll, requestReorder, requestApplyDelay, } from 'app/api/eventsApi.js'; @@ -160,6 +161,35 @@ export default function EventListWrapper() { }, }); + const deleteAllEvents = useMutation(requestDeleteAll, { + // we optimistically update here + onMutate: async () => { + // cancel ongoing queries + queryClient.cancelQueries(EVENTS_TABLE, { exact: true }); + + // Snapshot the previous value + const previousEvents = queryClient.getQueryData(EVENTS_TABLE); + + let clear = []; + + // optimistically update object + queryClient.setQueryData(EVENTS_TABLE, clear); + + // Return a context with the previous and new todo + return { previousEvents }; + }, + + // Mutation fails, rollback undos optimist update + onError: (error, eventId, context) => { + queryClient.setQueryData(EVENTS_TABLE, context.previousEvents); + }, + // Mutation finished, failed or successful + // Fetch anyway, just to be sure + onSettled: () => { + queryClient.invalidateQueries(EVENTS_TABLE); + }, + }); + const applyDelay = useMutation(requestApplyDelay, { // Mutation finished, failed or successful onSettled: () => { @@ -298,6 +328,15 @@ export default function EventListWrapper() { setCollapsed({ clear: true, items: data, isCollapsed: false }); break; + case 'deleteall': + try { + let t = Date.now(); + await deleteAllEvents.mutateAsync(); + console.log('debug m deleteall', Date.now() - t); + } catch (error) { + showErrorToast('Error deleting events', error.message); + } + break; default: showErrorToast('Unrecognised request', action); break; diff --git a/client/src/features/menu/EventListMenu.jsx b/client/src/features/menu/EventListMenu.jsx index 912c47b95..54bc4f46d 100644 --- a/client/src/features/menu/EventListMenu.jsx +++ b/client/src/features/menu/EventListMenu.jsx @@ -30,6 +30,9 @@ const EventListMenu = ({ eventsHandler }) => { } SetOption({ cursor: newSet }); break; + case 'deleteall': + eventsHandler('deleteall'); + break; default: break; } diff --git a/client/src/features/menu/MenuActionButtons.jsx b/client/src/features/menu/MenuActionButtons.jsx index f506be7be..eff31e739 100644 --- a/client/src/features/menu/MenuActionButtons.jsx +++ b/client/src/features/menu/MenuActionButtons.jsx @@ -1,6 +1,13 @@ import { Menu, MenuButton, MenuItem, MenuList } from '@chakra-ui/menu'; import { IconButton } from '@chakra-ui/button'; -import { FiZap, FiPlus, FiClock, FiMinusCircle } from 'react-icons/fi'; +import { + FiTrash2, + FiZap, + FiPlus, + FiClock, + FiMinusCircle, +} from 'react-icons/fi'; +import { Divider } from '@chakra-ui/layout'; export default function MenuActionButtons(props) { const { actionHandler } = props; @@ -22,9 +29,6 @@ export default function MenuActionButtons(props) { color={'orange.500'} /> - {/* } onClick={props.deleteAllHandler}> - Delete All - */} } onClick={() => actionHandler('event')}> Event first @@ -37,6 +41,14 @@ export default function MenuActionButtons(props) { > Block first + + } + onClick={() => actionHandler('deleteall')} + color='red.500' + > + Delete All + ); diff --git a/server/controllers/eventsController.js b/server/controllers/eventsController.js index 9c1306e15..5f3973121 100644 --- a/server/controllers/eventsController.js +++ b/server/controllers/eventsController.js @@ -295,3 +295,20 @@ exports.eventsDelete = async (req, res) => { res.status(400).send(error); } }; + +// Create controller for DELETE request to '/events/:eventId' +// Returns - +exports.eventsDeleteAll = async (req, res) => { + try { + // set with nothing + db.set('events', []).write(); + + // update timer object + _updateTimersSingle(); + + res.sendStatus(201); + } catch (error) { + console.log('debug:', error); + res.status(400).send(error); + } +}; diff --git a/server/routes/eventsRouter.js b/server/routes/eventsRouter.js index a156906cf..b8bf90cd9 100644 --- a/server/routes/eventsRouter.js +++ b/server/routes/eventsRouter.js @@ -25,6 +25,9 @@ router.patch('/reorder/', eventsController.eventsReorder); // create route between controller and '/events/applydelay/:eventId' endpoint router.patch('/applydelay/:eventId', eventsController.eventsApplyDelay); +// create route between controller and '/events/all' endpoint +router.delete('/all', eventsController.eventsDeleteAll); + // create route between controller and '/events/:eventId' endpoint router.delete('/:eventId', eventsController.eventsDelete);