From 81e3b0abbfc7ded326668ed40fbcd7824114012d Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Fri, 28 May 2021 23:59:08 +0200 Subject: [PATCH] cursor fixes - delete would use wrong index to relocate - cursor uses eventId instead of eventIndex - cursor would move on any item changes --- .../src/features/editors/list/EventList.jsx | 57 ++++++++++--------- server/src/classes/EventTimer.js | 2 +- server/src/controllers/eventsController.js | 4 +- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/client/src/features/editors/list/EventList.jsx b/client/src/features/editors/list/EventList.jsx index 1ff4772c4..befda8cec 100644 --- a/client/src/features/editors/list/EventList.jsx +++ b/client/src/features/editors/list/EventList.jsx @@ -11,8 +11,8 @@ import { SelectSetting } from 'app/context/settingsAtom'; export default function EventList(props) { const { events, eventsHandler } = props; const socket = useSocket(); - const [selected, setSelected] = useState(null); - const [next, setNext] = useState(null); + const [selectedId, setSelectedId] = useState(null); + const [nextId, setNextId] = useState(null); const [cursor, setCursor] = useState(0); const [cursorSettings] = useAtom(useMemo(() => SelectSetting('cursor'), [])); @@ -61,10 +61,11 @@ export default function EventList(props) { // Handle playstate socket.on('selected', (data) => { - setSelected(data); + setSelectedId(data.id); }); + socket.on('next-id', (data) => { - setNext(data); + setNextId(data); }); // Clear listener @@ -74,32 +75,36 @@ export default function EventList(props) { }; }, [socket]); - // attach cursor to selected + // when cursor moves, view should follow useEffect(() => { - if (cursorSettings !== 'locked' || selected == null) return; - if (selected.index == null) return; - - let eventIndex = -1; - let gotoIndex = -1; - for (const e of events) { - gotoIndex++; - if (e.type === 'event') eventIndex++; - if (eventIndex === selected.index) break; - } - - setCursor(gotoIndex); - }, [events, selected, cursorSettings]); - - // attach scroll to cursor - useEffect(() => { - if (cursor == null || cursorRef.current == null) return; - cursorRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start', }); - }, [cursor, cursorRef]); + }, [cursor]); + + // if selected event + // or cursor settings changed + useEffect(() => { + // and if we are locked + if (cursorSettings !== 'locked' || selectedId == null) return; + + // move cursor + let gotoIndex = -1; + let found = false; + for (const e of events) { + gotoIndex++; + if (e.id === selectedId) { + found = true; + break; + } + } + if (found) { + // move cursor + setCursor(gotoIndex); + } + }, [selectedId, cursorSettings]); if (events.length < 1) { return ; @@ -159,8 +164,8 @@ export default function EventList(props) { index={index} eventIndex={eventIndex} data={e} - selected={selected?.id === e.id} - next={next === e.id} + selected={selectedId === e.id} + next={nextId === e.id} eventsHandler={eventsHandler} delay={cumulativeDelay} /> diff --git a/server/src/classes/EventTimer.js b/server/src/classes/EventTimer.js index 911ea8e58..e7bc9c0f5 100644 --- a/server/src/classes/EventTimer.js +++ b/server/src/classes/EventTimer.js @@ -476,7 +476,7 @@ export class EventTimer extends Timer { // update selected event index this.selectedEventIndex = this._eventlist.findIndex( - (e) => e.id === eventId + (e) => e.id === this.selectedEventId ); // reload titles if necessary diff --git a/server/src/controllers/eventsController.js b/server/src/controllers/eventsController.js index bbb2dcb51..92fe2bf71 100644 --- a/server/src/controllers/eventsController.js +++ b/server/src/controllers/eventsController.js @@ -152,7 +152,7 @@ export const eventsPut = async (req, res) => { } try { - const eventIndex = data.events.findIndex((e) => e.id === req.body.id); + const eventIndex = data.events.findIndex((e) => e.id === eventId); if (eventIndex === -1) { res.status(400).send(`No Id found found`); return; @@ -164,7 +164,7 @@ export const eventsPut = async (req, res) => { db.write(); // update timer - _updateTimersSingle(req.body.id, req.body); + _updateTimersSingle(eventId, req.body); res.sendStatus(200); } catch (error) {