diff --git a/src/components/PollList.ts b/src/components/PollList.ts index be12ce3..5c99505 100644 --- a/src/components/PollList.ts +++ b/src/components/PollList.ts @@ -11,6 +11,10 @@ export function PollList( onVote: (optionId: string) => void, onDelete: (optionId: string) => void, ): HTMLElement { + + var currentOptions : { [x: string]: any; } | undefined = undefined + var currentVotes : { [x: string]: any; } | undefined = undefined + const wrapper = document.createElement("div"); wrapper.className = "poll-list-wrapper"; @@ -42,25 +46,29 @@ export function PollList( votes: number; voted: boolean; }> = []; + if (currentOptions && currentVotes){ - // Tally votes per option - const tally = new Map(); - for (const optionId of yVotes.values()) { - tally.set(optionId, (tally.get(optionId) ?? 0) + 1); + // Tally votes per option + const tally = new Map(); + for (const optionId of Object.values(currentVotes)) { + tally.set(optionId, (tally.get(optionId) ?? 0) + 1); + } + + const myVote = currentVotes[userId] ?? null; + + Object.entries(currentOptions).forEach(([id,record]) => { + console.log(`${record}: ${id}`) + entries.push({ + id, + name: record.label, + votes: tally.get(id) ?? 0, + voted: myVote === id, + }); + }); + + entries.sort((a, b) => b.votes - a.votes || a.name.localeCompare(b.name)); } - const myVote = yVotes.get(userId) ?? null; - - yOptions.forEach((record, id) => { - entries.push({ - id, - name: record.label, - votes: tally.get(id) ?? 0, - voted: myVote === id, - }); - }); - - entries.sort((a, b) => b.votes - a.votes || a.name.localeCompare(b.name)); return entries; } @@ -119,9 +127,10 @@ export function PollList( } }); } - - yOptions.observe(enforceAppendOnly(yOptions,render)); - yVotes.observe(enforceAppendOnly(yVotes,render)); + yOptions.observe(enforceAppendOnly(yOptions,(update : { [x: string]: any; }) => {currentOptions = update}, render)); + yVotes.observe(enforceAppendOnly(yVotes,(update : { [x: string]: any; }) => {currentVotes = update},render)); + currentOptions=yOptions.toJSON() + currentVotes=yVotes.toJSON() render(); return wrapper; diff --git a/src/yDocUtil.ts b/src/yDocUtil.ts index 4e750d9..66a687d 100644 --- a/src/yDocUtil.ts +++ b/src/yDocUtil.ts @@ -4,30 +4,21 @@ import * as Y from "yjs"; * Enforces append-only logic on a Y.Map. * Reverts any 'update' or 'delete' actions detected in the observer. */ -export function enforceAppendOnly(yMap: Y.Map,render: () => void) { +export function enforceAppendOnly(yMap: Y.Map,update: (update : { [x: string]: any; }) => void, render: () => void) { return (event: Y.YMapEvent, transaction: Y.Transaction) => { - // Avoid infinite loops: check if this change was - // triggered by our own 'undo' logic. - if (transaction.origin === 'revert-logic') return; - + var isOperationIllegal = false event.keys.forEach((change, key) => { const { action, oldValue } = change; if (action === 'update' || action === 'delete') { - // Use the transaction to undo the illegal operation - yMap.doc?.transact(() => { - if (action === 'update' && oldValue !== undefined) { - // Revert to previous value - yMap.set(key, oldValue); - } else if (action === 'delete' && oldValue !== undefined) { - // Restore the deleted key - yMap.set(key, oldValue); - } - console.warn(`Illegal ${action} attempt on key: "${key}". Reverted.`); - }, 'revert-logic'); + isOperationIllegal = true + console.log("Illegal Operation: "+action) } }); - - render(); + if(!isOperationIllegal) { + console.log("Updating Map!") + update(yMap.toJSON()) + render(); + } }; } \ No newline at end of file