diff --git a/videos/src/PortalPresentationMobile.tsx b/videos/src/PortalPresentationMobile.tsx index 33d43b4..5c624cd 100644 --- a/videos/src/PortalPresentationMobile.tsx +++ b/videos/src/PortalPresentationMobile.tsx @@ -1,13 +1,14 @@ import { AbsoluteFill, Sequence, useVideoConfig, Img, staticFile } from "remotion"; import { inconsolataFont } from "./fonts/inconsolata"; -import { PortalIntroScene } from "./scenes/portal/PortalIntroScene"; -import { PortalTitleScene } from "./scenes/portal/PortalTitleScene"; -import { DashboardOverviewScene } from "./scenes/portal/DashboardOverviewScene"; -import { MeetupShowcaseScene } from "./scenes/portal/MeetupShowcaseScene"; -import { TopMeetupsScene } from "./scenes/portal/TopMeetupsScene"; -import { ActivityFeedScene } from "./scenes/portal/ActivityFeedScene"; -import { CallToActionScene } from "./scenes/portal/CallToActionScene"; -import { PortalOutroScene } from "./scenes/portal/PortalOutroScene"; +import { PortalIntroSceneMobile } from "./scenes/portal/mobile/PortalIntroSceneMobile"; +import { PortalTitleSceneMobile } from "./scenes/portal/mobile/PortalTitleSceneMobile"; +import { DashboardOverviewSceneMobile } from "./scenes/portal/mobile/DashboardOverviewSceneMobile"; +import { MeetupShowcaseSceneMobile } from "./scenes/portal/mobile/MeetupShowcaseSceneMobile"; +import { CountryStatsSceneMobile } from "./scenes/portal/mobile/CountryStatsSceneMobile"; +import { TopMeetupsSceneMobile } from "./scenes/portal/mobile/TopMeetupsSceneMobile"; +import { ActivityFeedSceneMobile } from "./scenes/portal/mobile/ActivityFeedSceneMobile"; +import { CallToActionSceneMobile } from "./scenes/portal/mobile/CallToActionSceneMobile"; +import { PortalOutroSceneMobile } from "./scenes/portal/mobile/PortalOutroSceneMobile"; import { PortalAudioManager } from "./components/PortalAudioManager"; /** @@ -138,7 +139,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.logoReveal.duration} premountFor={fps} > - + {/* Scene 2: Portal Title (4s) */} @@ -147,7 +148,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.portalTitle.duration} premountFor={fps} > - + {/* Scene 3: Dashboard Overview (12s) */} @@ -156,7 +157,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.dashboardOverview.duration} premountFor={fps} > - + {/* Scene 4: Meine Meetups (12s) */} @@ -165,7 +166,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.meineMeetups.duration} premountFor={fps} > - + {/* Scene 5: Top Länder (12s) */} @@ -174,7 +175,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.topLaender.duration} premountFor={fps} > - + {/* Scene 6: Top Meetups (10s) */} @@ -183,7 +184,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.topMeetups.duration} premountFor={fps} > - + {/* Scene 7: Activity Feed (10s) */} @@ -192,7 +193,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.activityFeed.duration} premountFor={fps} > - + {/* Scene 8: Call to Action (12s) */} @@ -201,7 +202,7 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.callToAction.duration} premountFor={fps} > - + {/* Scene 9: Outro (12s) */} @@ -210,29 +211,8 @@ export const PortalPresentationMobile: React.FC = () => { durationInFrames={sceneFrames.outro.duration} premountFor={fps} > - + ); }; - -/** - * Placeholder component for scenes that haven't been implemented yet. - * Displays a centered scene name with visual indicators. - */ -const PlaceholderScene: React.FC<{ name: string; sceneNumber: number }> = ({ - name, - sceneNumber, -}) => { - return ( - -
-
- {sceneNumber} -
-

{name}

-

Scene placeholder

-
-
- ); -}; diff --git a/videos/src/scenes/portal/mobile/ActivityFeedSceneMobile.test.tsx b/videos/src/scenes/portal/mobile/ActivityFeedSceneMobile.test.tsx new file mode 100644 index 0000000..d7ac26a --- /dev/null +++ b/videos/src/scenes/portal/mobile/ActivityFeedSceneMobile.test.tsx @@ -0,0 +1,143 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { render, cleanup } from "@testing-library/react"; +import { ActivityFeedSceneMobile } from "./ActivityFeedSceneMobile"; + +/* eslint-disable @remotion/warn-native-media-tag */ +// Mock Remotion hooks +vi.mock("remotion", () => ({ + useCurrentFrame: vi.fn(() => 60), + useVideoConfig: vi.fn(() => ({ fps: 30, width: 1080, height: 1920 })), + interpolate: vi.fn((value, inputRange, outputRange, options) => { + const [inMin, inMax] = inputRange; + const [outMin, outMax] = outputRange; + let progress = (value - inMin) / (inMax - inMin); + if (options?.extrapolateLeft === "clamp") { + progress = Math.max(0, progress); + } + if (options?.extrapolateRight === "clamp") { + progress = Math.min(1, progress); + } + return outMin + progress * (outMax - outMin); + }), + spring: vi.fn(() => 1), + AbsoluteFill: vi.fn(({ children, className, style }) => ( +
+ {children} +
+ )), + Img: vi.fn(({ src, className, style }) => ( + + )), + staticFile: vi.fn((path: string) => `/static/${path}`), + Sequence: vi.fn(({ children, from, durationInFrames }) => ( +
+ {children} +
+ )), +})); + +// Mock @remotion/media +vi.mock("@remotion/media", () => ({ + Audio: vi.fn(({ src, volume }) => ( +