@moviie/player-expo 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/app.plugin.cjs +3 -0
- package/dist/cast.cjs +100 -0
- package/dist/cast.cjs.map +1 -0
- package/dist/cast.d.cts +15 -0
- package/dist/cast.d.ts +15 -0
- package/dist/cast.mjs +92 -0
- package/dist/cast.mjs.map +1 -0
- package/dist/chunk-67DJ7NOB.mjs +294 -0
- package/dist/chunk-67DJ7NOB.mjs.map +1 -0
- package/dist/chunk-7U2LKIGU.mjs +12 -0
- package/dist/chunk-7U2LKIGU.mjs.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/index.cjs +3934 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +450 -0
- package/dist/index.d.ts +450 -0
- package/dist/index.mjs +3571 -0
- package/dist/index.mjs.map +1 -0
- package/dist/layout.cjs +217 -0
- package/dist/layout.cjs.map +1 -0
- package/dist/layout.d.cts +20 -0
- package/dist/layout.d.ts +20 -0
- package/dist/layout.mjs +4 -0
- package/dist/layout.mjs.map +1 -0
- package/dist/moviie-cast-adapter-DmSU2u3j.d.cts +53 -0
- package/dist/moviie-cast-adapter-DmSU2u3j.d.ts +53 -0
- package/dist/plugin/with-moviie.cjs +88 -0
- package/dist/plugin/with-moviie.cjs.map +1 -0
- package/dist/plugin/with-moviie.d.cts +52 -0
- package/dist/plugin/with-moviie.d.ts +52 -0
- package/dist/plugin/with-moviie.mjs +76 -0
- package/dist/plugin/with-moviie.mjs.map +1 -0
- package/package.json +134 -0
- package/plugin/validate-options.ts +31 -0
- package/plugin/with-moviie-types.ts +21 -0
- package/plugin/with-moviie.ts +84 -0
- package/src/apply-expo-moviie-endpoints.ts +47 -0
- package/src/cast/google-cast-adapter.ts +111 -0
- package/src/cast/index.ts +12 -0
- package/src/components/controls/moviie-bottom-timeline.tsx +477 -0
- package/src/components/controls/moviie-cast-buttons.tsx +96 -0
- package/src/components/controls/moviie-chrome-edge-gradients.tsx +162 -0
- package/src/components/controls/moviie-controls.tsx +585 -0
- package/src/components/controls/moviie-skin-chrome-context.tsx +374 -0
- package/src/components/controls/moviie-skin-smart-progress.tsx +157 -0
- package/src/components/icons/embed-media-icons.tsx +282 -0
- package/src/components/icons/moviie-embed-brand-mark.tsx +58 -0
- package/src/components/moviie-error-boundary.tsx +80 -0
- package/src/components/moviie-player-error-shell.tsx +143 -0
- package/src/components/moviie-player-loading-shell.tsx +59 -0
- package/src/components/moviie-skin-custom-fullscreen-modal.tsx +232 -0
- package/src/components/moviie-video-props.ts +134 -0
- package/src/components/moviie-video.tsx +568 -0
- package/src/components/moviie-video.web.tsx +167 -0
- package/src/components/overlays/moviie-watermark.tsx +53 -0
- package/src/constants.ts +374 -0
- package/src/hooks/use-moviie-event.ts +103 -0
- package/src/hooks/use-moviie-playback-ended.ts +14 -0
- package/src/hooks/use-moviie-playback-resume-persistence.ts +76 -0
- package/src/hooks/use-moviie-playback.ts +99 -0
- package/src/hooks/use-moviie-player-types.ts +55 -0
- package/src/hooks/use-moviie-player.ts +236 -0
- package/src/hooks/use-moviie-player.web.ts +57 -0
- package/src/hooks/use-moviie-telemetry.ts +133 -0
- package/src/index.ts +90 -0
- package/src/layout.ts +4 -0
- package/src/lib/add-moviie-playback-ended-listener.ts +16 -0
- package/src/lib/build-moviie-branding-marketing-url.ts +14 -0
- package/src/lib/build-moviie-embed-brand-home-url.ts +16 -0
- package/src/lib/build-moviie-skin-layout-metrics.ts +166 -0
- package/src/lib/build-moviie-video-presentation.ts +42 -0
- package/src/lib/build-moviie-watch-embed-url.ts +30 -0
- package/src/lib/cast-adapter-registry.ts +13 -0
- package/src/lib/clamp-unit-interval.ts +3 -0
- package/src/lib/compute-custom-fullscreen-stage-dimensions.ts +39 -0
- package/src/lib/compute-moviie-playback-ended.ts +31 -0
- package/src/lib/compute-playback-buffering.ts +41 -0
- package/src/lib/compute-playback-progress-ratio.ts +33 -0
- package/src/lib/compute-timeline-scrub-commit-time.ts +40 -0
- package/src/lib/custom-fullscreen-native-orientation.ts +88 -0
- package/src/lib/format-playback-clock.ts +27 -0
- package/src/lib/jsx-native-bridge.ts +45 -0
- package/src/lib/map-smart-progress-display-ratio.ts +43 -0
- package/src/lib/moviie-cast-adapter.ts +53 -0
- package/src/lib/moviie-error-display.ts +149 -0
- package/src/lib/moviie-shell-tokens.ts +27 -0
- package/src/lib/moviie-telemetry-callbacks.ts +76 -0
- package/src/lib/optional-status-bar.ts +48 -0
- package/src/lib/partition-moviie-video-host-style.ts +54 -0
- package/src/lib/remember-playback-position-storage.ts +98 -0
- package/src/lib/resolve-moviie-skin-layout-scale.ts +17 -0
- package/src/lib/resolve-orientation-lock-for-rotate-z-deg.ts +21 -0
- package/src/lib/resolve-skin-accent-color.ts +10 -0
- package/src/lib/resolve-web-embed-iframe-src.ts +17 -0
- package/src/lib/warn-once.ts +23 -0
- package/src/platform/native-application-id.ts +10 -0
- package/src/platform/platform-client-info.ts +31 -0
- package/src/playback/fetch-playback-fresh.ts +27 -0
- package/src/playback/playback-memory-cache.ts +52 -0
- package/src/provider/moviie-provider.tsx +99 -0
- package/src/secure-store-viewer-token-store.ts +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/apply-expo-moviie-endpoints.ts","../src/lib/warn-once.ts","../src/secure-store-viewer-token-store.ts","../src/platform/native-application-id.ts","../src/platform/platform-client-info.ts","../src/provider/moviie-provider.tsx","../src/playback/playback-memory-cache.ts","../src/playback/fetch-playback-fresh.ts","../src/hooks/use-moviie-playback.ts","../src/hooks/use-moviie-telemetry.ts","../src/lib/remember-playback-position-storage.ts","../src/hooks/use-moviie-playback-resume-persistence.ts","../src/lib/build-moviie-video-presentation.ts","../src/hooks/use-moviie-player.ts","../src/hooks/use-moviie-event.ts","../src/hooks/use-moviie-playback-ended.ts","../src/lib/compute-moviie-playback-ended.ts","../src/lib/add-moviie-playback-ended-listener.ts","../src/lib/build-moviie-watch-embed-url.ts","../src/lib/jsx-native-bridge.ts","../src/lib/moviie-telemetry-callbacks.ts","../src/lib/moviie-shell-tokens.ts","../src/lib/partition-moviie-video-host-style.ts","../src/lib/compute-custom-fullscreen-stage-dimensions.ts","../src/lib/cast-adapter-registry.ts","../src/lib/format-playback-clock.ts","../src/components/icons/embed-media-icons.tsx","../src/lib/build-moviie-embed-brand-home-url.ts","../src/lib/resolve-moviie-skin-layout-scale.ts","../src/lib/build-moviie-skin-layout-metrics.ts","../src/lib/compute-playback-buffering.ts","../src/components/controls/moviie-skin-chrome-context.tsx","../src/components/icons/moviie-embed-brand-mark.tsx","../src/components/controls/moviie-cast-buttons.tsx","../src/components/controls/moviie-chrome-edge-gradients.tsx","../src/lib/clamp-unit-interval.ts","../src/lib/compute-playback-progress-ratio.ts","../src/lib/compute-timeline-scrub-commit-time.ts","../src/lib/resolve-skin-accent-color.ts","../src/components/controls/moviie-bottom-timeline.tsx","../src/lib/map-smart-progress-display-ratio.ts","../src/components/controls/moviie-skin-smart-progress.tsx","../src/components/controls/moviie-controls.tsx","../src/lib/optional-status-bar.ts","../src/lib/custom-fullscreen-native-orientation.ts","../src/lib/resolve-orientation-lock-for-rotate-z-deg.ts","../src/components/moviie-skin-custom-fullscreen-modal.tsx","../src/lib/moviie-error-display.ts","../src/components/moviie-player-error-shell.tsx","../src/components/moviie-player-loading-shell.tsx","../src/components/moviie-video.tsx","../src/components/moviie-error-boundary.tsx"],"names":["configureMoviieEndpoints","MemoryViewerTokenStore","Application","Platform","createContext","MoviieClient","buildClientHeaders","useContext","useMemo","jsx","useState","useCallback","useEffect","cached","useRef","TelemetryClient","PLAYBACK_EVENT_TYPE","AppState","useVideoPlayer","deriveTelemetryEventsBaseUrlFromBootstrapUrl","PLAYER_API_EVENTS","RNSvg","RNPath","RNDefs","RNLinearGradient","RNRect","RNStop","RNAnimated","AnimatedReanimated","jsxs","useWindowDimensions","Animated","Easing","Linking","Pressable","View","svgWidthPx","StyleSheet","styles","useSharedValue","useDerivedValue","useAnimatedStyle","Gesture","runOnJS","GestureDetector","t","ActivityIndicator","Text","Fragment","OrientationLock","unlockAsync","lockAsync","getOrientationLockAsync","forwardRef","MoviieSkinCustomFullscreenModalInner","useSafeAreaInsets","withTiming","useImperativeHandle","MoviieSkinCustomFullscreenModal","Modal","SafeAreaProvider","MoviieAuthError","MoviieNotFoundError","MoviieBundleBlockedError","MoviieReferrerBlockedError","MoviieSubscriptionInactiveError","MoviieNetworkError","MoviieRateLimitError","Image","VideoView","MoviieVideo","MoviieVideoImpl","isPictureInPictureSupported","createElement","React"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MOVIIE_PLAYER_EXPO_PKG_VERSION = '0.4.0' as const\n\nexport const MOVIIE_PLAYBACK_MEMORY_CACHE_TTL_MS = 5 * 60 * 1000\n\n/** Playback profile strings returned by the playback API (aligned with web embed). */\nexport const MOVIIE_PLAYBACK_PROFILE = {\n VSL: 'vsl',\n CUSTOM: 'custom',\n} as const\n\n/**\n * Smart Progress curve — mirrors {@link SMART_PROGRESS_CONFIG} on the web embed\n * (`apps/web/src/app/embed/[id]/constants.ts`).\n */\nexport const MOVIIE_SMART_PROGRESS_CONFIG = {\n R1: 0.18,\n P1: 0.62,\n R2: 0.8,\n P2: 0.95,\n P_MAX_BEFORE_END: 0.99,\n} as const\n\n/** Fill animation duration (ms); aligns with web `.moviie-smart-progress-fill` transition. */\nexport const MOVIIE_SMART_PROGRESS_FILL_TRANSITION_MS = 150 as const\n\n/** Absolute bottom bar height (dp) for native Smart Progress strip. */\nexport const MOVIIE_SMART_PROGRESS_BAR_HEIGHT_DP = 12 as const\n\nexport const MOVIIE_SMART_PROGRESS_Z_INDEX = 34 as const\n\n/**\n * SecureStore key prefix for resume position (`{prefix}{embedId}`).\n * Embed IDs are UUIDs from the API.\n */\nexport const MOVIIE_REMEMBER_POSITION_STORAGE_PREFIX = 'moviie.resume_position.' as const\n\n/** Debounce interval before persisting resume position while playing. */\nexport const MOVIIE_REMEMBER_POSITION_DEBOUNCE_MS = 5000 as const\n\n/** Matches embed/web framing defaults when `contentFit` is omitted on `MoviieVideo`. */\nexport const MOVIIE_VIDEO_DEFAULT_CONTENT_FIT = {\n VERTICAL: 'contain',\n HORIZONTAL: 'cover',\n} as const\n\nexport const MOVIIE_BRANDING_MARKETING_ORIGIN = 'https://moviie.ai' as const\n\n/** Origin público da página watch/embed (sem barra final). Override: `EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN`. */\nexport const MOVIIE_WATCH_ORIGIN_DEFAULT = 'https://watch.moviie.ai' as const\n\n/**\n * Variável `EXPO_PUBLIC_*` para override do origin watch/embed em Expo Web (`resolveMoviieWatchOrigin`).\n */\nexport const EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN_ENV = 'EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN' as const\n\n/** Path público do script da API JS do embed (relativo ao watch origin). */\nexport const MOVIIE_WATCH_EMBED_JS_PATH = '/embed.js' as const\n\n/**\n * Atributo único no `<script>` injectado em Expo Web para evitar duplicar `embed.js`\n * quando há vários `MoviieVideo` montados.\n */\nexport const MOVIIE_PLAYER_EXPO_EMBED_JS_MARKER_ATTR = 'data-moviie-player-expo-embed-js' as const\n\n/**\n * Variável `EXPO_PUBLIC_*` que override a base da API Moviie em **dev only**.\n * O Metro inlina qualquer `EXPO_PUBLIC_*` em build time, sem precisar de\n * `expo-constants`. Em produção o SDK usa sempre o default `https://api.moviie.ai/v1`.\n *\n * Exemplo `.env.local`:\n * EXPO_PUBLIC_MOVIIE_API_BASE_URL=http://localhost:3000/api/v1\n */\nexport const EXPO_PUBLIC_MOVIIE_API_BASE_URL_ENV = 'EXPO_PUBLIC_MOVIIE_API_BASE_URL' as const\n\n/**\n * Variável `EXPO_PUBLIC_*` que override a base de telemetria em **dev only**.\n * Caso omitida, deriva-se de `{origin}/telemetry/v1` a partir de `apiBaseUrl`.\n */\nexport const EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL_ENV = 'EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL' as const\n\nexport const MOVIIE_BRANDING_UTM_PARAM_SOURCE = 'utm_source' as const\nexport const MOVIIE_BRANDING_UTM_PARAM_MEDIUM = 'utm_medium' as const\nexport const MOVIIE_BRANDING_UTM_PARAM_CAMPAIGN = 'utm_campaign' as const\n\nexport const MOVIIE_BRANDING_UTM_SOURCE_VALUE = 'player-expo' as const\nexport const MOVIIE_BRANDING_UTM_MEDIUM_VALUE = 'branding' as const\n\n/** Espelha `PLAYER_EMBED_BRAND_UTM` do embed web (`apps/web/src/app/embed/[id]/constants.ts`). */\nexport const MOVIIE_EMBED_BRAND_UTM = {\n SOURCE: 'moviie_embed_player',\n MEDIUM: 'video_control_bar',\n CAMPAIGN: 'logo_click',\n} as const\n\nexport const MOVIIE_SKIN_DEFAULT_ACCENT_HEX = '#6366f1' as const\n\n/**\n * Valor legado para a prop `controlsAutoHideMs` / `autoHideMs`: o chrome da skin Moviie já não\n * usa temporizador para ocultar — só ao toque fora ou ações (play, seek).\n */\nexport const MOVIIE_SKIN_CONTROLS_AUTO_HIDE_MS = 3000 as const\n\nexport const MOVIIE_SKIN_CONTROLS_FADE_MS = 240 as const\n\nexport const MOVIIE_SKIN_WATERMARK_OPACITY = 0.7 as const\n\nexport const MOVIIE_SKIN_CONTROL_ICON_PX = 22 as const\n\n/**\n * Largura lógica de referência do layout da skin (ex.: frame Figma / iPhone ~390pt).\n * Dimensões em `MOVIIE_SKIN_*_AT_REFERENCE` / tokens da timeline escalam com `windowWidth`.\n */\nexport const MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT = 390 as const\n\n/** Limite inferior do factor de escala (telefones mais estreitos). */\nexport const MOVIIE_SKIN_LAYOUT_SCALE_MIN = 0.72 as const\n\n/**\n * Limite superior do factor de escala: não aumenta além do design de referência em ecrãs largos.\n */\nexport const MOVIIE_SKIN_LAYOUT_SCALE_MAX = 1 as const\n\n/**\n * Distância do HUD inferior (tempo, marca) às bordas laterais do vídeo e ao padding interno do relógio —\n * valor na largura de referência ({@link MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT}).\n */\nexport const MOVIIE_SKIN_FLOATING_HUD_EDGE_INSET_PX = 6 as const\n\n/**\n * Espaço entre a linha do relógio/marca e o topo da área da timeline — referência.\n * Separado de {@link MOVIIE_SKIN_FLOATING_HUD_EDGE_INSET_PX} para poder encostar ao footer sem afetar margens horizontais.\n * Valor 0 = máximo colado (útil para experimentar layout).\n */\nexport const MOVIIE_SKIN_FLOATING_HUD_ABOVE_TIMELINE_GAP_AT_REFERENCE_PT = 0 as const\n\n/** Hit slop do wordmark e do fullscreen substituto no HUD inferior — px (valor físico independente da escala do layout). */\nexport const MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX = 8 as const\n\n/**\n * Diâmetro da película circular dos botões do HUD inferior (fullscreen, PiP, cast) — referência.\n */\nexport const MOVIIE_SKIN_FLOATING_FULLSCREEN_SCRIM_DIAMETER_AT_REFERENCE_PT = 44 as const\n\n/**\n * Tamanho do ícone dentro dessa película — referência.\n */\nexport const MOVIIE_SKIN_FLOATING_FULLSCREEN_ICON_AT_REFERENCE_PT = 26 as const\n\n/**\n * Ícones do canto superior (cast, PiP, fullscreen) sem película, com marca visível — referência.\n * Cada ícone aplica seu próprio fator de compensação visual sobre este valor, pois os\n * paths SVG têm densidades de preenchimento diferentes dentro do viewBox.\n */\nexport const MOVIIE_SKIN_FLOATING_FULLSCREEN_TOP_ICON_AT_REFERENCE_PT = 36 as const\n\n/**\n * Fatores de escala visual por ícone do canto superior.\n * Cast/PiP usam viewBox 0 0 24 24 (Material); Fullscreen usa viewBox 0 0 32 32 (media-icons 1.1.5).\n * As densidades de preenchimento são semelhantes entre si, mas Cast (Material 24px) ocupa mais\n * área visual que Fullscreen (32px com cantos L), daí o cast ter escala ligeiramente menor.\n */\nexport const MOVIIE_SKIN_TOP_ICON_CAST_VISUAL_SCALE = 0.65 as const\nexport const MOVIIE_SKIN_TOP_ICON_PIP_VISUAL_SCALE = 0.8 as const\nexport const MOVIIE_SKIN_TOP_ICON_FULLSCREEN_VISUAL_SCALE = 0.8 as const\n\n/**\n * Espaço entre botões da linha direita do HUD (cast, PiP, fullscreen) — referência.\n * Maior que {@link MOVIIE_SKIN_FLOATING_HUD_EDGE_INSET_PX} para evitar toques acidentais\n * em botões adjacentes.\n */\nexport const MOVIIE_SKIN_FLOATING_HUD_BUTTON_GAP_AT_REFERENCE_PT = 10 as const\n\n/** Raio dos cantos do indicador de tempo — valor na largura de referência. */\nexport const MOVIIE_SKIN_FLOATING_HUD_CLOCK_CORNER_RADIUS_PX = 6 as const\n\n/** Opacidade da película preta detrás dos botões de chrome (0–1). */\nexport const MOVIIE_SKIN_CHROME_SCRIM_BLACK_ALPHA = 0.5 as const\n\n/** Película preta por detrás dos elementos de chrome (timing, ícones). */\nexport const MOVIIE_SKIN_CHROME_SCRIM_BLACK_RGBA =\n `rgba(0,0,0,${MOVIIE_SKIN_CHROME_SCRIM_BLACK_ALPHA})` as const\n\n/** Opacidade dos controlos do chrome no estado normal (repouso). */\nexport const MOVIIE_SKIN_CHROME_CONTROL_REST_OPACITY = 1 as const\n\n/**\n * Opacidade dos controlos do chrome ao premir — feedback visual (seek, play, fullscreen).\n */\nexport const MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY = 0.72 as const\n\n/** Preto nos stops do degradê vertical da skin (opacidade via `stopOpacity`). */\nexport const MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX = '#000000' as const\n\n/** Opacidade na borda “cheia” do degradê (outro extremo é totalmente transparente). */\nexport const MOVIIE_SKIN_CHROME_GRADIENT_EDGE_ALPHA = 0.62 as const\n\n/**\n * Altura da faixa reservada ao degradê nas bordas — referência (maior = mais “respiro” transparente).\n * O escuro concentra-se junto à borda via {@link MOVIIE_SKIN_CHROME_EDGE_GRADIENT_EDGE_SOLID_FADE_END_FRACTION}.\n * O inferior acrescenta a altura da timeline quando a barra de progresso está visível.\n */\nexport const MOVIIE_SKIN_CHROME_EDGE_GRADIENT_HEIGHT_AT_REFERENCE_PT = 104 as const\n\n/**\n * Ao longo da faixa, fração [0–1] medida a partir da borda escura até estar 100% transparente.\n * Ex.: 0.48 → ~48% da altura da faixa com degradê; o resto é totalmente transparente (valor intermédio entre faixa longa e lábio rente à borda).\n */\nexport const MOVIIE_SKIN_CHROME_EDGE_GRADIENT_EDGE_SOLID_FADE_END_FRACTION = 0.48 as const\n\n/**\n * Altura mínima transparente entre faixa superior e inferior após escalar somas —\n * evita sobreposição das duas faixas (“película” em todo o vídeo).\n */\nexport const MOVIIE_SKIN_CHROME_EDGE_GRADIENT_MIN_CLEAR_MIDDLE_PX = 56 as const\n\n/** IDs estáveis para `LinearGradient` em SVG (skin chrome). */\nexport const MOVIIE_SKIN_CHROME_SVG_GRADIENT_BOTTOM_EDGE_ID =\n 'moviie_skin_chrome_gradient_bottom_edge' as const\n\nexport const MOVIIE_SKIN_CHROME_SVG_GRADIENT_TOP_EDGE_ID =\n 'moviie_skin_chrome_gradient_top_edge' as const\n\n/** Volume normalizado (0–1) abaixo disto usa o ícone `volume-low` como no Vidstack. */\nexport const MOVIIE_SKIN_VOLUME_LOW_ICON_THRESHOLD = 0.45 as const\n\n/** Foreground dos ícones e texto da skin (branco sólido). */\nexport const MOVIIE_SKIN_CHROME_FOREGROUND_HEX = '#ffffff' as const\n\n/**\n * Espelha valores numéricos de `OrientationLock` do pacote `expo-screen-orientation` (SDK 52).\n * Mantidos aqui para funções puras e testes Vitest sem resolver o entry nativo do Expo.\n */\nexport const MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE = {\n LANDSCAPE: 5,\n LANDSCAPE_LEFT: 6,\n LANDSCAPE_RIGHT: 7,\n} as const\n\nexport type MoviieExpoOrientationLockValue =\n (typeof MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE)[keyof typeof MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE]\n\n/** Duração da transição (rotação + escala) do fullscreen JS na skin Moviie. */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_TRANSITION_MS = 420 as const\n\n/**\n * Rotação final em graus no eixo Z (sentido horário no React Native): vídeo + chrome giram juntos.\n */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_ROTATE_Z_DEGREES = 90 as const\n\n/** Escala inicial ao entrar em fullscreen (anima até 1). Saída anima de 1 até este valor. */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_ENTER_SCALE_START = 0.78 as const\n\n/**\n * `contentFit` no fullscreen rotacionado: preenche a altura útil do palco; barras laterais ficam a preto do palco.\n */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_VIDEO_CONTENT_FIT = 'contain' as const\n\n/** Fundo do palco em fullscreen JS e placeholder inline durante o modo expandido. */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_BACKGROUND_HEX = '#000000' as const\n\n/**\n * Margem extra (dp/pt) para dentro dos safe area insets no palco fullscreen rotacionado —\n * evita cortar chrome por cantos redondos / overshoot da animação.\n */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_OVERSCAN_PX = 12 as const\n\n/**\n * Reforço da margem do HUD/timeline em fullscreen rotacionado (escala com {@link MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT}).\n */\nexport const MOVIIE_SKIN_CUSTOM_FULLSCREEN_HUD_EDGE_BOOST_REFERENCE_PT = 14 as const\n\n/** Margem de buffer (s) abaixo da cabeça de reprodução para detetar stalls em HLS. */\nexport const MOVIIE_SKIN_BUFFER_UNDERRUN_LEAD_SECONDS = 0.35 as const\n\nexport const MOVIIE_SKIN_SEEK_JUMP_SECONDS = 10 as const\n\nexport const MOVIIE_SKIN_CENTER_PLAY_ICON_PX = 40 as const\n\n/**\n * Diâmetro da película circular do play/pause central — referência.\n * Entre o círculo compacto (~52) e o layout antigo (~108 na referência).\n */\nexport const MOVIIE_SKIN_CENTER_PLAY_SCRIM_DIAMETER_AT_REFERENCE_PT = 80 as const\n\n/**\n * Diâmetro da película circular dos botões seek (±10 s) junto ao play — referência.\n * Compacto em torno do ícone ({@link MOVIIE_SKIN_SEEK_ICON_PX}); inferior ao play.\n */\nexport const MOVIIE_SKIN_CENTER_SEEK_SCRIM_DIAMETER_AT_REFERENCE_PT = 46 as const\n\n/** Ícone seek ±10 s no cluster central — referência (escala com layout). */\nexport const MOVIIE_SKIN_SEEK_ICON_PX = 28 as const\n\n/** Espaço horizontal entre botões do cluster central — valor na largura de referência. */\nexport const MOVIIE_SKIN_CENTER_CLUSTER_COLUMN_GAP_PX = 12 as const\n\n/** Tamanho do texto do relógio — valor na largura de referência. */\nexport const MOVIIE_SKIN_CLOCK_TEXT_FONT_SIZE_AT_REFERENCE_PT = 12 as const\n\n/** Altura da faixa única da timeline — valor na largura de referência. */\nexport const MOVIIE_SKIN_TIMELINE_BAR_HEIGHT_PX = 3 as const\n\n/** Diâmetro do thumb de scrub — valor na largura de referência. */\nexport const MOVIIE_SKIN_TIMELINE_THUMB_DIAMETER_PX = 14 as const\n\n/** Padding vertical acima da timeline — referência (0 = mínimo para testes de densidade). */\nexport const MOVIIE_SKIN_TIMELINE_TOUCH_PADDING_VERTICAL_PX = 0 as const\n\n/**\n * Padding vertical mínimo (dp lógico) por cima do rail dentro da área do vídeo — bem menor que antes:\n * o alvo tátil prioritário é {@link MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_BOTTOM_DP} por baixo do frame.\n */\nexport const MOVIIE_SKIN_TIMELINE_TOUCH_EXPANSION_VERTICAL_DP = 2 as const\n\n/**\n * Expansão lateral modesta (`View.hitSlop`) — evita faixa enorme dentro do vídeo.\n */\nexport const MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_HORIZONTAL_DP = 3 as const\n\n/**\n * Pouca expansão para cima: apenas cobrir metade superior do thumb / gestos desde logo acima do trilho.\n */\nexport const MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_TOP_DP = 2 as const\n\n/**\n * Expansão inferior dominante — cobre o thumb quando ultrapassa o limite inferior do vídeo\n * (`hitSlop` não ocupa layout dentro do frame; toques contam por baixo da overlay).\n */\nexport const MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_BOTTOM_DP = 14 as const\n\n/** Trilho base da timeline: branco ~30%. */\nexport const MOVIIE_SKIN_TIMELINE_RAIL_BACKGROUND_RGBA = 'rgba(255,255,255,0.3)' as const\n\n/** Camada de buffer sobre o trilho (mesma cor/opacidade que o trilho). */\nexport const MOVIIE_SKIN_TIMELINE_BUFFER_LAYER_RGBA = MOVIIE_SKIN_TIMELINE_RAIL_BACKGROUND_RGBA\n\n/** Contorno do thumb da timeline para contraste sobre vídeo claro. */\nexport const MOVIIE_SKIN_TIMELINE_THUMB_BORDER_RGBA = 'rgba(0,0,0,0.35)' as const\n\n/** Diâmetro do thumb durante scrub (drag) relativamente ao thumb em repouso. */\nexport const MOVIIE_SKIN_TIMELINE_THUMB_DRAG_DIAMETER_MULTIPLIER = 1.65 as const\n\n/**\n * Segundos antes do fim onde o progresso mostrado fixa em 100% quando não está a reproduzir —\n * o `currentTime` do motor costuma ficar ligeiramente abaixo de `duration` no fim.\n */\nexport const MOVIIE_SKIN_TIMELINE_END_SNAP_EPSILON_SECONDS = 0.15 as const\n\n/**\n * Distância máxima (s) entre a posição de release do scrub e um boundary de capítulo\n * para que o snap automático seja ativado.\n */\nexport const MOVIIE_SKIN_TIMELINE_CHAPTER_SNAP_THRESHOLD_SECONDS = 2 as const\n\n/** Área do `ActivityIndicator` small no overlay de buffering — valor na largura de referência. */\nexport const MOVIIE_SKIN_BUFFERING_INDICATOR_SLOT_PX = 28 as const\n\n/** Largura intrínseca do SVG wordmark (viewBox). */\nexport const MOVIIE_SKIN_BRAND_MARK_ARTBOARD_WIDTH_PX = 173 as const\n\n/** Altura intrínseca do SVG wordmark (viewBox). */\nexport const MOVIIE_SKIN_BRAND_MARK_ARTBOARD_HEIGHT_PX = 46 as const\n\n/**\n * Largura visual alvo do wordmark quando `windowWidth` = {@link MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT}\n * (entre o tamanho compacto antigo e o artboard completo).\n */\nexport const MOVIIE_SKIN_BRAND_MARK_TARGET_WIDTH_AT_REFERENCE_PT = 68 as const\n\n/** ViewBox do SVG wordmark Moviie (173×46). */\nexport const MOVIIE_EMBED_BRAND_VIEW_BOX = '0 0 173 46' as const\n\n/** Espessura do traço das letras “ii” no wordmark (coordenadas do viewBox). */\nexport const MOVIIE_EMBED_BRAND_LETTERMARK_STROKE_WIDTH = 3 as const\n","/**\n * Configura endpoints da API Moviie a partir de **variáveis de ambiente**\n * `EXPO_PUBLIC_MOVIIE_API_BASE_URL` e (raro) `EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL`.\n *\n * **Override é apenas para desenvolvimento local.** Apps em produção usam o\n * default `https://api.moviie.ai/v1`. Por isso este módulo:\n *\n * - Só aplica o override quando `__DEV__ === true` (Metro/Hermes dev mode);\n * - Não depende de `expo-constants` — usa só `process.env.*` que o Metro inlina\n * em build time para qualquer var `EXPO_PUBLIC_*`;\n * - Falha silenciosamente em produção (var inexistente → default do SDK).\n *\n * Vars relevantes (definidas em `.env.local` no consumer):\n * EXPO_PUBLIC_MOVIIE_API_BASE_URL=http://localhost:3000/api/v1\n * EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL=http://localhost:3000/telemetry/v1\n */\nimport { configureMoviieEndpoints } from '@moviie/player-sdk'\n\nimport {\n EXPO_PUBLIC_MOVIIE_API_BASE_URL_ENV,\n EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL_ENV,\n} from './constants'\n\nfunction normalize(raw: string | undefined): string | undefined {\n if (typeof raw !== 'string') return undefined\n const trimmed = raw.trim()\n return trimmed.length > 0 ? trimmed.replace(/\\/+$/, '') : undefined\n}\n\n// `__DEV__` é definido pelo bundler RN. Em web build (Vite/Next) cai pra `process.env.NODE_ENV`.\nconst devMode =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production'\n\nif (devMode) {\n const apiBaseUrl = normalize(process.env[EXPO_PUBLIC_MOVIIE_API_BASE_URL_ENV])\n const eventsBaseUrl = normalize(process.env[EXPO_PUBLIC_MOVIIE_EVENTS_BASE_URL_ENV])\n\n const opts: { apiBaseUrl?: string; eventsBaseUrl?: string } = {}\n if (apiBaseUrl != null) opts.apiBaseUrl = apiBaseUrl\n if (eventsBaseUrl != null) opts.eventsBaseUrl = eventsBaseUrl\n\n if (opts.apiBaseUrl != null || opts.eventsBaseUrl != null) {\n configureMoviieEndpoints(opts)\n }\n}\n","/**\n * Console warning idempotente por chave. Útil para dependências opcionais ausentes:\n * dispara uma única vez por sessão para a mesma chave, evitando ruído no console.\n *\n * Reusável para qualquer feature gated por dep opcional (cast, DRM custom,\n * analytics provider, etc.).\n */\n\nconst FIRED_KEYS = new Set<string>()\n\nexport function warnOnce(key: string, message: string): void {\n if (FIRED_KEYS.has(key)) {\n return\n }\n FIRED_KEYS.add(key)\n // eslint-disable-next-line no-console\n console.warn(message)\n}\n\n/** Limpa o set de chaves disparadas. Use apenas em testes. */\nexport function __resetWarnOnceForTests(): void {\n FIRED_KEYS.clear()\n}\n","import type { ViewerTokenStore } from '@moviie/player-sdk'\nimport { MemoryViewerTokenStore } from '@moviie/player-sdk'\n\nimport { warnOnce } from './lib/warn-once'\n\nexport const MOVIIE_VIEWER_TOKEN_SECURE_STORE_KEY = 'moviie_viewer_token_v1' as const\n\nconst SECURE_STORE_MISSING_WARNING =\n '[@moviie/player-expo] `expo-secure-store` não está instalado — viewer token será mantido apenas em memória (perde ao matar app). ' +\n 'Instala com `pnpm add expo-secure-store` se quiseres persistência entre sessões.'\n\ninterface StoredEnvelope {\n token: string\n expiresAt: number\n}\n\nfunction isStoredEnvelope(value: unknown): value is StoredEnvelope {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n return typeof v.token === 'string' && typeof v.expiresAt === 'number'\n}\n\nexport class SecureStoreViewerTokenStore implements ViewerTokenStore {\n private readonly fallback: ViewerTokenStore\n private readonly storageKey: string\n\n constructor(options?: { fallback?: ViewerTokenStore; storageKey?: string }) {\n this.fallback = options?.fallback ?? new MemoryViewerTokenStore()\n this.storageKey = options?.storageKey ?? MOVIIE_VIEWER_TOKEN_SECURE_STORE_KEY\n }\n\n private async loadSecureStore(): Promise<typeof import('expo-secure-store') | null> {\n try {\n return await import('expo-secure-store')\n } catch {\n warnOnce('moviie:expo-secure-store-missing', SECURE_STORE_MISSING_WARNING)\n return null\n }\n }\n\n async get(): Promise<string | null> {\n const SecureStore = await this.loadSecureStore()\n if (!SecureStore) {\n return this.fallback.get()\n }\n try {\n const raw = await SecureStore.getItemAsync(this.storageKey)\n if (!raw) return null\n const parsed: unknown = JSON.parse(raw)\n if (!isStoredEnvelope(parsed)) {\n await SecureStore.deleteItemAsync(this.storageKey).catch(() => {})\n return null\n }\n if (parsed.expiresAt <= Date.now()) {\n await SecureStore.deleteItemAsync(this.storageKey).catch(() => {})\n return null\n }\n return parsed.token\n } catch {\n return this.fallback.get()\n }\n }\n\n async set(token: string, ttlSec: number): Promise<void> {\n const SecureStore = await this.loadSecureStore()\n const envelope: StoredEnvelope = {\n token,\n expiresAt: Date.now() + Math.max(0, ttlSec) * 1000,\n }\n if (!SecureStore) {\n await this.fallback.set(token, ttlSec)\n return\n }\n try {\n await SecureStore.setItemAsync(this.storageKey, JSON.stringify(envelope))\n } catch {\n await this.fallback.set(token, ttlSec)\n }\n }\n}\n","import * as Application from \"expo-application\"\n\nexport function readNativeApplicationId(): string | undefined {\n try {\n const id = Application.applicationId\n return id ?? undefined\n } catch {\n return undefined\n }\n}\n","import { Platform } from \"react-native\"\n\nimport type { MoviieClientInfo } from \"@moviie/player-sdk\"\n\nimport { readNativeApplicationId } from \"./native-application-id\"\n\nlet cached: MoviieClientInfo | null = null\n\nexport function buildPlatformClientInfo(sdkVersion: string): MoviieClientInfo {\n if (cached) {\n return cached\n }\n\n const os = Platform.OS\n const platform: MoviieClientInfo[\"platform\"] =\n os === \"ios\" ? \"ios\" : os === \"android\" ? \"android\" : \"web\"\n\n const bundleId =\n platform === \"web\" ? undefined : readNativeApplicationId()\n\n cached = {\n platform,\n bundleId,\n sdkVersion,\n }\n return cached\n}\n\nexport function resetPlatformClientInfoCache(): void {\n cached = null\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\"\n\nimport {\n buildClientHeaders,\n MemoryViewerTokenStore,\n MoviieClient,\n type MoviieClientInfo,\n type ViewerTokenStore,\n} from \"@moviie/player-sdk\"\n\nimport { MOVIIE_PLAYER_EXPO_PKG_VERSION } from \"../constants\"\nimport { buildPlatformClientInfo } from \"../platform/platform-client-info\"\nimport { SecureStoreViewerTokenStore } from \"../secure-store-viewer-token-store\"\n\nexport interface MoviieContextValue {\n client: MoviieClient\n viewerTokenStore: ViewerTokenStore\n publishableKey: string | null\n clientInfo: MoviieClientInfo\n sdkVersion: string\n /** Headers reused by TelemetryClient (Bearer + X-Moviie-Client when aplicável) */\n telemetryHeaders: Record<string, string>\n}\n\nconst MoviieContext = createContext<MoviieContextValue | null>(null)\n\nlet fallbackContext: MoviieContextValue | null = null\n\nfunction getOrCreateFallbackContext(): MoviieContextValue {\n if (!fallbackContext) {\n const sdkVersion = MOVIIE_PLAYER_EXPO_PKG_VERSION\n const clientInfo = buildPlatformClientInfo(sdkVersion)\n const viewerTokenStore = new MemoryViewerTokenStore()\n const client = new MoviieClient({\n publishableKey: undefined,\n clientInfo,\n sdkVersion,\n })\n fallbackContext = {\n client,\n viewerTokenStore,\n publishableKey: null,\n clientInfo,\n sdkVersion,\n telemetryHeaders: buildClientHeaders({\n clientInfo,\n sdkVersion,\n }),\n }\n }\n return fallbackContext\n}\n\nexport function useMoviieContext(): MoviieContextValue {\n const ctx = useContext(MoviieContext)\n return ctx ?? getOrCreateFallbackContext()\n}\n\nexport function MoviieProvider({\n publishableKey,\n children,\n}: {\n publishableKey?: string | null\n children: ReactNode\n}) {\n const value = useMemo((): MoviieContextValue => {\n const sdkVersion = MOVIIE_PLAYER_EXPO_PKG_VERSION\n const clientInfo = buildPlatformClientInfo(sdkVersion)\n const trimmedKey = publishableKey?.trim()\n const viewerTokenStore = new SecureStoreViewerTokenStore()\n const client = new MoviieClient({\n publishableKey: trimmedKey || undefined,\n clientInfo,\n sdkVersion,\n })\n const telemetryHeaders = buildClientHeaders({\n publishableKey: trimmedKey || undefined,\n clientInfo,\n sdkVersion,\n })\n return {\n client,\n viewerTokenStore,\n publishableKey: trimmedKey ?? null,\n clientInfo,\n sdkVersion,\n telemetryHeaders,\n }\n }, [publishableKey])\n\n return (\n <MoviieContext.Provider value={value}>{children}</MoviieContext.Provider>\n )\n}\n","import type { MoviiePlaybackData } from \"@moviie/player-sdk\"\n\nimport { MOVIIE_PLAYBACK_MEMORY_CACHE_TTL_MS } from \"../constants\"\n\ninterface CacheEntry {\n data: MoviiePlaybackData\n expiresAt: number\n}\n\nconst playbackCache = new Map<string, CacheEntry>()\n\nfunction cacheKey(scope: string | null | undefined, embedId: string): string {\n return `${scope ?? \"__anon__\"}::${embedId}`\n}\n\nfunction resolveEntryExpiry(data: MoviiePlaybackData): number {\n const now = Date.now()\n const fallback = now + MOVIIE_PLAYBACK_MEMORY_CACHE_TTL_MS\n const serverExpiry = data.playback?.expiresAt\n if (!serverExpiry) return fallback\n const parsed = Date.parse(serverExpiry)\n if (!Number.isFinite(parsed)) return fallback\n return Math.min(fallback, parsed)\n}\n\nexport function readPlaybackCache(\n scope: string | null | undefined,\n embedId: string\n): MoviiePlaybackData | null {\n const key = cacheKey(scope, embedId)\n const hit = playbackCache.get(key)\n if (!hit || hit.expiresAt <= Date.now()) {\n playbackCache.delete(key)\n return null\n }\n return hit.data\n}\n\nexport function writePlaybackCache(\n scope: string | null | undefined,\n embedId: string,\n data: MoviiePlaybackData\n): void {\n playbackCache.set(cacheKey(scope, embedId), {\n data,\n expiresAt: resolveEntryExpiry(data),\n })\n}\n\nexport function clearPlaybackMemoryCache(): void {\n playbackCache.clear()\n}\n","import type { MoviiePlaybackData } from \"@moviie/player-sdk\"\n\nimport { writePlaybackCache } from \"./playback-memory-cache\"\n\nexport async function fetchPlaybackFreshWriteCache(\n scope: string | null | undefined,\n embedId: string,\n signal: AbortSignal,\n getPlayback: (\n embedId: string,\n signal: AbortSignal,\n ) => Promise<MoviiePlaybackData>,\n): Promise<\n { ok: true; data: MoviiePlaybackData } | { ok: false; error: Error }\n> {\n try {\n const data = await getPlayback(embedId, signal)\n writePlaybackCache(scope, embedId, data)\n return { ok: true, data }\n } catch (unknownError) {\n const error =\n unknownError instanceof Error\n ? unknownError\n : new Error(String(unknownError))\n return { ok: false, error }\n }\n}\n","import { useCallback, useEffect, useState } from \"react\"\n\nimport type { MoviiePlaybackData } from \"@moviie/player-sdk\"\n\nimport { fetchPlaybackFreshWriteCache } from \"../playback/fetch-playback-fresh\"\nimport { readPlaybackCache } from \"../playback/playback-memory-cache\"\nimport { useMoviieContext } from \"../provider/moviie-provider\"\n\nexport interface UseMoviiePlaybackArgs {\n /** Public embed UUID — client SDK never calls admin APIs or private keys. */\n embedId?: string\n}\n\nexport interface UseMoviiePlaybackResult {\n data: MoviiePlaybackData | null\n error: Error | null\n isLoading: boolean\n retry: () => void\n}\n\nexport function useMoviiePlayback(\n args: UseMoviiePlaybackArgs\n): UseMoviiePlaybackResult {\n const trimmedEmbedId = args.embedId?.trim()\n const missingEmbedId = !trimmedEmbedId\n const { client, publishableKey } = useMoviieContext()\n\n const [data, setData] = useState<MoviiePlaybackData | null>(null)\n const [fetchError, setFetchError] = useState<Error | null>(null)\n const [isLoading, setIsLoading] = useState(!missingEmbedId)\n const [retryNonce, setRetryNonce] = useState(0)\n\n const retry = useCallback(() => {\n setRetryNonce((n) => n + 1)\n }, [])\n\n useEffect(() => {\n if (!trimmedEmbedId) {\n return\n }\n\n const embedKey = trimmedEmbedId\n\n const controller = new AbortController()\n let cancelled = false\n\n async function load(): Promise<void> {\n setIsLoading(true)\n setFetchError(null)\n\n try {\n const cached = readPlaybackCache(publishableKey, embedKey)\n if (cached && !controller.signal.aborted) {\n setData(cached)\n }\n\n const outcome = await fetchPlaybackFreshWriteCache(\n publishableKey,\n embedKey,\n controller.signal,\n (id, sig) => client.getPlayback(id, sig),\n )\n\n if (cancelled || controller.signal.aborted) {\n return\n }\n\n if (outcome.ok) {\n setData(outcome.data)\n } else {\n setFetchError(outcome.error)\n setData(readPlaybackCache(publishableKey, embedKey))\n }\n } finally {\n if (!cancelled && !controller.signal.aborted) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [trimmedEmbedId, client, publishableKey, retryNonce])\n\n const error = missingEmbedId\n ? new Error(\"Informe um embedId válido (UUID público do embed).\")\n : fetchError\n\n return {\n data: missingEmbedId ? null : data,\n error,\n isLoading: missingEmbedId ? false : isLoading,\n retry,\n }\n}\n","import { useEffect, useRef } from \"react\"\n\nimport { AppState, type AppStateStatus } from \"react-native\"\nimport type { VideoPlayer } from \"expo-video\"\nimport {\n PLAYBACK_EVENT_TYPE,\n TelemetryClient,\n type MoviiePlaybackData,\n type ViewerTokenStore,\n} from \"@moviie/player-sdk\"\n\nexport function useMoviieTelemetry(\n player: VideoPlayer,\n playback: MoviiePlaybackData | null,\n eventsBaseUrl: string,\n defaultHeaders: Record<string, string>,\n viewerTokenStore: ViewerTokenStore\n): void {\n const hasStartedPlaybackRef = useRef(false)\n\n useEffect(() => {\n if (!playback?.telemetry.bootstrapUrl) {\n return\n }\n\n const telemetry = new TelemetryClient({\n eventsBaseUrl,\n defaultHeaders,\n viewerTokenStore,\n getPositionSeconds: () => player.currentTime,\n })\n\n let disposed = false\n const subs: Array<{ remove: () => void }> = []\n\n void (async () => {\n try {\n await telemetry.bootstrap({\n bootstrapUrl: playback.telemetry.bootstrapUrl,\n })\n if (disposed) {\n return\n }\n await telemetry.recordEvent({\n eventType: PLAYBACK_EVENT_TYPE.SESSION_START,\n positionSeconds: 0,\n })\n } catch {\n /* falha de telemetria não bloqueia playback */\n }\n })()\n\n subs.push(\n player.addListener(\"playingChange\", ({ isPlaying }) => {\n telemetry.updatePosition(Math.max(0, player.currentTime))\n if (isPlaying) {\n void telemetry.recordEvent({\n eventType: hasStartedPlaybackRef.current\n ? PLAYBACK_EVENT_TYPE.RESUME\n : PLAYBACK_EVENT_TYPE.PLAY_START,\n positionSeconds: Math.floor(Math.max(0, player.currentTime)),\n })\n hasStartedPlaybackRef.current = true\n telemetry.startHeartbeats()\n } else {\n void telemetry.recordEvent({\n eventType: PLAYBACK_EVENT_TYPE.PAUSE,\n positionSeconds: Math.floor(Math.max(0, player.currentTime)),\n })\n telemetry.stopHeartbeats()\n }\n })\n )\n\n subs.push(\n player.addListener(\"playToEnd\", () => {\n telemetry.updatePosition(Math.max(0, player.currentTime))\n void telemetry.recordEvent({\n eventType: PLAYBACK_EVENT_TYPE.ENDED,\n positionSeconds: Math.floor(Math.max(0, player.duration)),\n })\n telemetry.stopHeartbeats()\n })\n )\n\n subs.push(\n player.addListener(\"statusChange\", ({ status }) => {\n if (status === \"error\") {\n void telemetry.recordEvent({\n eventType: PLAYBACK_EVENT_TYPE.ERROR,\n positionSeconds: Math.floor(Math.max(0, player.currentTime)),\n errorCode: \"player_status_error\",\n })\n }\n })\n )\n\n subs.push(\n player.addListener(\"timeUpdate\", ({ currentTime }) => {\n telemetry.updatePosition(Math.max(0, currentTime))\n })\n )\n\n const appStateSub = AppState.addEventListener(\n \"change\",\n (next: AppStateStatus) => {\n if (next === \"active\") {\n telemetry.resumeHeartbeats()\n } else {\n telemetry.pauseHeartbeats()\n void telemetry.flush()\n }\n }\n )\n\n return () => {\n disposed = true\n hasStartedPlaybackRef.current = false\n subs.forEach((s) => {\n s.remove()\n })\n appStateSub.remove()\n void telemetry.destroy()\n }\n }, [\n player,\n playback?.embedId,\n playback?.telemetry.bootstrapUrl,\n eventsBaseUrl,\n defaultHeaders,\n viewerTokenStore,\n ])\n}\n","import { MOVIIE_REMEMBER_POSITION_STORAGE_PREFIX } from '../constants'\nimport { warnOnce } from './warn-once'\n\nconst RESUME_SECURE_STORE_MISSING_WARNING =\n '[@moviie/player-expo] `expo-secure-store` não está instalado — resume position não será persistido. ' +\n 'Instala com `pnpm add expo-secure-store` se quiseres retomar onde o utilizador parou.'\n\nconst SECURE_STORE_KEY_SAFE_PATTERN = /^[A-Za-z0-9._-]+$/\n\nfunction isSecureStoreSafeEmbedId(embedId: string): boolean {\n return SECURE_STORE_KEY_SAFE_PATTERN.test(embedId)\n}\n\nexport function rememberPlaybackPositionStorageKey(embedId: string): string {\n return `${MOVIIE_REMEMBER_POSITION_STORAGE_PREFIX}${embedId}`\n}\n\nexport function parseStoredResumeSeconds(raw: string | null): number | null {\n if (raw == null || raw === '') {\n return null\n }\n const n = Number(raw)\n if (!Number.isFinite(n) || n < 0) {\n return null\n }\n return n\n}\n\nexport function clampResumeTimeSeconds(\n seconds: number | null,\n durationSeconds: number | null | undefined\n): number | null {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0.25) {\n return null\n }\n if (durationSeconds != null && Number.isFinite(durationSeconds) && durationSeconds > 0) {\n if (seconds >= durationSeconds - 1) {\n return null\n }\n return Math.min(seconds, durationSeconds - 0.25)\n }\n return seconds\n}\n\nasync function loadSecureStore(): Promise<typeof import('expo-secure-store') | null> {\n try {\n return await import('expo-secure-store')\n } catch {\n warnOnce('moviie:expo-secure-store-missing-resume', RESUME_SECURE_STORE_MISSING_WARNING)\n return null\n }\n}\n\nexport async function readStoredResumeSeconds(embedId: string): Promise<number | null> {\n if (!isSecureStoreSafeEmbedId(embedId)) {\n return null\n }\n const SecureStore = await loadSecureStore()\n if (!SecureStore) {\n return null\n }\n try {\n const raw = await SecureStore.getItemAsync(rememberPlaybackPositionStorageKey(embedId))\n return parseStoredResumeSeconds(raw)\n } catch {\n return null\n }\n}\n\nexport async function writeStoredResumeSeconds(embedId: string, seconds: number): Promise<void> {\n if (!isSecureStoreSafeEmbedId(embedId)) {\n return\n }\n const SecureStore = await loadSecureStore()\n if (!SecureStore) {\n return\n }\n try {\n await SecureStore.setItemAsync(rememberPlaybackPositionStorageKey(embedId), String(seconds))\n } catch {\n return\n }\n}\n\nexport async function clearStoredResumeSeconds(embedId: string): Promise<void> {\n if (!isSecureStoreSafeEmbedId(embedId)) {\n return\n }\n const SecureStore = await loadSecureStore()\n if (!SecureStore) {\n return\n }\n try {\n await SecureStore.deleteItemAsync(rememberPlaybackPositionStorageKey(embedId))\n } catch {\n return\n }\n}\n","import { useEffect, useRef } from \"react\"\n\nimport type { VideoPlayer } from \"expo-video\"\n\nimport { MOVIIE_REMEMBER_POSITION_DEBOUNCE_MS } from \"../constants\"\nimport {\n clampResumeTimeSeconds,\n clearStoredResumeSeconds,\n writeStoredResumeSeconds,\n} from \"../lib/remember-playback-position-storage\"\n\nexport function useMoviiePlaybackResumePersistence(options: {\n player: VideoPlayer\n embedId: string | undefined\n durationSeconds: number | null | undefined\n enabled: boolean\n}): void {\n const { player, embedId, durationSeconds, enabled } = options\n\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n if (!enabled || embedId == null || embedId === \"\") {\n return\n }\n\n const clearDebounce = () => {\n if (debounceTimerRef.current != null) {\n clearTimeout(debounceTimerRef.current)\n debounceTimerRef.current = null\n }\n }\n\n const persistNow = (seconds: number) => {\n const clamped = clampResumeTimeSeconds(seconds, durationSeconds)\n if (clamped == null) {\n void clearStoredResumeSeconds(embedId)\n return\n }\n void writeStoredResumeSeconds(embedId, clamped)\n }\n\n const schedulePersist = (seconds: number) => {\n clearDebounce()\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null\n persistNow(seconds)\n }, MOVIIE_REMEMBER_POSITION_DEBOUNCE_MS)\n }\n\n const subTime = player.addListener(\"timeUpdate\", ({ currentTime }) => {\n if (player.playing) {\n schedulePersist(currentTime)\n }\n })\n\n const subPlaying = player.addListener(\"playingChange\", ({ isPlaying }) => {\n if (!isPlaying) {\n clearDebounce()\n persistNow(player.currentTime)\n }\n })\n\n const subEnd = player.addListener(\"playToEnd\", () => {\n clearDebounce()\n void clearStoredResumeSeconds(embedId)\n })\n\n return () => {\n clearDebounce()\n subTime.remove()\n subPlaying.remove()\n subEnd.remove()\n }\n }, [durationSeconds, embedId, enabled, player])\n}\n","import { MOVIIE_PLAYBACK_PROFILE } from \"../constants\"\n\nexport type MoviieVideoPresentationProps = {\n allowsPictureInPicture: boolean\n startsPictureInPictureAutomatically: boolean\n requiresLinearPlayback: boolean\n}\n\nexport interface BuildMoviieVideoPresentationArgs {\n profile: string\n showPip: boolean\n /**\n * Integrator override: when set, replaces embed `showPip` for `allowsPictureInPicture`.\n * When omitted, `showPip` is used.\n */\n pictureInPicture?: boolean\n /**\n * Integrator override for `startsPictureInPictureAutomatically`.\n * When omitted, defaults to `false` (no embed field today).\n */\n pictureInPictureAutoStart?: boolean\n}\n\n/**\n * Maps embed playback flags onto `VideoView` presentation props.\n * Optional fields let integrators override embed defaults explicitly; omit them to follow the API.\n */\nexport function buildMoviieVideoPresentationProps(\n args: BuildMoviieVideoPresentationArgs\n): MoviieVideoPresentationProps {\n const allowsPictureInPicture =\n args.pictureInPicture !== undefined\n ? args.pictureInPicture\n : args.showPip\n\n return {\n allowsPictureInPicture,\n startsPictureInPictureAutomatically:\n args.pictureInPictureAutoStart ?? false,\n requiresLinearPlayback: args.profile === MOVIIE_PLAYBACK_PROFILE.VSL,\n }\n}\n","import { useEffect, useMemo, useRef } from \"react\"\n\nimport { useVideoPlayer } from \"expo-video\"\nimport type { VideoPlayer } from \"expo-video\"\nimport type { VideoSource } from \"expo-video\"\n\nimport {\n deriveTelemetryEventsBaseUrlFromBootstrapUrl,\n type MoviiePlaybackData,\n} from \"@moviie/player-sdk\"\n\nimport { useMoviiePlayback } from \"./use-moviie-playback\"\nimport { useMoviieTelemetry } from \"./use-moviie-telemetry\"\nimport { useMoviiePlaybackResumePersistence } from \"./use-moviie-playback-resume-persistence\"\nimport { useMoviieContext } from \"../provider/moviie-provider\"\nimport {\n buildMoviieVideoPresentationProps,\n type MoviieVideoPresentationProps,\n} from \"../lib/build-moviie-video-presentation\"\nimport {\n clampResumeTimeSeconds,\n readStoredResumeSeconds,\n} from \"../lib/remember-playback-position-storage\"\n\nimport type {\n UseMoviiePlayerOptions,\n UseMoviiePlayerResult,\n} from \"./use-moviie-player-types\"\n\nexport type {\n UseMoviiePlayerOptions,\n UseMoviiePlayerResult,\n} from \"./use-moviie-player-types\"\n\nconst PLAYBACK_REQUEST_HEADER_ALLOWLIST = new Set([\n \"authorization\",\n \"referer\",\n \"user-agent\",\n \"x-moviie-playback-token\",\n \"x-moviie-signature\",\n \"x-playback-token\",\n])\n\nfunction filterPlaybackRequestHeaders(\n raw: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (!raw) return undefined\n const safe: Record<string, string> = {}\n for (const [name, value] of Object.entries(raw)) {\n if (typeof name !== \"string\" || typeof value !== \"string\") continue\n if (!PLAYBACK_REQUEST_HEADER_ALLOWLIST.has(name.toLowerCase())) continue\n if (/[\\r\\n]/.test(value)) continue\n safe[name] = value\n }\n return Object.keys(safe).length > 0 ? safe : undefined\n}\n\nfunction buildVideoSource(data: MoviiePlaybackData): VideoSource {\n const headers = filterPlaybackRequestHeaders(data.playback.requestHeaders)\n const base: VideoSource = {\n uri: data.playback.uri,\n metadata: {\n title: data.title,\n artist: data.branding.organizationName ?? undefined,\n artwork: data.posterUrl ?? undefined,\n },\n }\n if (headers) {\n return { ...base, headers }\n }\n return base\n}\n\nfunction configurePlaybackDefaults(\n player: VideoPlayer,\n data: MoviiePlaybackData\n): void {\n const c = data.controls\n player.loop = c.loop\n player.muted = c.muted\n player.timeUpdateEventInterval = 1\n}\n\nfunction applyNativePlaybackPresentation(\n player: VideoPlayer,\n opts: Pick<UseMoviiePlayerOptions, \"backgroundPlayback\" | \"lockScreenNowPlaying\">\n): void {\n player.staysActiveInBackground = opts.backgroundPlayback ?? false\n player.showNowPlayingNotification = opts.lockScreenNowPlaying ?? false\n}\n\nfunction syncPlaybackIntent(player: VideoPlayer, shouldPlay: boolean): void {\n if (shouldPlay) {\n player.play()\n } else {\n player.pause()\n }\n}\n\nconst EMPTY_PRESENTATION = buildMoviieVideoPresentationProps({\n profile: \"\",\n showPip: false,\n})\n\nexport function useMoviiePlayer(\n options: UseMoviiePlayerOptions\n): UseMoviiePlayerResult {\n const ctx = useMoviieContext()\n\n const { data, error, isLoading, retry } = useMoviiePlayback({\n embedId: options.embedId,\n })\n\n const rememberEnabled = useMemo(() => {\n if (options.rememberPosition === false) {\n return false\n }\n if (options.rememberPosition === true) {\n return true\n }\n return data?.controls.rememberPosition === true\n }, [data?.controls.rememberPosition, options.rememberPosition])\n\n const player = useVideoPlayer(null, (initialPlayer) => {\n initialPlayer.timeUpdateEventInterval = 1\n })\n\n useMoviiePlaybackResumePersistence({\n durationSeconds: data?.durationSeconds,\n embedId: data?.embedId,\n enabled: rememberEnabled && data != null,\n player,\n })\n\n const resumeHandledRef = useRef(false)\n\n useEffect(() => {\n resumeHandledRef.current = false\n }, [data?.embedId, data?.playback.uri])\n\n useEffect(() => {\n if (!data) {\n return\n }\n\n const src = buildVideoSource(data)\n const shouldPlay =\n options.autoplay !== undefined\n ? options.autoplay\n : data.controls.autoplay\n\n player.replace(src)\n configurePlaybackDefaults(player, data)\n applyNativePlaybackPresentation(player, {\n backgroundPlayback: options.backgroundPlayback,\n lockScreenNowPlaying: options.lockScreenNowPlaying,\n })\n\n const restoreAndSync = async () => {\n if (player.status !== \"readyToPlay\") {\n return\n }\n\n if (!resumeHandledRef.current) {\n resumeHandledRef.current = true\n if (rememberEnabled) {\n const stored = await readStoredResumeSeconds(data.embedId)\n const clamped = clampResumeTimeSeconds(stored, data.durationSeconds)\n if (clamped != null) {\n player.currentTime = clamped\n }\n }\n }\n\n syncPlaybackIntent(player, shouldPlay)\n }\n\n const sub = player.addListener(\"statusChange\", (payload) => {\n if (payload.status === \"readyToPlay\") {\n void restoreAndSync()\n }\n })\n\n void restoreAndSync()\n\n return () => {\n sub.remove()\n }\n }, [\n data,\n player,\n options.autoplay,\n options.backgroundPlayback,\n options.lockScreenNowPlaying,\n rememberEnabled,\n ])\n\n const videoPresentation = useMemo((): MoviieVideoPresentationProps => {\n if (!data) {\n return EMPTY_PRESENTATION\n }\n return buildMoviieVideoPresentationProps({\n pictureInPicture: options.pictureInPicture,\n pictureInPictureAutoStart: options.pictureInPictureAutoStart,\n profile: data.profile,\n showPip: data.controls.showPip,\n })\n }, [\n data,\n options.pictureInPicture,\n options.pictureInPictureAutoStart,\n ])\n\n const eventsBaseUrl =\n data?.telemetry.bootstrapUrl != null\n ? deriveTelemetryEventsBaseUrlFromBootstrapUrl(data.telemetry.bootstrapUrl) ??\n ctx.client.getEventsBaseUrl()\n : ctx.client.getEventsBaseUrl()\n\n useMoviieTelemetry(\n player,\n data,\n eventsBaseUrl,\n ctx.telemetryHeaders,\n ctx.viewerTokenStore\n )\n\n return {\n player,\n playback: data,\n error,\n isLoading,\n videoPresentation,\n retry,\n }\n}\n","import { useEffect } from \"react\"\n\nimport type { VideoPlayer } from \"expo-video\"\nimport { PLAYER_API_EVENTS } from \"@moviie/player-types\"\n\ntype PublicPlayerEvent =\n (typeof PLAYER_API_EVENTS)[keyof typeof PLAYER_API_EVENTS]\n\nexport function useMoviieEvent(\n player: VideoPlayer | null,\n eventName: PublicPlayerEvent,\n handler: () => void\n): void {\n useEffect(() => {\n if (!player) {\n return\n }\n\n if (eventName === PLAYER_API_EVENTS.TIME_UPDATE) {\n const previousInterval = player.timeUpdateEventInterval\n if (player.timeUpdateEventInterval <= 0) {\n player.timeUpdateEventInterval = 0.25\n }\n const sub = player.addListener(\"timeUpdate\", () => {\n handler()\n })\n return () => {\n sub.remove()\n player.timeUpdateEventInterval = previousInterval\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.PLAY) {\n const sub = player.addListener(\"playingChange\", ({ isPlaying }) => {\n if (isPlaying) {\n handler()\n }\n })\n return () => {\n sub.remove()\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.PAUSE) {\n const sub = player.addListener(\"playingChange\", ({ isPlaying }) => {\n if (!isPlaying) {\n handler()\n }\n })\n return () => {\n sub.remove()\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.ENDED) {\n const sub = player.addListener(\"playToEnd\", () => {\n handler()\n })\n return () => {\n sub.remove()\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.DURATION_CHANGE) {\n const sub = player.addListener(\"sourceChange\", () => {\n handler()\n })\n return () => {\n sub.remove()\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.VOLUME_CHANGE) {\n const sub = player.addListener(\"volumeChange\", () => {\n handler()\n })\n return () => {\n sub.remove()\n }\n }\n\n if (eventName === PLAYER_API_EVENTS.READY) {\n const sub = player.addListener(\"statusChange\", ({ status }) => {\n if (status === \"readyToPlay\") {\n handler()\n }\n })\n return () => {\n sub.remove()\n }\n }\n\n if (\n typeof __DEV__ !== \"undefined\" &&\n __DEV__\n ) {\n console.warn(\n `[@moviie/player-expo] useMoviieEvent: \"${eventName}\" não tem mapeamento para expo-video nesta versão`\n )\n }\n return undefined\n }, [player, eventName, handler])\n}\n","import type { VideoPlayer } from \"expo-video\"\nimport { PLAYER_API_EVENTS } from \"@moviie/player-types\"\n\nimport { useMoviieEvent } from \"./use-moviie-event\"\n\n/**\n * Natural playback end from expo-video (`playToEnd`), aligned with {@link PLAYER_API_EVENTS.ENDED}.\n */\nexport function useMoviiePlaybackEnded(\n player: VideoPlayer | null,\n onEnded: () => void\n): void {\n useMoviieEvent(player, PLAYER_API_EVENTS.ENDED, onEnded)\n}\n","import { MOVIIE_SKIN_TIMELINE_END_SNAP_EPSILON_SECONDS } from \"../constants\"\n\nexport type MoviiePlaybackEndedUiArgs = {\n playing: boolean\n currentTime: number\n duration: number\n isLive: boolean\n loop: boolean\n}\n\nexport function computeMoviiePlaybackEnded(args: MoviiePlaybackEndedUiArgs): boolean {\n if (args.loop) {\n return false\n }\n if (args.isLive) {\n return false\n }\n if (args.playing) {\n return false\n }\n if (!Number.isFinite(args.duration) || args.duration <= 0) {\n return false\n }\n if (!Number.isFinite(args.currentTime)) {\n return false\n }\n return (\n args.currentTime >=\n args.duration - MOVIIE_SKIN_TIMELINE_END_SNAP_EPSILON_SECONDS\n )\n}\n","import type { VideoPlayer } from \"expo-video\"\n\nexport type MoviiePlaybackEndedSubscription = {\n remove: () => void\n}\n\n/**\n * Imperative listener for expo-video `playToEnd`. Prefer {@link useMoviiePlaybackEnded} in React components.\n */\nexport function addMoviiePlaybackEndedListener(\n player: VideoPlayer,\n onEnded: () => void\n): MoviiePlaybackEndedSubscription {\n const sub = player.addListener(\"playToEnd\", onEnded)\n return { remove: () => sub.remove() }\n}\n","import { MOVIIE_WATCH_ORIGIN_DEFAULT } from \"../constants\"\n\nexport function normalizeWatchOrigin(origin: string): string {\n return origin.trim().replace(/\\/+$/, \"\")\n}\n\nexport function buildMoviieWatchEmbedUrl(embedId: string, watchOrigin: string): string {\n const base = normalizeWatchOrigin(watchOrigin)\n const id = embedId.trim()\n return `${base}/embed/${encodeURIComponent(id)}`\n}\n\n/**\n * Resolve o origin público da página watch/embed.\n * Usa `process.env.EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN` quando definido (nome documentado como `EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN_ENV` em `@moviie/player-expo`).\n */\nexport function resolveMoviieWatchOrigin(): string {\n try {\n const raw =\n typeof process !== \"undefined\"\n ? process.env.EXPO_PUBLIC_MOVIIE_WATCH_ORIGIN?.trim()\n : undefined\n if (raw) {\n return normalizeWatchOrigin(raw)\n }\n } catch {\n /* ignore */\n }\n return MOVIIE_WATCH_ORIGIN_DEFAULT\n}\n","import type { ComponentPropsWithRef, ComponentType, PropsWithChildren } from 'react'\nimport { Animated as RNAnimated, View, type ViewProps } from 'react-native'\nimport AnimatedReanimated from 'react-native-reanimated'\nimport type { AnimateProps } from 'react-native-reanimated'\nimport RNSvg, {\n Defs as RNDefs,\n LinearGradient as RNLinearGradient,\n Path as RNPath,\n Rect as RNRect,\n Stop as RNStop,\n Text as RNText,\n} from 'react-native-svg'\nimport type {\n LinearGradientProps,\n PathProps,\n RectProps,\n StopProps,\n SvgProps,\n TextProps,\n} from 'react-native-svg'\n\ntype RNCoreAnimatedViewProps = RNAnimated.AnimatedProps<ComponentPropsWithRef<typeof View>>\n\ntype ReanimatedViewBridgeProps = AnimateProps<ViewProps>\n\nexport const Svg = RNSvg as unknown as ComponentType<SvgProps>\n\nexport default Svg\n\nexport const Path = RNPath as unknown as ComponentType<PathProps>\n\nexport const Defs = RNDefs as unknown as ComponentType<PropsWithChildren>\n\nexport const LinearGradient = RNLinearGradient as unknown as ComponentType<LinearGradientProps>\n\nexport const Rect = RNRect as unknown as ComponentType<RectProps>\n\nexport const Stop = RNStop as unknown as ComponentType<StopProps>\n\nexport const SvgText = RNText as unknown as ComponentType<TextProps>\n\nexport const AnimatedView = RNAnimated.View as unknown as ComponentType<RNCoreAnimatedViewProps>\n\nexport const ReanimatedView =\n AnimatedReanimated.View as unknown as ComponentType<ReanimatedViewBridgeProps>\n","/**\n * Hooks opt-in para telemetria do consumer (Sentry, PostHog, Datadog, etc.).\n *\n * `@moviie/player-expo` já envia telemetria interna para o backend Moviie via\n * `TelemetryClient` (impressions, playback duration). Estes callbacks servem\n * exclusivamente para o consumer também observar eventos em **sua própria**\n * pipeline de monitoring — não substituem nem ampliam a telemetria interna.\n *\n * **Garantias**:\n * - Callbacks são síncronos e não-bloqueantes: exceções neles são engolidas e\n * loggadas via `console.warn` (não derrubam o player).\n * - Sem PII: eventos só carregam `embedId` público e métricas técnicas.\n * - Cada evento é entregue at-most-once por ciclo de vida do player.\n */\n\nexport type MoviieTelemetryErrorPhase =\n /** Falha ao carregar metadata de playback (`useMoviiePlayback`). */\n | 'playback_fetch'\n /** Falha durante reprodução (network stall, decode error, DRM, etc.). */\n | 'playback_runtime'\n /** Falha capturada pelo `MoviieErrorBoundary` (render/effect throw). */\n | 'render_boundary'\n\nexport interface MoviieTelemetryErrorContext {\n /** UUID público do embed em causa, se disponível. */\n embedId?: string\n /** Categorização da fase onde o erro ocorreu. */\n phase: MoviieTelemetryErrorPhase\n /** Código de erro classificado pelo SDK (quando aplicável). */\n code?: string\n}\n\nexport type MoviieTelemetryLifecycleEventName =\n | 'playback_loaded'\n | 'playback_started'\n | 'playback_paused'\n | 'playback_seeking'\n | 'playback_ended'\n | 'fullscreen_enter'\n | 'fullscreen_exit'\n | 'pip_enter'\n | 'pip_exit'\n | 'cast_session_started'\n | 'cast_session_ended'\n\nexport interface MoviieTelemetryLifecycleEvent {\n name: MoviieTelemetryLifecycleEventName\n embedId?: string\n /** Posição (segundos) no momento do evento, quando relevante. */\n positionSeconds?: number\n /** Duração total (segundos) quando conhecida. */\n durationSeconds?: number\n}\n\nexport type MoviieTelemetryOnError = (error: Error, context: MoviieTelemetryErrorContext) => void\n\nexport type MoviieTelemetryOnEvent = (event: MoviieTelemetryLifecycleEvent) => void\n\n/**\n * Helper para invocar callbacks de consumer sem deixar exceções escalar.\n * Use em vez de chamar `onError` / `onEvent` diretamente do hook/efeito.\n */\nexport function safeInvokeMoviieTelemetry<TArgs extends unknown[]>(\n callback: ((...args: TArgs) => void) | undefined,\n ...args: TArgs\n): void {\n if (callback == null) {\n return\n }\n try {\n callback(...args)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[@moviie/player-expo] telemetry callback threw — ignorado', err)\n }\n}\n","export const MOVIIE_SHELL_BACKGROUND_HEX = \"#0a0a0a\" as const\nexport const MOVIIE_SHELL_RADIAL_INNER_HEX = \"#1a1a1a\" as const\nexport const MOVIIE_SHELL_RADIAL_OUTER_HEX = \"#000000\" as const\n\nexport const MOVIIE_SHELL_HEADING_HEX = \"#f8fafc\" as const\nexport const MOVIIE_SHELL_DESCRIPTION_HEX = \"#e5e7eb\" as const\nexport const MOVIIE_SHELL_ERROR_CODE_HEX = \"#4b5563\" as const\n\nexport const MOVIIE_SHELL_BUTTON_BG_HEX = \"#0a0a0a\" as const\nexport const MOVIIE_SHELL_BUTTON_BORDER_RGBA = \"rgba(255,255,255,0.15)\" as const\nexport const MOVIIE_SHELL_BUTTON_LABEL_HEX = \"#f8fafc\" as const\n\nexport const MOVIIE_SHELL_HEADING_FONT_SIZE_PX = 22 as const\nexport const MOVIIE_SHELL_DESCRIPTION_FONT_SIZE_PX = 14 as const\nexport const MOVIIE_SHELL_BUTTON_LABEL_FONT_SIZE_PX = 14 as const\n\nexport const MOVIIE_SHELL_CONTENT_MAX_WIDTH_PX = 280 as const\n\nexport const MOVIIE_SHELL_BUTTON_PADDING_H_PX = 22 as const\nexport const MOVIIE_SHELL_BUTTON_PADDING_V_PX = 12 as const\nexport const MOVIIE_SHELL_BUTTON_RADIUS_PX = 9999 as const\n\nexport const MOVIIE_SHELL_CROSSFADE_DURATION_MS = 240 as const\n\nexport const MOVIIE_SHELL_DEFAULT_ASPECT_RATIO = 16 / 9\n\nexport const MOVIIE_DASHBOARD_URL = \"https://app.moviie.ai\" as const\n","import type { ViewStyle } from \"react-native\"\n\ntype LooseViewStyle = Record<string, unknown>\n\n/** Props visuais da área do vídeo — não devem envolver a faixa de progresso abaixo do vídeo. */\nconst VIDEO_SURFACE_STYLE_KEYS = new Set([\n \"backgroundColor\",\n \"borderRadius\",\n \"borderTopLeftRadius\",\n \"borderTopRightRadius\",\n \"borderBottomLeftRadius\",\n \"borderBottomRightRadius\",\n \"borderCurve\",\n \"borderWidth\",\n \"borderColor\",\n])\n\n/**\n * Espera `flatStyle` já planificado com `StyleSheet.flatten` no runtime RN\n * (resolve IDs devolvidos por `StyleSheet.create`).\n */\nexport function partitionMoviieVideoHostStyle(\n flatStyle: ViewStyle | undefined | null\n): {\n columnStyle: ViewStyle | undefined\n surfaceStyle: ViewStyle | undefined\n} {\n if (flatStyle == null || Object.keys(flatStyle).length === 0) {\n return { columnStyle: undefined, surfaceStyle: undefined }\n }\n\n const flat = flatStyle as LooseViewStyle\n const column: LooseViewStyle = {}\n const surface: LooseViewStyle = {}\n\n for (const key of Object.keys(flat)) {\n const value = flat[key]\n if (value === undefined) {\n continue\n }\n if (VIDEO_SURFACE_STYLE_KEYS.has(key)) {\n surface[key] = value\n } else {\n column[key] = value\n }\n }\n\n return {\n columnStyle:\n Object.keys(column).length > 0 ? (column as ViewStyle) : undefined,\n surfaceStyle:\n Object.keys(surface).length > 0 ? (surface as ViewStyle) : undefined,\n }\n}\n","import type { EdgeInsets } from \"react-native-safe-area-context\"\n\nexport type CustomFullscreenStageDimensions = {\n longSide: number\n shortSide: number\n layoutMetricsBasisWidth: number\n}\n\nexport function computeCustomFullscreenStageDimensions(args: {\n windowWidth: number\n windowHeight: number\n safeInsets: EdgeInsets\n stageOverscanPx: number\n}): CustomFullscreenStageDimensions {\n const pad = args.stageOverscanPx\n const usableW = Math.max(\n 0,\n args.windowWidth -\n args.safeInsets.left -\n args.safeInsets.right -\n 2 * pad\n )\n const usableH = Math.max(\n 0,\n args.windowHeight -\n args.safeInsets.top -\n args.safeInsets.bottom -\n 2 * pad\n )\n\n const longSide = Math.max(usableW, usableH)\n const shortSide = Math.min(usableW, usableH)\n\n return {\n longSide,\n shortSide,\n layoutMetricsBasisWidth: longSide,\n }\n}\n","import type { MoviieCastAdapter } from './moviie-cast-adapter'\n\nlet _registered: MoviieCastAdapter | null = null\n\n/** Called automatically when `@moviie/player-expo/cast` is imported. */\nexport function _registerCastAdapter(adapter: MoviieCastAdapter): void {\n _registered = adapter\n}\n\n/** Returns the auto-registered adapter, or null if cast subpath was never imported. */\nexport function getRegisteredCastAdapter(): MoviieCastAdapter | null {\n return _registered\n}\n","function pad2(value: number): string {\n return String(Math.floor(value)).padStart(2, \"0\")\n}\n\nfunction formatSegment(totalSeconds: number): string {\n if (!Number.isFinite(totalSeconds) || totalSeconds < 0) {\n return \"0:00\"\n }\n const seconds = totalSeconds % 60\n const minutes = Math.floor(totalSeconds / 60) % 60\n const hours = Math.floor(totalSeconds / 3600)\n if (hours > 0) {\n return `${hours}:${pad2(minutes)}:${pad2(seconds)}`\n }\n return `${Math.floor(minutes)}:${pad2(seconds)}`\n}\n\nexport function formatPlaybackClock(\n currentSeconds: number,\n durationSeconds: number\n): string {\n const current = formatSegment(currentSeconds)\n if (!Number.isFinite(durationSeconds) || durationSeconds <= 0) {\n return current\n }\n return `${current} / ${formatSegment(durationSeconds)}`\n}\n","/**\n * Ícones alinhados ao embed web (Vidstack + media-icons).\n * Paths copiados de `media-icons@1.1.5` (`dist/icons/*.js`), mesma família que o iframe carrega via\n * `MEDIA_ICONS_MODULE` em apps/web/src/app/embed/[id]/constants.ts.\n */\n\nimport type { ReactNode } from 'react'\nimport Svg, { Path } from '../../lib/jsx-native-bridge'\n\nexport const MOVIIE_EMBED_MEDIA_ICON_VIEW_BOX = '0 0 32 32' as const\n\nexport interface EmbedMediaIconBaseProps {\n size?: number\n color: string\n}\n\nfunction IconShell({\n size,\n children,\n}: Pick<EmbedMediaIconBaseProps, 'size'> & { children: ReactNode }) {\n const pixels = size ?? 22\n return (\n <Svg\n accessibilityElementsHidden\n height={pixels}\n importantForAccessibility=\"no\"\n viewBox={MOVIIE_EMBED_MEDIA_ICON_VIEW_BOX}\n width={pixels}\n >\n {children}\n </Svg>\n )\n}\n\n// ─── Playback ──────────────────────────────────────────────────────────────\n\nexport function EmbedMediaIconPlay(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M10.6667 6.6548C10.6667 6.10764 11.2894 5.79346 11.7295 6.11862L24.377 15.4634C24.7377 15.7298 24.7377 16.2692 24.3771 16.5357L11.7295 25.8813C11.2895 26.2065 10.6667 25.8923 10.6667 25.3451L10.6667 6.6548Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\nexport function EmbedMediaIconPause(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M8.66667 6.66667C8.29848 6.66667 8 6.96514 8 7.33333V24.6667C8 25.0349 8.29848 25.3333 8.66667 25.3333H12.6667C13.0349 25.3333 13.3333 25.0349 13.3333 24.6667V7.33333C13.3333 6.96514 13.0349 6.66667 12.6667 6.66667H8.66667Z\"\n fill={props.color}\n />\n <Path\n d=\"M19.3333 6.66667C18.9651 6.66667 18.6667 6.96514 18.6667 7.33333V24.6667C18.6667 25.0349 18.9651 25.3333 19.3333 25.3333H23.3333C23.7015 25.3333 24 25.0349 24 24.6667V7.33333C24 6.96514 23.7015 6.66667 23.3333 6.66667H19.3333Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\n/** Ícone `replay` (media-icons 1.1.5), espelhado no embed web. */\nexport function EmbedMediaIconReplay(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M15.6038 12.2147C16.0439 12.5399 16.6667 12.2257 16.6667 11.6786V10.1789C16.6667 10.1001 16.7351 10.0384 16.8134 10.0479C20.1116 10.4494 22.6667 13.2593 22.6667 16.6659C22.6667 20.3481 19.6817 23.3332 15.9995 23.3332C12.542 23.3332 9.69927 20.7014 9.36509 17.332C9.32875 16.9655 9.03371 16.6662 8.66548 16.6662L6.66655 16.6666C6.29841 16.6666 5.99769 16.966 6.02187 17.3334C6.36494 22.5454 10.7012 26.6667 16 26.6667C21.5228 26.6667 26 22.1895 26 16.6667C26 11.4103 21.9444 7.10112 16.7916 6.69757C16.7216 6.69209 16.6667 6.63396 16.6667 6.56372V4.98824C16.6667 4.44106 16.0439 4.12689 15.6038 4.45206L11.0765 7.79738C10.7159 8.06387 10.7159 8.60326 11.0766 8.86973L15.6038 12.2147Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\n// ─── Seek ──────────────────────────────────────────────────────────────────\n\n/** Ícone `seek-backward-10` (media-icons 1.1.5), espelhado no embed web. */\nexport function EmbedMediaIconSeekBackward10(props: EmbedMediaIconBaseProps) {\n const fill = props.color\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M16.6667 10.3452C16.6667 10.8924 16.0439 11.2066 15.6038 10.8814L11.0766 7.5364C10.7159 7.26993 10.7159 6.73054 11.0766 6.46405L15.6038 3.11873C16.0439 2.79356 16.6667 3.10773 16.6667 3.6549V5.22682C16.6667 5.29746 16.7223 5.35579 16.7927 5.36066C22.6821 5.76757 27.3333 10.674 27.3333 16.6667C27.3333 22.9259 22.2592 28 16 28C9.96483 28 5.03145 23.2827 4.68601 17.3341C4.66466 16.9665 4.96518 16.6673 5.33339 16.6673H7.3334C7.70157 16.6673 7.99714 16.9668 8.02743 17.3337C8.36638 21.4399 11.8064 24.6667 16 24.6667C20.4183 24.6667 24 21.085 24 16.6667C24 12.5225 20.8483 9.11428 16.8113 8.70739C16.7337 8.69957 16.6667 8.76096 16.6667 8.83893V10.3452Z\"\n fill={fill}\n />\n <Path\n clipRule=\"evenodd\"\n d=\"M17.0879 19.679C17.4553 19.9195 17.8928 20.0398 18.4004 20.0398C18.9099 20.0398 19.3474 19.9205 19.7129 19.6818C20.0803 19.4413 20.3635 19.0938 20.5623 18.6392C20.7612 18.1847 20.8606 17.6373 20.8606 16.9972C20.8625 16.3608 20.764 15.8192 20.5652 15.3722C20.3663 14.9252 20.0822 14.5853 19.7129 14.3523C19.3455 14.1175 18.908 14 18.4004 14C17.8928 14 17.4553 14.1175 17.0879 14.3523C16.7224 14.5853 16.4402 14.9252 16.2413 15.3722C16.0443 15.8173 15.9449 16.3589 15.943 16.9972C15.9411 17.6354 16.0396 18.1818 16.2385 18.6364C16.4373 19.089 16.7205 19.4366 17.0879 19.679ZM19.1362 18.4262C18.9487 18.7349 18.7034 18.8892 18.4004 18.8892C18.1996 18.8892 18.0226 18.8211 17.8691 18.6847C17.7157 18.5464 17.5964 18.3372 17.5112 18.0568C17.4279 17.7765 17.3871 17.4233 17.389 16.9972C17.3909 16.3684 17.4847 15.9025 17.6703 15.5995C17.8559 15.2945 18.0993 15.1421 18.4004 15.1421C18.603 15.1421 18.7801 15.2093 18.9316 15.3438C19.0832 15.4782 19.2015 15.6828 19.2868 15.9574C19.372 16.2301 19.4146 16.5767 19.4146 16.9972C19.4165 17.6392 19.3237 18.1156 19.1362 18.4262Z\"\n fill={fill}\n fillRule=\"evenodd\"\n />\n <Path\n d=\"M13.7746 19.8978C13.8482 19.8978 13.9079 19.8381 13.9079 19.7644V14.2129C13.9079 14.1393 13.8482 14.0796 13.7746 14.0796H12.642C12.6171 14.0796 12.5927 14.0865 12.5716 14.0997L11.2322 14.9325C11.1931 14.9568 11.1693 14.9996 11.1693 15.0457V15.9497C11.1693 16.0539 11.2833 16.1178 11.3722 16.0635L12.464 15.396C12.4682 15.3934 12.473 15.3921 12.4779 15.3921C12.4926 15.3921 12.5045 15.404 12.5045 15.4187V19.7644C12.5045 19.8381 12.5642 19.8978 12.6378 19.8978H13.7746Z\"\n fill={fill}\n />\n </IconShell>\n )\n}\n\n/** Ícone `seek-forward-10` (media-icons 1.1.5), espelhado no embed web. */\nexport function EmbedMediaIconSeekForward10(props: EmbedMediaIconBaseProps) {\n const fill = props.color\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M15.3333 10.3452C15.3333 10.8924 15.9561 11.2066 16.3962 10.8814L20.9234 7.5364C21.2841 7.26993 21.2841 6.73054 20.9235 6.46405L16.3962 3.11873C15.9561 2.79356 15.3333 3.10773 15.3333 3.6549V5.22682C15.3333 5.29746 15.2778 5.35579 15.2073 5.36066C9.31791 5.76757 4.66667 10.674 4.66667 16.6667C4.66667 22.9259 9.74078 28 16 28C22.0352 28 26.9686 23.2827 27.314 17.3341C27.3354 16.9665 27.0348 16.6673 26.6666 16.6673H24.6666C24.2984 16.6673 24.0029 16.9668 23.9726 17.3337C23.6336 21.4399 20.1937 24.6667 16 24.6667C11.5817 24.6667 8 21.085 8 16.6667C8 12.5225 11.1517 9.11428 15.1887 8.70739C15.2663 8.69957 15.3333 8.76096 15.3333 8.83893V10.3452Z\"\n fill={fill}\n />\n <Path\n clipRule=\"evenodd\"\n d=\"M17.0879 19.679C17.4553 19.9195 17.8928 20.0398 18.4004 20.0398C18.9099 20.0398 19.3474 19.9205 19.7129 19.6818C20.0803 19.4413 20.3635 19.0938 20.5623 18.6392C20.7612 18.1847 20.8606 17.6373 20.8606 16.9972C20.8625 16.3608 20.764 15.8192 20.5652 15.3722C20.3663 14.9252 20.0822 14.5853 19.7129 14.3523C19.3455 14.1175 18.908 14 18.4004 14C17.8928 14 17.4553 14.1175 17.0879 14.3523C16.7224 14.5853 16.4402 14.9252 16.2413 15.3722C16.0443 15.8173 15.9449 16.3589 15.943 16.9972C15.9411 17.6354 16.0396 18.1818 16.2385 18.6364C16.4373 19.089 16.7205 19.4366 17.0879 19.679ZM19.1362 18.4262C18.9487 18.7349 18.7034 18.8892 18.4004 18.8892C18.1996 18.8892 18.0225 18.8211 17.8691 18.6847C17.7157 18.5464 17.5964 18.3372 17.5112 18.0568C17.4278 17.7765 17.3871 17.4233 17.389 16.9972C17.3909 16.3684 17.4847 15.9025 17.6703 15.5995C17.8559 15.2945 18.0992 15.1421 18.4004 15.1421C18.603 15.1421 18.7801 15.2093 18.9316 15.3438C19.0831 15.4782 19.2015 15.6828 19.2867 15.9574C19.372 16.2301 19.4146 16.5767 19.4146 16.9972C19.4165 17.6392 19.3237 18.1156 19.1362 18.4262Z\"\n fill={fill}\n fillRule=\"evenodd\"\n />\n <Path\n d=\"M13.7746 19.8978C13.8482 19.8978 13.9079 19.8381 13.9079 19.7644V14.2129C13.9079 14.1393 13.8482 14.0796 13.7746 14.0796H12.642C12.6171 14.0796 12.5927 14.0865 12.5716 14.0997L11.2322 14.9325C11.1931 14.9568 11.1693 14.9996 11.1693 15.0457V15.9497C11.1693 16.0539 11.2833 16.1178 11.3722 16.0635L12.464 15.396C12.4682 15.3934 12.473 15.3921 12.4779 15.3921C12.4926 15.3921 12.5045 15.404 12.5045 15.4187V19.7644C12.5045 19.8381 12.5642 19.8978 12.6378 19.8978H13.7746Z\"\n fill={fill}\n />\n </IconShell>\n )\n}\n\n// ─── Volume ────────────────────────────────────────────────────────────────\n\nexport function EmbedMediaIconMute(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M17.5091 24.6594C17.5091 25.2066 16.8864 25.5208 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9991 9.36923 19.9991H4.66667C4.29848 19.9991 4 19.7006 4 19.3325V12.6658C4 12.2976 4.29848 11.9991 4.66667 11.9991H9.37115C9.39967 11.9991 9.42745 11.99 9.45039 11.973L16.4463 6.8036C16.8863 6.47842 17.5091 6.79259 17.5091 7.33977L17.5091 24.6594Z\"\n fill={props.color}\n />\n <Path\n d=\"M28.8621 13.6422C29.1225 13.3818 29.1225 12.9597 28.8621 12.6994L27.9193 11.7566C27.659 11.4962 27.2368 11.4962 26.9765 11.7566L24.7134 14.0197C24.6613 14.0717 24.5769 14.0717 24.5248 14.0197L22.262 11.7568C22.0016 11.4964 21.5795 11.4964 21.3191 11.7568L20.3763 12.6996C20.116 12.9599 20.116 13.382 20.3763 13.6424L22.6392 15.9053C22.6913 15.9573 22.6913 16.0418 22.6392 16.0938L20.3768 18.3562C20.1165 18.6166 20.1165 19.0387 20.3768 19.299L21.3196 20.2419C21.58 20.5022 22.0021 20.5022 22.2624 20.2418L24.5248 17.9795C24.5769 17.9274 24.6613 17.9274 24.7134 17.9795L26.976 20.2421C27.2363 20.5024 27.6585 20.5024 27.9188 20.2421L28.8616 19.2992C29.122 19.0389 29.122 18.6168 28.8616 18.3564L26.599 16.0938C26.547 16.0418 26.547 15.9573 26.599 15.9053L28.8621 13.6422Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\nexport function EmbedMediaIconVolumeLow(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M17.5091 24.6594C17.5091 25.2066 16.8864 25.5207 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9991 9.36923 19.9991H4.66667C4.29848 19.9991 4 19.7006 4 19.3324V12.6658C4 12.2976 4.29848 11.9991 4.66667 11.9991H9.37115C9.39967 11.9991 9.42745 11.99 9.45039 11.973L16.4463 6.80358C16.8863 6.4784 17.5091 6.79258 17.5091 7.33975L17.5091 24.6594Z\"\n fill={props.color}\n />\n <Path\n d=\"M22.8424 12.6667C22.8424 12.2985 22.544 12 22.1758 12H20.8424C20.4743 12 20.1758 12.2985 20.1758 12.6667V19.3333C20.1758 19.7015 20.4743 20 20.8424 20H22.1758C22.544 20 22.8424 19.7015 22.8424 19.3333V12.6667Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\nexport function EmbedMediaIconVolumeHigh(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M17.5091 24.6595C17.5091 25.2066 16.8864 25.5208 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9992 9.36923 19.9992H4.66667C4.29848 19.9992 4 19.7007 4 19.3325V12.6658C4 12.2976 4.29848 11.9992 4.66667 11.9992H9.37115C9.39967 11.9992 9.42745 11.99 9.45039 11.9731L16.4463 6.80363C16.8863 6.47845 17.5091 6.79262 17.5091 7.3398L17.5091 24.6595Z\"\n fill={props.color}\n />\n <Path\n d=\"M27.5091 9.33336C27.8773 9.33336 28.1758 9.63184 28.1758 10V22C28.1758 22.3682 27.8773 22.6667 27.5091 22.6667H26.1758C25.8076 22.6667 25.5091 22.3682 25.5091 22V10C25.5091 9.63184 25.8076 9.33336 26.1758 9.33336L27.5091 9.33336Z\"\n fill={props.color}\n />\n <Path\n d=\"M22.1758 12C22.544 12 22.8424 12.2985 22.8424 12.6667V19.3334C22.8424 19.7016 22.544 20 22.1758 20H20.8424C20.4743 20 20.1758 19.7016 20.1758 19.3334V12.6667C20.1758 12.2985 20.4743 12 20.8424 12H22.1758Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\n// ─── Fullscreen ────────────────────────────────────────────────────────────\n\nexport function EmbedMediaIconFullscreen(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M25.3299 7.26517C25.2958 6.929 25.0119 6.66666 24.6667 6.66666H19.3334C18.9652 6.66666 18.6667 6.96514 18.6667 7.33333V9.33333C18.6667 9.70152 18.9652 10 19.3334 10L21.8667 10C21.9403 10 22 10.0597 22 10.1333V12.6667C22 13.0349 22.2985 13.3333 22.6667 13.3333H24.6667C25.0349 13.3333 25.3334 13.0349 25.3334 12.6667V7.33333C25.3334 7.31032 25.3322 7.28758 25.3299 7.26517Z\"\n fill={props.color}\n />\n <Path\n d=\"M22 21.8667C22 21.9403 21.9403 22 21.8667 22L19.3334 22C18.9652 22 18.6667 22.2985 18.6667 22.6667V24.6667C18.6667 25.0349 18.9652 25.3333 19.3334 25.3333L24.6667 25.3333C25.0349 25.3333 25.3334 25.0349 25.3334 24.6667V19.3333C25.3334 18.9651 25.0349 18.6667 24.6667 18.6667H22.6667C22.2985 18.6667 22 18.9651 22 19.3333V21.8667Z\"\n fill={props.color}\n />\n <Path\n d=\"M12.6667 22H10.1334C10.0597 22 10 21.9403 10 21.8667V19.3333C10 18.9651 9.70154 18.6667 9.33335 18.6667H7.33335C6.96516 18.6667 6.66669 18.9651 6.66669 19.3333V24.6667C6.66669 25.0349 6.96516 25.3333 7.33335 25.3333H12.6667C13.0349 25.3333 13.3334 25.0349 13.3334 24.6667V22.6667C13.3334 22.2985 13.0349 22 12.6667 22Z\"\n fill={props.color}\n />\n <Path\n d=\"M10 12.6667V10.1333C10 10.0597 10.0597 10 10.1334 10L12.6667 10C13.0349 10 13.3334 9.70152 13.3334 9.33333V7.33333C13.3334 6.96514 13.0349 6.66666 12.6667 6.66666H7.33335C6.96516 6.66666 6.66669 6.96514 6.66669 7.33333V12.6667C6.66669 13.0349 6.96516 13.3333 7.33335 13.3333H9.33335C9.70154 13.3333 10 13.0349 10 12.6667Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\n/** Ícone `fullscreen-exit` (media-icons 1.1.5), espelhado no embed web. */\nexport function EmbedMediaIconFullscreenExit(props: EmbedMediaIconBaseProps) {\n return (\n <IconShell size={props.size}>\n <Path\n d=\"M19.3334 13.3333C18.9652 13.3333 18.6667 13.0349 18.6667 12.6667L18.6667 7.33333C18.6667 6.96514 18.9652 6.66666 19.3334 6.66666H21.3334C21.7015 6.66666 22 6.96514 22 7.33333V9.86666C22 9.9403 22.0597 10 22.1334 10L24.6667 10C25.0349 10 25.3334 10.2985 25.3334 10.6667V12.6667C25.3334 13.0349 25.0349 13.3333 24.6667 13.3333L19.3334 13.3333Z\"\n fill={props.color}\n />\n <Path\n d=\"M13.3334 19.3333C13.3334 18.9651 13.0349 18.6667 12.6667 18.6667H7.33335C6.96516 18.6667 6.66669 18.9651 6.66669 19.3333V21.3333C6.66669 21.7015 6.96516 22 7.33335 22H9.86669C9.94032 22 10 22.0597 10 22.1333L10 24.6667C10 25.0349 10.2985 25.3333 10.6667 25.3333H12.6667C13.0349 25.3333 13.3334 25.0349 13.3334 24.6667L13.3334 19.3333Z\"\n fill={props.color}\n />\n <Path\n d=\"M18.6667 24.6667C18.6667 25.0349 18.9652 25.3333 19.3334 25.3333H21.3334C21.7015 25.3333 22 25.0349 22 24.6667V22.1333C22 22.0597 22.0597 22 22.1334 22H24.6667C25.0349 22 25.3334 21.7015 25.3334 21.3333V19.3333C25.3334 18.9651 25.0349 18.6667 24.6667 18.6667L19.3334 18.6667C18.9652 18.6667 18.6667 18.9651 18.6667 19.3333L18.6667 24.6667Z\"\n fill={props.color}\n />\n <Path\n d=\"M10.6667 13.3333H12.6667C13.0349 13.3333 13.3334 13.0349 13.3334 12.6667L13.3334 10.6667V7.33333C13.3334 6.96514 13.0349 6.66666 12.6667 6.66666H10.6667C10.2985 6.66666 10 6.96514 10 7.33333L10 9.86666C10 9.9403 9.94033 10 9.86669 10L7.33335 10C6.96516 10 6.66669 10.2985 6.66669 10.6667V12.6667C6.66669 13.0349 6.96516 13.3333 7.33335 13.3333L10.6667 13.3333Z\"\n fill={props.color}\n />\n </IconShell>\n )\n}\n\n// ─── Picture-in-picture ────────────────────────────────────────────────────\n\n/** Picture-in-picture (Material baseline, viewBox 24×24 scaled into embed shell). */\nexport function EmbedMediaIconPictureInPicture(props: EmbedMediaIconBaseProps) {\n const pixels = props.size ?? 22\n return (\n <Svg\n accessibilityElementsHidden\n height={pixels}\n importantForAccessibility=\"no\"\n viewBox=\"0 0 24 24\"\n width={pixels}\n >\n <Path\n d=\"M19 7h-8v6h8V7zm0-2c1.1 0 2 .9 2 2v6c0 1.1-.9 2-2 2h-8c-1.1 0-2-.9-2-2V7c0-1.1.9-2 2-2h8zM5 5v14h14v-2H7V5H5z\"\n fill={props.color}\n />\n </Svg>\n )\n}\n\n// ─── Cast ──────────────────────────────────────────────────────────────────\n\n/** Cast (Material baseline). Antena com 3 ondas Wi-Fi. */\nexport function EmbedMediaIconCast(props: EmbedMediaIconBaseProps) {\n const pixels = props.size ?? 22\n return (\n <Svg\n accessibilityElementsHidden\n height={pixels}\n importantForAccessibility=\"no\"\n viewBox=\"0 0 24 24\"\n width={pixels}\n >\n <Path\n d=\"M21 3H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11z\"\n fill={props.color}\n />\n </Svg>\n )\n}\n\n/** Cast conectado (Material baseline). Antena com tela preenchida. */\nexport function EmbedMediaIconCastConnected(props: EmbedMediaIconBaseProps) {\n const pixels = props.size ?? 22\n return (\n <Svg\n accessibilityElementsHidden\n height={pixels}\n importantForAccessibility=\"no\"\n viewBox=\"0 0 24 24\"\n width={pixels}\n >\n <Path\n d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7H5v1.63c3.96 1.28 7.09 4.41 8.37 8.37H19V7zM1 10v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n fill={props.color}\n />\n </Svg>\n )\n}\n","import {\n MOVIIE_BRANDING_MARKETING_ORIGIN,\n MOVIIE_BRANDING_UTM_PARAM_CAMPAIGN,\n MOVIIE_BRANDING_UTM_PARAM_MEDIUM,\n MOVIIE_BRANDING_UTM_PARAM_SOURCE,\n MOVIIE_EMBED_BRAND_UTM,\n} from \"../constants\"\n\n/** Espelha `buildPlayerBrandHomeHref` do embed web (`apps/web/src/app/embed/[id]/utils.ts`). */\nexport function buildMoviieEmbedBrandHomeUrl(): string {\n const url = new URL(`${MOVIIE_BRANDING_MARKETING_ORIGIN}/`)\n url.searchParams.set(MOVIIE_BRANDING_UTM_PARAM_SOURCE, MOVIIE_EMBED_BRAND_UTM.SOURCE)\n url.searchParams.set(MOVIIE_BRANDING_UTM_PARAM_MEDIUM, MOVIIE_EMBED_BRAND_UTM.MEDIUM)\n url.searchParams.set(MOVIIE_BRANDING_UTM_PARAM_CAMPAIGN, MOVIIE_EMBED_BRAND_UTM.CAMPAIGN)\n return url.toString()\n}\n","import {\n MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT,\n MOVIIE_SKIN_LAYOUT_SCALE_MAX,\n MOVIIE_SKIN_LAYOUT_SCALE_MIN,\n} from \"../constants\"\n\nfunction clampBetween(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function resolveMoviieSkinLayoutScale(windowWidth: number): number {\n if (!Number.isFinite(windowWidth) || windowWidth <= 0) {\n return 1\n }\n const raw = windowWidth / MOVIIE_SKIN_LAYOUT_REFERENCE_WIDTH_PT\n return clampBetween(raw, MOVIIE_SKIN_LAYOUT_SCALE_MIN, MOVIIE_SKIN_LAYOUT_SCALE_MAX)\n}\n","import {\n MOVIIE_SKIN_BRAND_MARK_ARTBOARD_HEIGHT_PX,\n MOVIIE_SKIN_BRAND_MARK_ARTBOARD_WIDTH_PX,\n MOVIIE_SKIN_BRAND_MARK_TARGET_WIDTH_AT_REFERENCE_PT,\n MOVIIE_SKIN_BUFFERING_INDICATOR_SLOT_PX,\n MOVIIE_SKIN_CENTER_CLUSTER_COLUMN_GAP_PX,\n MOVIIE_SKIN_CENTER_PLAY_ICON_PX,\n MOVIIE_SKIN_CENTER_PLAY_SCRIM_DIAMETER_AT_REFERENCE_PT,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_HUD_EDGE_BOOST_REFERENCE_PT,\n MOVIIE_SKIN_CHROME_EDGE_GRADIENT_HEIGHT_AT_REFERENCE_PT,\n MOVIIE_SKIN_CLOCK_TEXT_FONT_SIZE_AT_REFERENCE_PT,\n MOVIIE_SKIN_CONTROL_ICON_PX,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_ICON_AT_REFERENCE_PT,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_SCRIM_DIAMETER_AT_REFERENCE_PT,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_TOP_ICON_AT_REFERENCE_PT,\n MOVIIE_SKIN_FLOATING_HUD_BUTTON_GAP_AT_REFERENCE_PT,\n MOVIIE_SKIN_FLOATING_HUD_CLOCK_CORNER_RADIUS_PX,\n MOVIIE_SKIN_FLOATING_HUD_EDGE_INSET_PX,\n MOVIIE_SKIN_FLOATING_HUD_ABOVE_TIMELINE_GAP_AT_REFERENCE_PT,\n MOVIIE_SKIN_SEEK_ICON_PX,\n MOVIIE_SKIN_CENTER_SEEK_SCRIM_DIAMETER_AT_REFERENCE_PT,\n MOVIIE_SKIN_TIMELINE_BAR_HEIGHT_PX,\n MOVIIE_SKIN_TIMELINE_THUMB_DIAMETER_PX,\n MOVIIE_SKIN_TIMELINE_TOUCH_PADDING_VERTICAL_PX,\n} from '../constants'\n\nimport { resolveMoviieSkinLayoutScale } from './resolve-moviie-skin-layout-scale'\n\n/**\n * Métricas em unidades lógicas (o mesmo tipo de número que `StyleSheet`: dp/pt por plataforma).\n * O React Native já aplica a densidade do ecrã — evitar arredondamento manual com PixelRatio aqui.\n * O único escalonamento extra é {@link resolveMoviieSkinLayoutScale} pela largura da janela (layout responsivo).\n */\nexport type MoviieSkinLayoutMetrics = {\n readonly layoutScale: number\n readonly brandMarkWidthPx: number\n readonly brandMarkHeightPx: number\n readonly hudEdgeInsetPx: number\n readonly floatingHudAboveTimelineGapPx: number\n readonly hudClockCornerRadiusPx: number\n readonly controlIconPx: number\n readonly seekIconPx: number\n readonly seekScrimOuterDiameterPx: number\n readonly centerPlayIconPx: number\n readonly centerClusterColumnGapPx: number\n readonly playScrimOuterDiameterPx: number\n readonly clockTextFontSizePx: number\n readonly timelineThumbDiameterPx: number\n readonly timelineTouchPaddingVerticalPx: number\n readonly timelineBarHeightPx: number\n readonly timelineThumbBottomInsetPx: number\n readonly timelineStackHeightChromeVisiblePx: number\n readonly bufferingIndicatorSlotPx: number\n readonly chromeEdgeGradientHeightPx: number\n readonly floatingHudFullscreenScrimDiameterPx: number\n readonly floatingHudFullscreenIconPx: number\n readonly floatingHudFullscreenTopIconPx: number\n readonly floatingHudButtonGapPx: number\n}\n\nfunction scaleSkinLayoutDp(layoutScale: number, baseAtReference: number): number {\n return baseAtReference * layoutScale\n}\n\nexport type BuildMoviieSkinLayoutMetricsOptions = {\n /** Fullscreen JS rotacionado: inset extra no HUD/timeline para não encostar à zona segura. */\n fullscreenHudProtection?: boolean\n}\n\nexport function buildMoviieSkinLayoutMetrics(\n windowWidth: number,\n options?: BuildMoviieSkinLayoutMetricsOptions\n): MoviieSkinLayoutMetrics {\n const layoutScale = resolveMoviieSkinLayoutScale(windowWidth)\n\n const brandMarkWidthPx = scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_BRAND_MARK_TARGET_WIDTH_AT_REFERENCE_PT\n )\n const brandMarkHeightPx =\n brandMarkWidthPx *\n (MOVIIE_SKIN_BRAND_MARK_ARTBOARD_HEIGHT_PX / MOVIIE_SKIN_BRAND_MARK_ARTBOARD_WIDTH_PX)\n\n const timelineThumbDiameterPx = scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_TIMELINE_THUMB_DIAMETER_PX\n )\n const timelineBarHeightPx = scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_TIMELINE_BAR_HEIGHT_PX)\n const timelineThumbBottomInsetPx = timelineBarHeightPx / 2 - timelineThumbDiameterPx / 2\n\n const timelineTouchPaddingVerticalPx = scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_TIMELINE_TOUCH_PADDING_VERTICAL_PX\n )\n\n const fullscreenHudBoostPx =\n options?.fullscreenHudProtection === true\n ? scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_CUSTOM_FULLSCREEN_HUD_EDGE_BOOST_REFERENCE_PT)\n : 0\n\n const hudEdgeInsetPx =\n scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_FLOATING_HUD_EDGE_INSET_PX) + fullscreenHudBoostPx\n\n return {\n layoutScale,\n brandMarkWidthPx,\n brandMarkHeightPx,\n hudEdgeInsetPx,\n floatingHudAboveTimelineGapPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_HUD_ABOVE_TIMELINE_GAP_AT_REFERENCE_PT\n ),\n hudClockCornerRadiusPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_HUD_CLOCK_CORNER_RADIUS_PX\n ),\n controlIconPx: scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_CONTROL_ICON_PX),\n seekIconPx: scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_SEEK_ICON_PX),\n seekScrimOuterDiameterPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_CENTER_SEEK_SCRIM_DIAMETER_AT_REFERENCE_PT\n ),\n centerPlayIconPx: scaleSkinLayoutDp(layoutScale, MOVIIE_SKIN_CENTER_PLAY_ICON_PX),\n centerClusterColumnGapPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_CENTER_CLUSTER_COLUMN_GAP_PX\n ),\n playScrimOuterDiameterPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_CENTER_PLAY_SCRIM_DIAMETER_AT_REFERENCE_PT\n ),\n clockTextFontSizePx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_CLOCK_TEXT_FONT_SIZE_AT_REFERENCE_PT\n ),\n timelineThumbDiameterPx,\n timelineTouchPaddingVerticalPx,\n timelineBarHeightPx,\n timelineThumbBottomInsetPx,\n timelineStackHeightChromeVisiblePx: timelineTouchPaddingVerticalPx + timelineThumbDiameterPx,\n bufferingIndicatorSlotPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_BUFFERING_INDICATOR_SLOT_PX\n ),\n chromeEdgeGradientHeightPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_CHROME_EDGE_GRADIENT_HEIGHT_AT_REFERENCE_PT\n ),\n floatingHudFullscreenScrimDiameterPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_SCRIM_DIAMETER_AT_REFERENCE_PT\n ),\n floatingHudFullscreenIconPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_ICON_AT_REFERENCE_PT\n ),\n floatingHudFullscreenTopIconPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_FULLSCREEN_TOP_ICON_AT_REFERENCE_PT\n ),\n floatingHudButtonGapPx: scaleSkinLayoutDp(\n layoutScale,\n MOVIIE_SKIN_FLOATING_HUD_BUTTON_GAP_AT_REFERENCE_PT\n ),\n }\n}\n","import { MOVIIE_SKIN_BUFFER_UNDERRUN_LEAD_SECONDS } from \"../constants\"\nimport { computeMoviiePlaybackEnded } from \"./compute-moviie-playback-ended\"\n\nconst PLAYER_STATUS_LOADING = \"loading\" as const\n\nexport function computePlaybackBuffering(state: {\n bufferedPosition: number\n currentTime: number\n duration: number\n playing: boolean\n status: string\n isLive: boolean\n loop: boolean\n}): boolean {\n if (\n computeMoviiePlaybackEnded({\n playing: state.playing,\n currentTime: state.currentTime,\n duration: state.duration,\n isLive: state.isLive,\n loop: state.loop,\n })\n ) {\n return false\n }\n if (state.status === PLAYER_STATUS_LOADING) {\n return true\n }\n if (\n state.playing &&\n Number.isFinite(state.duration) &&\n state.duration > 0 &&\n state.bufferedPosition >= 0 &&\n state.currentTime > 0.08 &&\n state.bufferedPosition <\n state.currentTime + MOVIIE_SKIN_BUFFER_UNDERRUN_LEAD_SECONDS\n ) {\n return true\n }\n return false\n}\n","import {\n createContext,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { Animated, Easing, useWindowDimensions } from \"react-native\"\n\nimport type { VideoPlayer } from \"expo-video\"\n\nimport type { MoviiePlaybackData } from \"@moviie/player-sdk\"\n\nimport {\n MOVIIE_SKIN_CONTROLS_FADE_MS,\n MOVIIE_SKIN_SEEK_JUMP_SECONDS,\n} from \"../../constants\"\nimport {\n buildMoviieSkinLayoutMetrics,\n type MoviieSkinLayoutMetrics,\n} from \"../../lib/build-moviie-skin-layout-metrics\"\nimport { computeMoviiePlaybackEnded } from \"../../lib/compute-moviie-playback-ended\"\nimport { computePlaybackBuffering } from \"../../lib/compute-playback-buffering\"\n\n/** Subconjunto do VideoView nativo usado pela skin (tipagens expo-video × React). */\nexport type MoviieVideoSurfaceRef = {\n enterFullscreen?: () => Promise<void>\n exitFullscreen?: () => Promise<void>\n startPictureInPicture?: () => Promise<void>\n stopPictureInPicture?: () => Promise<void>\n}\n\nexport function usePlaybackUiSync(player: VideoPlayer): {\n bufferedPosition: number\n currentTime: number\n duration: number\n playing: boolean\n status: string\n} {\n const [snapshot, setSnapshot] = useState({\n bufferedPosition: player.bufferedPosition,\n currentTime: player.currentTime,\n duration: player.duration,\n playing: player.playing,\n status: player.status,\n })\n\n useEffect(() => {\n const subscriptions = [\n player.addListener(\"timeUpdate\", ({ currentTime }) => {\n setSnapshot((previous) => ({\n ...previous,\n bufferedPosition: player.bufferedPosition,\n currentTime,\n duration: player.duration,\n status: player.status,\n }))\n }),\n player.addListener(\"playingChange\", ({ isPlaying }) => {\n setSnapshot((previous) => ({\n ...previous,\n playing: isPlaying,\n bufferedPosition: player.bufferedPosition,\n status: player.status,\n }))\n }),\n player.addListener(\"sourceChange\", () => {\n setSnapshot({\n bufferedPosition: player.bufferedPosition,\n currentTime: player.currentTime,\n duration: player.duration,\n playing: player.playing,\n status: player.status,\n })\n }),\n player.addListener(\"statusChange\", ({ status }) => {\n setSnapshot((previous) => ({\n ...previous,\n bufferedPosition: player.bufferedPosition,\n status,\n }))\n }),\n player.addListener(\"playToEnd\", () => {\n setSnapshot((previous) => ({\n ...previous,\n playing: false,\n bufferedPosition: player.bufferedPosition,\n currentTime: player.currentTime,\n duration: player.duration,\n status: player.status,\n }))\n }),\n ]\n\n return () => {\n for (const sub of subscriptions) {\n sub.remove()\n }\n }\n }, [player])\n\n return snapshot\n}\n\nexport type { MoviieSkinLayoutMetrics }\n\nexport interface MoviieSkinChromeContextValue {\n playback: MoviiePlaybackData\n player: VideoPlayer\n videoViewRef: RefObject<MoviieVideoSurfaceRef | null>\n chromeVisible: boolean\n chromeOpacity: Animated.Value\n /** Posição (s) reflectida no relógio durante scrub; `null` = usar tempo do player. */\n timelineScrubClockSeconds: number | null\n setTimelineScrubClockSeconds: (seconds: number | null) => void\n bumpChromeInteraction: () => void\n dismissChrome: () => void\n ui: ReturnType<typeof usePlaybackUiSync>\n isBuffering: boolean\n layout: MoviieSkinLayoutMetrics\n togglePlay: () => void\n seekBack: () => void\n seekForward: () => void\n /** Fullscreen da skin Moviie em JS (modal): alterna entrar/sair; não usa `VideoView.enterFullscreen`. */\n toggleFullscreen: () => void\n isCustomFullscreen: boolean\n pictureInPictureControlEnabled: boolean\n pictureInPictureActive: boolean\n togglePictureInPicture: () => void\n castControlEnabled: boolean\n castConnected: boolean\n openCastPicker: () => void\n}\n\nconst MoviieSkinChromeContext = createContext<MoviieSkinChromeContextValue | null>(\n null\n)\n\nexport function useMoviieSkinChrome(): MoviieSkinChromeContextValue {\n const ctx = useContext(MoviieSkinChromeContext)\n if (ctx == null) {\n throw new Error(\"useMoviieSkinChrome must be used within MoviieSkinChromeProvider\")\n }\n return ctx\n}\n\nexport interface MoviieSkinChromeProviderProps {\n children: ReactNode\n player: VideoPlayer\n playback: MoviiePlaybackData\n videoViewRef: RefObject<MoviieVideoSurfaceRef | null>\n /** Quando definido com {@link onRequestExitCustomFullscreenAnimated}, o chrome usa fullscreen JS em vez de `VideoView.enterFullscreen`. */\n customFullscreen?: boolean\n /**\n * Largura lógica para {@link buildMoviieSkinLayoutMetrics} (ex.: lado maior do ecrã no fullscreen rotacionado).\n */\n skinLayoutMetricsWidth?: number\n onRequestEnterCustomFullscreen?: () => void\n onRequestExitCustomFullscreenAnimated?: () => void\n /**\n * Ignorado: o chrome só oculta ao toque fora / comando (play, seek).\n * Mantido por compatibilidade com chamadas existentes.\n */\n autoHideMs?: number\n visibleByDefault?: boolean\n pictureInPictureControlEnabled?: boolean\n pictureInPictureActive?: boolean\n togglePictureInPicture?: () => void\n castControlEnabled?: boolean\n castConnected?: boolean\n openCastPicker?: () => void\n}\n\nexport function MoviieSkinChromeProvider({\n children,\n player,\n playback,\n videoViewRef,\n customFullscreen = false,\n skinLayoutMetricsWidth,\n onRequestEnterCustomFullscreen,\n onRequestExitCustomFullscreenAnimated,\n autoHideMs: _unusedAutoHideMs,\n visibleByDefault = true,\n pictureInPictureControlEnabled = false,\n pictureInPictureActive = false,\n togglePictureInPicture: togglePictureInPictureProp,\n castControlEnabled = false,\n castConnected = false,\n openCastPicker: openCastPickerProp,\n}: MoviieSkinChromeProviderProps) {\n void _unusedAutoHideMs\n\n const noopPictureInPicture = useCallback(() => {}, [])\n\n const togglePictureInPicture =\n togglePictureInPictureProp ?? noopPictureInPicture\n\n const noopOpenCastPicker = useCallback(() => {}, [])\n\n const openCastPicker = openCastPickerProp ?? noopOpenCastPicker\n\n const { width: windowWidth } = useWindowDimensions()\n const layoutBasisWidth = skinLayoutMetricsWidth ?? windowWidth\n const layout = useMemo(\n () =>\n buildMoviieSkinLayoutMetrics(layoutBasisWidth, {\n fullscreenHudProtection: customFullscreen,\n }),\n [customFullscreen, layoutBasisWidth]\n )\n\n const ui = usePlaybackUiSync(player)\n\n const [chromeVisible, setChromeVisible] = useState(visibleByDefault)\n const [timelineScrubClockSeconds, setTimelineScrubClockSeconds] =\n useState<number | null>(null)\n\n const playbackEndedForChrome = useMemo(\n () =>\n computeMoviiePlaybackEnded({\n playing: ui.playing,\n currentTime: ui.currentTime,\n duration: ui.duration,\n isLive: player.isLive,\n loop: player.loop,\n }),\n [ui.playing, ui.currentTime, ui.duration, player.isLive, player.loop]\n )\n\n useEffect(() => {\n if (playbackEndedForChrome) {\n setChromeVisible(true)\n }\n }, [playbackEndedForChrome])\n\n const chromeOpacity = useRef(new Animated.Value(visibleByDefault ? 1 : 0)).current\n\n useEffect(() => {\n Animated.timing(chromeOpacity, {\n duration: MOVIIE_SKIN_CONTROLS_FADE_MS,\n easing: Easing.out(Easing.quad),\n toValue: chromeVisible ? 1 : 0,\n useNativeDriver: true,\n }).start()\n }, [chromeOpacity, chromeVisible])\n\n const bumpChromeInteraction = useCallback(() => {\n setChromeVisible(true)\n }, [])\n\n const dismissChrome = useCallback(() => {\n setChromeVisible(false)\n }, [])\n\n const togglePlay = useCallback(() => {\n if (player.playing) {\n player.pause()\n return\n }\n if (\n computeMoviiePlaybackEnded({\n playing: false,\n currentTime: player.currentTime,\n duration: player.duration,\n isLive: player.isLive,\n loop: player.loop,\n })\n ) {\n player.currentTime = 0\n }\n player.play()\n setChromeVisible(false)\n }, [player])\n\n const seekBack = useCallback(() => {\n void player.seekBy(-MOVIIE_SKIN_SEEK_JUMP_SECONDS)\n setChromeVisible(false)\n }, [player])\n\n const seekForward = useCallback(() => {\n void player.seekBy(MOVIIE_SKIN_SEEK_JUMP_SECONDS)\n setChromeVisible(false)\n }, [player])\n\n const toggleFullscreen = useCallback(() => {\n if (customFullscreen) {\n onRequestExitCustomFullscreenAnimated?.()\n return\n }\n setChromeVisible(false)\n if (onRequestEnterCustomFullscreen != null) {\n onRequestEnterCustomFullscreen()\n return\n }\n void videoViewRef.current?.enterFullscreen?.().catch(() => undefined)\n }, [\n customFullscreen,\n onRequestEnterCustomFullscreen,\n onRequestExitCustomFullscreenAnimated,\n videoViewRef,\n ])\n\n const isBuffering = useMemo(\n () =>\n computePlaybackBuffering({\n ...ui,\n isLive: player.isLive,\n loop: player.loop,\n }),\n [ui, player.isLive, player.loop]\n )\n\n const value = useMemo(\n (): MoviieSkinChromeContextValue => ({\n playback,\n player,\n videoViewRef,\n chromeVisible,\n chromeOpacity,\n timelineScrubClockSeconds,\n setTimelineScrubClockSeconds,\n bumpChromeInteraction,\n dismissChrome,\n ui,\n isBuffering,\n layout,\n togglePlay,\n seekBack,\n seekForward,\n toggleFullscreen,\n isCustomFullscreen: customFullscreen,\n pictureInPictureActive,\n pictureInPictureControlEnabled,\n togglePictureInPicture,\n castControlEnabled,\n castConnected,\n openCastPicker,\n }),\n [\n playback,\n player,\n videoViewRef,\n chromeVisible,\n chromeOpacity,\n timelineScrubClockSeconds,\n setTimelineScrubClockSeconds,\n bumpChromeInteraction,\n dismissChrome,\n ui,\n isBuffering,\n layout,\n togglePlay,\n seekBack,\n seekForward,\n toggleFullscreen,\n customFullscreen,\n pictureInPictureActive,\n pictureInPictureControlEnabled,\n togglePictureInPicture,\n castControlEnabled,\n castConnected,\n openCastPicker,\n ]\n )\n\n return (\n <MoviieSkinChromeContext.Provider value={value}>{children}</MoviieSkinChromeContext.Provider>\n )\n}\n","import { useCallback } from \"react\"\nimport { Linking, Pressable } from \"react-native\"\nimport Svg, { Path } from \"../../lib/jsx-native-bridge\"\n\nimport {\n MOVIIE_EMBED_BRAND_LETTERMARK_STROKE_WIDTH,\n MOVIIE_EMBED_BRAND_VIEW_BOX,\n MOVIIE_SKIN_CHROME_FOREGROUND_HEX,\n MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX,\n} from \"../../constants\"\nimport { buildMoviieEmbedBrandHomeUrl } from \"../../lib/build-moviie-embed-brand-home-url\"\n\nimport { useMoviieSkinChrome } from \"../controls/moviie-skin-chrome-context\"\n\n/**\n * Wordmark Moviie para o canto do HUD da skin (SVG alinhado ao asset oficial).\n */\nexport function MoviieEmbedBrandMark() {\n const { layout } = useMoviieSkinChrome()\n const fg = MOVIIE_SKIN_CHROME_FOREGROUND_HEX\n const openMarketingSite = useCallback(() => {\n void Linking.openURL(buildMoviieEmbedBrandHomeUrl())\n }, [])\n\n return (\n <Pressable\n accessibilityHint=\"Abre o site da Moviie no navegador\"\n accessibilityLabel=\"Moviie — página inicial\"\n accessibilityRole=\"link\"\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={openMarketingSite}\n >\n <Svg\n accessibilityElementsHidden\n height={layout.brandMarkHeightPx}\n importantForAccessibility=\"no\"\n viewBox={MOVIIE_EMBED_BRAND_VIEW_BOX}\n width={layout.brandMarkWidthPx}\n >\n <Path\n d=\"M6.066 43.725H0V0h6.066L21.8 36.77 37.533 0h6.192v43.725H37.66V26.43c0-8.165.063-11.128.38-14.212L24.706 43.725h-5.813L5.623 12.337c.317 2.117.443 6.593.443 12.7z\"\n fill={fg}\n />\n <Path\n d=\"M47.527 29.467c0-9.494 6.454-16.16 15.239-16.16 8.725 0 15.179 6.666 15.179 16.16s-6.454 16.16-15.179 16.16c-8.785 0-15.239-6.666-15.239-16.16m5.678 0c0 6.413 3.884 10.878 9.561 10.878 5.617 0 9.562-4.465 9.562-10.878S68.383 18.59 62.766 18.59c-5.677 0-9.561 4.465-9.561 10.878M159.227 45.626c-8.737 0-14.744-6.526-14.744-16.065 0-9.601 5.886-16.253 14.501-16.253 8.434 0 13.955 6.024 13.955 15.124v2.196l-22.934.063c.424 6.464 3.701 10.04 9.343 10.04 4.43 0 7.342-1.882 8.313-5.396H173c-1.456 6.589-6.431 10.291-13.773 10.291m-.243-27.36c-4.975 0-8.13 3.074-8.858 8.471h17.11c0-5.083-3.216-8.472-8.252-8.472\"\n fill={fg}\n />\n <Path\n d=\"m140.681 15.209-12.313 28.516h-4.794l12.313-28.516zm-14.384 0-12.312 28.516h-4.811l12.313-28.516zm-39.363 0 6.553 16.138c1.06 2.768 1.927 5.221 2.42 7.006l.944-.007c.49-1.892 1.476-4.393 2.539-6.988l6.68-16.15h5.054L98.799 43.726h-5.15L81.747 15.21z\"\n fill=\"none\"\n stroke={fg}\n strokeLinejoin=\"bevel\"\n strokeWidth={MOVIIE_EMBED_BRAND_LETTERMARK_STROKE_WIDTH}\n />\n </Svg>\n </Pressable>\n )\n}\n","import type { PressableProps, ViewStyle } from 'react-native'\nimport type { ReactNode } from 'react'\nimport { Pressable, View } from 'react-native'\n\nimport {\n MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY,\n MOVIIE_SKIN_CHROME_CONTROL_REST_OPACITY,\n MOVIIE_SKIN_CHROME_FOREGROUND_HEX,\n MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX,\n MOVIIE_SKIN_TOP_ICON_CAST_VISUAL_SCALE,\n} from '../../constants'\nimport type { MoviieSkinLayoutMetrics } from '../../lib/build-moviie-skin-layout-metrics'\nimport { EmbedMediaIconCast, EmbedMediaIconCastConnected } from '../icons/embed-media-icons'\n\nfunction pressOpacity(pressed: boolean): Pick<ViewStyle, 'opacity'> {\n return {\n opacity: pressed\n ? MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY\n : MOVIIE_SKIN_CHROME_CONTROL_REST_OPACITY,\n }\n}\n\nfunction ScrimPad(props: {\n accessibilityLabel: string\n hitSlop?: PressableProps['hitSlop']\n onPress: () => void\n chromeScrimBaseStyle: object\n style: object\n children: ReactNode\n selected: boolean\n}) {\n return (\n <Pressable\n accessibilityLabel={props.accessibilityLabel}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: props.selected }}\n hitSlop={props.hitSlop}\n onPress={props.onPress}\n style={(state) => [props.chromeScrimBaseStyle, props.style, pressOpacity(state.pressed)]}\n >\n {props.children}\n </Pressable>\n )\n}\n\nexport function MoviieSkinCastCircleButton(props: {\n castConnected: boolean\n chromeScrimBaseStyle: object\n circleScrimStyle: object\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n}) {\n const Icon = props.castConnected ? EmbedMediaIconCastConnected : EmbedMediaIconCast\n return (\n <ScrimPad\n accessibilityLabel={props.castConnected ? 'Encerrar transmissão' : 'Transmitir'}\n chromeScrimBaseStyle={props.chromeScrimBaseStyle}\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n selected={props.castConnected}\n style={props.circleScrimStyle}\n >\n <Icon\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={props.layout.floatingHudFullscreenIconPx}\n />\n </ScrimPad>\n )\n}\n\nexport function MoviieSkinCastTopBareButton(props: {\n castConnected: boolean\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n}) {\n const Icon = props.castConnected ? EmbedMediaIconCastConnected : EmbedMediaIconCast\n return (\n <Pressable\n accessibilityLabel={props.castConnected ? 'Encerrar transmissão' : 'Transmitir'}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: props.castConnected }}\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n style={(state) => pressOpacity(state.pressed)}\n >\n <View>\n <Icon\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={\n props.layout.floatingHudFullscreenTopIconPx * MOVIIE_SKIN_TOP_ICON_CAST_VISUAL_SCALE\n }\n />\n </View>\n </Pressable>\n )\n}\n","/**\n * Vertical chrome gradients (black → transparent).\n * Svg primitives use `jsx-native-bridge` for TS 5.9 compatibility with class-based RN SVG exports.\n */\n\nimport type { ReactNode } from \"react\"\nimport { useCallback, useMemo, useState } from \"react\"\nimport type { LayoutChangeEvent } from \"react-native\"\nimport { StyleSheet, View } from \"react-native\"\nimport Svg, { Defs, LinearGradient, Rect, Stop } from \"../../lib/jsx-native-bridge\"\n\nimport {\n MOVIIE_SKIN_CHROME_EDGE_GRADIENT_EDGE_SOLID_FADE_END_FRACTION,\n MOVIIE_SKIN_CHROME_EDGE_GRADIENT_MIN_CLEAR_MIDDLE_PX,\n MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX,\n MOVIIE_SKIN_CHROME_GRADIENT_EDGE_ALPHA,\n MOVIIE_SKIN_CHROME_SVG_GRADIENT_BOTTOM_EDGE_ID,\n MOVIIE_SKIN_CHROME_SVG_GRADIENT_TOP_EDGE_ID,\n} from \"../../constants\"\nimport type { MoviieSkinLayoutMetrics } from \"../../lib/build-moviie-skin-layout-metrics\"\n\nexport function MoviieSkinChromeEdgeGradients(props: {\n layout: MoviieSkinLayoutMetrics\n showProgress: boolean\n}): ReactNode {\n const [hostWidth, setHostWidth] = useState(0)\n const [hostHeight, setHostHeight] = useState(0)\n\n const onHostLayout = useCallback((event: LayoutChangeEvent) => {\n const { height, width } = event.nativeEvent.layout\n setHostWidth(width)\n setHostHeight(height)\n }, [])\n\n const rawTopPx = props.layout.chromeEdgeGradientHeightPx\n const rawBottomPx =\n props.layout.chromeEdgeGradientHeightPx +\n (props.showProgress ? props.layout.timelineStackHeightChromeVisiblePx : 0)\n\n const { effBottomPx, effTopPx, svgWidthPx } = useMemo(() => {\n if (hostWidth <= 0 || hostHeight <= 0) {\n return { effBottomPx: 0, effTopPx: 0, svgWidthPx: 0 }\n }\n\n const svgWidthPx = hostWidth\n const maxTotalPx = Math.max(\n 0,\n hostHeight - MOVIIE_SKIN_CHROME_EDGE_GRADIENT_MIN_CLEAR_MIDDLE_PX\n )\n\n const rawSum = rawTopPx + rawBottomPx\n const scale =\n rawSum > maxTotalPx && maxTotalPx > 0 && rawSum > 0 ? maxTotalPx / rawSum : 1\n\n return {\n effBottomPx: rawBottomPx * scale,\n effTopPx: rawTopPx * scale,\n svgWidthPx,\n }\n }, [hostHeight, hostWidth, rawBottomPx, rawTopPx])\n\n const topFillUrl = `url(#${MOVIIE_SKIN_CHROME_SVG_GRADIENT_TOP_EDGE_ID})`\n const bottomFillUrl = `url(#${MOVIIE_SKIN_CHROME_SVG_GRADIENT_BOTTOM_EDGE_ID})`\n\n const layoutReady = hostWidth > 0 && hostHeight > 0 && svgWidthPx > 0\n\n const fadeEndOffset = String(MOVIIE_SKIN_CHROME_EDGE_GRADIENT_EDGE_SOLID_FADE_END_FRACTION)\n\n return (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n onLayout={onHostLayout}\n pointerEvents=\"none\"\n style={StyleSheet.absoluteFillObject}\n testID=\"moviie-chrome-edge-gradients\"\n >\n {layoutReady && effTopPx > 0 ? (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n pointerEvents=\"none\"\n style={{\n height: effTopPx,\n left: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n top: 0,\n width: hostWidth,\n }}\n >\n <Svg accessibilityElementsHidden height={effTopPx} width={svgWidthPx}>\n <Defs>\n <LinearGradient\n gradientUnits=\"objectBoundingBox\"\n id={MOVIIE_SKIN_CHROME_SVG_GRADIENT_TOP_EDGE_ID}\n x1=\"0\"\n x2=\"0\"\n y1=\"0\"\n y2=\"1\"\n >\n <Stop\n offset=\"0\"\n stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX}\n stopOpacity={MOVIIE_SKIN_CHROME_GRADIENT_EDGE_ALPHA}\n />\n <Stop\n offset={fadeEndOffset}\n stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX}\n stopOpacity={0}\n />\n <Stop offset=\"1\" stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX} stopOpacity={0} />\n </LinearGradient>\n </Defs>\n <Rect fill={topFillUrl} height={effTopPx} width={svgWidthPx} />\n </Svg>\n </View>\n ) : null}\n {layoutReady && effBottomPx > 0 ? (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n pointerEvents=\"none\"\n style={{\n bottom: 0,\n height: effBottomPx,\n left: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n width: hostWidth,\n }}\n >\n <Svg accessibilityElementsHidden height={effBottomPx} width={svgWidthPx}>\n <Defs>\n <LinearGradient\n gradientUnits=\"objectBoundingBox\"\n id={MOVIIE_SKIN_CHROME_SVG_GRADIENT_BOTTOM_EDGE_ID}\n x1=\"0\"\n x2=\"0\"\n y1=\"1\"\n y2=\"0\"\n >\n <Stop\n offset=\"0\"\n stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX}\n stopOpacity={MOVIIE_SKIN_CHROME_GRADIENT_EDGE_ALPHA}\n />\n <Stop\n offset={fadeEndOffset}\n stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX}\n stopOpacity={0}\n />\n <Stop offset=\"1\" stopColor={MOVIIE_SKIN_CHROME_GRADIENT_BLACK_HEX} stopOpacity={0} />\n </LinearGradient>\n </Defs>\n <Rect fill={bottomFillUrl} height={effBottomPx} width={svgWidthPx} />\n </Svg>\n </View>\n ) : null}\n </View>\n )\n}\n","export function clampUnitInterval(value: number): number {\n return Math.min(1, Math.max(0, value))\n}\n","import { MOVIIE_SKIN_TIMELINE_END_SNAP_EPSILON_SECONDS } from \"../constants\"\n\nimport { clampUnitInterval } from \"./clamp-unit-interval\"\n\nexport function computePlaybackProgressRatio(state: {\n durationOk: boolean\n currentTime: number\n duration: number\n playing: boolean\n}): number {\n if (\n !state.durationOk ||\n !Number.isFinite(state.currentTime) ||\n !Number.isFinite(state.duration) ||\n state.duration <= 0\n ) {\n return 0\n }\n\n const raw = state.currentTime / state.duration\n if (raw >= 1) {\n return 1\n }\n\n const snapToEndWhilePaused =\n !state.playing &&\n state.currentTime >=\n state.duration - MOVIIE_SKIN_TIMELINE_END_SNAP_EPSILON_SECONDS\n\n const ratio = snapToEndWhilePaused ? 1 : raw\n\n return clampUnitInterval(ratio)\n}\n","import { MOVIIE_SKIN_TIMELINE_CHAPTER_SNAP_THRESHOLD_SECONDS } from \"../constants\"\n\nexport type TimelineChapterBoundary = {\n readonly startTimeSeconds: number\n}\n\n/**\n * Converte um `ratio` [0–1] de scrub em segundos absolutos, com snap automático\n * ao boundary de capítulo mais próximo dentro do threshold configurado.\n */\nexport function computeTimelineScrubCommitTime(params: {\n ratio: number\n durationSeconds: number\n chapters: ReadonlyArray<TimelineChapterBoundary>\n snapThresholdSeconds?: number\n}): number {\n const {\n ratio,\n durationSeconds,\n chapters,\n snapThresholdSeconds = MOVIIE_SKIN_TIMELINE_CHAPTER_SNAP_THRESHOLD_SECONDS,\n } = params\n\n const rawTime = ratio * durationSeconds\n\n let nearest: number | null = null\n let nearestDist = Infinity\n\n for (const chapter of chapters) {\n const dist = Math.abs(chapter.startTimeSeconds - rawTime)\n if (dist < nearestDist) {\n nearestDist = dist\n nearest = chapter.startTimeSeconds\n }\n }\n\n return nearest !== null && nearestDist <= snapThresholdSeconds\n ? nearest\n : rawTime\n}\n","import { MOVIIE_SKIN_DEFAULT_ACCENT_HEX } from \"../constants\"\n\nconst HEX_COLOR_REGEX = /^#[0-9A-Fa-f]{6}$/\n\nexport function resolveSkinAccentColor(primaryColor: string | null): string {\n if (primaryColor != null && HEX_COLOR_REGEX.test(primaryColor)) {\n return primaryColor\n }\n return MOVIIE_SKIN_DEFAULT_ACCENT_HEX\n}\n","import { useCallback, useEffect, useMemo, useRef } from \"react\"\nimport { StyleSheet, View, type LayoutChangeEvent } from \"react-native\"\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\"\nimport {\n runOnJS,\n useDerivedValue,\n useAnimatedStyle,\n useSharedValue,\n} from \"react-native-reanimated\"\n\nimport {\n MOVIIE_SKIN_CHROME_FOREGROUND_HEX,\n MOVIIE_SKIN_TIMELINE_BUFFER_LAYER_RGBA,\n MOVIIE_SKIN_TIMELINE_RAIL_BACKGROUND_RGBA,\n MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_BOTTOM_DP,\n MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_HORIZONTAL_DP,\n MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_TOP_DP,\n MOVIIE_SKIN_TIMELINE_THUMB_BORDER_RGBA,\n MOVIIE_SKIN_TIMELINE_THUMB_DRAG_DIAMETER_MULTIPLIER,\n MOVIIE_SKIN_TIMELINE_TOUCH_EXPANSION_VERTICAL_DP,\n} from \"../../constants\"\nimport type { MoviieSkinLayoutMetrics } from \"../../lib/build-moviie-skin-layout-metrics\"\nimport { clampUnitInterval } from \"../../lib/clamp-unit-interval\"\nimport { computePlaybackProgressRatio } from \"../../lib/compute-playback-progress-ratio\"\nimport { computeTimelineScrubCommitTime } from \"../../lib/compute-timeline-scrub-commit-time\"\nimport { ReanimatedView } from \"../../lib/jsx-native-bridge\"\nimport { resolveSkinAccentColor } from \"../../lib/resolve-skin-accent-color\"\n\nimport { useMoviieSkinChrome } from \"./moviie-skin-chrome-context\"\n\nfunction createMoviieSkinBottomTimelineStyles(layout: MoviieSkinLayoutMetrics) {\n return StyleSheet.create({\n root: {\n bottom: 0,\n left: 0,\n overflow: \"visible\",\n pointerEvents: \"box-none\",\n position: \"absolute\",\n right: 0,\n zIndex: 24,\n },\n touchExpansion: {\n overflow: \"visible\",\n paddingBottom: 0,\n paddingTop:\n layout.timelineTouchPaddingVerticalPx +\n MOVIIE_SKIN_TIMELINE_TOUCH_EXPANSION_VERTICAL_DP,\n position: \"relative\",\n },\n trackStack: {\n overflow: \"visible\",\n width: \"100%\",\n },\n thumbBase: {\n borderColor: MOVIIE_SKIN_TIMELINE_THUMB_BORDER_RGBA,\n borderWidth: 1,\n elevation: 8,\n position: \"absolute\",\n zIndex: 10,\n },\n unifiedBarSlot: {\n overflow: \"visible\",\n position: \"relative\",\n width: \"100%\",\n },\n railLayer: {\n backgroundColor: MOVIIE_SKIN_TIMELINE_RAIL_BACKGROUND_RGBA,\n bottom: 0,\n height: layout.timelineBarHeightPx,\n left: 0,\n position: \"absolute\",\n right: 0,\n zIndex: 0,\n },\n bufferLayer: {\n backgroundColor: MOVIIE_SKIN_TIMELINE_BUFFER_LAYER_RGBA,\n bottom: 0,\n height: layout.timelineBarHeightPx,\n left: 0,\n position: \"absolute\",\n zIndex: 1,\n },\n progressLayer: {\n bottom: 0,\n height: layout.timelineBarHeightPx,\n left: 0,\n position: \"absolute\",\n zIndex: 2,\n },\n })\n}\n\nexport function MoviieSkinBottomTimeline() {\n const {\n playback,\n chromeVisible,\n layout,\n player,\n setTimelineScrubClockSeconds,\n ui,\n } = useMoviieSkinChrome()\n\n const styles = useMemo(\n () => createMoviieSkinBottomTimelineStyles(layout),\n [layout]\n )\n\n const { controls } = playback\n const accent = resolveSkinAccentColor(playback.branding.primaryColor)\n const foreground = MOVIIE_SKIN_CHROME_FOREGROUND_HEX\n\n const durationOk =\n controls.showProgress &&\n Number.isFinite(ui.duration) &&\n ui.duration > 0 &&\n !player.isLive\n\n const progressRatioLive = computePlaybackProgressRatio({\n currentTime: ui.currentTime,\n duration: ui.duration,\n durationOk,\n playing: ui.playing,\n })\n\n const bufferRatioLive =\n durationOk &&\n Number.isFinite(ui.bufferedPosition) &&\n ui.bufferedPosition >= 0\n ? clampUnitInterval(ui.bufferedPosition / ui.duration)\n : 0\n\n // ── Shared values (UI thread) ─────────────────────────────────────────────\n const isDraggingSV = useSharedValue(false)\n const awaitingUnlockSV = useSharedValue(false)\n const scrubRatioSV = useSharedValue(0)\n const progressRatioSV = useSharedValue(progressRatioLive)\n const bufferRatioSV = useSharedValue(bufferRatioLive)\n const trackWidthSV = useSharedValue(0)\n const durationSV = useSharedValue(ui.duration)\n const chromeVisibleSV = useSharedValue(chromeVisible)\n const timelineAccentEngagedSV = useSharedValue(false)\n const thumbBaseDiamSV = useSharedValue(layout.timelineThumbDiameterPx)\n const barHeightSV = useSharedValue(layout.timelineBarHeightPx)\n\n // ── JS refs ────────────────────────────────────────────────────────────────\n const isDraggingRef = useRef(false)\n // shouldResumeRef permanece true até playingChange confirmar que o player retomou.\n // Isso permite retry via statusChange caso player.play() seja chamado enquanto o seek\n // ainda está em curso (expo-video pode ignorar play() durante loading).\n const shouldResumeRef = useRef(false)\n const progressRatioLiveRef = useRef(progressRatioLive)\n progressRatioLiveRef.current = progressRatioLive\n const chaptersRef = useRef(playback.chapters)\n chaptersRef.current = playback.chapters\n const chromeVisibleRef = useRef(chromeVisible)\n chromeVisibleRef.current = chromeVisible\n\n // ── Sync JS → shared values ────────────────────────────────────────────────\n useEffect(() => {\n if (!isDraggingRef.current) {\n progressRatioSV.value = progressRatioLive\n }\n }, [progressRatioLive, progressRatioSV])\n\n useEffect(() => {\n bufferRatioSV.value = bufferRatioLive\n }, [bufferRatioLive, bufferRatioSV])\n\n useEffect(() => {\n durationSV.value = ui.duration\n }, [ui.duration, durationSV])\n\n useEffect(() => {\n thumbBaseDiamSV.value = layout.timelineThumbDiameterPx\n barHeightSV.value = layout.timelineBarHeightPx\n }, [\n layout.timelineThumbDiameterPx,\n layout.timelineBarHeightPx,\n thumbBaseDiamSV,\n barHeightSV,\n ])\n\n useEffect(() => {\n chromeVisibleSV.value = chromeVisible\n if (chromeVisible) {\n timelineAccentEngagedSV.value = false\n awaitingUnlockSV.value = false\n }\n }, [\n chromeVisible,\n chromeVisibleSV,\n timelineAccentEngagedSV,\n awaitingUnlockSV,\n ])\n\n // Retry em cada readyToPlay enquanto !dragging + shouldResume.\n // Sem live seeks, este evento só pode vir do seek do commit → sem ambiguidade.\n useEffect(() => {\n const sub = player.addListener(\"statusChange\", ({ status }) => {\n if (shouldResumeRef.current && status === \"readyToPlay\" && !isDraggingRef.current) {\n player.play()\n }\n })\n return () => sub.remove()\n }, [player])\n\n // playingChange com isPlaying true é a confirmação autoritativa que o play() funcionou.\n useEffect(() => {\n const sub = player.addListener(\"playingChange\", ({ isPlaying }) => {\n if (isPlaying && !isDraggingRef.current) {\n shouldResumeRef.current = false\n }\n })\n return () => sub.remove()\n }, [player])\n\n // ── Derived values ─────────────────────────────────────────────────────────\n const effectiveRatioSV = useDerivedValue(() =>\n isDraggingSV.value ? scrubRatioSV.value : progressRatioSV.value\n )\n\n const showAccentSV = useDerivedValue(\n () =>\n chromeVisibleSV.value ||\n isDraggingSV.value ||\n timelineAccentEngagedSV.value\n )\n\n const showThumbSV = useDerivedValue(\n () =>\n chromeVisibleSV.value ||\n isDraggingSV.value ||\n timelineAccentEngagedSV.value\n )\n\n const thumbDiamSV = useDerivedValue(() =>\n isDraggingSV.value\n ? Math.round(\n thumbBaseDiamSV.value * MOVIIE_SKIN_TIMELINE_THUMB_DRAG_DIAMETER_MULTIPLIER\n )\n : thumbBaseDiamSV.value\n )\n\n // ── Animated styles ────────────────────────────────────────────────────────\n const progressBarStyle = useAnimatedStyle(() => ({\n backgroundColor: showAccentSV.value ? accent : foreground,\n width: `${effectiveRatioSV.value * 100}%`,\n }))\n\n const bufferBarStyle = useAnimatedStyle(() => ({\n width: `${bufferRatioSV.value * 100}%`,\n }))\n\n const thumbStyle = useAnimatedStyle(() => {\n if (!showThumbSV.value) {\n return { opacity: 0 }\n }\n const diameter = thumbDiamSV.value\n const radius = diameter / 2\n const w = trackWidthSV.value\n const left =\n w > 0\n ? Math.min(w - diameter, Math.max(0, effectiveRatioSV.value * w - radius))\n : 0\n const bh = barHeightSV.value\n return {\n opacity: 1,\n backgroundColor: showAccentSV.value ? accent : foreground,\n left,\n width: diameter,\n height: diameter,\n borderRadius: radius,\n bottom: bh / 2 - radius,\n }\n })\n\n // ── JS callbacks ───────────────────────────────────────────────────────────\n const onScrubBegin = useCallback(() => {\n isDraggingRef.current = true\n // Herda shouldResume de um commit anterior se o player ainda não retomou,\n // senão usa o estado actual do player.\n if (!shouldResumeRef.current) {\n shouldResumeRef.current = player.playing\n }\n }, [player])\n\n const onScrubUpdate = useCallback(\n (ratio: number) => {\n // Sem live seek: a barra anima via Reanimated (UI thread), o frame do vídeo\n // só é actualizado no commit. Evita seeks concorrentes que interferem com o resume.\n setTimelineScrubClockSeconds(ratio * durationSV.value)\n },\n [setTimelineScrubClockSeconds, durationSV]\n )\n\n const onScrubCommit = useCallback(\n (ratio: number) => {\n isDraggingRef.current = false\n setTimelineScrubClockSeconds(null)\n const dur = durationSV.value\n if (!Number.isFinite(dur) || dur <= 0) return\n const targetTime = computeTimelineScrubCommitTime({\n ratio,\n durationSeconds: dur,\n chapters: chaptersRef.current,\n })\n player.currentTime = targetTime\n // player.play() imediato pode ser ignorado se o seek ainda está em curso.\n // O listener statusChange(readyToPlay) faz o retry enquanto shouldResumeRef=true.\n // playingChange com isPlaying confirma e zera shouldResumeRef.\n if (shouldResumeRef.current) {\n player.play()\n }\n },\n [setTimelineScrubClockSeconds, player, durationSV]\n )\n\n const onScrubCancel = useCallback(() => {\n isDraggingRef.current = false\n setTimelineScrubClockSeconds(null)\n progressRatioSV.value = progressRatioLiveRef.current\n // Cancel não faz seek — shouldResumeRef não muda.\n // Se shouldResume=true (estava a tocar), o playingChange listener vai limpar quando\n // o player retomar normalmente (ou o utilizador faz outro scrub).\n }, [setTimelineScrubClockSeconds, progressRatioSV])\n\n const onAccentEngage = useCallback(() => {\n timelineAccentEngagedSV.value = true\n }, [timelineAccentEngagedSV])\n\n const onAccentDisengageCancel = useCallback(() => {\n timelineAccentEngagedSV.value = false\n }, [timelineAccentEngagedSV])\n\n // ── Gesture ────────────────────────────────────────────────────────────────\n // activeOffsetX: ativa só após 8 dp horizontal — evita conflito com ScrollView vertical.\n // failOffsetY: cancela se o utilizador scrollar mais de 15 dp — devolve gesto ao ScrollView.\n const panGesture = useMemo(\n () =>\n Gesture.Pan()\n .activeOffsetX([-8, 8])\n .failOffsetY([-15, 15])\n .enabled(durationOk)\n .onBegin(() => {\n \"worklet\"\n if (!chromeVisibleSV.value && !timelineAccentEngagedSV.value) {\n awaitingUnlockSV.value = true\n runOnJS(onAccentEngage)()\n }\n })\n .onStart((e) => {\n \"worklet\"\n if (awaitingUnlockSV.value) {\n // Primeira activação após accent-engage — aguarda onUpdate\n return\n }\n isDraggingSV.value = true\n runOnJS(onScrubBegin)()\n const w = trackWidthSV.value\n if (w <= 0) return\n const ratio = Math.max(0, Math.min(1, e.x / w))\n scrubRatioSV.value = ratio\n runOnJS(onScrubUpdate)(ratio)\n })\n .onUpdate((e) => {\n \"worklet\"\n const w = trackWidthSV.value\n if (w <= 0) return\n const ratio = Math.max(0, Math.min(1, e.x / w))\n if (awaitingUnlockSV.value) {\n awaitingUnlockSV.value = false\n isDraggingSV.value = true\n runOnJS(onScrubBegin)()\n }\n if (!isDraggingSV.value) return\n scrubRatioSV.value = ratio\n runOnJS(onScrubUpdate)(ratio)\n })\n .onEnd(() => {\n \"worklet\"\n if (awaitingUnlockSV.value) {\n awaitingUnlockSV.value = false\n runOnJS(onAccentDisengageCancel)()\n return\n }\n if (!isDraggingSV.value) return\n const committed = scrubRatioSV.value\n // Actualiza progressRatioSV ANTES de desactivar isDragging para evitar\n // que effectiveRatioSV salte de volta para a posição antiga (visual \"pause\").\n progressRatioSV.value = committed\n isDraggingSV.value = false\n scrubRatioSV.value = 0\n runOnJS(onScrubCommit)(committed)\n })\n .onFinalize(() => {\n \"worklet\"\n if (awaitingUnlockSV.value) {\n awaitingUnlockSV.value = false\n runOnJS(onAccentDisengageCancel)()\n return\n }\n if (isDraggingSV.value) {\n isDraggingSV.value = false\n scrubRatioSV.value = 0\n runOnJS(onScrubCancel)()\n }\n }),\n [\n durationOk,\n isDraggingSV,\n awaitingUnlockSV,\n scrubRatioSV,\n progressRatioSV,\n trackWidthSV,\n chromeVisibleSV,\n timelineAccentEngagedSV,\n onAccentEngage,\n onAccentDisengageCancel,\n onScrubBegin,\n onScrubUpdate,\n onScrubCommit,\n onScrubCancel,\n ]\n )\n\n const onTrackLayout = useCallback(\n (event: LayoutChangeEvent) => {\n trackWidthSV.value = event.nativeEvent.layout.width\n },\n [trackWidthSV]\n )\n\n if (!durationOk) {\n return null\n }\n\n const unifiedSlotHeightPx = Math.max(\n layout.timelineThumbDiameterPx,\n Math.round(\n layout.timelineThumbDiameterPx * MOVIIE_SKIN_TIMELINE_THUMB_DRAG_DIAMETER_MULTIPLIER\n )\n )\n\n const scrubHitSlop = {\n top: MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_TOP_DP,\n bottom: MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_BOTTOM_DP,\n left: MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_HORIZONTAL_DP,\n right: MOVIIE_SKIN_TIMELINE_SCRUB_HIT_SLOP_HORIZONTAL_DP,\n }\n\n return (\n <View pointerEvents=\"box-none\" style={styles.root}>\n <GestureDetector gesture={panGesture}>\n <View hitSlop={scrubHitSlop} pointerEvents=\"auto\" style={styles.touchExpansion}>\n <View style={styles.trackStack}>\n <View\n accessibilityRole=\"progressbar\"\n accessibilityValue={{\n max: 1,\n min: 0,\n now: progressRatioLive,\n }}\n collapsable={false}\n style={[styles.unifiedBarSlot, { height: unifiedSlotHeightPx }]}\n onLayout={onTrackLayout}\n >\n <View style={styles.railLayer} />\n <ReanimatedView style={[styles.bufferLayer, bufferBarStyle]} />\n <ReanimatedView style={[styles.progressLayer, progressBarStyle]} />\n <ReanimatedView style={[styles.thumbBase, thumbStyle]} />\n </View>\n </View>\n </View>\n </GestureDetector>\n </View>\n )\n}\n","import { MOVIIE_SMART_PROGRESS_CONFIG } from \"../constants\"\n\nfunction easeOutQuad(t: number): number {\n return t * (2 - t)\n}\n\nfunction easeInQuad(t: number): number {\n return t * t\n}\n\n/**\n * Maps real playback progress [0–1] to Smart Progress display [0–P_MAX_BEFORE_END],\n * mirroring the embed inline script (`mapProgress` in `templates/player.ts`).\n */\nexport function mapSmartProgressRawRatio(realUnitInterval: number): number {\n const r = Math.min(1, Math.max(0, realUnitInterval))\n const {\n R1,\n P1,\n R2,\n P2,\n P_MAX_BEFORE_END: pMax,\n } = MOVIIE_SMART_PROGRESS_CONFIG\n\n if (r <= 0) {\n return 0\n }\n if (r >= 1) {\n return pMax\n }\n\n if (r <= R1) {\n return P1 * easeOutQuad(r / R1)\n }\n\n if (r <= R2) {\n const t = (r - R1) / (R2 - R1)\n return P1 + (P2 - P1) * t\n }\n\n const t = (r - R2) / (1 - R2)\n return P2 + (pMax - P2) * easeInQuad(t)\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { Animated, StyleSheet, View } from \"react-native\"\n\nimport {\n MOVIIE_SMART_PROGRESS_BAR_HEIGHT_DP,\n MOVIIE_SMART_PROGRESS_FILL_TRANSITION_MS,\n MOVIIE_SMART_PROGRESS_Z_INDEX,\n} from \"../../constants\"\nimport { computePlaybackProgressRatio } from \"../../lib/compute-playback-progress-ratio\"\nimport { mapSmartProgressRawRatio } from \"../../lib/map-smart-progress-display-ratio\"\nimport { resolveSkinAccentColor } from \"../../lib/resolve-skin-accent-color\"\n\nimport { useMoviieSkinChrome } from \"./moviie-skin-chrome-context\"\n\nconst styles = StyleSheet.create({\n container: {\n bottom: 0,\n height: MOVIIE_SMART_PROGRESS_BAR_HEIGHT_DP,\n left: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n right: 0,\n zIndex: MOVIIE_SMART_PROGRESS_Z_INDEX,\n },\n fill: {\n bottom: 0,\n height: \"100%\",\n left: 0,\n position: \"absolute\",\n top: 0,\n },\n})\n\nexport function MoviieSkinSmartProgress() {\n const { playback, player, timelineScrubClockSeconds, ui } = useMoviieSkinChrome()\n\n const accent = resolveSkinAccentColor(playback.branding.primaryColor)\n\n const durationOk =\n playback.smartProgressEnabled &&\n Number.isFinite(ui.duration) &&\n ui.duration > 0 &&\n !player.isLive\n\n const [barVisible, setBarVisible] = useState(() => !player.muted)\n const hasUserInteractedRef = useRef(!player.muted)\n const lastDisplayedRef = useRef(0)\n const progressAnim = useRef(new Animated.Value(0)).current\n\n const syncMutedVisibility = useCallback(() => {\n const muted = player.muted\n if (!muted) {\n hasUserInteractedRef.current = true\n setBarVisible(true)\n return\n }\n if (!hasUserInteractedRef.current) {\n setBarVisible(false)\n }\n }, [player])\n\n useEffect(() => {\n syncMutedVisibility()\n const subMuted = player.addListener(\"mutedChange\", syncMutedVisibility)\n const subVolume = player.addListener(\"volumeChange\", syncMutedVisibility)\n return () => {\n subMuted.remove()\n subVolume.remove()\n }\n }, [player, syncMutedVisibility])\n\n useEffect(() => {\n lastDisplayedRef.current = 0\n progressAnim.setValue(0)\n }, [playback.embedId, progressAnim])\n\n useEffect(() => {\n if (!durationOk || !barVisible) {\n return\n }\n\n const scrubbing = timelineScrubClockSeconds != null\n const clockSeconds = scrubbing ? timelineScrubClockSeconds : ui.currentTime\n\n const realRatio = computePlaybackProgressRatio({\n currentTime: clockSeconds,\n duration: ui.duration,\n durationOk: true,\n playing: ui.playing,\n })\n\n const mapped = mapSmartProgressRawRatio(realRatio)\n const next = scrubbing\n ? mapped\n : Math.max(mapped, lastDisplayedRef.current)\n\n lastDisplayedRef.current = next\n\n Animated.timing(progressAnim, {\n duration: MOVIIE_SMART_PROGRESS_FILL_TRANSITION_MS,\n toValue: next,\n useNativeDriver: false,\n }).start()\n }, [\n barVisible,\n durationOk,\n progressAnim,\n timelineScrubClockSeconds,\n ui.currentTime,\n ui.duration,\n ui.playing,\n ])\n\n useEffect(() => {\n if (!durationOk || !barVisible) {\n return\n }\n\n const sub = player.addListener(\"playToEnd\", () => {\n lastDisplayedRef.current = 1\n Animated.timing(progressAnim, {\n duration: MOVIIE_SMART_PROGRESS_FILL_TRANSITION_MS,\n toValue: 1,\n useNativeDriver: false,\n }).start()\n })\n return () => sub.remove()\n }, [barVisible, durationOk, player, progressAnim])\n\n if (!playback.smartProgressEnabled || !durationOk) {\n return null\n }\n\n if (!barVisible) {\n return null\n }\n\n const widthInterpolated = progressAnim.interpolate({\n extrapolate: \"clamp\",\n inputRange: [0, 1],\n outputRange: [\"0%\", \"100%\"],\n })\n\n return (\n <View pointerEvents=\"none\" style={styles.container}>\n <Animated.View\n style={[\n styles.fill,\n {\n backgroundColor: accent,\n width: widthInterpolated,\n },\n ]}\n />\n </View>\n )\n}\n","import type { ReactNode } from 'react'\nimport { useCallback, useMemo } from 'react'\nimport type { PressableProps } from 'react-native'\nimport {\n ActivityIndicator,\n Animated,\n Pressable,\n StyleSheet,\n Text,\n View,\n type ViewStyle,\n} from 'react-native'\n\nimport {\n MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY,\n MOVIIE_SKIN_CHROME_CONTROL_REST_OPACITY,\n MOVIIE_SKIN_CHROME_FOREGROUND_HEX,\n MOVIIE_SKIN_CHROME_SCRIM_BLACK_RGBA,\n MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX,\n MOVIIE_SKIN_TOP_ICON_FULLSCREEN_VISUAL_SCALE,\n MOVIIE_SKIN_TOP_ICON_PIP_VISUAL_SCALE,\n} from '../../constants'\nimport type { MoviieSkinLayoutMetrics } from '../../lib/build-moviie-skin-layout-metrics'\nimport { computeMoviiePlaybackEnded } from '../../lib/compute-moviie-playback-ended'\nimport { formatPlaybackClock } from '../../lib/format-playback-clock'\nimport { AnimatedView } from '../../lib/jsx-native-bridge'\nimport {\n EmbedMediaIconFullscreen,\n EmbedMediaIconFullscreenExit,\n EmbedMediaIconPause,\n EmbedMediaIconPictureInPicture,\n EmbedMediaIconPlay,\n EmbedMediaIconReplay,\n EmbedMediaIconSeekBackward10,\n EmbedMediaIconSeekForward10,\n} from '../icons/embed-media-icons'\nimport { MoviieEmbedBrandMark } from '../icons/moviie-embed-brand-mark'\n\nimport { MoviieSkinCastCircleButton, MoviieSkinCastTopBareButton } from './moviie-cast-buttons'\nimport { MoviieSkinChromeEdgeGradients } from './moviie-chrome-edge-gradients'\nimport { MoviieSkinChromeProvider, useMoviieSkinChrome } from './moviie-skin-chrome-context'\nimport { MoviieSkinBottomTimeline } from './moviie-bottom-timeline'\nimport { MoviieSkinSmartProgress } from './moviie-skin-smart-progress'\n\nexport type { MoviieVideoSurfaceRef } from './moviie-skin-chrome-context'\n\nexport { MoviieSkinChromeProvider }\n\nexport { useMoviieSkinChrome } from './moviie-skin-chrome-context'\n\nfunction resolveChromeControlPressOpacityStyle(pressed: boolean): Pick<ViewStyle, 'opacity'> {\n return {\n opacity: pressed\n ? MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY\n : MOVIIE_SKIN_CHROME_CONTROL_REST_OPACITY,\n }\n}\n\nfunction createMoviieSkinOverlayStyles(layout: MoviieSkinLayoutMetrics) {\n return StyleSheet.create({\n chromeScrimBase: {\n backgroundColor: MOVIIE_SKIN_CHROME_SCRIM_BLACK_RGBA,\n },\n floatingHud: {\n bottom: 0,\n left: 0,\n pointerEvents: 'box-none',\n position: 'absolute',\n right: 0,\n },\n floatingHudInner: {\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingBottom: layout.floatingHudAboveTimelineGapPx,\n paddingHorizontal: layout.hudEdgeInsetPx,\n },\n floatingLeftSpacer: {\n flex: 1,\n },\n floatingRight: {\n alignItems: 'center',\n columnGap: layout.floatingHudButtonGapPx,\n flexDirection: 'row',\n flexShrink: 0,\n },\n clockScrim: {\n borderRadius: layout.hudClockCornerRadiusPx,\n overflow: 'hidden',\n paddingHorizontal: layout.hudEdgeInsetPx,\n paddingVertical: layout.hudEdgeInsetPx,\n },\n clockText: {\n color: MOVIIE_SKIN_CHROME_FOREGROUND_HEX,\n fontSize: layout.clockTextFontSizePx,\n fontVariant: ['tabular-nums'],\n },\n centerCluster: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'box-none',\n },\n centerClusterRow: {\n alignItems: 'center',\n columnGap: layout.centerClusterColumnGapPx,\n flexDirection: 'row',\n justifyContent: 'center',\n },\n seekCircularScrim: {\n alignItems: 'center',\n borderRadius: layout.seekScrimOuterDiameterPx / 2,\n height: layout.seekScrimOuterDiameterPx,\n justifyContent: 'center',\n overflow: 'hidden',\n width: layout.seekScrimOuterDiameterPx,\n },\n playScrim: {\n alignItems: 'center',\n borderRadius: layout.playScrimOuterDiameterPx / 2,\n height: layout.playScrimOuterDiameterPx,\n justifyContent: 'center',\n overflow: 'hidden',\n width: layout.playScrimOuterDiameterPx,\n },\n playPlaceholder: {\n height: layout.playScrimOuterDiameterPx,\n width: layout.playScrimOuterDiameterPx,\n },\n fullscreenHudCircleScrim: {\n alignItems: 'center',\n borderRadius: layout.floatingHudFullscreenScrimDiameterPx / 2,\n height: layout.floatingHudFullscreenScrimDiameterPx,\n justifyContent: 'center',\n overflow: 'hidden',\n width: layout.floatingHudFullscreenScrimDiameterPx,\n },\n topFullscreenCorner: {\n alignItems: 'center',\n columnGap: layout.floatingHudButtonGapPx,\n flexDirection: 'row',\n pointerEvents: 'box-none',\n position: 'absolute',\n right: layout.hudEdgeInsetPx,\n top: layout.hudEdgeInsetPx,\n zIndex: 8,\n },\n })\n}\n\nfunction ChromeScrimPad(props: {\n accessibilityLabel?: string\n accessibilityRole?: 'button' | 'link'\n children: ReactNode\n chromeScrimBaseStyle: object\n hitSlop?: PressableProps['hitSlop']\n onPress?: () => void\n style?: object\n}) {\n const padStyle = [props.chromeScrimBaseStyle, props.style]\n if (props.onPress != null) {\n return (\n <Pressable\n accessibilityLabel={props.accessibilityLabel}\n accessibilityRole={props.accessibilityRole ?? 'button'}\n hitSlop={props.hitSlop}\n onPress={props.onPress}\n style={(state) => [\n props.chromeScrimBaseStyle,\n props.style,\n resolveChromeControlPressOpacityStyle(state.pressed),\n ]}\n >\n {props.children}\n </Pressable>\n )\n }\n return <View style={padStyle}>{props.children}</View>\n}\n\nfunction MoviieSkinPictureInPictureCircleButton(props: {\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n pictureInPictureActive: boolean\n styles: ReturnType<typeof createMoviieSkinOverlayStyles>\n}) {\n return (\n <ChromeScrimPad\n accessibilityLabel={\n props.pictureInPictureActive ? 'Fechar imagem no imagem' : 'Imagem no imagem'\n }\n chromeScrimBaseStyle={props.styles.chromeScrimBase}\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n style={props.styles.fullscreenHudCircleScrim}\n >\n <EmbedMediaIconPictureInPicture\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={props.layout.floatingHudFullscreenIconPx}\n />\n </ChromeScrimPad>\n )\n}\n\nfunction MoviieSkinPictureInPictureTopBareButton(props: {\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n pictureInPictureActive: boolean\n}) {\n return (\n <Pressable\n accessibilityLabel={\n props.pictureInPictureActive ? 'Fechar imagem no imagem' : 'Imagem no imagem'\n }\n accessibilityRole=\"button\"\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n style={(state) => resolveChromeControlPressOpacityStyle(state.pressed)}\n >\n <EmbedMediaIconPictureInPicture\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={props.layout.floatingHudFullscreenTopIconPx * MOVIIE_SKIN_TOP_ICON_PIP_VISUAL_SCALE}\n />\n </Pressable>\n )\n}\n\nfunction MoviieSkinFullscreenCircleButton(props: {\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n styles: ReturnType<typeof createMoviieSkinOverlayStyles>\n isFullscreen: boolean\n}) {\n return (\n <ChromeScrimPad\n accessibilityLabel={props.isFullscreen ? 'Sair de ecrã inteiro' : 'Ecrã inteiro'}\n chromeScrimBaseStyle={props.styles.chromeScrimBase}\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n style={props.styles.fullscreenHudCircleScrim}\n >\n {props.isFullscreen ? (\n <EmbedMediaIconFullscreenExit\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={props.layout.floatingHudFullscreenIconPx}\n />\n ) : (\n <EmbedMediaIconFullscreen\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size={props.layout.floatingHudFullscreenIconPx}\n />\n )}\n </ChromeScrimPad>\n )\n}\n\nfunction MoviieSkinFullscreenTopBareButton(props: {\n layout: MoviieSkinLayoutMetrics\n onPress: () => void\n isFullscreen: boolean\n}) {\n const size =\n props.layout.floatingHudFullscreenTopIconPx * MOVIIE_SKIN_TOP_ICON_FULLSCREEN_VISUAL_SCALE\n return (\n <Pressable\n accessibilityLabel={props.isFullscreen ? 'Sair de ecrã inteiro' : 'Ecrã inteiro'}\n accessibilityRole=\"button\"\n hitSlop={MOVIIE_SKIN_FLOATING_HUD_TRAILING_HIT_SLOP_PX}\n onPress={props.onPress}\n style={(state) => resolveChromeControlPressOpacityStyle(state.pressed)}\n >\n {props.isFullscreen ? (\n <EmbedMediaIconFullscreenExit color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX} size={size} />\n ) : (\n <EmbedMediaIconFullscreen color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX} size={size} />\n )}\n </Pressable>\n )\n}\n\nfunction MoviieSkinBufferingIndicator() {\n const { isBuffering, layout } = useMoviieSkinChrome()\n\n const bufferingHudStyle = useMemo(\n () => ({\n alignItems: 'center' as const,\n height: layout.bufferingIndicatorSlotPx,\n justifyContent: 'center' as const,\n left: layout.hudEdgeInsetPx,\n position: 'absolute' as const,\n top: layout.hudEdgeInsetPx,\n width: layout.bufferingIndicatorSlotPx,\n zIndex: 16,\n }),\n [layout]\n )\n\n if (!isBuffering) {\n return null\n }\n\n return (\n <View pointerEvents=\"none\" style={bufferingHudStyle}>\n <ActivityIndicator\n accessibilityLabel=\"A carregar vídeo\"\n color={MOVIIE_SKIN_CHROME_FOREGROUND_HEX}\n size=\"small\"\n />\n </View>\n )\n}\n\nexport function MoviieSkinVideoOverlay() {\n const {\n chromeOpacity,\n chromeVisible,\n bumpChromeInteraction,\n castConnected,\n castControlEnabled,\n dismissChrome,\n isCustomFullscreen,\n openCastPicker,\n pictureInPictureActive,\n pictureInPictureControlEnabled,\n toggleFullscreen,\n togglePictureInPicture,\n layout,\n playback,\n player,\n seekBack,\n seekForward,\n timelineScrubClockSeconds,\n togglePlay,\n ui,\n } = useMoviieSkinChrome()\n\n const handlePictureInPicturePress = useCallback(() => {\n togglePictureInPicture()\n dismissChrome()\n }, [togglePictureInPicture, dismissChrome])\n\n const handleCastPress = useCallback(() => {\n // Dismiss chrome first so the overlay doesn't interfere with the native dialog presentation.\n dismissChrome()\n // Defer picker slightly to let the chrome animation settle before the native sheet presents.\n setTimeout(() => openCastPicker(), 150)\n }, [openCastPicker, dismissChrome])\n\n const styles = useMemo(() => createMoviieSkinOverlayStyles(layout), [layout])\n\n const { controls } = playback\n const fg = MOVIIE_SKIN_CHROME_FOREGROUND_HEX\n\n const clockDisplaySeconds = timelineScrubClockSeconds ?? ui.currentTime\n\n const playbackEndedForUi = useMemo(\n () =>\n computeMoviiePlaybackEnded({\n playing: ui.playing,\n currentTime: clockDisplaySeconds,\n duration: ui.duration,\n isLive: player.isLive,\n loop: player.loop,\n }),\n [ui.playing, clockDisplaySeconds, ui.duration, player.isLive, player.loop]\n )\n\n const { centerSeekBackwardEnabled, centerSeekForwardEnabled } = useMemo(() => {\n const alignSeekButtonsWithPlay = controls.showPlay && !player.isLive\n const hideSeekClusterAtEnd = playbackEndedForUi\n return {\n centerSeekBackwardEnabled:\n !hideSeekClusterAtEnd && (controls.seekBackwardEnabled || alignSeekButtonsWithPlay),\n centerSeekForwardEnabled:\n !hideSeekClusterAtEnd && (controls.seekForwardEnabled || alignSeekButtonsWithPlay),\n }\n }, [\n controls.seekBackwardEnabled,\n controls.seekForwardEnabled,\n controls.showPlay,\n player.isLive,\n playbackEndedForUi,\n ])\n\n const centerPlayShowsReplay = playbackEndedForUi\n\n const centerPlayAccessibilityLabel = ui.playing\n ? 'Pausar'\n : centerPlayShowsReplay\n ? 'Começar novamente'\n : 'Reproduzir'\n\n const clockLabel =\n controls.showCurrentTime || controls.showDuration\n ? formatPlaybackClock(clockDisplaySeconds, ui.duration)\n : null\n\n const showSeekCluster = centerSeekBackwardEnabled || centerSeekForwardEnabled || controls.showPlay\n\n const seekSlot = layout.seekScrimOuterDiameterPx\n\n const showPictureInPictureTrailing = pictureInPictureControlEnabled\n const showCastTrailing = castControlEnabled\n\n const hasFloatingHudTrailing =\n playback.branding.showWatermark ||\n (!playback.branding.showWatermark &&\n (controls.showFullscreen || showPictureInPictureTrailing || showCastTrailing))\n\n const showFloatingHud = clockLabel != null || hasFloatingHudTrailing\n\n const showFullscreenBottomTrailing = controls.showFullscreen && !playback.branding.showWatermark\n\n const showTopCornerChrome =\n playback.branding.showWatermark &&\n (controls.showFullscreen || showPictureInPictureTrailing || showCastTrailing)\n\n return (\n <View pointerEvents=\"box-none\" style={StyleSheet.absoluteFillObject}>\n <Pressable\n accessibilityLabel={\n chromeVisible\n ? 'Área do vídeo — toque para esconder os controles'\n : 'Mostrar controles do vídeo'\n }\n accessibilityRole=\"button\"\n onPress={chromeVisible ? dismissChrome : bumpChromeInteraction}\n style={[StyleSheet.absoluteFillObject, { zIndex: 0 }]}\n />\n\n <AnimatedView\n pointerEvents={!chromeVisible ? 'none' : 'box-none'}\n style={[\n StyleSheet.absoluteFillObject,\n {\n opacity: chromeOpacity,\n zIndex: 2,\n },\n ]}\n >\n <MoviieSkinChromeEdgeGradients layout={layout} showProgress={controls.showProgress} />\n\n {showTopCornerChrome ? (\n <View pointerEvents=\"box-none\" style={styles.topFullscreenCorner}>\n {showCastTrailing ? (\n <MoviieSkinCastTopBareButton\n castConnected={castConnected}\n layout={layout}\n onPress={handleCastPress}\n />\n ) : null}\n {showPictureInPictureTrailing ? (\n <MoviieSkinPictureInPictureTopBareButton\n layout={layout}\n pictureInPictureActive={pictureInPictureActive}\n onPress={handlePictureInPicturePress}\n />\n ) : null}\n {controls.showFullscreen ? (\n <MoviieSkinFullscreenTopBareButton\n isFullscreen={isCustomFullscreen}\n layout={layout}\n onPress={toggleFullscreen}\n />\n ) : null}\n </View>\n ) : null}\n\n {showFloatingHud ? (\n <View\n pointerEvents=\"box-none\"\n style={[\n styles.floatingHud,\n controls.showProgress ? { bottom: layout.timelineStackHeightChromeVisiblePx } : null,\n ]}\n >\n <View style={styles.floatingHudInner}>\n {clockLabel ? (\n <ChromeScrimPad\n chromeScrimBaseStyle={styles.chromeScrimBase}\n style={styles.clockScrim}\n >\n <Text accessibilityLabel={`Tempo ${clockLabel}`} style={styles.clockText}>\n {clockLabel}\n </Text>\n </ChromeScrimPad>\n ) : (\n <View style={styles.floatingLeftSpacer} />\n )}\n\n <View style={styles.floatingRight}>\n {playback.branding.showWatermark ? (\n <MoviieEmbedBrandMark />\n ) : (\n <>\n {showCastTrailing ? (\n <MoviieSkinCastCircleButton\n castConnected={castConnected}\n chromeScrimBaseStyle={styles.chromeScrimBase}\n circleScrimStyle={styles.fullscreenHudCircleScrim}\n layout={layout}\n onPress={handleCastPress}\n />\n ) : null}\n {showPictureInPictureTrailing ? (\n <MoviieSkinPictureInPictureCircleButton\n layout={layout}\n pictureInPictureActive={pictureInPictureActive}\n onPress={handlePictureInPicturePress}\n styles={styles}\n />\n ) : null}\n {showFullscreenBottomTrailing ? (\n <MoviieSkinFullscreenCircleButton\n isFullscreen={isCustomFullscreen}\n layout={layout}\n onPress={toggleFullscreen}\n styles={styles}\n />\n ) : null}\n </>\n )}\n </View>\n </View>\n </View>\n ) : null}\n\n {showSeekCluster ? (\n <View pointerEvents=\"box-none\" style={styles.centerCluster}>\n <View style={styles.centerClusterRow}>\n {centerSeekBackwardEnabled ? (\n <ChromeScrimPad\n accessibilityLabel=\"Retroceder 10 segundos\"\n chromeScrimBaseStyle={styles.chromeScrimBase}\n onPress={seekBack}\n style={styles.seekCircularScrim}\n >\n <EmbedMediaIconSeekBackward10 color={fg} size={layout.seekIconPx} />\n </ChromeScrimPad>\n ) : (\n <View style={{ height: seekSlot, width: seekSlot }} />\n )}\n\n {controls.showPlay ? (\n <ChromeScrimPad\n accessibilityLabel={centerPlayAccessibilityLabel}\n chromeScrimBaseStyle={styles.chromeScrimBase}\n onPress={togglePlay}\n style={styles.playScrim}\n >\n {ui.playing ? (\n <EmbedMediaIconPause color={fg} size={layout.centerPlayIconPx} />\n ) : centerPlayShowsReplay ? (\n <EmbedMediaIconReplay color={fg} size={layout.centerPlayIconPx} />\n ) : (\n <EmbedMediaIconPlay color={fg} size={layout.centerPlayIconPx} />\n )}\n </ChromeScrimPad>\n ) : (\n <View style={styles.playPlaceholder} />\n )}\n\n {centerSeekForwardEnabled ? (\n <ChromeScrimPad\n accessibilityLabel=\"Avançar 10 segundos\"\n chromeScrimBaseStyle={styles.chromeScrimBase}\n onPress={seekForward}\n style={styles.seekCircularScrim}\n >\n <EmbedMediaIconSeekForward10 color={fg} size={layout.seekIconPx} />\n </ChromeScrimPad>\n ) : (\n <View style={{ height: seekSlot, width: seekSlot }} />\n )}\n </View>\n </View>\n ) : null}\n </AnimatedView>\n\n <MoviieSkinBufferingIndicator />\n <MoviieSkinSmartProgress />\n <MoviieSkinBottomTimeline />\n </View>\n )\n}\n","/**\n * Wrapper opcional para `expo-status-bar`. Quando o módulo não está instalado,\n * `setStatusBarHidden` vira no-op e um warn é disparado uma única vez por sessão.\n *\n * Modo degradado: a status bar fica visível em fullscreen JS (overlay leve por\n * cima do vídeo). Funcionalidade core do player não é afetada.\n */\nimport { warnOnce } from './warn-once'\n\ntype StatusBarAnimation = 'none' | 'fade' | 'slide'\n\ntype ExpoStatusBarModule = {\n setStatusBarHidden: (hidden: boolean, animation?: StatusBarAnimation) => void\n}\n\nlet cachedModule: ExpoStatusBarModule | null | undefined\n\nfunction loadModule(): ExpoStatusBarModule | null {\n if (cachedModule !== undefined) {\n return cachedModule\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n cachedModule = require('expo-status-bar') as ExpoStatusBarModule\n } catch {\n cachedModule = null\n warnOnce(\n 'moviie:expo-status-bar-missing',\n '[@moviie/player-expo] `expo-status-bar` não está instalado. Status bar não será ocultada em fullscreen JS. ' +\n 'Instala com `pnpm add expo-status-bar` se quiser este comportamento.'\n )\n }\n return cachedModule\n}\n\nexport function moviieSetStatusBarHidden(\n hidden: boolean,\n animation: StatusBarAnimation = 'fade'\n): void {\n const mod = loadModule()\n if (mod == null) return\n try {\n mod.setStatusBarHidden(hidden, animation)\n } catch {\n // Defensive: se o módulo está carregado mas o método explode, ignora —\n // status bar não é critical path.\n }\n}\n","import {\n OrientationLock,\n getOrientationLockAsync,\n lockAsync,\n unlockAsync,\n} from \"expo-screen-orientation\"\nimport { Platform } from \"react-native\"\n\nimport type { MoviieExpoOrientationLockValue } from \"../constants\"\n\nasync function restoreOrientationLockPolicy(\n previousLock: OrientationLock | undefined\n): Promise<void> {\n try {\n if (\n previousLock === undefined ||\n previousLock === OrientationLock.DEFAULT ||\n previousLock === OrientationLock.UNKNOWN\n ) {\n await unlockAsync()\n return\n }\n await lockAsync(previousLock)\n } catch {\n try {\n await unlockAsync()\n } catch {\n // noop\n }\n }\n}\n\nexport type CustomFullscreenNativeOrientationSubscription = {\n finish: () => Promise<void>\n}\n\nexport function subscribeCustomFullscreenNativeOrientation(\n targetLock: MoviieExpoOrientationLockValue\n): CustomFullscreenNativeOrientationSubscription {\n if (Platform.OS === \"web\") {\n return { finish: async () => {} }\n }\n\n let cancelled = false\n let locked = false\n let previousLock: OrientationLock | undefined\n\n const setup = (async () => {\n try {\n previousLock = await getOrientationLockAsync()\n if (cancelled) {\n return\n }\n\n await lockAsync(targetLock as OrientationLock)\n if (cancelled) {\n await restoreOrientationLockPolicy(previousLock)\n return\n }\n\n locked = true\n } catch {\n // noop\n }\n })()\n\n let finishPromise: Promise<void> | null = null\n\n return {\n finish: () => {\n if (finishPromise != null) {\n return finishPromise\n }\n\n cancelled = true\n\n finishPromise = (async () => {\n await setup\n if (locked) {\n locked = false\n await restoreOrientationLockPolicy(previousLock)\n }\n })()\n\n return finishPromise\n },\n }\n}\n","import {\n MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE,\n type MoviieExpoOrientationLockValue,\n} from \"../constants\"\n\n/**\n * Mapeia a rotação Z do palco fullscreen para o valor de `OrientationLock` do `expo-screen-orientation`,\n * usando {@link MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE} (espelho Enum SDK 52).\n */\nexport function resolveOrientationLockValueForRotateZDeg(\n rotateZDeg: number\n): MoviieExpoOrientationLockValue {\n const normalized = ((rotateZDeg % 360) + 360) % 360\n if (normalized === 90) {\n return MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE.LANDSCAPE_RIGHT\n }\n if (normalized === 270) {\n return MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE.LANDSCAPE_LEFT\n }\n return MOVIIE_EXPO_SCREEN_ORIENTATION_LOCK_VALUE.LANDSCAPE\n}\n","import {\n forwardRef,\n type ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react'\nimport { Modal, Platform, StyleSheet, useWindowDimensions, View } from 'react-native'\nimport Animated, {\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { moviieSetStatusBarHidden } from '../lib/optional-status-bar'\n\nimport {\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_ENTER_SCALE_START,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_ROTATE_Z_DEGREES,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_BACKGROUND_HEX,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_OVERSCAN_PX,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_TRANSITION_MS,\n} from '../constants'\nimport { computeCustomFullscreenStageDimensions } from '../lib/compute-custom-fullscreen-stage-dimensions'\nimport { subscribeCustomFullscreenNativeOrientation } from '../lib/custom-fullscreen-native-orientation'\nimport { ReanimatedView } from '../lib/jsx-native-bridge'\nimport { resolveOrientationLockValueForRotateZDeg } from '../lib/resolve-orientation-lock-for-rotate-z-deg'\n\nconst CUSTOM_FULLSCREEN_TIMING = {\n duration: MOVIIE_SKIN_CUSTOM_FULLSCREEN_TRANSITION_MS,\n} as const\n\n/**\n * Em iOS/Android o fullscreen usa `expo-screen-orientation`: o referencial da janela passa a landscape.\n * Rotação Z adicional somaria com a orientação nativa e invertia o resultado.\n * Na web mantemos rotação só em JS (sem lock nativo fiável no nosso fluxo).\n */\nconst CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION = Platform.OS === 'web'\n\nexport type MoviieSkinCustomFullscreenModalHandle = {\n animateExit: () => void\n}\n\nexport type MoviieSkinCustomFullscreenModalProps = {\n visible: boolean\n onExitComplete: () => void\n children: ReactNode\n}\n\nconst MoviieSkinCustomFullscreenModalInner = forwardRef<\n MoviieSkinCustomFullscreenModalHandle,\n MoviieSkinCustomFullscreenModalProps\n>(function MoviieSkinCustomFullscreenModalInner(props, ref) {\n const orientationFinishRef = useRef<(() => Promise<void>) | null>(null)\n\n const insets = useSafeAreaInsets()\n const { height: winH, width: winW } = useWindowDimensions()\n\n const { longSide, shortSide } = useMemo(\n () =>\n computeCustomFullscreenStageDimensions({\n windowHeight: winH,\n safeInsets: insets,\n stageOverscanPx: MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_OVERSCAN_PX,\n windowWidth: winW,\n }),\n [winW, winH, insets.bottom, insets.left, insets.right, insets.top]\n )\n\n const rotateZDeg = useSharedValue(0)\n const scale = useSharedValue(1)\n\n const emitExitComplete = useCallback(() => {\n props.onExitComplete()\n }, [props.onExitComplete])\n\n const completeExitAfterNativeOrientationRestore = useCallback(() => {\n void (async () => {\n await orientationFinishRef.current?.()\n emitExitComplete()\n })()\n }, [emitExitComplete])\n\n const animateExit = useCallback(() => {\n scale.value = withTiming(\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_ENTER_SCALE_START,\n CUSTOM_FULLSCREEN_TIMING,\n (finishedScale) => {\n if (!CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION && finishedScale) {\n runOnJS(completeExitAfterNativeOrientationRestore)()\n }\n }\n )\n\n if (CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION) {\n rotateZDeg.value = withTiming(0, CUSTOM_FULLSCREEN_TIMING, (finished) => {\n if (finished) {\n runOnJS(emitExitComplete)()\n }\n })\n return\n }\n\n rotateZDeg.value = 0\n }, [completeExitAfterNativeOrientationRestore, emitExitComplete, rotateZDeg, scale])\n\n useImperativeHandle(ref, () => ({ animateExit }), [animateExit])\n\n useEffect(() => {\n if (!props.visible) {\n return\n }\n rotateZDeg.value = 0\n scale.value = MOVIIE_SKIN_CUSTOM_FULLSCREEN_ENTER_SCALE_START\n if (CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION) {\n rotateZDeg.value = withTiming(\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_ROTATE_Z_DEGREES,\n CUSTOM_FULLSCREEN_TIMING\n )\n }\n scale.value = withTiming(1, CUSTOM_FULLSCREEN_TIMING)\n }, [props.visible, rotateZDeg, scale])\n\n useEffect(() => {\n if (!props.visible) {\n return\n }\n moviieSetStatusBarHidden(true, 'fade')\n return () => {\n moviieSetStatusBarHidden(false, 'fade')\n }\n }, [props.visible])\n\n useEffect(() => {\n if (!props.visible || CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION) {\n orientationFinishRef.current = null\n return\n }\n\n const targetLock = resolveOrientationLockValueForRotateZDeg(\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_ROTATE_Z_DEGREES\n )\n const sub = subscribeCustomFullscreenNativeOrientation(targetLock)\n orientationFinishRef.current = () => sub.finish()\n\n return () => {\n orientationFinishRef.current = null\n void sub.finish()\n }\n }, [props.visible])\n\n const animatedStyle = useAnimatedStyle(() => {\n if (CUSTOM_FULLSCREEN_USE_JS_STAGE_ROTATION) {\n return {\n transform: [{ rotateZ: `${rotateZDeg.value}deg` }, { scale: scale.value }],\n }\n }\n\n return {\n transform: [{ scale: scale.value }],\n }\n })\n\n const stageStaticStyle = useMemo(\n () => ({\n height: shortSide,\n width: longSide,\n }),\n [longSide, shortSide]\n )\n\n return (\n <View\n style={[styles.root, { backgroundColor: MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_BACKGROUND_HEX }]}\n >\n <View style={styles.centerSheet}>\n <ReanimatedView style={[styles.rotatingStage, stageStaticStyle, animatedStyle]}>\n {props.children}\n </ReanimatedView>\n </View>\n </View>\n )\n})\n\nexport const MoviieSkinCustomFullscreenModal = forwardRef<\n MoviieSkinCustomFullscreenModalHandle,\n MoviieSkinCustomFullscreenModalProps\n>(function MoviieSkinCustomFullscreenModal(props, ref) {\n return (\n <Modal\n animationType=\"none\"\n hardwareAccelerated={Platform.OS === 'android'}\n onRequestClose={() => {\n if (ref != null && typeof ref !== 'function') {\n ref.current?.animateExit()\n }\n }}\n presentationStyle=\"fullScreen\"\n statusBarTranslucent={Platform.OS === 'android'}\n supportedOrientations={[\n 'portrait',\n 'portrait-upside-down',\n 'landscape',\n 'landscape-left',\n 'landscape-right',\n ]}\n visible={props.visible}\n >\n <SafeAreaProvider>\n <MoviieSkinCustomFullscreenModalInner ref={ref} {...props} />\n </SafeAreaProvider>\n </Modal>\n )\n})\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n centerSheet: {\n alignItems: 'center',\n flex: 1,\n justifyContent: 'center',\n overflow: 'visible',\n },\n rotatingStage: {\n position: 'relative',\n },\n})\n","import type { MoviieErrorCode } from \"@moviie/player-sdk\"\nimport {\n MoviieAuthError,\n MoviieBundleBlockedError,\n MoviieNetworkError,\n MoviieNotFoundError,\n MoviieRateLimitError,\n MoviieReferrerBlockedError,\n MoviieSubscriptionInactiveError,\n} from \"@moviie/player-sdk\"\n\nimport { MOVIIE_DASHBOARD_URL } from \"./moviie-shell-tokens\"\n\nexport type MoviieShellCtaKind = \"retry\" | \"external\" | \"none\"\n\nexport interface MoviieShellErrorDisplay {\n code: MoviieErrorCode\n numericCode: string\n heading: string\n description: string\n ctaLabel: string | null\n ctaKind: MoviieShellCtaKind\n externalUrl: string | null\n}\n\nconst ERROR_NUMERIC_CODE: Record<MoviieErrorCode, string> = {\n auth: \"E1001\",\n not_found: \"E1002\",\n bundle_blocked: \"E1003\",\n referrer_blocked: \"E1004\",\n subscription_inactive: \"E1005\",\n network: \"E2001\",\n rate_limit: \"E2002\",\n unknown: \"E9999\",\n}\n\nfunction resolveErrorCode(error: Error): MoviieErrorCode {\n if (error instanceof MoviieAuthError) return \"auth\"\n if (error instanceof MoviieNotFoundError) return \"not_found\"\n if (error instanceof MoviieBundleBlockedError) return \"bundle_blocked\"\n if (error instanceof MoviieReferrerBlockedError) return \"referrer_blocked\"\n if (error instanceof MoviieSubscriptionInactiveError) return \"subscription_inactive\"\n if (error instanceof MoviieNetworkError) return \"network\"\n if (error instanceof MoviieRateLimitError) return \"rate_limit\"\n const code = (error as { code?: unknown }).code\n if (typeof code === \"string\") {\n const known: MoviieErrorCode[] = [\n \"auth\",\n \"not_found\",\n \"bundle_blocked\",\n \"referrer_blocked\",\n \"subscription_inactive\",\n \"network\",\n \"rate_limit\",\n ]\n if ((known as string[]).includes(code)) {\n return code as MoviieErrorCode\n }\n }\n return \"unknown\"\n}\n\nexport function getErrorDisplay(error: Error): MoviieShellErrorDisplay {\n const code = resolveErrorCode(error)\n\n switch (code) {\n case \"auth\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Configuração inválida\",\n description: \"Verifique a chave publicável do SDK.\",\n ctaLabel: \"Acessar Moviie\",\n ctaKind: \"external\",\n externalUrl: MOVIIE_DASHBOARD_URL,\n }\n case \"not_found\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Reprodução indisponível\",\n description: \"Não conseguimos encontrar este vídeo.\",\n ctaLabel: \"Acessar Moviie\",\n ctaKind: \"external\",\n externalUrl: MOVIIE_DASHBOARD_URL,\n }\n case \"bundle_blocked\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Aplicativo não autorizado\",\n description: \"Este aplicativo não está autorizado a reproduzir este vídeo.\",\n ctaLabel: \"Ajustar permissões\",\n ctaKind: \"external\",\n externalUrl: MOVIIE_DASHBOARD_URL,\n }\n case \"referrer_blocked\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Origem não autorizada\",\n description: \"Origem não autorizada para reprodução.\",\n ctaLabel: \"Acessar Moviie\",\n ctaKind: \"external\",\n externalUrl: MOVIIE_DASHBOARD_URL,\n }\n case \"subscription_inactive\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Reprodução temporariamente indisponível\",\n description: \"Acesse a Moviie para continuar assistindo.\",\n ctaLabel: \"Ir para a Moviie\",\n ctaKind: \"external\",\n externalUrl: MOVIIE_DASHBOARD_URL,\n }\n case \"network\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Erro de conexão\",\n description: \"Verifique sua conexão e tente novamente.\",\n ctaLabel: \"Tentar de novo\",\n ctaKind: \"retry\",\n externalUrl: null,\n }\n case \"rate_limit\":\n return {\n code,\n numericCode: ERROR_NUMERIC_CODE[code],\n heading: \"Muitas solicitações\",\n description: \"Aguarde alguns instantes e tente novamente.\",\n ctaLabel: \"Tentar de novo\",\n ctaKind: \"retry\",\n externalUrl: null,\n }\n case \"unknown\":\n default:\n return {\n code: \"unknown\",\n numericCode: ERROR_NUMERIC_CODE[\"unknown\"],\n heading: \"Erro temporário\",\n description: \"Tente novamente em instantes.\",\n ctaLabel: \"Tentar de novo\",\n ctaKind: \"retry\",\n externalUrl: null,\n }\n }\n}\n","import { useCallback } from 'react'\nimport { Linking, Pressable, StyleSheet, Text, View } from 'react-native'\n\nimport { getErrorDisplay } from '../lib/moviie-error-display'\nimport {\n MOVIIE_SHELL_BACKGROUND_HEX,\n MOVIIE_SHELL_BUTTON_BG_HEX,\n MOVIIE_SHELL_BUTTON_BORDER_RGBA,\n MOVIIE_SHELL_BUTTON_LABEL_FONT_SIZE_PX,\n MOVIIE_SHELL_BUTTON_LABEL_HEX,\n MOVIIE_SHELL_BUTTON_PADDING_H_PX,\n MOVIIE_SHELL_BUTTON_PADDING_V_PX,\n MOVIIE_SHELL_BUTTON_RADIUS_PX,\n MOVIIE_SHELL_CONTENT_MAX_WIDTH_PX,\n MOVIIE_SHELL_DESCRIPTION_FONT_SIZE_PX,\n MOVIIE_SHELL_DESCRIPTION_HEX,\n MOVIIE_SHELL_ERROR_CODE_HEX,\n MOVIIE_SHELL_HEADING_FONT_SIZE_PX,\n MOVIIE_SHELL_HEADING_HEX,\n MOVIIE_SHELL_RADIAL_INNER_HEX,\n} from '../lib/moviie-shell-tokens'\nimport { MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY } from '../constants'\n\nexport interface MoviiePlayerErrorShellProps {\n error: Error\n onRetry?: () => void\n}\n\nexport function MoviiePlayerErrorShell({\n error,\n onRetry,\n}: MoviiePlayerErrorShellProps): JSX.Element {\n const display = getErrorDisplay(error)\n\n const handlePress = useCallback(() => {\n if (display.ctaKind === 'retry') {\n onRetry?.()\n return\n }\n if (display.ctaKind === 'external' && display.externalUrl) {\n void Linking.openURL(display.externalUrl).catch(() => {\n /* device may not support opening URL */\n })\n }\n }, [display, onRetry])\n\n const showCta = display.ctaLabel != null && display.ctaKind !== 'none'\n\n return (\n <View style={styles.root} accessibilityRole=\"alert\">\n {/* Radial vignette: same approach as loading shell — View-based, no SVG dependency */}\n <View style={styles.radialGlow} />\n <Text style={styles.errorCode} selectable>\n {display.numericCode}\n </Text>\n <View style={styles.content}>\n <Text style={styles.heading} numberOfLines={2}>\n {display.heading}\n </Text>\n <Text style={styles.description} numberOfLines={4}>\n {display.description}\n </Text>\n {showCta ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={display.ctaLabel ?? undefined}\n onPress={handlePress}\n style={({ pressed }) => [styles.button, pressed ? styles.buttonPressed : null]}\n >\n <Text style={styles.buttonLabel}>{display.ctaLabel}</Text>\n </Pressable>\n ) : null}\n </View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n root: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: MOVIIE_SHELL_BACKGROUND_HEX,\n overflow: 'hidden',\n alignItems: 'center',\n justifyContent: 'center',\n },\n /** Simulates radial gradient: dark outer, lighter center. */\n radialGlow: {\n position: 'absolute',\n width: '150%',\n aspectRatio: 1,\n borderRadius: 9999,\n backgroundColor: MOVIIE_SHELL_RADIAL_INNER_HEX,\n },\n content: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n gap: 10,\n },\n heading: {\n color: MOVIIE_SHELL_HEADING_HEX,\n fontSize: MOVIIE_SHELL_HEADING_FONT_SIZE_PX,\n fontWeight: '600',\n textAlign: 'center',\n maxWidth: MOVIIE_SHELL_CONTENT_MAX_WIDTH_PX,\n },\n description: {\n color: MOVIIE_SHELL_DESCRIPTION_HEX,\n fontSize: MOVIIE_SHELL_DESCRIPTION_FONT_SIZE_PX,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: MOVIIE_SHELL_CONTENT_MAX_WIDTH_PX,\n },\n errorCode: {\n position: 'absolute',\n bottom: 8,\n right: 10,\n color: MOVIIE_SHELL_ERROR_CODE_HEX,\n fontSize: 10,\n fontFamily: 'Menlo',\n opacity: 0.45,\n zIndex: 2,\n },\n button: {\n marginTop: 6,\n paddingVertical: MOVIIE_SHELL_BUTTON_PADDING_V_PX,\n paddingHorizontal: MOVIIE_SHELL_BUTTON_PADDING_H_PX,\n backgroundColor: MOVIIE_SHELL_BUTTON_BG_HEX,\n borderColor: MOVIIE_SHELL_BUTTON_BORDER_RGBA,\n borderWidth: StyleSheet.hairlineWidth * 2,\n borderRadius: MOVIIE_SHELL_BUTTON_RADIUS_PX,\n },\n buttonPressed: {\n opacity: MOVIIE_SKIN_CHROME_CONTROL_PRESSED_OPACITY,\n },\n buttonLabel: {\n color: MOVIIE_SHELL_BUTTON_LABEL_HEX,\n fontSize: MOVIIE_SHELL_BUTTON_LABEL_FONT_SIZE_PX,\n fontWeight: '600',\n textAlign: 'center',\n },\n})\n","import { ActivityIndicator, Image, StyleSheet, View } from 'react-native'\n\nimport { resolveSkinAccentColor } from '../lib/resolve-skin-accent-color'\nimport {\n MOVIIE_SHELL_BACKGROUND_HEX,\n MOVIIE_SHELL_RADIAL_INNER_HEX,\n} from '../lib/moviie-shell-tokens'\n\nexport interface MoviiePlayerLoadingShellProps {\n posterUrl?: string | null\n primaryColor?: string | null\n}\n\nexport function MoviiePlayerLoadingShell({\n posterUrl,\n primaryColor,\n}: MoviiePlayerLoadingShellProps): JSX.Element {\n const accent = resolveSkinAccentColor(primaryColor ?? null)\n\n return (\n <View style={styles.root} accessibilityRole=\"progressbar\" accessibilityLabel=\"Carregando vídeo\">\n {/* Radial vignette: large rounded View centered creates a center-bright illusion */}\n <View style={styles.radialGlow} />\n {posterUrl ? (\n <Image source={{ uri: posterUrl }} style={styles.poster} resizeMode=\"cover\" />\n ) : null}\n <View style={styles.center}>\n <ActivityIndicator size=\"large\" color={accent} />\n </View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n root: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: MOVIIE_SHELL_BACKGROUND_HEX,\n overflow: 'hidden',\n alignItems: 'center',\n justifyContent: 'center',\n },\n /** Simulates radial gradient: dark outer, lighter center. */\n radialGlow: {\n position: 'absolute',\n width: '150%',\n aspectRatio: 1,\n borderRadius: 9999,\n backgroundColor: MOVIIE_SHELL_RADIAL_INNER_HEX,\n },\n poster: {\n ...StyleSheet.absoluteFillObject,\n opacity: 0.35,\n },\n center: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n },\n})\n","import {\n createElement,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ForwardedRef,\n} from 'react'\nimport { View, StyleSheet, useWindowDimensions } from 'react-native'\nimport { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'\nimport { ReanimatedView } from '../lib/jsx-native-bridge'\nimport { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'\n\nimport type { VideoContentFit, VideoViewProps } from 'expo-video'\nimport { VideoView, isPictureInPictureSupported } from 'expo-video'\n\nimport type { MoviieVideoProps } from './moviie-video-props'\nimport { safeInvokeMoviieTelemetry } from '../lib/moviie-telemetry-callbacks'\n\nimport {\n MOVIIE_PLAYBACK_PROFILE,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_BACKGROUND_HEX,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_OVERSCAN_PX,\n MOVIIE_SKIN_CUSTOM_FULLSCREEN_VIDEO_CONTENT_FIT,\n MOVIIE_VIDEO_DEFAULT_CONTENT_FIT,\n} from '../constants'\nimport {\n MOVIIE_SHELL_CROSSFADE_DURATION_MS,\n MOVIIE_SHELL_DEFAULT_ASPECT_RATIO,\n} from '../lib/moviie-shell-tokens'\nimport { partitionMoviieVideoHostStyle } from '../lib/partition-moviie-video-host-style'\nimport { computeCustomFullscreenStageDimensions } from '../lib/compute-custom-fullscreen-stage-dimensions'\nimport { buildMoviieVideoPresentationProps } from '../lib/build-moviie-video-presentation'\nimport type { MoviieCastState } from '../lib/moviie-cast-adapter'\nimport { getRegisteredCastAdapter } from '../lib/cast-adapter-registry'\nimport { warnOnce } from '../lib/warn-once'\n\nimport {\n MoviieSkinChromeProvider,\n MoviieSkinVideoOverlay,\n type MoviieVideoSurfaceRef,\n} from './controls/moviie-controls'\nimport {\n MoviieSkinCustomFullscreenModal,\n type MoviieSkinCustomFullscreenModalHandle,\n} from './moviie-skin-custom-fullscreen-modal'\nimport { MoviiePlayerErrorShell } from './moviie-player-error-shell'\nimport { MoviiePlayerLoadingShell } from './moviie-player-loading-shell'\n\nfunction assignForwardedRef<T>(forwarded: ForwardedRef<T>, instance: T | null): void {\n if (typeof forwarded === 'function') {\n forwarded(instance)\n return\n }\n if (forwarded) {\n forwarded.current = instance\n }\n}\n\nexport type { MoviieVideoProps } from './moviie-video-props'\n\ntype VideoHostProps = VideoViewProps & {\n ref?: (instance: MoviieVideoSurfaceRef | null) => void\n}\n\nconst HostVideoView = VideoView as unknown as ComponentType<VideoHostProps>\n\ntype ShellState = 'loading' | 'error' | 'ready'\n\nconst CROSSFADE_TIMING = {\n duration: MOVIIE_SHELL_CROSSFADE_DURATION_MS,\n easing: Easing.out(Easing.quad),\n} as const\n\nexport const MoviieVideo = forwardRef<MoviieVideoSurfaceRef, MoviieVideoProps>(\n function MoviieVideo(props, ref) {\n return (\n <SafeAreaProvider>\n <MoviieVideoImpl ref={ref} {...props} />\n </SafeAreaProvider>\n )\n }\n)\n\nconst MoviieVideoImpl = forwardRef<MoviieVideoSurfaceRef, MoviieVideoProps>(\n function MoviieVideoImpl(props, forwardedRef) {\n const {\n player,\n nativeControls,\n native = false,\n playback = null,\n controlsAutoHideMs,\n controlsVisibleByDefault,\n pictureInPicture,\n pictureInPictureAutoStart,\n allowsPictureInPicture: passthroughAllowsPictureInPicture,\n startsPictureInPictureAutomatically: passthroughStartsPictureInPictureAutomatically,\n requiresLinearPlayback: passthroughRequiresLinearPlayback,\n onPictureInPictureStart: userOnPictureInPictureStart,\n onPictureInPictureStop: userOnPictureInPictureStop,\n children,\n style,\n contentFit,\n error = null,\n isLoading = false,\n aspectRatio,\n onRetry,\n retry,\n castAdapter: castAdapterProp,\n cast,\n onTelemetryError,\n onTelemetryEvent,\n ...videoRest\n } = props\n\n // Auto-detect: use explicit prop first, then fall back to side-effect registry\n // (populated when user imports \"@moviie/player-expo/cast\" in their app entry).\n const castAdapter = castAdapterProp ?? getRegisteredCastAdapter()\n\n // Telemetria opt-in: dispara `onTelemetryError` quando o fetch de playback\n // falha. Ref garante one-shot por instância de erro (evita duplicar em\n // re-renders) e `safeInvokeMoviieTelemetry` engole exceções do consumer.\n const lastReportedErrorRef = useRef<Error | null>(null)\n useEffect(() => {\n if (error == null) {\n lastReportedErrorRef.current = null\n return\n }\n if (lastReportedErrorRef.current === error) {\n return\n }\n lastReportedErrorRef.current = error\n safeInvokeMoviieTelemetry(onTelemetryError, error, {\n phase: 'playback_fetch',\n })\n }, [error, onTelemetryError])\n\n // Stub para futuras integrações: o callback de eventos não é disparado\n // ainda neste ciclo, mas o handle está reservado para wiring posterior\n // (play/pause/seek/ended). Mantém a API estável.\n void onTelemetryEvent\n\n const useMoviieChrome = !native\n\n const shellState: ShellState = playback != null ? 'ready' : error != null ? 'error' : 'loading'\n\n const loadingOpacity = useSharedValue(shellState === 'loading' ? 1 : 0)\n const errorOpacity = useSharedValue(shellState === 'error' ? 1 : 0)\n const playerOpacity = useSharedValue(shellState === 'ready' ? 1 : 0)\n\n useEffect(() => {\n loadingOpacity.value = withTiming(shellState === 'loading' ? 1 : 0, CROSSFADE_TIMING)\n errorOpacity.value = withTiming(shellState === 'error' ? 1 : 0, CROSSFADE_TIMING)\n playerOpacity.value = withTiming(shellState === 'ready' ? 1 : 0, CROSSFADE_TIMING)\n }, [shellState, loadingOpacity, errorOpacity, playerOpacity])\n\n const loadingAnimatedStyle = useAnimatedStyle(() => ({\n opacity: loadingOpacity.value,\n }))\n const errorAnimatedStyle = useAnimatedStyle(() => ({\n opacity: errorOpacity.value,\n }))\n const playerAnimatedStyle = useAnimatedStyle(() => ({\n opacity: playerOpacity.value,\n }))\n\n const effectiveOnRetry = useMemo(() => {\n if (onRetry) return onRetry\n if (retry) return retry\n return undefined\n }, [onRetry, retry])\n\n const nativePresentationVideoProps = useMemo(() => {\n if (playback != null) {\n const embedBaseline = buildMoviieVideoPresentationProps({\n pictureInPicture,\n pictureInPictureAutoStart,\n profile: playback.profile,\n showPip: playback.controls.showPip,\n })\n return {\n allowsPictureInPicture:\n passthroughAllowsPictureInPicture ?? embedBaseline.allowsPictureInPicture,\n startsPictureInPictureAutomatically:\n passthroughStartsPictureInPictureAutomatically ??\n embedBaseline.startsPictureInPictureAutomatically,\n requiresLinearPlayback:\n passthroughRequiresLinearPlayback ?? embedBaseline.requiresLinearPlayback,\n }\n }\n return {\n allowsPictureInPicture: passthroughAllowsPictureInPicture ?? false,\n startsPictureInPictureAutomatically:\n passthroughStartsPictureInPictureAutomatically ?? false,\n requiresLinearPlayback: passthroughRequiresLinearPlayback ?? false,\n }\n }, [\n playback,\n pictureInPicture,\n pictureInPictureAutoStart,\n passthroughAllowsPictureInPicture,\n passthroughStartsPictureInPictureAutomatically,\n passthroughRequiresLinearPlayback,\n ])\n\n const pipControlEnabled = useMemo(() => {\n if (!playback || !useMoviieChrome) {\n return false\n }\n return isPictureInPictureSupported() && nativePresentationVideoProps.allowsPictureInPicture\n }, [playback, useMoviieChrome, nativePresentationVideoProps.allowsPictureInPicture])\n\n const innerRef = useRef<MoviieVideoSurfaceRef | null>(null)\n const fullscreenModalRef = useRef<MoviieSkinCustomFullscreenModalHandle | null>(null)\n const [customFullscreen, setCustomFullscreen] = useState(false)\n const [pipActive, setPipActive] = useState(false)\n const [castState, setCastState] = useState<MoviieCastState>(() =>\n castAdapter?.isAvailable() ? castAdapter.getState() : 'unavailable'\n )\n\n const castDesired = useMemo(() => {\n if (!playback || !useMoviieChrome) return false\n if (cast === false) return false\n if (cast === true) return true\n return playback.controls.chromecast === true\n }, [cast, playback, useMoviieChrome])\n\n const castControlEnabled = useMemo(() => {\n if (!castDesired) return false\n return castAdapter?.isAvailable() === true\n }, [castAdapter, castDesired])\n\n const castConnected = castState === 'connected'\n\n const openCastPicker = useCallback(() => {\n void castAdapter?.showDevicePicker().catch(() => {\n /* native picker may be unavailable; UX falls back to no-op */\n })\n }, [castAdapter])\n\n // Subscribe to cast state changes when adapter is provided.\n useEffect(() => {\n if (!castAdapter?.isAvailable()) {\n setCastState('unavailable')\n return\n }\n setCastState(castAdapter.getState())\n const unsubscribe = castAdapter.subscribe((next) => {\n setCastState(next)\n })\n return () => {\n unsubscribe()\n }\n }, [castAdapter])\n\n // Warn once when embed asks for cast but no adapter is wired.\n useEffect(() => {\n if (castDesired && (!castAdapter || !castAdapter.isAvailable())) {\n warnOnce(\n 'moviie-cast-missing-adapter',\n '[@moviie/player-expo] O embed habilita Chromecast mas a lib não está disponível. Instale `react-native-google-cast` e adicione `import \"@moviie/player-expo/cast\"` no seu _layout.tsx (ver docs/player-expo/cast). Para desligar explicitamente, passe `cast={false}` em <MoviieVideo />.'\n )\n }\n }, [castDesired, castAdapter])\n\n // Hand off media to receiver when connected; pause local playback.\n useEffect(() => {\n if (!castAdapter?.isAvailable() || !playback || !player) return\n if (castState !== 'connected') return\n const startSeconds = player.currentTime ?? 0\n void castAdapter\n .loadMedia({\n uri: playback.playback.uri,\n title: playback.title,\n posterUrl: playback.posterUrl,\n durationSeconds: playback.durationSeconds ?? null,\n startSeconds,\n })\n .then(() => {\n try {\n player.pause()\n } catch {\n /* player may be in an unrecoverable state */\n }\n })\n .catch(() => {\n /* loadMedia failure — keep local player running */\n })\n }, [castAdapter, castState, playback, player])\n\n const { width: winW, height: winH } = useWindowDimensions()\n const safeAreaInsets = useSafeAreaInsets()\n\n const fullscreenStageLayout = useMemo(\n () =>\n computeCustomFullscreenStageDimensions({\n windowHeight: winH,\n safeInsets: safeAreaInsets,\n stageOverscanPx: MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_OVERSCAN_PX,\n windowWidth: winW,\n }),\n [\n winW,\n winH,\n safeAreaInsets.bottom,\n safeAreaInsets.left,\n safeAreaInsets.right,\n safeAreaInsets.top,\n ]\n )\n\n useEffect(() => {\n setPipActive(false)\n }, [playback?.embedId])\n\n const handleNativePictureInPictureStart = useCallback(() => {\n if (useMoviieChrome && playback != null) {\n setPipActive(true)\n }\n userOnPictureInPictureStart?.()\n }, [playback, useMoviieChrome, userOnPictureInPictureStart])\n\n const handleNativePictureInPictureStop = useCallback(() => {\n if (useMoviieChrome && playback != null) {\n setPipActive(false)\n }\n userOnPictureInPictureStop?.()\n }, [playback, useMoviieChrome, userOnPictureInPictureStop])\n\n const togglePictureInPicture = useCallback(async () => {\n const surface = innerRef.current\n if (!surface?.startPictureInPicture) {\n return\n }\n try {\n if (pipActive) {\n await surface.stopPictureInPicture?.()\n } else {\n await surface.startPictureInPicture()\n }\n } catch {\n /* PiP may be unavailable on device or misconfigured */\n }\n }, [pipActive])\n\n const requestExitCustomFullscreenAnimated = useCallback(() => {\n fullscreenModalRef.current?.animateExit()\n }, [])\n\n const setRefs = useCallback(\n (node: MoviieVideoSurfaceRef | null) => {\n innerRef.current = node\n assignForwardedRef(forwardedRef, node)\n },\n [forwardedRef]\n )\n\n const resolvedNativeControlsDefault = native\n ? playback?.profile === MOVIIE_PLAYBACK_PROFILE.VSL\n ? false\n : true\n : false\n\n const effectiveNativeControls = nativeControls ?? resolvedNativeControlsDefault\n\n const intrinsicAspectRatio =\n playback?.videoWidthPx != null &&\n playback?.videoHeightPx != null &&\n playback.videoWidthPx > 0 &&\n playback.videoHeightPx > 0\n ? playback.videoWidthPx / playback.videoHeightPx\n : null\n\n const effectiveAspectRatio =\n intrinsicAspectRatio ?? aspectRatio ?? MOVIIE_SHELL_DEFAULT_ASPECT_RATIO\n\n const effectiveContentFit: VideoContentFit | undefined =\n contentFit ??\n (playback != null\n ? playback.isVertical\n ? MOVIIE_VIDEO_DEFAULT_CONTENT_FIT.VERTICAL\n : MOVIIE_VIDEO_DEFAULT_CONTENT_FIT.HORIZONTAL\n : undefined)\n\n const { columnStyle, surfaceStyle } = partitionMoviieVideoHostStyle(StyleSheet.flatten(style))\n\n const stageContainerStyle = [\n styles.videoStage,\n {\n width: '100%' as const,\n aspectRatio: effectiveAspectRatio,\n alignSelf: 'stretch' as const,\n flex: 0 as const,\n },\n surfaceStyle,\n useMoviieChrome && playback ? styles.videoStageClipNone : null,\n ]\n\n const inlineVideoAndOverlay =\n player != null ? (\n useMoviieChrome && playback ? (\n <>\n {createElement(HostVideoView, {\n ...videoRest,\n ...nativePresentationVideoProps,\n ref: setRefs,\n player,\n nativeControls: effectiveNativeControls,\n onPictureInPictureStart: handleNativePictureInPictureStart,\n onPictureInPictureStop: handleNativePictureInPictureStop,\n ...(effectiveContentFit != null ? { contentFit: effectiveContentFit } : {}),\n style: styles.videoFill,\n })}\n <MoviieSkinVideoOverlay />\n </>\n ) : (\n createElement(HostVideoView, {\n ...videoRest,\n ...nativePresentationVideoProps,\n ref: setRefs,\n player,\n nativeControls: effectiveNativeControls,\n onPictureInPictureStart: handleNativePictureInPictureStart,\n onPictureInPictureStop: handleNativePictureInPictureStop,\n ...(effectiveContentFit != null ? { contentFit: effectiveContentFit } : {}),\n style: styles.videoFill,\n })\n )\n ) : null\n\n const renderInlineStage = (active: boolean) => {\n if (!playback || !useMoviieChrome) {\n return inlineVideoAndOverlay\n }\n if (active && !customFullscreen) {\n return inlineVideoAndOverlay\n }\n return (\n <View\n style={[\n styles.videoFill,\n {\n backgroundColor: MOVIIE_SKIN_CUSTOM_FULLSCREEN_STAGE_BACKGROUND_HEX,\n },\n ]}\n />\n )\n }\n\n const stageContent = (\n <View style={stageContainerStyle}>\n <ReanimatedView\n style={[StyleSheet.absoluteFillObject, loadingAnimatedStyle, styles.shellLayer]}\n pointerEvents={shellState === 'loading' ? 'auto' : 'none'}\n >\n {shellState === 'loading' || loadingOpacity.value > 0 ? (\n <MoviiePlayerLoadingShell\n posterUrl={playback?.posterUrl ?? null}\n primaryColor={playback?.branding.primaryColor ?? null}\n />\n ) : null}\n </ReanimatedView>\n <ReanimatedView\n style={[StyleSheet.absoluteFillObject, errorAnimatedStyle, styles.shellLayer]}\n pointerEvents={shellState === 'error' ? 'auto' : 'none'}\n >\n {error ? <MoviiePlayerErrorShell error={error} onRetry={effectiveOnRetry} /> : null}\n </ReanimatedView>\n <ReanimatedView\n style={[StyleSheet.absoluteFillObject, playerAnimatedStyle]}\n pointerEvents={shellState === 'ready' ? 'auto' : 'none'}\n >\n {renderInlineStage(true)}\n </ReanimatedView>\n </View>\n )\n\n if (useMoviieChrome && playback && player) {\n return (\n <MoviieSkinChromeProvider\n autoHideMs={controlsAutoHideMs}\n customFullscreen={customFullscreen}\n pictureInPictureActive={pipActive}\n pictureInPictureControlEnabled={pipControlEnabled}\n togglePictureInPicture={togglePictureInPicture}\n castControlEnabled={castControlEnabled}\n castConnected={castConnected}\n openCastPicker={openCastPicker}\n onRequestEnterCustomFullscreen={() => setCustomFullscreen(true)}\n onRequestExitCustomFullscreenAnimated={requestExitCustomFullscreenAnimated}\n playback={playback}\n player={player}\n skinLayoutMetricsWidth={\n customFullscreen ? fullscreenStageLayout.layoutMetricsBasisWidth : undefined\n }\n videoViewRef={innerRef}\n visibleByDefault={controlsVisibleByDefault}\n >\n <>\n <View style={[styles.column, columnStyle]}>\n {stageContent}\n {children}\n </View>\n <MoviieSkinCustomFullscreenModal\n ref={fullscreenModalRef}\n visible={customFullscreen}\n onExitComplete={() => setCustomFullscreen(false)}\n >\n <View style={styles.fullscreenStage}>\n {createElement(HostVideoView, {\n ...videoRest,\n ...nativePresentationVideoProps,\n ref: setRefs,\n player,\n nativeControls: effectiveNativeControls,\n onPictureInPictureStart: handleNativePictureInPictureStart,\n onPictureInPictureStop: handleNativePictureInPictureStop,\n contentFit: MOVIIE_SKIN_CUSTOM_FULLSCREEN_VIDEO_CONTENT_FIT,\n style: StyleSheet.absoluteFillObject,\n })}\n <MoviieSkinVideoOverlay />\n </View>\n </MoviieSkinCustomFullscreenModal>\n </>\n </MoviieSkinChromeProvider>\n )\n }\n\n return (\n <View style={[styles.column, columnStyle]}>\n {stageContent}\n {children}\n {castAdapter?.renderAndroidProxy?.()}\n </View>\n )\n }\n)\n\nconst styles = StyleSheet.create({\n column: {\n alignSelf: 'stretch',\n width: '100%',\n },\n videoStage: {\n overflow: 'hidden',\n position: 'relative',\n width: '100%',\n },\n videoStageClipNone: {\n overflow: 'visible',\n },\n videoFill: {\n flex: 1,\n width: '100%',\n alignSelf: 'stretch',\n },\n fullscreenStage: {\n flex: 1,\n position: 'relative',\n width: '100%',\n },\n shellLayer: {\n zIndex: 1,\n },\n})\n","/**\n * React error boundary que isola crashes do player do resto da árvore.\n *\n * Quando uma exceção é lançada durante o render/effect de `MoviieVideo` (ex.: bug\n * em `expo-video`, lib nativa ausente, payload corrompido), o consumer perderia\n * a UI inteira se não houvesse boundary. Este wrapper captura o erro, opcionalmente\n * notifica via `onError` (Sentry/PostHog do consumer) e renderiza um fallback.\n *\n * Use em torno de `MoviieVideo`:\n *\n * ```tsx\n * <MoviieErrorBoundary onError={Sentry.captureException}>\n * <MoviieVideo embedId={id} />\n * </MoviieErrorBoundary>\n * ```\n */\n\nimport React from 'react'\n\nexport interface MoviieErrorBoundaryProps {\n /**\n * Conteúdo protegido. Tipicamente `<MoviieVideo>` e árvores derivadas.\n */\n children: React.ReactNode\n /**\n * Render override quando há erro. Recebe `error` e função `reset` que limpa\n * o estado de erro e força nova montagem dos children.\n *\n * Default: `null` (renderiza nada). Recomendado passar um placeholder visual.\n */\n fallback?: (args: { error: Error; reset: () => void }) => React.ReactNode\n /**\n * Hook chamado uma vez por erro capturado. Use para telemetria\n * (Sentry/PostHog/Datadog) — não bloqueia o render do fallback.\n */\n onError?: (error: Error, info: React.ErrorInfo) => void\n}\n\ninterface MoviieErrorBoundaryState {\n error: Error | null\n}\n\nexport class MoviieErrorBoundary extends React.Component<\n MoviieErrorBoundaryProps,\n MoviieErrorBoundaryState\n> {\n override state: MoviieErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): MoviieErrorBoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: React.ErrorInfo): void {\n // Telemetria do consumer roda fora do ciclo de render para não derrubar a UI.\n if (this.props.onError != null) {\n try {\n this.props.onError(error, info)\n } catch {\n // Telemetria que crasha não pode escalar acima do boundary.\n }\n }\n }\n\n reset = (): void => {\n this.setState({ error: null })\n }\n\n override render(): React.ReactNode {\n if (this.state.error != null) {\n if (this.props.fallback != null) {\n return this.props.fallback({\n error: this.state.error,\n reset: this.reset,\n })\n }\n return null\n }\n return this.props.children\n }\n}\n"]}
|