vbea 3 年 前
コミット
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(
     name = "build_config",
-    package = "com.evct.juiceplus",
+    package = "com.strides.chargeco",
 )
 
 android_resource(
     name = "res",
-    package = "com.evct.juiceplus",
+    package = "com.strides.chargeco",
     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
 
-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
  * and bundleReleaseJsAndAssets).
@@ -152,7 +152,7 @@ android {
     }
 
     defaultConfig {
-        applicationId "com.evct.juiceplus"
+        applicationId "com.strides.chargeco"
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
         versionCode getMyVersionCode()

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

@@ -1,15 +1,15 @@
 {
   "project_info": {
     "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_info": {
         "mobilesdk_app_id": "1:948303787961:android:c732f8811a2a248f9aa868",
         "android_client_info": {
-          "package_name": "com.evct.juiceplus"
+          "package_name": "com.strides.chargeco"
         }
       },
       "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,
         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
             .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
             .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"?>
 <resources>
   <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>

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

@@ -1,4 +1,4 @@
 <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>

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

@@ -6,7 +6,10 @@
         <item name="android:textColor">#000000</item>
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimary</item>
+        <item name="colorPrimaryVariant">@color/colorPrimary</item>
         <item name="colorAccent">@color/colorAccent</item>
+        <item name="colorOnPrimary">@color/black</item>
+        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
     </style>
 
 </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",
-  "displayName": "Strides",
+  "displayName": "ChargEco",
   "versionCode": 10,
-  "versionName": "V0.0.1",
+  "versionName": "V0.0.1 Alpha",
   "product": false,
   "debug": true
 }

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

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

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

@@ -45,7 +45,7 @@ export const Styles = StyleSheet.create({
     alignItems: 'center',
     flexDirection: 'row',
     justifyContent: 'center',
-    backgroundColor: colorPrimary
+    backgroundColor: colorThemes
   },
   backIcon: {
     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 app from '../../app.json';
 
-const author = 2021;
+const author = 2022;
 
 export default About = () => {
   return (
     <View style={styles.container}>
       <Image
         style={styles.logo}
+        resizeMode='contain'
         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.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>
   );
 }
@@ -37,8 +38,8 @@ const styles = StyleSheet.create({
     backgroundColor: '#FFF'
   },
   logo: {
-    width: 96,
-    height: 96,
+    width: 238,
+    height: 75,
     marginTop: $vw(25)
   },
   appName: {

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

@@ -43,8 +43,9 @@ class Launch extends React.Component {
             <View style={styles.content}>
               <Image
                 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 style={styles.loaded}></View>
@@ -57,12 +58,12 @@ export default Launch
 const styles = StyleSheet.create({
   container: {
     alignItems: 'center',
-    backgroundColor: colorPrimary,
+    backgroundColor: colorThemes,
     ...StyleSheet.absoluteFillObject
   },
   iosContent: {
     flex: 1,
-    backgroundColor: colorPrimary
+    backgroundColor: colorThemes
   },
   loaded: {
     flex: 1,
@@ -73,9 +74,9 @@ const styles = StyleSheet.create({
     paddingTop: $vh(30)
   },
   logo: {
-    width:165.09,
-    height: 51.94,
-    marginLeft: 10,
+    width: 190.67,
+    height: 60,
+    marginLeft: 0,
     //top: $vh(25),
     //bottom: $vh(25),
     //position: 'absolute'

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

@@ -240,7 +240,7 @@ const Title = (title, opt = {}) => {
     headerStyle: {
       ...titleHeight(),
       elevation: 0,
-      backgroundColor: colorPrimary
+      backgroundColor: colorThemes
     },
     headerTintColor: '#232323',
     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 Modal from 'react-native-modal';
 import { ModalProps } from '../../components/BottomModal';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { DialogMaxWidth } from './InfoDialog';
 import { QRResult } from './QRScan';
 
@@ -403,9 +404,9 @@ export const SelectableIcon = ({selected, children}) => {
   return (
     <View style={styles.selectView}>
       {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}
     </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 {check, request, openSettings, PERMISSIONS, RESULTS} from 'react-native-permissions';
 import apiStation from '../../api/apiStation';
+import Button from '../../components/Button';
 import Dialog from '../../components/Dialog';
 import { Styles } from '../../components/Toolbar';
 import utils from '../../utils/utils';
@@ -13,6 +14,7 @@ import { PageList } from '../Router';
 import { SettingUtil } from '../Settings';
 import Maps from './maps/Maps';
 import MapTool from './maps/MapTool';
+import SearchTool from './maps/SearchTool';
 import TopInfo from './maps/TopInfo';
 
 export default class HomePage extends Component {
@@ -287,30 +289,34 @@ export default class HomePage extends Component {
             onPress={() => {
               this.props.navigation.toggleDrawer();
             }}>
-            <EvilIcons name={'navicon'} size={28} color={'#333333'} />
+            <EvilIcons name={'navicon'} size={28} color={colorPrimary} />
           </Pressable>
-          <View style={Styles.content}>
+          <View style={styles.logoView}>
             <Image
               source={require('../../images/tool-logo.png')}
               style={Styles.logo}
             />
           </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 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}>
           { this.state.hasPermission &&
             <Maps.Maps3
@@ -327,12 +333,6 @@ export default class HomePage extends Component {
             />
           }
           <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 style={styles.drawerLeftTouchView}></View>
       </View>
@@ -341,16 +341,28 @@ export default class HomePage extends Component {
 }
 
 const styles = StyleSheet.create({
+  logoView: {
+    top: 0,
+    left: 0,
+    right: 0,
+    bottom: 0,
+    alignItems: 'center',
+    position: 'absolute',
+    justifyContent: 'center'
+  },
   searchView: {
     ...$padding(8, 16, 16),
-    backgroundColor: colorAccent
+    backgroundColor: colorThemes
   },
   searchInput: {
-    paddingLeft: 16,
-    paddingRight: 16,
-    borderRadius: 60,
     alignItems: 'center',
+    borderWidth: 1,
+    borderStyle: 'solid',
+    borderRadius: 60,
+    borderColor: colorAccent,
     flexDirection: 'row',
+    paddingLeft: 16,
+    paddingRight: 16,
     backgroundColor: 'rgba(255, 255, 255, 0.5)'
   },
   searchText: {

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

@@ -53,7 +53,7 @@ export default class Notify extends Component {
   localNotification() {
     PushNotification.localNotification({
       /* 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
       autoCancel: true, // (optional) default: true
       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 apiUser from '../../api/apiUser';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { TypeImageList } from '../charge/Charging';
 
 export default class AddVehicle extends Component {
@@ -103,9 +104,9 @@ export default class AddVehicle extends Component {
                       source={item.icon}/>
                     <Text style={styles.typeName}>{item.name}</Text>
                     { 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>
                 )

+ 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 apiUser from '../../api/apiUser';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { TypeImageList } from '../charge/Charging';
 import { VehicleStyles } from './AddVehicle';
 
@@ -169,9 +170,9 @@ export default class EditVehicle extends Component {
                         source={item.icon}/>
                       <Text style={styles.typeName}>{item.name}</Text>
                       { 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>
                   )

+ 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 Dialog from '../../components/Dialog';
 import { StationBack } from '../../components/Toolbar';
+import ProfileBackground from '../../icons/ProfileBackground';
 import utils from '../../utils/utils';
 import { PageList } from '../Router';
 import { CardList } from '../wallet/CardList';
@@ -118,9 +119,12 @@ export default class Profile extends Component {
       <ScrollView style={styles.container}>
         {/* Profile Info */}
         <View style={styles.headerView}>
-          <Image
+          <View style={styles.background}>
+            <ProfileBackground/>
+          </View>
+          {/* <Image
             style={styles.background}
-            source={require('../../images/user/bg-profile.png')}/>
+            source={require('../../images/user/bg-profile.svg')}/> */}
           <Pressable
             style={styles.profileView}
             onPress={() => {
@@ -284,10 +288,10 @@ const styles = StyleSheet.create({
   },
   background: {
     left: 0,
+    right: 0,
     bottom: 0,
-    width: $vw(100),
     height: $vw(62.4),
-    resizeMode: "cover",
+    alignItems: 'center',
     position: 'absolute'
   },
   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 Button from '../../components/Button';
 import Dialog from '../../components/Dialog';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 import { PageList } from '../Router';
 import { PAYTYPE } from '../wallet/Payment';
 import { WalletTitle } from '../wallet/Topup';
@@ -190,15 +191,9 @@ export default class PaymentMethod extends Component {
                     {item.title} {' '}
                     {item.desc ? item.desc : '(Balance '+currency+userInfo.credit+')'}
                   </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>
               );
             })

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

@@ -206,7 +206,7 @@ export default class Login extends React.Component {
             </View>
             <Button
               style={styles.loginButton}
-              text='Sign in'
+              text='SIGN IN'
               elevation={1.5}
               onClick={() => {
                 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}
               elevation={1.5}
               disabled={!this.state.agree}
-              text='Sign up'
+              text='SIGN UP'
               fontSize={14}
               onClick={() => {
                 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 { onChange } from 'react-native-reanimated';
 import apiWallet from '../../api/apiWallet';
+import ChargeItemSelect from '../../icons/ChargeItemSelect';
 
 export default class PaythodList extends Component {
   constructor(props) {
@@ -80,7 +81,9 @@ export default class PaythodList extends Component {
                     source={require('../../images/user/account-visa.png')}/>
                 */}
                 <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>
             );
           })
@@ -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({
   paytypeView: {
     padding: 16,

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

@@ -89,9 +89,10 @@ global.$vw = percent => {
 };
 
 //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) => {
   if (top == undefined) {

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

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

+ 1 - 1
Strides-APP/index.js

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

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

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

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

@@ -13,7 +13,7 @@
 	<key>PLIST_VERSION</key>
 	<string>1</string>
 	<key>BUNDLE_ID</key>
-	<string>com.evct.juiceplus</string>
+	<string>com.strides.chargeco</string>
 	<key>PROJECT_ID</key>
 	<string>juiceplus-c5c61</string>
 	<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-share": "^6.1.0",
     "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-webview": "^11.6.4",
     "supercluster": "^7.1.3",
-    "vbe-cluster-map": "^1.0",
     "victory-native": "^35.3.3"
   },
   "devDependencies": {