Skip to content
Open
1 change: 1 addition & 0 deletions server/interfaces/api/settingsInterfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export interface PublicSettingsResponse {
applicationUrl: string;
hideAvailable: boolean;
hideBlocklisted: boolean;
skipBlocklistModal: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
movie4kEnabled: boolean;
Expand Down
4 changes: 4 additions & 0 deletions server/lib/settings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ export interface MainSettings {
};
hideAvailable: boolean;
hideBlocklisted: boolean;
skipBlocklistModal: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
newPlexLogin: boolean;
Expand Down Expand Up @@ -193,6 +194,7 @@ interface FullPublicSettings extends PublicSettings {
applicationUrl: string;
hideAvailable: boolean;
hideBlocklisted: boolean;
skipBlocklistModal: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
movie4kEnabled: boolean;
Expand Down Expand Up @@ -414,6 +416,7 @@ class Settings {
},
hideAvailable: false,
hideBlocklisted: false,
skipBlocklistModal: false,
localLogin: true,
mediaServerLogin: true,
newPlexLogin: true,
Expand Down Expand Up @@ -709,6 +712,7 @@ class Settings {
applicationUrl: this.data.main.applicationUrl,
hideAvailable: this.data.main.hideAvailable,
hideBlocklisted: this.data.main.hideBlocklisted,
skipBlocklistModal: this.data.main.skipBlocklistModal,
localLogin: this.data.main.localLogin,
mediaServerLogin: this.data.main.mediaServerLogin,
jellyfinExternalHost: this.data.jellyfin.externalHostname,
Expand Down
6 changes: 5 additions & 1 deletion src/components/CollectionDetails/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,11 @@ const CollectionDetails = ({ collection }: CollectionDetailsProps) => {
buttonType="ghost"
className="z-40 mr-2"
buttonSize="md"
onClick={() => setShowBlocklistModal(true)}
onClick={() =>
settings.currentSettings.skipBlocklistModal
? onClickHideItemBtn()
: setShowBlocklistModal(true)
}
disabled={isBlocklistUpdating}
>
<EyeSlashIcon />
Expand Down
6 changes: 5 additions & 1 deletion src/components/MovieDetails/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,11 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
buttonType={'ghost'}
className="z-40 mr-2"
buttonSize={'md'}
onClick={() => setShowBlocklistModal(true)}
onClick={() =>
settings.currentSettings.skipBlocklistModal
? onClickHideItemBtn()
: setShowBlocklistModal(true)
}
>
<EyeSlashIcon />
</Button>
Expand Down
31 changes: 31 additions & 0 deletions src/components/Settings/SettingsMain/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ const messages = defineMessages('components.Settings.SettingsMain', {
hideBlocklisted: 'Hide Blocklisted Items',
hideBlocklistedTip:
'Hide blocklisted items from discover pages for all users with the "Manage Blocklist" permission',
skipBlocklistModal: 'Skip Blocklist Confirmation',
skipBlocklistModalTip:
'Blocklist content immediately without showing the confirmation modal',
toastApiKeySuccess: 'New API key generated successfully!',
toastApiKeyFailure: 'Something went wrong while generating a new API key.',
toastSettingsSuccess: 'Settings saved successfully!',
Expand Down Expand Up @@ -171,6 +174,7 @@ const SettingsMain = () => {
applicationUrl: data?.applicationUrl,
hideAvailable: data?.hideAvailable,
hideBlocklisted: data?.hideBlocklisted,
skipBlocklistModal: data?.skipBlocklistModal,
locale: data?.locale ?? 'en',
discoverRegion: data?.discoverRegion,
originalLanguage: data?.originalLanguage,
Expand All @@ -193,6 +197,7 @@ const SettingsMain = () => {
applicationUrl: values.applicationUrl,
hideAvailable: values.hideAvailable,
hideBlocklisted: values.hideBlocklisted,
skipBlocklistModal: values.skipBlocklistModal,
locale: values.locale,
discoverRegion: values.discoverRegion,
streamingRegion: values.streamingRegion,
Expand Down Expand Up @@ -538,6 +543,32 @@ const SettingsMain = () => {
/>
</div>
</div>
<div className="form-row">
<label
htmlFor="skipBlocklistModal"
className="checkbox-label"
>
<span className="mr-2">
{intl.formatMessage(messages.skipBlocklistModal)}
</span>
<span className="label-tip">
{intl.formatMessage(messages.skipBlocklistModalTip)}
</span>
</label>
<div className="form-input-area">
<Field
type="checkbox"
id="skipBlocklistModal"
name="skipBlocklistModal"
onChange={() => {
setFieldValue(
'skipBlocklistModal',
!values.skipBlocklistModal
);
}}
/>
</div>
</div>
<div className="form-row">
<label
htmlFor="partialRequestsEnabled"
Expand Down
8 changes: 7 additions & 1 deletion src/components/TitleCard/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import RequestModal from '@app/components/RequestModal';
import ErrorCard from '@app/components/TitleCard/ErrorCard';
import Placeholder from '@app/components/TitleCard/Placeholder';
import { useIsTouch } from '@app/hooks/useIsTouch';
import useSettings from '@app/hooks/useSettings';
import useToasts from '@app/hooks/useToasts';
import { Permission, UserType, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages';
Expand Down Expand Up @@ -76,6 +77,7 @@ const TitleCard = ({
const [showDetail, setShowDetail] = useState(false);
const [showRequestModal, setShowRequestModal] = useState(false);
const { addToast } = useToasts();
const settings = useSettings();
const [toggleWatchlist, setToggleWatchlist] =
useState<boolean>(!isAddedToWatchlist);
const [showBlocklistModal, setShowBlocklistModal] = useState(false);
Expand Down Expand Up @@ -431,7 +433,11 @@ const TitleCard = ({
buttonType={'ghost'}
className="z-40"
buttonSize={'sm'}
onClick={() => setShowBlocklistModal(true)}
onClick={() =>
settings.currentSettings.skipBlocklistModal
? onClickHideItemBtn()
: setShowBlocklistModal(true)
}
>
<EyeSlashIcon className={'h-3'} />
</Button>
Expand Down
6 changes: 5 additions & 1 deletion src/components/TvDetails/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,11 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
buttonType={'ghost'}
className="z-40 mr-2"
buttonSize={'md'}
onClick={() => setShowBlocklistModal(true)}
onClick={() =>
settings.currentSettings.skipBlocklistModal
? onClickHideItemBtn()
: setShowBlocklistModal(true)
}
>
<EyeSlashIcon />
</Button>
Expand Down
1 change: 1 addition & 0 deletions src/context/SettingsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const defaultSettings = {
applicationUrl: '',
hideAvailable: false,
hideBlocklisted: false,
skipBlocklistModal: false,
localLogin: true,
mediaServerLogin: true,
movie4kEnabled: false,
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1034,6 +1034,8 @@
"components.Settings.SettingsMain.originallanguage": "Discover Language",
"components.Settings.SettingsMain.originallanguageTip": "Filter content by original language",
"components.Settings.SettingsMain.partialRequestsEnabled": "Allow Partial Series Requests",
"components.Settings.SettingsMain.skipBlocklistModal": "Skip Blocklist Confirmation",
"components.Settings.SettingsMain.skipBlocklistModalTip": "Blocklist content immediately without showing the confirmation modal",
"components.Settings.SettingsMain.streamingRegion": "Streaming Region",
"components.Settings.SettingsMain.streamingRegionTip": "Show streaming sites by regional availability",
"components.Settings.SettingsMain.toastApiKeyFailure": "Something went wrong while generating a new API key.",
Expand Down
1 change: 1 addition & 0 deletions src/pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ CoreApp.getInitialProps = async (initialProps) => {
applicationUrl: '',
hideAvailable: false,
hideBlocklisted: false,
skipBlocklistModal: false,
movie4kEnabled: false,
series4kEnabled: false,
localLogin: true,
Expand Down