|  | @ -1,13 +1,14 @@ | 
			
		
	
		
		
			
				
					|  |  | import React, { |  |  | import React, { | 
			
		
	
		
		
			
				
					|  |  |   memo, useCallback, useEffect, useMemo, useState, |  |  |   memo, useCallback, useEffect, useMemo, useState, | 
			
		
	
		
		
			
				
					|  |  | } from 'react'; |  |  | } from 'react'; | 
			
		
	
		
		
			
				
					
					|  |  | import { Button } from 'semantic-ui-react'; |  |  | import { Button, Popup } from 'semantic-ui-react'; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | import PropTypes from 'prop-types'; |  |  | import PropTypes from 'prop-types'; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | import './styles.css'; | 
			
		
	
		
		
			
				
					|  |  | import { useSelector } from 'react-redux'; |  |  | import { useSelector } from 'react-redux'; | 
			
		
	
		
		
			
				
					|  |  | import { POST_VOTING_CONTRACT } from '../../../constants/contracts/ContractNames'; |  |  | import { POST_VOTING_CONTRACT } from '../../../constants/contracts/ContractNames'; | 
			
		
	
		
		
			
				
					|  |  | import { drizzle } from '../../../redux/store'; |  |  | import { drizzle } from '../../../redux/store'; | 
			
		
	
		
		
			
				
					|  |  | import { TRANSACTION_ERROR, TRANSACTION_SUCCESS } from '../../../constants/TransactionStatus'; |  |  | import { TRANSACTION_ERROR, TRANSACTION_SUCCESS } from '../../../constants/TransactionStatus'; | 
			
		
	
		
		
			
				
					|  |  | import './styles.css'; |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | const CHOICE_DEFAULT = '0'; |  |  | const CHOICE_DEFAULT = '0'; | 
			
		
	
		
		
			
				
					|  |  | const CHOICE_UP = '1'; |  |  | const CHOICE_UP = '1'; | 
			
		
	
	
		
		
			
				
					|  | @ -18,7 +19,8 @@ const { | 
			
		
	
		
		
			
				
					|  |  |     [POST_VOTING_CONTRACT]: { |  |  |     [POST_VOTING_CONTRACT]: { | 
			
		
	
		
		
			
				
					|  |  |       methods: { |  |  |       methods: { | 
			
		
	
		
		
			
				
					|  |  |         getVote: { cacheCall: getVoteChainData }, |  |  |         getVote: { cacheCall: getVoteChainData }, | 
			
		
	
		
		
			
				
					
					|  |  |         getTotalVoteCount: { cacheCall: getTotalVoteCountChainData }, |  |  |         getUpvoteCount: { cacheCall: getUpvoteCountChainData }, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         getDownvoteCount: { cacheCall: getDownvoteCountChainData }, | 
			
		
	
		
		
			
				
					|  |  |         upvote, downvote, unvote, |  |  |         upvote, downvote, unvote, | 
			
		
	
		
		
			
				
					|  |  |       }, |  |  |       }, | 
			
		
	
		
		
			
				
					|  |  |     }, |  |  |     }, | 
			
		
	
	
		
		
			
				
					|  | @ -33,12 +35,17 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  |   const userAccount = useSelector((state) => state.accounts[0]); |  |  |   const userAccount = useSelector((state) => state.accounts[0]); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   // Current votes |  |  |   // Current votes | 
			
		
	
		
		
			
				
					
					|  |  |   const getVoteResults = useSelector((state) => state.contracts[POST_VOTING_CONTRACT].getVote); |  |  |   const getVoteResult = useSelector((state) => state.contracts[POST_VOTING_CONTRACT].getVote); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |   const getTotalVoteCountResult = useSelector((state) => state.contracts[POST_VOTING_CONTRACT].getTotalVoteCount); |  |  |   const getUpvoteCountResult = useSelector((state) => state.contracts[POST_VOTING_CONTRACT].getUpvoteCount); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |   const getDownvoteCountResult = useSelector((state) => state.contracts[POST_VOTING_CONTRACT].getDownvoteCount); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   const [getVoteCallHash, setGetVoteCallHash] = useState([]); |  |  |   const [getVoteCallHash, setGetVoteCallHash] = useState([]); | 
			
		
	
		
		
			
				
					
					|  |  |   const [getTotalVoteCountCallHash, setGetTotalVoteCountCallHash] = useState([]); |  |  |   const [getUpvoteCountCallHash, setGetUpvoteCountCallHash] = useState([]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |   const [getDownvoteCountCallHash, setGetDownvoteCountCallHash] = useState([]); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   const [ownVote, setOwnVote] = useState(null); |  |  |   const [ownVote, setOwnVote] = useState(null); | 
			
		
	
		
		
			
				
					
					|  |  |   const [totalVoteCount, setTotalVoteCount] = useState(null); |  |  |   const [upvoteCount, setUpvoteCount] = useState(null); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |   const [downvoteCount, setDownvoteCount] = useState(null); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   // Voting |  |  |   // Voting | 
			
		
	
		
		
			
				
					|  |  |   const transactionStack = useSelector((state) => state.transactionStack); |  |  |   const transactionStack = useSelector((state) => state.transactionStack); | 
			
		
	
	
		
		
			
				
					|  | @ -48,12 +55,12 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   // Current votes |  |  |   // Current votes | 
			
		
	
		
		
			
				
					|  |  |   useEffect(() => { |  |  |   useEffect(() => { | 
			
		
	
		
		
			
				
					
					|  |  |     const shouldGetTotalVoteCountDataFromChain = totalVoteCount === null; |  |  |     if (drizzleInitialized && !drizzleInitializationFailed && postId !== null) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       if (upvoteCount === null) setGetUpvoteCountCallHash(getUpvoteCountChainData(postId)); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |     if (drizzleInitialized && !drizzleInitializationFailed && shouldGetTotalVoteCountDataFromChain && postId !== null) { |  |  |       if (downvoteCount === null) setGetDownvoteCountCallHash(getDownvoteCountChainData(postId)); | 
			
				
				
			
		
	
		
		
			
				
					|  |  |       setGetTotalVoteCountCallHash(getTotalVoteCountChainData(postId)); |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |   }, [drizzleInitializationFailed, drizzleInitialized, postId, totalVoteCount]); |  |  |   }, [downvoteCount, drizzleInitializationFailed, drizzleInitialized, postId, upvoteCount, userAccount]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   useEffect(() => { |  |  |   useEffect(() => { | 
			
		
	
		
		
			
				
					|  |  |     const shouldGetOwnVoteFromChain = ownVote === null; |  |  |     const shouldGetOwnVoteFromChain = ownVote === null; | 
			
		
	
	
		
		
			
				
					|  | @ -65,16 +72,22 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  |   }, [drizzleInitializationFailed, drizzleInitialized, ownVote, postId, userAccount]); |  |  |   }, [drizzleInitializationFailed, drizzleInitialized, ownVote, postId, userAccount]); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   useEffect(() => { |  |  |   useEffect(() => { | 
			
		
	
		
		
			
				
					
					|  |  |     if (getVoteCallHash && getVoteResults && getVoteResults[getVoteCallHash]) { |  |  |     if (getVoteCallHash && getVoteResult && getVoteResult[getVoteCallHash]) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |       setOwnVote(getVoteResults[getVoteCallHash].value); |  |  |       setOwnVote(getVoteResult[getVoteCallHash].value); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |   }, [getVoteCallHash, getVoteResults]); |  |  |   }, [getVoteCallHash, getVoteResult]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   useEffect(() => { |  |  |   useEffect(() => { | 
			
		
	
		
		
			
				
					
					|  |  |     if (getTotalVoteCountCallHash && getTotalVoteCountResult && getTotalVoteCountResult[getTotalVoteCountCallHash]) { |  |  |     if (getUpvoteCountCallHash && getUpvoteCountResult && getUpvoteCountResult[getUpvoteCountCallHash]) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |       setTotalVoteCount(getTotalVoteCountResult[getTotalVoteCountCallHash].value); |  |  |       setUpvoteCount(getUpvoteCountResult[getUpvoteCountCallHash].value); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |   }, [getTotalVoteCountCallHash, getTotalVoteCountResult]); |  |  |   }, [getUpvoteCountCallHash, getUpvoteCountResult]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   useEffect(() => { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     if (getDownvoteCountCallHash && getDownvoteCountResult && getDownvoteCountResult[getDownvoteCountCallHash]) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       setDownvoteCount(getDownvoteCountResult[getDownvoteCountCallHash].value); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   }, [getDownvoteCountCallHash, getDownvoteCountResult]); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   // Voting |  |  |   // Voting | 
			
		
	
		
		
			
				
					|  |  |   useEffect(() => { |  |  |   useEffect(() => { | 
			
		
	
	
		
		
			
				
					|  | @ -96,6 +109,7 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  |   }, [ownVote, postId, userAccount, voting]); |  |  |   }, [ownVote, postId, userAccount, voting]); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   const disableVoting = userAccount === null || !hasSignedUp || postAuthorAddress === null || userAccount === postAuthorAddress; |  |  |   const disableVoting = userAccount === null || !hasSignedUp || postAuthorAddress === null || userAccount === postAuthorAddress; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   const totalVoteCount = (upvoteCount !== null && downvoteCount !== null) ? upvoteCount - downvoteCount : null; | 
			
		
	
		
		
			
				
					|  |  |   return useMemo(() => ( |  |  |   return useMemo(() => ( | 
			
		
	
		
		
			
				
					|  |  |       <div className="post-voting"> |  |  |       <div className="post-voting"> | 
			
		
	
		
		
			
				
					|  |  |           <Button |  |  |           <Button | 
			
		
	
	
		
		
			
				
					|  | @ -106,11 +120,32 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  |             disabled={disableVoting} |  |  |             disabled={disableVoting} | 
			
		
	
		
		
			
				
					|  |  |             onClick={() => vote(CHOICE_DOWN)} |  |  |             onClick={() => vote(CHOICE_DOWN)} | 
			
		
	
		
		
			
				
					|  |  |           /> |  |  |           /> | 
			
		
	
		
		
			
				
					
					|  |  |           <span className="unselectable"> |  |  |           <Popup | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                  |  |  |             trigger={( | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |               {totalVoteCount || 0} |  |  |                 <span className="unselectable"> | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |                  |  |  |                  | 
			
		
	
		
		
			
				
					
					|  |  |           </span> |  |  |                     {totalVoteCount || 0} | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                      | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 </span> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             )} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             disabled={(upvoteCount === null && downvoteCount === null) || (upvoteCount === '0' && downvoteCount === '0')} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             position="bottom center" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               {upvoteCount !== '0' ? ( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                   <span className="upvote-count"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                       + | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                       {upvoteCount} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                          | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                   </span> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               ) : null} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               {downvoteCount !== '0' ? ( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                   <span className="downvote-count"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                       - | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                       {downvoteCount} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                   </span> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               ) : null} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           </Popup> | 
			
		
	
		
		
			
				
					|  |  |           <Button |  |  |           <Button | 
			
		
	
		
		
			
				
					|  |  |             compact |  |  |             compact | 
			
		
	
		
		
			
				
					|  |  |             size="mini" |  |  |             size="mini" | 
			
		
	
	
		
		
			
				
					|  | @ -120,7 +155,7 @@ const PostVoting = (props) => { | 
			
		
	
		
		
			
				
					|  |  |             onClick={() => vote(CHOICE_UP)} |  |  |             onClick={() => vote(CHOICE_UP)} | 
			
		
	
		
		
			
				
					|  |  |           /> |  |  |           /> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					
					|  |  |   ), [disableVoting, ownVote, totalVoteCount, vote]); |  |  |   ), [disableVoting, downvoteCount, ownVote, totalVoteCount, upvoteCount, vote]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | }; |  |  | }; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | PostVoting.propTypes = { |  |  | PostVoting.propTypes = { | 
			
		
	
	
		
		
			
				
					|  | 
 |