@mottosports/motto-video-player 1.0.1-rc.36 → 1.0.1-rc.38

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/dist/index.mjs CHANGED
@@ -1106,8 +1106,8 @@ styleInject(`/*! tailwindcss v4.1.8 | MIT License | https://tailwindcss.com */
1106
1106
  import { forwardRef, useEffect as useEffect5, useRef as useRef8, useImperativeHandle } from "react";
1107
1107
  import shaka3 from "shaka-player/dist/shaka-player.ui";
1108
1108
 
1109
- // src/hooks/useShakePlayer.ts
1110
- import { useRef, useCallback } from "react";
1109
+ // src/hooks/useShakaPlayer.ts
1110
+ import { useRef, useCallback, useState } from "react";
1111
1111
  import shaka from "shaka-player/dist/shaka-player.ui";
1112
1112
 
1113
1113
  // src/utils/devices.ts
@@ -1130,17 +1130,186 @@ var isPlayReadySupported = () => {
1130
1130
  const isXbox = /Xbox/.test(userAgent);
1131
1131
  const isEdge = /Edg/.test(userAgent);
1132
1132
  const isIE = /Trident|MSIE/.test(userAgent);
1133
- return isXbox || isEdge || isIE;
1133
+ const isWindows = /Windows/.test(userAgent);
1134
+ return isXbox || (isEdge || isIE) && isWindows;
1135
+ };
1136
+ var isChrome64PlusOnMacOrWindows = () => {
1137
+ if (typeof navigator === "undefined") {
1138
+ return false;
1139
+ }
1140
+ const userAgent = navigator.userAgent || "";
1141
+ const isChromeMatch = userAgent.match(/Chrome\/(\d+)/);
1142
+ if (!isChromeMatch) {
1143
+ return false;
1144
+ }
1145
+ if (/Edg|OPR|Opera/.test(userAgent)) {
1146
+ return false;
1147
+ }
1148
+ const chromeVersion = parseInt(isChromeMatch[1], 10);
1149
+ if (chromeVersion < 64) {
1150
+ return false;
1151
+ }
1152
+ const isMacOS = /Mac OS X|Macintosh/.test(userAgent);
1153
+ const isWindows = /Windows/.test(userAgent);
1154
+ return isMacOS || isWindows;
1134
1155
  };
1135
1156
 
1136
- // src/hooks/useShakePlayer.ts
1157
+ // src/hooks/useShakaPlayer.ts
1137
1158
  import initShakaPlayerMux from "@mux/mux-data-shakaplayer";
1138
1159
 
1139
1160
  // package.json
1140
- var version = "1.0.1-rc.36";
1161
+ var version = "1.0.1-rc.38";
1162
+
1163
+ // src/utils/licenseCache.ts
1164
+ var PERSISTENT_LICENSE_PREFIX = "motto_lic_";
1165
+ var LICENSE_EXPIRY_MS = 7 * 24 * 60 * 60 * 1e3;
1166
+ var LICENSE_MAX_RETRY_ATTEMPTS = 10;
1167
+ var getAllLicenseCacheKeys = () => {
1168
+ const keys = [];
1169
+ for (let i = 0; i < localStorage.length; i++) {
1170
+ const key = localStorage.key(i);
1171
+ if (key?.startsWith(PERSISTENT_LICENSE_PREFIX)) {
1172
+ keys.push(key);
1173
+ }
1174
+ }
1175
+ return keys;
1176
+ };
1177
+ var getAllLicenseCacheEntries = () => {
1178
+ const keys = getAllLicenseCacheKeys();
1179
+ const entries = [];
1180
+ for (const key of keys) {
1181
+ try {
1182
+ const stored = localStorage.getItem(key);
1183
+ if (stored) {
1184
+ const data = JSON.parse(stored);
1185
+ entries.push({ key, data });
1186
+ }
1187
+ } catch (error) {
1188
+ console.warn(`Failed to parse license cache entry for key ${key}:`, error);
1189
+ localStorage.removeItem(key);
1190
+ }
1191
+ }
1192
+ return entries;
1193
+ };
1194
+ var evictLRUEntry = () => {
1195
+ const entries = getAllLicenseCacheEntries();
1196
+ if (entries.length === 0) {
1197
+ return false;
1198
+ }
1199
+ entries.sort((a, b) => {
1200
+ const oldestA = Math.min(...a.data.map((session) => session.timestamp));
1201
+ const oldestB = Math.min(...b.data.map((session) => session.timestamp));
1202
+ return oldestA - oldestB;
1203
+ });
1204
+ const lruEntry = entries[0];
1205
+ localStorage.removeItem(lruEntry.key);
1206
+ console.log(`Evicted LRU license cache entry: ${lruEntry.key}`);
1207
+ return true;
1208
+ };
1209
+ var storeWithQuotaHandling = (key, data) => {
1210
+ let attempts = 0;
1211
+ while (attempts < LICENSE_MAX_RETRY_ATTEMPTS) {
1212
+ try {
1213
+ localStorage.setItem(key, data);
1214
+ return true;
1215
+ } catch (error) {
1216
+ if (error instanceof DOMException && (error.code === 22 || // QUOTA_EXCEEDED_ERR
1217
+ error.name === "QuotaExceededError" || error.name === "NS_ERROR_DOM_QUOTA_REACHED")) {
1218
+ console.warn(`QuotaExceededError on attempt ${attempts + 1}, attempting LRU eviction...`);
1219
+ if (!evictLRUEntry()) {
1220
+ console.error("No more entries to evict, storage operation failed");
1221
+ return false;
1222
+ }
1223
+ attempts++;
1224
+ } else {
1225
+ console.error("Failed to store license cache data:", error);
1226
+ return false;
1227
+ }
1228
+ }
1229
+ }
1230
+ console.error(`Failed to store license cache data after ${LICENSE_MAX_RETRY_ATTEMPTS} eviction attempts`);
1231
+ return false;
1232
+ };
1233
+ var managePersistentLicenseStorage = (playlistId, licenseCacheKey, newSessionMetadata) => {
1234
+ try {
1235
+ const storageKey = `${PERSISTENT_LICENSE_PREFIX}${playlistId}_${licenseCacheKey}`;
1236
+ const stored = localStorage.getItem(storageKey);
1237
+ let existingSessions = [];
1238
+ if (stored) {
1239
+ try {
1240
+ existingSessions = JSON.parse(stored);
1241
+ } catch (parseError) {
1242
+ console.warn("Failed to parse existing persistent license data:", parseError);
1243
+ existingSessions = [];
1244
+ }
1245
+ }
1246
+ const now = Date.now();
1247
+ let validSessions = existingSessions.filter(
1248
+ (session) => now - session.timestamp < LICENSE_EXPIRY_MS
1249
+ );
1250
+ if (newSessionMetadata && newSessionMetadata.length > 0) {
1251
+ const newSessions = newSessionMetadata.map((session) => {
1252
+ const uint8Array = new Uint8Array(session.initData);
1253
+ const binaryString = Array.from(uint8Array).map((byte) => String.fromCharCode(byte)).join("");
1254
+ return {
1255
+ sessionId: session.sessionId,
1256
+ initData: btoa(binaryString),
1257
+ initDataType: session.initDataType,
1258
+ keySystem: session.keySystem,
1259
+ timestamp: now
1260
+ };
1261
+ });
1262
+ const newSessionIds = new Set(newSessions.map((s) => s.sessionId));
1263
+ validSessions = validSessions.filter((session) => !newSessionIds.has(session.sessionId));
1264
+ validSessions = [...validSessions, ...newSessions];
1265
+ }
1266
+ if (validSessions.length === 0) {
1267
+ localStorage.removeItem(storageKey);
1268
+ } else {
1269
+ const dataToStore = JSON.stringify(validSessions);
1270
+ const success = storeWithQuotaHandling(storageKey, dataToStore);
1271
+ if (!success) {
1272
+ console.error(`Failed to store license cache for ${storageKey} after quota handling`);
1273
+ return validSessions;
1274
+ }
1275
+ }
1276
+ return validSessions;
1277
+ } catch (error) {
1278
+ console.warn("Failed to manage persistent license storage:", error);
1279
+ return [];
1280
+ }
1281
+ };
1282
+ var storePersistentLicense = (playlistId, licenseCacheKey, sessionMetadata) => {
1283
+ managePersistentLicenseStorage(playlistId, licenseCacheKey, sessionMetadata);
1284
+ };
1285
+ var retrievePersistentLicense = (playlistId, licenseCacheKey) => {
1286
+ try {
1287
+ const validSessions = managePersistentLicenseStorage(playlistId, licenseCacheKey);
1288
+ return validSessions.map((session) => ({
1289
+ sessionId: session.sessionId,
1290
+ initData: Uint8Array.from(atob(session.initData), (c) => c.charCodeAt(0)).buffer,
1291
+ initDataType: session.initDataType,
1292
+ keySystem: session.keySystem
1293
+ }));
1294
+ } catch (error) {
1295
+ console.warn("Failed to retrieve persistent license:", error);
1296
+ return [];
1297
+ }
1298
+ };
1299
+ var clearAllPersistentLicenses = () => {
1300
+ try {
1301
+ const keys = getAllLicenseCacheKeys();
1302
+ for (const key of keys) {
1303
+ localStorage.removeItem(key);
1304
+ }
1305
+ console.log(`Cleared ${keys.length} persistent license cache entries`);
1306
+ } catch (error) {
1307
+ console.error("Failed to clear persistent licenses:", error);
1308
+ }
1309
+ };
1141
1310
 
1142
- // src/hooks/useShakePlayer.ts
1143
- var useShakePlayer = ({
1311
+ // src/hooks/useShakaPlayer.ts
1312
+ var useShakaPlayer = ({
1144
1313
  src,
1145
1314
  shakaConfig,
1146
1315
  drmConfig,
@@ -1151,8 +1320,26 @@ var useShakePlayer = ({
1151
1320
  onMuxDataUpdate
1152
1321
  }) => {
1153
1322
  const playerRef = useRef(null);
1154
- const initializePlayer = useCallback(async (video) => {
1323
+ const [isRetrying, setIsRetrying] = useState(false);
1324
+ const videoElementRef = useRef(null);
1325
+ const getManifestUrl = useCallback(() => {
1326
+ let manifestUrl = src.url;
1327
+ const isDRM = Boolean(src.drm);
1328
+ if (isDRM) {
1329
+ const isPlayReady = isPlayReadySupported();
1330
+ if (isAppleDevice() && src.drm.fairplay?.certificateUrl) {
1331
+ manifestUrl = src.drm.fairplay.playlistUrl;
1332
+ } else if (isPlayReady && src.drm.playready?.licenseUrl) {
1333
+ manifestUrl = src.drm.playready.playlistUrl;
1334
+ } else {
1335
+ manifestUrl = src.drm?.widevine?.playlistUrl || "";
1336
+ }
1337
+ }
1338
+ return manifestUrl;
1339
+ }, [src]);
1340
+ const initializePlayerInternal = useCallback(async (video) => {
1155
1341
  try {
1342
+ videoElementRef.current = video;
1156
1343
  shaka.polyfill.installAll();
1157
1344
  if (!shaka.Player.isBrowserSupported()) {
1158
1345
  throw new Error("Browser not supported by Shaka Player");
@@ -1163,36 +1350,55 @@ var useShakePlayer = ({
1163
1350
  if (shakaConfig) {
1164
1351
  player.configure(shakaConfig);
1165
1352
  }
1166
- let manifestUrl = src.url;
1353
+ const manifestUrl = getManifestUrl();
1354
+ let playlistId = src.id;
1167
1355
  const isDRM = Boolean(src.drm);
1168
- let cert = null;
1356
+ let storedSessionsMetadata = [];
1357
+ if (isDRM && playlistId) {
1358
+ storedSessionsMetadata = retrievePersistentLicense(playlistId, src.drm.licenseCacheKey ?? "");
1359
+ }
1169
1360
  if (isDRM) {
1170
- const isPlayReady = isPlayReadySupported();
1171
- if (isAppleDevice() && src.drm.fairplay?.certificateUrl) {
1172
- const req = await fetch(src.drm.fairplay.certificateUrl);
1173
- cert = await req.arrayBuffer();
1174
- manifestUrl = src.drm.fairplay.playlistUrl;
1175
- } else if (isPlayReady && src.drm.playready?.licenseUrl) {
1176
- manifestUrl = src.drm.playready.playlistUrl;
1177
- } else {
1178
- manifestUrl = src.drm?.widevine?.playlistUrl || "";
1179
- }
1180
- player.configure({
1181
- drm: {
1182
- servers: {
1183
- "com.widevine.alpha": src.drm.widevine?.licenseUrl,
1184
- "com.microsoft.playready": src.drm.playready?.licenseUrl,
1185
- "com.apple.fps": src.drm.fairplay?.licenseUrl
1186
- },
1187
- ...cert && {
1188
- advanced: {
1189
- "com.apple.fps": {
1190
- serverCertificate: new Uint8Array(cert)
1191
- }
1361
+ const drmConfig2 = {
1362
+ servers: {
1363
+ "com.widevine.alpha": src.drm.widevine?.licenseUrl,
1364
+ "com.microsoft.playready": src.drm.playready?.licenseUrl,
1365
+ "com.apple.fps": src.drm.fairplay?.licenseUrl
1366
+ },
1367
+ ...src.drm.fairplay && {
1368
+ advanced: {
1369
+ "com.apple.fps": {
1370
+ serverCertificateUri: src.drm.fairplay.certificateUrl
1192
1371
  }
1193
1372
  }
1194
1373
  }
1195
- });
1374
+ };
1375
+ drmConfig2.advanced = {
1376
+ ...drmConfig2.advanced,
1377
+ "com.widevine.alpha": {
1378
+ ...drmConfig2.advanced?.["com.widevine.alpha"],
1379
+ // set to `persistent-license` only on Chrome 64+ on MacOS/Windows: https://shaka-player-demo.appspot.com/docs/api/tutorial-faq.html
1380
+ sessionType: isChrome64PlusOnMacOrWindows() ? "persistent-license" : "temporary"
1381
+ },
1382
+ "com.microsoft.playready": {
1383
+ ...drmConfig2.advanced?.["com.microsoft.playready"],
1384
+ sessionType: "temporary"
1385
+ // PlayReady always uses temporary sessions
1386
+ },
1387
+ "com.apple.fps": {
1388
+ ...drmConfig2.advanced?.["com.apple.fps"],
1389
+ sessionType: "temporary"
1390
+ // FairPlay always uses temporary sessions - Safari won't play with persistent-license
1391
+ }
1392
+ };
1393
+ if (storedSessionsMetadata.length > 0) {
1394
+ drmConfig2.persistentSessionOnlinePlayback = true;
1395
+ drmConfig2.persistentSessionsMetadata = storedSessionsMetadata.map((session) => ({
1396
+ sessionId: session.sessionId,
1397
+ initData: new Uint8Array(session.initData),
1398
+ initDataType: session.initDataType
1399
+ }));
1400
+ }
1401
+ player.configure({ drm: drmConfig2 });
1196
1402
  const netEngine = player.getNetworkingEngine();
1197
1403
  if (netEngine) {
1198
1404
  netEngine.registerRequestFilter((type, request) => {
@@ -1216,6 +1422,28 @@ var useShakePlayer = ({
1216
1422
  if (error?.code === 7e3) {
1217
1423
  return;
1218
1424
  }
1425
+ if (error?.code >= 6e3 && error?.code < 7e3 && !isRetrying && videoElementRef.current) {
1426
+ console.warn(`DRM error detected (code: ${error.code}), clearing licenses and retrying...`);
1427
+ setIsRetrying(true);
1428
+ clearAllPersistentLicenses();
1429
+ setTimeout(async () => {
1430
+ try {
1431
+ const video2 = videoElementRef.current;
1432
+ const currentPlayer = playerRef.current;
1433
+ if (video2 && currentPlayer) {
1434
+ console.log("Reloading manifest after license cache clear...");
1435
+ await currentPlayer.load(getManifestUrl());
1436
+ console.log("Manifest reloaded successfully");
1437
+ }
1438
+ } catch (retryError) {
1439
+ console.error("Failed to retry after license clear:", retryError);
1440
+ onError?.(retryError);
1441
+ } finally {
1442
+ setIsRetrying(false);
1443
+ }
1444
+ }, 500);
1445
+ return;
1446
+ }
1219
1447
  console.error("Shaka Player Error:", error);
1220
1448
  onError?.(new Error(`Shaka Player Error: ${error.message || "Unknown error"}`));
1221
1449
  });
@@ -1247,6 +1475,30 @@ var useShakePlayer = ({
1247
1475
  }
1248
1476
  }
1249
1477
  await player.load(manifestUrl);
1478
+ if (isDRM && playlistId) {
1479
+ try {
1480
+ setTimeout(() => {
1481
+ const activeDrmSessions = player.getActiveSessionsMetadata?.();
1482
+ if (activeDrmSessions) {
1483
+ const persistentSessions = activeDrmSessions.filter(
1484
+ (session) => session.sessionType === "persistent-license"
1485
+ );
1486
+ if (persistentSessions.length > 0) {
1487
+ const sessionsToStore = persistentSessions.map((session) => ({
1488
+ sessionId: session.sessionId,
1489
+ initData: session.initData,
1490
+ initDataType: session.initDataType,
1491
+ keySystem: session.keySystem || "com.widevine.alpha"
1492
+ // fallback
1493
+ }));
1494
+ storePersistentLicense(playlistId, src.drm.licenseCacheKey ?? "", sessionsToStore);
1495
+ }
1496
+ }
1497
+ }, 2e3);
1498
+ } catch (error) {
1499
+ console.warn("Failed to store persistent license sessions:", error);
1500
+ }
1501
+ }
1250
1502
  onPlayerReady?.(player);
1251
1503
  return player;
1252
1504
  } catch (error) {
@@ -1257,7 +1509,10 @@ var useShakePlayer = ({
1257
1509
  onError?.(error);
1258
1510
  throw error;
1259
1511
  }
1260
- }, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady]);
1512
+ }, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady, isRetrying, getManifestUrl]);
1513
+ const initializePlayer = useCallback(async (video) => {
1514
+ return initializePlayerInternal(video);
1515
+ }, [initializePlayerInternal]);
1261
1516
  const destroyPlayer = useCallback(async () => {
1262
1517
  if (playerRef.current) {
1263
1518
  try {
@@ -1272,7 +1527,8 @@ var useShakePlayer = ({
1272
1527
  return {
1273
1528
  playerRef,
1274
1529
  initializePlayer,
1275
- destroyPlayer
1530
+ destroyPlayer,
1531
+ isRetrying
1276
1532
  };
1277
1533
  };
1278
1534
 
@@ -1809,11 +2065,11 @@ var useEventHandlers = (videoRef, handlers) => {
1809
2065
  };
1810
2066
 
1811
2067
  // src/hooks/useLiveBadge.ts
1812
- import { useEffect, useState, useRef as useRef5 } from "react";
2068
+ import { useEffect, useState as useState2, useRef as useRef5 } from "react";
1813
2069
  var useLiveBadge = (playerRef, options = {}) => {
1814
- const [isLive, setIsLive] = useState(false);
1815
- const [isVisible, setIsVisible] = useState(false);
1816
- const [isNearLiveEdge, setIsNearLiveEdge] = useState(false);
2070
+ const [isLive, setIsLive] = useState2(false);
2071
+ const [isVisible, setIsVisible] = useState2(false);
2072
+ const [isNearLiveEdge, setIsNearLiveEdge] = useState2(false);
1817
2073
  const intervalRef = useRef5(null);
1818
2074
  const { enabled = true, onLiveStateChange, liveThresholdSeconds = 15 } = options;
1819
2075
  const checkLiveStatus = () => {
@@ -1900,7 +2156,7 @@ var useLiveBadge = (playerRef, options = {}) => {
1900
2156
  };
1901
2157
 
1902
2158
  // src/hooks/usePosterFallback.ts
1903
- import { useEffect as useEffect2, useState as useState2 } from "react";
2159
+ import { useEffect as useEffect2, useState as useState3 } from "react";
1904
2160
 
1905
2161
  // src/hooks/useLiveIndicator.ts
1906
2162
  import { useEffect as useEffect3, useRef as useRef7 } from "react";
@@ -3294,7 +3550,7 @@ var Player = forwardRef(
3294
3550
  const containerRef = useRef8(null);
3295
3551
  const adContainerRef = useRef8(null);
3296
3552
  useImperativeHandle(ref, () => videoRef.current, []);
3297
- const { playerRef, initializePlayer, destroyPlayer } = useShakePlayer({
3553
+ const { playerRef, initializePlayer, destroyPlayer, isRetrying } = useShakaPlayer({
3298
3554
  src,
3299
3555
  shakaConfig,
3300
3556
  drmConfig,
@@ -3671,7 +3927,7 @@ var getErrorType = (error, video) => {
3671
3927
  };
3672
3928
 
3673
3929
  // src/messages/useMessages.tsx
3674
- import { useState as useState3, useEffect as useEffect6 } from "react";
3930
+ import { useState as useState4, useEffect as useEffect6 } from "react";
3675
3931
 
3676
3932
  // src/messages/en.json
3677
3933
  var en_default = {
@@ -3973,8 +4229,8 @@ var getBrowserLanguage = () => {
3973
4229
  return availableLanguages[language] ? language : "en";
3974
4230
  };
3975
4231
  var useMessages = (locale) => {
3976
- const [language, setLanguage] = useState3("en");
3977
- const [translations, setTranslations] = useState3(availableLanguages.en);
4232
+ const [language, setLanguage] = useState4("en");
4233
+ const [translations, setTranslations] = useState4(availableLanguages.en);
3978
4234
  useEffect6(() => {
3979
4235
  const lang = !!availableLanguages?.[locale] ? locale : getBrowserLanguage();
3980
4236
  ;
@@ -4089,7 +4345,7 @@ var Video = ({
4089
4345
  };
4090
4346
 
4091
4347
  // src/Event.tsx
4092
- import { useCallback as useCallback9, useEffect as useEffect8, useState as useState4 } from "react";
4348
+ import { useCallback as useCallback9, useEffect as useEffect8, useState as useState5 } from "react";
4093
4349
  import { twMerge as twMerge4 } from "tailwind-merge";
4094
4350
  import { useQuery as useQuery2 } from "@tanstack/react-query";
4095
4351
  import { Fragment, jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
@@ -4122,8 +4378,8 @@ var Event = ({
4122
4378
  retry: queryOptions.retry ?? 3,
4123
4379
  retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
4124
4380
  });
4125
- const [activePlaylist, setActivePlaylist] = useState4();
4126
- const [activeVideoId, setActiveVideoId] = useState4();
4381
+ const [activePlaylist, setActivePlaylist] = useState5();
4382
+ const [activeVideoId, setActiveVideoId] = useState5();
4127
4383
  const videoIds = eventData?.videoIds ?? [];
4128
4384
  const {
4129
4385
  data: videosData,
@@ -4139,7 +4395,7 @@ var Event = ({
4139
4395
  retry: queryOptions.retry ?? 3,
4140
4396
  retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
4141
4397
  });
4142
- const [loadingApisState, setLoadingApisState] = useState4(true);
4398
+ const [loadingApisState, setLoadingApisState] = useState5(true);
4143
4399
  useEffect8(() => {
4144
4400
  if (videosData !== void 0) {
4145
4401
  setLoadingApisState(false);
@@ -4187,8 +4443,8 @@ var Event = ({
4187
4443
  }
4188
4444
  }
4189
4445
  }, [activeVideoId, videosData, events]);
4190
- const [error, setError] = useState4(null);
4191
- const [loadingPlaylist, setLoadingPlaylist] = useState4(true);
4446
+ const [error, setError] = useState5(null);
4447
+ const [loadingPlaylist, setLoadingPlaylist] = useState5(true);
4192
4448
  const videosDataError = videosData?.some((video) => !!video.error);
4193
4449
  useEffect8(() => {
4194
4450
  if (isEventLoading || videosIsLoading || loadingApisState) {
@@ -4287,7 +4543,7 @@ function PreEvent({
4287
4543
  }) {
4288
4544
  const date = new Date(event.startTime);
4289
4545
  const now = /* @__PURE__ */ new Date();
4290
- const [remainingTime, setRemainingTime] = useState4(
4546
+ const [remainingTime, setRemainingTime] = useState5(
4291
4547
  date.getTime() - now.getTime()
4292
4548
  );
4293
4549
  const shouldBeStarted = remainingTime < 0;
@@ -4432,7 +4688,7 @@ var TitleAndDescription = ({
4432
4688
  };
4433
4689
 
4434
4690
  // src/CreativeWork.tsx
4435
- import { useEffect as useEffect9, useState as useState5 } from "react";
4691
+ import { useEffect as useEffect9, useState as useState6 } from "react";
4436
4692
  import { twMerge as twMerge5 } from "tailwind-merge";
4437
4693
  import { useQuery as useQuery3 } from "@tanstack/react-query";
4438
4694
  import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
@@ -4465,9 +4721,9 @@ var CreativeWork = ({
4465
4721
  retry: queryOptions.retry ?? 3,
4466
4722
  retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
4467
4723
  });
4468
- const [activePlaylist, setActivePlaylist] = useState5();
4469
- const [activeVideoId, setActiveVideoId] = useState5();
4470
- const [showCountDown, setShowCountDown] = useState5(false);
4724
+ const [activePlaylist, setActivePlaylist] = useState6();
4725
+ const [activeVideoId, setActiveVideoId] = useState6();
4726
+ const [showCountDown, setShowCountDown] = useState6(false);
4471
4727
  const videoIds = creativeWorkData?.videoIds ?? [];
4472
4728
  const {
4473
4729
  data: videosData,
@@ -4483,7 +4739,7 @@ var CreativeWork = ({
4483
4739
  retry: queryOptions.retry ?? 3,
4484
4740
  retryDelay: queryOptions.retryDelay ?? ((attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4))
4485
4741
  });
4486
- const [loadingApisState, setLoadingApisState] = useState5(true);
4742
+ const [loadingApisState, setLoadingApisState] = useState6(true);
4487
4743
  useEffect9(() => {
4488
4744
  if (videosData !== void 0) {
4489
4745
  setLoadingApisState(false);
@@ -4534,7 +4790,7 @@ var CreativeWork = ({
4534
4790
  }
4535
4791
  }
4536
4792
  }, [activeVideoId, videosData, events]);
4537
- const [error, setError] = useState5(null);
4793
+ const [error, setError] = useState6(null);
4538
4794
  const videosDataError = videosData?.some((video) => !!video.error);
4539
4795
  useEffect9(() => {
4540
4796
  if (creativeWorkError || videosError || videosDataError) {
@@ -4558,7 +4814,7 @@ var CreativeWork = ({
4558
4814
  }
4559
4815
  ) }) });
4560
4816
  }
4561
- const [loadingPlaylist, setLoadingPlaylist] = useState5(true);
4817
+ const [loadingPlaylist, setLoadingPlaylist] = useState6(true);
4562
4818
  useEffect9(() => {
4563
4819
  const creativeWorkLoadedWithNoVideos = !isCreativeWorkLoading && creativeWorkData && creativeWorkData.videoIds && creativeWorkData.videoIds.length === 0;
4564
4820
  const creativeWorkLoadedWithNoData = !isCreativeWorkLoading && creativeWorkData && !creativeWorkData.videoIds;
@@ -4635,7 +4891,7 @@ function PreCreativeWork({
4635
4891
  }) {
4636
4892
  const date = new Date(creativeWork.releaseTime);
4637
4893
  const now = /* @__PURE__ */ new Date();
4638
- const [remainingTime, setRemainingTime] = useState5(
4894
+ const [remainingTime, setRemainingTime] = useState6(
4639
4895
  date.getTime() - now.getTime()
4640
4896
  );
4641
4897
  const shouldBeStarted = remainingTime < 0;