refactor: rating logic

This commit is contained in:
Tim 2025-06-11 16:08:30 +02:00
parent 69047471bd
commit 21ad21c82e
5 changed files with 22 additions and 27 deletions

View file

@ -25,7 +25,7 @@ const ALLOWED_LINK_REDIRECTS = [
routesRegexp.metadetails.regexp routesRegexp.metadetails.regexp
]; ];
const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary, like }, ref) => { const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary, rating }, ref) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false); const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false);
const linksGroups = React.useMemo(() => { const linksGroups = React.useMemo(() => {
@ -236,7 +236,7 @@ const MetaPreview = React.forwardRef(({ className, compact, name, logo, backgrou
{ {
!compact ? !compact ?
<Ratings <Ratings
like={like} rating={rating}
className={styles['ratings']} className={styles['ratings']}
/> />
: :
@ -298,7 +298,7 @@ MetaPreview.propTypes = {
trailerStreams: PropTypes.array, trailerStreams: PropTypes.array,
inLibrary: PropTypes.bool, inLibrary: PropTypes.bool,
toggleInLibrary: PropTypes.func, toggleInLibrary: PropTypes.func,
like: PropTypes.object, rating: PropTypes.object,
}; };
module.exports = MetaPreview; module.exports = MetaPreview;

View file

@ -6,20 +6,15 @@ import styles from './Ratings.less';
import Icon from '@stremio/stremio-icons/react'; import Icon from '@stremio/stremio-icons/react';
import classNames from 'classnames'; import classNames from 'classnames';
type Like = {
content: 'liked' | 'loved';
type: 'Ready' | 'Loading' | 'Error';
};
type Props = { type Props = {
metaId?: string; metaId?: string;
like?: Like; rating?: Rating;
className?: string; className?: string;
}; };
const Ratings = ({ like, className }: Props) => { const Ratings = ({ rating, className }: Props) => {
const { onLiked, onLoved, liked, loved } = useRating(like); const { onLiked, onLoved, liked, loved } = useRating(rating);
const disabled = useMemo(() => like?.type !== 'Ready', [like]); const disabled = useMemo(() => rating?.type !== 'Ready', [rating]);
return ( return (
<div className={classNames(styles['ratings-container'], className)}> <div className={classNames(styles['ratings-container'], className)}>

View file

@ -3,12 +3,7 @@
import { useMemo, useCallback } from 'react'; import { useMemo, useCallback } from 'react';
import { useServices } from 'stremio/services'; import { useServices } from 'stremio/services';
type Like = { const useRating = (rating?: Rating) => {
content: 'liked' | 'loved' | null;
type: 'Ready' | 'Loading' | 'Error';
};
const useRating = (like?: Like) => {
const { core } = useServices(); const { core } = useServices();
const setRating = useCallback((status: 'liked' | 'loved' | null) => { const setRating = useCallback((status: 'liked' | 'loved' | null) => {
@ -22,20 +17,20 @@ const useRating = (like?: Like) => {
}, []); }, []);
const liked = useMemo(() => { const liked = useMemo(() => {
return like?.content === 'liked'; return rating?.content === 'liked';
}, [like]); }, [rating]);
const loved = useMemo(() => { const loved = useMemo(() => {
return like?.content === 'loved'; return rating?.content === 'loved';
}, [like]); }, [rating]);
const onLiked = useCallback(() => { const onLiked = useCallback(() => {
setRating(like?.content === 'liked' ? null : 'liked'); setRating(rating?.content === 'liked' ? null : 'liked');
}, [like]); }, [rating]);
const onLoved = useCallback(() => { const onLoved = useCallback(() => {
setRating(like?.content === 'loved' ? null : 'loved'); setRating(rating?.content === 'loved' ? null : 'loved');
}, [like]); }, [rating]);
return { return {
onLiked, onLiked,

View file

@ -167,7 +167,7 @@ const MetaDetails = ({ urlParams, queryParams }) => {
inLibrary={metaDetails.metaItem.content.content.inLibrary} inLibrary={metaDetails.metaItem.content.content.inLibrary}
toggleInLibrary={metaDetails.metaItem.content.content.inLibrary ? removeFromLibrary : addToLibrary} toggleInLibrary={metaDetails.metaItem.content.content.inLibrary ? removeFromLibrary : addToLibrary}
metaId={metaDetails.metaItem.content.content.id} metaId={metaDetails.metaItem.content.content.id}
like={metaDetails.like} rating={metaDetails.rating}
/> />
</React.Fragment> </React.Fragment>
} }

View file

@ -68,3 +68,8 @@ type AudioTrack = {
lang: string, lang: string,
origin: string, origin: string,
}; };
type Rating = {
content: 'liked' | 'loved' | null,
type: 'Ready' | 'Loading' | 'Error',
};