首次提交,备份,android未测试

1. 登录页重构
2. prepare.js工具自动遍历page目录,生成page/_list.js,用于Navigation注册自动化
This commit is contained in:
xuwenyang 2019-05-07 22:40:24 +08:00
parent 89487b4eaa
commit df5a3cf98c
36 changed files with 14017 additions and 133 deletions

154
App.js
View file

@ -1,49 +1,115 @@
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow
*/
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View} from 'react-native';
import {
StyleSheet,
Text,
View,
Image,
Platform,
ActivityIndicator,
TextInput,
Modal,
TouchableOpacity,
Keyboard,
Animated,
LayoutAnimation,
InteractionManager,
Alert, StatusBar, DeviceEventEmitter, Linking
} from 'react-native';
import {Input} from "react-native-elements";
import {Navigation} from 'react-native-navigation';
const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
android:
'Double tap R on your keyboard to reload,\n' +
'Shake or press menu button for dev menu',
});
import Color from './src/style/color'
import Api from './src/util/api'
type Props = {};
export default class App extends Component<Props> {
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>Welcome to React Native!</Text>
<Text style={styles.instructions}>To get started, edit App.js</Text>
<Text style={styles.instructions}>{instructions}</Text>
</View>
);
}
import LoginForm from './src/component/loginForm'
import RegisterForm from './src/component/registerForm'
export default class App extends Component {
constructor(props) {
super(props);
this.state = ({
isLoginPage: true,
loading: false
});
}
setLoading(loading) {
this.setState({loading});
}
_toWeb() {
Linking.openURL("https://timepill.net/home/forgot_password");
}
_switchForm() {
LayoutAnimation.easeInEaseOut();
this.setState({
isLoginPage: !this.state.isLoginPage
});
}
render() {
return (
<View style={localStyle.wrap}>
<Modal visible={this.state.loading}
onRequestClose={() => {}}
transparent={true}>
<View style={localStyle.modal}>
<ActivityIndicator animating={true} color={Color.primary} size={Platform.OS === 'android' ? 'large' : 'small'}/>
</View>
</Modal>
<Animated.View style={localStyle.content}>
{this.state.isLoginPage
? (<LoginForm setLoading={this.setLoading.bind(this)}></LoginForm>)
: (<RegisterForm setLoading={this.setLoading.bind(this)}></RegisterForm>)}
<View style={localStyle.bottom}>
<TouchableOpacity onPress={this._switchForm.bind(this)}>
<Text style={localStyle.bottomText}>
{this.state.isLoginPage ? '没有账号?注册一个' : '已有账号?马上登录'}
</Text>
</TouchableOpacity>
<TouchableOpacity onPress={this._toWeb.bind(this)}>
<Text style={localStyle.bottomText}>
忘记密码
</Text>
</TouchableOpacity>
</View>
</Animated.View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
const localStyle = StyleSheet.create({
wrap: {
flex: 1,
backgroundColor: 'white'
},
content: {
flex: 1,
paddingTop: 100,
paddingHorizontal: 15
},
bottom: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingTop: 22,
paddingHorizontal: 5
},
bottomText: {
fontSize: 14,
color: Color.primary,
padding: 10
},
modal: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'rgba(255, 255, 255, 0.8)'
}
});

View file

@ -138,6 +138,9 @@ android {
}
dependencies {
implementation project(':react-native-device-info')
implementation project(':react-native-vector-icons')
implementation project(':@react-native-community_async-storage')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation "com.facebook.react:react-native:+" // From node_modules

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -3,6 +3,9 @@ package com.timepill;
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.learnium.RNDeviceInfo.RNDeviceInfo;
import com.oblador.vectoricons.VectorIconsPackage;
import com.reactnativecommunity.asyncstorage.AsyncStoragePackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
@ -22,7 +25,10 @@ public class MainApplication extends Application implements ReactApplication {
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage()
new MainReactPackage(),
new RNDeviceInfo(),
new VectorIconsPackage(),
new AsyncStoragePackage()
);
}

View file

@ -1,3 +1,9 @@
rootProject.name = 'Timepill'
include ':react-native-device-info'
project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android')
include ':react-native-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
include ':@react-native-community_async-storage'
project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android')
include ':app'

View file

@ -1,9 +1,40 @@
/**
* @format
* @entry
*/
import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';
import { Navigation } from 'react-native-navigation';
import App from './App';
import PageList from './src/page/_list'
import Token from './src/util/token'
async function init() {
let token = await Token.getUserToken();
if (!token) {
Navigation.startSingleScreenApp({
screen: {
screen: 'App',
title: 'App Title'
}
});
} else {
Navigation.startSingleScreenApp({
screen: {
screen: 'Home',
title: 'Home Title'
}
});
}
}
Navigation.registerComponent('App', () => App);
// regist screens automatically
for (let pageName in PageList) {
Navigation.registerComponent(pageName, () => PageList[pageName]);
}
init();
AppRegistry.registerComponent(appName, () => App);

View file

@ -23,6 +23,8 @@
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
1BB1EE3F5E2B43A3A160B05B /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 286848A695D94FA0AC6F8B7E /* Foundation.ttf */; };
26B1B7CC05554DA5BEF76622 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4DC49BDD3EFD4FA997BEEF58 /* Zocial.ttf */; };
2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
@ -36,10 +38,29 @@
2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
2DCD954D1E0B4F2C00145EB5 /* TimepillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* TimepillTests.m */; };
2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };
4117125F2280921A00018FD3 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4117125E2280920E00018FD3 /* libReactNativeNavigation.a */; };
444B74B0B45F447FA6D25561 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A333F2A12D224289B26028D1 /* libRNVectorIcons.a */; };
47AE5EA4A39F43CFA279144B /* libRNDeviceInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B6943EF54DC4C0E8C860C48 /* libRNDeviceInfo.a */; };
65C05FE762B34063B6F7C56A /* AntDesign.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9B75EADE871640EF8F7DB2E4 /* AntDesign.ttf */; };
6CA03C7B6F034CF5B2ECC3E5 /* libRNVectorIcons-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FC4807EA1FA42A4A55BDAE5 /* libRNVectorIcons-tvOS.a */; };
6CAEBF678D2F4D3A8D88B88A /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CC35BDC2C50846E0A4F98D35 /* EvilIcons.ttf */; };
71E72460768C4C9EB73C5050 /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D4DF9EF3F764CD0BF997FD6 /* MaterialCommunityIcons.ttf */; };
7CDD27C257FA4106B76D549E /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C558ABC6E5C94D939958E5F9 /* FontAwesome.ttf */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
93CB73C935C04E44A8FA6B25 /* FontAwesome5_Brands.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B067C379E8A3470390E07C13 /* FontAwesome5_Brands.ttf */; };
9D7603B23A7F4822A211DDAE /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6D8788EB66CB42AAAE311EF6 /* Feather.ttf */; };
9DF5D161F69E45E7B193AF29 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 126191B2E4AC47DC918127F9 /* Ionicons.ttf */; };
9ED46B2FDF3A4DB9A9DE64DD /* libRNCAsyncStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 02F6E40D13C4416C92D5A67C /* libRNCAsyncStorage.a */; };
A61FA51EAE72415DB62CBA81 /* FontAwesome5_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ADD4078A795846A0BD1A4B1B /* FontAwesome5_Regular.ttf */; };
AAC17BBBD9A24A4391B1FBA1 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E259D54DE3C4445E8CCCEE25 /* SimpleLineIcons.ttf */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
B45882E734E94D3393231370 /* libRNDeviceInfo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 784C7C58E2B04EECBD71EF5E /* libRNDeviceInfo-tvOS.a */; };
C4A31F747A7249C4AB01212C /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ADDB7A9FC7044DF48E9BA080 /* Octicons.ttf */; };
D9511472069D4A7684F78795 /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 958BF3F4E40A4001BAF2E744 /* FontAwesome5_Solid.ttf */; };
E039523D29354ECE80E38A03 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 39A6CC5AA01844FCA6BAD7CE /* MaterialIcons.ttf */; };
ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };
ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };
F343A722A8DB46C79081F2A0 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 81F0243DD71F467A964CAD89 /* Entypo.ttf */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -176,20 +197,6 @@
remoteGlobalIDString = 3D383D621EBD27B9005632C8;
remoteInfo = "double-conversion-tvOS";
};
2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 9936F3131F5F2E4B0010BF04;
remoteInfo = privatedata;
};
2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04;
remoteInfo = "privatedata-tvOS";
};
3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
@ -267,19 +274,75 @@
remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
remoteInfo = "cxxreact-tvOS";
};
3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
4117125D2280920E00018FD3 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
containerPortal = 411712342280920E00018FD3 /* ReactNativeNavigation.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;
remoteInfo = jschelpers;
remoteGlobalIDString = D8AFADBD1BEE6F3F00A4592D;
remoteInfo = ReactNativeNavigation;
};
3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
41EC7C5622809E1800779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;
remoteInfo = "jschelpers-tvOS";
remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;
remoteInfo = jsi;
};
41EC7C5822809E1800779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = EDEBC73B214B45A300DD5AC8;
remoteInfo = jsiexecutor;
};
41EC7C5A22809E1800779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = ED296FB6214C9A0900B7C4FE;
remoteInfo = "jsi-tvOS";
};
41EC7C5C22809E1800779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = ED296FEE214C9CF800B7C4FE;
remoteInfo = "jsiexecutor-tvOS";
};
41EC7C6222809E1800779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FE0D7FAFEDE44E168687B4B2 /* RNCAsyncStorage.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNCAsyncStorage;
};
41EC7D5122815DCA00779391 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 000EDE6A5D7D497FB251CC09 /* RNVectorIcons.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
remoteInfo = RNVectorIcons;
};
41FCEABD22818DAE009A3DD7 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 000EDE6A5D7D497FB251CC09 /* RNVectorIcons.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = A39873CE1EA65EE60051E01A;
remoteInfo = "RNVectorIcons-tvOS";
};
41FCEAC322818DAE009A3DD7 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D16AA0DE1A4348A8B86F08A1 /* RNDeviceInfo.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = DA5891D81BA9A9FC002B4DB2;
remoteInfo = RNDeviceInfo;
};
41FCEAC522818DAE009A3DD7 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D16AA0DE1A4348A8B86F08A1 /* RNDeviceInfo.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E72EC1401F7ABB5A0001BC90;
remoteInfo = "RNDeviceInfo-tvOS";
};
5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@ -319,6 +382,7 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
000EDE6A5D7D497FB251CC09 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = "<group>"; };
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = "<group>"; };
@ -328,6 +392,9 @@
00E356EE1AD99517003FC87E /* TimepillTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TimepillTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00E356F21AD99517003FC87E /* TimepillTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TimepillTests.m; sourceTree = "<group>"; };
02F6E40D13C4416C92D5A67C /* libRNCAsyncStorage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCAsyncStorage.a; sourceTree = "<group>"; };
0D4DF9EF3F764CD0BF997FD6 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = "<group>"; };
126191B2E4AC47DC918127F9 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = "<group>"; };
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* Timepill.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Timepill.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -338,15 +405,35 @@
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Timepill/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Timepill/main.m; sourceTree = "<group>"; };
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
286848A695D94FA0AC6F8B7E /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = "<group>"; };
2D02E47B1E0B4A5D006451C7 /* Timepill-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timepill-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
2D02E4901E0B4A5D006451C7 /* Timepill-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timepill-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };
39A6CC5AA01844FCA6BAD7CE /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = "<group>"; };
411712342280920E00018FD3 /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = "<group>"; };
4B6943EF54DC4C0E8C860C48 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = "<group>"; };
4DC49BDD3EFD4FA997BEEF58 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = "<group>"; };
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
6D8788EB66CB42AAAE311EF6 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = "<group>"; };
784C7C58E2B04EECBD71EF5E /* libRNDeviceInfo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNDeviceInfo-tvOS.a"; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
7FC4807EA1FA42A4A55BDAE5 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = "<group>"; };
81F0243DD71F467A964CAD89 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
958BF3F4E40A4001BAF2E744 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = "<group>"; };
9B75EADE871640EF8F7DB2E4 /* AntDesign.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = AntDesign.ttf; path = "../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf"; sourceTree = "<group>"; };
A333F2A12D224289B26028D1 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = "<group>"; };
ADD4078A795846A0BD1A4B1B /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = "<group>"; };
ADDB7A9FC7044DF48E9BA080 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = "<group>"; };
B067C379E8A3470390E07C13 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = "<group>"; };
C558ABC6E5C94D939958E5F9 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = "<group>"; };
CC35BDC2C50846E0A4F98D35 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = "<group>"; };
D16AA0DE1A4348A8B86F08A1 /* RNDeviceInfo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNDeviceInfo.xcodeproj; path = "../node_modules/react-native-device-info/ios/RNDeviceInfo.xcodeproj"; sourceTree = "<group>"; };
E259D54DE3C4445E8CCCEE25 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
FE0D7FAFEDE44E168687B4B2 /* RNCAsyncStorage.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCAsyncStorage.xcodeproj; path = "../node_modules/@react-native-community/async-storage/ios/RNCAsyncStorage.xcodeproj"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -362,6 +449,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4117125F2280921A00018FD3 /* libReactNativeNavigation.a in Frameworks */,
ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,
@ -375,6 +463,9 @@
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
9ED46B2FDF3A4DB9A9DE64DD /* libRNCAsyncStorage.a in Frameworks */,
444B74B0B45F447FA6D25561 /* libRNVectorIcons.a in Frameworks */,
47AE5EA4A39F43CFA279144B /* libRNDeviceInfo.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -391,6 +482,8 @@
2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,
2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
6CA03C7B6F034CF5B2ECC3E5 /* libRNVectorIcons-tvOS.a in Frameworks */,
B45882E734E94D3393231370 /* libRNDeviceInfo-tvOS.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -507,16 +600,16 @@
3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,
2DF0FFDF2056DD460020B375 /* libjsinspector.a */,
2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,
2DF0FFE32056DD460020B375 /* libthird-party.a */,
2DF0FFE52056DD460020B375 /* libthird-party.a */,
2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,
2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,
2DF0FFEB2056DD460020B375 /* libprivatedata.a */,
2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */,
41EC7C5722809E1800779391 /* libjsi.a */,
41EC7C5922809E1800779391 /* libjsiexecutor.a */,
41EC7C5B22809E1800779391 /* libjsi-tvOS.a */,
41EC7C5D22809E1800779391 /* libjsiexecutor-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@ -531,6 +624,52 @@
name = Frameworks;
sourceTree = "<group>";
};
411712352280920E00018FD3 /* Products */ = {
isa = PBXGroup;
children = (
4117125E2280920E00018FD3 /* libReactNativeNavigation.a */,
);
name = Products;
sourceTree = "<group>";
};
41EC7C2E22809E1600779391 /* Recovered References */ = {
isa = PBXGroup;
children = (
02F6E40D13C4416C92D5A67C /* libRNCAsyncStorage.a */,
A333F2A12D224289B26028D1 /* libRNVectorIcons.a */,
7FC4807EA1FA42A4A55BDAE5 /* libRNVectorIcons-tvOS.a */,
4B6943EF54DC4C0E8C860C48 /* libRNDeviceInfo.a */,
784C7C58E2B04EECBD71EF5E /* libRNDeviceInfo-tvOS.a */,
);
name = "Recovered References";
sourceTree = "<group>";
};
41EC7C5F22809E1800779391 /* Products */ = {
isa = PBXGroup;
children = (
41EC7C6322809E1800779391 /* libRNCAsyncStorage.a */,
);
name = Products;
sourceTree = "<group>";
};
41EC7D4D22815DCA00779391 /* Products */ = {
isa = PBXGroup;
children = (
41EC7D5222815DCA00779391 /* libRNVectorIcons.a */,
41FCEABE22818DAE009A3DD7 /* libRNVectorIcons-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
};
41FCEABF22818DAE009A3DD7 /* Products */ = {
isa = PBXGroup;
children = (
41FCEAC422818DAE009A3DD7 /* libRNDeviceInfo.a */,
41FCEAC622818DAE009A3DD7 /* libRNDeviceInfo-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
};
5E91572E1DD0AC6500FF2AA8 /* Products */ = {
isa = PBXGroup;
children = (
@ -552,6 +691,7 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
411712342280920E00018FD3 /* ReactNativeNavigation.xcodeproj */,
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
146833FF1AC3E56700842450 /* React.xcodeproj */,
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
@ -564,6 +704,9 @@
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
FE0D7FAFEDE44E168687B4B2 /* RNCAsyncStorage.xcodeproj */,
000EDE6A5D7D497FB251CC09 /* RNVectorIcons.xcodeproj */,
D16AA0DE1A4348A8B86F08A1 /* RNDeviceInfo.xcodeproj */,
);
name = Libraries;
sourceTree = "<group>";
@ -585,6 +728,8 @@
00E356EF1AD99517003FC87E /* TimepillTests */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
41EC7C2E22809E1600779391 /* Recovered References */,
E53A65304C4E46A4856A4D78 /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
@ -611,6 +756,28 @@
name = Products;
sourceTree = "<group>";
};
E53A65304C4E46A4856A4D78 /* Resources */ = {
isa = PBXGroup;
children = (
9B75EADE871640EF8F7DB2E4 /* AntDesign.ttf */,
81F0243DD71F467A964CAD89 /* Entypo.ttf */,
CC35BDC2C50846E0A4F98D35 /* EvilIcons.ttf */,
6D8788EB66CB42AAAE311EF6 /* Feather.ttf */,
C558ABC6E5C94D939958E5F9 /* FontAwesome.ttf */,
B067C379E8A3470390E07C13 /* FontAwesome5_Brands.ttf */,
ADD4078A795846A0BD1A4B1B /* FontAwesome5_Regular.ttf */,
958BF3F4E40A4001BAF2E744 /* FontAwesome5_Solid.ttf */,
286848A695D94FA0AC6F8B7E /* Foundation.ttf */,
126191B2E4AC47DC918127F9 /* Ionicons.ttf */,
0D4DF9EF3F764CD0BF997FD6 /* MaterialCommunityIcons.ttf */,
39A6CC5AA01844FCA6BAD7CE /* MaterialIcons.ttf */,
ADDB7A9FC7044DF48E9BA080 /* Octicons.ttf */,
E259D54DE3C4445E8CCCEE25 /* SimpleLineIcons.ttf */,
4DC49BDD3EFD4FA997BEEF58 /* Zocial.ttf */,
);
name = Resources;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -692,7 +859,7 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0940;
LastUpgradeCheck = 940;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
00E356ED1AD99517003FC87E = {
@ -715,6 +882,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
@ -770,6 +938,22 @@
ProductGroup = 146834001AC3E56700842450 /* Products */;
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
},
{
ProductGroup = 411712352280920E00018FD3 /* Products */;
ProjectRef = 411712342280920E00018FD3 /* ReactNativeNavigation.xcodeproj */;
},
{
ProductGroup = 41EC7C5F22809E1800779391 /* Products */;
ProjectRef = FE0D7FAFEDE44E168687B4B2 /* RNCAsyncStorage.xcodeproj */;
},
{
ProductGroup = 41FCEABF22818DAE009A3DD7 /* Products */;
ProjectRef = D16AA0DE1A4348A8B86F08A1 /* RNDeviceInfo.xcodeproj */;
},
{
ProductGroup = 41EC7D4D22815DCA00779391 /* Products */;
ProjectRef = 000EDE6A5D7D497FB251CC09 /* RNVectorIcons.xcodeproj */;
},
);
projectRoot = "";
targets = (
@ -901,20 +1085,6 @@
remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
2DF0FFEB2056DD460020B375 /* libprivatedata.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libprivatedata.a;
remoteRef = 2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libprivatedata-tvOS.a";
remoteRef = 2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -992,18 +1162,74 @@
remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {
4117125E2280920E00018FD3 /* libReactNativeNavigation.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;
path = libReactNativeNavigation.a;
remoteRef = 4117125D2280920E00018FD3 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = {
41EC7C5722809E1800779391 /* libjsi.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */;
path = libjsi.a;
remoteRef = 41EC7C5622809E1800779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41EC7C5922809E1800779391 /* libjsiexecutor.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjsiexecutor.a;
remoteRef = 41EC7C5822809E1800779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41EC7C5B22809E1800779391 /* libjsi-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libjsi-tvOS.a";
remoteRef = 41EC7C5A22809E1800779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41EC7C5D22809E1800779391 /* libjsiexecutor-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libjsiexecutor-tvOS.a";
remoteRef = 41EC7C5C22809E1800779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41EC7C6322809E1800779391 /* libRNCAsyncStorage.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNCAsyncStorage.a;
remoteRef = 41EC7C6222809E1800779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41EC7D5222815DCA00779391 /* libRNVectorIcons.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNVectorIcons.a;
remoteRef = 41EC7D5122815DCA00779391 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41FCEABE22818DAE009A3DD7 /* libRNVectorIcons-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRNVectorIcons-tvOS.a";
remoteRef = 41FCEABD22818DAE009A3DD7 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41FCEAC422818DAE009A3DD7 /* libRNDeviceInfo.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNDeviceInfo.a;
remoteRef = 41FCEAC322818DAE009A3DD7 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
41FCEAC622818DAE009A3DD7 /* libRNDeviceInfo-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRNDeviceInfo-tvOS.a";
remoteRef = 41FCEAC522818DAE009A3DD7 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
@ -1057,6 +1283,21 @@
files = (
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
65C05FE762B34063B6F7C56A /* AntDesign.ttf in Resources */,
F343A722A8DB46C79081F2A0 /* Entypo.ttf in Resources */,
6CAEBF678D2F4D3A8D88B88A /* EvilIcons.ttf in Resources */,
9D7603B23A7F4822A211DDAE /* Feather.ttf in Resources */,
7CDD27C257FA4106B76D549E /* FontAwesome.ttf in Resources */,
93CB73C935C04E44A8FA6B25 /* FontAwesome5_Brands.ttf in Resources */,
A61FA51EAE72415DB62CBA81 /* FontAwesome5_Regular.ttf in Resources */,
D9511472069D4A7684F78795 /* FontAwesome5_Solid.ttf in Resources */,
1BB1EE3F5E2B43A3A160B05B /* Foundation.ttf in Resources */,
9DF5D161F69E45E7B193AF29 /* Ionicons.ttf in Resources */,
71E72460768C4C9EB73C5050 /* MaterialCommunityIcons.ttf in Resources */,
E039523D29354ECE80E38A03 /* MaterialIcons.ttf in Resources */,
C4A31F747A7249C4AB01212C /* Octicons.ttf in Resources */,
AAC17BBBD9A24A4391B1FBA1 /* SimpleLineIcons.ttf in Resources */,
26B1B7CC05554DA5BEF76622 /* Zocial.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1179,9 +1420,23 @@
"DEBUG=1",
"$(inherited)",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = TimepillTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@ -1197,9 +1452,23 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COPY_PHASE_STRIP = NO;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = TimepillTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@ -1216,6 +1485,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = NO;
HEADER_SEARCH_PATHS = (
"$(SRCROOT)/../node_modules/react-native-navigation/ios",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = Timepill/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = (
@ -1234,6 +1509,12 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = 1;
HEADER_SEARCH_PATHS = (
"$(SRCROOT)/../node_modules/react-native-navigation/ios",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = Timepill/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = (
@ -1259,8 +1540,22 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = "Timepill-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@ -1285,8 +1580,22 @@
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = "Timepill-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@ -1310,8 +1619,22 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = "Timepill-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@ -1335,8 +1658,22 @@
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo",
);
INFOPLIST_FILE = "Timepill-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",

View file

@ -99,6 +99,13 @@
ReferencedContainer = "container:Timepill.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "OS_ACTIVITY_MODE"
value = "disable"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>

View file

@ -5,10 +5,9 @@
* LICENSE file in the root directory of this source tree.
*/
#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow *window;

View file

@ -7,36 +7,35 @@
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
// **********************************************
// *** DON'T MISS: THE NEXT LINE IS IMPORTANT ***
// **********************************************
#import "RCCManager.h"
// IMPORTANT: if you're getting an Xcode error that RCCManager.h isn't found, you've probably ran "npm install"
// with npm ver 2. You'll need to "npm install" with npm 3 (see https://github.com/wix/react-native-navigation/issues/1)
#import <React/RCTRootView.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"Timepill"
initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
NSURL *jsCodeLocation;
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
// **********************************************
// *** DON'T MISS: THIS IS HOW WE BOOTSTRAP *****
// **********************************************
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
self.window.backgroundColor = [UIColor whiteColor];
[[RCCManager sharedInstance] initBridgeWithBundleURL:jsCodeLocation launchOptions:launchOptions];
return YES;
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
@end

View file

@ -25,7 +25,7 @@
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<string/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
@ -40,13 +40,10 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSAppTransportSecurity</key>
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
@ -56,5 +53,7 @@
</dict>
</dict>
</dict>
<key>UIAppFonts</key>
<array/>
</dict>
</plist>

12817
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -7,8 +7,14 @@
"test": "jest"
},
"dependencies": {
"@react-native-community/async-storage": "^1.3.4",
"base-64": "^0.1.0",
"react": "16.8.3",
"react-native": "0.59.4"
"react-native": "0.59.5",
"react-native-device-info": "^1.6.1",
"react-native-elements": "^1.1.0",
"react-native-navigation": "^1.1.376",
"react-native-vector-icons": "^6.4.2"
},
"devDependencies": {
"@babel/core": "^7.4.3",

16
prepare.js Normal file
View file

@ -0,0 +1,16 @@
const fs = require("fs");
const path = require('path')
const pagePath = './src/page';
const pageFiles = fs.readdirSync(pagePath)
.filter(x => x.endsWith('Page.js'));
const content = pageFiles.map(x => {
let key = x.substring(0, x.indexOf('Page.js'));
let value = 'require("./' + x + '").default'
return key + ': ' + value;
}).join(',\n');
fs.writeFileSync("./src/page/_list.js", 'export default {\n' + content + '\n}');

134
src/component/loginForm.js Normal file
View file

@ -0,0 +1,134 @@
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View, InteractionManager, Alert} from 'react-native';
import {Input, Button} from "react-native-elements";
import {Navigation} from 'react-native-navigation';
import Color from '../style/color'
import Api from '../util/api'
export default class LoginForm extends Component {
constructor(props) {
super(props);
this.state = ({
username: '',
password: ''
});
}
async login() {
let isLoginSucc, errMsg = '账号或密码不正确';
this.props.setLoading(true);
try {
isLoginSucc = await Api.login(this.state.username, this.state.password);
} catch (err) {
console.log(err);
errMsg = err.message;
}
this.props.setLoading(false);
return {
isLoginSucc,
errMsg
}
}
_checkResult(result) {
InteractionManager.runAfterInteractions(() => {
if(result.isLoginSucc) {
Navigation.startSingleScreenApp({
screen: {
screen: 'Home',
title: 'Home Title',
}
});
} else {
Alert.alert(
result.errMsg,
'',
[
{text: '确定', onPress: () => {}},
],
{cancelable: false}
);
}
})
}
_clickLogin() {
this.login().then(this._checkResult);
}
_usernameSubmit() {
this.refs.loginPw.focus();
}
_passwordSubmit() {
this._clickLogin();
}
render() {return (
<View>
<Text style={localStyle.title}>{'欢迎来到胶囊日记'}</Text>
<View style={localStyle.form}>
<Input ref="loginUsername"
selectionColor={Color.primary}
underlineColorAndroid='transparent'
keyboardType='email-address'
value={this.state.username}
autoCorrect={false}
autoFocus={false}
autoCapitalize='none'
placeholderTextColor={Color.inactiveText}
placeholder='账号邮箱'
returnKeyType="next"
onChangeText={(text) => this.setState({username: text})}
onSubmitEditing={this._usernameSubmit.bind(this)}
/>
<Input ref="loginPw"
selectionColor={Color.primary}
underlineColorAndroid='transparent'
value={this.state.password}
secureTextEntry={true}
selectTextOnFocus={true}
autoCorrect={false}
placeholder='登录密码'
placeholderTextColor={Color.inactiveText}
returnKeyType='done'
onChangeText={(text) => this.setState({password: text})}
onSubmitEditing={this._passwordSubmit.bind(this)}
/>
</View>
<Button borderRadius={999} title={'登录'} backgroundColor={Color.primary}
onPress={this._clickLogin.bind(this)}
/>
</View>
);}
}
const localStyle = StyleSheet.create({
title: {
fontSize: 26,
paddingBottom: 35,
color: '#222',
textAlign: 'center'
},
form: {
paddingBottom: 20,
}
});

View file

@ -0,0 +1,147 @@
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View, InteractionManager, Alert} from 'react-native';
import {Input, Button} from "react-native-elements";
import {Navigation} from 'react-native-navigation';
import Color from '../style/color'
import Api from '../util/api'
export default class RegisterForm extends Component {
constructor(props) {
super(props);
this.state = ({
nickname: '',
username: '',
password: ''
});
}
async register() {
let isRegisterSucc, errMsg = '注册失败';
this.props.setLoading(true);
try {
isRegisterSucc = await Api.register(this.state.nickname, this.state.username, this.state.password);
} catch (err) {
console.log(err);
errMsg = err.message;
}
this.props.setLoading(false);
return {
isRegisterSucc,
errMsg
}
}
_checkResult(result) {
InteractionManager.runAfterInteractions(() => {
if(result.isRegisterSucc) {
Navigation.startSingleScreenApp({
screen: {
screen: 'Home',
title: 'Home Title',
}
});
} else {
Alert.alert(
result.errMsg,
'',
[
{text: '确定', onPress: () => {}},
],
{cancelable: false}
)
}
})
}
_clickRegister() {
this.register().then(this._checkResult);
}
render() {return (
<View>
<Text style={localStyle.title}>{'注册胶囊日记账号'}</Text>
<View style={localStyle.form}>
<Input
selectionColor={Color.primary}
underlineColorAndroid='transparent'
keyboardType='email-address'
value={''}
autoCorrect={false}
autoFocus={false}
autoCapitalize='none'
placeholderTextColor={Color.inactiveText}
placeholder='名字'
returnKeyType='next'
onChangeText={() => {}}
onSubmitEditing={() => {}}
/>
<Input
selectionColor={Color.primary}
underlineColorAndroid='transparent'
keyboardType='email-address'
value={''}
autoCorrect={false}
autoFocus={false}
autoCapitalize='none'
placeholderTextColor={Color.inactiveText}
placeholder='账号邮箱'
returnKeyType='next'
onChangeText={() => {}}
onSubmitEditing={() => {}}
/>
<Input
selectionColor={Color.primary}
underlineColorAndroid='transparent'
value={''}
secureTextEntry={true}
selectTextOnFocus={true}
autoCorrect={false}
placeholder='登录密码'
placeholderTextColor={Color.inactiveText}
returnKeyType='done'
onChangeText={() => {}}
onSubmitEditing={() => {}}
/>
</View>
<Button borderRadius={999} title={'注册'}
backgroundColor={Color.primary}
onPress={this._clickRegister.bind(this)}
/>
</View>
);}
}
const localStyle = StyleSheet.create({
title: {
fontSize: 26,
paddingBottom: 35,
color: '#222',
textAlign: 'center'
},
form: {
paddingBottom: 20,
}
});

50
src/page/HomePage.js Normal file
View file

@ -0,0 +1,50 @@
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View} from 'react-native';
export default class HomePage extends Component {
onPress() {
/*
this.props.navigator.push({
screen: 'Home'
});
Navigation.startSingleScreenApp({
screen: {
screen: 'Home',
title: 'Home Title',
}
});
*/
}
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>Home Page !</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});

3
src/page/_list.js Normal file
View file

@ -0,0 +1,3 @@
export default {
Home: require("./HomePage.js").default
}

20
src/style/color.js Normal file
View file

@ -0,0 +1,20 @@
export default {
primary: '#007AFF',
light: '#007AFF',
text: '#484848',
warning: '#ffdd57',
danger: '#ff3860',
inactiveText: '#9B9B9B',
darkText: '#333333',
lightText: '#7F91A7',
spaceBackground: '#f3f3ff',
navBackground: '#F9F9F9',
line: '#eee',
textSelect: '#b6d8ff',
refreshColor: '#007AFF',
iconColor:'#386DB1'
}

117
src/util/api.js Normal file
View file

@ -0,0 +1,117 @@
import TokenManager from './token'
import DeviceInfo from 'react-native-device-info';
const OS = DeviceInfo.getSystemName();
const OS_VERSION = DeviceInfo.getSystemVersion();
const DEVICE_ID = DeviceInfo.getUniqueID();
const VERSION = DeviceInfo.getVersion();
const baseUrl = 'http://open.timepill.net/api';
async function login(username, password) {
const token = TokenManager.generateToken(username, password);
await TokenManager.setUserToken(token);
try {
const userInfo = await getSelfInfo();
await TokenManager.setUserInfo(userInfo);
await TokenManager.setLoginPassword('');
return userInfo;
} catch(err) {
await TokenManager.setUserToken('');
if (err.code && err.code === 401) {
return false;
}
throw err;
}
}
async function getSelfInfo() {
return call('GET', '/users/my')
}
async function call(method, api, body, _timeout = 10000) {
let token = await TokenManager.getUserToken();
return timeout(fetch(baseUrl + api, {
method: method,
headers: {
'Authorization': token,
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-TP-OS': OS,
'X-TP-OS-Version': OS_VERSION,
'X-TP-Version': VERSION,
'X-Device-ID': DEVICE_ID,
},
body: body ? JSON.stringify(body) : null
})
.then(checkStatus)
.then(parseJSON)
.catch(handleCatch)
, _timeout);
}
function timeout(promise, time) {
return Promise.race([
promise,
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), time)
})
]);
}
async function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
} else {
console.log('http error: ' + response.status + ' ' + response.body);
let errInfo;
try {
errInfo = await response.json();
console.log(errInfo);
} catch (err) {
errInfo = {
code: 0,
message: '服务器开小差了 :('
}
}
let error = new Error(errInfo.message, errInfo.code ? errInfo.code : errInfo.status_code);
error.code = errInfo.code ? errInfo.code : errInfo.status_code;
throw error
}
}
function parseJSON(response) {
if (response.headers.get('content-type') === 'application/json') {
return response.json();
} else {
return response.text();
}
}
function handleCatch(err) {
if (err.message === 'Network request failed') {
throw new Error('网络连接失败', err.id)
} else {
throw err;
}
}
export default {
login
}

104
src/util/token.js Normal file
View file

@ -0,0 +1,104 @@
import AsyncStorage from '@react-native-community/async-storage';
var base64 = require('base-64');
class TokenManager {
generateToken(username, password) {
return 'Basic ' + base64.encode(username + ":" + password);
}
async set(key, value) {
await AsyncStorage.setItem(key, value);
}
async get(key) {
return await AsyncStorage.getItem(key);
}
async setUserToken(token) {
await this.set('user_token', token);
this.token = token;
}
async getUserToken() {
if (!this.token) {
this.token = await this.get('user_token');
}
return this.token;
}
async setUserInfo(user) {
await this.set('user_info', JSON.stringify(user));
this.user = user;
}
async getUserInfo() {
if (!this.user) {
this.user = JSON.parse(await this.get('user_info'));
}
return this.user;
}
async setLoginPassword(password) {
this.set('login_password', password);
}
async getLoginPassword() {
return await this.get('login_password');
}
async setUpdateVersion(version) {
this.set('update_version', JSON.stringify(version));
}
async getUpdateVersion() {
return JSON.parse(await this.get('update_version'));
}
async setDraft(content) {
this.set('draft', JSON.stringify(content));
}
async getDraft() {
return JSON.parse(await this.get('draft'));
}
async setTempDraft(content) {
this.set('temp_draft', JSON.stringify(content));
}
async getTempDraft() {
return JSON.parse(await this.get('temp_draft'));
}
async setSetting(name, value) {
let settings = await this.getSettings();
settings[name] = value;
this.set('setting', JSON.stringify(settings));
}
async getSetting(name) {
const settings = await this.getSettings();
return settings ? (settings[name]) : null;
}
async getSettings() {
let str = await this.get('setting');
let setting = str && str.length > 0 ? JSON.parse(str) : {};
if (settings['pushMessage'] === undefined) {
settings['pushMessage'] = true;
}
return settings;
}
}
export default new TokenManager()

View file

@ -799,6 +799,11 @@
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/yargs" "^12.0.9"
"@react-native-community/async-storage@^1.3.4":
version "1.3.4"
resolved "https://registry.npm.taobao.org/@react-native-community/async-storage/download/@react-native-community/async-storage-1.3.4.tgz#5a664484d485bcbab79648e1a0ce775b90843f29"
integrity sha1-WmZEhNSFvLq3lkjhoM53W5CEPyk=
"@react-native-community/cli@^1.2.1":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.8.0.tgz#92792e7949c963b1affedb272b3c3af87d1c73f0"
@ -1267,6 +1272,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
base-64@^0.1.0:
version "0.1.0"
resolved "https://registry.npm.taobao.org/base-64/download/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs=
base64-js@^1.1.2, base64-js@^1.2.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
@ -3643,10 +3653,10 @@ lodash.throttle@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
lodash@^4.17.11, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
lodash@4.x.x, lodash@^4.17.11, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha1-s56mIp72B+zYniyN8SU2iRysm40=
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
version "1.4.0"
@ -4903,10 +4913,17 @@ react-is@^16.8.1, react-is@^16.8.3, react-is@^16.8.4:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
react-native@0.59.4:
version "0.59.4"
resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.59.4.tgz#c0725e2e8efdea135533794ce95fea2289fe619a"
integrity sha512-etnXQp9IZgC8Vj5gsxZEDP4xRjJVNIj5/BSE1WcNAONG6tu6+mDBntx1jxHInwh61WYNgoQJuQGsbN5Na59ZDw==
react-native-navigation@^1.1.376:
version "1.1.493"
resolved "https://registry.npm.taobao.org/react-native-navigation/download/react-native-navigation-1.1.493.tgz#01d57dd9822ac603cd04d4529abacf193bbbcdac"
integrity sha1-AdV92YIqxgPNBNRSmrrPGTu7zaw=
dependencies:
lodash "4.x.x"
react-native@0.59.5:
version "0.59.5"
resolved "https://registry.npm.taobao.org/react-native/download/react-native-0.59.5.tgz#79500d2885a3dc83216715e1fc6effa878ad6ea9"
integrity sha1-eVANKIWj3IMhZxXh/G7/qHitbqk=
dependencies:
"@babel/runtime" "^7.0.0"
"@react-native-community/cli" "^1.2.1"