216 lines
8.5 KiB
JavaScript
216 lines
8.5 KiB
JavaScript
async function initVoteContainer( containerElement ) {
|
|
const assetId = containerElement.getAttribute('data-assetid')
|
|
const XCSRFToken = document.getElementById('X-CSRF-TOKEN').getAttribute('data-xcsrf')
|
|
if ( XCSRFToken == null ) {
|
|
console.log('XCSRFToken is null, cannot continue')
|
|
return
|
|
}
|
|
var AssetLikesCount = Number(containerElement.getAttribute("data-likes"))
|
|
var AssetDislikesCount = Number(containerElement.getAttribute("data-dislikes"))
|
|
var UserVoteStatus = containerElement.getAttribute("data-uservote-status") // 2 = Dislike, 0 = No vote, 1 = Like
|
|
|
|
const LikeButton = containerElement.getElementsByClassName('icon-like')[0]
|
|
const DislikeButton = containerElement.getElementsByClassName('icon-dislike')[0]
|
|
const VotePercentageElement = containerElement.getElementsByClassName('votepercentage')[0]
|
|
const LikesElementText = containerElement.getElementsByClassName('vote-up-text')[0]
|
|
const DislikesElementText = containerElement.getElementsByClassName('vote-down-text')[0]
|
|
|
|
const VoteFeedbackText = containerElement.getElementsByClassName('vote-feedback-text')[0]
|
|
|
|
const UpdateVoteCount = async () => {
|
|
LikesElementText.textContent = AssetLikesCount
|
|
LikesElementText.setAttribute("title", AssetLikesCount)
|
|
DislikesElementText.textContent = AssetDislikesCount
|
|
DislikesElementText.setAttribute("title", AssetDislikesCount)
|
|
|
|
const TotalVotes = AssetLikesCount + AssetDislikesCount
|
|
var LikePercentage = Math.round((AssetLikesCount / TotalVotes) * 100)
|
|
if ( TotalVotes == 0 ) {
|
|
LikePercentage = 50
|
|
} else if ( TotalVotes == 1 ) { // AssetLikesCount / TotalVotes may be Infinity
|
|
LikePercentage = AssetLikesCount == 1 ? 100 : 0
|
|
}
|
|
VotePercentageElement.style.width = `${LikePercentage}%`
|
|
}
|
|
const UpdateVoteButtons = async () => {
|
|
// Check if the "selected" className is present, if so, remove it if it's not the correct one
|
|
if ( LikeButton.classList.contains('selected') ) {
|
|
if ( UserVoteStatus != 1 ) {
|
|
LikeButton.classList.remove('selected')
|
|
}
|
|
} else if ( UserVoteStatus == 1 ) {
|
|
LikeButton.classList.add('selected')
|
|
}
|
|
if ( DislikeButton.classList.contains('selected') ) {
|
|
if ( UserVoteStatus != 2 ) {
|
|
DislikeButton.classList.remove('selected')
|
|
}
|
|
} else if ( UserVoteStatus == 2 ) {
|
|
DislikeButton.classList.add('selected')
|
|
}
|
|
}
|
|
const UpdateUserVoteStatus = async ( newVoteStatus ) => {
|
|
var OriginalVoteStatus = UserVoteStatus;
|
|
var OriginalLikesCount = AssetLikesCount;
|
|
var OriginalDislikesCount = AssetDislikesCount;
|
|
let ServerVoteResponse;
|
|
if ( newVoteStatus == UserVoteStatus ) {
|
|
return;
|
|
}
|
|
UserVoteStatus = newVoteStatus
|
|
if ( newVoteStatus == 1 ) {
|
|
AssetLikesCount++
|
|
if ( OriginalVoteStatus == 2 ) {
|
|
AssetDislikesCount--
|
|
}
|
|
}
|
|
if ( newVoteStatus == 2 ) {
|
|
AssetDislikesCount++
|
|
if ( OriginalVoteStatus == 1 ) {
|
|
AssetLikesCount--
|
|
}
|
|
}
|
|
if ( newVoteStatus == 0 ) {
|
|
if ( OriginalVoteStatus == 1 ) {
|
|
AssetLikesCount--
|
|
}
|
|
if ( OriginalVoteStatus == 2 ) {
|
|
AssetDislikesCount--
|
|
}
|
|
}
|
|
await UpdateVoteButtons()
|
|
await UpdateVoteCount()
|
|
|
|
try {
|
|
ServerVoteResponse = await fetch(`/vote/${assetId}/${newVoteStatus}`,{
|
|
method: 'POST',
|
|
headers: {
|
|
'X-CSRF-TOKEN': XCSRFToken
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.log(`Error occured while trying to update user vote: ${error}`)
|
|
return
|
|
}
|
|
if ( ServerVoteResponse.status != 200 ) {
|
|
console.log(`Server responded with status code ${ServerVoteResponse.status} while trying to update user vote`)
|
|
UserVoteStatus = OriginalVoteStatus
|
|
AssetLikesCount = OriginalLikesCount
|
|
AssetDislikesCount = OriginalDislikesCount
|
|
VoteFeedbackText.textContent = `Error while trying to update vote, Status: ${ServerVoteResponse.status}`
|
|
VoteFeedbackText.style.display = 'block'
|
|
await UpdateVoteButtons()
|
|
await UpdateVoteCount()
|
|
return
|
|
}
|
|
return;
|
|
}
|
|
await UpdateVoteCount()
|
|
await UpdateVoteButtons()
|
|
|
|
LikeButton.addEventListener('click', async () => {
|
|
// Check if its already selected, if so, remove the vote
|
|
if ( LikeButton.classList.contains('selected') ) {
|
|
await UpdateUserVoteStatus(0)
|
|
return
|
|
}
|
|
await UpdateUserVoteStatus(1)
|
|
})
|
|
DislikeButton.addEventListener('click', async () => {
|
|
// Check if its already selected, if so, remove the vote
|
|
if ( DislikeButton.classList.contains('selected') ) {
|
|
await UpdateUserVoteStatus(0)
|
|
return
|
|
}
|
|
await UpdateUserVoteStatus(2)
|
|
})
|
|
}
|
|
|
|
async function initFavoriteContainer( containerElement ) {
|
|
const assetId = containerElement.getAttribute('data-assetid')
|
|
const XCSRFToken = document.getElementById('X-CSRF-TOKEN').getAttribute('data-xcsrf')
|
|
if ( XCSRFToken == null ) {
|
|
console.log('XCSRFToken is null, cannot continue')
|
|
return
|
|
}
|
|
var FavoriteCount = Number(containerElement.getAttribute("data-favorite-count"))
|
|
var UserFavoriteStatus = containerElement.getAttribute("data-userfavorite-status") == "True" ? true : false
|
|
const FavoriteButton = containerElement.getElementsByClassName('icon-favorite')[0]
|
|
const FavoriteButtonText = containerElement.getElementsByClassName('text-favorite')[0]
|
|
|
|
const UpdateFavoriteCount = async () => {
|
|
FavoriteButtonText.textContent = FavoriteCount
|
|
FavoriteButtonText.setAttribute("title", FavoriteCount)
|
|
}
|
|
const UpdateFavoriteButton = async () => {
|
|
if ( UserFavoriteStatus ) {
|
|
FavoriteButton.classList.add('favorited')
|
|
} else {
|
|
FavoriteButton.classList.remove('favorited')
|
|
}
|
|
}
|
|
const UpdateUserFavoriteStatus = async ( newFavoriteStatus ) => {
|
|
var OriginalFavoriteStatus = UserFavoriteStatus;
|
|
var OriginalFavoriteCount = FavoriteCount;
|
|
let ServerFavoriteResponse;
|
|
if ( newFavoriteStatus == UserFavoriteStatus ) {
|
|
return;
|
|
}
|
|
UserFavoriteStatus = newFavoriteStatus
|
|
if ( newFavoriteStatus ) {
|
|
FavoriteCount++
|
|
} else {
|
|
FavoriteCount--
|
|
}
|
|
await UpdateFavoriteButton()
|
|
await UpdateFavoriteCount()
|
|
|
|
try {
|
|
if ( newFavoriteStatus ) {
|
|
ServerFavoriteResponse = await fetch(`/favorite/${assetId}`,{
|
|
method: 'POST',
|
|
headers: {
|
|
'X-CSRF-TOKEN': XCSRFToken
|
|
}
|
|
})
|
|
} else {
|
|
ServerFavoriteResponse = await fetch(`/favorite/${assetId}`,{
|
|
method: 'DELETE',
|
|
headers: {
|
|
'X-CSRF-TOKEN': XCSRFToken
|
|
}
|
|
})
|
|
}
|
|
} catch (error) {
|
|
console.log(`Error occured while trying to update user favorite: ${error}`)
|
|
return
|
|
}
|
|
if ( ServerFavoriteResponse.status != 200 ) {
|
|
console.log(`Server responded with status code ${ServerFavoriteResponse.status} while trying to update user favorite`)
|
|
UserFavoriteStatus = OriginalFavoriteStatus
|
|
FavoriteCount = OriginalFavoriteCount
|
|
await UpdateFavoriteButton()
|
|
await UpdateFavoriteCount()
|
|
return
|
|
}
|
|
return;
|
|
}
|
|
|
|
await UpdateFavoriteButton()
|
|
await UpdateFavoriteCount()
|
|
|
|
FavoriteButton.addEventListener('click', async () => {
|
|
await UpdateUserFavoriteStatus(!UserFavoriteStatus)
|
|
})
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
const assetRateContainers = document.getElementsByClassName('usersVote')
|
|
for(let i = 0; i < assetRateContainers.length; i++){
|
|
await initVoteContainer( assetRateContainers[i] )
|
|
}
|
|
const assetFavoriteContainers = document.getElementsByClassName('favorite-button-container')
|
|
for(let i = 0; i < assetFavoriteContainers.length; i++){
|
|
await initFavoriteContainer( assetFavoriteContainers[i] )
|
|
}
|
|
}) |