diff --git a/src/components/player/VideoPlayer.tsx b/src/components/player/VideoPlayer.tsx
index c44be091..3ea80d77 100644
--- a/src/components/player/VideoPlayer.tsx
+++ b/src/components/player/VideoPlayer.tsx
@@ -9,6 +9,7 @@ import * as ScreenOrientation from 'expo-screen-orientation';
import { storageService } from '../../services/storageService';
import { logger } from '../../utils/logger';
import AsyncStorage from '@react-native-async-storage/async-storage';
+import { MaterialIcons } from '@expo/vector-icons';
import {
DEFAULT_SUBTITLE_SIZE,
@@ -747,6 +748,14 @@ const VideoPlayer: React.FC = () => {
]}
pointerEvents={isOpeningAnimationComplete ? 'none' : 'auto'}
>
+
+
+
+
Loading video...
diff --git a/src/components/player/utils/playerStyles.ts b/src/components/player/utils/playerStyles.ts
index 561e0d55..e2834e2e 100644
--- a/src/components/player/utils/playerStyles.ts
+++ b/src/components/player/utils/playerStyles.ts
@@ -752,4 +752,16 @@ export const styles = StyleSheet.create({
fontSize: 12,
marginTop: 2,
},
+ loadingCloseButton: {
+ position: 'absolute',
+ top: 40,
+ right: 20,
+ width: 44,
+ height: 44,
+ backgroundColor: 'rgba(0, 0, 0, 0.6)',
+ borderRadius: 22,
+ justifyContent: 'center',
+ alignItems: 'center',
+ zIndex: 9999,
+ },
});
\ No newline at end of file
diff --git a/src/screens/StreamsScreen.tsx b/src/screens/StreamsScreen.tsx
index 4c470dfd..5ed54079 100644
--- a/src/screens/StreamsScreen.tsx
+++ b/src/screens/StreamsScreen.tsx
@@ -856,11 +856,8 @@ export const StreamsScreen = () => {
const renderItem = useCallback(({ item, index, section }: { item: Stream; index: number; section: any }) => {
const stream = item;
- const isLoading = loadingProviders[section.addonId];
-
- // Special handling for HDRezka streams
- const quality = stream.title?.match(/(\d+)p/)?.[1] || null;
- const isHDRezka = section.addonId === 'hdrezka';
+ // Don't show loading for individual streams that are already available and displayed
+ const isLoading = false; // If streams are being rendered, they're available and shouldn't be loading
return (
{
onPress={() => handleStreamPress(stream)}
index={index}
isLoading={isLoading}
- statusMessage={providerStatus[section.addonId]?.message}
+ statusMessage={undefined}
theme={currentTheme}
/>
);
- }, [handleStreamPress, loadingProviders, providerStatus, currentTheme]);
+ }, [handleStreamPress, currentTheme]);
- const renderSectionHeader = useCallback(({ section }: { section: { title: string; addonId: string } }) => (
-
- {section.title}
-
- ), [styles.streamGroupTitle]);
+ const renderSectionHeader = useCallback(({ section }: { section: { title: string; addonId: string } }) => {
+ const isProviderLoading = loadingProviders[section.addonId];
+
+ return (
+
+
+ {section.title}
+ {isProviderLoading && (
+
+
+
+ Loading...
+
+
+ )}
+
+
+ );
+ }, [styles.streamGroupTitle, styles.sectionHeaderContainer, styles.sectionHeaderContent, styles.sectionLoadingIndicator, styles.sectionLoadingText, loadingProviders, colors.primary]);
// Cleanup on unmount
useEffect(() => {
@@ -1088,7 +1100,8 @@ export const StreamsScreen = () => {
)}
- {isLoading || (Object.keys(streams).length === 0 && (loadingStreams || loadingEpisodeStreams)) ? (
+ {/* Show streams immediately as they become available, with loading indicators for pending providers */}
+ {Object.keys(streams).length === 0 && (loadingStreams || loadingEpisodeStreams) ? (
{
Finding available streams...
- ) : Object.keys(streams).length === 0 ? (
+ ) : Object.keys(streams).length === 0 && !loadingStreams && !loadingEpisodeStreams ? (
{
bounces={true}
overScrollMode="never"
ListFooterComponent={
- isLoading ? (
+ (loadingStreams || loadingEpisodeStreams) ? (
Loading more sources...
@@ -1540,6 +1553,21 @@ const createStyles = (colors: any) => StyleSheet.create({
alignItems: 'center',
zIndex: 9999,
},
+ sectionHeaderContainer: {
+ padding: 16,
+ },
+ sectionHeaderContent: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ sectionLoadingIndicator: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ sectionLoadingText: {
+ marginLeft: 8,
+ },
});
export default memo(StreamsScreen);
\ No newline at end of file