From adad0bd34499b80233c98ba1de040358be198316 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Sat, 2 May 2026 11:03:27 +0300 Subject: [PATCH] Sync stage and rail ambient media --- src/entities/service/media.ts | 11 +++++++++++ src/widgets/service-rail/ServiceRail.tsx | 12 +++++------- src/widgets/service-stage/ServiceStage.tsx | 10 +++------- 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 src/entities/service/media.ts diff --git a/src/entities/service/media.ts b/src/entities/service/media.ts new file mode 100644 index 0000000..a7b5cbc --- /dev/null +++ b/src/entities/service/media.ts @@ -0,0 +1,11 @@ +import type { LauncherServiceView, MediaKind } from "./types"; + +export const DEFAULT_AMBIENT_MEDIA = "/storage/default.gif"; +export const DEFAULT_AMBIENT_MEDIA_KIND: MediaKind = "gif"; + +export function resolveAmbientMedia(service?: LauncherServiceView): { src: string; kind: MediaKind } { + return { + src: service?.media.ambientVideo ?? DEFAULT_AMBIENT_MEDIA, + kind: service?.media.ambientKind ?? DEFAULT_AMBIENT_MEDIA_KIND, + }; +} diff --git a/src/widgets/service-rail/ServiceRail.tsx b/src/widgets/service-rail/ServiceRail.tsx index d56259d..109c699 100644 --- a/src/widgets/service-rail/ServiceRail.tsx +++ b/src/widgets/service-rail/ServiceRail.tsx @@ -1,9 +1,8 @@ import { ChevronRight } from "lucide-react"; +import { DEFAULT_AMBIENT_MEDIA, resolveAmbientMedia } from "../../entities/service/media"; import type { LauncherServiceView } from "../../entities/service/types"; import { cn } from "../../shared/lib/cn"; -const DEFAULT_RAIL_MEDIA = "/storage/default.gif"; - export function ServiceRail({ services, selectedServiceId, @@ -13,13 +12,12 @@ export function ServiceRail({ selectedServiceId?: string; onSelect: (serviceId: string) => void; }) { - const selectedService = services.find((service) => service.id === selectedServiceId) ?? services[0]; - const railMediaSrc = selectedService?.media.ambientVideo ?? selectedService?.media.coverImage ?? DEFAULT_RAIL_MEDIA; - const railMediaKind = selectedService?.media.ambientKind ?? selectedService?.media.coverKind; + const selectedService = services.find((service) => service.id === selectedServiceId); + const railMedia = resolveAmbientMedia(selectedService); return (
- +
@@ -36,7 +34,7 @@ export function ServiceRail({ > diff --git a/src/widgets/service-stage/ServiceStage.tsx b/src/widgets/service-stage/ServiceStage.tsx index b45da3f..0fd7b27 100644 --- a/src/widgets/service-stage/ServiceStage.tsx +++ b/src/widgets/service-stage/ServiceStage.tsx @@ -12,12 +12,11 @@ import { Network, Wrench, } from "lucide-react"; +import { resolveAmbientMedia } from "../../entities/service/media"; import type { LauncherServiceView } from "../../entities/service/types"; import { Button } from "../../shared/ui/Button"; import { ServiceStatusBadge, StatusBadge } from "../../shared/ui/StatusBadge"; -const DEFAULT_STAGE_MEDIA = "/storage/default.gif"; - export function ServiceStage({ service, hasServices, @@ -46,6 +45,7 @@ export function ServiceStage({ const style = { "--service-accent": service?.accentColor ?? "#C3FF66", } as React.CSSProperties; + const ambientMedia = resolveAmbientMedia(service); const disabledReason = service ? service.status === "maintenance" ? "Сервис временно недоступен" @@ -60,11 +60,7 @@ export function ServiceStage({