vbea 3 лет назад
Родитель
Сommit
bd3fce247e
48 измененных файлов с 497 добавлено и 108 удалено
  1. 2 2
      Strides-APP/android/app/BUCK
  2. 2 2
      Strides-APP/android/app/build.gradle
  3. 3 3
      Strides-APP/android/app/google-services.json
  4. 1 1
      Strides-APP/android/app/src/main/java/com/strides/chargeco/MainApplication.java
  5. BIN
      Strides-APP/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  6. BIN
      Strides-APP/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  7. BIN
      Strides-APP/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  8. BIN
      Strides-APP/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  9. BIN
      Strides-APP/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  10. BIN
      Strides-APP/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  11. BIN
      Strides-APP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  12. BIN
      Strides-APP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  13. BIN
      Strides-APP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  14. BIN
      Strides-APP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  15. 3 2
      Strides-APP/android/app/src/main/res/values/colors.xml
  16. 2 2
      Strides-APP/android/app/src/main/res/values/strings.xml
  17. 3 0
      Strides-APP/android/app/src/main/res/values/styles.xml
  18. 2 2
      Strides-APP/android/app/version.properties
  19. 2 2
      Strides-APP/app.json
  20. 1 1
      Strides-APP/app/components/Dialog.js
  21. 1 1
      Strides-APP/app/components/Toolbar.js
  22. BIN
      Strides-APP/app/images/about-logo.png
  23. BIN
      Strides-APP/app/images/app-logo.png
  24. BIN
      Strides-APP/app/images/charge/charge-complete.png
  25. BIN
      Strides-APP/app/images/charge/charge-item-select.png
  26. BIN
      Strides-APP/app/images/charge/icon-station-no.png
  27. BIN
      Strides-APP/app/images/tool-logo.png
  28. BIN
      Strides-APP/app/images/user/bg-profile.png
  29. 6 5
      Strides-APP/app/pages/About.js
  30. 8 7
      Strides-APP/app/pages/Launch.js
  31. 1 1
      Strides-APP/app/pages/Router.js
  32. 4 3
      Strides-APP/app/pages/charge/Charging.js
  33. 39 27
      Strides-APP/app/pages/home/Home.js
  34. 1 1
      Strides-APP/app/pages/home/Notify.js
  35. 4 3
      Strides-APP/app/pages/my/AddVehicle.js
  36. 4 3
      Strides-APP/app/pages/my/EditVehicle.js
  37. 8 4
      Strides-APP/app/pages/my/Profile.js
  38. 4 9
      Strides-APP/app/pages/payment/PaymentMethod.js
  39. 1 1
      Strides-APP/app/pages/sign/Login.js
  40. 1 1
      Strides-APP/app/pages/sign/Register.js
  41. 4 14
      Strides-APP/app/pages/wallet/PaythodList.js
  42. 4 3
      Strides-APP/app/utils/constant.js
  43. 2 2
      Strides-APP/app/utils/notification.js
  44. 1 1
      Strides-APP/index.js
  45. 2 2
      Strides-APP/ios/JuicePlus.xcodeproj/project.pbxproj
  46. 1 1
      Strides-APP/ios/JuicePlus/GoogleService-Info.plist
  47. 379 0
      Strides-APP/node_modules/react-native/react.gradle
  48. 1 2
      Strides-APP/package.json

+ 2 - 2
Strides-APP/android/app/BUCK

@@ -35,12 +35,12 @@ android_library(
 
 
 android_build_config(
 android_build_config(
     name = "build_config",
     name = "build_config",
-    package = "com.evct.juiceplus",
+    package = "com.strides.chargeco",
 )
 )
 
 
 android_resource(
 android_resource(
     name = "res",
     name = "res",
-    package = "com.evct.juiceplus",
+    package = "com.strides.chargeco",
     res = "src/main/res",
     res = "src/main/res",
 )
 )
 
 

+ 2 - 2
Strides-APP/android/app/build.gradle

@@ -3,7 +3,7 @@ apply plugin: 'com.google.gms.google-services'
 
 
 import com.android.build.OutputFile
 import com.android.build.OutputFile
 
 
-def myVersionName = "2.2.1" //★★★★★版本号★★★★★
+def myVersionName = "0.0.1 Alpha" //★★★★★版本号★★★★★
 /**
 /**
  * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
  * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
  * and bundleReleaseJsAndAssets).
  * and bundleReleaseJsAndAssets).
@@ -152,7 +152,7 @@ android {
     }
     }
 
 
     defaultConfig {
     defaultConfig {
-        applicationId "com.evct.juiceplus"
+        applicationId "com.strides.chargeco"
         minSdkVersion rootProject.ext.minSdkVersion
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
         versionCode getMyVersionCode()
         versionCode getMyVersionCode()

+ 3 - 3
Strides-APP/android/app/google-services.json

@@ -1,15 +1,15 @@
 {
 {
   "project_info": {
   "project_info": {
     "project_number": "948303787961",
     "project_number": "948303787961",
-    "project_id": "juiceplus-c5c61",
-    "storage_bucket": "juiceplus-c5c61.appspot.com"
+    "project_id": "chargeco-c5c61",
+    "storage_bucket": "chargeco-c5c61.appspot.com"
   },
   },
   "client": [
   "client": [
     {
     {
       "client_info": {
       "client_info": {
         "mobilesdk_app_id": "1:948303787961:android:c732f8811a2a248f9aa868",
         "mobilesdk_app_id": "1:948303787961:android:c732f8811a2a248f9aa868",
         "android_client_info": {
         "android_client_info": {
-          "package_name": "com.evct.juiceplus"
+          "package_name": "com.strides.chargeco"
         }
         }
       },
       },
       "oauth_client": [
       "oauth_client": [

+ 1 - 1
Strides-APP/android/app/src/main/java/com/strides/chargeco/MainApplication.java

@@ -67,7 +67,7 @@ public class MainApplication extends Application implements ShareApplication, Re
          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.evct.juiceplus.ReactNativeFlipper");
+        Class<?> aClass = Class.forName("com.strides.chargeco.ReactNativeFlipper");
         aClass
         aClass
             .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
             .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
             .invoke(null, context, reactInstanceManager);
             .invoke(null, context, reactInstanceManager);

BIN
Strides-APP/android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
Strides-APP/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
Strides-APP/android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
Strides-APP/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
Strides-APP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 3 - 2
Strides-APP/android/app/src/main/res/values/colors.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 <resources>
   <color name="white">#FFFFFF</color>
   <color name="white">#FFFFFF</color>
-  <color name="colorPrimary">#FFCC2C</color>
-  <color name="colorAccent">#FFCC2C</color>
+  <color name="black">#000000</color>
+  <color name="colorPrimary">#001489</color>
+  <color name="colorAccent">#A3C93A</color>
 </resources>
 </resources>

+ 2 - 2
Strides-APP/android/app/src/main/res/values/strings.xml

@@ -1,4 +1,4 @@
 <resources>
 <resources>
-    <string name="app_name">JuicePlus</string>
-    <string name="default_notification_channel_id">10086</string>
+    <string name="app_name">ChargEco</string>
+    <string name="default_notification_channel_id">10186</string>
 </resources>
 </resources>

+ 3 - 0
Strides-APP/android/app/src/main/res/values/styles.xml

@@ -6,7 +6,10 @@
         <item name="android:textColor">#000000</item>
         <item name="android:textColor">#000000</item>
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimary</item>
+        <item name="colorPrimaryVariant">@color/colorPrimary</item>
         <item name="colorAccent">@color/colorAccent</item>
         <item name="colorAccent">@color/colorAccent</item>
+        <item name="colorOnPrimary">@color/black</item>
+        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
     </style>
     </style>
 
 
 </resources>
 </resources>

+ 2 - 2
Strides-APP/android/app/version.properties

@@ -1,2 +1,2 @@
-#Fri Nov 18 18:37:31 CST 2022
-VERSION_CODE=572
+#Fri Dec 23 14:30:10 CST 2022
+VERSION_CODE=51

+ 2 - 2
Strides-APP/app.json

@@ -1,8 +1,8 @@
 {
 {
   "name": "JuicePlus",
   "name": "JuicePlus",
-  "displayName": "Strides",
+  "displayName": "ChargEco",
   "versionCode": 10,
   "versionCode": 10,
-  "versionName": "V0.0.1",
+  "versionName": "V0.0.1 Alpha",
   "product": false,
   "product": false,
   "debug": true
   "debug": true
 }
 }

+ 1 - 1
Strides-APP/app/components/Dialog.js

@@ -364,7 +364,7 @@ const andStyles = StyleSheet.create({
   },
   },
   modalBtnText: {
   modalBtnText: {
     fontSize: 14,
     fontSize: 14,
-    color: colorPrimaryDark
+    color: colorPrimary
   },
   },
   progressView: {
   progressView: {
     alignItems: 'center',
     alignItems: 'center',

+ 1 - 1
Strides-APP/app/components/Toolbar.js

@@ -45,7 +45,7 @@ export const Styles = StyleSheet.create({
     alignItems: 'center',
     alignItems: 'center',
     flexDirection: 'row',
     flexDirection: 'row',
     justifyContent: 'center',
     justifyContent: 'center',
-    backgroundColor: colorPrimary
+    backgroundColor: colorThemes
   },
   },
   backIcon: {
   backIcon: {
     width: 48,
     width: 48,

BIN
Strides-APP/app/images/about-logo.png


BIN
Strides-APP/app/images/app-logo.png


BIN
Strides-APP/app/images/charge/charge-complete.png


BIN
Strides-APP/app/images/charge/charge-item-select.png


BIN
Strides-APP/app/images/charge/icon-station-no.png


BIN
Strides-APP/app/images/tool-logo.png


BIN
Strides-APP/app/images/user/bg-profile.png


+ 6 - 5
Strides-APP/app/pages/About.js

@@ -6,17 +6,18 @@ import React from 'react';
 import { View, Text, Image, StyleSheet } from 'react-native';
 import { View, Text, Image, StyleSheet } from 'react-native';
 import app from '../../app.json';
 import app from '../../app.json';
 
 
-const author = 2021;
+const author = 2022;
 
 
 export default About = () => {
 export default About = () => {
   return (
   return (
     <View style={styles.container}>
     <View style={styles.container}>
       <Image
       <Image
         style={styles.logo}
         style={styles.logo}
+        resizeMode='contain'
         source={require('../images/about-logo.png')}/>
         source={require('../images/about-logo.png')}/>
-      <Text style={styles.appName}>{app.displayName}</Text>
+      {/* <Text style={styles.appName}>{app.displayName}</Text> */}
       <Text style={styles.versionName}>{app.versionName}</Text>
       <Text style={styles.versionName}>{app.versionName}</Text>
-      <Text style={styles.copyright}>{/*app.versionName + ' Build ' + app.versionCode + */getYearRange()+' EV Charging Technology Pte. Ltd.'}</Text>
+      <Text style={styles.copyright}>{'Copyright ' + /*app.versionName + ' Build ' + app.versionCode + */getYearRange()+' Strides Pte. Ltd.'}</Text>
     </View>
     </View>
   );
   );
 }
 }
@@ -37,8 +38,8 @@ const styles = StyleSheet.create({
     backgroundColor: '#FFF'
     backgroundColor: '#FFF'
   },
   },
   logo: {
   logo: {
-    width: 96,
-    height: 96,
+    width: 238,
+    height: 75,
     marginTop: $vw(25)
     marginTop: $vw(25)
   },
   },
   appName: {
   appName: {

+ 8 - 7
Strides-APP/app/pages/Launch.js

@@ -43,8 +43,9 @@ class Launch extends React.Component {
             <View style={styles.content}>
             <View style={styles.content}>
               <Image
               <Image
                 style={styles.logo}
                 style={styles.logo}
-                source={require('../images/tool-logo.png')}/>
-              <Text style={styles.slogan}>Feel The Green Energy</Text>
+                resizeMode='contain'
+                source={require('../images/app-logo.png')}/>
+              {/* <Text style={styles.slogan}>Feel The Green Energy</Text> */}
             </View>
             </View>
           </View>
           </View>
       : <View style={styles.loaded}></View>
       : <View style={styles.loaded}></View>
@@ -57,12 +58,12 @@ export default Launch
 const styles = StyleSheet.create({
 const styles = StyleSheet.create({
   container: {
   container: {
     alignItems: 'center',
     alignItems: 'center',
-    backgroundColor: colorPrimary,
+    backgroundColor: colorThemes,
     ...StyleSheet.absoluteFillObject
     ...StyleSheet.absoluteFillObject
   },
   },
   iosContent: {
   iosContent: {
     flex: 1,
     flex: 1,
-    backgroundColor: colorPrimary
+    backgroundColor: colorThemes
   },
   },
   loaded: {
   loaded: {
     flex: 1,
     flex: 1,
@@ -73,9 +74,9 @@ const styles = StyleSheet.create({
     paddingTop: $vh(30)
     paddingTop: $vh(30)
   },
   },
   logo: {
   logo: {
-    width:165.09,
-    height: 51.94,
-    marginLeft: 10,
+    width: 190.67,
+    height: 60,
+    marginLeft: 0,
     //top: $vh(25),
     //top: $vh(25),
     //bottom: $vh(25),
     //bottom: $vh(25),
     //position: 'absolute'
     //position: 'absolute'

+ 1 - 1
Strides-APP/app/pages/Router.js

@@ -240,7 +240,7 @@ const Title = (title, opt = {}) => {
     headerStyle: {
     headerStyle: {
       ...titleHeight(),
       ...titleHeight(),
       elevation: 0,
       elevation: 0,
-      backgroundColor: colorPrimary
+      backgroundColor: colorThemes
     },
     },
     headerTintColor: '#232323',
     headerTintColor: '#232323',
     headerBackTitle: ' ',
     headerBackTitle: ' ',

+ 4 - 3
Strides-APP/app/pages/charge/Charging.js

@@ -7,6 +7,7 @@ import { Animated, View, Easing, StyleSheet, Image, Text, ImageBackground, TextI
 import { RadialGradient } from 'react-native-gradients';
 import { RadialGradient } from 'react-native-gradients';
 import Modal from 'react-native-modal';
 import Modal from 'react-native-modal';
 import { ModalProps } from '../../components/BottomModal';
 import { ModalProps } from '../../components/BottomModal';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { DialogMaxWidth } from './InfoDialog';
 import { DialogMaxWidth } from './InfoDialog';
 import { QRResult } from './QRScan';
 import { QRResult } from './QRScan';
 
 
@@ -403,9 +404,9 @@ export const SelectableIcon = ({selected, children}) => {
   return (
   return (
     <View style={styles.selectView}>
     <View style={styles.selectView}>
       {selected &&
       {selected &&
-        <Image
-          style={[styles.selectIcon, children && styles.selectIconAbs]}
-          source={require('../../images/charge/charge-item-select.png')}/>
+        <View style={[styles.selectIcon, children && styles.selectIconAbs]}>
+          <ChargeItemSelect size={18} selected={true}/>
+        </View>
       }
       }
       {children}
       {children}
     </View>
     </View>

+ 39 - 27
Strides-APP/app/pages/home/Home.js

@@ -6,6 +6,7 @@ import React, { Component } from 'react';
 import { View, Text, Pressable, Image, StyleSheet, BackHandler } from 'react-native';
 import { View, Text, Pressable, Image, StyleSheet, BackHandler } from 'react-native';
 import {check, request, openSettings, PERMISSIONS, RESULTS} from 'react-native-permissions';
 import {check, request, openSettings, PERMISSIONS, RESULTS} from 'react-native-permissions';
 import apiStation from '../../api/apiStation';
 import apiStation from '../../api/apiStation';
+import Button from '../../components/Button';
 import Dialog from '../../components/Dialog';
 import Dialog from '../../components/Dialog';
 import { Styles } from '../../components/Toolbar';
 import { Styles } from '../../components/Toolbar';
 import utils from '../../utils/utils';
 import utils from '../../utils/utils';
@@ -13,6 +14,7 @@ import { PageList } from '../Router';
 import { SettingUtil } from '../Settings';
 import { SettingUtil } from '../Settings';
 import Maps from './maps/Maps';
 import Maps from './maps/Maps';
 import MapTool from './maps/MapTool';
 import MapTool from './maps/MapTool';
+import SearchTool from './maps/SearchTool';
 import TopInfo from './maps/TopInfo';
 import TopInfo from './maps/TopInfo';
 
 
 export default class HomePage extends Component {
 export default class HomePage extends Component {
@@ -287,30 +289,34 @@ export default class HomePage extends Component {
             onPress={() => {
             onPress={() => {
               this.props.navigation.toggleDrawer();
               this.props.navigation.toggleDrawer();
             }}>
             }}>
-            <EvilIcons name={'navicon'} size={28} color={'#333333'} />
+            <EvilIcons name={'navicon'} size={28} color={colorPrimary} />
           </Pressable>
           </Pressable>
-          <View style={Styles.content}>
+          <View style={styles.logoView}>
             <Image
             <Image
               source={require('../../images/tool-logo.png')}
               source={require('../../images/tool-logo.png')}
               style={Styles.logo}
               style={Styles.logo}
             />
             />
           </View>
           </View>
+          <Text style={ui.flex1}></Text>
+          <Pressable
+            style={Styles.backIcon}
+            android_ripple = {rippleLess}
+            onPress={() => {
+              this.props.navigation.toggleDrawer();
+            }}>
+            <MaterialCommunityIcons
+              name='line-scan'
+              size={28}
+              color={colorPrimary}
+            />
+          </Pressable>
         </View>
         </View>
-        <View style={styles.searchView}>
-          <View style={styles.searchInput}>
-            <Feather
-              name={'search'}
-              size={24}
-              color={'#333'}/>
-            <Text
-              style={styles.searchText}
-              onPress={() => {
-                startPage(PageList.search);
-              }}>
-              Search using keywords
-            </Text>
-          </View>
-        </View>
+        <SearchTool
+          count={this.state.stopList.length}
+          mapReady={this.state.mapReady}
+          onFilter={data => this.findFilter(data)}
+          onLocation={() => this.checkPermission2Geo(true)}
+        />
         <View style={styles.mapContent}>
         <View style={styles.mapContent}>
           { this.state.hasPermission &&
           { this.state.hasPermission &&
             <Maps.Maps3
             <Maps.Maps3
@@ -327,12 +333,6 @@ export default class HomePage extends Component {
             />
             />
           }
           }
           <TopInfo stationInfo={this.state.stationInfo}/>
           <TopInfo stationInfo={this.state.stationInfo}/>
-          <MapTool
-            count={this.state.stopList.length}
-            mapReady={this.state.mapReady}
-            onFilter={data => this.findFilter(data)}
-            onLocation={() => this.checkPermission2Geo(true)}
-          />
         </View>
         </View>
         <View style={styles.drawerLeftTouchView}></View>
         <View style={styles.drawerLeftTouchView}></View>
       </View>
       </View>
@@ -341,16 +341,28 @@ export default class HomePage extends Component {
 }
 }
 
 
 const styles = StyleSheet.create({
 const styles = StyleSheet.create({
+  logoView: {
+    top: 0,
+    left: 0,
+    right: 0,
+    bottom: 0,
+    alignItems: 'center',
+    position: 'absolute',
+    justifyContent: 'center'
+  },
   searchView: {
   searchView: {
     ...$padding(8, 16, 16),
     ...$padding(8, 16, 16),
-    backgroundColor: colorAccent
+    backgroundColor: colorThemes
   },
   },
   searchInput: {
   searchInput: {
-    paddingLeft: 16,
-    paddingRight: 16,
-    borderRadius: 60,
     alignItems: 'center',
     alignItems: 'center',
+    borderWidth: 1,
+    borderStyle: 'solid',
+    borderRadius: 60,
+    borderColor: colorAccent,
     flexDirection: 'row',
     flexDirection: 'row',
+    paddingLeft: 16,
+    paddingRight: 16,
     backgroundColor: 'rgba(255, 255, 255, 0.5)'
     backgroundColor: 'rgba(255, 255, 255, 0.5)'
   },
   },
   searchText: {
   searchText: {

+ 1 - 1
Strides-APP/app/pages/home/Notify.js

@@ -53,7 +53,7 @@ export default class Notify extends Component {
   localNotification() {
   localNotification() {
     PushNotification.localNotification({
     PushNotification.localNotification({
       /* Android Only Properties */
       /* Android Only Properties */
-      channelId: "10086", // (required) channelId, if the channel doesn't exist, notification will not trigger.
+      channelId: "10186", // (required) channelId, if the channel doesn't exist, notification will not trigger.
       showWhen: true, // (optional) default: true
       showWhen: true, // (optional) default: true
       autoCancel: true, // (optional) default: true
       autoCancel: true, // (optional) default: true
       title: "JuicePlus", // (optional) default: "message" prop
       title: "JuicePlus", // (optional) default: "message" prop

+ 4 - 3
Strides-APP/app/pages/my/AddVehicle.js

@@ -6,6 +6,7 @@ import React, { Component } from 'react';
 import { View, Text, StyleSheet, Pressable, Image, TextInput } from 'react-native';
 import { View, Text, StyleSheet, Pressable, Image, TextInput } from 'react-native';
 import apiUser from '../../api/apiUser';
 import apiUser from '../../api/apiUser';
 import Dialog from '../../components/Dialog';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { TypeImageList } from '../charge/Charging';
 import { TypeImageList } from '../charge/Charging';
 
 
 export default class AddVehicle extends Component {
 export default class AddVehicle extends Component {
@@ -103,9 +104,9 @@ export default class AddVehicle extends Component {
                       source={item.icon}/>
                       source={item.icon}/>
                     <Text style={styles.typeName}>{item.name}</Text>
                     <Text style={styles.typeName}>{item.name}</Text>
                     { index==this.state.connectorIndex &&
                     { index==this.state.connectorIndex &&
-                      <Image
-                        style={styles.checkedIcon}
-                        source={require('../../images/charge/charge-item-select.png')}/>
+                      <View style={styles.checkedIcon}>
+                        <ChargeItemSelect size={12} selected={true}/>
+                      </View>
                     }
                     }
                   </Pressable>
                   </Pressable>
                 )
                 )

+ 4 - 3
Strides-APP/app/pages/my/EditVehicle.js

@@ -6,6 +6,7 @@ import React, { Component } from 'react';
 import { View, Text, Pressable, Image, TextInput } from 'react-native';
 import { View, Text, Pressable, Image, TextInput } from 'react-native';
 import apiUser from '../../api/apiUser';
 import apiUser from '../../api/apiUser';
 import Dialog from '../../components/Dialog';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { TypeImageList } from '../charge/Charging';
 import { TypeImageList } from '../charge/Charging';
 import { VehicleStyles } from './AddVehicle';
 import { VehicleStyles } from './AddVehicle';
 
 
@@ -169,9 +170,9 @@ export default class EditVehicle extends Component {
                         source={item.icon}/>
                         source={item.icon}/>
                       <Text style={styles.typeName}>{item.name}</Text>
                       <Text style={styles.typeName}>{item.name}</Text>
                       { index==this.state.connectorIndex &&
                       { index==this.state.connectorIndex &&
-                        <Image
-                          style={styles.checkedIcon}
-                          source={require('../../images/charge/charge-item-select.png')}/>
+                        <View style={styles.checkedIcon}>
+                          <ChargeItemSelect size={12} selected={true}/>
+                        </View>
                       }
                       }
                     </Pressable>
                     </Pressable>
                   )
                   )

+ 8 - 4
Strides-APP/app/pages/my/Profile.js

@@ -9,6 +9,7 @@ import { host } from '../../api/http';
 import Button, { ElevationObject } from '../../components/Button';
 import Button, { ElevationObject } from '../../components/Button';
 import Dialog from '../../components/Dialog';
 import Dialog from '../../components/Dialog';
 import { StationBack } from '../../components/Toolbar';
 import { StationBack } from '../../components/Toolbar';
+import ProfileBackground from '../../icons/ProfileBackground';
 import utils from '../../utils/utils';
 import utils from '../../utils/utils';
 import { PageList } from '../Router';
 import { PageList } from '../Router';
 import { CardList } from '../wallet/CardList';
 import { CardList } from '../wallet/CardList';
@@ -118,9 +119,12 @@ export default class Profile extends Component {
       <ScrollView style={styles.container}>
       <ScrollView style={styles.container}>
         {/* Profile Info */}
         {/* Profile Info */}
         <View style={styles.headerView}>
         <View style={styles.headerView}>
-          <Image
+          <View style={styles.background}>
+            <ProfileBackground/>
+          </View>
+          {/* <Image
             style={styles.background}
             style={styles.background}
-            source={require('../../images/user/bg-profile.png')}/>
+            source={require('../../images/user/bg-profile.svg')}/> */}
           <Pressable
           <Pressable
             style={styles.profileView}
             style={styles.profileView}
             onPress={() => {
             onPress={() => {
@@ -284,10 +288,10 @@ const styles = StyleSheet.create({
   },
   },
   background: {
   background: {
     left: 0,
     left: 0,
+    right: 0,
     bottom: 0,
     bottom: 0,
-    width: $vw(100),
     height: $vw(62.4),
     height: $vw(62.4),
-    resizeMode: "cover",
+    alignItems: 'center',
     position: 'absolute'
     position: 'absolute'
   },
   },
   profileView: {
   profileView: {

+ 4 - 9
Strides-APP/app/pages/payment/PaymentMethod.js

@@ -7,6 +7,7 @@ import { View, Text, StyleSheet, Pressable, Image } from 'react-native';
 import apiWallet from '../../api/apiWallet';
 import apiWallet from '../../api/apiWallet';
 import Button from '../../components/Button';
 import Button from '../../components/Button';
 import Dialog from '../../components/Dialog';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { PageList } from '../Router';
 import { PageList } from '../Router';
 import { PAYTYPE } from '../wallet/Payment';
 import { PAYTYPE } from '../wallet/Payment';
 import { WalletTitle } from '../wallet/Topup';
 import { WalletTitle } from '../wallet/Topup';
@@ -190,15 +191,9 @@ export default class PaymentMethod extends Component {
                     {item.title} {' '}
                     {item.title} {' '}
                     {item.desc ? item.desc : '(Balance '+currency+userInfo.credit+')'}
                     {item.desc ? item.desc : '(Balance '+currency+userInfo.credit+')'}
                   </Text>
                   </Text>
-                  { index == this.state.cIndex ?
-                    <Image
-                      style={styles.selectIcon}
-                      source={require('../../images/charge/charge-item-select.png')}/>
-                  : <AntDesign
-                      name='checkcircle'
-                      size={18}
-                      color='#ccc'/>
-                  }
+                  <View style={styles.selectIcon}>
+                    <ChargeItemSelect size={18} selected={index == this.state.cIndex}/>
+                  </View>
                 </Pressable>
                 </Pressable>
               );
               );
             })
             })

+ 1 - 1
Strides-APP/app/pages/sign/Login.js

@@ -206,7 +206,7 @@ export default class Login extends React.Component {
             </View>
             </View>
             <Button
             <Button
               style={styles.loginButton}
               style={styles.loginButton}
-              text='Sign in'
+              text='SIGN IN'
               elevation={1.5}
               elevation={1.5}
               onClick={() => {
               onClick={() => {
                 this.onLogin()
                 this.onLogin()

+ 1 - 1
Strides-APP/app/pages/sign/Register.js

@@ -484,7 +484,7 @@ export default class Register extends React.Component {
               style={styles.signButton}
               style={styles.signButton}
               elevation={1.5}
               elevation={1.5}
               disabled={!this.state.agree}
               disabled={!this.state.agree}
-              text='Sign up'
+              text='SIGN UP'
               fontSize={14}
               fontSize={14}
               onClick={() => {
               onClick={() => {
                 this.onRegister();
                 this.onRegister();

+ 4 - 14
Strides-APP/app/pages/wallet/PaythodList.js

@@ -6,6 +6,7 @@ import React, { Component } from 'react';
 import { View, Text, StyleSheet, Image, Pressable } from 'react-native';
 import { View, Text, StyleSheet, Image, Pressable } from 'react-native';
 import { onChange } from 'react-native-reanimated';
 import { onChange } from 'react-native-reanimated';
 import apiWallet from '../../api/apiWallet';
 import apiWallet from '../../api/apiWallet';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 
 
 export default class PaythodList extends Component {
 export default class PaythodList extends Component {
   constructor(props) {
   constructor(props) {
@@ -80,7 +81,9 @@ export default class PaythodList extends Component {
                     source={require('../../images/user/account-visa.png')}/>
                     source={require('../../images/user/account-visa.png')}/>
                 */}
                 */}
                 <Text style={styles.paytypeText}>{this.getSecuryNumber(item.payName, item.cardPk)}</Text>
                 <Text style={styles.paytypeText}>{this.getSecuryNumber(item.payName, item.cardPk)}</Text>
-                <SelectIcon selected={index == this.state.cIndex}/>
+                <View style={styles.selectIcon}>
+                  <ChargeItemSelect size={18} selected={index == this.state.cIndex}/>
+                </View>
               </Pressable>
               </Pressable>
             );
             );
           })
           })
@@ -90,19 +93,6 @@ export default class PaythodList extends Component {
   }
   }
 }
 }
 
 
-const SelectIcon = ({selected}) => {
-  return (
-    selected ?
-      <Image
-        style={styles.selectIcon}
-        source={require('../../images/charge/charge-item-select.png')}/>
-    : <AntDesign
-        name='checkcircle'
-        size={18}
-        color='#ccc'/>
-  );
-}
-
 const styles = StyleSheet.create({
 const styles = StyleSheet.create({
   paytypeView: {
   paytypeView: {
     padding: 16,
     padding: 16,

+ 4 - 3
Strides-APP/app/utils/constant.js

@@ -89,9 +89,10 @@ global.$vw = percent => {
 };
 };
 
 
 //Theme
 //Theme
-global.colorAccent = '#FFCC2C';
-global.colorPrimary = '#FFCC2C';
-global.colorPrimaryDark = '#FFCC2C';
+global.colorThemes = '#FFFFFF';//#FFFFFF
+global.colorAccent = '#A3C93A';
+global.colorPrimary = '#001489';
+global.colorPrimaryDark = '#FFFFFF';
 
 
 global.$padding = (top, right, bottom, left) => {
 global.$padding = (top, right, bottom, left) => {
   if (top == undefined) {
   if (top == undefined) {

+ 2 - 2
Strides-APP/app/utils/notification.js

@@ -15,7 +15,7 @@ PushNotification.configure({
 
 
     if (notification.title) {
     if (notification.title) {
       //TODO 处理通知
       //TODO 处理通知
-      notification.channelId = "10086";
+      notification.channelId = "10186";
       notification.smallIcon = "ic_notification";
       notification.smallIcon = "ic_notification";
       notification.showWhen = true;
       notification.showWhen = true;
       PushNotification.localNotification(notification);
       PushNotification.localNotification(notification);
@@ -66,7 +66,7 @@ PushNotification.configure({
 
 
 PushNotification.createChannel(
 PushNotification.createChannel(
   {
   {
-    channelId: "10086", // (required)
+    channelId: "10186", // (required)
     channelName: "Juice+ Messaging", // (required)
     channelName: "Juice+ Messaging", // (required)
     channelDescription: "Juice+ notification center, remind of the charging process", // (optional) default: undefined.
     channelDescription: "Juice+ notification center, remind of the charging process", // (optional) default: undefined.
     playSound: false, // (optional) default: true
     playSound: false, // (optional) default: true

+ 1 - 1
Strides-APP/index.js

@@ -17,7 +17,7 @@ import {RootSiblingParent} from 'react-native-root-siblings';
 const Index = () => {
 const Index = () => {
   return (
   return (
     <RootSiblingParent>
     <RootSiblingParent>
-      <StatusBar backgroundColor={colorPrimaryDark}/>
+      <StatusBar barStyle="dark-content" backgroundColor={colorPrimaryDark}/>
       <Router />
       <Router />
       <ModalPortal />
       <ModalPortal />
     </RootSiblingParent>
     </RootSiblingParent>

+ 2 - 2
Strides-APP/ios/JuicePlus.xcodeproj/project.pbxproj

@@ -1517,7 +1517,7 @@
 					"-ObjC",
 					"-ObjC",
 					"-lc++",
 					"-lc++",
 				);
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.evct.juiceplus;
+				PRODUCT_BUNDLE_IDENTIFIER = com.strides.chargeco;
 				PRODUCT_NAME = JuicePlus;
 				PRODUCT_NAME = JuicePlus;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 5.0;
 				SWIFT_VERSION = 5.0;
@@ -1547,7 +1547,7 @@
 					"-ObjC",
 					"-ObjC",
 					"-lc++",
 					"-lc++",
 				);
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.evct.juiceplus;
+				PRODUCT_BUNDLE_IDENTIFIER = com.strides.chargeco;
 				PRODUCT_NAME = JuicePlus;
 				PRODUCT_NAME = JuicePlus;
 				SWIFT_VERSION = 5.0;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";

+ 1 - 1
Strides-APP/ios/JuicePlus/GoogleService-Info.plist

@@ -13,7 +13,7 @@
 	<key>PLIST_VERSION</key>
 	<key>PLIST_VERSION</key>
 	<string>1</string>
 	<string>1</string>
 	<key>BUNDLE_ID</key>
 	<key>BUNDLE_ID</key>
-	<string>com.evct.juiceplus</string>
+	<string>com.strides.chargeco</string>
 	<key>PROJECT_ID</key>
 	<key>PROJECT_ID</key>
 	<string>juiceplus-c5c61</string>
 	<string>juiceplus-c5c61</string>
 	<key>STORAGE_BUCKET</key>
 	<key>STORAGE_BUCKET</key>

+ 379 - 0
Strides-APP/node_modules/react-native/react.gradle

@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import org.apache.tools.ant.taskdefs.condition.Os
+
+def config = project.hasProperty("react") ? project.react : [:];
+
+def detectEntryFile(config) {
+    if (System.getenv('ENTRY_FILE')) {
+        return System.getenv('ENTRY_FILE')
+    } else if (config.entryFile) {
+        return config.entryFile
+    } else if ((new File("${projectDir}/../../index.android.js")).exists()) {
+        return "index.android.js"
+    }
+
+    return "index.js";
+}
+
+/**
+ * Detects CLI location in a similar fashion to the React Native CLI
+ */
+def detectCliPath(config) {
+    if (config.cliPath) {
+        return config.cliPath
+    }
+    if (new File("${projectDir}/../../node_modules/react-native/cli.js").exists()) {
+        return "${projectDir}/../../node_modules/react-native/cli.js"
+    }
+    throw new Exception("Couldn't determine CLI location. " +
+             "Please set `project.ext.react.cliPath` to the path of the react-native cli.js");
+}
+
+def composeSourceMapsPath = config.composeSourceMapsPath ?: "node_modules/react-native/scripts/compose-source-maps.js"
+def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
+def entryFile = detectEntryFile(config)
+def bundleCommand = config.bundleCommand ?: "bundle"
+def reactRoot = file(config.root ?: "../../")
+def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
+def bundleConfig = config.bundleConfig ? "${reactRoot}/${config.bundleConfig}" : null ;
+def enableVmCleanup = config.enableVmCleanup == null ? true : config.enableVmCleanup
+def hermesCommand = config.hermesCommand ?: "../../node_modules/hermes-engine/%OS-BIN%/hermesc"
+
+def reactNativeDevServerPort() {
+    def value = project.getProperties().get("reactNativeDevServerPort")
+    return value != null ? value : "8081"
+}
+
+def reactNativeInspectorProxyPort() {
+    def value = project.getProperties().get("reactNativeInspectorProxyPort")
+    return value != null ? value : reactNativeDevServerPort()
+}
+
+def getHermesOSBin() {
+    if (Os.isFamily(Os.FAMILY_WINDOWS)) return "win64-bin";
+    if (Os.isFamily(Os.FAMILY_MAC)) return "osx-bin";
+    if (Os.isOs(null, "linux", "amd64", null)) return "linux64-bin";
+    throw new Exception("OS not recognized. Please set project.ext.react.hermesCommand " +
+                        "to the path of a working Hermes compiler.");
+}
+
+// Make sure not to inspect the Hermes config unless we need it,
+// to avoid breaking any JSC-only setups.
+def getHermesCommand = {
+    // If the project specifies a Hermes command, don't second guess it.
+    if (!hermesCommand.contains("%OS-BIN%")) {
+        return hermesCommand
+    }
+
+    // Execution on Windows fails with / as separator
+    return hermesCommand
+            .replaceAll("%OS-BIN%", getHermesOSBin())
+            .replace('/' as char, File.separatorChar);
+}
+
+// Set enableHermesForVariant to a function to configure per variant,
+// or set `enableHermes` to True/False to set all of them
+def enableHermesForVariant = config.enableHermesForVariant ?: {
+    def variant -> config.enableHermes ?: false
+}
+
+android {
+    buildTypes.all {
+        resValue "integer", "react_native_dev_server_port", reactNativeDevServerPort()
+        resValue "integer", "react_native_inspector_proxy_port", reactNativeInspectorProxyPort()
+    }
+}
+
+afterEvaluate {
+    def isAndroidLibrary = plugins.hasPlugin("com.android.library")
+    def variants = isAndroidLibrary ? android.libraryVariants : android.applicationVariants
+    variants.all { def variant ->
+        // Create variant and target names
+        def targetName = variant.name.capitalize()
+        def targetPath = variant.dirName
+
+        // React js bundle directories
+        def jsBundleDir = file("$buildDir/generated/assets/react/${targetPath}")
+        def resourcesDir = file("$buildDir/generated/res/react/${targetPath}")
+
+        def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
+        def jsSourceMapsDir = file("$buildDir/generated/sourcemaps/react/${targetPath}")
+        def jsIntermediateSourceMapsDir = file("$buildDir/intermediates/sourcemaps/react/${targetPath}")
+        def jsPackagerSourceMapFile = file("$jsIntermediateSourceMapsDir/${bundleAssetName}.packager.map")
+        def jsCompilerSourceMapFile = file("$jsIntermediateSourceMapsDir/${bundleAssetName}.compiler.map")
+        def jsOutputSourceMapFile = file("$jsSourceMapsDir/${bundleAssetName}.map")
+
+        // Additional node and packager commandline arguments
+        def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
+        def cliPath = detectCliPath(config)
+
+        def execCommand = []
+
+        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+            execCommand.addAll(["cmd", "/c", *nodeExecutableAndArgs, cliPath])
+        } else {
+            execCommand.addAll([*nodeExecutableAndArgs, cliPath])
+        }
+
+        def enableHermes = enableHermesForVariant(variant)
+
+        def currentBundleTask = tasks.create(
+            name: "bundle${targetName}JsAndAssets",
+            type: Exec) {
+            group = "react"
+            description = "bundle JS and assets for ${targetName}."
+
+            // Create dirs if they are not there (e.g. the "clean" task just ran)
+            doFirst {
+                jsBundleDir.deleteDir()
+                jsBundleDir.mkdirs()
+                resourcesDir.deleteDir()
+                resourcesDir.mkdirs()
+                jsIntermediateSourceMapsDir.deleteDir()
+                jsIntermediateSourceMapsDir.mkdirs()
+                jsSourceMapsDir.deleteDir()
+                jsSourceMapsDir.mkdirs()
+            }
+
+            // Set up inputs and outputs so gradle can cache the result
+            inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
+            outputs.dir(jsBundleDir)
+            outputs.dir(resourcesDir)
+
+            // Set up the call to the react-native cli
+            workingDir(reactRoot)
+
+            // Set up dev mode
+            def devEnabled = !(config."devDisabledIn${targetName}"
+                || targetName.toLowerCase().contains("release"))
+
+            def extraArgs = []
+
+            if (bundleConfig) {
+                extraArgs.add("--config")
+                extraArgs.add(bundleConfig)
+            }
+
+            // Hermes doesn't require JS minification.
+            if (enableHermes && !devEnabled) {
+                extraArgs.add("--minify")
+                extraArgs.add("false")
+            }
+
+            if (config.extraPackagerArgs) {
+                extraArgs.addAll(config.extraPackagerArgs)
+            }
+
+            commandLine(*execCommand, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
+                "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir,
+                "--sourcemap-output", enableHermes ? jsPackagerSourceMapFile : jsOutputSourceMapFile, *extraArgs)
+
+
+            if (enableHermes) {
+                doLast {
+                    def hermesFlags;
+                    def hbcTempFile = file("${jsBundleFile}.hbc")
+                    exec {
+                        if (targetName.toLowerCase().contains("release")) {
+                            // Can't use ?: since that will also substitute valid empty lists
+                            hermesFlags = config.hermesFlagsRelease
+                            if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
+                        } else {
+                            hermesFlags = config.hermesFlagsDebug
+                            if (hermesFlags == null) hermesFlags = []
+                        }
+
+                        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+                            commandLine("cmd", "/c", getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
+                        } else {
+                            commandLine(getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
+                        }
+                    }
+                    ant.move(
+                        file: hbcTempFile,
+                        toFile: jsBundleFile
+                    );
+                    if (hermesFlags.contains("-output-source-map")) {
+                        ant.move(
+                            // Hermes will generate a source map with this exact name
+                            file: "${jsBundleFile}.hbc.map",
+                            tofile: jsCompilerSourceMapFile
+                        );
+                        exec {
+                            // TODO: set task dependencies for caching
+
+                            // Set up the call to the compose-source-maps script
+                            workingDir(reactRoot)
+                            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+                                commandLine("cmd", "/c", *nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
+                            } else {
+                                commandLine(*nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
+                            }
+                        }
+                    }
+                }
+            }
+
+            enabled config."bundleIn${targetName}" != null
+                ? config."bundleIn${targetName}"
+                : config."bundleIn${variant.buildType.name.capitalize()}" != null
+                    ? config."bundleIn${variant.buildType.name.capitalize()}"
+                    : targetName.toLowerCase().contains("release")
+        }
+
+        // Expose a minimal interface on the application variant and the task itself:
+        variant.ext.bundleJsAndAssets = currentBundleTask
+        currentBundleTask.ext.generatedResFolders = files(resourcesDir).builtBy(currentBundleTask)
+        currentBundleTask.ext.generatedAssetsFolders = files(jsBundleDir).builtBy(currentBundleTask)
+
+        // registerGeneratedResFolders for Android plugin 3.x
+        if (variant.respondsTo("registerGeneratedResFolders")) {
+            variant.registerGeneratedResFolders(currentBundleTask.generatedResFolders)
+        } else {
+            variant.registerResGeneratingTask(currentBundleTask)
+        }
+        variant.mergeResourcesProvider.get().dependsOn(currentBundleTask)
+
+        // packageApplication for Android plugin 3.x
+        def packageTask = variant.hasProperty("packageApplication")
+            ? variant.packageApplicationProvider.get()
+            : tasks.findByName("package${targetName}")
+        if (variant.hasProperty("packageLibrary")) {
+            packageTask = variant.packageLibrary
+        }
+
+        // pre bundle build task for Android plugin 3.2+
+        def buildPreBundleTask = tasks.findByName("build${targetName}PreBundle")
+
+        def resourcesDirConfigValue = config."resourcesDir${targetName}"
+        if (resourcesDirConfigValue) {
+            def currentCopyResTask = tasks.create(
+                name: "copy${targetName}BundledResources",
+                type: Copy) {
+                group = "react"
+                description = "copy bundled resources into custom location for ${targetName}."
+
+                from(resourcesDir)
+                into(file(resourcesDirConfigValue))
+
+                dependsOn(currentBundleTask)
+
+                enabled(currentBundleTask.enabled)
+            }
+
+            packageTask.dependsOn(currentCopyResTask)
+            if (buildPreBundleTask != null) {
+                buildPreBundleTask.dependsOn(currentCopyResTask)
+            }
+        }
+
+        def currentAssetsCopyTask = tasks.create(
+            name: "copy${targetName}BundledJs",
+            type: Copy) {
+            group = "react"
+            description = "copy bundled JS into ${targetName}."
+
+            if (config."jsBundleDir${targetName}") {
+                from(jsBundleDir)
+                into(file(config."jsBundleDir${targetName}"))
+            } else {
+                into ("$buildDir/intermediates")
+                if (isAndroidLibrary) {
+                    into ("library_assets/${variant.name}/out") {
+                        from(jsBundleDir)
+                    }
+                } else {
+                    into ("assets/${targetPath}") {
+                        from(jsBundleDir)
+                    }
+
+                    // Workaround for Android Gradle Plugin 3.2+ new asset directory
+                    into ("merged_assets/${variant.name}/merge${targetName}Assets/out") {
+                        from(jsBundleDir)
+                    }
+
+                    // Workaround for Android Gradle Plugin 3.4+ new asset directory
+                    into ("merged_assets/${variant.name}/out") {
+                        from(jsBundleDir)
+                    }
+                }
+            }
+
+            // mergeAssets must run first, as it clears the intermediates directory
+            dependsOn(variant.mergeAssetsProvider.get())
+
+            enabled(currentBundleTask.enabled)
+            dependsOn(currentBundleTask)
+        }
+
+        // mergeResources task runs before the bundle file is copied to the intermediate asset directory from Android plugin 4.1+.
+        // This ensures to copy the bundle file before mergeResources task starts
+        def mergeResourcesTask = tasks.findByName("merge${targetName}Resources")
+        mergeResourcesTask.dependsOn(currentAssetsCopyTask)
+
+        packageTask.dependsOn(currentAssetsCopyTask)
+        if (buildPreBundleTask != null) {
+            buildPreBundleTask.dependsOn(currentAssetsCopyTask)
+        }
+
+        // Delete the VM related libraries that this build doesn't need.
+        // The application can manage this manually by setting 'enableVmCleanup: false'
+        //
+        // This should really be done by packaging all Hermes related libs into
+        // two separate HermesDebug and HermesRelease AARs, but until then we'll
+        // kludge it by deleting the .so files out of the /transforms/ directory.
+        def isRelease = targetName.toLowerCase().contains("release")
+        def libDir = "$buildDir/intermediates/transforms/"
+        def vmSelectionAction = {
+            fileTree(libDir).matching {
+                if (enableHermes) {
+                    // For Hermes, delete all the libjsc* files
+                    include "**/libjsc*.so"
+
+                    if (isRelease) {
+                        // Reduce size by deleting the debugger/inspector
+                        include '**/libhermes-inspector.so'
+                        include '**/libhermes-executor-debug.so'
+                    } else {
+                        // Release libs take precedence and must be removed
+                        // to allow debugging
+                        include '**/libhermes-executor-release.so'
+                    }
+                } else {
+                    // For JSC, delete all the libhermes* files
+                    include "**/libhermes*.so"
+                }
+            }.visit { details ->
+                def targetVariant = ".*/transforms/[^/]*/${targetPath}/.*"
+                def path = details.file.getAbsolutePath().replace(File.separatorChar, '/' as char)
+                if (path.matches(targetVariant) && details.file.isFile()) {
+                    details.file.delete()
+                }
+            }
+        }
+
+        if (enableVmCleanup) {
+            packageTask.doFirst(vmSelectionAction)
+        }
+    }
+}
+
+// Patch needed for https://github.com/facebook/react-native/issues/35210
+// This is a patch to short-circuit the "+" dependencies inside the
+// users' app/build.gradle file and the various .gradle files of libraries.
+// As using plain "+" dependencies causes Gradle to always download the latest,
+// this logic forces Gradle to use latest release in the minor series.
+project.rootProject.allprojects {
+    configurations.all {
+        resolutionStrategy {
+            force "com.facebook.react:react-native:0.64.+"
+            force "com.facebook.react:hermes-engine:0.64.+"
+        }
+    }
+}

+ 1 - 2
Strides-APP/package.json

@@ -52,11 +52,10 @@
     "react-native-screens": "^3.1.1",
     "react-native-screens": "^3.1.1",
     "react-native-share": "^6.1.0",
     "react-native-share": "^6.1.0",
     "react-native-svg": "^12.1.1",
     "react-native-svg": "^12.1.1",
-    "react-native-vector-icons": "^8.1.0",
+    "react-native-vector-icons": "^9.2.0",
     "react-native-view-shot": "^3.1.2",
     "react-native-view-shot": "^3.1.2",
     "react-native-webview": "^11.6.4",
     "react-native-webview": "^11.6.4",
     "supercluster": "^7.1.3",
     "supercluster": "^7.1.3",
-    "vbe-cluster-map": "^1.0",
     "victory-native": "^35.3.3"
     "victory-native": "^35.3.3"
   },
   },
   "devDependencies": {
   "devDependencies": {