first commit

This commit is contained in:
Philip Cheung 2024-02-28 13:34:06 +08:00
commit a0b86a3452
150 changed files with 65234 additions and 0 deletions

6
.buckconfig Normal file
View File

@ -0,0 +1,6 @@
[android]
target = Google Inc.:Google APIs:23
[maven_repositories]
central = https://repo1.maven.org/maven2

4
.eslintrc.js Normal file
View File

@ -0,0 +1,4 @@
module.exports = {
root: true,
extends: '@react-native-community',
};

65
.flowconfig Normal file
View File

@ -0,0 +1,65 @@
[ignore]
; We fork some components by platform
.*/*[.]android.js
; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/
; Ignore polyfills
node_modules/react-native/Libraries/polyfills/.*
; Flow doesn't support platforms
.*/Libraries/Utilities/LoadingView.js
[untyped]
.*/node_modules/@react-native-community/cli/.*/.*
[include]
[libs]
node_modules/react-native/interface.js
node_modules/react-native/flow/
[options]
emoji=true
exact_by_default=true
format.bracket_spacing=false
module.file_ext=.js
module.file_ext=.json
module.file_ext=.ios.js
munge_underscores=true
module.name_mapper='^react-native/\(.*\)$' -> '<PROJECT_ROOT>/node_modules/react-native/\1'
module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '<PROJECT_ROOT>/node_modules/react-native/Libraries/Image/RelativeImageStub'
suppress_type=$FlowIssue
suppress_type=$FlowFixMe
suppress_type=$FlowFixMeProps
suppress_type=$FlowFixMeState
[lints]
sketchy-null-number=warn
sketchy-null-mixed=warn
sketchy-number=warn
untyped-type-import=warn
nonstrict-import=warn
deprecated-type=warn
unsafe-getters-setters=warn
unnecessary-invariant=warn
signature-verification-failure=warn
[strict]
deprecated-type
nonstrict-import
sketchy-null
unclear-type
unsafe-getters-setters
untyped-import
untyped-type-import
[version]
^0.158.0

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
*.pbxproj -text

59
.gitignore vendored Normal file
View File

@ -0,0 +1,59 @@
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots
# Bundle artifact
*.jsbundle
# CocoaPods
/ios/Pods/

6
.prettierrc.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
bracketSpacing: false,
jsxBracketSameLine: true,
singleQuote: true,
trailingComma: 'all',
};

1
.watchmanconfig Normal file
View File

@ -0,0 +1 @@
{}

162
App.js Normal file
View File

@ -0,0 +1,162 @@
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow strict-local
*/
import React, { useEffect } from 'react';
import moment from 'moment';
import messaging from '@react-native-firebase/messaging';
import AsyncStorage from '@react-native-community/async-storage';
import { StyleSheet, ScrollView, View, Text, StatusBar } from 'react-native';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { colors } from './src/assets/styles/colors-theme';
import Router from './router';
import { Provider } from 'mobx-react';
import { ModalPortal } from 'react-native-modals';
import Store from './src/stores/index';
import { NavigationContainer, useFocusEffect } from '@react-navigation/native';
import { createStackNavigator, HeaderBackButton } from '@react-navigation/stack';
import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import {
Header,
LearnMoreLinks,
Colors,
DebugInstructions,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
import Icon from 'react-native-vector-icons/dist/MaterialCommunityIcons';
import SplashScreen from './src/pages/splash/splashScreen';
import Main from './src/pages/main/main';
import buyHistory from './src/pages/buyHistory/buyHistory';
import Favorite from './src/pages/favorite/favorite';
import Profile from './src/pages/profile/profile';
import BuyHistory from './src/pages/buyHistory/buyHistory';
Icon.loadFont();
console.disableYellowBox = true;
const Stack = createStackNavigator();
const BottomTab = createBottomTabNavigator();
const BottomTabScreen = () => (
<BottomTab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {
let iconName;
switch (route.name) {
case 'Main':
iconName = 'home-variant';
break;
case 'BuyHistory':
iconName = 'cart';
break;
case 'Favorite':
iconName = 'heart';
break;
case 'Profile':
iconName = 'account-circle';
break;
}
return (
<Icon
name={iconName}
size={size}
color={color}
style={{ marginTop: 5 }}
/>
);
},
})}
tabBarOptions={{
activeTintColor: 'tomato',
inactiveTintColor: 'gray',
}}>
<Stack.Screen
name="Main"
component={Main}
options={{ tabBarLabel: '主頁' }}
/>
<Stack.Screen
name="Favorite"
component={Favorite}
options={{ tabBarLabel: '我的清單' }}
/>
<Stack.Screen
name="BuyHistory"
component={BuyHistory}
options={{ tabBarLabel: '購買記錄' }}
/>
<Stack.Screen
name="Profile"
component={Profile}
options={{ tabBarLabel: '賬號/設定' }}
/>
</BottomTab.Navigator>
);
const App: () => React$Node = () => {
return (
<>
<Provider {...Store}>
<SafeAreaProvider>
<StatusBar
animated={true}
barStyle={'default'}
backgroundColor={'white'}
translucent={true}
/>
<NavigationContainer
onStateChange={state => Store.appStore.setRouterState(state)}
ref={navigatorRef => Store.appStore.setRouterRef(navigatorRef)}>
<Router />
</NavigationContainer>
<ModalPortal />
</SafeAreaProvider>
</Provider>
</>
);
};
const styles = StyleSheet.create({
scrollView: {
backgroundColor: Colors.lighter,
},
engine: {
position: 'absolute',
right: 0,
},
body: {
backgroundColor: colors.bgc,
},
sectionContainer: {
marginTop: 32,
paddingHorizontal: 24,
},
sectionTitle: {
fontSize: 24,
fontWeight: '600',
color: Colors.black,
},
sectionDescription: {
marginTop: 8,
fontSize: 18,
fontWeight: '400',
color: Colors.dark,
},
highlight: {
fontWeight: '700',
},
footer: {
color: Colors.dark,
fontSize: 12,
fontWeight: '600',
padding: 4,
paddingRight: 12,
textAlign: 'right',
},
});
export default App;

170
MyTabBar.js Normal file
View File

@ -0,0 +1,170 @@
import React from 'react';
import {
SafeAreaView,
Text,
View,
TouchableOpacity,
Image,
TextInput,
Keyboard,
} from 'react-native';
import { inject, observer } from 'mobx-react';
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
import Toast, { DURATION } from 'react-native-easy-toast';
import Icon from 'react-native-vector-icons/dist/MaterialCommunityIcons';
import { observable } from 'mobx';
import { colors } from './src/assets/styles/colors-theme';
import { s, vs, ms } from 'react-native-size-matters';
import DeviceInfo from 'react-native-device-info';
Icon.loadFont();
@inject('appStore')
@observer
export default class MyTabBar extends React.Component {
constructor(props) {
super(props);
this.store = props.appStore;
}
langLabelReturn(label) {
switch (label) {
case 'main':
return this.store.text.main;
break;
case 'myfavourite':
return this.store.text.myfavourite;
break;
case 'ShoppingCart':
return this.store.text.shoppingcart;
break;
case 'shoppingHistory':
return this.store.text.shoppingHistory;
break;
case 'acAndSetting':
return this.store.text.acAndSetting;
break;
}
}
render() {
var { state, descriptors, navigation, logined } = this.props;
return (
<View style={{ flexDirection: 'row', backgroundColor: 'white' }}>
{state.routes.map((route, index) => {
const { options } = descriptors[route.key];
const label =
options.tabBarLabel !== undefined
? options.tabBarLabel
: options.title !== undefined
? options.title
: route.name;
let iconName;
switch (route.name) {
case 'Main':
iconName = 'home-outline';
break;
case 'BuyHistory':
iconName = 'history';
break;
case 'ShoppingCart':
iconName = 'shopping-outline';
break;
case 'Favorite':
iconName = 'heart-outline';
break;
case 'Profile':
iconName = 'account-outline';
break;
}
const isFocused = state.index === index;
const onPress = () => {
const event = navigation.emit({
type: 'tabPress',
target: route.key,
});
if (!isFocused && !event.defaultPrevented) {
this.store.catalogueSelected = null;
console.log(route.name);
if (route.name == 'Profile' && !this.store.logined) {
navigation.navigate('Signin');
} else if (route.name == 'Favorite' && !this.store.logined) {
navigation.navigate('Signin');
} else if (route.name == 'BuyHistory' && !this.store.logined) {
navigation.navigate('Signin');
} else {
navigation.navigate(route.name);
}
} else if (isFocused && route.name == 'Main') {
this.store.catalogueSelected = null;
}
};
const onLongPress = () => {
navigation.emit({
type: 'tabLongPress',
target: route.key,
});
};
return (
<TouchableOpacity
accessibilityRole="button"
accessibilityStates={isFocused ? ['selected'] : []}
accessibilityLabel={options.tabBarAccessibilityLabel}
testID={options.tabBarTestID}
onPress={onPress}
onLongPress={onLongPress}
style={{
flex: 1,
alignItems: 'center',
justifyContent: 'center',
marginTop: 5,
marginBottom: 5,
}}>
<Icon
name={iconName}
size={28}
color={isFocused ? colors.mainColor : 'black'}
/>
<Text
style={{
color: isFocused ? colors.mainColor : 'black',
fontSize: 12,
}}>
{this.langLabelReturn(label)}
</Text>
{label == 'ShoppingCart' ? (
<View
style={{
justifyContent: 'center',
alignItems: 'center',
position: 'absolute',
right: DeviceInfo.isTablet() ? s(30) : s(24),
}}>
<Icon name="circle" color={colors.mainColor} size={18} />
<Text
style={{
position: 'absolute',
top: 4,
fontSize: 8,
color: 'white',
}}>
{this.store.shoppingCartList.length}
</Text>
</View>
) : (
<View />
)}
</TouchableOpacity>
);
})}
</View>
);
}
}

95
README.md Normal file
View File

@ -0,0 +1,95 @@
## Pure Mall
## Description
The mobile application is an online shopping platform that offers various features such as coupons, online payment, notifications, group shopping formation, group shopping discounts, monthly sales targets with shopping incentives, point rewards, and the ability for teams to use their exclusive points to redeem gifts. users can also check the shopping records of other members in their shopping group.
### Screenshot
<img src="./src/assets/screenshot/1.png" width="20%" height="20%">
<img src="./src/assets/screenshot/2.png" width="20%" height="20%">
<img src="./src/assets/screenshot/3.png" width="20%" height="20%">
<img src="./src/assets/screenshot/4.png" width="20%" height="20%">
<img src="./src/assets/screenshot/5.png" width="20%" height="20%">
<img src="./src/assets/screenshot/6.png" width="20%" height="20%">
<img src="./src/assets/screenshot/7.png" width="20%" height="20%">
<img src="./src/assets/screenshot/banner.png" >
This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli).
# Getting Started
>**Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding.
## Step 1: Start the Metro Server
First, you will need to start **Metro**, the JavaScript _bundler_ that ships _with_ React Native.
To start Metro, run the following command from the _root_ of your React Native project:
```bash
# using npm
npm start
# OR using Yarn
yarn start
```
## Step 2: Start your Application
Let Metro Bundler run in its _own_ terminal. Open a _new_ terminal from the _root_ of your React Native project. Run the following command to start your _Android_ or _iOS_ app:
### For Android
```bash
# using npm
npm run android
# OR using Yarn
yarn android
```
### For iOS
```bash
# using npm
npm run ios
# OR using Yarn
yarn ios
```
If everything is set up _correctly_, you should see your new app running in your _Android Emulator_ or _iOS Simulator_ shortly provided you have set up your emulator/simulator correctly.
This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively.
## Step 3: Modifying your App
Now that you have successfully run the app, let's modify it.
1. Open `App.tsx` in your text editor of choice and edit some lines.
2. For **Android**: Press the <kbd>R</kbd> key twice or select **"Reload"** from the **Developer Menu** (<kbd>Ctrl</kbd> + <kbd>M</kbd> (on Window and Linux) or <kbd>Cmd ⌘</kbd> + <kbd>M</kbd> (on macOS)) to see your changes!
For **iOS**: Hit <kbd>Cmd ⌘</kbd> + <kbd>R</kbd> in your iOS Simulator to reload the app and see your changes!
## Congratulations! :tada:
You've successfully run and modified your React Native App. :partying_face:
### Now what?
- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps).
- If you're curious to learn more about React Native, check out the [Introduction to React Native](https://reactnative.dev/docs/getting-started).
# Troubleshooting
If you can't get this to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page.
# Learn More
To learn more about React Native, take a look at the following resources:
- [React Native Website](https://reactnative.dev) - learn more about React Native.
- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment.
- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**.
- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts.
- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native.

14
__tests__/App-test.js Normal file
View File

@ -0,0 +1,14 @@
/**
* @format
*/
import 'react-native';
import React from 'react';
import App from '../App';
// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';
it('renders correctly', () => {
renderer.create(<App />);
});

4
app.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "puremall",
"displayName": "puremall"
}

3
appVersion.js Normal file
View File

@ -0,0 +1,3 @@
export default {
version: '1.0',
};

8
babel.config.js Normal file
View File

@ -0,0 +1,8 @@
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
['@babel/plugin-transform-flow-strip-types'],
['@babel/plugin-proposal-decorators', {legacy: true}],
['@babel/plugin-proposal-class-properties', {loose: true}],
],
};

67
index.js Normal file
View File

@ -0,0 +1,67 @@
/**
* @format
*/
import React from 'react';
import { AppRegistry, Platform } from 'react-native';
import App from './App';
import { name as appName } from './app.json';
import codePush from 'react-native-code-push';
import moment from 'moment';
import messaging from '@react-native-firebase/messaging';
import AsyncStorage from '@react-native-community/async-storage';
var CheckisHeadless = true
messaging().setBackgroundMessageHandler(async remoteMessage => {
var notificationRecord = {
notifications: [],
unread: 0,
}
const data = {
id: remoteMessage.messageId,
date: moment().valueOf(),
title: remoteMessage.notification.title,
message: remoteMessage.notification.body,
read: false,
}
console.log(data)
try {
const jsonValue = await AsyncStorage.getItem('notification')
if (jsonValue != null) {
notificationRecord = JSON.parse(jsonValue)
}
console.log(notificationRecord)
} catch (e) {
console.log(e)
}
await notificationRecord.notifications.push(data);
notificationRecord.unread += 1;
console.log(notificationRecord)
try {
const saveItem = JSON.stringify(notificationRecord)
await AsyncStorage.setItem('notification', saveItem)
} catch (e) {
console.log(e)
}
});
function HeadlessCheck({ isHeadless }) {
console.log(isHeadless)
if (isHeadless) {
// App has been launched in the background by iOS, ignore
return null;
}
return <App />
}
// HeadlessCheck()=> {
// return codePush(App);
// }
function RealApp() {
return codePush(App);
}
AppRegistry.registerComponent(appName, () => RealApp());

17
metro.config copy.js Normal file
View File

@ -0,0 +1,17 @@
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

17
metro.config.js Normal file
View File

@ -0,0 +1,17 @@
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

32562
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

95
package.json Normal file
View File

@ -0,0 +1,95 @@
{
"name": "puremall",
"version": "0.0.1",
"private": true,
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"start": "react-native start",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"@babel/plugin-proposal-decorators": "^7.12.1",
"@invertase/react-native-apple-authentication": "^2.1.2",
"@react-native-community/async-storage": "^1.12.1",
"@react-native-community/datetimepicker": "^3.5.2",
"@react-native-community/masked-view": "^0.1.10",
"@react-native-firebase/app": "^11.2.0",
"@react-native-firebase/messaging": "^11.2.0",
"@react-native-google-signin/google-signin": "^8.1.0",
"@react-navigation/bottom-tabs": "^5.11.2",
"@react-navigation/material-bottom-tabs": "^5.3.10",
"@react-navigation/native": "^5.8.10",
"@react-navigation/stack": "^5.12.8",
"axios": "^0.21.0",
"babel-plugin-transform-decorators-legacy": "^1.3.5",
"buffer": "^6.0.3",
"date-time-format-timezone": "^1.0.22",
"lodash": "^4.17.20",
"lottie-ios": "^3.2.3",
"lottie-react-native": "^4.0.3",
"mobx": "^5.15.4",
"mobx-react": "^6.2.2",
"moment": "^2.29.1",
"qs": "^6.9.4",
"query-string": "^6.13.7",
"react": "16.13.1",
"react-native": "0.63.4",
"react-native-app-intro-slider": "^4.0.4",
"react-native-base64": "^0.1.0",
"react-native-circular-progress": "^1.3.7",
"react-native-code-push": "^7.0.1",
"react-native-confirmation-code-field": "^6.5.1",
"react-native-countdown-component": "^2.7.1",
"react-native-credit-card-input": "^0.4.1",
"react-native-date-picker": "^4.1.1",
"react-native-device-info": "^8.4.8",
"react-native-dialog": "^8.2.0",
"react-native-easy-toast": "^1.2.0",
"react-native-elements": "^3.4.2",
"react-native-fast-image": "^8.3.4",
"react-native-gallery-swiper": "^1.26.4",
"react-native-general-statusbar": "^1.0.1",
"react-native-gesture-handler": "^1.10.3",
"react-native-htmlview": "^0.16.0",
"react-native-image-picker": "^3.2.1",
"react-native-image-viewing": "^0.2.0",
"react-native-keyboard-aware-scroll-view": "^0.9.3",
"react-native-loading-spinner-overlay": "^2.0.0",
"react-native-modal": "^12.0.2",
"react-native-modal-datetime-picker": "^10.2.0",
"react-native-modalize": "^2.0.8",
"react-native-modals": "^0.22.3",
"react-native-paper": "^4.4.1",
"react-native-popup-menu": "^0.15.9",
"react-native-progress": "^4.1.2",
"react-native-reanimated": "^1.13.2",
"react-native-safe-area-context": "^3.1.9",
"react-native-safe-area-view": "^1.1.1",
"react-native-screens": "^2.15.0",
"react-native-size-matters": "^0.3.1",
"react-native-status-bar-height": "^2.6.0",
"react-native-svg": "^12.1.1",
"react-native-swiper": "^1.6.0",
"react-native-switch-pro": "^1.0.5",
"react-native-tab-view": "^2.15.2",
"react-native-textinput-effects": "^0.6.1",
"react-native-uuid": "^1.4.9",
"react-native-vector-icons": "^7.1.0",
"underscore": "^1.12.0"
},
"devDependencies": {
"@babel/core": "^7.8.4",
"@babel/runtime": "^7.8.4",
"@react-native-community/eslint-config": "^1.1.0",
"babel-jest": "^25.1.0",
"eslint": "^6.5.1",
"jest": "^25.1.0",
"metro-react-native-babel-preset": "^0.59.0",
"react-test-renderer": "16.13.1"
},
"jest": {
"preset": "react-native"
}
}

336
router.js Normal file
View File

@ -0,0 +1,336 @@
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow strict-local
*/
import React, { useEffect } from 'react';
import messaging from '@react-native-firebase/messaging';
import { colors } from './src/assets/styles/colors-theme';
import {
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
TouchableOpacity,
} from 'react-native';
import SafeAreaView from 'react-native-safe-area-view';
import { Provider } from 'mobx-react';
import Store from './src/stores/index';
import { NavigationContainer, useFocusEffect } from '@react-navigation/native';
import { createStackNavigator, HeaderBackButton } from '@react-navigation/stack';
import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import {
Header,
LearnMoreLinks,
Colors,
DebugInstructions,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
import Icon from 'react-native-vector-icons/dist/MaterialCommunityIcons';
import SplashScreen from './src/pages/splash/splashScreen';
import Main from './src/pages/main/main';
import Search from './src/pages/search/search';
import Favorite from './src/pages/favorite/favorite';
import MyTabBar from './MyTabBar';
import Order from './src/pages/order/order';
import Profile from './src/pages/profile/profile';
import Setting from './src/pages/profile/Setting';
import AddName from './src/pages/profile/addName';
import CreditCard from './src/pages/profile/creditCard';
import AddressSetting from './src/pages/profile/addressSetting';
import BuyHistory from './src/pages/buyHistory/buyHistory';
import HistoryDetails from './src/pages/buyHistory/historyDetails';
import ProductsDetails from './src/pages/productsDetails/productsDetails';
import ShoppingCart from './src/pages/shoppingCart/shoppingCart';
import Signin from './src/pages/signin/signin';
import Signup from './src/pages/signup/signup';
import News from './src/pages/news/news';
import SignUpVerify from './src/pages/signup/signUpVerify';
import ForgotPassword from './src/pages/signup/forgotPassword';
import GroupDetails from './src/pages/group/groupDetails';
import RedeemGifts from './src/pages/group/redeemGifts';
import ManageMembers from './src/pages/group/manageMembers';
import SalesRecord from './src/pages/group/salesRecord';
import GroupList from './src/pages/group/groupList';
import RedeemRecord from './src/pages/profile/redeemRecord'
import FullScreen from './src/pages/fullScreen/fullScreen'
import Notification from './src/pages/notificaation/notification'
import Tutorial from './src/pages/tutorial/tutorial'
Icon.loadFont();
const Stack = createStackNavigator();
const BottomTab = createBottomTabNavigator();
import { inject, observer } from 'mobx-react';
@inject('appStore')
@observer
class Router extends React.Component {
constructor(props) {
super(props);
this.store = props.appStore;
// this.handleFrontNotification = this.handleFrontNotification.bind(this);
}
handleFrontNotification() {
const unsubscribe = messaging().onMessage(async remoteMessage => {
console.log('A new FCM message arrived!', JSON.stringify(remoteMessage));
});
}
async componentDidMount() {
this.messageListener = messaging().onMessage(async message => this.store.saveNotification(message))
}
componentWillUnmount() {
this.messageListener();
}
BottomTabScreen = () => {
return (
<BottomTab.Navigator
tabBar={props => <MyTabBar {...props} logined={this.store.logined} />}>
<Stack.Screen
name="Main"
component={Main}
options={{ tabBarLabel: 'main' }}
/>
<Stack.Screen
name="BuyHistory"
component={BuyHistory}
options={{ tabBarLabel: 'shoppingHistory' }}
/>
<Stack.Screen
name="ShoppingCart"
component={ShoppingCart}
options={{ tabBarLabel: 'ShoppingCart' }}
/>
<Stack.Screen
name="Favorite"
component={Favorite}
options={{ tabBarLabel: 'myfavourite' }}
/>
<Stack.Screen
name="Profile"
component={Profile}
options={{ tabBarLabel: 'acAndSetting' }}
/>
</BottomTab.Navigator>
);
};
render() {
return (
<SafeAreaView style={{ flex: 1,backgroundColor:'white' }}>
<Stack.Navigator initialRouteName="SplashScreen">
{!this.store.splash ? (
<>
<Stack.Screen
name="SplashScreen"
component={SplashScreen}
options={{ headerShown: false }}
/>
</>
) : (
<>
<Stack.Screen
name="BottomTabScreen"
component={this.BottomTabScreen}
options={{ headerShown: false }}
/>
<Stack.Screen
name="ProductsDetails"
component={ProductsDetails}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Signin"
component={Signin}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Signup"
component={Signup}
options={{ headerShown: false }}
/>
<Stack.Screen
name="SignUpVerify"
component={SignUpVerify}
options={{ headerShown: false }}
/>
<Stack.Screen
name="AddName"
component={AddName}
options={{ headerShown: false }}
/>
<Stack.Screen
name="ForgotPassword"
component={ForgotPassword}
options={{ headerShown: false }}
/>
<Stack.Screen
name="ShoppingCart"
component={ShoppingCart}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Order"
component={Order}
options={{ headerShown: false }}
/>
<Stack.Screen
name="News"
component={News}
options={{ headerShown: false }}
/>
<Stack.Screen
name="HistoryDetails"
component={HistoryDetails}
options={{ headerShown: false }}
/>
<Stack.Screen
name="CreditCard"
component={CreditCard}
options={{ headerShown: false }}
/>
<Stack.Screen
name="AddressSetting"
component={AddressSetting}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Setting"
component={Setting}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Search"
component={Search}
options={{
headerShown: false,
// animationEnabled: false,
}}
/>
<Stack.Screen
name="GroupDetails"
component={GroupDetails}
options={{
headerShown: false,
// animationEnabled: false,
}}
/>
<Stack.Screen
name="GroupList"
component={GroupList}
options={{
headerShown: false,
// animationEnabled: false,
}}
/>
<Stack.Screen
name="RedeemGifts"
component={RedeemGifts}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="ManageMembers"
component={ManageMembers}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="SalesRecord"
component={SalesRecord}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="RedeemRecord"
component={RedeemRecord}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="FullScreen"
component={FullScreen}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="Notification"
component={Notification}
options={{
headerShown: false,
}}
/>
<Stack.Screen
name="Tutorial"
component={Tutorial}
options={{
headerShown: false,
}}
/>
</>
)}
</Stack.Navigator>
</SafeAreaView>
);
}
}
const styles = StyleSheet.create({
scrollView: {
backgroundColor: Colors.lighter,
},
engine: {
position: 'absolute',
right: 0,
},
body: {
backgroundColor: Colors.white,
},
sectionContainer: {
marginTop: 32,
paddingHorizontal: 24,
},
sectionTitle: {
fontSize: 24,
fontWeight: '600',
color: Colors.black,
},
sectionDescription: {
marginTop: 8,
fontSize: 18,
fontWeight: '400',
color: Colors.dark,
},
highlight: {
fontWeight: '700',
},
footer: {
color: Colors.dark,
fontSize: 12,
fontWeight: '600',
padding: 4,
paddingRight: 12,
textAlign: 'right',
},
});
export default Router;

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1 @@
F81D0BFFE116347EE09EF84A5EF84824DB8EE17AD9FF86FB240BFDFEA61EF0FD comodoca.com 5fd97c3b2d29c

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/images/craft@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

BIN
src/assets/images/craft@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/drink@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
src/assets/images/drink@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/images/facebook@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/images/facebook@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
src/assets/images/fruit@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
src/assets/images/fruit@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
src/assets/images/google@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
src/assets/images/google@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,48 @@
export const images = {
productCatalogue: {
alcoholic: require('./Alcoholic.png'),
frozenmeat: require('./Frozenmeat.png'),
drink: require('./drink.png'),
frozenfood: require('./frozenfood.png'),
fruit: require('./fruit.png'),
pasta: require('./pasta.png'),
seafood: require('./seafood.png'),
sneck: require('./sneck.png'),
vegetables: require('./vegetables.png'),
},
main: {
mostcheapstar: require('./mostcheapstar.png'),
ranking: require('./ranking.png'),
whiteStar: require('./whitestar.png'),
yellowStar: require('./yellowstar.png'),
goldenApple: require('./goldenApple.png'),
youmaylike: require('./youmaylike.png'),
template: require('./template.png'),
foodcat: require('./foodcat.png'),
},
details: {
share: require('./share.png'),
favourite: require('./favourite.png'),
comment: require('./comment.png'),
},
signIn: {
illustration: require('./illustration.png'),
facebook: require('./facebook.png'),
google: require('./google.png'),
bitMap: require('./Bitmap.png'),
logo: require('./logo.png'),
},
profile: {
creditCardIcon: require('./creditcardicon.png'),
profileShare: require('./profileshare.png'),
},
search: {
greenMagnifier: require('./Icon_Magnifier.png'),
smallGreenMagnifier: require('./Icon_Magnifier_Small.png'),
},
tutorial:{
tut1:require('./tut1.png'),
tut2:require('./tut2.png'),
tut3:require('./tut3.png'),
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
src/assets/images/pasta@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/images/pasta@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
src/assets/images/ranking@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/images/ranking@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/images/seafood@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/images/seafood@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
src/assets/images/search@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

BIN
src/assets/images/search@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
src/assets/images/sneck@2x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
src/assets/images/sneck@3x.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
src/assets/images/tut1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 KiB

BIN
src/assets/images/tut2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 KiB

BIN
src/assets/images/tut3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,981 @@
{
"v": "4.10.1",
"fr": 30,
"ip": 0,
"op": 40,
"w": 80,
"h": 80,
"nm": "Success Checkmark",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Check Mark",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
40,
40,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
-1.312,
6,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"v": [
[
-15.75,
8
],
[
-8,
16
],
[
13.125,
-4
]
],
"c": false
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "tm",
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"n": [
"0p667_1_0p333_0"
],
"t": 25,
"s": [
0
],
"e": [
100
]
},
{
"t": 33
}
],
"ix": 1
},
"e": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 3
},
"m": 1,
"ix": 2,
"nm": "Trim Paths 1",
"mn": "ADBE Vector Filter - Trim",
"hd": false
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
1,
1,
1,
1
],
"ix": 3
},
"o": {
"a": 0,
"k": 100,
"ix": 4
},
"w": {
"a": 0,
"k": 3,
"ix": 5
},
"lc": 2,
"lj": 2,
"nm": "Stroke 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transform"
}
],
"nm": "Shape 1",
"np": 3,
"cix": 2,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 40,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Circle Flash",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"n": [
"0p833_0p833_0p167_0p167"
],
"t": 25,
"s": [
0
],
"e": [
98
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"n": [
"0p833_0p833_0p167_0p167"
],
"t": 30,
"s": [
98
],
"e": [
0
]
},
{
"t": 38
}
],
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
40,
40,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 1
},
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667,
0.667,
0.667
],
"y": [
1,
1,
1
]
},
"o": {
"x": [
0.333,
0.333,
0.333
],
"y": [
0,
0,
0
]
},
"n": [
"0p667_1_0p333_0",
"0p667_1_0p333_0",
"0p667_1_0p333_0"
],
"t": 25,
"s": [
0,
0,
100
],
"e": [
100,
100,
100
]
},
{
"t": 30
}
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
64,
64
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Ellipse Path 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0.529866635799,
0.961458325386,
0.448091417551,
1
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
}
],
"ip": 0,
"op": 40,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Circle Stroke",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
39.022,
39.022,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 1
},
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667,
0.667,
0.667
],
"y": [
1,
1,
1
]
},
"o": {
"x": [
0.333,
0.333,
0.333
],
"y": [
0,
0,
0
]
},
"n": [
"0p667_1_0p333_0",
"0p667_1_0p333_0",
"0p667_1_0p333_0"
],
"t": 16,
"s": [
100,
100,
100
],
"e": [
80,
80,
100
]
},
{
"i": {
"x": [
0.667,
0.667,
0.667
],
"y": [
1,
1,
1
]
},
"o": {
"x": [
0.333,
0.333,
0.333
],
"y": [
0,
0,
0
]
},
"n": [
"0p667_1_0p333_0",
"0p667_1_0p333_0",
"0p667_1_0p333_0"
],
"t": 22,
"s": [
80,
80,
100
],
"e": [
120,
120,
100
]
},
{
"i": {
"x": [
0.667,
0.667,
0.667
],
"y": [
1,
1,
1
]
},
"o": {
"x": [
0.333,
0.333,
0.333
],
"y": [
0,
0,
0
]
},
"n": [
"0p667_1_0p333_0",
"0p667_1_0p333_0",
"0p667_1_0p333_0"
],
"t": 25,
"s": [
120,
120,
100
],
"e": [
100,
100,
100
]
},
{
"t": 29
}
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
60,
60
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Ellipse Path 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "tm",
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"n": [
"0p667_1_0p333_0"
],
"t": 0,
"s": [
0
],
"e": [
100
]
},
{
"t": 16
}
],
"ix": 1
},
"e": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 3
},
"m": 1,
"ix": 2,
"nm": "Trim Paths 1",
"mn": "ADBE Vector Filter - Trim",
"hd": false
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
0.427450984716,
0.800000011921,
0.35686275363,
1
],
"ix": 3
},
"o": {
"a": 0,
"k": 100,
"ix": 4
},
"w": {
"a": 0,
"k": 3,
"ix": 5
},
"lc": 2,
"lj": 2,
"nm": "Stroke 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0.978,
0.978
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transform"
}
],
"nm": "Ellipse 1",
"np": 3,
"cix": 2,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 40,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 4,
"nm": "Circle Green Fill",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"n": [
"0p833_0p833_0p167_0p167"
],
"t": 21,
"s": [
0
],
"e": [
98
]
},
{
"t": 28
}
],
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
40,
40,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 1
},
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667,
0.667,
0.667
],
"y": [
1,
1,
1
]
},
"o": {
"x": [
0.333,
0.333,
0.333
],
"y": [
0,
0,
0
]
},
"n": [
"0p667_1_0p333_0",
"0p667_1_0p333_0",
"0p667_1_0p333_0"
],
"t": 21,
"s": [
0,
0,
100
],
"e": [
100,
100,
100
]
},
{
"t": 28
}
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
64,
64
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Ellipse Path 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0.427450984716,
0.800000011921,
0.35686275363,
1
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
}
],
"ip": 0,
"op": 40,
"st": 0,
"bm": 0
}
]
}

View File

@ -0,0 +1,708 @@
{
"v": "5.6.10",
"fr": 120,
"ip": 0,
"op": 160,
"w": 1000,
"h": 1000,
"nm": "Composição 1",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Left",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.833,
"y": 0.833
},
"o": {
"x": 0.333,
"y": 0.333
},
"t": 0,
"s": [
650,
500,
0
],
"e": [
650,
500,
0
],
"to": [
0,
0,
0
],
"ti": [
0,
0,
0
]
},
{
"i": {
"x": 0.667,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 20,
"s": [
650,
500,
0
],
"e": [
650,
300,
0
],
"to": [
0,
-33.333,
0
],
"ti": [
-3.333,
0,
0
]
},
{
"i": {
"x": 0.209,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 70,
"s": [
650,
300,
0
],
"e": [
650,
500,
0
],
"to": [
3.329,
0,
0
],
"ti": [
-0.005,
-0.047,
0
]
},
{
"t": 120
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
-233,
-9,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
90,
90
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Caminho da elipse 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0,
1
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Preenchimento 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-233,
-9
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transformar"
}
],
"nm": "Elipse 1",
"np": 3,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 160,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Center",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.607,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 10,
"s": [
500,
500,
0
],
"e": [
500,
300,
0
],
"to": [
0,
-33.333,
0
],
"ti": [
0,
0,
0
]
},
{
"i": {
"x": 0.121,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 55,
"s": [
500,
300,
0
],
"e": [
500,
500,
0
],
"to": [
0,
0,
0
],
"ti": [
0,
-33.333,
0
]
},
{
"t": 115
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
-233,
-9,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
90,
90
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Caminho da elipse 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0,
1
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Preenchimento 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-233,
-9
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transformar"
}
],
"nm": "Elipse 1",
"np": 3,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 160,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Rigth",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.667,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 0,
"s": [
360,
500,
0
],
"e": [
360,
300,
0
],
"to": [
0,
-13.366,
0
],
"ti": [
0,
36.899,
0
]
},
{
"i": {
"x": 0.163,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 35,
"s": [
360,
300,
0
],
"e": [
360,
500,
0
],
"to": [
0,
-55.126,
0
],
"ti": [
0,
-33.333,
0
]
},
{
"t": 95
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
-233,
-9,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"d": 1,
"ty": "el",
"s": {
"a": 0,
"k": [
90,
90
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 3
},
"nm": "Caminho da elipse 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0,
1
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Preenchimento 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-233,
-9
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transformar"
}
],
"nm": "Elipse 1",
"np": 3,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 160,
"st": 0,
"bm": 0
}
],
"markers": []
}

BIN
src/assets/screenshot/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

BIN
src/assets/screenshot/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
src/assets/screenshot/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
src/assets/screenshot/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
src/assets/screenshot/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
src/assets/screenshot/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

BIN
src/assets/screenshot/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

View File

@ -0,0 +1,30 @@
/**
* 控制全app的颜色
* @type {{statusBarColor: string}}
*/
export const colors = {
backgroundColor:'#4AB066',
labelColor: '#A4A3A7',
bgc: 'white',
catColor: '#D0B895',
historyListColor: '#F6EFE0',
statusBarColor: '#23A2FF',
inputBgc: '#E6E7E8',
signupInputBgc: '#F0E1C9',
shoppingcartColor: '#F0DEC1',
inputText: '#4D4D4D',
profileBg: '#D29686',
mainColor: '#3EB873',
otherGreen: '#6EB7A0',
maingray: '#888A8D',
lineColor: '#E5E5E5',
textColor: '#000000',
subTextColor: '#98AD86',
baseColor: '#1BBC9B',
line2Color: '#9EA3A6',
borderLineColor: '#E6E6E6',
loginButtonColor: '#3E9B42',
titleColor: '#57A75A',
grayTextColor: '#E9E9E9',
shoppingGroupColor: '#F7F7F7',
};

91
src/components/Loading.js Normal file
View File

@ -0,0 +1,91 @@
import React, {Component} from 'react';
import {
Platform,
StyleSheet,
Text,
View,
Modal,
ActivityIndicator,
} from 'react-native';
import Spinner from 'react-native-loading-spinner-overlay';
import {colors} from '../assets/styles/colors-theme';
import LottieView from 'lottie-react-native';
import {width, height} from '../services/screen';
export default class Loading extends Component {
state = {
spinner: false,
};
render() {
return (
<Modal
transparent={true}
animationType={'none'}
visible={this.props.loading}
onRequestClose={() => {
console.log('c lose modal');
}}>
<View style={styles.modalBackground}>
<View style={styles.activityIndicatorWrapper}>
{/* <ActivityIndicator animating={this.props.loading} /> */}
<LottieView
ref={animation => {
this.animation = animation;
}}
colorFilters={[
{
keypath: 'Left',
color: colors.mainColor,
},
{
keypath: 'Center',
color: colors.mainColor,
},
{
keypath: 'Rigth',
color: colors.mainColor,
},
]}
style={{height: 150, width: 150}}
source={require('../assets/lottie/loading')}
autoPlay
loop
/>
</View>
</View>
</Modal>
);
}
}
const styles = StyleSheet.flatten({
wrapper: {
position: 'absolute',
top: 0,
left: 0,
width: width,
height: height,
},
loading: {
position: 'absolute',
top: height / 2 - 100,
left: width / 2 - 70,
width: 140,
height: 140,
},
modalBackground: {
flex: 1,
alignItems: 'center',
flexDirection: 'column',
justifyContent: 'center',
},
activityIndicatorWrapper: {
height: 200,
width: 200,
borderRadius: 10,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-around',
},
});

Some files were not shown because too many files have changed in this diff Show More