From faee4166c3dd8e5dd4a4874f64ab64749b6fd2f5 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Tue, 3 Jun 2025 14:58:19 +0300 Subject: [PATCH 01/29] feat(MetaPreview): impl user item ratings --- src/components/MetaPreview/MetaPreview.js | 31 ++++++++++++++-- src/components/MetaPreview/useRating.ts | 44 +++++++++++++++++++++++ src/routes/MetaDetails/MetaDetails.js | 1 + src/types/models/MetaDetails.d.ts | 2 ++ 4 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/components/MetaPreview/useRating.ts diff --git a/src/components/MetaPreview/MetaPreview.js b/src/components/MetaPreview/MetaPreview.js index c0e9fb165..b1124e9ab 100644 --- a/src/components/MetaPreview/MetaPreview.js +++ b/src/components/MetaPreview/MetaPreview.js @@ -17,6 +17,7 @@ const ActionButton = require('./ActionButton'); const MetaLinks = require('./MetaLinks'); const MetaPreviewPlaceholder = require('./MetaPreviewPlaceholder'); const styles = require('./styles'); +const { default: useRating } = require('./useRating'); const ALLOWED_LINK_REDIRECTS = [ routesRegexp.search.regexp, @@ -24,8 +25,9 @@ const ALLOWED_LINK_REDIRECTS = [ routesRegexp.metadetails.regexp ]; -const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary }, ref) => { +const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary, metaDetails }, ref) => { const { t } = useTranslation(); + const { onLiked, onLoved, like } = useRating(metaDetails); const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false); const linksGroups = React.useMemo(() => { return Array.isArray(links) ? @@ -220,6 +222,30 @@ const MetaPreview = React.forwardRef(({ className, compact, name, logo, backgrou : null } + { + !compact ? + + : + null + } + { + !compact ? + + : + null + } { typeof showHref === 'string' && compact ? { + const { core } = useServices(); + + const like = useMemo(() => { + return metaDetails.like !== null && metaDetails.like.type === 'Ready' ? metaDetails.like.content : null; + }, [metaDetails.like]); + const setRating = useCallback( + (status: string) => { + if (!metaDetails.metaItem || !metaDetails.metaItem.content) { + return; + } + core.transport.dispatch({ + action: 'MetaDetails', + args: { + action: 'Rate', + args: { + id: metaDetails?.metaItem.content.content?.id, + status: status, + }, + }, + }); + }, + [metaDetails], + ); + + const onLiked = () => { + setRating(like === 'liked' ? null : 'liked'); + }; + + const onLoved = () => { + setRating(like === 'loved' ? null : 'loved'); + }; + + return { + onLiked, + onLoved, + like, + }; +}; + +export default useRating; diff --git a/src/routes/MetaDetails/MetaDetails.js b/src/routes/MetaDetails/MetaDetails.js index 8a50b59c1..bb8789be0 100644 --- a/src/routes/MetaDetails/MetaDetails.js +++ b/src/routes/MetaDetails/MetaDetails.js @@ -166,6 +166,7 @@ const MetaDetails = ({ urlParams, queryParams }) => { trailerStreams={metaDetails.metaItem.content.content.trailerStreams} inLibrary={metaDetails.metaItem.content.content.inLibrary} toggleInLibrary={metaDetails.metaItem.content.content.inLibrary ? removeFromLibrary : addToLibrary} + metaDetails={metaDetails} /> } diff --git a/src/types/models/MetaDetails.d.ts b/src/types/models/MetaDetails.d.ts index c7eeafb1b..df615da3e 100644 --- a/src/types/models/MetaDetails.d.ts +++ b/src/types/models/MetaDetails.d.ts @@ -24,4 +24,6 @@ type MetaDetails = { content: Loadable }[], title: string | null, + like: Loadable | null, + sentLike: Loadable | null }; From ad680ca2a57f9cc4c3233ca9f6df7b6695090a51 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Tue, 3 Jun 2025 15:05:43 +0300 Subject: [PATCH 02/29] refactor(useRating): simplify --- src/components/MetaPreview/useRating.ts | 40 ++++++++++++------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/components/MetaPreview/useRating.ts b/src/components/MetaPreview/useRating.ts index d0ae46924..117417815 100644 --- a/src/components/MetaPreview/useRating.ts +++ b/src/components/MetaPreview/useRating.ts @@ -5,34 +5,32 @@ const useRating = (metaDetails: MetaDetails) => { const { core } = useServices(); const like = useMemo(() => { - return metaDetails.like !== null && metaDetails.like.type === 'Ready' ? metaDetails.like.content : null; + return metaDetails.like?.type === 'Ready' ? metaDetails.like.content : null; }, [metaDetails.like]); - const setRating = useCallback( - (status: string) => { - if (!metaDetails.metaItem || !metaDetails.metaItem.content) { - return; - } - core.transport.dispatch({ - action: 'MetaDetails', + + const setRating = useCallback((status: LoadableError | null) => { + const metaId = metaDetails.metaItem?.content?.content?.id; + if (!metaId) return; + + core.transport.dispatch({ + action: 'MetaDetails', + args: { + action: 'Rate', args: { - action: 'Rate', - args: { - id: metaDetails?.metaItem.content.content?.id, - status: status, - }, + id: metaId, + status, }, - }); - }, - [metaDetails], - ); + }, + }); + }, [metaDetails.metaItem?.content?.content?.id]); - const onLiked = () => { + const onLiked = useCallback(() => { setRating(like === 'liked' ? null : 'liked'); - }; + }, [like, setRating]); - const onLoved = () => { + const onLoved = useCallback(() => { setRating(like === 'loved' ? null : 'loved'); - }; + }, [like, setRating]); return { onLiked, From beb873e34ed3fe45fec7d1ce559856b3fb858e55 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Wed, 4 Jun 2025 14:56:11 +0300 Subject: [PATCH 03/29] refactor(MetaPreview): discover fix --- src/components/MetaPreview/MetaPreview.js | 50 +++++++++++------------ src/components/MetaPreview/useRating.ts | 6 +++ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/components/MetaPreview/MetaPreview.js b/src/components/MetaPreview/MetaPreview.js index b1124e9ab..13b922736 100644 --- a/src/components/MetaPreview/MetaPreview.js +++ b/src/components/MetaPreview/MetaPreview.js @@ -27,7 +27,7 @@ const ALLOWED_LINK_REDIRECTS = [ const MetaPreview = React.forwardRef(({ className, compact, name, logo, background, runtime, releaseInfo, released, description, deepLinks, links, trailerStreams, inLibrary, toggleInLibrary, metaDetails }, ref) => { const { t } = useTranslation(); - const { onLiked, onLoved, like } = useRating(metaDetails); + const { onLiked, onLoved } = useRating(metaDetails); const [shareModalOpen, openShareModal, closeShareModal] = useBinaryState(false); const linksGroups = React.useMemo(() => { return Array.isArray(links) ? @@ -222,30 +222,6 @@ const MetaPreview = React.forwardRef(({ className, compact, name, logo, backgrou : null } - { - !compact ? - - : - null - } - { - !compact ? - - : - null - } { typeof showHref === 'string' && compact ? + : + null + } + { + !compact ? + + : + null + } ); diff --git a/src/components/MetaPreview/useRating.ts b/src/components/MetaPreview/useRating.ts index 117417815..b954aabec 100644 --- a/src/components/MetaPreview/useRating.ts +++ b/src/components/MetaPreview/useRating.ts @@ -2,6 +2,12 @@ import { useMemo, useCallback } from 'react'; import { useServices } from 'stremio/services'; const useRating = (metaDetails: MetaDetails) => { + if (!metaDetails) { + return { + onLiked: () => {}, + onLoved: () => {}, + }; + } const { core } = useServices(); const like = useMemo(() => { From 38d5290d91a8547b7a8124e10d20d857ec0ec5e4 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Thu, 5 Jun 2025 16:34:03 +0300 Subject: [PATCH 04/29] refactor(MetaPreview): usage of ratings --- .../MetaPreview/ActionButton/ActionButton.js | 9 +++-- .../MetaPreview/ActionButton/styles.less | 34 ++++++++++++++++ src/components/MetaPreview/MetaPreview.js | 23 +++++++---- src/components/MetaPreview/styles.less | 20 ++++++++++ src/components/MetaPreview/useRating.ts | 39 ++++++++++--------- src/routes/Discover/Discover.js | 2 + src/routes/MetaDetails/MetaDetails.js | 3 +- 7 files changed, 99 insertions(+), 31 deletions(-) diff --git a/src/components/MetaPreview/ActionButton/ActionButton.js b/src/components/MetaPreview/ActionButton/ActionButton.js index 520c0483b..0bda9a7f0 100644 --- a/src/components/MetaPreview/ActionButton/ActionButton.js +++ b/src/components/MetaPreview/ActionButton/ActionButton.js @@ -8,9 +8,9 @@ const { Button } = require('stremio/components'); const styles = require('./styles'); const { Tooltip } = require('stremio/common/Tooltips'); -const ActionButton = ({ className, icon, label, tooltip, ...props }) => { +const ActionButton = ({ className, icon, label, tooltip, showLabel = true, ...props }) => { return ( -