add genres to home route configuration

This commit is contained in:
jeffvli
2025-12-03 20:22:49 -08:00
parent 5ea7798c52
commit a27ddfe746
4 changed files with 78 additions and 19 deletions
+1
View File
@@ -464,6 +464,7 @@
}, },
"home": { "home": {
"explore": "explore from your library", "explore": "explore from your library",
"genres": "$t(entity.genre_other)",
"mostPlayed": "most played", "mostPlayed": "most played",
"newlyAdded": "newly added releases", "newlyAdded": "newly added releases",
"recentlyPlayed": "recently played", "recentlyPlayed": "recently played",
@@ -63,17 +63,19 @@ const HomeRoute = () => {
}, },
}; };
const sortedCarousel = homeItems const sortedItems = homeItems.filter((item) => {
.filter((item) => { if (item.disabled) {
if (item.disabled) { return false;
return false; }
} if (isJellyfin && item.id === HomeItem.RECENTLY_PLAYED) {
if (isJellyfin && item.id === HomeItem.RECENTLY_PLAYED) { return false;
return false; }
}
return true; return true;
}) });
const sortedCarousel = sortedItems
.filter((item) => item.id !== HomeItem.GENRES)
.map((item) => ({ .map((item) => ({
...carousels[item.id], ...carousels[item.id],
uniqueId: item.id, uniqueId: item.id,
@@ -103,8 +105,16 @@ const HomeRoute = () => {
px="2rem" px="2rem"
> >
{homeFeature && <AlbumInfiniteFeatureCarousel />} {homeFeature && <AlbumInfiniteFeatureCarousel />}
<FeaturedGenres /> {sortedItems.map((item) => {
{sortedCarousel.map((carousel) => { if (item.id === HomeItem.GENRES) {
return <FeaturedGenres key="featured-genres" />;
}
const carousel = sortedCarousel.find((c) => c.uniqueId === item.id);
if (!carousel) {
return null;
}
if (carousel.itemType === LibraryItem.ALBUM) { if (carousel.itemType === LibraryItem.ALBUM) {
return ( return (
<AlbumInfiniteCarousel <AlbumInfiniteCarousel
@@ -1,7 +1,15 @@
import { useMemo } from 'react';
import { DraggableItems } from '/@/renderer/features/settings/components/general/draggable-items'; import { DraggableItems } from '/@/renderer/features/settings/components/general/draggable-items';
import { HomeItem, useGeneralSettings, useSettingsStoreActions } from '/@/renderer/store'; import {
HomeItem,
SortableItem,
useGeneralSettings,
useSettingsStoreActions,
} from '/@/renderer/store';
const HOME_ITEMS: Array<[string, string]> = [ const HOME_ITEMS: Array<[string, string]> = [
[HomeItem.GENRES, 'page.home.genres'],
[HomeItem.RANDOM, 'page.home.explore'], [HomeItem.RANDOM, 'page.home.explore'],
[HomeItem.RECENTLY_PLAYED, 'page.home.recentlyPlayed'], [HomeItem.RECENTLY_PLAYED, 'page.home.recentlyPlayed'],
[HomeItem.RECENTLY_ADDED, 'page.home.newlyAdded'], [HomeItem.RECENTLY_ADDED, 'page.home.newlyAdded'],
@@ -13,17 +21,48 @@ export const HomeSettings = () => {
const { homeItems } = useGeneralSettings(); const { homeItems } = useGeneralSettings();
const { setHomeItems } = useSettingsStoreActions(); const { setHomeItems } = useSettingsStoreActions();
const mappedHomeItems = homeItems.map((item) => ({ const mergedHomeItems = useMemo(() => {
...item, const settingsMap = new Map(
id: item.id as HomeItem, homeItems.map((item) => [item.id, item as SortableItem<HomeItem>]),
})); );
const merged = HOME_ITEMS.map(([itemId]) => {
const homeItemId = itemId as HomeItem;
const existing = settingsMap.get(homeItemId);
if (existing) {
return {
...existing,
id: homeItemId,
};
}
// Item not in settings, add it as disabled
return {
disabled: true,
id: homeItemId,
};
});
// Add any items from settings that aren't in HOME_ITEMS (for backwards compatibility)
homeItems.forEach((item) => {
const existsInHomeItems = HOME_ITEMS.some(([itemId]) => itemId === item.id);
if (!existsInHomeItems) {
merged.push({
...item,
id: item.id as HomeItem,
});
}
});
return merged;
}, [homeItems]);
return ( return (
<DraggableItems <DraggableItems
description="setting.homeConfiguration" description="setting.homeConfiguration"
itemLabels={HOME_ITEMS} itemLabels={HOME_ITEMS}
setItems={setHomeItems} setItems={setHomeItems}
settings={mappedHomeItems} settings={mergedHomeItems}
title="setting.homeConfiguration" title="setting.homeConfiguration"
/> />
); );
+10 -1
View File
@@ -40,6 +40,7 @@ type DeepPartial<T> = {
}; };
const HomeItemSchema = z.enum([ const HomeItemSchema = z.enum([
'genres',
'mostPlayed', 'mostPlayed',
'random', 'random',
'recentlyAdded', 'recentlyAdded',
@@ -456,6 +457,7 @@ export enum GenreTarget {
} }
export enum HomeItem { export enum HomeItem {
GENRES = 'genres',
MOST_PLAYED = 'mostPlayed', MOST_PLAYED = 'mostPlayed',
RANDOM = 'random', RANDOM = 'random',
RECENTLY_ADDED = 'recentlyAdded', RECENTLY_ADDED = 'recentlyAdded',
@@ -1350,10 +1352,17 @@ export const useSettingsStore = createWithEqualityFn<SettingsSlice>()(
}); });
} }
if (version <= 13) {
state.general.homeItems.push({
disabled: false,
id: HomeItem.GENRES,
});
}
return persistedState; return persistedState;
}, },
name: 'store_settings', name: 'store_settings',
version: 13, version: 14,
}, },
), ),
); );