From 4e93bb96142e2dfbea882cf472ef6fdfd59351db Mon Sep 17 00:00:00 2001 From: Ayush Gade Date: Tue, 14 Oct 2025 10:57:39 +0530 Subject: [PATCH] feat: add Mark as Watched/Unwatched button in addon details modal --- src/common/watchedOverrides.js | 27 +++ .../MetaPreview/ActionButton/ActionButton.js | 11 +- .../MetaPreview/ActionButton/styles.less | 5 + src/components/MetaPreview/MetaPreview.js | 28 ++- .../MetaPreview/Ratings/useRating.ts | 29 ++- src/components/MetaPreview/styles.less | 12 + src/components/MetaRow/MetaRow.js | 12 +- src/routes/MetaDetails/MetaDetails.js | 222 ++++++++++++++++++ 8 files changed, 333 insertions(+), 13 deletions(-) create mode 100644 src/common/watchedOverrides.js diff --git a/src/common/watchedOverrides.js b/src/common/watchedOverrides.js new file mode 100644 index 000000000..c6b10b4a1 --- /dev/null +++ b/src/common/watchedOverrides.js @@ -0,0 +1,27 @@ +const EventEmitter = require('eventemitter3'); + +const events = new EventEmitter(); +const overrides = new Map(); + +module.exports = { + set: (metaId, watched) => { + if (typeof metaId !== 'string') return; + if (watched === null || typeof watched === 'undefined') { + overrides.delete(metaId); + } else { + overrides.set(metaId, !!watched); + } + events.emit('change', metaId, watched); + }, + get: (metaId) => { + return overrides.has(metaId) ? overrides.get(metaId) : null; + }, + clear: (metaId) => { + overrides.delete(metaId); + events.emit('change', metaId, null); + }, + onChange: (cb) => { + events.on('change', cb); + return () => events.off('change', cb); + } +}; diff --git a/src/components/MetaPreview/ActionButton/ActionButton.js b/src/components/MetaPreview/ActionButton/ActionButton.js index 520c0483b..48fd55ff6 100644 --- a/src/components/MetaPreview/ActionButton/ActionButton.js +++ b/src/components/MetaPreview/ActionButton/ActionButton.js @@ -9,8 +9,12 @@ const styles = require('./styles'); const { Tooltip } = require('stremio/common/Tooltips'); const ActionButton = ({ className, icon, label, tooltip, ...props }) => { + const labelText = typeof label === 'string' ? label : ''; + const hasLabel = !tooltip && label != null; + const wide = !tooltip && (typeof label === 'string' || React.isValidElement(label)); + return ( -