Files
q-tube/src/hooks/useFetchSuperLikes.tsx
2023-12-15 02:20:06 +02:00

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
}
}