Skip to content

Commit 5756037

Browse files
committed
feat(frontend): add tooltip to metadata reason
1 parent 49c7435 commit 5756037

File tree

4 files changed

+64
-55
lines changed

4 files changed

+64
-55
lines changed

apps/frontend/app/components/media.tsx

+23-11
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ import { confirmWrapper } from "~/components/confirmation";
6969
import {
7070
clientGqlService,
7171
dayjsLib,
72+
getPartialMetadataDetailsQuery,
7273
queryFactory,
7374
redirectToQueryParam,
7475
} from "~/lib/generals";
7576
import {
76-
getPartialMetadataDetailsQuery,
7777
useConfirmSubmit,
7878
useFallbackImageUrl,
7979
useGetMantineColor,
@@ -559,10 +559,15 @@ export const MetadataDisplayItem = (props: {
559559
);
560560
const averageRating = userMetadataDetails?.averageRating;
561561
const history = userMetadataDetails?.history || [];
562-
const themeIconSurround = (idx: number, icon?: ReactNode) => (
563-
<ThemeIcon variant="transparent" size="sm" color="cyan" key={idx}>
564-
{icon}
565-
</ThemeIcon>
562+
const surroundReason = (
563+
idx: number,
564+
data: readonly [UserToMediaReason, ReactNode],
565+
) => (
566+
<Tooltip label={changeCase(data[0])}>
567+
<ThemeIcon variant="transparent" size="sm" color="cyan" key={idx}>
568+
{data[1]}
569+
</ThemeIcon>
570+
</Tooltip>
566571
);
567572
const reasons = userMetadataDetails?.mediaReason?.filter((r) =>
568573
[
@@ -642,14 +647,21 @@ export const MetadataDisplayItem = (props: {
642647
{reasons
643648
.map((r) =>
644649
match(r)
645-
.with(UserToMediaReason.Finished, () => (
646-
<IconRosetteDiscountCheck />
647-
))
648-
.with(UserToMediaReason.Watchlist, () => <IconBookmarks />)
649-
.with(UserToMediaReason.Owned, () => <IconBackpack />)
650+
.with(
651+
UserToMediaReason.Finished,
652+
() => [r, <IconRosetteDiscountCheck key={r} />] as const,
653+
)
654+
.with(
655+
UserToMediaReason.Watchlist,
656+
() => [r, <IconBookmarks key={r} />] as const,
657+
)
658+
.with(
659+
UserToMediaReason.Owned,
660+
() => [r, <IconBackpack key={r} />] as const,
661+
)
650662
.run(),
651663
)
652-
.map((icon, idx) => themeIconSurround(idx, icon))}
664+
.map((data, idx) => surroundReason(idx, data))}
653665
</Group>
654666
) : null,
655667
bottomRight: isMetadataToUpdateLoading ? (

apps/frontend/app/lib/generals.ts

+36-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import {
66
EntityLot,
77
MediaLot,
88
MediaSource,
9+
MetadataDetailsDocument,
10+
MetadataPartialDetailsDocument,
911
SetLot,
12+
UserMetadataDetailsDocument,
1013
} from "@ryot/generated/graphql/backend/graphql";
1114
import {
1215
IconBook,
@@ -19,7 +22,7 @@ import {
1922
IconHeadphones,
2023
IconMicrophone,
2124
} from "@tabler/icons-react";
22-
import { QueryClient } from "@tanstack/react-query";
25+
import { QueryClient, queryOptions, skipToken } from "@tanstack/react-query";
2326
import dayjs from "dayjs";
2427
import duration from "dayjs/plugin/duration";
2528
import localizedFormat from "dayjs/plugin/localizedFormat";
@@ -300,3 +303,35 @@ export const convertEntityToIndividualId = (
300303
const exerciseId = entityLot === EntityLot.Exercise ? entityId : undefined;
301304
return { metadataId, metadataGroupId, personId, exerciseId };
302305
};
306+
307+
export const getPartialMetadataDetailsQuery = (metadataId: string) =>
308+
queryOptions({
309+
queryKey: queryFactory.media.metadataPartialDetails(metadataId).queryKey,
310+
queryFn: () =>
311+
clientGqlService
312+
.request(MetadataPartialDetailsDocument, { metadataId })
313+
.then((data) => data.metadataPartialDetails),
314+
});
315+
316+
export const getMetadataDetailsQuery = (metadataId?: string | null) =>
317+
queryOptions({
318+
queryKey: queryFactory.media.metadataDetails(metadataId || "").queryKey,
319+
queryFn: metadataId
320+
? () =>
321+
clientGqlService
322+
.request(MetadataDetailsDocument, { metadataId })
323+
.then((data) => data.metadataDetails)
324+
: skipToken,
325+
staleTime: dayjs.duration(1, "day").asMilliseconds(),
326+
});
327+
328+
export const getUserMetadataDetailsQuery = (metadataId?: string | null) =>
329+
queryOptions({
330+
queryKey: queryFactory.media.userMetadataDetails(metadataId || "").queryKey,
331+
queryFn: metadataId
332+
? () =>
333+
clientGqlService
334+
.request(UserMetadataDetailsDocument, { metadataId })
335+
.then((data) => data.userMetadataDetails)
336+
: skipToken,
337+
});

apps/frontend/app/lib/hooks.ts

+3-41
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,15 @@ import {
77
useSearchParams,
88
useSubmit,
99
} from "@remix-run/react";
10-
import {
11-
MetadataDetailsDocument,
12-
MetadataPartialDetailsDocument,
13-
UserMetadataDetailsDocument,
14-
} from "@ryot/generated/graphql/backend/graphql";
1510
import type { EntityLot } from "@ryot/generated/graphql/backend/graphql";
16-
import { queryOptions, skipToken, useQuery } from "@tanstack/react-query";
11+
import { useQuery } from "@tanstack/react-query";
1712
import Cookies from "js-cookie";
1813
import type { FormEvent } from "react";
1914
import {
2015
CurrentWorkoutKey,
21-
clientGqlService,
22-
dayjsLib,
16+
getMetadataDetailsQuery,
2317
getStringAsciiValue,
24-
queryFactory,
18+
getUserMetadataDetailsQuery,
2519
} from "~/lib/generals";
2620
import { type InProgressWorkout, useCurrentWorkout } from "~/lib/state/fitness";
2721
import type { loader } from "~/routes/_dashboard";
@@ -130,42 +124,10 @@ export const useGetWorkoutStarter = () => {
130124
return fn;
131125
};
132126

133-
export const getPartialMetadataDetailsQuery = (metadataId: string) =>
134-
queryOptions({
135-
queryKey: queryFactory.media.metadataPartialDetails(metadataId).queryKey,
136-
queryFn: () =>
137-
clientGqlService
138-
.request(MetadataPartialDetailsDocument, { metadataId })
139-
.then((data) => data.metadataPartialDetails),
140-
});
141-
142-
export const getMetadataDetailsQuery = (metadataId?: string | null) =>
143-
queryOptions({
144-
queryKey: queryFactory.media.metadataDetails(metadataId || "").queryKey,
145-
queryFn: metadataId
146-
? () =>
147-
clientGqlService
148-
.request(MetadataDetailsDocument, { metadataId })
149-
.then((data) => data.metadataDetails)
150-
: skipToken,
151-
staleTime: dayjsLib.duration(1, "day").asMilliseconds(),
152-
});
153-
154127
export const useMetadataDetails = (metadataId?: string | null) => {
155128
return useQuery(getMetadataDetailsQuery(metadataId));
156129
};
157130

158-
export const getUserMetadataDetailsQuery = (metadataId?: string | null) =>
159-
queryOptions({
160-
queryKey: queryFactory.media.userMetadataDetails(metadataId || "").queryKey,
161-
queryFn: metadataId
162-
? () =>
163-
clientGqlService
164-
.request(UserMetadataDetailsDocument, { metadataId })
165-
.then((data) => data.userMetadataDetails)
166-
: skipToken,
167-
});
168-
169131
export const useUserMetadataDetails = (metadataId?: string | null) => {
170132
return useQuery(getUserMetadataDetailsQuery(metadataId));
171133
};

apps/frontend/app/lib/state/media.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { atom, useAtom } from "jotai";
77
import { useState } from "react";
88
import type { DeepPartial } from "ts-essentials";
99
import { match } from "ts-pattern";
10-
import { queryClient } from "~/lib/generals";
1110
import {
1211
getMetadataDetailsQuery,
1312
getUserMetadataDetailsQuery,
14-
} from "~/lib/hooks";
13+
queryClient,
14+
} from "~/lib/generals";
1515

1616
export type UpdateProgressData = {
1717
metadataId: string;

0 commit comments

Comments
 (0)