a tool for shared writing and social publishing
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

allow changing vote

+44 -17
+29 -12
actions/pollActions.ts
··· 22 22 .from(poll_votes_on_entity) 23 23 .innerJoin(entities, eq(entities.id, poll_votes_on_entity.poll_entity)) 24 24 .where(and(inArray(entities.set, entity_sets))); 25 - return { polls, voter_token }; 25 + return { 26 + polls: polls.map((p) => ({ 27 + poll_votes_on_entity: { 28 + ...p.poll_votes_on_entity, 29 + voter_token: 30 + voter_token === p.poll_votes_on_entity.voter_token 31 + ? voter_token 32 + : undefined, 33 + }, 34 + })), 35 + voter_token, 36 + }; 26 37 } 27 38 28 39 export async function voteOnPoll( ··· 46 57 pollVote.find((v) => { 47 58 return v.voter_token === voter_token; 48 59 }) 49 - ) 50 - return; 60 + ) { 61 + await db 62 + .delete(poll_votes_on_entity) 63 + .where( 64 + and( 65 + eq(poll_votes_on_entity.voter_token, voter_token), 66 + eq(poll_votes_on_entity.poll_entity, poll_entity), 67 + ), 68 + ); 69 + } 51 70 52 - await db 53 - .insert(poll_votes_on_entity) 54 - .values( 55 - option_entities.map((option_entity) => ({ 56 - option_entity, 57 - poll_entity, 58 - voter_token, 59 - })), 60 - ); 71 + await db.insert(poll_votes_on_entity).values( 72 + option_entities.map((option_entity) => ({ 73 + option_entity, 74 + poll_entity, 75 + voter_token, 76 + })), 77 + ); 61 78 }
+15 -5
components/Blocks/PollBlock.tsx
··· 70 70 entityID={props.entityID} 71 71 close={() => { 72 72 if (hasVoted) setPollState("results"); 73 - setPollState("voting"); 73 + else setPollState("voting"); 74 74 }} 75 75 /> 76 76 ) : pollState === "results" ? ( ··· 98 98 </button> 99 99 )} 100 100 101 - {!hasVoted && <Separator classname="h-6" />} 101 + {permissions.write && <Separator classname="h-6" />} 102 102 <PollStateToggle 103 103 setPollState={setPollState} 104 104 pollState={pollState} ··· 140 140 return { 141 141 ...oldState, 142 142 polls: [ 143 - ...oldState.polls, 143 + ...oldState.polls.filter( 144 + (p) => 145 + !( 146 + p.poll_votes_on_entity.voter_token === 147 + oldState.voter_token && 148 + p.poll_votes_on_entity.poll_entity == props.entityID 149 + ), 150 + ), 144 151 ...selectedPollOptions.map((option_entity) => ({ 145 152 poll_votes_on_entity: { 146 153 option_entity, ··· 418 425 hasVoted: boolean; 419 426 pollState: "editing" | "voting" | "results"; 420 427 }) => { 421 - if (props.pollState === "results" && props.hasVoted) return null; 422 428 return ( 423 429 <button 424 430 className="text-sm text-accent-contrast sm:hover:underline" ··· 426 432 props.setPollState(props.pollState === "voting" ? "results" : "voting"); 427 433 }} 428 434 > 429 - {props.pollState === "voting" ? "See Results" : "Back to Poll"} 435 + {props.pollState === "voting" 436 + ? "See Results" 437 + : props.hasVoted 438 + ? "Change Vote" 439 + : "Back to Poll"} 430 440 </button> 431 441 ); 432 442 };