Authored by 张丽霞

学生认证,review by redding

'use strict';
import React, {Component} from 'react';
import ReactNative, {
View,
ScrollView,
Text,
NativeAppEventEmitter,
StyleSheet,
ListView,
Dimensions,
Picker,
LayoutAnimation,
} from 'react-native';
import RegisterInfoCell from './RegisterInfoCell';
import {Record, List, Map} from 'immutable';
export default class Register extends Component {
constructor(props) {
super(props);
this.renderRow = this.renderRow.bind(this);
this.renderSeparator = this.renderSeparator.bind(this);
this.dataSource = new ListView.DataSource({
rowHasChanged: (r1, r2) => !Immutable.is(r1, r2),
sectionHeaderHasChanged: (s1, s2) => !Immutable.is(s1, s2),
});
this._onPressRegisterInfoCell = this._onPressRegisterInfoCell.bind(this);
this.state = {
pickerList: List(),
offsety: 0,
};
}
componentDidMount() {
}
_onPressRegisterInfoCell(cellInfo) {
switch (cellInfo.get('type')) {
case 'education':{
this.setState({ pickerList: this.props.registerPageInfo.get('educationLevelList').toJS()});
}
break;
case 'years': {
this.setState({ pickerList: this.props.registerPageInfo.get('schoolYearList').toJS()});
}
break;
}
}
renderSeparator(sectionID, rowID, adjacentRowHighlighted) {
return (
<View key={'sep' + rowID} style={styles.separator}>
</View>
);
}
renderRow(rowData, sectionID, rowID, highlightRow) {
switch (sectionID) {
case 'totalStudentRegister':
return (
<View style={styles.totalStudentContainer}>
<Text style={styles.totalStudentText}>
全国已有
<Text style={{color: 'red'}}>
{rowData}
</Text>
位学生完成认证
</Text>
<View style={styles.black}>
</View>
</View>
);
case 'registerPageCellsInfo':
return (
<RegisterInfoCell
resource={rowData}
onPressRegisterInfoCell={this._onPressRegisterInfoCell}
/>
);
}
}
render() {
let {registerPageInfo} = this.props;
let dataSource ={
totalStudentRegister:[registerPageInfo.get('verifiedStudentTotal')],
registerPageCellsInfo:registerPageInfo.get('registerPageCells').size?registerPageInfo.get('registerPageCells').toArray():[],
};
let list = this.state.pickerList;
return (
<View style={styles.container}>
<ListView
contentContainerStyle={styles.contentContainer}
enableEmptySections={true}
dataSource={this.dataSource.cloneWithRowsAndSections(dataSource)}
renderRow={this.renderRow}
renderSeparator={this.renderSeparator}
renderFooter={()=>{
return <View style={styles.descriptionContainer}>
<Text style={styles.descriptionText}>同意
<Text style={{color: 'blue'}}>
Yoho!BUY有货学生认证协议
</Text>
</Text>
</View>
}}
/>
{this.state.pickerList.length?
<Picker
onValueChange={(carMake) => {
console.log(carMake);
}}>
{list.map((pickerItem, i) => {
console.log(pickerItem);
console.log('pickerItem');
return <Picker.Item
value={pickerItem}
label={pickerItem}
/>
console.log('2222222');
})}
</Picker>
:null
}
</View>
);
}
}
let {width, height} = Dimensions.get('window');
let styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#b2b2b2',
},
contentContainer: {
backgroundColor: '#f0f0f0',
height: height,
},
black: {
borderBottomColor: '#dfe3e2',
borderLeftColor: 'transparent',
borderRightColor: 'transparent',
borderWidth: 0.5,
height: 15,
backgroundColor: '#dfe3e2',
},
separator: {
width: width - 30,
left: 15,
height: 0.5,
backgroundColor: '#dfe3e2',
},
totalStudentContainer: {
height: 59,
backgroundColor: 'white',
},
totalStudentText: {
height: 44,
fontSize: 16,
top: 14,
paddingLeft: 15,
}
});
... ...
'use strict';
import React, {Component} from 'react';
import ReactNative, {
View,
ScrollView,
Text,
NativeAppEventEmitter,
StyleSheet,
TextInput,
TouchableOpacity,
Image,
} from 'react-native';
export default class RegisterInfoCell extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
}
render() {
let {resource} = this.props;
return (
<TouchableOpacity activeOpacity={1.0} onPress={() => {
if (!resource.get('touchAction')) {
return;
}
this.props.onPressRegisterInfoCell && this.props.onPressRegisterInfoCell(resource);
}}>
<View style={styles.container}>
<Text style={styles.leftTitle}>
{resource.get('title')}
</Text>
<TextInput
placeholder={resource.get('placeholderText')}
style={styles.rightTextInput}
editable={resource.get('touchAction')?false:true}
/>
{resource.get('touchAction')?
<Image style={styles.arrow}
source={require('../../images/right_arrow.png')}
/>
: null
}
</View>
</TouchableOpacity>
);
}
}
let styles = StyleSheet.create({
container: {
backgroundColor: 'white',
height: 44,
flexDirection: 'row',
},
leftTitle: {
width: 102,
paddingLeft: 15,
paddingRight: 20,
fontSize: 14,
top: 15,
},
rightTextInput: {
lineHeight: 40,
height: 44,
flex: 1,
fontSize: 14,
padding: 4,
},
arrow: {
width: 12,
height: 22,
top: 11,
marginRight: 15,
}
});
... ...
/*
* 潮流优选、明星原创
*/
'use strict';
import React, {Component} from 'react';
... ... @@ -24,7 +20,6 @@ export default class Student extends Component {
}
render() {
return (
<View style={styles.container}>
<Text>
... ...
... ... @@ -4,4 +4,12 @@ export default keyMirror({
SET_PLATFORM: null,
SET_CHANNEL: null,
QUERY_REGISTER_PAGE_INFO_REQUEST: null,
QUERY_REGISTER_PAGE_INFO_SUCCESS: null,
QUERY_REGISTER_PAGE_INFO_FAILURE: null,
QUERY_PROVINCE_REQUEST: null,
QUERY_PROVINCE_SUCCESS: null,
QUERY_PROVINCE_FAILURE: null,
});
... ...
... ... @@ -16,7 +16,7 @@ import {connect} from 'react-redux';
import {Map} from 'immutable';
import * as studentActions from '../reducers/student/studentActions';
import Student from '../components/student/Student';
import Register from '../components/student/Register';
const actions = [
studentActions,
];
... ... @@ -43,13 +43,26 @@ function mapDispatchToProps(dispatch) {
class StudentContainer extends Component {
constructor(props) {
super(props);
this._onPressRegisterInfoCell = this._onPressRegisterInfoCell.bind(this);
}
componentDidMount() {
this.props.actions.getRegisterPageInfo();
this.props.actions.getProvince();
}
_onPressRegisterInfoCell(registerCellInfo) {
this.props.actions.clickRegisterInfoCell(registerCellInfo);
}
render() {
let {student} = this.props;
let {registerPageInfo} = student;
return (
<View style={styles.container}>
<Student
<Register
registerPageInfo={registerPageInfo}
onPressRegisterInfoCell={this._onPressRegisterInfoCell}
/>
</View>
);
... ...
... ... @@ -5,6 +5,15 @@ import StudentService from '../../services/StudentService';
const {
SET_PLATFORM,
QUERY_REGISTER_PAGE_INFO_REQUEST,
QUERY_REGISTER_PAGE_INFO_SUCCESS,
QUERY_REGISTER_PAGE_INFO_FAILURE,
QUERY_PROVINCE_REQUEST,
QUERY_PROVINCE_SUCCESS,
QUERY_PROVINCE_FAILURE,
} = require('../../constants/actionTypes').default;
export function setPlatform(platform) {
... ... @@ -13,3 +22,147 @@ export function setPlatform(platform) {
payload: platform,
};
}
export function queryRegisterPageInfoRequest() {
return {
type: QUERY_REGISTER_PAGE_INFO_REQUEST
}
}
export function queryRegisterPageInfoSuccess(pageInfo) {
return {
type:QUERY_REGISTER_PAGE_INFO_SUCCESS,
payload:pageInfo
}
}
export function queryRegisterPageInfoFailure(error) {
return {
type:QUERY_REGISTER_PAGE_INFO_FAILURE,
payload:error
}
}
export function queryProvinceRequest() {
return {
type: QUERY_PROVINCE_REQUEST
}
}
export function queryProvinceSuccess(pageInfo) {
return {
type:QUERY_PROVINCE_SUCCESS,
payload:pageInfo
}
}
export function queryProvinceFailure(error) {
return {
type:QUERY_PROVINCE_FAILURE,
payload:error
}
}
export function getRegisterPageInfo() {
return (dispatch, getState) => {
dispatch(queryRegisterPageInfoRequest());
let {app, student} = getState();
Promise.all([
new StudentService(app.host).verifiedStudentTotal(),
new StudentService(app.host).getEducationLevelList(),
]).then(result => {
let studentTotal = result[0];
let educationLevelList = result[1];
let schoolYearList = [];
let registerPageCells = processRegisterPageInfo();
for (let i = 0; i < 8; i++) {
schoolYearList.push((new Date()).getFullYear() - i +'');
}
dispatch(queryRegisterPageInfoSuccess({studentTotal,educationLevelList,schoolYearList,registerPageCells}));
})
.catch(error => {
dispatch(queryRegisterPageInfoFailure(error));
});
};
}
export function getProvince() {
return (dispatch, getState) => {
dispatch(queryProvinceRequest());
let {app, student} = getState();
return new StudentService(app.host).getProvince()
.then(result => {
console.log('getProvince');
console.log(result);
//省份待处理
dispatch(queryProvinceSuccess());
})
.catch(error => {
dispatch(queryProvinceFailure(error));
});
};
}
function processRegisterPageInfo() {
let registerCellList = [
{
type: 'name',
title: '真实姓名',
placeholderText: '请输入您的真实姓名',
text: '',
touchAction: false,
},
{
type: 'id',
title: '身份证号',
placeholderText: '请输入您身份证号码',
text: '',
touchAction: false,
},
{
type: 'province',
title: '学校省份',
placeholderText: '请选择省份',
text: '',
touchAction: true,
},
{
type: 'school',
title: '学校名称',
placeholderText: '请选择您的所在学校',
text: '',
touchAction: true,
},
{
type: 'education',
title: '当前学历',
placeholderText: '请选择您的学历',
text: '',
touchAction: true,
},
{
type: 'years',
title: '入学年份',
placeholderText: '请选择您的入学年份',
text: '',
touchAction: true,
}];
return registerCellList;
}
export function clickRegisterInfoCell(registerCellInfo) {
return (dispatch, getState) => {
let {app, student} = getState();
let {registerPageInfo} = student;
return null;
switch (registerCellInfo.get('type')) {
case 'province':{
return null;
}
}
};
}
... ...
... ... @@ -3,7 +3,17 @@
import {Record, List, Map} from 'immutable';
let InitialState = Record({
platform: 'iOS',
registerPageInfo: new (Record({
isFetching: false,
verifiedStudentTotal: 0,
educationLevelList: List(),
schoolYearList: List(),
registerPageCells: Map(),
error: null,
pickerList: List(),
})),
province: Map(),
});
export default InitialState;
... ...
... ... @@ -5,15 +5,35 @@ import Immutable, {Map} from 'immutable';
const {
SET_PLATFORM,
QUERY_REGISTER_PAGE_INFO_REQUEST,
QUERY_REGISTER_PAGE_INFO_SUCCESS,
QUERY_REGISTER_PAGE_INFO_FAILURE,
QUERY_PROVINCE_REQUEST,
QUERY_PROVINCE_SUCCESS,
QUERY_PROVINCE_FAILURE,
} = require('../../constants/actionTypes').default;
const initialState = new InitialState;
export default function studentReducer(state=initialState, action) {
switch(action.type) {
case SET_PLATFORM: {
return state.set('platform', action.payload);
case QUERY_REGISTER_PAGE_INFO_REQUEST: {
return state.setIn(['registerPageInfo', 'isFetching'], true);
}
case QUERY_REGISTER_PAGE_INFO_SUCCESS: {
return state.setIn(['registerPageInfo', 'isFetching'], false)
.setIn(['registerPageInfo', 'verifiedStudentTotal'], action.payload.studentTotal)
.setIn(['registerPageInfo', 'educationLevelList'], Immutable.fromJS(action.payload.educationLevelList))
.setIn(['registerPageInfo', 'schoolYearList'], Immutable.fromJS(action.payload.schoolYearList))
.setIn(['registerPageInfo', 'registerPageCells'], Immutable.fromJS(action.payload.registerPageCells))
.setIn(['registerPageInfo', 'error'], null);
}
case QUERY_REGISTER_PAGE_INFO_FAILURE: {
return state.setIn(['registerPageInfo', 'isFetching'], false)
.setIn(['registerPageInfo', 'error'], action.payload);
}
}
return state;
... ...
... ... @@ -5,16 +5,15 @@ import Request from '../../common/services/Request';
export default class StudentService {
constructor () {
let baseURL = 'http://service.yoho.cn';
let baseURL = 'http://api.yoho.cn';
this.api = new Request(baseURL);
}
async fetchList(brand_type, options) {
async verifiedStudentTotal() {
return await this.api.get({
url: '/guang/api/v3/plustar/getlist',
url: '',
body: {
brand_type,
...options,
method: 'app.student.verifiedStudentTotal'
}
})
.then((json) => {
... ... @@ -25,4 +24,32 @@ export default class StudentService {
});
}
async getEducationLevelList() {
return await this.api.get({
url: '',
body: {
method: 'app.studentMarket.getEducationLevelList'
}
})
.then((json) => {
return json;
})
.catch((error) => {
throw(error);
});
}
async getProvince() {
return await this.api.get({
url: '',
body: {
method: 'app.studentMarket.getAddressList'
}
})
.then((json) => {
return json;
})
.catch((error) => {
throw(error);
});
}
}
... ...