windows init
10
App.tsx
|
|
@ -44,8 +44,9 @@ import { mmkvStorage } from './src/services/mmkvStorage';
|
|||
import AnnouncementOverlay from './src/components/AnnouncementOverlay';
|
||||
import { CampaignManager } from './src/components/promotions/CampaignManager';
|
||||
|
||||
// Only initialize Sentry on native platforms
|
||||
if (Platform.OS !== 'web') {
|
||||
// Only initialize Sentry on mobile native platforms (not web or Windows)
|
||||
const isMobileNative = Platform.OS === 'ios' || Platform.OS === 'android';
|
||||
if (isMobileNative) {
|
||||
Sentry.init({
|
||||
dsn: 'https://1a58bf436454d346e5852b7bfd3c95e8@o4509536317276160.ingest.de.sentry.io/4509536317734992',
|
||||
|
||||
|
|
@ -66,6 +67,7 @@ if (Platform.OS !== 'web') {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
// Force LTR layout to prevent RTL issues when Arabic is set as system language
|
||||
// This ensures posters and UI elements remain visible and properly positioned
|
||||
I18nManager.allowRTL(false);
|
||||
|
|
@ -274,5 +276,5 @@ const styles = StyleSheet.create({
|
|||
},
|
||||
});
|
||||
|
||||
// Only wrap with Sentry on native platforms
|
||||
export default Platform.OS !== 'web' ? Sentry.wrap(App) : App;
|
||||
// Only wrap with Sentry on mobile native platforms (iOS/Android)
|
||||
export default isMobileNative ? Sentry.wrap(App) : App;
|
||||
11
NuGet.config
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="react-native" value="https://pkgs.dev.azure.com/ms/react-native/_packaging/react-native-public/nuget/v3/index.json" />
|
||||
<add key="Nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
</configuration>
|
||||
3
jest.config.windows.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
const config = {};
|
||||
|
||||
module.exports = require('@rnx-kit/jest-preset')('windows', config);
|
||||
71
metro.config.backup.js
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
// Conditionally use Sentry config for native platforms only
|
||||
let config;
|
||||
try {
|
||||
const { getSentryExpoConfig } = require("@sentry/react-native/metro");
|
||||
config = getSentryExpoConfig(__dirname);
|
||||
} catch (e) {
|
||||
// Fallback to default expo config for web
|
||||
const { getDefaultConfig } = require('expo/metro-config');
|
||||
config = getDefaultConfig(__dirname);
|
||||
}
|
||||
|
||||
// Enable tree shaking and better minification
|
||||
config.transformer = {
|
||||
...config.transformer,
|
||||
babelTransformerPath: require.resolve('react-native-svg-transformer'),
|
||||
minifierConfig: {
|
||||
ecma: 8,
|
||||
keep_fnames: true,
|
||||
mangle: {
|
||||
keep_fnames: true,
|
||||
},
|
||||
compress: {
|
||||
drop_console: true,
|
||||
drop_debugger: true,
|
||||
pure_funcs: ['console.log', 'console.info', 'console.debug'],
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// Optimize resolver for better tree shaking and SVG support
|
||||
config.resolver = {
|
||||
...config.resolver,
|
||||
assetExts: [...config.resolver.assetExts.filter((ext) => ext !== 'svg'), 'zip'],
|
||||
sourceExts: [...config.resolver.sourceExts, 'svg'],
|
||||
resolverMainFields: ['react-native', 'browser', 'main'],
|
||||
platforms: ['ios', 'android', 'web'],
|
||||
resolveRequest: (context, moduleName, platform) => {
|
||||
// Prevent bundling native-only modules for web
|
||||
const nativeOnlyModules = [
|
||||
'@react-native-community/blur',
|
||||
'@d11/react-native-fast-image',
|
||||
'react-native-fast-image',
|
||||
'react-native-video',
|
||||
'react-native-immersive-mode',
|
||||
'react-native-google-cast',
|
||||
'@adrianso/react-native-device-brightness',
|
||||
'react-native-image-colors',
|
||||
'react-native-boost',
|
||||
'react-native-nitro-modules',
|
||||
'@sentry/react-native',
|
||||
'expo-glass-effect',
|
||||
'react-native-mmkv',
|
||||
'@react-native-community/slider',
|
||||
'@react-native-picker/picker',
|
||||
'react-native-bottom-tabs',
|
||||
'@bottom-tabs/react-navigation',
|
||||
'posthog-react-native',
|
||||
'@backpackapp-io/react-native-toast',
|
||||
];
|
||||
|
||||
if (platform === 'web' && nativeOnlyModules.includes(moduleName)) {
|
||||
return {
|
||||
type: 'empty',
|
||||
};
|
||||
}
|
||||
// Default resolution
|
||||
return context.resolveRequest(context, moduleName, platform);
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
|
|
@ -1,3 +1,17 @@
|
|||
// Metro configuration for Nuvio - supports iOS, Android, Web, and Windows
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Windows-specific paths
|
||||
let rnwPath = null;
|
||||
try {
|
||||
rnwPath = fs.realpathSync(
|
||||
path.resolve(require.resolve('react-native-windows/package.json'), '..'),
|
||||
);
|
||||
} catch (e) {
|
||||
// react-native-windows not available on this machine
|
||||
}
|
||||
|
||||
// Conditionally use Sentry config for native platforms only
|
||||
let config;
|
||||
try {
|
||||
|
|
@ -25,40 +39,61 @@ config.transformer = {
|
|||
pure_funcs: ['console.log', 'console.info', 'console.debug'],
|
||||
},
|
||||
},
|
||||
getTransformOptions: async () => ({
|
||||
transform: {
|
||||
experimentalImportSupport: false,
|
||||
inlineRequires: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
// Build blockList for Windows
|
||||
const blockList = [];
|
||||
if (rnwPath) {
|
||||
// This stops "npx @react-native-community/cli run-windows" from causing the metro server to crash if its already running
|
||||
blockList.push(
|
||||
new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`)
|
||||
);
|
||||
// This prevents "npx @react-native-community/cli run-windows" from hitting: EBUSY: resource busy or locked
|
||||
blockList.push(new RegExp(`${rnwPath}/build/.*`));
|
||||
blockList.push(new RegExp(`${rnwPath}/target/.*`));
|
||||
blockList.push(/.*\.ProjectImports\.zip/);
|
||||
}
|
||||
|
||||
// Native-only modules that should be excluded on web/windows
|
||||
const nativeOnlyModules = [
|
||||
'@react-native-community/blur',
|
||||
'@d11/react-native-fast-image',
|
||||
'react-native-fast-image',
|
||||
'react-native-video',
|
||||
'react-native-immersive-mode',
|
||||
'react-native-google-cast',
|
||||
'@adrianso/react-native-device-brightness',
|
||||
'react-native-image-colors',
|
||||
'react-native-boost',
|
||||
'react-native-nitro-modules',
|
||||
'@sentry/react-native',
|
||||
'expo-glass-effect',
|
||||
'react-native-mmkv',
|
||||
'@react-native-community/slider',
|
||||
'@react-native-picker/picker',
|
||||
'react-native-bottom-tabs',
|
||||
'@bottom-tabs/react-navigation',
|
||||
'posthog-react-native',
|
||||
'@backpackapp-io/react-native-toast',
|
||||
];
|
||||
|
||||
// Optimize resolver for better tree shaking and SVG support
|
||||
config.resolver = {
|
||||
...config.resolver,
|
||||
assetExts: [...config.resolver.assetExts.filter((ext) => ext !== 'svg'), 'zip'],
|
||||
sourceExts: [...config.resolver.sourceExts, 'svg'],
|
||||
resolverMainFields: ['react-native', 'browser', 'main'],
|
||||
platforms: ['ios', 'android', 'web'],
|
||||
platforms: ['ios', 'android', 'web', 'windows'],
|
||||
blockList: blockList.length > 0 ? blockList : undefined,
|
||||
resolveRequest: (context, moduleName, platform) => {
|
||||
// Prevent bundling native-only modules for web
|
||||
const nativeOnlyModules = [
|
||||
'@react-native-community/blur',
|
||||
'@d11/react-native-fast-image',
|
||||
'react-native-fast-image',
|
||||
'react-native-video',
|
||||
'react-native-immersive-mode',
|
||||
'react-native-google-cast',
|
||||
'@adrianso/react-native-device-brightness',
|
||||
'react-native-image-colors',
|
||||
'react-native-boost',
|
||||
'react-native-nitro-modules',
|
||||
'@sentry/react-native',
|
||||
'expo-glass-effect',
|
||||
'react-native-mmkv',
|
||||
'@react-native-community/slider',
|
||||
'@react-native-picker/picker',
|
||||
'react-native-bottom-tabs',
|
||||
'@bottom-tabs/react-navigation',
|
||||
'posthog-react-native',
|
||||
'@backpackapp-io/react-native-toast',
|
||||
];
|
||||
|
||||
if (platform === 'web' && nativeOnlyModules.includes(moduleName)) {
|
||||
// Prevent bundling native-only modules for web and windows
|
||||
if ((platform === 'web' || platform === 'windows') && nativeOnlyModules.includes(moduleName)) {
|
||||
return {
|
||||
type: 'empty',
|
||||
};
|
||||
|
|
@ -68,4 +103,4 @@ config.resolver = {
|
|||
},
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
module.exports = config;
|
||||
|
|
|
|||
3076
package-lock.json
generated
17
package.json
|
|
@ -6,7 +6,9 @@
|
|||
"start": "expo start",
|
||||
"android": "expo run:android",
|
||||
"ios": "expo run:ios",
|
||||
"postinstall": "patch-package"
|
||||
"postinstall": "patch-package",
|
||||
"windows": "npx @react-native-community/cli run-windows",
|
||||
"test:windows": "jest --config jest.config.windows.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@adrianso/react-native-device-brightness": "^1.2.7",
|
||||
|
|
@ -90,6 +92,7 @@
|
|||
"react-native-video": "^6.17.0",
|
||||
"react-native-web": "^0.21.0",
|
||||
"react-native-wheel-color-picker": "^1.3.1",
|
||||
"react-native-windows": "^0.81.0",
|
||||
"react-native-worklets": "^0.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
@ -102,7 +105,15 @@
|
|||
"patch-package": "^8.0.1",
|
||||
"react-native-svg-transformer": "^1.5.0",
|
||||
"typescript": "^5.3.3",
|
||||
"xcode": "^3.0.1"
|
||||
"xcode": "^3.0.1",
|
||||
"@rnx-kit/jest-preset": "^0.1.17"
|
||||
},
|
||||
"private": true
|
||||
"private": true,
|
||||
"react-native-windows": {
|
||||
"init-windows": {
|
||||
"name": "Nuvio",
|
||||
"namespace": "Nuvio",
|
||||
"template": "cpp-app"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
193
src/components/player/windows/WindowsVideoPlayer.tsx
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
/**
|
||||
* Windows Video Player - Placeholder Component
|
||||
*
|
||||
* This is a placeholder component for the Windows platform.
|
||||
* Video player functionality will be implemented in a future update.
|
||||
*
|
||||
* Options for future implementation:
|
||||
* 1. Windows MediaFoundation integration
|
||||
* 2. WebView2 with HTML5 video
|
||||
* 3. VLC/MPV native integration
|
||||
*/
|
||||
|
||||
import React from 'react';
|
||||
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||
|
||||
interface WindowsVideoPlayerProps {
|
||||
route: {
|
||||
params: {
|
||||
uri: string;
|
||||
title?: string;
|
||||
episodeTitle?: string;
|
||||
season?: number;
|
||||
episode?: number;
|
||||
quality?: string;
|
||||
year?: number;
|
||||
streamProvider?: string;
|
||||
streamName?: string;
|
||||
type?: 'movie' | 'tv';
|
||||
tmdbId?: number;
|
||||
headers?: Record<string, string>;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
const WindowsVideoPlayer: React.FC<WindowsVideoPlayerProps> = ({ route }) => {
|
||||
const navigation = useNavigation();
|
||||
const { uri, title, episodeTitle, season, episode, quality, streamProvider } = route.params;
|
||||
|
||||
const handleGoBack = () => {
|
||||
navigation.goBack();
|
||||
};
|
||||
|
||||
const handleOpenExternal = () => {
|
||||
// Future: Open in system default player or browser
|
||||
console.log('Opening in external player:', uri);
|
||||
};
|
||||
|
||||
const displayTitle = episodeTitle
|
||||
? `${title} - S${season}E${episode}: ${episodeTitle}`
|
||||
: title || 'Video';
|
||||
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<View style={styles.content}>
|
||||
<MaterialCommunityIcons
|
||||
name="video-off-outline"
|
||||
size={80}
|
||||
color="#666"
|
||||
/>
|
||||
|
||||
<Text style={styles.title}>Windows Video Player</Text>
|
||||
<Text style={styles.subtitle}>Coming Soon</Text>
|
||||
|
||||
<View style={styles.infoBox}>
|
||||
<Text style={styles.infoTitle}>{displayTitle}</Text>
|
||||
{quality && <Text style={styles.infoText}>Quality: {quality}</Text>}
|
||||
{streamProvider && <Text style={styles.infoText}>Provider: {streamProvider}</Text>}
|
||||
</View>
|
||||
|
||||
<Text style={styles.description}>
|
||||
Video playback on Windows is not yet supported.{'\n'}
|
||||
This feature will be available in a future update.
|
||||
</Text>
|
||||
|
||||
<View style={styles.buttonContainer}>
|
||||
<TouchableOpacity style={styles.button} onPress={handleGoBack}>
|
||||
<MaterialCommunityIcons name="arrow-left" size={20} color="#fff" />
|
||||
<Text style={styles.buttonText}>Go Back</Text>
|
||||
</TouchableOpacity>
|
||||
|
||||
<TouchableOpacity
|
||||
style={[styles.button, styles.secondaryButton]}
|
||||
onPress={handleOpenExternal}
|
||||
>
|
||||
<MaterialCommunityIcons name="open-in-new" size={20} color="#fff" />
|
||||
<Text style={styles.buttonText}>Open External</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
|
||||
<View style={styles.streamInfo}>
|
||||
<Text style={styles.streamLabel}>Stream URL:</Text>
|
||||
<Text style={styles.streamUrl} numberOfLines={2}>
|
||||
{uri}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: '#0a0a0a',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
},
|
||||
content: {
|
||||
alignItems: 'center',
|
||||
padding: 40,
|
||||
maxWidth: 600,
|
||||
},
|
||||
title: {
|
||||
fontSize: 28,
|
||||
fontWeight: 'bold',
|
||||
color: '#fff',
|
||||
marginTop: 20,
|
||||
},
|
||||
subtitle: {
|
||||
fontSize: 18,
|
||||
color: '#888',
|
||||
marginTop: 8,
|
||||
},
|
||||
infoBox: {
|
||||
backgroundColor: '#1a1a1a',
|
||||
borderRadius: 12,
|
||||
padding: 20,
|
||||
marginTop: 30,
|
||||
width: '100%',
|
||||
alignItems: 'center',
|
||||
},
|
||||
infoTitle: {
|
||||
fontSize: 18,
|
||||
fontWeight: '600',
|
||||
color: '#fff',
|
||||
textAlign: 'center',
|
||||
},
|
||||
infoText: {
|
||||
fontSize: 14,
|
||||
color: '#888',
|
||||
marginTop: 4,
|
||||
},
|
||||
description: {
|
||||
fontSize: 14,
|
||||
color: '#666',
|
||||
textAlign: 'center',
|
||||
marginTop: 24,
|
||||
lineHeight: 22,
|
||||
},
|
||||
buttonContainer: {
|
||||
flexDirection: 'row',
|
||||
marginTop: 30,
|
||||
gap: 16,
|
||||
},
|
||||
button: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
backgroundColor: '#6366f1',
|
||||
paddingHorizontal: 24,
|
||||
paddingVertical: 12,
|
||||
borderRadius: 8,
|
||||
gap: 8,
|
||||
},
|
||||
secondaryButton: {
|
||||
backgroundColor: '#333',
|
||||
},
|
||||
buttonText: {
|
||||
color: '#fff',
|
||||
fontSize: 16,
|
||||
fontWeight: '500',
|
||||
},
|
||||
streamInfo: {
|
||||
marginTop: 40,
|
||||
padding: 16,
|
||||
backgroundColor: '#111',
|
||||
borderRadius: 8,
|
||||
width: '100%',
|
||||
},
|
||||
streamLabel: {
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
marginBottom: 4,
|
||||
},
|
||||
streamUrl: {
|
||||
fontSize: 12,
|
||||
color: '#444',
|
||||
fontFamily: 'monospace',
|
||||
},
|
||||
});
|
||||
|
||||
export default WindowsVideoPlayer;
|
||||
|
|
@ -49,6 +49,15 @@ import DownloadsScreen from '../screens/DownloadsScreen';
|
|||
import MetadataScreen from '../screens/MetadataScreen';
|
||||
import KSPlayerCore from '../components/player/KSPlayerCore';
|
||||
import AndroidVideoPlayer from '../components/player/AndroidVideoPlayer';
|
||||
// Windows video player - conditionally imported
|
||||
let WindowsVideoPlayer: any = null;
|
||||
if (Platform.OS === 'windows') {
|
||||
try {
|
||||
WindowsVideoPlayer = require('../components/player/windows/WindowsVideoPlayer').default;
|
||||
} catch {
|
||||
WindowsVideoPlayer = null;
|
||||
}
|
||||
}
|
||||
import CatalogScreen from '../screens/CatalogScreen';
|
||||
import AddonsScreen from '../screens/AddonsScreen';
|
||||
import SearchScreen from '../screens/SearchScreen';
|
||||
|
|
@ -163,6 +172,26 @@ export type RootStackParamList = {
|
|||
videoType?: string;
|
||||
groupedEpisodes?: { [seasonNumber: number]: any[] };
|
||||
};
|
||||
PlayerWindows: {
|
||||
uri: string;
|
||||
title?: string;
|
||||
season?: number;
|
||||
episode?: number;
|
||||
episodeTitle?: string;
|
||||
quality?: string;
|
||||
year?: number;
|
||||
streamProvider?: string;
|
||||
streamName?: string;
|
||||
headers?: { [key: string]: string };
|
||||
id?: string;
|
||||
type?: string;
|
||||
episodeId?: string;
|
||||
imdbId?: string;
|
||||
availableStreams?: { [providerId: string]: { streams: any[]; addonName: string } };
|
||||
backdrop?: string;
|
||||
videoType?: string;
|
||||
groupedEpisodes?: { [seasonNumber: number]: any[] };
|
||||
};
|
||||
Catalog: { id: string; type: string; addonId?: string; name?: string; genreFilter?: string };
|
||||
Credits: { mediaId: string; mediaType: string };
|
||||
ShowRatings: { showId: number };
|
||||
|
|
@ -1315,6 +1344,23 @@ const InnerNavigator = ({ initialRouteName }: { initialRouteName?: keyof RootSta
|
|||
freezeOnBlur: true,
|
||||
}}
|
||||
/>
|
||||
{/* Windows Video Player */}
|
||||
{Platform.OS === 'windows' && WindowsVideoPlayer && (
|
||||
<Stack.Screen
|
||||
name="PlayerWindows"
|
||||
component={WindowsVideoPlayer as any}
|
||||
options={{
|
||||
animation: 'none',
|
||||
animationDuration: 0,
|
||||
presentation: 'card',
|
||||
gestureEnabled: false,
|
||||
contentStyle: {
|
||||
backgroundColor: '#000000',
|
||||
},
|
||||
freezeOnBlur: true,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<Stack.Screen
|
||||
name="Catalog"
|
||||
component={CatalogScreen as any}
|
||||
|
|
|
|||
103
src/utils/platformUtils.ts
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/**
|
||||
* Platform detection utilities for desktop platforms
|
||||
* Supports iOS, Android, Web, Windows, and macOS
|
||||
*/
|
||||
|
||||
import { Platform } from 'react-native';
|
||||
|
||||
// Platform identifiers
|
||||
export const isIOS = Platform.OS === 'ios';
|
||||
export const isAndroid = Platform.OS === 'android';
|
||||
export const isWeb = Platform.OS === 'web';
|
||||
export const isWindows = Platform.OS === 'windows';
|
||||
export const isMacOS = Platform.OS === 'macos';
|
||||
|
||||
// Platform groups
|
||||
export const isMobile = isIOS || isAndroid;
|
||||
export const isDesktop = isWindows || isMacOS;
|
||||
export const isNative = !isWeb;
|
||||
|
||||
// TV detection (already exists in Platform but wrapped for consistency)
|
||||
export const isTV = Platform.isTV ?? false;
|
||||
|
||||
// Desktop-specific features
|
||||
export const supportsKeyboardShortcuts = isDesktop || isWeb;
|
||||
export const supportsWindowManagement = isDesktop;
|
||||
export const supportsTouchGestures = isMobile || isTV;
|
||||
|
||||
/**
|
||||
* Get platform-specific value
|
||||
* @example
|
||||
* const padding = selectPlatform({ ios: 16, android: 12, windows: 20, default: 16 });
|
||||
*/
|
||||
export function selectPlatform<T>(options: {
|
||||
ios?: T;
|
||||
android?: T;
|
||||
web?: T;
|
||||
windows?: T;
|
||||
macos?: T;
|
||||
mobile?: T;
|
||||
desktop?: T;
|
||||
default: T;
|
||||
}): T {
|
||||
if (isIOS && options.ios !== undefined) return options.ios;
|
||||
if (isAndroid && options.android !== undefined) return options.android;
|
||||
if (isWeb && options.web !== undefined) return options.web;
|
||||
if (isWindows && options.windows !== undefined) return options.windows;
|
||||
if (isMacOS && options.macos !== undefined) return options.macos;
|
||||
if (isMobile && options.mobile !== undefined) return options.mobile;
|
||||
if (isDesktop && options.desktop !== undefined) return options.desktop;
|
||||
return options.default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a native module is supported on the current platform
|
||||
*/
|
||||
export function isModuleSupported(moduleName: string): boolean {
|
||||
// Modules that are NOT supported on Windows
|
||||
const windowsUnsupported = [
|
||||
'react-native-video',
|
||||
'react-native-google-cast',
|
||||
'react-native-immersive-mode',
|
||||
'@adrianso/react-native-device-brightness',
|
||||
'react-native-boost',
|
||||
'expo-glass-effect',
|
||||
];
|
||||
|
||||
// Modules that are NOT supported on Web
|
||||
const webUnsupported = [
|
||||
...windowsUnsupported,
|
||||
'@react-native-community/blur',
|
||||
'@d11/react-native-fast-image',
|
||||
'react-native-mmkv',
|
||||
'@react-native-community/slider',
|
||||
'@react-native-picker/picker',
|
||||
'react-native-bottom-tabs',
|
||||
];
|
||||
|
||||
if (isWindows && windowsUnsupported.includes(moduleName)) {
|
||||
return false;
|
||||
}
|
||||
if (isWeb && webUnsupported.includes(moduleName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
export default {
|
||||
isIOS,
|
||||
isAndroid,
|
||||
isWeb,
|
||||
isWindows,
|
||||
isMacOS,
|
||||
isMobile,
|
||||
isDesktop,
|
||||
isNative,
|
||||
isTV,
|
||||
supportsKeyboardShortcuts,
|
||||
supportsWindowManagement,
|
||||
supportsTouchGestures,
|
||||
selectPlatform,
|
||||
isModuleSupported,
|
||||
};
|
||||
|
|
@ -12,6 +12,20 @@ export interface PlayerSelectionOptions {
|
|||
platform?: typeof Platform.OS;
|
||||
}
|
||||
|
||||
// Player component types based on platform
|
||||
export type PlayerComponentName =
|
||||
| 'AndroidVideoPlayer'
|
||||
| 'KSPlayerCore'
|
||||
| 'WindowsVideoPlayer'
|
||||
| 'WebVideoPlayer';
|
||||
|
||||
/**
|
||||
* Check if current platform is a desktop platform
|
||||
*/
|
||||
export const isDesktopPlatform = (platform = Platform.OS): boolean => {
|
||||
return platform === 'windows' || platform === 'macos';
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines which player should be used for a given stream
|
||||
*/
|
||||
|
|
@ -31,6 +45,11 @@ export const shouldUseKSPlayer = ({
|
|||
return true;
|
||||
}
|
||||
|
||||
// Windows uses WindowsVideoPlayer (placeholder for now)
|
||||
if (platform === 'windows') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Default fallback
|
||||
return false;
|
||||
};
|
||||
|
|
@ -38,6 +57,16 @@ export const shouldUseKSPlayer = ({
|
|||
/**
|
||||
* Get the appropriate player component name
|
||||
*/
|
||||
export const getPlayerComponent = (options: PlayerSelectionOptions): 'AndroidVideoPlayer' | 'KSPlayerCore' => {
|
||||
export const getPlayerComponent = (options: PlayerSelectionOptions): PlayerComponentName => {
|
||||
const platform = options.platform ?? Platform.OS;
|
||||
|
||||
if (platform === 'windows') {
|
||||
return 'WindowsVideoPlayer';
|
||||
}
|
||||
|
||||
if (platform === 'web') {
|
||||
return 'WebVideoPlayer';
|
||||
}
|
||||
|
||||
return shouldUseKSPlayer(options) ? 'KSPlayerCore' : 'AndroidVideoPlayer';
|
||||
};
|
||||
|
|
|
|||
46
windows/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
*AppPackages*
|
||||
*BundleArtifacts*
|
||||
|
||||
#OS junk files
|
||||
[Tt]humbs.db
|
||||
*.DS_Store
|
||||
|
||||
#Visual Studio files
|
||||
*.[Oo]bj
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ncb
|
||||
*.suo
|
||||
*.tlb
|
||||
*.tlh
|
||||
*.bak
|
||||
*.[Cc]ache
|
||||
*.ilk
|
||||
*.log
|
||||
*.lib
|
||||
*.sbr
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.opendb
|
||||
*.unsuccessfulbuild
|
||||
ipch/
|
||||
[Oo]bj/
|
||||
[Bb]in
|
||||
[Dd]ebug*/
|
||||
[Rr]elease*/
|
||||
Ankh.NoLoad
|
||||
.vs/
|
||||
# Visual C++ cache files
|
||||
|
||||
#Files generated by the VS build
|
||||
**/Generated Files/**
|
||||
|
||||
#Files generated by MS build
|
||||
*.binlog
|
||||
*.err
|
||||
*.wrn
|
||||
27
windows/ExperimentalFeatures.props
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
|
||||
<PropertyGroup Label="Microsoft.ReactNative Experimental Features">
|
||||
<!--
|
||||
Required for building a New Architecture project.
|
||||
|
||||
App projects should not change this value.
|
||||
|
||||
See https://microsoft.github.io/react-native-windows/docs/new-architecture
|
||||
-->
|
||||
<RnwNewArch>true</RnwNewArch>
|
||||
|
||||
<!--
|
||||
Changes compilation to assume use of Microsoft.ReactNative NuGet packages
|
||||
instead of building the framework from source. Defaults to true.
|
||||
|
||||
This is set during app project creation and should not be changed.
|
||||
|
||||
See https://microsoft.github.io/react-native-windows/docs/nuget
|
||||
-->
|
||||
<UseExperimentalNuget>true</UseExperimentalNuget>
|
||||
|
||||
<ReactExperimentalFeaturesSet>true</ReactExperimentalFeaturesSet>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
BIN
windows/Nuvio.Package/Images/LockScreenLogo.scale-200.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
windows/Nuvio.Package/Images/SplashScreen.scale-200.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
windows/Nuvio.Package/Images/Square150x150Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
windows/Nuvio.Package/Images/Square44x44Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
BIN
windows/Nuvio.Package/Images/StoreLogo.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
windows/Nuvio.Package/Images/Wide310x150Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
78
windows/Nuvio.Package/Nuvio.Package.wapproj
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(SolutionDir)\ExperimentalFeatures.props" Condition="Exists('$(SolutionDir)\ExperimentalFeatures.props')" />
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{393aab9c-06e7-4fbd-8bbd-b3c4099ba200}</ProjectGuid>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<EntryPointProjectUniqueName>..\Nuvio\Nuvio.vcxproj</EntryPointProjectUniqueName>
|
||||
<DebuggerType>NativeOnly</DebuggerType>
|
||||
<BackgroundTaskDebugEngines>NativeOnly</BackgroundTaskDebugEngines>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="ReactNativeWindowsProps">
|
||||
<ReactNativeWindowsDir Condition="'$(ReactNativeWindowsDir)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\</ReactNativeWindowsDir>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.WindowsSdk.Default.props" />
|
||||
<PropertyGroup>
|
||||
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x86">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x86</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x86">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x86</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|ARM64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|ARM64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ImportGroup Label="ReactNativeWindowsPropertySheets">
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.props" Condition="Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.props')" />
|
||||
</ImportGroup>
|
||||
<ItemGroup>
|
||||
<AppxManifest Include="Package.appxmanifest">
|
||||
<SubType>Designer</SubType>
|
||||
</AppxManifest>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Images\SplashScreen.scale-200.png" />
|
||||
<Content Include="Images\LockScreenLogo.scale-200.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-200.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-200.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
||||
<Content Include="Images\StoreLogo.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-200.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Nuvio\Nuvio.vcxproj">
|
||||
<SkipGetTargetFrameworkProperties>True</SkipGetTargetFrameworkProperties>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
|
||||
<ImportGroup Label="ReactNativeWindowsTargets">
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.targets" Condition="Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureReactNativeWindowsTargets" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references targets in your node_modules\react-native-windows folder that are missing. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.props')" Text="$([System.String]::Format('$(ErrorText)', '$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.props'))" />
|
||||
<Error Condition="!Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.Package.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
49
windows/Nuvio.Package/Package.appxmanifest
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
IgnorableNamespaces="uap rescap">
|
||||
|
||||
<Identity
|
||||
Name="Nuvio"
|
||||
Publisher="CN=nayifnoushad"
|
||||
Version="1.0.0.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>Nuvio</DisplayName>
|
||||
<PublisherDisplayName>nayifnoushad</PublisherDisplayName>
|
||||
<Logo>Images\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.17763.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
<Resource Language="x-generate"/>
|
||||
</Resources>
|
||||
|
||||
<Applications>
|
||||
<Application Id="App"
|
||||
Executable="$targetnametoken$.exe"
|
||||
EntryPoint="$targetentrypoint$">
|
||||
<uap:VisualElements
|
||||
DisplayName="Nuvio"
|
||||
Description="Nuvio"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Images\Square150x150Logo.png"
|
||||
Square44x44Logo="Images\Square44x44Logo.png">
|
||||
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
|
||||
<uap:SplashScreen Image="Images\SplashScreen.png" />
|
||||
</uap:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
|
||||
<Capabilities>
|
||||
<Capability Name="internetClient" />
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
</Capabilities>
|
||||
</Package>
|
||||
63
windows/Nuvio.sln
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.3.32929.385
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Nuvio.Package", "Nuvio.Package\Nuvio.Package.wapproj", "{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Nuvio", "Nuvio\Nuvio.vcxproj", "{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Debug|ARM64 = Debug|ARM64
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
Release|ARM64 = Release|ARM64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x64.Build.0 = Debug|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x64.Deploy.0 = Debug|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x86.Build.0 = Debug|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|x86.Deploy.0 = Debug|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Debug|ARM64.Deploy.0 = Debug|ARM64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x64.ActiveCfg = Release|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x64.Build.0 = Release|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x64.Deploy.0 = Release|x64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x86.ActiveCfg = Release|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x86.Build.0 = Release|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|x86.Deploy.0 = Release|x86
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{393AAB9C-06E7-4FBD-8BBD-B3C4099BA200}.Release|ARM64.Deploy.0 = Release|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x64.Build.0 = Debug|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x64.Deploy.0 = Debug|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x86.Build.0 = Debug|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|x86.Deploy.0 = Debug|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Debug|ARM64.Deploy.0 = Debug|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x64.ActiveCfg = Release|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x64.Build.0 = Release|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x64.Deploy.0 = Release|x64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x86.ActiveCfg = Release|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x86.Build.0 = Release|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|x86.Deploy.0 = Release|Win32
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}.Release|ARM64.Deploy.0 = Release|ARM64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {D43FAD39-F619-437D-BB40-04A3982ACB6A}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
1
windows/Nuvio/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/Bundle
|
||||
14
windows/Nuvio/AutolinkedNativeModules.g.cpp
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// AutolinkedNativeModules.g.cpp contents generated by "npx @react-native-community/cli autolink-windows"
|
||||
// clang-format off
|
||||
#include "pch.h"
|
||||
#include "AutolinkedNativeModules.g.h"
|
||||
|
||||
namespace winrt::Microsoft::ReactNative
|
||||
{
|
||||
|
||||
void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector<winrt::Microsoft::ReactNative::IReactPackageProvider> const& packageProviders)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(packageProviders);
|
||||
}
|
||||
|
||||
}
|
||||
10
windows/Nuvio/AutolinkedNativeModules.g.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// AutolinkedNativeModules.g.h contents generated by "npx @react-native-community/cli autolink-windows"
|
||||
// clang-format off
|
||||
#pragma once
|
||||
|
||||
namespace winrt::Microsoft::ReactNative
|
||||
{
|
||||
|
||||
void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector<winrt::Microsoft::ReactNative::IReactPackageProvider> const& packageProviders);
|
||||
|
||||
}
|
||||
6
windows/Nuvio/AutolinkedNativeModules.g.props
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- AutolinkedNativeModules.g.props contents generated by "npx @react-native-community/cli autolink-windows" -->
|
||||
<PropertyGroup>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
6
windows/Nuvio/AutolinkedNativeModules.g.targets
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- AutolinkedNativeModules.g.targets contents generated by "npx @react-native-community/cli autolink-windows" -->
|
||||
<ItemGroup>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
82
windows/Nuvio/Nuvio.cpp
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
// Nuvio.cpp : Defines the entry point for the application.
|
||||
//
|
||||
|
||||
#include "pch.h"
|
||||
#include "Nuvio.h"
|
||||
|
||||
#include "AutolinkedNativeModules.g.h"
|
||||
|
||||
#include "NativeModules.h"
|
||||
|
||||
// A PackageProvider containing any turbo modules you define within this app project
|
||||
struct CompReactPackageProvider
|
||||
: winrt::implements<CompReactPackageProvider, winrt::Microsoft::ReactNative::IReactPackageProvider> {
|
||||
public: // IReactPackageProvider
|
||||
void CreatePackage(winrt::Microsoft::ReactNative::IReactPackageBuilder const &packageBuilder) noexcept {
|
||||
AddAttributedModules(packageBuilder, true);
|
||||
}
|
||||
};
|
||||
|
||||
// The entry point of the Win32 application
|
||||
_Use_decl_annotations_ int CALLBACK WinMain(HINSTANCE instance, HINSTANCE, PSTR /* commandLine */, int showCmd) {
|
||||
// Initialize WinRT
|
||||
winrt::init_apartment(winrt::apartment_type::single_threaded);
|
||||
|
||||
// Enable per monitor DPI scaling
|
||||
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||
|
||||
// Find the path hosting the app exe file
|
||||
WCHAR appDirectory[MAX_PATH];
|
||||
GetModuleFileNameW(NULL, appDirectory, MAX_PATH);
|
||||
PathCchRemoveFileSpec(appDirectory, MAX_PATH);
|
||||
|
||||
// Create a ReactNativeWin32App with the ReactNativeAppBuilder
|
||||
auto reactNativeWin32App{winrt::Microsoft::ReactNative::ReactNativeAppBuilder().Build()};
|
||||
|
||||
// Configure the initial InstanceSettings for the app's ReactNativeHost
|
||||
auto settings{reactNativeWin32App.ReactNativeHost().InstanceSettings()};
|
||||
// Register any autolinked native modules
|
||||
RegisterAutolinkedNativeModulePackages(settings.PackageProviders());
|
||||
// Register any native modules defined within this app project
|
||||
settings.PackageProviders().Append(winrt::make<CompReactPackageProvider>());
|
||||
|
||||
#if BUNDLE
|
||||
// Load the JS bundle from a file (not Metro):
|
||||
// Set the path (on disk) where the .bundle file is located
|
||||
settings.BundleRootPath(std::wstring(L"file://").append(appDirectory).append(L"\\Bundle\\").c_str());
|
||||
// Set the name of the bundle file (without the .bundle extension)
|
||||
settings.JavaScriptBundleFile(L"index.windows");
|
||||
// Disable hot reload
|
||||
settings.UseFastRefresh(false);
|
||||
#else
|
||||
// Load the JS bundle from Metro
|
||||
settings.JavaScriptBundleFile(L"index");
|
||||
// Enable hot reload
|
||||
settings.UseFastRefresh(true);
|
||||
#endif
|
||||
#if _DEBUG
|
||||
// For Debug builds
|
||||
// Enable Direct Debugging of JS
|
||||
settings.UseDirectDebugger(true);
|
||||
// Enable the Developer Menu
|
||||
settings.UseDeveloperSupport(true);
|
||||
#else
|
||||
// For Release builds:
|
||||
// Disable Direct Debugging of JS
|
||||
settings.UseDirectDebugger(false);
|
||||
// Disable the Developer Menu
|
||||
settings.UseDeveloperSupport(false);
|
||||
#endif
|
||||
|
||||
// Get the AppWindow so we can configure its initial title and size
|
||||
auto appWindow{reactNativeWin32App.AppWindow()};
|
||||
appWindow.Title(L"Nuvio");
|
||||
appWindow.Resize({1000, 1000});
|
||||
|
||||
// Get the ReactViewOptions so we can set the initial RN component to load
|
||||
auto viewOptions{reactNativeWin32App.ReactViewOptions()};
|
||||
viewOptions.ComponentName(L"Nuvio");
|
||||
|
||||
// Start the app
|
||||
reactNativeWin32App.Start();
|
||||
}
|
||||
3
windows/Nuvio/Nuvio.h
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
#include "resource.h"
|
||||
BIN
windows/Nuvio/Nuvio.ico
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
windows/Nuvio/Nuvio.rc
Normal file
139
windows/Nuvio/Nuvio.vcxproj
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This project was created with react-native-windows 0.81.0 -->
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(SolutionDir)\ExperimentalFeatures.props" Condition="Exists('$(SolutionDir)\ExperimentalFeatures.props')" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<CppWinRTOptimized>true</CppWinRTOptimized>
|
||||
<MinimalCoreWin>true</MinimalCoreWin>
|
||||
<ProjectGuid>{ED7A6D5F-194A-4BBD-ACC3-70B8C24F6CA8}</ProjectGuid>
|
||||
<ProjectName>Nuvio</ProjectName>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>Nuvio</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>
|
||||
<AppxPackage>false</AppxPackage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="ReactNativeWindowsProps">
|
||||
<ReactNativeWindowsDir Condition="'$(ReactNativeWindowsDir)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\</ReactNativeWindowsDir>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.WindowsSdk.Default.props" />
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|ARM64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|ARM64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="ReactNativeWindowsPropertySheets">
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.props" />
|
||||
</ImportGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalOptions>%(AdditionalOptions) /bigobj</AdditionalOptions>
|
||||
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
|
||||
<AdditionalIncludeDirectories>
|
||||
$(MSBuildThisFileDirectory);
|
||||
%(AdditionalIncludeDirectories)
|
||||
</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>shell32.lib;user32.lib;windowsapp.lib;%(AdditionalDependenices)</AdditionalDependencies>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Nuvio.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
<ClInclude Include="AutolinkedNativeModules.g.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Nuvio.cpp" />
|
||||
<ClCompile Include="AutolinkedNativeModules.g.cpp" />
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Nuvio.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="Nuvio.ico" />
|
||||
<Image Include="small.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ReactNativeWindowsTargets">
|
||||
<Import Project="$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.targets" Condition="Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.targets')" />
|
||||
</ImportGroup>
|
||||
<ItemGroup>
|
||||
</ItemGroup>
|
||||
<Target Name="EnsureReactNativeWindowsTargets" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references targets in your node_modules\react-native-windows folder. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.props')" Text="$([System.String]::Format('$(ErrorText)', '$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.props'))" />
|
||||
<Error Condition="!Exists('$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(ReactNativeWindowsDir)\PropertySheets\External\Microsoft.ReactNative.Composition.CppApp.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
58
windows/Nuvio/Nuvio.vcxproj.filters
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="targetver.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Nuvio.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="AutolinkedNativeModules.g.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Nuvio.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AutolinkedNativeModules.g.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Nuvio.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="small.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Image>
|
||||
<Image Include="Nuvio.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
1
windows/Nuvio/pch.cpp
Normal file
|
|
@ -0,0 +1 @@
|
|||
#include "pch.h"
|
||||
38
windows/Nuvio/pch.h
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
// pch.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
#define NOMINMAX 1
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#define WINRT_LEAN_AND_MEAN 1
|
||||
|
||||
// Windows Header Files
|
||||
#include <windows.h>
|
||||
#undef GetCurrentTime
|
||||
#include <pathcch.h>
|
||||
#include <unknwn.h>
|
||||
|
||||
// WinRT Header Files
|
||||
#include <winrt/base.h>
|
||||
|
||||
#include <CppWinRTIncludes.h>
|
||||
#include <winrt/Microsoft.ReactNative.Composition.h>
|
||||
#include <winrt/Microsoft.ReactNative.h>
|
||||
#include <winrt/Microsoft.UI.Composition.h>
|
||||
#include <winrt/Microsoft.UI.Content.h>
|
||||
#include <winrt/Microsoft.UI.Dispatching.h>
|
||||
#include <winrt/Microsoft.UI.Windowing.h>
|
||||
#include <winrt/Microsoft.UI.interop.h>
|
||||
|
||||
// C RunTime Header Files
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <stdlib.h>
|
||||
#include <tchar.h>
|
||||
|
||||
// Reference additional headers your project requires here
|
||||
17
windows/Nuvio/resource.h
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by Nuvio.rc
|
||||
|
||||
#define IDI_ICON1 1008
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
#define _APS_NO_MFC 130
|
||||
#define _APS_NEXT_RESOURCE_VALUE 129
|
||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 110
|
||||
#endif
|
||||
#endif
|
||||
BIN
windows/Nuvio/small.ico
Normal file
|
After Width: | Height: | Size: 45 KiB |
8
windows/Nuvio/targetver.h
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
|
||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
|
||||
#include <SDKDDKVer.h>
|
||||