mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix(frontend): various fixes (#2524)
* fix(frontend): various fixes * fix: service URL does not require media type
This commit is contained in:
@@ -16,7 +16,7 @@ import 'country-flag-icons/3x2/flags.css';
|
|||||||
import { uniqBy } from 'lodash';
|
import { uniqBy } from 'lodash';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import React, { useMemo, useState } from 'react';
|
import React, { useEffect, useMemo, useState } from 'react';
|
||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
import type { RTRating } from '../../../server/api/rottentomatoes';
|
import type { RTRating } from '../../../server/api/rottentomatoes';
|
||||||
@@ -109,6 +109,10 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
[data]
|
[data]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setShowManager(router.query.manage == '1' ? true : false);
|
||||||
|
}, [router.query.manage]);
|
||||||
|
|
||||||
if (!data && !error) {
|
if (!data && !error) {
|
||||||
return <LoadingSpinner />;
|
return <LoadingSpinner />;
|
||||||
}
|
}
|
||||||
@@ -134,6 +138,7 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
settings.currentSettings.movie4kEnabled &&
|
||||||
data.mediaInfo?.plexUrl4k &&
|
data.mediaInfo?.plexUrl4k &&
|
||||||
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_MOVIE], {
|
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_MOVIE], {
|
||||||
type: 'or',
|
type: 'or',
|
||||||
@@ -254,7 +259,13 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
<ManageSlideOver
|
<ManageSlideOver
|
||||||
data={data}
|
data={data}
|
||||||
mediaType="movie"
|
mediaType="movie"
|
||||||
onClose={() => setShowManager(false)}
|
onClose={() => {
|
||||||
|
setShowManager(false);
|
||||||
|
router.push({
|
||||||
|
pathname: router.pathname,
|
||||||
|
query: { movieId: router.query.movieId },
|
||||||
|
});
|
||||||
|
}}
|
||||||
revalidate={() => revalidate()}
|
revalidate={() => revalidate()}
|
||||||
show={showManager}
|
show={showManager}
|
||||||
/>
|
/>
|
||||||
@@ -284,7 +295,11 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
/>
|
/>
|
||||||
{settings.currentSettings.movie4kEnabled &&
|
{settings.currentSettings.movie4kEnabled &&
|
||||||
hasPermission(
|
hasPermission(
|
||||||
[Permission.REQUEST_4K, Permission.REQUEST_4K_MOVIE],
|
[
|
||||||
|
Permission.MANAGE_REQUESTS,
|
||||||
|
Permission.REQUEST_4K,
|
||||||
|
Permission.REQUEST_4K_MOVIE,
|
||||||
|
],
|
||||||
{
|
{
|
||||||
type: 'or',
|
type: 'or',
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
import { MediaStatus } from '../../../server/constants/media';
|
import { MediaStatus } from '../../../server/constants/media';
|
||||||
import Spinner from '../../assets/spinner.svg';
|
import Spinner from '../../assets/spinner.svg';
|
||||||
|
import useSettings from '../../hooks/useSettings';
|
||||||
import { Permission, useUser } from '../../hooks/useUser';
|
import { Permission, useUser } from '../../hooks/useUser';
|
||||||
import globalMessages from '../../i18n/globalMessages';
|
import globalMessages from '../../i18n/globalMessages';
|
||||||
import Badge from '../Common/Badge';
|
import Badge from '../Common/Badge';
|
||||||
@@ -32,16 +33,46 @@ const StatusBadge: React.FC<StatusBadgeProps> = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { hasPermission } = useUser();
|
const { hasPermission } = useUser();
|
||||||
|
const settings = useSettings();
|
||||||
|
|
||||||
const manageLink =
|
let mediaLink: string | undefined;
|
||||||
tmdbId && mediaType && hasPermission(Permission.MANAGE_REQUESTS)
|
|
||||||
? `/${mediaType}/${tmdbId}?manage=1`
|
if (
|
||||||
: undefined;
|
mediaType &&
|
||||||
|
plexUrl &&
|
||||||
|
hasPermission(
|
||||||
|
is4k
|
||||||
|
? [
|
||||||
|
Permission.REQUEST_4K,
|
||||||
|
mediaType === 'movie'
|
||||||
|
? Permission.REQUEST_4K_MOVIE
|
||||||
|
: Permission.REQUEST_4K_TV,
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
Permission.REQUEST,
|
||||||
|
mediaType === 'movie'
|
||||||
|
? Permission.REQUEST_MOVIE
|
||||||
|
: Permission.REQUEST_TV,
|
||||||
|
],
|
||||||
|
{
|
||||||
|
type: 'or',
|
||||||
|
}
|
||||||
|
) &&
|
||||||
|
(!is4k ||
|
||||||
|
(mediaType === 'movie'
|
||||||
|
? settings.currentSettings.movie4kEnabled
|
||||||
|
: settings.currentSettings.series4kEnabled))
|
||||||
|
) {
|
||||||
|
mediaLink = plexUrl;
|
||||||
|
} else if (hasPermission(Permission.MANAGE_REQUESTS)) {
|
||||||
|
mediaLink =
|
||||||
|
mediaType && tmdbId ? `/${mediaType}/${tmdbId}?manage=1` : serviceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case MediaStatus.AVAILABLE:
|
case MediaStatus.AVAILABLE:
|
||||||
return (
|
return (
|
||||||
<Badge badgeType="success" href={plexUrl}>
|
<Badge badgeType="success" href={mediaLink}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<span>
|
<span>
|
||||||
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
||||||
@@ -55,7 +86,7 @@ const StatusBadge: React.FC<StatusBadgeProps> = ({
|
|||||||
|
|
||||||
case MediaStatus.PARTIALLY_AVAILABLE:
|
case MediaStatus.PARTIALLY_AVAILABLE:
|
||||||
return (
|
return (
|
||||||
<Badge badgeType="success" href={plexUrl}>
|
<Badge badgeType="success" href={mediaLink}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<span>
|
<span>
|
||||||
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
||||||
@@ -69,7 +100,7 @@ const StatusBadge: React.FC<StatusBadgeProps> = ({
|
|||||||
|
|
||||||
case MediaStatus.PROCESSING:
|
case MediaStatus.PROCESSING:
|
||||||
return (
|
return (
|
||||||
<Badge badgeType="primary" href={manageLink ?? serviceUrl}>
|
<Badge badgeType="primary" href={mediaLink}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<span>
|
<span>
|
||||||
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
||||||
@@ -85,7 +116,7 @@ const StatusBadge: React.FC<StatusBadgeProps> = ({
|
|||||||
|
|
||||||
case MediaStatus.PENDING:
|
case MediaStatus.PENDING:
|
||||||
return (
|
return (
|
||||||
<Badge badgeType="warning" href={manageLink}>
|
<Badge badgeType="warning" href={mediaLink}>
|
||||||
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
|
||||||
status: intl.formatMessage(globalMessages.pending),
|
status: intl.formatMessage(globalMessages.pending),
|
||||||
})}
|
})}
|
||||||
|
@@ -9,7 +9,7 @@ import { hasFlag } from 'country-flag-icons';
|
|||||||
import 'country-flag-icons/3x2/flags.css';
|
import 'country-flag-icons/3x2/flags.css';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import React, { useMemo, useState } from 'react';
|
import React, { useEffect, useMemo, useState } from 'react';
|
||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
import type { RTRating } from '../../../server/api/rottentomatoes';
|
import type { RTRating } from '../../../server/api/rottentomatoes';
|
||||||
@@ -102,6 +102,10 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
[data]
|
[data]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setShowManager(router.query.manage == '1' ? true : false);
|
||||||
|
}, [router.query.manage]);
|
||||||
|
|
||||||
if (!data && !error) {
|
if (!data && !error) {
|
||||||
return <LoadingSpinner />;
|
return <LoadingSpinner />;
|
||||||
}
|
}
|
||||||
@@ -112,7 +116,12 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
|
|
||||||
const mediaLinks: PlayButtonLink[] = [];
|
const mediaLinks: PlayButtonLink[] = [];
|
||||||
|
|
||||||
if (data.mediaInfo?.plexUrl) {
|
if (
|
||||||
|
data.mediaInfo?.plexUrl &&
|
||||||
|
hasPermission([Permission.REQUEST, Permission.REQUEST_TV], {
|
||||||
|
type: 'or',
|
||||||
|
})
|
||||||
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: intl.formatMessage(messages.playonplex),
|
text: intl.formatMessage(messages.playonplex),
|
||||||
url: data.mediaInfo?.plexUrl,
|
url: data.mediaInfo?.plexUrl,
|
||||||
@@ -121,6 +130,7 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
settings.currentSettings.series4kEnabled &&
|
||||||
data.mediaInfo?.plexUrl4k &&
|
data.mediaInfo?.plexUrl4k &&
|
||||||
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_TV], {
|
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_TV], {
|
||||||
type: 'or',
|
type: 'or',
|
||||||
@@ -256,7 +266,13 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
<ManageSlideOver
|
<ManageSlideOver
|
||||||
data={data}
|
data={data}
|
||||||
mediaType="tv"
|
mediaType="tv"
|
||||||
onClose={() => setShowManager(false)}
|
onClose={() => {
|
||||||
|
setShowManager(false);
|
||||||
|
router.push({
|
||||||
|
pathname: router.pathname,
|
||||||
|
query: { tvId: router.query.tvId },
|
||||||
|
});
|
||||||
|
}}
|
||||||
revalidate={() => revalidate()}
|
revalidate={() => revalidate()}
|
||||||
show={showManager}
|
show={showManager}
|
||||||
/>
|
/>
|
||||||
@@ -285,9 +301,16 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
plexUrl={data.mediaInfo?.plexUrl}
|
plexUrl={data.mediaInfo?.plexUrl}
|
||||||
/>
|
/>
|
||||||
{settings.currentSettings.series4kEnabled &&
|
{settings.currentSettings.series4kEnabled &&
|
||||||
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_TV], {
|
hasPermission(
|
||||||
type: 'or',
|
[
|
||||||
}) && (
|
Permission.MANAGE_REQUESTS,
|
||||||
|
Permission.REQUEST_4K,
|
||||||
|
Permission.REQUEST_4K_TV,
|
||||||
|
],
|
||||||
|
{
|
||||||
|
type: 'or',
|
||||||
|
}
|
||||||
|
) && (
|
||||||
<StatusBadge
|
<StatusBadge
|
||||||
status={data.mediaInfo?.status4k}
|
status={data.mediaInfo?.status4k}
|
||||||
is4k
|
is4k
|
||||||
|
Reference in New Issue
Block a user