mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-21 15:52:02 +00:00
refactor: rating logic
This commit is contained in:
parent
69047471bd
commit
21ad21c82e
5 changed files with 22 additions and 27 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)}>
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
src/types/types.d.ts
vendored
5
src/types/types.d.ts
vendored
|
|
@ -68,3 +68,8 @@ type AudioTrack = {
|
||||||
lang: string,
|
lang: string,
|
||||||
origin: string,
|
origin: string,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Rating = {
|
||||||
|
content: 'liked' | 'loved' | null,
|
||||||
|
type: 'Ready' | 'Loading' | 'Error',
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue