@xhub-reels/sdk 0.1.7 → 0.1.9
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.cjs +54 -30
- package/dist/index.d.cts +16 -4
- package/dist/index.d.ts +16 -4
- package/dist/index.js +54 -30
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1628,7 +1628,8 @@ function VideoSlot({
|
|
|
1628
1628
|
onToggleMute,
|
|
1629
1629
|
showFps = false,
|
|
1630
1630
|
renderOverlay,
|
|
1631
|
-
renderActions
|
|
1631
|
+
renderActions,
|
|
1632
|
+
renderPauseIndicator
|
|
1632
1633
|
}) {
|
|
1633
1634
|
const { optimisticManager, adapters } = useSDK();
|
|
1634
1635
|
if (!isVideoItem(item)) {
|
|
@@ -1664,6 +1665,7 @@ function VideoSlot({
|
|
|
1664
1665
|
showFps,
|
|
1665
1666
|
renderOverlay,
|
|
1666
1667
|
renderActions,
|
|
1668
|
+
renderPauseIndicator,
|
|
1667
1669
|
optimisticManager,
|
|
1668
1670
|
adapters
|
|
1669
1671
|
}
|
|
@@ -1681,6 +1683,7 @@ function VideoSlotInner({
|
|
|
1681
1683
|
showFps,
|
|
1682
1684
|
renderOverlay,
|
|
1683
1685
|
renderActions,
|
|
1686
|
+
renderPauseIndicator,
|
|
1684
1687
|
optimisticManager,
|
|
1685
1688
|
adapters
|
|
1686
1689
|
}) {
|
|
@@ -1797,19 +1800,22 @@ function VideoSlotInner({
|
|
|
1797
1800
|
video.muted = isMuted;
|
|
1798
1801
|
}, [isMuted]);
|
|
1799
1802
|
const showPosterOverlay = !isReady && !hasPlayedAhead;
|
|
1800
|
-
const [
|
|
1801
|
-
const muteIndicatorTimer = react.useRef(null);
|
|
1803
|
+
const [isPaused, setIsPaused] = react.useState(false);
|
|
1802
1804
|
const handleTap = react.useCallback(() => {
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
if (
|
|
1806
|
-
|
|
1807
|
-
|
|
1805
|
+
const video = videoRef.current;
|
|
1806
|
+
if (!video || !isActive) return;
|
|
1807
|
+
if (video.paused) {
|
|
1808
|
+
video.play().catch(() => {
|
|
1809
|
+
});
|
|
1810
|
+
setIsPaused(false);
|
|
1811
|
+
} else {
|
|
1812
|
+
video.pause();
|
|
1813
|
+
setIsPaused(true);
|
|
1814
|
+
}
|
|
1815
|
+
}, [isActive]);
|
|
1808
1816
|
react.useEffect(() => {
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
};
|
|
1812
|
-
}, []);
|
|
1817
|
+
if (isActive) setIsPaused(false);
|
|
1818
|
+
}, [isActive]);
|
|
1813
1819
|
const likeDelta = react.useSyncExternalStore(
|
|
1814
1820
|
optimisticManager.store.subscribe,
|
|
1815
1821
|
() => optimisticManager.getLikeDelta(item.id),
|
|
@@ -1828,9 +1834,11 @@ function VideoSlotInner({
|
|
|
1828
1834
|
share: () => adapters.interaction?.share?.(item.id),
|
|
1829
1835
|
isMuted,
|
|
1830
1836
|
toggleMute: onToggleMute,
|
|
1837
|
+
isPaused,
|
|
1838
|
+
togglePause: handleTap,
|
|
1831
1839
|
isActive,
|
|
1832
1840
|
index
|
|
1833
|
-
}), [item, likeDelta, followState, isMuted, isActive, index, optimisticManager, adapters, onToggleMute]);
|
|
1841
|
+
}), [item, likeDelta, followState, isMuted, isPaused, isActive, index, optimisticManager, adapters, onToggleMute, handleTap]);
|
|
1834
1842
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1835
1843
|
"div",
|
|
1836
1844
|
{
|
|
@@ -1877,7 +1885,7 @@ function VideoSlotInner({
|
|
|
1877
1885
|
}
|
|
1878
1886
|
}
|
|
1879
1887
|
),
|
|
1880
|
-
|
|
1888
|
+
isPaused && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1881
1889
|
"div",
|
|
1882
1890
|
{
|
|
1883
1891
|
style: {
|
|
@@ -1885,18 +1893,26 @@ function VideoSlotInner({
|
|
|
1885
1893
|
top: "50%",
|
|
1886
1894
|
left: "50%",
|
|
1887
1895
|
transform: "translate(-50%, -50%)",
|
|
1888
|
-
background: "rgba(0,0,0,0.6)",
|
|
1889
|
-
borderRadius: "50%",
|
|
1890
|
-
width: 64,
|
|
1891
|
-
height: 64,
|
|
1892
|
-
display: "flex",
|
|
1893
|
-
alignItems: "center",
|
|
1894
|
-
justifyContent: "center",
|
|
1895
|
-
fontSize: 28,
|
|
1896
1896
|
pointerEvents: "none",
|
|
1897
|
-
|
|
1897
|
+
zIndex: 5,
|
|
1898
|
+
opacity: 0.3
|
|
1898
1899
|
},
|
|
1899
|
-
children:
|
|
1900
|
+
children: renderPauseIndicator ? renderPauseIndicator(isPaused) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1901
|
+
"div",
|
|
1902
|
+
{
|
|
1903
|
+
style: {
|
|
1904
|
+
background: "rgba(0,0,0,0.6)",
|
|
1905
|
+
borderRadius: "50%",
|
|
1906
|
+
width: 64,
|
|
1907
|
+
height: 64,
|
|
1908
|
+
display: "flex",
|
|
1909
|
+
alignItems: "center",
|
|
1910
|
+
justifyContent: "center",
|
|
1911
|
+
fontSize: 28
|
|
1912
|
+
},
|
|
1913
|
+
children: "\u25B6\uFE0F"
|
|
1914
|
+
}
|
|
1915
|
+
)
|
|
1900
1916
|
}
|
|
1901
1917
|
),
|
|
1902
1918
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1904,11 +1920,13 @@ function VideoSlotInner({
|
|
|
1904
1920
|
{
|
|
1905
1921
|
style: {
|
|
1906
1922
|
position: "absolute",
|
|
1907
|
-
bottom:
|
|
1923
|
+
bottom: 0,
|
|
1908
1924
|
left: 16,
|
|
1909
1925
|
right: 80,
|
|
1926
|
+
paddingBottom: 16,
|
|
1910
1927
|
pointerEvents: "none",
|
|
1911
|
-
color: "#fff"
|
|
1928
|
+
color: "#fff",
|
|
1929
|
+
zIndex: 10
|
|
1912
1930
|
},
|
|
1913
1931
|
children: renderOverlay ? renderOverlay(item, actions) : /* @__PURE__ */ jsxRuntime.jsx(DefaultOverlay, { item })
|
|
1914
1932
|
}
|
|
@@ -1916,14 +1934,18 @@ function VideoSlotInner({
|
|
|
1916
1934
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1917
1935
|
"div",
|
|
1918
1936
|
{
|
|
1937
|
+
onClick: (e) => e.stopPropagation(),
|
|
1919
1938
|
style: {
|
|
1920
1939
|
position: "absolute",
|
|
1921
|
-
bottom:
|
|
1940
|
+
bottom: 0,
|
|
1922
1941
|
right: 16,
|
|
1942
|
+
paddingBottom: 16,
|
|
1923
1943
|
display: "flex",
|
|
1924
1944
|
flexDirection: "column",
|
|
1925
1945
|
gap: 20,
|
|
1926
|
-
alignItems: "center"
|
|
1946
|
+
alignItems: "center",
|
|
1947
|
+
pointerEvents: "auto",
|
|
1948
|
+
zIndex: 10
|
|
1927
1949
|
},
|
|
1928
1950
|
children: renderActions ? renderActions(item, actions) : /* @__PURE__ */ jsxRuntime.jsx(DefaultActions, { item, actions })
|
|
1929
1951
|
}
|
|
@@ -1985,6 +2007,7 @@ var centerStyle = {
|
|
|
1985
2007
|
function ReelsFeed({
|
|
1986
2008
|
renderOverlay,
|
|
1987
2009
|
renderActions,
|
|
2010
|
+
renderPauseIndicator,
|
|
1988
2011
|
renderLoading,
|
|
1989
2012
|
renderEmpty,
|
|
1990
2013
|
renderError: _renderError,
|
|
@@ -2004,7 +2027,7 @@ function ReelsFeed({
|
|
|
2004
2027
|
isWarmAllocated,
|
|
2005
2028
|
setPrefetchIndex
|
|
2006
2029
|
} = useResource();
|
|
2007
|
-
const [isMuted, setIsMuted] = react.useState(
|
|
2030
|
+
const [isMuted, setIsMuted] = react.useState(false);
|
|
2008
2031
|
const containerRef = react.useRef(null);
|
|
2009
2032
|
const slotCacheRef = react.useRef(/* @__PURE__ */ new Map());
|
|
2010
2033
|
const activeIndexRef = react.useRef(0);
|
|
@@ -2218,7 +2241,8 @@ function ReelsFeed({
|
|
|
2218
2241
|
onToggleMute: handleToggleMute,
|
|
2219
2242
|
showFps: showFps && isActive,
|
|
2220
2243
|
renderOverlay,
|
|
2221
|
-
renderActions
|
|
2244
|
+
renderActions,
|
|
2245
|
+
renderPauseIndicator
|
|
2222
2246
|
}
|
|
2223
2247
|
)
|
|
2224
2248
|
},
|
package/dist/index.d.cts
CHANGED
|
@@ -302,6 +302,10 @@ interface SlotActions {
|
|
|
302
302
|
isMuted: boolean;
|
|
303
303
|
/** Toggle global mute */
|
|
304
304
|
toggleMute: () => void;
|
|
305
|
+
/** Whether the active video is currently paused */
|
|
306
|
+
isPaused: boolean;
|
|
307
|
+
/** Toggle pause/play on the active video */
|
|
308
|
+
togglePause: () => void;
|
|
305
309
|
/** Whether this slot is the active playing slot */
|
|
306
310
|
isActive: boolean;
|
|
307
311
|
/** Slot index in feed */
|
|
@@ -312,17 +316,24 @@ interface ReelsFeedProps {
|
|
|
312
316
|
/**
|
|
313
317
|
* Custom overlay rendered on each video slot.
|
|
314
318
|
* Receives the content item + actions. Return ReactNode.
|
|
315
|
-
* Positioned absolute bottom-left by SDK.
|
|
319
|
+
* Positioned absolute bottom (bottom-0) left by SDK.
|
|
316
320
|
* If not provided, SDK uses DefaultOverlay showing author + title.
|
|
317
321
|
*/
|
|
318
322
|
renderOverlay?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
319
323
|
/**
|
|
320
324
|
* Custom action bar rendered on each video slot.
|
|
321
325
|
* Receives the content item + actions. Return ReactNode.
|
|
322
|
-
* Positioned absolute bottom-right by SDK.
|
|
326
|
+
* Positioned absolute bottom (bottom-0) right by SDK.
|
|
323
327
|
* If not provided, SDK uses DefaultActions showing like/comment/share emojis.
|
|
324
328
|
*/
|
|
325
329
|
renderActions?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
330
|
+
/**
|
|
331
|
+
* Custom pause/play indicator rendered when user taps to pause/play.
|
|
332
|
+
* Receives isPaused state. Return ReactNode.
|
|
333
|
+
* Positioned absolute center by SDK.
|
|
334
|
+
* If not provided, SDK uses a default ▶️/⏸️ emoji indicator.
|
|
335
|
+
*/
|
|
336
|
+
renderPauseIndicator?: (isPaused: boolean) => ReactNode;
|
|
326
337
|
/**
|
|
327
338
|
* Custom loading skeleton shown during initial feed load.
|
|
328
339
|
* If not provided, SDK uses DefaultSkeleton with shimmer animation.
|
|
@@ -713,7 +724,7 @@ interface ReelsProviderProps {
|
|
|
713
724
|
declare function ReelsProvider({ children, adapters, debug }: ReelsProviderProps): react_jsx_runtime.JSX.Element;
|
|
714
725
|
declare function useSDK(): SDKContextValue;
|
|
715
726
|
|
|
716
|
-
declare function ReelsFeed({ renderOverlay, renderActions, renderLoading, renderEmpty, renderError: _renderError, showFps, loadMoreThreshold, onSlotChange, gestureConfig, snapConfig, }: ReelsFeedProps): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
727
|
+
declare function ReelsFeed({ renderOverlay, renderActions, renderPauseIndicator, renderLoading, renderEmpty, renderError: _renderError, showFps, loadMoreThreshold, onSlotChange, gestureConfig, snapConfig, }: ReelsFeedProps): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
717
728
|
|
|
718
729
|
/**
|
|
719
730
|
* useHls — React hook for hls.js lifecycle management (3-Tier buffer support)
|
|
@@ -783,8 +794,9 @@ interface VideoSlotProps {
|
|
|
783
794
|
showFps?: boolean;
|
|
784
795
|
renderOverlay?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
785
796
|
renderActions?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
797
|
+
renderPauseIndicator?: (isPaused: boolean) => ReactNode;
|
|
786
798
|
}
|
|
787
|
-
declare function VideoSlot({ item, index, isActive, isPrefetch, isPreloaded, bufferTier, isMuted, onToggleMute, showFps, renderOverlay, renderActions, }: VideoSlotProps): react_jsx_runtime.JSX.Element;
|
|
799
|
+
declare function VideoSlot({ item, index, isActive, isPrefetch, isPreloaded, bufferTier, isMuted, onToggleMute, showFps, renderOverlay, renderActions, renderPauseIndicator, }: VideoSlotProps): react_jsx_runtime.JSX.Element;
|
|
788
800
|
|
|
789
801
|
declare function DefaultOverlay({ item }: {
|
|
790
802
|
item: ContentItem;
|
package/dist/index.d.ts
CHANGED
|
@@ -302,6 +302,10 @@ interface SlotActions {
|
|
|
302
302
|
isMuted: boolean;
|
|
303
303
|
/** Toggle global mute */
|
|
304
304
|
toggleMute: () => void;
|
|
305
|
+
/** Whether the active video is currently paused */
|
|
306
|
+
isPaused: boolean;
|
|
307
|
+
/** Toggle pause/play on the active video */
|
|
308
|
+
togglePause: () => void;
|
|
305
309
|
/** Whether this slot is the active playing slot */
|
|
306
310
|
isActive: boolean;
|
|
307
311
|
/** Slot index in feed */
|
|
@@ -312,17 +316,24 @@ interface ReelsFeedProps {
|
|
|
312
316
|
/**
|
|
313
317
|
* Custom overlay rendered on each video slot.
|
|
314
318
|
* Receives the content item + actions. Return ReactNode.
|
|
315
|
-
* Positioned absolute bottom-left by SDK.
|
|
319
|
+
* Positioned absolute bottom (bottom-0) left by SDK.
|
|
316
320
|
* If not provided, SDK uses DefaultOverlay showing author + title.
|
|
317
321
|
*/
|
|
318
322
|
renderOverlay?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
319
323
|
/**
|
|
320
324
|
* Custom action bar rendered on each video slot.
|
|
321
325
|
* Receives the content item + actions. Return ReactNode.
|
|
322
|
-
* Positioned absolute bottom-right by SDK.
|
|
326
|
+
* Positioned absolute bottom (bottom-0) right by SDK.
|
|
323
327
|
* If not provided, SDK uses DefaultActions showing like/comment/share emojis.
|
|
324
328
|
*/
|
|
325
329
|
renderActions?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
330
|
+
/**
|
|
331
|
+
* Custom pause/play indicator rendered when user taps to pause/play.
|
|
332
|
+
* Receives isPaused state. Return ReactNode.
|
|
333
|
+
* Positioned absolute center by SDK.
|
|
334
|
+
* If not provided, SDK uses a default ▶️/⏸️ emoji indicator.
|
|
335
|
+
*/
|
|
336
|
+
renderPauseIndicator?: (isPaused: boolean) => ReactNode;
|
|
326
337
|
/**
|
|
327
338
|
* Custom loading skeleton shown during initial feed load.
|
|
328
339
|
* If not provided, SDK uses DefaultSkeleton with shimmer animation.
|
|
@@ -713,7 +724,7 @@ interface ReelsProviderProps {
|
|
|
713
724
|
declare function ReelsProvider({ children, adapters, debug }: ReelsProviderProps): react_jsx_runtime.JSX.Element;
|
|
714
725
|
declare function useSDK(): SDKContextValue;
|
|
715
726
|
|
|
716
|
-
declare function ReelsFeed({ renderOverlay, renderActions, renderLoading, renderEmpty, renderError: _renderError, showFps, loadMoreThreshold, onSlotChange, gestureConfig, snapConfig, }: ReelsFeedProps): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
727
|
+
declare function ReelsFeed({ renderOverlay, renderActions, renderPauseIndicator, renderLoading, renderEmpty, renderError: _renderError, showFps, loadMoreThreshold, onSlotChange, gestureConfig, snapConfig, }: ReelsFeedProps): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
717
728
|
|
|
718
729
|
/**
|
|
719
730
|
* useHls — React hook for hls.js lifecycle management (3-Tier buffer support)
|
|
@@ -783,8 +794,9 @@ interface VideoSlotProps {
|
|
|
783
794
|
showFps?: boolean;
|
|
784
795
|
renderOverlay?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
785
796
|
renderActions?: (item: ContentItem, actions: SlotActions) => ReactNode;
|
|
797
|
+
renderPauseIndicator?: (isPaused: boolean) => ReactNode;
|
|
786
798
|
}
|
|
787
|
-
declare function VideoSlot({ item, index, isActive, isPrefetch, isPreloaded, bufferTier, isMuted, onToggleMute, showFps, renderOverlay, renderActions, }: VideoSlotProps): react_jsx_runtime.JSX.Element;
|
|
799
|
+
declare function VideoSlot({ item, index, isActive, isPrefetch, isPreloaded, bufferTier, isMuted, onToggleMute, showFps, renderOverlay, renderActions, renderPauseIndicator, }: VideoSlotProps): react_jsx_runtime.JSX.Element;
|
|
788
800
|
|
|
789
801
|
declare function DefaultOverlay({ item }: {
|
|
790
802
|
item: ContentItem;
|
package/dist/index.js
CHANGED
|
@@ -1622,7 +1622,8 @@ function VideoSlot({
|
|
|
1622
1622
|
onToggleMute,
|
|
1623
1623
|
showFps = false,
|
|
1624
1624
|
renderOverlay,
|
|
1625
|
-
renderActions
|
|
1625
|
+
renderActions,
|
|
1626
|
+
renderPauseIndicator
|
|
1626
1627
|
}) {
|
|
1627
1628
|
const { optimisticManager, adapters } = useSDK();
|
|
1628
1629
|
if (!isVideoItem(item)) {
|
|
@@ -1658,6 +1659,7 @@ function VideoSlot({
|
|
|
1658
1659
|
showFps,
|
|
1659
1660
|
renderOverlay,
|
|
1660
1661
|
renderActions,
|
|
1662
|
+
renderPauseIndicator,
|
|
1661
1663
|
optimisticManager,
|
|
1662
1664
|
adapters
|
|
1663
1665
|
}
|
|
@@ -1675,6 +1677,7 @@ function VideoSlotInner({
|
|
|
1675
1677
|
showFps,
|
|
1676
1678
|
renderOverlay,
|
|
1677
1679
|
renderActions,
|
|
1680
|
+
renderPauseIndicator,
|
|
1678
1681
|
optimisticManager,
|
|
1679
1682
|
adapters
|
|
1680
1683
|
}) {
|
|
@@ -1791,19 +1794,22 @@ function VideoSlotInner({
|
|
|
1791
1794
|
video.muted = isMuted;
|
|
1792
1795
|
}, [isMuted]);
|
|
1793
1796
|
const showPosterOverlay = !isReady && !hasPlayedAhead;
|
|
1794
|
-
const [
|
|
1795
|
-
const muteIndicatorTimer = useRef(null);
|
|
1797
|
+
const [isPaused, setIsPaused] = useState(false);
|
|
1796
1798
|
const handleTap = useCallback(() => {
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
if (
|
|
1800
|
-
|
|
1801
|
-
|
|
1799
|
+
const video = videoRef.current;
|
|
1800
|
+
if (!video || !isActive) return;
|
|
1801
|
+
if (video.paused) {
|
|
1802
|
+
video.play().catch(() => {
|
|
1803
|
+
});
|
|
1804
|
+
setIsPaused(false);
|
|
1805
|
+
} else {
|
|
1806
|
+
video.pause();
|
|
1807
|
+
setIsPaused(true);
|
|
1808
|
+
}
|
|
1809
|
+
}, [isActive]);
|
|
1802
1810
|
useEffect(() => {
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
};
|
|
1806
|
-
}, []);
|
|
1811
|
+
if (isActive) setIsPaused(false);
|
|
1812
|
+
}, [isActive]);
|
|
1807
1813
|
const likeDelta = useSyncExternalStore(
|
|
1808
1814
|
optimisticManager.store.subscribe,
|
|
1809
1815
|
() => optimisticManager.getLikeDelta(item.id),
|
|
@@ -1822,9 +1828,11 @@ function VideoSlotInner({
|
|
|
1822
1828
|
share: () => adapters.interaction?.share?.(item.id),
|
|
1823
1829
|
isMuted,
|
|
1824
1830
|
toggleMute: onToggleMute,
|
|
1831
|
+
isPaused,
|
|
1832
|
+
togglePause: handleTap,
|
|
1825
1833
|
isActive,
|
|
1826
1834
|
index
|
|
1827
|
-
}), [item, likeDelta, followState, isMuted, isActive, index, optimisticManager, adapters, onToggleMute]);
|
|
1835
|
+
}), [item, likeDelta, followState, isMuted, isPaused, isActive, index, optimisticManager, adapters, onToggleMute, handleTap]);
|
|
1828
1836
|
return /* @__PURE__ */ jsxs(
|
|
1829
1837
|
"div",
|
|
1830
1838
|
{
|
|
@@ -1871,7 +1879,7 @@ function VideoSlotInner({
|
|
|
1871
1879
|
}
|
|
1872
1880
|
}
|
|
1873
1881
|
),
|
|
1874
|
-
|
|
1882
|
+
isPaused && /* @__PURE__ */ jsx(
|
|
1875
1883
|
"div",
|
|
1876
1884
|
{
|
|
1877
1885
|
style: {
|
|
@@ -1879,18 +1887,26 @@ function VideoSlotInner({
|
|
|
1879
1887
|
top: "50%",
|
|
1880
1888
|
left: "50%",
|
|
1881
1889
|
transform: "translate(-50%, -50%)",
|
|
1882
|
-
background: "rgba(0,0,0,0.6)",
|
|
1883
|
-
borderRadius: "50%",
|
|
1884
|
-
width: 64,
|
|
1885
|
-
height: 64,
|
|
1886
|
-
display: "flex",
|
|
1887
|
-
alignItems: "center",
|
|
1888
|
-
justifyContent: "center",
|
|
1889
|
-
fontSize: 28,
|
|
1890
1890
|
pointerEvents: "none",
|
|
1891
|
-
|
|
1891
|
+
zIndex: 5,
|
|
1892
|
+
opacity: 0.3
|
|
1892
1893
|
},
|
|
1893
|
-
children:
|
|
1894
|
+
children: renderPauseIndicator ? renderPauseIndicator(isPaused) : /* @__PURE__ */ jsx(
|
|
1895
|
+
"div",
|
|
1896
|
+
{
|
|
1897
|
+
style: {
|
|
1898
|
+
background: "rgba(0,0,0,0.6)",
|
|
1899
|
+
borderRadius: "50%",
|
|
1900
|
+
width: 64,
|
|
1901
|
+
height: 64,
|
|
1902
|
+
display: "flex",
|
|
1903
|
+
alignItems: "center",
|
|
1904
|
+
justifyContent: "center",
|
|
1905
|
+
fontSize: 28
|
|
1906
|
+
},
|
|
1907
|
+
children: "\u25B6\uFE0F"
|
|
1908
|
+
}
|
|
1909
|
+
)
|
|
1894
1910
|
}
|
|
1895
1911
|
),
|
|
1896
1912
|
/* @__PURE__ */ jsx(
|
|
@@ -1898,11 +1914,13 @@ function VideoSlotInner({
|
|
|
1898
1914
|
{
|
|
1899
1915
|
style: {
|
|
1900
1916
|
position: "absolute",
|
|
1901
|
-
bottom:
|
|
1917
|
+
bottom: 0,
|
|
1902
1918
|
left: 16,
|
|
1903
1919
|
right: 80,
|
|
1920
|
+
paddingBottom: 16,
|
|
1904
1921
|
pointerEvents: "none",
|
|
1905
|
-
color: "#fff"
|
|
1922
|
+
color: "#fff",
|
|
1923
|
+
zIndex: 10
|
|
1906
1924
|
},
|
|
1907
1925
|
children: renderOverlay ? renderOverlay(item, actions) : /* @__PURE__ */ jsx(DefaultOverlay, { item })
|
|
1908
1926
|
}
|
|
@@ -1910,14 +1928,18 @@ function VideoSlotInner({
|
|
|
1910
1928
|
/* @__PURE__ */ jsx(
|
|
1911
1929
|
"div",
|
|
1912
1930
|
{
|
|
1931
|
+
onClick: (e) => e.stopPropagation(),
|
|
1913
1932
|
style: {
|
|
1914
1933
|
position: "absolute",
|
|
1915
|
-
bottom:
|
|
1934
|
+
bottom: 0,
|
|
1916
1935
|
right: 16,
|
|
1936
|
+
paddingBottom: 16,
|
|
1917
1937
|
display: "flex",
|
|
1918
1938
|
flexDirection: "column",
|
|
1919
1939
|
gap: 20,
|
|
1920
|
-
alignItems: "center"
|
|
1940
|
+
alignItems: "center",
|
|
1941
|
+
pointerEvents: "auto",
|
|
1942
|
+
zIndex: 10
|
|
1921
1943
|
},
|
|
1922
1944
|
children: renderActions ? renderActions(item, actions) : /* @__PURE__ */ jsx(DefaultActions, { item, actions })
|
|
1923
1945
|
}
|
|
@@ -1979,6 +2001,7 @@ var centerStyle = {
|
|
|
1979
2001
|
function ReelsFeed({
|
|
1980
2002
|
renderOverlay,
|
|
1981
2003
|
renderActions,
|
|
2004
|
+
renderPauseIndicator,
|
|
1982
2005
|
renderLoading,
|
|
1983
2006
|
renderEmpty,
|
|
1984
2007
|
renderError: _renderError,
|
|
@@ -1998,7 +2021,7 @@ function ReelsFeed({
|
|
|
1998
2021
|
isWarmAllocated,
|
|
1999
2022
|
setPrefetchIndex
|
|
2000
2023
|
} = useResource();
|
|
2001
|
-
const [isMuted, setIsMuted] = useState(
|
|
2024
|
+
const [isMuted, setIsMuted] = useState(false);
|
|
2002
2025
|
const containerRef = useRef(null);
|
|
2003
2026
|
const slotCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
2004
2027
|
const activeIndexRef = useRef(0);
|
|
@@ -2212,7 +2235,8 @@ function ReelsFeed({
|
|
|
2212
2235
|
onToggleMute: handleToggleMute,
|
|
2213
2236
|
showFps: showFps && isActive,
|
|
2214
2237
|
renderOverlay,
|
|
2215
|
-
renderActions
|
|
2238
|
+
renderActions,
|
|
2239
|
+
renderPauseIndicator
|
|
2216
2240
|
}
|
|
2217
2241
|
)
|
|
2218
2242
|
},
|