Created
December 29, 2021 21:48
-
-
Save sendbird-community/58cf0e382de0ae7d60f9582d57b5f642 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { useState } from "react"; | |
import { | |
Card, | |
CardHeader, | |
Avatar, | |
CardContent, | |
Typography, | |
} from "@material-ui/core"; | |
import "./index.css"; | |
import AddSuggestedTask from "./AddSuggestedTask"; | |
export default function VotingMessage(props) { | |
// props | |
const { | |
message, | |
userId, | |
onDeleteMessage, | |
sdk, | |
currentChannel, | |
updateLastMessage, | |
} = props; | |
// useState | |
const [messageText, changeMessageText] = useState(message.message); | |
const [messageOptions, setMessageOptions] = useState(false); | |
const [showForm, setShowForm] = useState(false); | |
const [showOptionsForm, setShowOptionsForm] = useState(false); | |
const [optionsValue, setOptionsValue] = useState(""); | |
const openDropdown = () => { | |
setMessageOptions(!messageOptions); | |
}; | |
const changeSuggestionSubmit = (e) => { | |
e.preventDefault(); | |
const createParams = (txt) => { | |
const params = new sdk.UserMessageParams(); | |
params.message = txt; | |
return params; | |
}; | |
const params = createParams(messageText); | |
currentChannel.updateUserMessage(message.messageId, params, (r, e) => { | |
updateLastMessage(currentChannel.url, message.messageId, params); | |
}); | |
setMessageOptions(!messageOptions); | |
changeMessageText(""); | |
setShowForm(false); | |
}; | |
const toggleOptionsForm = () => { | |
setShowOptionsForm(!showOptionsForm); | |
}; | |
const renderQuestionForm = () => { | |
setShowForm(true); | |
setMessageOptions(!messageOptions); | |
}; | |
const handleVote = (e) => { | |
var channelParsedData = JSON.parse(currentChannel.data); | |
var options = channelParsedData[message.messageId]["voting_app_options"]; | |
var optionVotingFor = e.target.dataset.option; | |
var currentUserId = parseInt(userId); | |
var objIndex = options.findIndex( | |
(option) => option.title === optionVotingFor | |
); | |
if (options[objIndex].voters.includes(currentUserId)) { | |
var filteredOptions = options[objIndex].voters.filter( | |
(id) => id !== currentUserId | |
); | |
options[objIndex].voters = filteredOptions; | |
} else { | |
options[objIndex].voters.push(currentUserId); | |
} | |
var channelParams = new sdk.GroupChannelParams(); | |
var channelDataString = JSON.stringify(channelParsedData); | |
channelParams.data = channelDataString; | |
currentChannel.updateChannel(channelParams, (err, channel) => { | |
var parsedChannelData = JSON.parse(channelParams.data); | |
console.log("updatedChannelParamsData new=", parsedChannelData); | |
}); | |
}; | |
const setMessageInChannelParams = () => { | |
var channelParams = new sdk.GroupChannelParams(); | |
var messageId = message.messageId; | |
var channelDataString = ""; | |
if (currentChannel.data) { | |
var parsedChannelData = JSON.parse(currentChannel.data); | |
parsedChannelData[`${messageId}`] = { | |
voting_app_options: [ | |
{ | |
id: 1, | |
title: optionsValue, | |
voters: [], | |
created_by: message._sender.nickname, | |
} | |
], | |
}; | |
channelDataString = JSON.stringify(parsedChannelData); | |
} else { | |
var newChannelData = {}; | |
newChannelData[`${messageId}`] = { | |
voting_app_options: [ | |
{ | |
id: 1, | |
title: optionsValue, | |
voters: [], | |
created_by: message._sender.nickname, | |
} | |
], | |
}; | |
channelDataString = JSON.stringify(newChannelData); | |
} | |
channelParams.data = channelDataString; | |
currentChannel.updateChannel(channelParams, (err, channel) => { | |
var parsedChannelData = JSON.parse(channelParams.data); | |
console.log("updatedChannelParamsData new=", parsedChannelData); | |
}); | |
}; | |
const handleOptionsSubmit = (e) => { | |
e.preventDefault(); | |
setShowOptionsForm(false); | |
var messageId = message.messageId; | |
var channelParams = new sdk.GroupChannelParams(); | |
var parsedChannelData = JSON.parse(currentChannel.data); | |
var messageData = parsedChannelData[messageId]; | |
if(!parsedChannelData[messageId]){ | |
setMessageInChannelParams(); | |
} else { | |
var votingOptions = messageData["voting_app_options"]; | |
var optionNumber = votingOptions.length + 1; | |
var newOption = { | |
id: optionNumber, | |
title: optionsValue, | |
voters: [], | |
created_by: message._sender.nickname, | |
}; | |
votingOptions.push(newOption); | |
var channelDataString = JSON.stringify(parsedChannelData); | |
channelParams.data = channelDataString; | |
currentChannel.updateChannel(channelParams, (err, channel) => { | |
var parsedChannelData = JSON.parse(channelParams.data); | |
console.log("updatedChannelParamsData set=", parsedChannelData); | |
}); | |
} | |
setOptionsValue(""); | |
}; | |
var channelParsedData = JSON.parse(currentChannel.data); | |
var suggestionMessage = channelParsedData[message.messageId]; | |
var votingOptions = (suggestionMessage === undefined) || ( Object.keys(suggestionMessage).length === 0) ? false : suggestionMessage["voting_app_options"]; | |
return ( | |
<div className="voting-message"> | |
<Card> | |
<CardHeader | |
avatar={ | |
message.sender ? ( | |
<Avatar alt="Us" src={message.sender.plainProfileUrl} /> | |
) : ( | |
<Avatar className="user-message__avatar">Us</Avatar> | |
) | |
} | |
title={ | |
message.sender | |
? message.sender.nickname || message.sender.userId | |
: "(No name)" | |
} | |
/> | |
<CardContent> | |
{ | |
<Typography variant="body2" component="p"> | |
{message.message} | |
{!showOptionsForm && ( | |
<div> | |
<button onClick={toggleOptionsForm} id="add-options-btn"> | |
+ Add Option | |
</button> | |
</div> | |
)} | |
{showOptionsForm && ( | |
<div id="option-form"> | |
<form onSubmit={(e) => handleOptionsSubmit(e)}> | |
<label htmlFor="question" id="option-header"> | |
Option: | |
</label> | |
<br></br> | |
<input | |
type="text" | |
id="option-input" | |
name="option" | |
value={optionsValue} | |
onChange={(e) => { | |
setOptionsValue(e.target.value); | |
}} | |
/> | |
<br></br> | |
<input | |
type="submit" | |
value="Submit" | |
id="option-submit-btn" | |
/> | |
<button onClick={toggleOptionsForm} id="option-cancel-btn"> | |
Cancel | |
</button> | |
</form> | |
</div> | |
)} | |
{votingOptions && | |
votingOptions.map(function (option) { | |
return ( | |
<div id="options-wrapper"> | |
<p id="option-title"> | |
<p id="option-number-text">{option.id}</p>:{" "} | |
{option.title} | |
</p> | |
{option.voters && ( | |
<p id="option-vote-count"> | |
<p id="total-votes-text">Total Votes:</p>{" "} | |
{option.voters.length} | |
</p> | |
)} | |
</div> | |
); | |
})} | |
<div id="vote-buttons-wrapper"> | |
{votingOptions && | |
votingOptions.map(function (option) { | |
var style = {}; | |
if (option.voters.includes(parseInt(userId))) { | |
style = { backgroundColor: "white", color: "#6210cc" }; | |
} else { | |
style = { backgroundColor: "#6210cc", color: "white" }; | |
} | |
return ( | |
<div id="vote-button-wrap"> | |
<button | |
onClick={handleVote} | |
data-option={option.title} | |
id="vote-btn" | |
style={style} | |
> | |
{option.id} | |
</button> | |
</div> | |
); | |
})} | |
</div> | |
</Typography> | |
} | |
{showForm && ( | |
<AddSuggestedTask | |
messageText={messageText} | |
changeMessageText={changeMessageText} | |
changeSuggestionSubmit={changeSuggestionSubmit} | |
setShowForm={setShowForm} | |
/> | |
)} | |
</CardContent> | |
<button className="user-message__options-btn" onClick={openDropdown}> | |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"> | |
<path | |
className="icon-more_svg__fill" | |
d="M32 45.333a5.333 5.333 0 110 10.666 5.333 5.333 0 010-10.666zM32 28a5.333 5.333 0 110 10.668A5.333 5.333 0 0132 28zm0-17.333c2.946 0 5.333 2.387 5.333 5.333S34.946 21.333 32 21.333 26.667 18.946 26.667 16s2.387-5.333 5.333-5.333z" | |
fill="#000" | |
fillRule="evenodd" | |
></path> | |
</svg> | |
</button> | |
{messageOptions && !showForm && ( | |
<div className="message-options-wrap"> | |
<ul className="sendbird_dropdown_menu"> | |
{message.sender && message.sender.userId === userId && ( | |
<div> | |
<li | |
className="dropdown__menu-item" | |
onClick={renderQuestionForm} | |
> | |
<span className="dropdown__menu-item-text"> | |
Change Task | |
</span> | |
</li> | |
<li | |
className="dropdown__menu-item" | |
onClick={() => onDeleteMessage(message)} | |
> | |
<span className="dropdown__menu-item-text">Delete</span> | |
</li> | |
</div> | |
)} | |
</ul> | |
</div> | |
)} | |
</Card> | |
</div> | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment