Skip to content

Commit b0dfb9f

Browse files
John Fletchergauthier-th
authored andcommitted
fix: replace manage pushes; close sidebar without back reopening bug
Fix media manage sidebar history handling so closing it does not create extra browser history entries that reopen the panel on Back. Use router.replace when dismissing the movie/TV manage slide-over, add replace support to shared badge links, and have status-badge manage links use replace only when already on the same media details page. Add a Cypress regression test that verifies opening ?manage=1, closing the panel, and pressing Back keeps the panel closed instead of reopening it.
1 parent 4fa2c71 commit b0dfb9f

5 files changed

Lines changed: 42 additions & 5 deletions

File tree

cypress/e2e/movie-details.cy.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,20 @@ describe('Movie Details', () => {
99
'Minions: The Rise of Gru (2022)'
1010
);
1111
});
12+
13+
it('does not reopen the manager panel after closing and going back', () => {
14+
cy.loginAsAdmin();
15+
16+
cy.visit('/movie/438148');
17+
cy.visit('/movie/438148?manage=1');
18+
19+
cy.get('button[aria-label="Close panel"]').should('be.visible').click();
20+
cy.location('search').should('eq', '');
21+
cy.get('button[aria-label="Close panel"]').should('not.exist');
22+
23+
cy.go('back');
24+
25+
cy.location('search').should('eq', '');
26+
cy.get('button[aria-label="Close panel"]').should('not.exist');
27+
});
1228
});

src/components/Common/Badge/index.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ interface BadgeProps {
1212
| 'light';
1313
className?: string;
1414
href?: string;
15+
replace?: boolean;
1516
children: React.ReactNode;
1617
}
1718

1819
const Badge = (
19-
{ badgeType = 'default', className, href, children }: BadgeProps,
20+
{
21+
badgeType = 'default',
22+
className,
23+
href,
24+
replace = false,
25+
children,
26+
}: BadgeProps,
2027
ref?: React.Ref<HTMLElement>
2128
) => {
2229
const badgeStyle = [
@@ -93,6 +100,7 @@ const Badge = (
93100
return (
94101
<Link
95102
href={href}
103+
replace={replace}
96104
className={badgeStyle.join(' ')}
97105
ref={ref as React.Ref<HTMLAnchorElement>}
98106
>

src/components/MovieDetails/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
469469
mediaType="movie"
470470
onClose={() => {
471471
setShowManager(false);
472-
router.push({
472+
router.replace({
473473
pathname: router.pathname,
474474
query: { movieId: router.query.movieId },
475475
});

src/components/StatusBadge/index.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import defineMessages from '@app/utils/defineMessages';
99
import { MediaStatus } from '@server/constants/media';
1010
import { MediaServerType } from '@server/constants/server';
1111
import type { DownloadingItem } from '@server/lib/downloadtracker';
12+
import { useRouter } from 'next/router';
1213
import { useIntl } from 'react-intl';
1314

1415
const messages = defineMessages('components.StatusBadge', {
@@ -47,11 +48,13 @@ const StatusBadge = ({
4748
statusLabelOverride,
4849
}: StatusBadgeProps) => {
4950
const intl = useIntl();
51+
const router = useRouter();
5052
const { hasPermission } = useUser();
5153
const settings = useSettings();
5254

5355
let mediaLink: string | undefined;
5456
let mediaLinkDescription: string | undefined;
57+
let mediaLinkReplace = false;
5558

5659
const calculateDownloadProgress = (media: DownloadingItem) => {
5760
return Math.round(((media?.size - media?.sizeLeft) / media?.size) * 100);
@@ -95,6 +98,8 @@ const StatusBadge = ({
9598
} else if (hasPermission(Permission.MANAGE_REQUESTS)) {
9699
if (mediaType && tmdbId) {
97100
mediaLink = `/${mediaType}/${tmdbId}?manage=1`;
101+
mediaLinkReplace =
102+
router.asPath.split('?')[0] === `/${mediaType}/${tmdbId}`;
98103
mediaLinkDescription = intl.formatMessage(messages.managemedia, {
99104
mediaType: intl.formatMessage(
100105
mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow
@@ -169,6 +174,7 @@ const StatusBadge = ({
169174
<Badge
170175
badgeType="success"
171176
href={mediaLink}
177+
replace={mediaLinkReplace}
172178
className={`${
173179
inProgress && 'relative !bg-gray-700/80 !px-0 hover:!bg-gray-700'
174180
} overflow-hidden`}
@@ -234,6 +240,7 @@ const StatusBadge = ({
234240
<Badge
235241
badgeType="success"
236242
href={mediaLink}
243+
replace={mediaLinkReplace}
237244
className={`${
238245
inProgress && 'relative !bg-gray-700/80 !px-0 hover:!bg-gray-700'
239246
} overflow-hidden`}
@@ -299,6 +306,7 @@ const StatusBadge = ({
299306
<Badge
300307
badgeType="primary"
301308
href={mediaLink}
309+
replace={mediaLinkReplace}
302310
className={`${
303311
inProgress && 'relative !bg-gray-700/80 !px-0 hover:!bg-gray-700'
304312
} overflow-hidden`}
@@ -353,7 +361,11 @@ const StatusBadge = ({
353361
case MediaStatus.PENDING:
354362
return (
355363
<Tooltip content={mediaLinkDescription}>
356-
<Badge badgeType="warning" href={mediaLink}>
364+
<Badge
365+
badgeType="warning"
366+
href={mediaLink}
367+
replace={mediaLinkReplace}
368+
>
357369
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
358370
status: intl.formatMessage(globalMessages.pending),
359371
})}
@@ -364,7 +376,7 @@ const StatusBadge = ({
364376
case MediaStatus.BLOCKLISTED:
365377
return (
366378
<Tooltip content={mediaLinkDescription}>
367-
<Badge badgeType="danger" href={mediaLink}>
379+
<Badge badgeType="danger" href={mediaLink} replace={mediaLinkReplace}>
368380
{intl.formatMessage(is4k ? messages.status4k : messages.status, {
369381
status:
370382
statusLabelOverride ??
@@ -388,6 +400,7 @@ const StatusBadge = ({
388400
<Badge
389401
badgeType="danger"
390402
href={mediaLink}
403+
replace={mediaLinkReplace}
391404
className={`${
392405
inProgress && 'relative !bg-gray-700/80 !px-0 hover:!bg-gray-700'
393406
} overflow-hidden`}

src/components/TvDetails/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
519519
mediaType="tv"
520520
onClose={() => {
521521
setShowManager(false);
522-
router.push({
522+
router.replace({
523523
pathname: router.pathname,
524524
query: { tvId: router.query.tvId },
525525
});

0 commit comments

Comments
 (0)