forked from Qortal/q-tube
115 lines
2.6 KiB
TypeScript
115 lines
2.6 KiB
TypeScript
import React, { useCallback } from 'react'
|
|
import { useDispatch, useSelector } from 'react-redux'
|
|
import {
|
|
|
|
addtoHashMapSuperlikes
|
|
} from '../state/features/videoSlice'
|
|
|
|
import { RootState } from '../state/store'
|
|
import { queueSuperlikes } from '../wrappers/GlobalWrapper'
|
|
|
|
|
|
|
|
export const useFetchSuperLikes = () => {
|
|
const dispatch = useDispatch()
|
|
const hashMapSuperlikes = useSelector(
|
|
(state: RootState) => state.video.hashMapSuperlikes
|
|
)
|
|
const checkAndUpdateSuperlike= React.useCallback(
|
|
(superlike: any) => {
|
|
const existingVideo = hashMapSuperlikes[superlike.identifier]
|
|
if (!existingVideo) {
|
|
return true
|
|
} else if (
|
|
superlike?.updated &&
|
|
existingVideo?.updated &&
|
|
(!existingVideo?.updated || superlike?.updated) > existingVideo?.updated
|
|
) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
},
|
|
[hashMapSuperlikes]
|
|
)
|
|
|
|
|
|
const fetchSuperlike = async (data: any) => {
|
|
const getsuper = async () => {
|
|
const { user, videoId, content } = data
|
|
let obj: any = {
|
|
...content,
|
|
isValid: false
|
|
}
|
|
|
|
if (!user || !videoId) return obj
|
|
|
|
try {
|
|
|
|
const responseData = await qortalRequest({
|
|
action: 'FETCH_QDN_RESOURCE',
|
|
name: user,
|
|
service: content?.service || 'BLOG_COMMENT',
|
|
identifier: videoId
|
|
})
|
|
|
|
obj = {
|
|
...content,
|
|
...responseData,
|
|
isValid: true
|
|
}
|
|
|
|
return obj
|
|
} catch (error: any) {
|
|
throw new Error(error?.message || 'error')
|
|
}
|
|
}
|
|
|
|
const res = await getsuper()
|
|
return res
|
|
}
|
|
|
|
|
|
|
|
const getSuperLikes = async (user: string, videoId: string, content: any, retries: number = 0) => {
|
|
try {
|
|
const res = await fetchSuperlike({
|
|
user,
|
|
videoId,
|
|
content
|
|
})
|
|
|
|
dispatch(addtoHashMapSuperlikes(res))
|
|
} catch (error) {
|
|
retries= retries + 1
|
|
if (retries < 2) { // 3 is the maximum number of retries here, you can adjust it to your needs
|
|
queueSuperlikes.push(() => getSuperLikes(user, videoId, content, retries + 1));
|
|
} else {
|
|
console.error('Failed to get video after 3 attempts', error);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
const addSuperlikeRawDataGetToList = useCallback(({name, identifier, content})=> {
|
|
|
|
if (name && identifier) {
|
|
const res = checkAndUpdateSuperlike(content)
|
|
if (res) {
|
|
queueSuperlikes.push(() => getSuperLikes(name, identifier, content));
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}, [checkAndUpdateSuperlike])
|
|
|
|
|
|
|
|
return {
|
|
addSuperlikeRawDataGetToList
|
|
}
|
|
}
|