import { Image } from "expo-image"; import type { FC } from "react"; import { View } from "react-native"; import { Text } from "@/components/common/Text"; import { CONTROLS_CONSTANTS } from "./constants"; const BASE_IMAGE_SCALE = 1.4; const BUBBLE_LEFT_OFFSET = 62; const BUBBLE_WIDTH_MULTIPLIER = 1.5; interface TrickplayBubbleProps { trickPlayUrl: { x: number; y: number; url: string; } | null; trickplayInfo: { aspectRatio?: number; data: { TileWidth?: number; TileHeight?: number; }; } | null; time: { hours: number; minutes: number; seconds: number; }; /** Scale factor for the image (default 1). Does not affect timestamp text. */ imageScale?: number; } function formatTime(hours: number, minutes: number, seconds: number): string { const pad = (n: number) => (n < 10 ? `0${n}` : `${n}`); const prefix = hours > 0 ? `${hours}:` : ""; return `${prefix}${pad(minutes)}:${pad(seconds)}`; } export const TrickplayBubble: FC = ({ trickPlayUrl, trickplayInfo, time, imageScale = 1, }) => { if (!trickPlayUrl || !trickplayInfo) { return null; } const { x, y, url } = trickPlayUrl; const tileWidth = CONTROLS_CONSTANTS.TILE_WIDTH; const tileHeight = tileWidth / trickplayInfo.aspectRatio!; const finalScale = BASE_IMAGE_SCALE * imageScale; return ( {formatTime(time.hours, time.minutes, time.seconds)} ); };