mirror of
https://github.com/BrenBroZAYT/gameyfin.git
synced 2026-06-13 16:40:01 +00:00
8d8dca32d8
* chore: bump version to v2.3.0-preview * Customize start page (#803) * Update ConfigService to support complex Objects Implemented tests for ConfigService * Added DB migration for config table * Fixed version in banner.txt not being displayed * Implement Library ordering Implement "Show recently added games on homepage" * Fix build.gradle.kts * FIx bug when creating libraries * Fix TypeScript errors Fix library sorting * Bump actions/checkout from 5 to 6 (#811) Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Added automatic scanning using file system watchers (#813) * Implement collections (#814) * Backend implementation for collections * Fix database schema and migration script * Refactor some config values Fix ArrayInput not being deactivatable * Remove "AutoRegisterNewUsers" config option * Fix bug when removing ignored paths * Add UI for collections (WIP) * Fix table actions not synced with state Fix tests * Finish implementation of collection feature * Fix tests * Bump actions/checkout from 5 to 6 (#815) Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix "allow guests to create game requests" not being enabled when guest access is activated * Fix: Disable loading of EditGameMetadataModal and MatchGameModal in GameView when user is not admin * WIP: Update start page layout * Performance improvements (lazy loading and virtualized grids/lists) Fix various smaller issues * Implement use of blurhash for all images in backend and covers in frontend * Fix bugs and test * Fix code analysis issues * Remove "UI settings" since they have been made obsolete --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
57 lines
2.3 KiB
TypeScript
57 lines
2.3 KiB
TypeScript
import CollectionAdminDto from "Frontend/generated/org/gameyfin/app/collections/dto/CollectionAdminDto";
|
|
import React, {useEffect, useState} from "react";
|
|
import GameDto from "Frontend/generated/org/gameyfin/app/games/dto/GameDto";
|
|
import {useSnapshot} from "valtio/react";
|
|
import {gameState} from "Frontend/state/GameState";
|
|
import IconBackgroundPattern from "Frontend/components/general/IconBackgroundPattern";
|
|
import {Card} from "@heroui/react";
|
|
|
|
interface CollectionHeaderProps {
|
|
collection: CollectionAdminDto;
|
|
className?: string;
|
|
}
|
|
|
|
export default function CollectionHeader({collection, className}: CollectionHeaderProps) {
|
|
const MAX_COVER_COUNT = 5;
|
|
const state = useSnapshot(gameState);
|
|
const [randomGames, setRandomGames] = useState<GameDto[]>([]);
|
|
|
|
useEffect(() => {
|
|
if (!state.randomlyOrderedGamesByCollectionId) return;
|
|
setRandomGames(getRandomGames());
|
|
}, [state]);
|
|
|
|
function getRandomGames() {
|
|
if (!state.randomlyOrderedGamesByCollectionId[collection.id]) return [];
|
|
const games = state.randomlyOrderedGamesByCollectionId[collection.id]
|
|
.filter(game => game.images && game.images.length > 0);
|
|
if (!games) return [];
|
|
return games.slice(0, MAX_COVER_COUNT);
|
|
}
|
|
|
|
return (
|
|
<Card className={`overflow-hidden rounded-lg relative pointer-events-none select-none ${className}`}>
|
|
<IconBackgroundPattern/>
|
|
<div className="flex flex-row items-center w-full h-full brightness-50">
|
|
{randomGames.map((game, idx) => (
|
|
<div
|
|
key={idx}
|
|
className="flex-none overflow-hidden -ml-[10%]"
|
|
style={{
|
|
width: `calc(100% / ${MAX_COVER_COUNT - 2})`,
|
|
clipPath: 'polygon(15% 0, 100% 0, 85% 100%, 0% 100%)',
|
|
}}
|
|
>
|
|
<img
|
|
src={`/images/screenshot/${game.images![0].id}`}
|
|
alt={`Image ${idx}`}
|
|
/>
|
|
</div>
|
|
))}
|
|
</div>
|
|
<div className="absolute inset-0 flex items-center justify-center">
|
|
<h2 className="text-white text-3xl font-bold">{collection.name}</h2>
|
|
</div>
|
|
</Card>
|
|
);
|
|
} |