diff --git a/back/src/history/history.service.ts b/back/src/history/history.service.ts
index fff3518..a792098 100644
--- a/back/src/history/history.service.ts
+++ b/back/src/history/history.service.ts
@@ -51,6 +51,7 @@ export class HistoryService {
orderBy: { playDate: 'desc' },
skip,
take,
+ include: { song: true }
});
}
diff --git a/front/API.ts b/front/API.ts
index 5b4384e..69db79b 100644
--- a/front/API.ts
+++ b/front/API.ts
@@ -139,6 +139,8 @@ export default class API {
}
throw e;
});
+ if (!handler.transformer)
+ return handler.validator.cast(validated);
return handler.transformer(handler.validator.cast(validated));
} catch (e) {
if (e instanceof SyntaxError) throw new Error("Error while parsing Server's response");
diff --git a/front/components/V2/TabNavigationDesktop.tsx b/front/components/V2/TabNavigationDesktop.tsx
index 3fc055a..02f44a5 100644
--- a/front/components/V2/TabNavigationDesktop.tsx
+++ b/front/components/V2/TabNavigationDesktop.tsx
@@ -25,10 +25,7 @@ const TabNavigationDesktop = (props: TabNavigationDesktopProps) => {
? require('../../assets/icon_light.png')
: require('../../assets/icon_dark.png')
);
- const playHistoryQuery = useQuery(API.getUserPlayHistory);
- const songHistory = useQueries(
- playHistoryQuery.data?.map(({ songID }) => API.getSong(songID)) ?? []
- );
+ const history = useQuery(API.getUserPlayHistory);
// settings is displayed separately (with logout)
const buttons = props.tabs.filter((tab) => tab.id !== 'settings');
@@ -110,7 +107,7 @@ const TabNavigationDesktop = (props: TabNavigationDesktopProps) => {
>
Recently played
- {songHistory.length === 0 && (
+ {history.data?.length === 0 && (
{
No songs played yet
)}
- {songHistory
- .map((h) => h.data)
- .filter((data): data is Song => data !== undefined)
+ {history.data
+ ?.map(x => x.song)
.filter(
(song, i, array) =>
array.map((s) => s.id).findIndex((id) => id == song.id) == i
diff --git a/front/models/ResponseHandler.ts b/front/models/ResponseHandler.ts
index f6bb5c4..337089b 100644
--- a/front/models/ResponseHandler.ts
+++ b/front/models/ResponseHandler.ts
@@ -2,7 +2,7 @@ import * as yup from 'yup';
type ResponseHandler = {
validator: yup.Schema;
- transformer: (value: APIType) => ModelType;
+ transformer?: (value: APIType) => ModelType;
};
export default ResponseHandler;
diff --git a/front/models/SongHistory.ts b/front/models/SongHistory.ts
index d8a81ef..de43b9c 100644
--- a/front/models/SongHistory.ts
+++ b/front/models/SongHistory.ts
@@ -1,23 +1,19 @@
import * as yup from 'yup';
import ResponseHandler from './ResponseHandler';
+import { SongValidator } from './Song';
export const SongHistoryItemValidator = yup.object({
songID: yup.number().required(),
+ song: SongValidator.required(),
userID: yup.number().required(),
score: yup.number().required(),
playDate: yup.date().required(),
difficulties: yup.mixed().required(),
});
+export type SongHistoryItem = yup.InferType;
-export const SongHistoryItemHandler: ResponseHandler<
- yup.InferType,
- SongHistoryItem
-> = {
+export const SongHistoryItemHandler: ResponseHandler = {
validator: SongHistoryItemValidator,
- transformer: (value) => ({
- ...value,
- difficulties: value.difficulties,
- }),
};
export const SongHistoryValidator = yup.object({
@@ -29,18 +25,6 @@ export type SongHistory = yup.InferType;
export const SongHistoryHandler: ResponseHandler = {
validator: SongHistoryValidator,
- transformer: (value) => ({
- ...value,
- history: value.history.map((item) => SongHistoryItemHandler.transformer(item)),
- }),
-};
-
-export type SongHistoryItem = {
- songID: number;
- userID: number;
- score: number;
- playDate: Date;
- difficulties: object;
};
export default SongHistory;