webapp/src/components/Author/AuthorRatingControl.tsx

70 lines
2.1 KiB
TypeScript
Raw Normal View History

import type { Author } from '~/graphql/schema/core.gen'
import { clsx } from 'clsx'
2024-07-30 19:06:17 +00:00
import { Show, createMemo, createSignal } from 'solid-js'
import { coreApiUrl } from '~/config'
import { useSession } from '~/context/session'
import { graphqlClientCreate } from '~/graphql/client'
2024-06-24 17:50:27 +00:00
import rateAuthorMutation from '~/graphql/mutation/core/author-rate'
2023-12-27 23:04:12 +00:00
import styles from './AuthorRatingControl.module.scss'
interface AuthorRatingControlProps {
author: Author
class?: string
}
export const AuthorRatingControl = (props: AuthorRatingControlProps) => {
const isUpvoted = false
const isDownvoted = false
2024-07-30 19:06:17 +00:00
const { session } = useSession()
const client = createMemo(() => graphqlClientCreate(coreApiUrl, session()?.access_token))
2023-05-01 18:32:32 +00:00
// eslint-disable-next-line unicorn/consistent-function-scoping
2023-12-27 22:50:42 +00:00
const handleRatingChange = async (isUpvote: boolean) => {
console.log('handleRatingChange', { isUpvote })
2023-12-27 22:57:24 +00:00
if (props.author?.slug) {
2023-12-27 23:04:12 +00:00
const value = isUpvote ? 1 : -1
2024-07-30 19:06:17 +00:00
const _resp = await client()
?.mutation(rateAuthorMutation, {
rated_slug: props.author?.slug,
value
})
.toPromise()
2024-06-24 17:50:27 +00:00
setRating((r) => (r || 0) + value)
2023-12-27 22:57:24 +00:00
}
}
2023-12-27 22:57:24 +00:00
const [rating, setRating] = createSignal(props.author?.stat?.rating)
return (
<div
class={clsx(styles.rating, props.class, {
[styles.isUpvoted]: isUpvoted,
2024-06-26 08:22:05 +00:00
[styles.isDownvoted]: isDownvoted
})}
>
<button
class={clsx(styles.ratingControl, styles.downvoteButton)}
onClick={() => handleRatingChange(false)}
>
&minus;
</button>
{/*TODO*/}
2023-12-27 22:50:42 +00:00
<div>
<div class={styles.ratingValue}>{rating()}</div>
<Show when={props.author?.stat?.rating_shouts}>
<div class={styles.ratingValue}>{props.author?.stat?.rating_shouts}</div>
</Show>
<Show when={props.author?.stat?.rating_comments}>
<div class={styles.ratingValue}>{props.author?.stat?.rating_comments}</div>
</Show>
</div>
<button
class={clsx(styles.ratingControl, styles.upvoteButton)}
onClick={() => handleRatingChange(true)}
>
+
</button>
</div>
)
}