yup-live-chrome-extension/src/utils/votes.ts

104 lines
2.7 KiB
TypeScript

import type { Vote } from './types'
import { fetchWAuth } from './auth'
import type { StorageType } from './storage'
const API_BASE = 'https://api.yup.io'
export const getPost = async (url: string): Promise<any | null> => {
try {
const res = await fetch('https://api.yup.io/posts/post/url', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
url
})
})
if(res.ok) {
return (await res.json())?.[0] ?? null
}
} catch {
return null
}
}
export const hasVote = (postId: string, account: string): Promise<Vote[]> => {
return new Promise((resolve) => {
fetch(`${API_BASE}/votes/post/${postId}/voter/${account}`).then((res) => {
if (res.ok) {
res.json().then((json) => {
resolve(json)
})
} else {
resolve([] as Vote[])
}
})
})
}
export const executeVote = async ({
userVote,
post,
url,
$mainStore,
$alertStore,
noVoteAlert = false
}) => {
const body = {} as Record<string, unknown>
let voteid = ''
if (userVote?._id) {
voteid = userVote._id.voteid
} else if(post) {
body.postid = post._id.postid
} else {
body.url = url
}
body.rating = userVote.rating
body.voter = $mainStore.user.auth.userId
console.log(body.voter)
if (userVote.like) {
body.like = true
} else {
body.like = false
}
const req = await fetchWAuth($mainStore, `${API_BASE}/votes${voteid ? '/' + voteid : ''}`, {
method: 'POST',
body: JSON.stringify(body)
})
if (req.ok) {
noVoteAlert || $alertStore?.show('Rating submited!')
return await req.json()
} else {
const err = await req.text()
if (err.includes('limit')) {
$alertStore?.show('Rating limit reached!!!', 'warning')
} else if(err.includes('requests')) {
$alertStore?.show('You have made too many request try again after 24h', 'warning')
} else if(err.toLocaleLowerCase().includes('unauthorized')) {
$alertStore?.show('Seems your auth token is not valid anymore re-login!!', 'error')
} else {
$alertStore?.show('Vote not submited due to error try to re-login!', 'error')
}
return null
}
}
export const getVotePayload = ({
url, store, type
}: {
url: string,
store: StorageType,
type: boolean
}) => {
return {
userVote: {
like: type,
rating: 1
},
post: '',
url: (url || '').replace(/\/$/gms, ''),
$mainStore: store,
$alertStore: null
}
}