Compare commits

..

No commits in common. "3b5b0aaa1a06cc3cff66cb3b02ddd9f04d09d340" and "e26387827cab37ca46a50f02235ca34a49de686c" have entirely different histories.

34 changed files with 342 additions and 512 deletions

16
App.js
View file

@ -1,7 +1,7 @@
// @flow // @flow
import * as React from 'react'; import * as React from 'react';
import {Platform, SafeAreaView, StatusBar, View, YellowBox} from 'react-native'; import {Platform, StatusBar, View, YellowBox} from 'react-native';
import LocaleManager from './src/managers/LocaleManager'; import LocaleManager from './src/managers/LocaleManager';
import AsyncStorageManager from "./src/managers/AsyncStorageManager"; import AsyncStorageManager from "./src/managers/AsyncStorageManager";
import CustomIntroSlider from "./src/components/Overrides/CustomIntroSlider"; import CustomIntroSlider from "./src/components/Overrides/CustomIntroSlider";
@ -192,14 +192,12 @@ export default class App extends React.Component<Props, State> {
<PaperProvider theme={this.state.currentTheme}> <PaperProvider theme={this.state.currentTheme}>
<OverflowMenuProvider> <OverflowMenuProvider>
<View style={{backgroundColor: ThemeManager.getCurrentTheme().colors.background, flex: 1}}> <View style={{backgroundColor: ThemeManager.getCurrentTheme().colors.background, flex: 1}}>
<SafeAreaView style={{flex: 1}}> <NavigationContainer theme={this.state.currentTheme} ref={this.navigatorRef}>
<NavigationContainer theme={this.state.currentTheme} ref={this.navigatorRef}> <MainNavigator
<MainNavigator defaultHomeRoute={this.defaultHomeRoute}
defaultHomeRoute={this.defaultHomeRoute} defaultHomeData={this.defaultHomeData}
defaultHomeData={this.defaultHomeData} />
/> </NavigationContainer>
</NavigationContainer>
</SafeAreaView>
</View> </View>
</OverflowMenuProvider> </OverflowMenuProvider>
</PaperProvider> </PaperProvider>

View file

@ -2,22 +2,6 @@
Pensez à garder l'appli à jour pour profiter des dernières fonctionnalités ! Pensez à garder l'appli à jour pour profiter des dernières fonctionnalités !
- **v3.0.7** - 13/06/2020
- Correction de crash au démarrage sur certains appareils
- Mise à jour des écrans d'intro pour mieux refléter l'appli actuelle
- Déplacement du bouton *À propos* dans les paramètres
- Mode sombre par défaut parce que voilà
- Correction de l'affichage de certains sites web
- _Notes de développement :_
- Force soloader 0.8.2
- **v3.0.5** - 28/05/2020
- Importante amélioration de la vitesse de démarrage et des performances
- Nouvelle réduction importante de la taille de l'application à télécharger et une fois installée
- _Notes de développement :_
- Passage de React Native 61.5 à 62.2
- Utilisation du moteur JS Hermes et proguard
- **v3.0.0** - 26/05/2020 - **v3.0.0** - 26/05/2020
- Nouvelle barre de navigation ! - Nouvelle barre de navigation !
- Nouveau planex tout beau tout neuf ! - Nouveau planex tout beau tout neuf !

View file

@ -77,7 +77,7 @@ import com.android.build.OutputFile
project.ext.react = [ project.ext.react = [
entryFile: "index.js", entryFile: "index.js",
enableHermes: true, // clean and rebuild if changing enableHermes: false,
] ]
apply from: "../../node_modules/react-native/react.gradle" apply from: "../../node_modules/react-native/react.gradle"
@ -100,7 +100,7 @@ def enableSeparateBuildPerCPUArchitecture = false
/** /**
* Run Proguard to shrink the Java bytecode in release builds. * Run Proguard to shrink the Java bytecode in release builds.
*/ */
def enableProguardInReleaseBuilds = true def enableProguardInReleaseBuilds = false
/** /**
* The preferred build flavor of JavaScriptCore. * The preferred build flavor of JavaScriptCore.
@ -136,8 +136,8 @@ android {
applicationId 'fr.amicaleinsat.application' applicationId 'fr.amicaleinsat.application'
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 24 versionCode 19
versionName "3.0.7" versionName "3.0.2"
missingDimensionStrategy 'react-native-camera', 'general' missingDimensionStrategy 'react-native-camera', 'general'
} }
splits { splits {
@ -176,22 +176,6 @@ android {
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
} }
} }
packagingOptions {
pickFirst "lib/armeabi-v7a/libc++_shared.so"
pickFirst "lib/arm64-v8a/libc++_shared.so"
pickFirst "lib/x86/libc++_shared.so"
pickFirst "lib/x86_64/libc++_shared.so"
}
// Force so_loader version to fix crash on apk release
configurations.all {
resolutionStrategy {
force "com.facebook.soloader:soloader:0.8.2"
}
}
// applicationVariants are e.g. debug, release // applicationVariants are e.g. debug, release
applicationVariants.all { variant -> applicationVariants.all { variant ->
variant.outputs.each { output -> variant.outputs.each { output ->
@ -210,23 +194,8 @@ android {
dependencies { dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"]) implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
exclude group:'com.facebook.fbjni'
}
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
if (enableHermes) { if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/"; def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar") debugImplementation files(hermesPath + "hermes-debug.aar")

View file

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">

View file

@ -1,68 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package fr.amicaleinsat.application;
import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.android.utils.FlipperUtils;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
import okhttp3.OkHttpClient;
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
client.addPlugin(new ReactFlipperPlugin());
client.addPlugin(new DatabasesFlipperPlugin(context));
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
client.addPlugin(CrashReporterPlugin.getInstance());
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
NetworkingModule.setCustomClientBuilder(
new NetworkingModule.CustomClientBuilder() {
@Override
public void apply(OkHttpClient.Builder builder) {
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
}
});
client.addPlugin(networkFlipperPlugin);
client.start();
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
// Hence we run if after all native modules have been initialized
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
new ReactInstanceManager.ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
reactContext.runOnNativeModulesQueueThread(
new Runnable() {
@Override
public void run() {
client.addPlugin(new FrescoFlipperPlugin());
}
});
}
});
} else {
client.addPlugin(new FrescoFlipperPlugin());
}
}
}
}

View file

@ -1,13 +1,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.amicaleinsat.application">
package="fr.amicaleinsat.application">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<application <application
android:name=".MainApplication" android:name=".MainApplication"
android:label="@string/app_name" android:label="@string/app_name"
@ -17,43 +16,40 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
> >
<!-- NOTIFICATIONS --> <!-- NOTIFICATIONS -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_name" <meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_name"
android:value="reminders"/> android:value="reminders"/>
<meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_description" <meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_description"
android:value="reminders"/> android:value="reminders"/>
<!-- Change the resource name to your App's accent color - or any other color you want --> <!-- Change the resource name to your App's accent color - or any other color you want -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color" <meta-data android:name="com.dieam.reactnativepushnotification.notification_color"
android:resource="@color/colorPrimary"/> <!-- or @android:color/{name} to use a standard color --> android:resource="@color/colorPrimary"/> <!-- or @android:color/{name} to use a standard color -->
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher"/> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver"> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<service <service
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService" android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
android:exported="false"> android:exported="false" >
<intent-filter> <intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/> <action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter> </intent-filter>
</service> </service>
<!-- END NOTIFICATIONS--> <!-- END NOTIFICATIONS-->
<meta-data android:name="com.facebook.sdk.AutoInitEnabled" android:value="false"/> <meta-data android:name="com.facebook.sdk.AutoInitEnabled" android:value="false"/>
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/> <meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>
<meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled" android:value="false"/> <meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled" android:value="false"/>
<activity <activity android:name=".MainActivity" android:label="@string/app_name"
android:name=".MainActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:label="@string/app_name" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:screenOrientation="portrait">
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>

View file

@ -33,7 +33,7 @@ public class MainActivity extends ReactActivity {
*/ */
@Override @Override
protected String getMainComponentName() { protected String getMainComponentName() {
return "Campus"; return "main";
} }
@Override @Override

View file

@ -5,7 +5,6 @@ import android.content.Context;
import com.facebook.react.PackageList; import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication; import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage; import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage; import com.facebook.react.shell.MainReactPackage;
@ -18,27 +17,23 @@ import javax.annotation.Nullable;
public class MainApplication extends Application implements ReactApplication { public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
new ReactNativeHost(this) { @Override
@Override public boolean getUseDeveloperSupport() {
public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG;
return BuildConfig.DEBUG; }
}
@Override @Override
protected List<ReactPackage> getPackages() { protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages();
List<ReactPackage> packages = new PackageList(this).getPackages(); return packages;
// Packages that cannot be autolinked yet can be added manually here, for example: }
// packages.add(new MyReactNativePackage());
return packages;
}
@Override @Override
protected String getJSMainModuleName() { protected String getJSMainModuleName() {
return "index"; return "index";
} }
}; };
@Override @Override
public ReactNativeHost getReactNativeHost() { public ReactNativeHost getReactNativeHost() {
@ -49,28 +44,23 @@ public class MainApplication extends Application implements ReactApplication {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
SoLoader.init(this, /* native exopackage */ false); SoLoader.init(this, /* native exopackage */ false);
initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); initializeFlipper(this); // Remove this line if you don't want Flipper enabled
} }
/** /**
* Loads Flipper in React Native templates. Call this in the onCreate method with something like * Loads Flipper in React Native templates.
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
* *
* @param context * @param context
* @param reactInstanceManager
*/ */
private static void initializeFlipper( private static void initializeFlipper(Context context) {
Context context, ReactInstanceManager reactInstanceManager) {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
try { try {
/* /*
We use reflection here to pick up the class that initializes Flipper, We use reflection here to pick up the class that initializes Flipper,
since Flipper library is not available in release mode since Flipper library is not available in release mode
*/ */
Class<?> aClass = Class.forName("com.rndiffapp.ReactNativeFlipper"); Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
aClass aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
.invoke(null, context, reactInstanceManager);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {

View file

@ -12,7 +12,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath("com.android.tools.build:gradle:3.5.2") classpath("com.android.tools.build:gradle:3.5.3")
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@ -36,6 +36,6 @@ allprojects {
} }
google() google()
jcenter() jcenter()
maven { url 'https://www.jitpack.io' } maven { url 'https://jitpack.io' }
} }
} }

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

6
android/gradlew vendored
View file

@ -7,7 +7,7 @@
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at
# #
# https://www.apache.org/licenses/LICENSE-2.0 # http://www.apache.org/licenses/LICENSE-2.0
# #
# Unless required by applicable law or agreed to in writing, software # Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, # distributed under the License is distributed on an "AS IS" BASIS,
@ -125,8 +125,8 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi fi
# For Cygwin or MSYS, switch paths to Windows format before running java # For Cygwin, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"` APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"` JAVACMD=`cygpath --unix "$JAVACMD"`

View file

@ -1,9 +1,4 @@
/**
* @format
*/
import {AppRegistry} from 'react-native'; import {AppRegistry} from 'react-native';
import App from './App'; import App from './App';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => App); AppRegistry.registerComponent('main', () => App);

View file

@ -328,7 +328,7 @@
DEVELOPMENT_TEAM = 6JA7CLNUV6; DEVELOPMENT_TEAM = 6JA7CLNUV6;
INFOPLIST_FILE = Campus/Info.plist; INFOPLIST_FILE = Campus/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.0.5; MARKETING_VERSION = 2.0.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
@ -353,7 +353,7 @@
DEVELOPMENT_TEAM = 6JA7CLNUV6; DEVELOPMENT_TEAM = 6JA7CLNUV6;
INFOPLIST_FILE = Campus/Info.plist; INFOPLIST_FILE = Campus/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.0.5; MARKETING_VERSION = 2.0.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",

View file

@ -1,11 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1130" LastUpgradeVersion = "0940"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "NO"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192"
BuildableName = "libReact.a"
BlueprintName = "React"
ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry <BuildActionEntry
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
@ -20,6 +34,20 @@
ReferencedContainer = "container:Campus.xcodeproj"> ReferencedContainer = "container:Campus.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
BuildableName = "CampusTests.xctest"
BlueprintName = "CampusTests"
ReferencedContainer = "container:Campus.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
@ -27,6 +55,15 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "application.app"
BlueprintName = "Campus"
ReferencedContainer = "container:Campus.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@ -41,7 +78,7 @@
</Testables> </Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"

View file

@ -15,24 +15,6 @@
#import <RNCPushNotificationIOS.h> #import <RNCPushNotificationIOS.h>
#import <UserNotifications/UserNotifications.h> #import <UserNotifications/UserNotifications.h>
#if DEBUG
#import <FlipperKit/FlipperClient.h>
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>
static void InitializeFlipper(UIApplication *application) {
FlipperClient *client = [FlipperClient sharedClient];
SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
[client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
[client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
[client addPlugin:[FlipperKitReactPlugin new]];
[client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
[client start];
}
#endif
@implementation AppDelegate @implementation AppDelegate
@synthesize window = _window; @synthesize window = _window;
@ -44,14 +26,11 @@ static void InitializeFlipper(UIApplication *application) {
return [RCTLinkingManager application:application openURL:url options:options]; return [RCTLinkingManager application:application openURL:url options:options];
} }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ {
#if DEBUG
InitializeFlipper(application);
#endif
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Campus" initialProperties:nil]; RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"main" initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

View file

@ -54,10 +54,6 @@
</dict> </dict>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>Allow Campus to use the camera</string> <string>Allow Campus to use the camera</string>
<key>UIAppFonts</key>
<array>
<string>MaterialCommunityIcons.ttf</string>
</array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
@ -75,5 +71,9 @@
<string>Automatic</string> <string>Automatic</string>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>UIAppFonts</key>
<array>
<string>MaterialCommunityIcons.ttf</string>
</array>
</dict> </dict>
</plist> </plist>

View file

@ -1,50 +1,11 @@
platform :ios, '9.0' platform :ios, '9.0'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
def add_flipper_pods!(versions = {})
versions['Flipper'] ||= '~> 0.33.1'
versions['DoubleConversion'] ||= '1.1.7'
versions['Flipper-Folly'] ||= '~> 2.1'
versions['Flipper-Glog'] ||= '0.3.6'
versions['Flipper-PeerTalk'] ||= '~> 0.0.4'
versions['Flipper-RSocket'] ||= '~> 1.0'
pod 'FlipperKit', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configuration => 'Debug'
# List all transitive dependencies for FlipperKit pods
# to avoid them being linked in Release builds
pod 'Flipper', versions['Flipper'], :configuration => 'Debug'
pod 'Flipper-DoubleConversion', versions['DoubleConversion'], :configuration => 'Debug'
pod 'Flipper-Folly', versions['Flipper-Folly'], :configuration => 'Debug'
pod 'Flipper-Glog', versions['Flipper-Glog'], :configuration => 'Debug'
pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configuration => 'Debug'
pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configuration => 'Debug'
pod 'FlipperKit/Core', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/CppBridge', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FBDefines', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configuration => 'Debug'
pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
end
# Post Install processing for Flipper
def flipper_post_install(installer)
installer.pods_project.targets.each do |target|
if target.name == 'YogaKit'
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.1'
end
end
end
end
target 'Campus' do target 'Campus' do
# Pods for Campus
rnPrefix = "../node_modules/react-native" rnPrefix = "../node_modules/react-native"
# React Native and its dependencies
pod 'FBLazyVector', :path => "#{rnPrefix}/Libraries/FBLazyVector" pod 'FBLazyVector', :path => "#{rnPrefix}/Libraries/FBLazyVector"
pod 'FBReactNativeSpec', :path => "#{rnPrefix}/Libraries/FBReactNativeSpec" pod 'FBReactNativeSpec', :path => "#{rnPrefix}/Libraries/FBReactNativeSpec"
pod 'RCTRequired', :path => "#{rnPrefix}/Libraries/RCTRequired" pod 'RCTRequired', :path => "#{rnPrefix}/Libraries/RCTRequired"
@ -62,19 +23,20 @@ target 'Campus' do
pod 'React-RCTText', :path => "#{rnPrefix}/Libraries/Text" pod 'React-RCTText', :path => "#{rnPrefix}/Libraries/Text"
pod 'React-RCTVibration', :path => "#{rnPrefix}/Libraries/Vibration" pod 'React-RCTVibration', :path => "#{rnPrefix}/Libraries/Vibration"
pod 'React-Core/RCTWebSocket', :path => "#{rnPrefix}/" pod 'React-Core/RCTWebSocket', :path => "#{rnPrefix}/"
pod 'React-Core/DevSupport', :path => "#{rnPrefix}/"
pod 'React-cxxreact', :path => "#{rnPrefix}/ReactCommon/cxxreact" pod 'React-cxxreact', :path => "#{rnPrefix}/ReactCommon/cxxreact"
pod 'React-jsi', :path => "#{rnPrefix}/ReactCommon/jsi" pod 'React-jsi', :path => "#{rnPrefix}/ReactCommon/jsi"
pod 'React-jsiexecutor', :path => "#{rnPrefix}/ReactCommon/jsiexecutor" pod 'React-jsiexecutor', :path => "#{rnPrefix}/ReactCommon/jsiexecutor"
pod 'React-jsinspector', :path => "#{rnPrefix}/ReactCommon/jsinspector" pod 'React-jsinspector', :path => "#{rnPrefix}/ReactCommon/jsinspector"
pod 'ReactCommon/callinvoker', :path => "#{rnPrefix}/ReactCommon" pod 'ReactCommon/jscallinvoker', :path => "#{rnPrefix}/ReactCommon"
pod 'ReactCommon/turbomodule/core', :path => "#{rnPrefix}/ReactCommon" pod 'ReactCommon/turbomodule/core', :path => "#{rnPrefix}/ReactCommon"
pod 'Yoga', :path => "#{rnPrefix}/ReactCommon/yoga", :modular_headers => true pod 'Yoga', :path => "#{rnPrefix}/ReactCommon/yoga"
pod 'DoubleConversion', :podspec => "#{rnPrefix}/third-party-podspecs/DoubleConversion.podspec" pod 'DoubleConversion', :podspec => "#{rnPrefix}/third-party-podspecs/DoubleConversion.podspec"
pod 'glog', :podspec => "#{rnPrefix}/third-party-podspecs/glog.podspec" pod 'glog', :podspec => "#{rnPrefix}/third-party-podspecs/glog.podspec"
pod 'Folly', :podspec => "#{rnPrefix}/third-party-podspecs/Folly.podspec" pod 'Folly', :podspec => "#{rnPrefix}/third-party-podspecs/Folly.podspec"
# Other native modules
# react-native-cli autolinking # react-native-cli autolinking
use_native_modules! use_native_modules!
@ -84,13 +46,4 @@ target 'Campus' do
pod 'Permission-Notifications', :path => "#{permissions_path}/Notifications.podspec" pod 'Permission-Notifications', :path => "#{permissions_path}/Notifications.podspec"
pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec" pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec"
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
#add_flipper_pods!
#post_install do |installer|
# flipper_post_install(installer)
#end
end end

View file

@ -1,6 +1,6 @@
{ {
"name": "campus", "name": "campus",
"version": "3.0.7", "version": "3.0.2",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "react-native start", "start": "react-native start",
@ -23,13 +23,14 @@
"@react-native-community/async-storage": "^1.9.0", "@react-native-community/async-storage": "^1.9.0",
"@react-native-community/masked-view": "^0.1.10", "@react-native-community/masked-view": "^0.1.10",
"@react-native-community/push-notification-ios": "^1.1.1", "@react-native-community/push-notification-ios": "^1.1.1",
"@react-native-community/slider": "^3.0.0", "@react-native-community/slider": "^2.0.9",
"@react-navigation/bottom-tabs": "^5.3.2", "@react-navigation/bottom-tabs": "^5.3.2",
"@react-navigation/native": "^5.2.2", "@react-navigation/native": "^5.2.2",
"@react-navigation/stack": "^5.2.17", "@react-navigation/stack": "^5.2.17",
"i18n-js": "^3.3.0", "i18n-js": "^3.3.0",
"react": "16.11.0", "react": "~16.9.0",
"react-native": "0.62.2", "react-dom": "16.9.0",
"react-native": "~0.61.5",
"react-native-animatable": "^1.3.3", "react-native-animatable": "^1.3.3",
"react-native-app-intro-slider": "^4.0.0", "react-native-app-intro-slider": "^4.0.0",
"react-native-appearance": "~0.3.3", "react-native-appearance": "~0.3.3",
@ -57,15 +58,15 @@
"react-navigation-header-buttons": "^4.0.2" "react-navigation-header-buttons": "^4.0.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.6.2", "@babel/core": "^7.9.6",
"@babel/runtime": "^7.6.2", "@babel/runtime": "^7.9.6",
"@react-native-community/eslint-config": "^0.0.5", "@react-native-community/eslint-config": "^1.1.0",
"babel-jest": "^25.5.1", "babel-jest": "^25.5.1",
"eslint": "^6.5.1", "eslint": "^6.5.1",
"flow-bin": "^0.123.0", "flow-bin": "^0.123.0",
"jest": "^25.5.3", "jest": "^25.5.3",
"jest-extended": "^0.11.5", "jest-extended": "^0.11.5",
"metro-react-native-babel-preset": "^0.58.0", "metro-react-native-babel-preset": "^0.59.0",
"react-test-renderer": "16.11.0" "react-test-renderer": "16.9.0"
} }
} }

View file

@ -4,6 +4,7 @@ import * as React from 'react';
import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons"; import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons";
import {HeaderButton, HeaderButtons} from 'react-navigation-header-buttons'; import {HeaderButton, HeaderButtons} from 'react-navigation-header-buttons';
import {withTheme} from "react-native-paper"; import {withTheme} from "react-native-paper";
import * as Touchable from "react-native/Libraries/Components/Touchable/TouchableNativeFeedback.android";
const MaterialHeaderButton = (props: Object) => const MaterialHeaderButton = (props: Object) =>
<HeaderButton <HeaderButton
@ -11,6 +12,7 @@ const MaterialHeaderButton = (props: Object) =>
IconComponent={MaterialCommunityIcons} IconComponent={MaterialCommunityIcons}
iconSize={26} iconSize={26}
color={props.color != null ? props.color : props.theme.colors.text} color={props.color != null ? props.color : props.theme.colors.text}
background={Touchable.Ripple(props.theme.colors.ripple, true)}
/>; />;
const MaterialHeaderButtons = (props: Object) => { const MaterialHeaderButtons = (props: Object) => {

View file

@ -36,53 +36,53 @@ export default class CustomIntroSlider extends React.Component<Props> {
this.sliderRef = React.createRef(); this.sliderRef = React.createRef();
this.introSlides = [ this.introSlides = [
{ {
key: 'main', key: '1',
title: i18n.t('intro.slideMain.title'), title: i18n.t('intro.slide1.title'),
text: i18n.t('intro.slideMain.text'), text: i18n.t('intro.slide1.text'),
image: require('../../../assets/splash.png'), image: require('../../../assets/splash.png'),
colors: ['#be1522', '#740d15'], colors: ['#dc2634', '#be1522'],
}, },
{ {
key: 'Planex', key: '2',
title: i18n.t('intro.slidePlanex.title'), title: i18n.t('intro.slide2.title'),
text: i18n.t('intro.slidePlanex.text'), text: i18n.t('intro.slide2.text'),
icon: 'timetable',
colors: ['#e77020', '#803e12'],
},
{
key: 'RU',
title: i18n.t('intro.slideRU.title'),
text: i18n.t('intro.slideRU.text'),
icon: 'silverware-fork-knife',
colors: ['#dcac18', '#8b6a15'],
},
{
key: 'events',
title: i18n.t('intro.slideEvents.title'),
text: i18n.t('intro.slideEvents.text'),
icon: 'calendar-range', icon: 'calendar-range',
colors: ['#41a006', '#095c03'], colors: ['#d99e09', '#9e7205'],
}, },
{ {
key: 'proxiwash', key: '3',
title: i18n.t('intro.slideProxiwash.title'), title: i18n.t('intro.slide3.title'),
text: i18n.t('intro.slideProxiwash.text'), text: i18n.t('intro.slide3.text'),
icon: 'washing-machine', icon: 'washing-machine',
colors: ['#1fa5ee', '#06537d'], colors: ['#1fa5ee', '#0976b1'],
}, },
{ {
key: 'services', key: '4',
title: i18n.t('intro.slideServices.title'), title: i18n.t('intro.slide4.title'),
text: i18n.t('intro.slideServices.text'), text: i18n.t('intro.slide4.text'),
icon: 'view-dashboard-variant', icon: 'shopping',
colors: ['#6737c1', '#281a5a'], colors: ['#ec5904', '#b64300'],
}, },
{ {
key: 'done', key: '5',
title: i18n.t('intro.slideDone.title'), title: i18n.t('intro.slide5.title'),
text: i18n.t('intro.slideDone.text'), text: i18n.t('intro.slide5.text'),
icon: 'account-heart', icon: 'timetable',
colors: ['#b837c1', '#501a5a'], colors: ['#7c33ec', '#5e11d1'],
},
{
key: '6',
title: i18n.t('intro.slide6.title'),
text: i18n.t('intro.slide6.text'),
icon: 'silverware-fork-knife',
colors: ['#ec1213', '#970902'],
},
{
key: '7',
title: i18n.t('intro.slide7.title'),
text: i18n.t('intro.slide7.text'),
icon: 'cogs',
colors: ['#37c13e', '#1a5a1d'],
}, },
]; ];
this.updateSlides = []; this.updateSlides = [];

View file

@ -21,7 +21,6 @@ type Props = {
theme: CustomTheme, theme: CustomTheme,
url: string, url: string,
customJS: string, customJS: string,
customPaddingFunction: null | (padding: number) => string,
collapsibleStack: Collapsible, collapsibleStack: Collapsible,
onMessage: Function, onMessage: Function,
onScroll: Function, onScroll: Function,
@ -38,7 +37,6 @@ class WebViewScreen extends React.PureComponent<Props> {
static defaultProps = { static defaultProps = {
customJS: '', customJS: '',
showAdvancedControls: true, showAdvancedControls: true,
customPaddingFunction: null,
}; };
webviewRef: Object; webviewRef: Object;
@ -141,14 +139,14 @@ class WebViewScreen extends React.PureComponent<Props> {
/** /**
* Callback to use when refresh button is clicked. Reloads the webview. * Callback to use when refresh button is clicked. Reloads the webview.
*/ */
onRefreshClicked = () => this.webviewRef.current.reload(); onRefreshClicked = () => this.webviewRef.current.getNode().reload(); // Need to call getNode() as we are working with animated components
onGoBackClicked = () => this.webviewRef.current.goBack(); onGoBackClicked = () => this.webviewRef.current.getNode().goBack();
onGoForwardClicked = () => this.webviewRef.current.goForward(); onGoForwardClicked = () => this.webviewRef.current.getNode().goForward();
onOpenClicked = () => Linking.openURL(this.props.url); onOpenClicked = () => Linking.openURL(this.props.url);
injectJavaScript = (script: string) => { injectJavaScript = (script: string) => {
this.webviewRef.current.injectJavaScript(script); this.webviewRef.current.getNode().injectJavaScript(script);
} }
/** /**
@ -159,10 +157,8 @@ class WebViewScreen extends React.PureComponent<Props> {
getRenderLoading = () => <BasicLoadingScreen isAbsolute={true}/>; getRenderLoading = () => <BasicLoadingScreen isAbsolute={true}/>;
getJavascriptPadding(padding: number) { getJavascriptPadding(padding: number) {
const customPadding = this.props.customPaddingFunction != null ? this.props.customPaddingFunction(padding) : "";
return ( return (
"document.getElementsByTagName('body')[0].style.paddingTop = '" + padding + "px';" + "document.getElementsByTagName('body')[0].style.paddingTop = '" + padding + "px';" +
customPadding +
"true;" "true;"
); );
} }

View file

@ -36,6 +36,13 @@ class CustomTabBar extends React.Component<Props, State> {
barSynced: false,// Is the bar synced with the header for animations? barSynced: false,// Is the bar synced with the header for animations?
} }
tabRef: Object;
constructor(props) {
super(props);
this.tabRef = React.createRef();
}
onItemPress(route: Object, currentIndex: number, destIndex: number) { onItemPress(route: Object, currentIndex: number, destIndex: number) {
const event = this.props.navigation.emit({ const event = this.props.navigation.emit({
type: 'tabPress', type: 'tabPress',
@ -60,13 +67,13 @@ class CustomTabBar extends React.Component<Props, State> {
} }
tabBarIcon = (route, focused) => { tabBarIcon = (route, focused) => {
let icon = TAB_ICONS[route.name]; let icon = TAB_ICONS[route.name];
icon = focused ? icon : icon + ('-outline'); icon = focused ? icon : icon + ('-outline');
if (route.name !== "home") if (route.name !== "home")
return icon; return icon;
else else
return null; return null;
}; };
onRouteChange = () => { onRouteChange = () => {
@ -128,7 +135,10 @@ class CustomTabBar extends React.Component<Props, State> {
this.props.navigation.addListener('state', this.onRouteChange); this.props.navigation.addListener('state', this.onRouteChange);
return ( return (
<Animated.View <Animated.View
useNativeDriver ref={this.tabRef}
// animation={"fadeInUp"}
// duration={500}
// useNativeDriver
style={{ style={{
flexDirection: 'row', flexDirection: 'row',
height: CustomTabBar.TAB_BAR_HEIGHT, height: CustomTabBar.TAB_BAR_HEIGHT,
@ -137,7 +147,7 @@ class CustomTabBar extends React.Component<Props, State> {
bottom: 0, bottom: 0,
left: 0, left: 0,
backgroundColor: this.props.theme.colors.surface, backgroundColor: this.props.theme.colors.surface,
transform: [{translateY: this.state.translateY}], transform: [{translateY: this.state.translateY}]
}} }}
> >
{this.props.state.routes.map(this.renderIcon)} {this.props.state.routes.map(this.renderIcon)}

View file

@ -24,11 +24,6 @@ export default class AsyncStorageManager {
// Object storing preferences keys, default and current values for use in the app // Object storing preferences keys, default and current values for use in the app
preferences = { preferences = {
debugUnlocked: {
key: 'debugUnlocked',
default: '0',
current: '',
},
showIntro: { showIntro: {
key: 'showIntro', key: 'showIntro',
default: '1', default: '1',
@ -51,7 +46,17 @@ export default class AsyncStorageManager {
}, },
nightMode: { nightMode: {
key: 'nightMode', key: 'nightMode',
default: '1', default: '0',
current: '',
},
expoToken: {
key: 'expoToken',
default: '',
current: '',
},
debugUnlocked: {
key: 'debugUnlocked',
default: '0',
current: '', current: '',
}, },
defaultStartScreen: { defaultStartScreen: {

View file

@ -3,6 +3,7 @@
import * as React from 'react'; import * as React from 'react';
import {FlatList, Linking, Platform, View} from 'react-native'; import {FlatList, Linking, Platform, View} from 'react-native';
import i18n from "i18n-js"; import i18n from "i18n-js";
import AsyncStorageManager from "../../managers/AsyncStorageManager";
import {Avatar, Card, List, Title, withTheme} from 'react-native-paper'; import {Avatar, Card, List, Title, withTheme} from 'react-native-paper';
import packageJson from "../../../package.json"; import packageJson from "../../../package.json";
@ -31,6 +32,10 @@ type Props = {
navigation: Object, navigation: Object,
}; };
type State = {
isDebugUnlocked: boolean,
};
/** /**
* Opens a link in the device's browser * Opens a link in the device's browser
* @param link The link to open * @param link The link to open
@ -42,8 +47,14 @@ function openWebLink(link) {
/** /**
* Class defining an about screen. This screen shows the user information about the app and it's author. * Class defining an about screen. This screen shows the user information about the app and it's author.
*/ */
class AboutScreen extends React.Component<Props> { class AboutScreen extends React.Component<Props, State> {
debugTapCounter = 0;
modalRef: Object;
state = {
isDebugUnlocked: AsyncStorageManager.getInstance().preferences.debugUnlocked.current === '1'
};
/** /**
* Data to be displayed in the app card * Data to be displayed in the app card
*/ */
@ -78,13 +89,20 @@ class AboutScreen extends React.Component<Props> {
text: i18n.t('aboutScreen.license'), text: i18n.t('aboutScreen.license'),
showChevron: true showChevron: true
}, },
{
onPressCallback: () => this.props.navigation.navigate('debug'),
icon: 'bug-check',
text: i18n.t('aboutScreen.debug'),
showChevron: true,
showOnlyInDebug: true
},
]; ];
/** /**
* Data to be displayed in the author card * Data to be displayed in the author card
*/ */
authorData: Array<Object> = [ authorData: Array<Object> = [
{ {
onPressCallback: () => console.log('cc'), onPressCallback: () => this.tryUnlockDebugMode(),
icon: 'account-circle', icon: 'account-circle',
text: 'Arnaud VERGNET', text: 'Arnaud VERGNET',
showChevron: false showChevron: false
@ -205,6 +223,7 @@ class AboutScreen extends React.Component<Props> {
<Card.Content> <Card.Content>
<FlatList <FlatList
data={this.appData} data={this.appData}
extraData={this.state.isDebugUnlocked}
keyExtractor={this.keyExtractor} keyExtractor={this.keyExtractor}
renderItem={this.getCardItem} renderItem={this.getCardItem}
/> />
@ -295,27 +314,52 @@ class AboutScreen extends React.Component<Props> {
* @returns {*} * @returns {*}
*/ */
getCardItem = ({item}: Object) => { getCardItem = ({item}: Object) => {
let shouldShow = item === undefined
|| !item.showOnlyInDebug
|| (item.showOnlyInDebug && this.state.isDebugUnlocked);
const getItemIcon = this.getItemIcon.bind(this, item); const getItemIcon = this.getItemIcon.bind(this, item);
if (item.showChevron) { if (shouldShow) {
return ( if (item.showChevron) {
<List.Item return (
title={item.text} <List.Item
left={getItemIcon} title={item.text}
right={this.getChevronIcon} left={getItemIcon}
onPress={item.onPressCallback} right={this.getChevronIcon}
/> onPress={item.onPressCallback}
); />
} else { );
return ( } else {
<List.Item return (
title={item.text} <List.Item
left={getItemIcon} title={item.text}
onPress={item.onPressCallback} left={getItemIcon}
/> onPress={item.onPressCallback}
); />
} );
}
} else
return null;
}; };
/**
* Tries to unlock debug mode
*/
tryUnlockDebugMode() {
this.debugTapCounter = this.debugTapCounter + 1;
if (this.debugTapCounter >= 4) {
this.unlockDebugMode();
}
}
/**
* Unlocks debug mode
*/
unlockDebugMode() {
this.setState({isDebugUnlocked: true});
let key = AsyncStorageManager.getInstance().preferences.debugUnlocked.key;
AsyncStorageManager.getInstance().savePref(key, '1');
}
/** /**
* Gets a card, depending on the given item's id * Gets a card, depending on the given item's id
* *

View file

@ -174,9 +174,11 @@ class HomeScreen extends React.Component<Props, State> {
} }
const onPressSettings = () => this.props.navigation.navigate("settings"); const onPressSettings = () => this.props.navigation.navigate("settings");
const onPressAbout = () => this.props.navigation.navigate("about");
return <MaterialHeaderButtons> return <MaterialHeaderButtons>
<Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/> <Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/>
<Item title={i18n.t("screens.settings")} iconName={"settings"} onPress={onPressSettings}/> <Item title={i18n.t("screens.settings")} iconName={"settings"} onPress={onPressSettings}/>
<Item title={i18n.t("screens.about")} iconName={"information"} onPress={onPressAbout}/>
</MaterialHeaderButtons>; </MaterialHeaderButtons>;
}; };

View file

@ -123,8 +123,6 @@ class ScannerScreen extends React.Component<Props, State> {
maskOpacity={0.5} maskOpacity={0.5}
animatedLineThickness={1} animatedLineThickness={1}
animationDuration={1000} animationDuration={1000}
width={250}
height={250}
/> />
</RNCamera> </RNCamera>
); );

View file

@ -11,7 +11,8 @@ type Props = {
}; };
const links = { const links = {
bugsMail: `mailto:app@amicale-insat.fr?subject=[BUG] Application CAMPUS bugsMail: `mailto:app@amicale-insat.fr
?subject=[BUG] Application CAMPUS
&body=Coucou Arnaud ça bug c'est nul,\n\n &body=Coucou Arnaud ça bug c'est nul,\n\n
Informations sur ton système si tu sais (iOS ou Android, modèle du tel, version):\n\n\n Informations sur ton système si tu sais (iOS ou Android, modèle du tel, version):\n\n\n
Nature du problème :\n\n\n Nature du problème :\n\n\n
@ -19,7 +20,8 @@ Nature du problème :\n\n\n
Stp corrige le pb, bien cordialement.`, Stp corrige le pb, bien cordialement.`,
bugsGit: 'https://git.etud.insa-toulouse.fr/vergnet/application-amicale/issues/new', bugsGit: 'https://git.etud.insa-toulouse.fr/vergnet/application-amicale/issues/new',
facebook: "https://www.facebook.com/campus.insat", facebook: "https://www.facebook.com/campus.insat",
feedbackMail: `mailto:app@amicale-insat.fr?subject=[FEEDBACK] Application CAMPUS feedbackMail: `mailto:app@amicale-insat.fr
?subject=[FEEDBACK] Application CAMPUS
&body=Coucou Arnaud j'ai du feedback\n\n\n\nBien cordialement.`, &body=Coucou Arnaud j'ai du feedback\n\n\n\nBien cordialement.`,
feedbackGit: "https://git.etud.insa-toulouse.fr/vergnet/application-amicale/issues/new", feedbackGit: "https://git.etud.insa-toulouse.fr/vergnet/application-amicale/issues/new",
} }

View file

@ -9,10 +9,8 @@ import AsyncStorageManager from "../../managers/AsyncStorageManager";
import {Card, List, Switch, ToggleButton, withTheme} from 'react-native-paper'; import {Card, List, Switch, ToggleButton, withTheme} from 'react-native-paper';
import {Appearance} from "react-native-appearance"; import {Appearance} from "react-native-appearance";
import CustomSlider from "../../components/Overrides/CustomSlider"; import CustomSlider from "../../components/Overrides/CustomSlider";
import {StackNavigationProp} from "@react-navigation/stack";
type Props = { type Props = {
navigation: StackNavigationProp,
theme: CustomTheme, theme: CustomTheme,
}; };
@ -21,7 +19,6 @@ type State = {
nightModeFollowSystem: boolean, nightModeFollowSystem: boolean,
notificationReminderSelected: number, notificationReminderSelected: number,
startScreenPickerSelected: string, startScreenPickerSelected: string,
isDebugUnlocked: boolean,
}; };
/** /**
@ -44,19 +41,9 @@ class SettingsScreen extends React.Component<Props, State> {
Appearance.getColorScheme() !== 'no-preference', Appearance.getColorScheme() !== 'no-preference',
notificationReminderSelected: this.savedNotificationReminder, notificationReminderSelected: this.savedNotificationReminder,
startScreenPickerSelected: AsyncStorageManager.getInstance().preferences.defaultStartScreen.current, startScreenPickerSelected: AsyncStorageManager.getInstance().preferences.defaultStartScreen.current,
isDebugUnlocked: AsyncStorageManager.getInstance().preferences.debugUnlocked.current === '1'
}; };
} }
/**
* Unlocks debug mode
*/
unlockDebugMode = () => {
this.setState({isDebugUnlocked: true});
let key = AsyncStorageManager.getInstance().preferences.debugUnlocked.key;
AsyncStorageManager.getInstance().savePref(key, '1');
}
/** /**
* Saves the value for the proxiwash reminder notification time * Saves the value for the proxiwash reminder notification time
* *
@ -218,31 +205,6 @@ class SettingsScreen extends React.Component<Props, State> {
</View> </View>
</List.Section> </List.Section>
</Card> </Card>
<Card style={{margin: 5}}>
<Card.Title title={i18n.t('settingsScreen.information')}/>
<List.Section>
{this.state.isDebugUnlocked
? <List.Item
title={i18n.t('screens.debug')}
left={props => <List.Icon {...props} icon="bug-check"/>}
onPress={() => this.props.navigation.navigate("debug")}
/>
:null}
<List.Item
title={i18n.t('screens.about')}
description={i18n.t('aboutScreen.buttonDesc')}
left={props => <List.Icon {...props} icon="information"/>}
onPress={() => this.props.navigation.navigate("about")}
onLongPress={this.unlockDebugMode}
/>
<List.Item
title={i18n.t('feedbackScreen.homeButtonTitle')}
description={i18n.t('feedbackScreen.homeButtonSubtitle')}
left={props => <List.Icon {...props} icon="bug"/>}
onPress={() => this.props.navigation.navigate("feedback")}
/>
</List.Section>
</Card>
</ScrollView> </ScrollView>
); );
} }

View file

@ -6,15 +6,11 @@ import DateManager from "../../managers/DateManager";
import WebSectionList from "../../components/Screens/WebSectionList"; import WebSectionList from "../../components/Screens/WebSectionList";
import {Card, Text, withTheme} from 'react-native-paper'; import {Card, Text, withTheme} from 'react-native-paper';
import AprilFoolsManager from "../../managers/AprilFoolsManager"; import AprilFoolsManager from "../../managers/AprilFoolsManager";
import {StackNavigationProp} from "@react-navigation/stack";
import type {CustomTheme} from "../../managers/ThemeManager";
import i18n from 'i18n-js';
const DATA_URL = "https://etud.insa-toulouse.fr/~amicale_app/menu/menu_data.json"; const DATA_URL = "https://etud.insa-toulouse.fr/~amicale_app/menu/menu_data.json";
type Props = { type Props = {
navigation: StackNavigationProp, navigation: Object,
theme: CustomTheme,
} }
/** /**
@ -22,6 +18,20 @@ type Props = {
*/ */
class SelfMenuScreen extends React.Component<Props> { class SelfMenuScreen extends React.Component<Props> {
getRenderItem: Function;
getRenderSectionHeader: Function;
createDataset: Function;
colors: Object;
constructor(props) {
super(props);
this.getRenderItem = this.getRenderItem.bind(this);
this.getRenderSectionHeader = this.getRenderSectionHeader.bind(this);
this.createDataset = this.createDataset.bind(this);
this.colors = props.theme.colors;
}
/** /**
* Extract a key for the given item * Extract a key for the given item
* *
@ -38,32 +48,32 @@ class SelfMenuScreen extends React.Component<Props> {
* @param fetchedData * @param fetchedData
* @return {[]} * @return {[]}
*/ */
createDataset = (fetchedData: Object) => { createDataset(fetchedData: Object) {
let result = []; let result = [];
if (fetchedData == null || Object.keys(fetchedData).length === 0) { // Prevent crash by giving a default value when fetchedData is empty (not yet available)
if (Object.keys(fetchedData).length === 0) {
result = [ result = [
{ {
title: i18n.t("general.notAvailable"), title: '',
data: [], data: [],
keyExtractor: this.getKeyExtractor keyExtractor: this.getKeyExtractor
} }
]; ];
} else { }
if (AprilFoolsManager.getInstance().isAprilFoolsEnabled() && fetchedData.length > 0) if (AprilFoolsManager.getInstance().isAprilFoolsEnabled() && fetchedData.length > 0)
fetchedData[0].meal[0].foodcategory = AprilFoolsManager.getFakeMenuItem(fetchedData[0].meal[0].foodcategory); fetchedData[0].meal[0].foodcategory = AprilFoolsManager.getFakeMenuItem(fetchedData[0].meal[0].foodcategory);
// fetched data is an array here // fetched data is an array here
for (let i = 0; i < fetchedData.length; i++) { for (let i = 0; i < fetchedData.length; i++) {
result.push( result.push(
{ {
title: DateManager.getInstance().getTranslatedDate(fetchedData[i].date), title: DateManager.getInstance().getTranslatedDate(fetchedData[i].date),
data: fetchedData[i].meal[0].foodcategory, data: fetchedData[i].meal[0].foodcategory,
keyExtractor: this.getKeyExtractor, keyExtractor: this.getKeyExtractor,
} }
); );
}
} }
return result return result
}; }
/** /**
* Gets the render section header * Gets the render section header
@ -71,7 +81,7 @@ class SelfMenuScreen extends React.Component<Props> {
* @param section The section to render the header from * @param section The section to render the header from
* @return {*} * @return {*}
*/ */
getRenderSectionHeader = ({section}: Object) => { getRenderSectionHeader({section}: Object) {
return ( return (
<Card style={{ <Card style={{
width: '95%', width: '95%',
@ -95,7 +105,7 @@ class SelfMenuScreen extends React.Component<Props> {
/> />
</Card> </Card>
); );
}; }
/** /**
* Gets a FlatList render item * Gets a FlatList render item
@ -103,7 +113,7 @@ class SelfMenuScreen extends React.Component<Props> {
* @param item The item to render * @param item The item to render
* @return {*} * @return {*}
*/ */
getRenderItem = ({item}: Object) => { getRenderItem({item}: Object) {
return ( return (
<Card style={{ <Card style={{
flex: 0, flex: 0,
@ -119,7 +129,7 @@ class SelfMenuScreen extends React.Component<Props> {
marginLeft: 'auto', marginLeft: 'auto',
marginRight: 'auto', marginRight: 'auto',
borderBottomWidth: 1, borderBottomWidth: 1,
borderBottomColor: this.theme.colors.primary, borderBottomColor: this.colors.primary,
marginTop: 5, marginTop: 5,
marginBottom: 5, marginBottom: 5,
}}/> }}/>
@ -137,7 +147,7 @@ class SelfMenuScreen extends React.Component<Props> {
</Card.Content> </Card.Content>
</Card> </Card>
); );
}; }
/** /**
* Formats the given string to make sure it starts with a capital letter * Formats the given string to make sure it starts with a capital letter

View file

@ -111,12 +111,6 @@ class ServicesScreen extends React.Component<Props, State> {
image: TUTORINSA_IMAGE, image: TUTORINSA_IMAGE,
onPress: () => nav.navigate("tutorinsa"), onPress: () => nav.navigate("tutorinsa"),
}, },
{
title: i18n.t('screens.amicaleWebsite'),
subtitle: "AMICALE",
image: AMICALE_IMAGE,
onPress: () => nav.navigate("amicale-website"),
},
]; ];
this.insaDataset = [ this.insaDataset = [
{ {

View file

@ -4,15 +4,6 @@ import * as React from 'react';
import WebViewScreen from "../../../components/Screens/WebViewScreen"; import WebViewScreen from "../../../components/Screens/WebViewScreen";
const URL = 'https://etud-mel.insa-toulouse.fr/webmail/'; const URL = 'https://etud-mel.insa-toulouse.fr/webmail/';
const customPadding = (padding: string) => {
return (
"$('head').append('<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">');" +
"$('.minwidth').css('top', " + padding + ");" +
"$('#mailview-bottom').css('min-height', 500);"
);
}
/** /**
* Class defining the app's available rooms screen. * Class defining the app's available rooms screen.
* This screen uses a webview to render the page * This screen uses a webview to render the page
@ -21,7 +12,6 @@ export const BlueMindWebsiteScreen = (props: Object) => {
return ( return (
<WebViewScreen <WebViewScreen
{...props} {...props}
customPaddingFunction={customPadding}
url={URL}/> url={URL}/>
); );
}; };

View file

@ -4,17 +4,6 @@ import * as React from 'react';
import WebViewScreen from "../../../components/Screens/WebViewScreen"; import WebViewScreen from "../../../components/Screens/WebViewScreen";
const URL = 'https://wiki.etud.insa-toulouse.fr/'; const URL = 'https://wiki.etud.insa-toulouse.fr/';
const customPadding = (padding: string) => {
return (
"$('#p-logo-text').css('top', 10 + " + padding + ");" +
"$('#site-navigation h2').css('top', 10 + " + padding + ");" +
"$('#site-tools h2').css('top', 10 + " + padding + ");" +
"$('#user-tools h2').css('top', 10 + " + padding + ");"
);
}
/** /**
* Class defining the app's available rooms screen. * Class defining the app's available rooms screen.
* This screen uses a webview to render the page * This screen uses a webview to render the page
@ -23,7 +12,6 @@ export const WiketudWebsiteScreen = (props: Object) => {
return ( return (
<WebViewScreen <WebViewScreen
{...props} {...props}
customPaddingFunction={customPadding}
url={URL}/> url={URL}/>
); );
}; };

View file

@ -28,33 +28,33 @@
"feedback": "Feedback" "feedback": "Feedback"
}, },
"intro": { "intro": {
"slideMain": { "slide1": {
"title": "Welcome to CAMPUS", "title": "Welcome to CAMPUS",
"text": "The new app to use during your coffee break to get updates on the campus life!" "text": "The new app to use during your coffee break to get updates on the campus life!"
}, },
"slideEvents": { "slide2": {
"title": "Stay up to date", "title": "Stay up to date",
"text": "CAMPUS allows you to be aware of any event occurring on the campus, from pancake sales to Enfoiros concerts!" "text": "CAMPUS allows you to be aware of any event occurring on the campus, from pancake sales to Enfoiros concerts!"
}, },
"slideProxiwash": { "slide3": {
"title": "Never forget your laundry", "title": "Never forget your laundry",
"text": "CAMPUS will inform you on the availability of washing machines and will remind you just before yours finishes!" "text": "CAMPUS will inform you on the availability of washing machines and will remind you just before yours finishes!"
}, },
"slidePlanex": { "slide4": {
"title": "Planex", "title": "Proximo",
"text": "Lookup your next course on CAMPUS with a mobile friendly timetable" "text": "Are you short on pasta? Or maybe you feel a little peckish, then look up your INSA shop's stock in real time"
}, },
"slideRU": { "slide5": {
"title": "Planex",
"text": "Lookup your timetable on CAMPUS"
},
"slide6": {
"title": "RU Menu", "title": "RU Menu",
"text": "For the hungry, check this week's menu!" "text": "For the hungry, check this week's menu!"
}, },
"slideServices": { "slide7": {
"title": "More services!", "title": "More to come...",
"text": "You can do much more with CAMPUS, explore the app to find out" "text": "New features are coming soon, do not hesitate to give us feedback to improve the app"
},
"slideDone": {
"title": "Made by a student",
"text": "This app is the work of one student (with some help here and there), so any feedback is appreciated!"
}, },
"updateSlide0": { "updateSlide0": {
"title": "New in this update!", "title": "New in this update!",
@ -91,8 +91,7 @@
"startScreen": "Start Screen", "startScreen": "Start Screen",
"startScreenSub": "Select which screen to start the app on", "startScreenSub": "Select which screen to start the app on",
"proxiwashNotifReminder": "Machine running reminder", "proxiwashNotifReminder": "Machine running reminder",
"proxiwashNotifReminderSub": "How many minutes before", "proxiwashNotifReminderSub": "How many minutes before"
"information": "Information"
}, },
"homeScreen": { "homeScreen": {
"listUpdated": "List updated!", "listUpdated": "List updated!",
@ -111,7 +110,6 @@
} }
}, },
"aboutScreen": { "aboutScreen": {
"buttonDesc": "Information about the app and its creator",
"appstore": "See on the Appstore", "appstore": "See on the Appstore",
"playstore": "See on the Playstore", "playstore": "See on the Playstore",
"changelog": "Changelog", "changelog": "Changelog",
@ -345,8 +343,7 @@
"networkError": "Unable to contact servers. Make sure you are connected to Internet.", "networkError": "Unable to contact servers. Make sure you are connected to Internet.",
"goBack": "Go Back", "goBack": "Go Back",
"goForward": "Go Forward", "goForward": "Go Forward",
"openInBrowser": "Open in Browser", "openInBrowser": "Open in Browser"
"notAvailable": "Not available"
}, },
"date": { "date": {
"daysOfWeek": { "daysOfWeek": {

View file

@ -28,33 +28,33 @@
"feedback": "Votre avis" "feedback": "Votre avis"
}, },
"intro": { "intro": {
"slideMain": { "slide1": {
"title": "Bienvenue sur CAMPUS", "title": "Bienvenue sur CAMPUS",
"text": "La nouvelle appli à consulter pendant la pause café pour être au courant de la vie du campus !" "text": "La nouvelle app à consulter pendant la pause café pour être au courant de la vie du campus !"
}, },
"slideEvents": { "slide2": {
"title": "Restez informés", "title": "Restez informés",
"text": "CAMPUS vous permet d'être au courant de tous les événements qui ont lieu sur le campus, de la vente de crêpes jusqu'aux concerts enfoiros !" "text": "CAMPUS vous permet d'être au courant de tous les événements qui ont lieu sur le campus, de la vente de crêpes jusqu'aux concerts enfoiros !"
}, },
"slideProxiwash": { "slide3": {
"title": "N'oubliez plus votre linge !", "title": "N'oubliez plus votre linge !",
"text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifié lorsque la vôtre se termine bientôt !" "text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifié lorsque la vôtre se termine bientôt !"
}, },
"slidePlanex": { "slide4": {
"title": "Planex", "title": "Proximo",
"text": "Vérifiez votre prochain cours sur CAMPUS avec un emploi du temps adapté mobile" "text": "Il vous manque des pâtes ? Ou un petit creux au goûter, regardez les stocks de votre supérette insaienne en temps réel"
}, },
"slideRU": { "slide5": {
"title": "Planex",
"text": "Consultez votre emploi du temps sur CAMPUS"
},
"slide6": {
"title": "Menu du RU", "title": "Menu du RU",
"text": "Pour ceux qui ont faim, vérifiez le menu du RU de la semaine !" "text": "Pour ceux qui ont faim, vérifiez le menu du RU de la semaine !"
}, },
"slideServices": { "slide7": {
"title": "Encore plus de services !", "title": "Plus à venir...",
"text": "CAMPUS vous permet de faire bien plus, explorez l'appli pour savoir quoi" "text": "D'autres fonctionnalités arrivent bientôt, n'hésitez pas à nous donner votre avis pour améliorer l'appli"
},
"slideDone": {
"title": "Fait par un étudiant",
"text": "Cette appli à été réalisée par un seul étudiant (avec un peu d'aide par-ci par-là), donc tous les retours sont les bienvenus !"
}, },
"updateSlide0": { "updateSlide0": {
"title": "Nouveau dans cette mise à jour !", "title": "Nouveau dans cette mise à jour !",
@ -91,8 +91,7 @@
"startScreen": "Écran de démarrage", "startScreen": "Écran de démarrage",
"startScreenSub": "Choisissez l'écran utilisé au démarrage", "startScreenSub": "Choisissez l'écran utilisé au démarrage",
"proxiwashNotifReminder": "Rappel de machine en cours", "proxiwashNotifReminder": "Rappel de machine en cours",
"proxiwashNotifReminderSub": "Combien de minutes avant", "proxiwashNotifReminderSub": "Combien de minutes avant"
"information": "Informations"
}, },
"homeScreen": { "homeScreen": {
"listUpdated": "List mise à jour!", "listUpdated": "List mise à jour!",
@ -111,7 +110,6 @@
} }
}, },
"aboutScreen": { "aboutScreen": {
"buttonDesc": "Informations sur l'appli et son créateur",
"appstore": "Voir sur l'Appstore", "appstore": "Voir sur l'Appstore",
"playstore": "Voir sur le Playstore", "playstore": "Voir sur le Playstore",
"changelog": "Historique des modifications", "changelog": "Historique des modifications",
@ -345,8 +343,7 @@
"networkError": "Impossible de contacter les serveurs. Assurez-vous d'être connecté à internet.", "networkError": "Impossible de contacter les serveurs. Assurez-vous d'être connecté à internet.",
"goBack": "Suivant", "goBack": "Suivant",
"goForward": "Précédent", "goForward": "Précédent",
"openInBrowser": "Ouvrir dans le navigateur", "openInBrowser": "Ouvrir dans le navigateur"
"notAvailable": "Non disponible"
}, },
"date": { "date": {
"daysOfWeek": { "daysOfWeek": {
@ -407,10 +404,10 @@
"bugsSubtitle": "Vous avez trouvé un bug ?", "bugsSubtitle": "Vous avez trouvé un bug ?",
"bugsDescription": "Rapporter les bugs nous aide à améliorer l'appli. Pour cela, merci d'utiliser un des boutons ci-dessous et de décrire votre problème le plus précisément possible !", "bugsDescription": "Rapporter les bugs nous aide à améliorer l'appli. Pour cela, merci d'utiliser un des boutons ci-dessous et de décrire votre problème le plus précisément possible !",
"feedback": "Feedback", "feedback": "Feedback",
"feedbackSubtitle": "Dites nous ce que vous pensez !", "feedbackSubtitle": "Did nous ce que vous pensez!",
"feedbackDescription": "Vous voulez voir une fonctionnalité ajoutée/modifiée/supprimée ? Vous voulez donner votre opinion sur l'appli ou simplement discuter avec le développeur ? Utilisez un des liens ci-dessous !", "feedbackDescription": "Vous voulez voir une fonctionnalité ajoutée/modifiée/supprimée ?, vous voulez donner votre opinion sur l'appli ou simplement discuter avec les devs ? Utilisez un des liens ci-dessous !",
"contactMeans": "L'utilisation de Gitea est recommandée, pour l'utiliser, connectez vous avec vos identifiants INSA.", "contactMeans": "L'utilisation de Gitea est recommandée, pour l'utiliser, connectez vous avec vos identifiants INSA.",
"homeButtonTitle": "Feedback/Bugs", "homeButtonTitle": "Feedback/Bugs",
"homeButtonSubtitle": "Contacter le développeur" "homeButtonSubtitle": "Contacter les devs"
} }
} }