ldc-com-app/ComApp/src/App.js

359 lines
13 KiB
JavaScript
Raw Normal View History

// V2
import React from 'react';
// Redux
import { Provider } from 'react-redux';
import { store } from './App/Store/ConfigureStore';
// i18n
import i18n from "./I18n";
// Controllers
import SyncController from './App/Controllers/SyncController';
// Views
import InstallScreen from './App/Views/InstallScreen';
import LoginScreen from './App/Views/LoginScreen';
// END V2
import SyncScreen from './App/Views/SyncScreen';
import HomeScreen from './App/Views/HomeScreen';
import 'react-native-gesture-handler';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { TouchableOpacity, View, Image, Text, TextInput, StyleSheet, Alert } from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome5';
import FlashMessage, { showMessage } from 'react-native-flash-message';
2022-10-10 12:51:36 +02:00
import * as SplashScreen from 'expo-splash-screen';
import DirectoriesScreen from './Views/Directories';
import VideoScreen from './Views/Video';
import PDFScreen from './Views/PDF';
import ContactScreen from './Views/Contact';
import ContactDetailsScreen from './Views/ContactDetails';
import OnlyVideosScreen from './Views/OnlyVideos';
import SearchScreen from "./Views/Search";
import MySpaceScreen from './Views/MySpace';
//SplashScreen.preventAutoHideAsync(); //Keep
// V2
store.dispatch({ type: 'INIT_APP' });
store.dispatch({ type: 'INIT_LOCALE' });
2022-10-06 16:25:15 +02:00
store.dispatch({ type: 'INIT_USERS' });
// END V2
const Stack = createNativeStackNavigator();
2022-10-06 16:25:15 +02:00
class App extends React.Component {
state = {
logged: false,
searchTxt: '',
sendEmail: '',
ShowIsActive: '0'
};
componentDidMount(): void {
const unsubscribe = store.subscribe(this.handleChange.bind(this));
// if (Sync.isLogged()) {
// store.dispatch({
// type: 'SET_CURRENT_USER',
// data: CommonModel.get('isLogged').value,
// });
// store.dispatch({ type: 'SET_LOGGED', data: true });
// }
}
handleChange() {
const logged = store.getState().app.logged;
if (logged === false) {
CommonModel.delete('isLogged');
}
if (logged !== undefined) {
this.setState({ logged: logged });
}
this.setState({ ShowIsActive: store.getState().app.ShowIsActive });
}
LogoTitle(title) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<Image
style={{ width: 100, height: 50, resizeMode: 'stretch' }}
source={require('./assets/img/logo.png')}
/>
<Text style={{ marginLeft: 10, fontSize: 18 }}>{title}</Text>
</View>
);
}
SendEmail() {
return (
<View style={{ flexDirection: 'row', alignItems: 'center', marginRight: 10 }}>
<TextInput style={styles.searchInput} placeholder={i18n.t('global.email')} value={this.state.sendEmail} onChangeText={(text) => this.setState({ sendEmail: text })} />
<TouchableOpacity style={styles.btnSearch} onPress={() => {
if (this.state.sendEmail.length > 0) {
if (Helpers.isEmailValid(this.state.sendEmail)) {
const email = {
email: this.state.sendEmail,
subject: i18n.t('app.file_sharing'),
message: '',
documents: JSON.stringify([store.getState().currentOpenedDoc]),
user_id: store.getState().currentUser.id
};
store.dispatch({ type: 'SEND_BROCHURE', data: email });
showMessage({
message: i18n.t('global.message_sent') + '.',
description: i18n.t('global.message_will_be_sent_after_sync') + '.',
type: 'success',
duration: 1500,
});
this.setState({ sendEmail: '' });
} else {
Alert.alert(i18n.t('global.warning') + ' !', i18n.t('error.invalid_email_address') + '.', [
{ text: 'OK' },
],
{ cancelable: false },
);
}
}
}}>
<Icon name={'paper-plane'} size={20} color={'white'} />
</TouchableOpacity>
</View>
);
}
2022-10-06 16:25:15 +02:00
render() {
return (
<Provider store={store}>
<NavigationContainer>
<Stack.Navigator>
{store.getState().app.isSetup === false &&
<Stack.Screen
name="InstallScreen"
component={InstallScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('install.installation')),
headerRight: () => (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<TouchableOpacity
onPress={() => {
store.dispatch({ type: 'EDIT_LOCALE' });
this.setState({ state: this.state }); // to force re-rendering
}}
style={{ marginRight: 15 }}>
<Image source={this.renderFlag()} style={{ width: 25, height: 25 }} />
</TouchableOpacity>
</View>
),
})}
/>
}
{this.state.logged === false ? (
<Stack.Screen
name="LoginScreen"
component={LoginScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('global.login')),
headerRight: () => (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<TouchableOpacity
onPress={() => {
store.dispatch({ type: 'EDIT_LOCALE' });
this.setState({ state: this.state }); // to force re-rendering
}}
style={{ marginRight: 15 }}>
<Image source={this.renderFlag()} style={{ width: 25, height: 25 }} />
</TouchableOpacity>
</View>
),
})}
/>
) : (
2022-10-06 16:25:15 +02:00
<Stack.Screen
name="HomeScreen"
component={HomeScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('global.home')),
2022-10-06 16:25:15 +02:00
headerRight: () => (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<View style={{ flexDirection: 'row', marginRight: 50 }}>
<TextInput style={styles.searchInput} placeholder={i18n.t('global.search')} value={this.state.searchTxt} onChangeText={(text) => this.setState({ searchTxt: text })} />
<TouchableOpacity style={styles.btnSearch} onPress={() => {
if (this.state.searchTxt.length > 0) {
navigation.navigation.navigate('SearchScreen', {
needle: this.state.searchTxt,
onlyVideos: false,
});
this.setState({ searchTxt: '' });
}
}}>
<Icon name={'search'} size={20} color={'white'} />
2022-10-06 16:25:15 +02:00
</TouchableOpacity>
</View>
<TouchableOpacity
onPress={() => {
store.dispatch({ type: 'EDIT_LOCALE' });
2022-10-06 16:25:15 +02:00
}}
2022-10-10 16:52:03 +02:00
style={{ marginRight: 25 }}>
<Image source={this.renderFlag()} style={{ width: 25, height: 25 }} />
2022-10-06 16:25:15 +02:00
</TouchableOpacity>
{this.state.ShowIsActive === '1' && (
<TouchableOpacity
onPress={() => navigation.navigation.navigate('MySpaceScreen')}
2022-10-10 16:52:03 +02:00
style={{ marginRight: 25 }}>
<Icon name="user-circle" size={25} />
2022-10-06 16:25:15 +02:00
</TouchableOpacity>
)}
<TouchableOpacity
onPress={() =>
navigation.navigation.navigate('SyncScreen', {
isInstalled: true,
})
}
2022-10-10 16:52:03 +02:00
style={{ marginRight: 25 }}>
<Icon name="sync-alt" size={20} />
2022-10-06 16:25:15 +02:00
</TouchableOpacity>
<TouchableOpacity
onPress={() => {
store.dispatch({ type: 'SET_LOGGED', data: false });
}}
2022-10-10 16:52:03 +02:00
style={{ marginRight: 25 }}>
<Icon name="sign-out-alt" size={20} />
2022-10-06 16:25:15 +02:00
</TouchableOpacity>
</View>
),
2022-10-06 16:25:15 +02:00
})}
/>
)}
<Stack.Screen
name="SyncScreen"
component={SyncScreen}
options={{ headerTitle: () => this.LogoTitle(i18n.t('global.synchronization')) }}
/>
<Stack.Screen
name="DirectoriesScreen"
component={DirectoriesScreen}
options={{ headerTitle: () => this.LogoTitle(i18n.t('app.folders')) }}
/>
<Stack.Screen
name="OnlyVideosScreen"
component={OnlyVideosScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('global.videos')),
headerRight: () => (
<View style={{ flexDirection: 'row', marginRight: 5 }}>
<TextInput style={styles.searchInput} placeholder={i18n.t('global.search')} value={this.state.searchTxt} onChangeText={(text) => this.setState({ searchTxt: text })} />
<TouchableOpacity style={styles.btnSearch} onPress={() => {
if (this.state.searchTxt.length > 0) {
navigation.navigation.navigate('SearchScreen', {
needle: this.state.searchTxt,
onlyVideos: true,
});
this.setState({ searchTxt: '' });
}
}}>
<Icon name={'search'} size={20} color={'white'} />
</TouchableOpacity>
</View>
),
})}
/>
<Stack.Screen
name="VideoScreen"
component={VideoScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('app.video')),
2022-10-10 16:52:03 +02:00
headerRight: () => this.SendEmail(),
orientation: 'landscape'
})}
/>
<Stack.Screen
name="PDFScreen"
component={PDFScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle('PDF'),
headerRight: () => this.SendEmail()
})}
/>
<Stack.Screen
name="ContactScreen"
component={ContactScreen}
options={{ headerTitle: () => this.LogoTitle(i18n.t('global.contacts')) }}
initialParams={{ contactAdded: false }}
/>
<Stack.Screen
name="ContactDetailsScreen"
component={ContactDetailsScreen}
options={{ headerTitle: () => this.LogoTitle(i18n.t('app.contact_details')) }}
/>
<Stack.Screen
name="SearchScreen"
component={SearchScreen}
options={{ headerTitle: () => this.LogoTitle(i18n.t('app.results_search')) }}
/>
<Stack.Screen
name="MySpaceScreen"
component={MySpaceScreen}
options={(navigation, route) => ({
headerTitle: () => this.LogoTitle(i18n.t('app.my_space')),
headerRight: () => (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<TouchableOpacity
onPress={() => {
2022-10-10 16:52:03 +02:00
const folder = store.getState().directories.filter(tmp => tmp.id === 1);
navigation.navigation.navigate('DirectoriesScreen', { folder: folder })
}}
style={{ marginRight: 15 }}>
<Icon name="briefcase" size={20} />
</TouchableOpacity>
</View>
),
})}
/>
</Stack.Navigator>
<FlashMessage position="top" />
</NavigationContainer>
</Provider>
);
2022-10-06 16:25:15 +02:00
}
renderFlag() {
let flag;
switch (store.getState().locale.locale) {
case "fr":
flag = require('./assets/img/flags/fr.png');
break;
case "en":
flag = require('./assets/img/flags/en.png');
break;
case "de":
flag = require('./assets/img/flags/de.png');
break;
case "es":
flag = require('./assets/img/flags/es.png');
break;
}
return flag;
}
}
2022-10-07 18:27:54 +02:00
const styles = StyleSheet.create({
searchInput: {
borderWidth: 1,
2022-10-10 16:52:03 +02:00
borderColor: '#ea4f52',
width: 200,
paddingLeft: 20,
},
btnSearch: {
width: 50,
height: 50,
alignItems: 'center',
justifyContent: 'center',
2022-10-10 16:52:03 +02:00
backgroundColor: '#ea4f52'
2022-10-07 18:27:54 +02:00
}
});
export default App;