Skip to content

Commit c62097c

Browse files
authored
Make diaplay items to actual hyperlinks (#1408)
* fix: Restore shouldHighlightNameIfInteracted prop in MediaSearchItem component - Reintroduced the `shouldHighlightNameIfInteracted` prop in the `MediaSearchItem` component to ensure proper highlighting behavior when the item is interacted with. - This change enhances the user experience by maintaining visual feedback during interactions. * refactor: Update onImageClickBehavior prop to accept an array for enhanced flexibility - Modified the `onImageClickBehavior` prop in multiple components to accept an array, allowing for a string URL and an optional click handler. - This change improves the handling of image click behaviors, providing more versatility in component interactions. - Updated relevant components including `BaseMediaDisplayItem`, `ExerciseDisplayItem`, `WorkoutDisplayItem`, and others to reflect this new structure. * refactor: Simplify SurroundingElement implementation in BaseMediaDisplayItem - Removed the SurroundingElement component and replaced it with a direct Anchor element in the BaseMediaDisplayItem component. - This change enhances code clarity and reduces unnecessary abstraction, improving maintainability while preserving existing functionality.
1 parent 4fde489 commit c62097c

File tree

4 files changed

+35
-39
lines changed

4 files changed

+35
-39
lines changed

apps/frontend/app/components/common.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ import {
6060
getInitials,
6161
humanizeDuration,
6262
isNumber,
63-
isString,
6463
snakeCase,
6564
} from "@ryot/ts-utils";
6665
import {
@@ -361,7 +360,7 @@ export const BaseMediaDisplayItem = (props: {
361360
highlightImage?: boolean;
362361
innerRef?: Ref<HTMLDivElement>;
363362
labels?: { right?: ReactNode; left?: ReactNode };
364-
onImageClickBehavior: string | (() => Promise<void>);
363+
onImageClickBehavior: [string, (() => Promise<void>)?];
365364
imageOverlay?: {
366365
topRight?: ReactNode;
367366
topLeft?: ReactNode;
@@ -372,14 +371,6 @@ export const BaseMediaDisplayItem = (props: {
372371
const coreDetails = useCoreDetails();
373372
const userPreferences = useUserPreferences();
374373
const gridPacking = userPreferences.general.gridPacking;
375-
const SurroundingElement = (iProps: { children: ReactNode }) =>
376-
isString(props.onImageClickBehavior) ? (
377-
<Anchor component={Link} to={props.onImageClickBehavior}>
378-
{iProps.children}
379-
</Anchor>
380-
) : (
381-
<Box onClick={props.onImageClickBehavior}>{iProps.children}</Box>
382-
);
383374
const defaultOverlayProps = {
384375
pos: "absolute",
385376
style: { zIndex: 10, ...blackBgStyles },
@@ -388,7 +379,11 @@ export const BaseMediaDisplayItem = (props: {
388379
return (
389380
<Flex direction="column" ref={props.innerRef} justify="space-between">
390381
<Box pos="relative" w="100%">
391-
<SurroundingElement>
382+
<Anchor
383+
component={Link}
384+
to={props.onImageClickBehavior[0]}
385+
onClick={props.onImageClickBehavior[1]}
386+
>
392387
<Tooltip
393388
position="top"
394389
label={props.name}
@@ -440,7 +435,7 @@ export const BaseMediaDisplayItem = (props: {
440435
) : null}
441436
</Paper>
442437
</Tooltip>
443-
</SurroundingElement>
438+
</Anchor>
444439
{props.imageOverlay?.topLeft ? (
445440
<Center top={5} left={5} {...defaultOverlayProps}>
446441
{props.imageOverlay.topLeft}

apps/frontend/app/components/fitness.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ export const ExerciseDisplayItem = (props: {
447447
imageUrl={images.at(0)}
448448
name={exerciseDetails?.name}
449449
isLoading={isExerciseDetailsLoading}
450-
onImageClickBehavior={getExerciseDetailsPath(props.exerciseId)}
450+
onImageClickBehavior={[getExerciseDetailsPath(props.exerciseId)]}
451451
labels={{
452452
left: isNumber(times)
453453
? `${times} time${times > 1 ? "s" : ""}`
@@ -475,10 +475,12 @@ export const WorkoutDisplayItem = (props: {
475475
name={workoutDetails?.details.name}
476476
isLoading={isWorkoutDetailsLoading}
477477
imageOverlay={{ topRight: props.topRight }}
478-
onImageClickBehavior={$path("/fitness/:entity/:id", {
479-
id: props.workoutId,
480-
entity: "workouts",
481-
})}
478+
onImageClickBehavior={[
479+
$path("/fitness/:entity/:id", {
480+
entity: "workouts",
481+
id: props.workoutId,
482+
}),
483+
]}
482484
labels={{
483485
left: dayjsLib(workoutDetails?.details.startTime).format("l"),
484486
right: props.rightLabel,
@@ -501,10 +503,12 @@ export const WorkoutTemplateDisplayItem = (props: {
501503
name={workoutTemplateDetails?.details.name}
502504
isLoading={isWorkoutTemplateDetailsLoading}
503505
imageOverlay={{ topRight: props.topRight }}
504-
onImageClickBehavior={$path("/fitness/:entity/:id", {
505-
id: props.workoutTemplateId,
506-
entity: FitnessEntity.Templates,
507-
})}
506+
onImageClickBehavior={[
507+
$path("/fitness/:entity/:id", {
508+
id: props.workoutTemplateId,
509+
entity: FitnessEntity.Templates,
510+
}),
511+
]}
508512
labels={{
509513
left: dayjsLib(workoutTemplateDetails?.details.createdOn).format("l"),
510514
right: "Template",

apps/frontend/app/components/media.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
IconStarFilled,
2929
} from "@tabler/icons-react";
3030
import { type ReactNode, useMemo } from "react";
31-
import { Form, Link, useNavigate } from "react-router";
31+
import { Form, Link } from "react-router";
3232
import { $path } from "safe-routes";
3333
import { match } from "ts-pattern";
3434
import { withQuery } from "ufo";
@@ -186,13 +186,12 @@ export const MetadataDisplayItem = (props: {
186186
rightLabelLot?: boolean;
187187
imageClassName?: string;
188188
rightLabelHistory?: boolean;
189-
onImageClickBehavior?: () => void;
190189
shouldHighlightNameIfInteracted?: boolean;
190+
onImageClickBehavior?: () => Promise<void>;
191191
}) => {
192192
const [_m, setMetadataToUpdate, isMetadataToUpdateLoading] =
193193
useMetadataProgressUpdate();
194194
const { ref, inViewport } = useInViewport();
195-
const navigate = useNavigate();
196195

197196
const { data: metadataDetails, isLoading: isMetadataDetailsLoading } =
198197
useMetadataDetails(props.metadataId, inViewport);
@@ -265,10 +264,10 @@ export const MetadataDisplayItem = (props: {
265264
props.shouldHighlightNameIfInteracted &&
266265
userMetadataDetails?.hasInteracted
267266
}
268-
onImageClickBehavior={async () => {
269-
props.onImageClickBehavior?.();
270-
navigate($path("/media/item/:id", { id: props.metadataId }));
271-
}}
267+
onImageClickBehavior={[
268+
$path("/media/item/:id", { id: props.metadataId }),
269+
props.onImageClickBehavior,
270+
]}
272271
labels={
273272
metadataDetails
274273
? {
@@ -362,9 +361,9 @@ export const MetadataGroupDisplayItem = (props: {
362361
name={metadataDetails?.details.title}
363362
imageUrl={metadataDetails?.details.assets.remoteImages.at(0)}
364363
highlightImage={userMetadataGroupDetails?.isRecentlyConsumed}
365-
onImageClickBehavior={$path("/media/groups/item/:id", {
366-
id: props.metadataGroupId,
367-
})}
364+
onImageClickBehavior={[
365+
$path("/media/groups/item/:id", { id: props.metadataGroupId }),
366+
]}
368367
highlightName={
369368
props.shouldHighlightNameIfInteracted &&
370369
userMetadataGroupDetails?.hasInteracted
@@ -419,9 +418,9 @@ export const PersonDisplayItem = (props: {
419418
isLoading={isPersonDetailsLoading}
420419
highlightImage={userPersonDetails?.isRecentlyConsumed}
421420
imageUrl={personDetails?.details.assets.remoteImages.at(0)}
422-
onImageClickBehavior={$path("/media/people/item/:id", {
423-
id: props.personId,
424-
})}
421+
onImageClickBehavior={[
422+
$path("/media/people/item/:id", { id: props.personId }),
423+
]}
425424
highlightName={
426425
props.shouldHighlightNameIfInteracted &&
427426
userPersonDetails?.hasInteracted

apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -549,13 +549,11 @@ const MediaSearchItem = (props: {
549549
return (
550550
<Box>
551551
<MetadataDisplayItem
552-
shouldHighlightNameIfInteracted
553552
metadataId={props.item}
553+
shouldHighlightNameIfInteracted
554554
imageClassName={OnboardingTourStepTargets.GoToMoviesSectionAgain}
555-
onImageClickBehavior={() => {
556-
if (tourControlThree) {
557-
advanceOnboardingTourStep();
558-
}
555+
onImageClickBehavior={async () => {
556+
if (tourControlThree) advanceOnboardingTourStep();
559557
}}
560558
nameRight={
561559
<Menu shadow="md">

0 commit comments

Comments
 (0)