diff --git a/packages/client/src/components/chat/VoteViewer.svelte b/packages/client/src/components/chat/VoteViewer.svelte index faf329e..cb82601 100644 --- a/packages/client/src/components/chat/VoteViewer.svelte +++ b/packages/client/src/components/chat/VoteViewer.svelte @@ -14,6 +14,36 @@ const { isResultVisible } = $derived(myVotes()); let { selectedOptions } = $derived(proxify(myVotes())); + let numberOfAllVotes = $state(0); + + let numberOfVotesOfMostVotedOption = $state(0); + + let voteShareOfMostVotedOption = $state(0.0); + + let numbersOfVotersPerOption: number[] = $state([]); + + let selectedOptions: number[] = $state([]); + + if (vote.data) { + let tempNumbersOfVotersPerOption: number[] = []; + let tempNumberOfAllVotes = 0; + let max = 0; + for (let i = 0; i < vote.data.voteOptions.length; i++) { + let num = 0; + for (let j = 0; j < vote.data.voters.length; j++) { + if (vote.data.voters[j].votedOptions.includes(i)) { + num++; + } + } + if(num > max) max = num; + tempNumberOfAllVotes += num; + tempNumbersOfVotersPerOption.push(num); + } + numbersOfVotersPerOption = tempNumbersOfVotersPerOption; + numberOfAllVotes = tempNumberOfAllVotes; + voteShareOfMostVotedOption = tempNumberOfAllVotes? (max / tempNumberOfAllVotes) : 0; + numberOfVotesOfMostVotedOption = max; + interface CalculateVotesReturn { numbersOfVotersPerOption: number[]; } @@ -44,18 +74,34 @@ selectedOptions: [], }; } - function calculateVotes(): CalculateVotesReturn { - if (!vote.data) { - return { - numbersOfVotersPerOption: [], - }; - } - const numbersOfVotersPerOption: number[] = []; - for (let i = 0; i < vote.data.voteOptions.length; i++) { - let num = 0; - for (const voter of vote.data.voters) { - if (voter.votedOptions.includes(i)) { - num++; + + $effect(() => { + if (vote.data) { + let tempNumbersOfVotersPerOption: number[] = []; + let tempNumberOfAllVotes = 0; + let max = 0; + for (let i = 0; i < vote.data.voteOptions.length; i++) { + let num = 0; + for (let j = 0; j < vote.data.voters.length; j++) { + if (vote.data.voters[j].votedOptions.includes(i)) { + num++; + } + + } + if(num > max) max = num; + tempNumberOfAllVotes += num; + tempNumbersOfVotersPerOption.push(num); + } + numbersOfVotersPerOption = tempNumbersOfVotersPerOption; + numberOfAllVotes = tempNumberOfAllVotes; + voteShareOfMostVotedOption = tempNumberOfAllVotes? (max / tempNumberOfAllVotes) : 0; + numberOfVotesOfMostVotedOption = max; + if (me.data) { + for (let i = 0; i < vote.data.voters.length; i++) { + if (vote.data.voters[i].userId === me.data._id) { + selectedOptions = vote.data.voters[i].votedOptions; + isResultVisible = true; + } } } numbersOfVotersPerOption.push(num); @@ -93,24 +139,27 @@ } -{#if vote.data} -
- 一人の最大投票数:{vote.data?.maxVotes}票 -
- {#each vote.data?.voteOptions as option, i} - {@const status = clickableStatus(i)} -- {#if isResultVisible && numbersOfVotersPerOption[i]} - {option}: {numbersOfVotersPerOption[i]}人 - {:else} - {option} - {/if} +
+ 一人の最大投票数:{vote.data?.maxVotes}票 +
+ {#each vote.data?.voteOptions as option, i} ++ {option}{isResultVisible + ? ":" + numbersOfVotersPerOption[i] + "人" + : ""}
-