initial add
This commit is contained in:
parent
2756a93231
commit
62951d0b80
13 changed files with 5825 additions and 0 deletions
4
.expo-shared/assets.json
Executable file
4
.expo-shared/assets.json
Executable file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"f9155ac790fd02fadcdeca367b02581c04a353aa6d5aa84409a59f6804c87acd": true,
|
||||
"89ed26367cdb9b771858e026f2eb95bfdb90e5ae943e716575327ec325f39c44": true
|
||||
}
|
18
.gitignore
vendored
Executable file
18
.gitignore
vendored
Executable file
|
@ -0,0 +1,18 @@
|
|||
node_modules/**/*
|
||||
.expo/*
|
||||
npm-debug.*
|
||||
*.jks
|
||||
*.p8
|
||||
*.p12
|
||||
*.key
|
||||
*.mobileprovision
|
||||
*.orig.*
|
||||
web-build/
|
||||
web-report/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# more stuff
|
||||
*.bash
|
||||
|
28
App.js
Executable file
28
App.js
Executable file
|
@ -0,0 +1,28 @@
|
|||
// Nav stuff
|
||||
|
||||
import { createAppContainer } from 'react-navigation';
|
||||
import { createStackNavigator } from 'react-navigation-stack';
|
||||
|
||||
// Screens one per file to keep things clean
|
||||
|
||||
import HomeScreen from './src/screens/HomeScreen';
|
||||
import AboutScreen from './src/screens/AboutScreen';
|
||||
import SettingsScreen from './src/screens/SettingsScreen';
|
||||
import FilesScreen from './src/screens/FilesScreen';
|
||||
|
||||
// Clean up of code before I fix the last little issue with it
|
||||
|
||||
|
||||
const AppNavigator = createStackNavigator(
|
||||
{
|
||||
Home: HomeScreen,
|
||||
About: AboutScreen,
|
||||
Files: FilesScreen,
|
||||
Settings: SettingsScreen,
|
||||
},
|
||||
{
|
||||
initialRouteName: 'Home',
|
||||
}
|
||||
);
|
||||
|
||||
export default createAppContainer(AppNavigator);
|
32
app.json
Executable file
32
app.json
Executable file
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"expo": {
|
||||
"name": "csrv",
|
||||
"slug": "csrv",
|
||||
"privacy": "public",
|
||||
"sdkVersion": "36.0.0",
|
||||
"platforms": [
|
||||
"android"
|
||||
],
|
||||
"version": "1.2.0",
|
||||
"orientation": "portrait",
|
||||
"icon": "./assets/icon.png",
|
||||
"splash": {
|
||||
"image": "./assets/splash.png",
|
||||
"resizeMode": "contain",
|
||||
"backgroundColor": "#ffffff"
|
||||
},
|
||||
"updates": {
|
||||
"fallbackToCacheTimeout": 0
|
||||
},
|
||||
"assetBundlePatterns": [
|
||||
"**/*"
|
||||
],
|
||||
"ios": {
|
||||
"supportsTablet": true
|
||||
},
|
||||
"android": {
|
||||
"package": "com.rpicsrv.csrv",
|
||||
"versionCode": 2
|
||||
}
|
||||
}
|
||||
}
|
BIN
assets/icon.png
Executable file
BIN
assets/icon.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/splash.png
Executable file
BIN
assets/splash.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 7 KiB |
6
babel.config.js
Executable file
6
babel.config.js
Executable file
|
@ -0,0 +1,6 @@
|
|||
module.exports = function(api) {
|
||||
api.cache(true);
|
||||
return {
|
||||
presets: ['babel-preset-expo'],
|
||||
};
|
||||
};
|
31
package.json
Executable file
31
package.json
Executable file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"main": "node_modules/expo/AppEntry.js",
|
||||
"scripts": {
|
||||
"start": "expo start",
|
||||
"android": "expo start --android",
|
||||
"ios": "expo start --ios",
|
||||
"web": "expo start --web",
|
||||
"eject": "expo eject"
|
||||
},
|
||||
"dependencies": {
|
||||
"@react-native-community/masked-view": "0.1.5",
|
||||
"axios": "^0.19.2",
|
||||
"expo": "~36.0.0",
|
||||
"react": "~16.9.0",
|
||||
"react-dom": "~16.9.0",
|
||||
"react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz",
|
||||
"react-native-elements": "^1.2.7",
|
||||
"react-native-gesture-handler": "^1.5.3",
|
||||
"react-native-reanimated": "~1.4.0",
|
||||
"react-native-safe-area-context": "0.6.0",
|
||||
"react-native-screens": "2.0.0-alpha.12",
|
||||
"react-native-web": "~0.11.7",
|
||||
"react-navigation": "^4.0.10",
|
||||
"react-navigation-stack": "^2.0.16"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.0.0",
|
||||
"babel-preset-expo": "~8.0.0"
|
||||
},
|
||||
"private": true
|
||||
}
|
28
src/screens/AboutScreen.js
Normal file
28
src/screens/AboutScreen.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
import React from 'react';
|
||||
import {
|
||||
View,
|
||||
Text,
|
||||
} from 'react-native';
|
||||
|
||||
class AboutScreen extends React.Component {
|
||||
static navigationOptions = ({ navigation }) => {
|
||||
return {
|
||||
title: navigation.getParam('otherParam', 'About'),
|
||||
headerStyle: {
|
||||
backgroundColor: '#3333ff',
|
||||
},
|
||||
headerTintColor: '#fff',
|
||||
};
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
|
||||
<Text>About Screen{"\n"}{"\n"}
|
||||
RPI Media Center Control v 1.0 beta</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default AboutScreen;
|
74
src/screens/FilesScreen.js
Normal file
74
src/screens/FilesScreen.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
import React from 'react';
|
||||
import axios from 'axios';
|
||||
|
||||
import {
|
||||
View,
|
||||
Text,
|
||||
FlatList, // Solves the problem with the 5 movie limit in the app
|
||||
} from 'react-native';
|
||||
|
||||
// these imports make headers and buttons look better
|
||||
import {
|
||||
Header,
|
||||
Button,
|
||||
} from 'react-native-elements';
|
||||
|
||||
function play(name) {
|
||||
// Play handler
|
||||
axios.get('http://192.168.1.158:8080/play/'+name)
|
||||
.then(res => {
|
||||
// Still don't care about response
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
class FilesScreen extends React.Component {
|
||||
|
||||
constructor(props){
|
||||
super(props);
|
||||
this.state ={ data: []};
|
||||
}
|
||||
static navigationOptions = ({ navigation }) => {
|
||||
return {
|
||||
title: navigation.getParam('otherParam', 'File Selection'),
|
||||
headerStyle: {
|
||||
backgroundColor: '#3333ff',
|
||||
},
|
||||
headerTintColor: '#fff',
|
||||
};
|
||||
};
|
||||
|
||||
componentDidMount() {
|
||||
axios.get('http://192.168.1.158:8080/list/')
|
||||
.then(res => {
|
||||
this.setState({
|
||||
data: res.data.data,
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
render() {
|
||||
let movies = this.state.data
|
||||
|
||||
return (
|
||||
|
||||
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
|
||||
<Text>Pick a movie</Text>
|
||||
<FlatList
|
||||
keyExtractor={movies => movies}
|
||||
data={movies}
|
||||
renderItem={({ item }) => {
|
||||
return <Button title={item} type="outline" onPress = {() => play(item)}
|
||||
/>
|
||||
}}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default FilesScreen;
|
74
src/screens/HomeScreen.js
Normal file
74
src/screens/HomeScreen.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
import React from 'react';
|
||||
import {
|
||||
Button,
|
||||
} from 'react-native-elements';
|
||||
import {
|
||||
View,
|
||||
Text,
|
||||
} from 'react-native';
|
||||
// play,pause,stop icons
|
||||
import { AntDesign } from '@expo/vector-icons';
|
||||
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
||||
import axios from 'axios'; // Took a while to figure out how to use it, but its simpler then the
|
||||
|
||||
function bp(name) {
|
||||
// Button press handler important
|
||||
axios.get('http://192.168.1.158:8080/'+name)
|
||||
.then(res => {
|
||||
// We don't care fore now
|
||||
})
|
||||
}
|
||||
|
||||
class HomeScreen extends React.Component {
|
||||
static navigationOptions = ({ navigation }) => {
|
||||
return {
|
||||
title: navigation.getParam('otherParam', 'RPI Media Center Control'),
|
||||
headerStyle: {
|
||||
backgroundColor: '#3333ff',
|
||||
},
|
||||
headerTintColor: '#fff',
|
||||
};
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
|
||||
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center'}}>
|
||||
<Text>Controls</Text>
|
||||
|
||||
<Button
|
||||
title="Select file to play" type="outline"
|
||||
onPress={() => this.props.navigation.navigate('Files')}
|
||||
/><Text>{"\n"}</Text>
|
||||
|
||||
<View style={{flexDirection: 'row' }}>
|
||||
<Button
|
||||
icon={<AntDesign name="pausecircleo" size={24} color="black" />} title="Pause" type="outline"
|
||||
onPress = {() => bp('pause/')}
|
||||
/>
|
||||
<Button
|
||||
icon={<AntDesign name="playcircleo" size={24} color="black" />} title="Resume" type="outline"
|
||||
onPress = {() => bp('resume/')}
|
||||
/>
|
||||
<Button
|
||||
icon={<MaterialCommunityIcons name="stop-circle-outline" size={24} color="black" />} title="Stop" type="outline"
|
||||
onPress = {() => bp('stop/')}
|
||||
/><Text>{"\n"}</Text>
|
||||
</View>
|
||||
<Text>{"\n"}</Text>
|
||||
|
||||
<Button
|
||||
title="Settings" type="outline"
|
||||
onPress={() => this.props.navigation.navigate('Settings')}
|
||||
/><Text>{"\n"}</Text>
|
||||
<Button
|
||||
title="About" type="outline"
|
||||
onPress={() => this.props.navigation.navigate('About')}
|
||||
/>
|
||||
</View>
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default HomeScreen;
|
63
src/screens/SettingsScreen.js
Normal file
63
src/screens/SettingsScreen.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
import React from 'react';
|
||||
import {
|
||||
View,
|
||||
Text,
|
||||
TextInput,
|
||||
} from 'react-native';
|
||||
import {
|
||||
Header,
|
||||
Button,
|
||||
} from 'react-native-elements';
|
||||
|
||||
|
||||
class SettingsScreen extends React.Component {
|
||||
// 1
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = { text: "" };
|
||||
}
|
||||
|
||||
//2
|
||||
changeText(inputText) {
|
||||
const formattedText = "\u{1F632}" + inputText;
|
||||
this.setState({ text: formattedText });
|
||||
}
|
||||
|
||||
//3
|
||||
endEditing() {
|
||||
const formattedText = this.state.text + "\u{2708}";
|
||||
this.setState({ text: formattedText });
|
||||
}
|
||||
|
||||
static navigationOptions = ({ navigation }) => {
|
||||
return {
|
||||
title: navigation.getParam('otherParam', 'Settings'),
|
||||
headerStyle: {
|
||||
backgroundColor: '#3333ff',
|
||||
},
|
||||
headerTintColor: '#fff',
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
render() {
|
||||
return (
|
||||
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center'}}>
|
||||
<Text>Settings Screen{"\n"}{"\n"}
|
||||
RPI Media Center Control v 1.0 beta Settings{"\n"}</Text>
|
||||
<Text>{"\n"}server IP/hostname: </Text>
|
||||
<TextInput name="IP" style={{borderWidth: 1, width: 100}} ></TextInput>
|
||||
<Text>{"\n"}</Text>
|
||||
|
||||
|
||||
|
||||
<Button title="Save" type="outline"
|
||||
/>
|
||||
</View>
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default SettingsScreen;
|
Loading…
Add table
Add a link
Reference in a new issue