... ... @@ -52,30 +52,14 @@ export default class HotCategoryList extends Component{
}
let imageUrl = SlicedImage.getSlicedUrl(rowData.get("default_images"), 98, 128, 2);
// let categoryName = rowData.get("category_name");
//数据类型,纯文字型和图片型,列表中会出现纯文本的情况,比如MORE
let dataType = rowData.get("data_type");
if(dataType && dataType == 'text')
return (
<TouchableOpacity activeOpacity={1} onPress={() => this.props.onPressHotCategoryItem && this.props.onPressHotCategoryItem(rowData.toJS(),rowID)}>
<View style={styles.rowContainer}>
<Text style={styles.rowText} numberOfLines={1}>{rowData.get("show_category_name")}</Text>
</View>
</TouchableOpacity>
);
else{
return (
<TouchableOpacity activeOpacity={1} onPress={() => this.props.onPressHotCategoryItem && this.props.onPressHotCategoryItem(rowData.toJS(),rowID)}>
<View style={styles.rowContainer}>
<Image style={styles.rowThumbnail} source={{uri: imageUrl}}/>
<View style={styles.rowTextContainer}><Text style={styles.rowText} numberOfLines={2}>{rowData.get("category_name")}</Text></View>
</View>
</TouchableOpacity>
);
}
return (
<TouchableOpacity onPress={() => this.props.onPressHotCategoryItem && this.props.onPressHotCategoryItem(rowData.toJS(),rowID)}>
<View style={styles.rowContainer}>
<Image style={styles.rowThumbnail} key={imageUrl} source={{uri: imageUrl}}/>
<View style={styles.rowTextContainer}><Text style={styles.rowText} numberOfLines={2}>{rowData.get("category_name")}</Text></View>
</View>
</TouchableOpacity>
);
}
... ...
... ... @@ -70,7 +70,7 @@ export default class ChannelSelector extends React.Component {
let {dataSource} = this.props;
dataSource = dataSource ? dataSource : [];
return (
<View style={styles.container}>
<View style={styles.container} onLayout={this.props.onLayout}>
<ListView
contentContainerStyle={styles.contentContainer}
enableEmptySections={true}
... ...
/**
* Description:
*
* Author: Bruce.Lu
* Version: 1.0
* Created on 2017/2/23.
*/
import React from 'react';
import ReactNative from 'react-native';
let {
requireNativeComponent,
View,
} = ReactNative;
var dismissKeyboard = require('dismissKeyboard');
let YH_ViewPagerView = requireNativeComponent('YH_ViewPager', null);
var UIManager = require('UIManager');
type Event = Object;
var VIEWPAGER_REF = 'viewPager';
export type ViewPagerScrollState = $Enum<{
idle: string,
dragging: string,
settling: string,
}>;
export default class YH_ViewPager extends React.Component {
props: {
initialPage?: number,
onPageScroll?: Function,
onPageScrollStateChanged?: Function,
onPageSelected?: Function,
pageMargin?: number,
keyboardDismissMode?: 'none' | 'on-drag',
scrollEnabled?: boolean,
};
static propTypes = {
...View.propTypes,
initialPage: React.PropTypes.number,
onPageScroll: React.PropTypes.func,
onPageScrollStateChanged: React.PropTypes.func,
onPageSelected: React.PropTypes.func,
pageMargin: React.PropTypes.number,
keyboardDismissMode: React.PropTypes.oneOf([
'none', // default
'on-drag',
]),
scrollEnabled: React.PropTypes.bool,
};
constructor(props) {
super(props);
}
componentDidMount() {
if (this.props.initialPage != null) {
this.setPageWithoutAnimation(this.props.initialPage);
}
}
_childrenWithOverridenStyle = (): Array => {
// Override styles so that each page will fill the parent. Native component
// will handle positioning of elements, so it's not important to offset
// them correctly.
return React.Children.map(this.props.children, function(child) {
if (!child) {
return null;
}
var newProps = {
...child.props,
style: [child.props.style, {
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0,
width: undefined,
height: undefined,
}],
collapsable: false,
};
if (child.type &&
child.type.displayName &&
(child.type.displayName !== 'RCTView') &&
(child.type.displayName !== 'View')) {
console.warn('Each ViewPager child must be a <View>. Was ' + child.type.displayName);
}
return React.createElement(child.type, newProps);
});
};
_onPageScroll = (e: Event) => {
if (this.props.onPageScroll) {
this.props.onPageScroll(e);
}
if (this.props.keyboardDismissMode === 'on-drag') {
dismissKeyboard();
}
};
_onPageScrollStateChanged = (e: Event) => {
if (this.props.onPageScrollStateChanged) {
this.props.onPageScrollStateChanged(e.nativeEvent.pageScrollState);
}
};
_onPageSelected = (e: Event) => {
if (this.props.onPageSelected) {
this.props.onPageSelected(e);
}
};
setPage = (selectedPage: number) => {
UIManager.dispatchViewManagerCommand(
ReactNative.findNodeHandle(this),
UIManager.AndroidViewPager.Commands.setPage,
[selectedPage],
);
};
setPageWithoutAnimation = (selectedPage: number) => {
UIManager.dispatchViewManagerCommand(
ReactNative.findNodeHandle(this),
UIManager.AndroidViewPager.Commands.setPageWithoutAnimation,
[selectedPage],
);
};
render() {
return (<YH_ViewPagerView
{...this.props}
ref={VIEWPAGER_REF}
style={this.props.style}
onPageScroll={this._onPageScroll}
onPageScrollStateChanged={this._onPageScrollStateChanged}
onPageSelected={this._onPageSelected}
children={this._childrenWithOverridenStyle()}
/>);
}
}
... ...
... ... @@ -8,138 +8,15 @@
import React from 'react';
import ReactNative from 'react-native';
let {
requireNativeComponent,
View,
} = ReactNative;
var dismissKeyboard = require('dismissKeyboard');
let YH_ViewPagerView = requireNativeComponent('YH_ViewPager', null);
var UIManager = require('UIManager');
type Event = Object;
var VIEWPAGER_REF = 'viewPager';
export type ViewPagerScrollState = $Enum<{
idle: string,
dragging: string,
settling: string,
}>;
export default class YH_ViewPager extends React.Component {
props: {
initialPage?: number,
onPageScroll?: Function,
onPageScrollStateChanged?: Function,
onPageSelected?: Function,
pageMargin?: number,
keyboardDismissMode?: 'none' | 'on-drag',
scrollEnabled?: boolean,
};
static propTypes = {
...View.propTypes,
initialPage: React.PropTypes.number,
onPageScroll: React.PropTypes.func,
onPageScrollStateChanged: React.PropTypes.func,
onPageSelected: React.PropTypes.func,
pageMargin: React.PropTypes.number,
keyboardDismissMode: React.PropTypes.oneOf([
'none', // default
'on-drag',
]),
scrollEnabled: React.PropTypes.bool,
};
constructor(props) {
super(props);
}
componentDidMount() {
if (this.props.initialPage != null) {
this.setPageWithoutAnimation(this.props.initialPage);
}
}
_childrenWithOverridenStyle = (): Array => {
// Override styles so that each page will fill the parent. Native component
// will handle positioning of elements, so it's not important to offset
// them correctly.
return React.Children.map(this.props.children, function(child) {
if (!child) {
return null;
}
var newProps = {
...child.props,
style: [child.props.style, {
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0,
width: undefined,
height: undefined,
}],
collapsable: false,
};
if (child.type &&
child.type.displayName &&
(child.type.displayName !== 'RCTView') &&
(child.type.displayName !== 'View')) {
console.warn('Each ViewPager child must be a <View>. Was ' + child.type.displayName);
}
return React.createElement(child.type, newProps);
});
};
_onPageScroll = (e: Event) => {
if (this.props.onPageScroll) {
this.props.onPageScroll(e);
}
if (this.props.keyboardDismissMode === 'on-drag') {
dismissKeyboard();
}
};
_onPageScrollStateChanged = (e: Event) => {
if (this.props.onPageScrollStateChanged) {
this.props.onPageScrollStateChanged(e.nativeEvent.pageScrollState);
}
};
_onPageSelected = (e: Event) => {
if (this.props.onPageSelected) {
this.props.onPageSelected(e);
}
};
setPage = (selectedPage: number) => {
UIManager.dispatchViewManagerCommand(
ReactNative.findNodeHandle(this),
UIManager.AndroidViewPager.Commands.setPage,
[selectedPage],
);
};
setPageWithoutAnimation = (selectedPage: number) => {
UIManager.dispatchViewManagerCommand(
ReactNative.findNodeHandle(this),
UIManager.AndroidViewPager.Commands.setPageWithoutAnimation,
[selectedPage],
);
};
render() {
return (<YH_ViewPagerView
{...this.props}
ref={VIEWPAGER_REF}
style={this.props.style}
onPageScroll={this._onPageScroll}
onPageScrollStateChanged={this._onPageScrollStateChanged}
onPageSelected={this._onPageSelected}
children={this._childrenWithOverridenStyle()}
/>);
return null;
}
}
... ...
... ... @@ -28,7 +28,9 @@ export default class AppIconList extends React.Component {
}
shouldComponentUpdate(nextProps){
if (Immutable.is(nextProps.resource, this.props.resource)) {
if (Immutable.is(nextProps.data, this.props.data)
&& nextProps.backImage == this.props.backImage
&& nextProps.number == this.props.number) {
return false;
} else {
return true;
... ...
... ... @@ -37,7 +37,7 @@ export default class KidsBrandFloor extends Component {
}
shouldComponentUpdate(nextProps) {
if (Immutable.is(nextProps.resource, this.props.resource)) {
if (Immutable.is(nextProps.data, this.props.data)) {
return false;
} else {
return true;
... ...
... ... @@ -77,6 +77,8 @@ export default class Home extends Component {
rowHasChanged: (r1, r2) => !Immutable.is(r1, r2),
sectionHeaderHasChanged: (s1, s2) => !Immutable.is(s1, s2),
});
this.lifeStyleTabBarY = 0;
}
componentWillReceiveProps(nextProps) {
... ... @@ -499,7 +501,13 @@ export default class Home extends Component {
<YH_SortView
dataSource={['新品到着', '人气单品']}
onSelectdIndex={selectIndex}
onClickSort={this.props.onClickSort}
onClickSort={(index) => {
this.lifeStyleTabBarY && this.listView.scrollTo({x: 0, y: this.lifeStyleTabBarY, animated: true});
this.props.onClickSort && this.props.onClickSort(index);
}}
onLayout={(event) => {
this.lifeStyleTabBarY = event.nativeEvent.layout.y;
}}
/>
);
}else {
... ...
... ... @@ -45,7 +45,6 @@ export default function native(platform) {
const store = configureStore(getInitialState());
store.dispatch(setPlatform(platform));
let channel = this.props.channel;
let uid = this.props.uid;
let profilesInfo = this.props.profilesInfo;
let memberBillNew = this.props.memberBillNew;
if (profilesInfo) {
... ...
... ... @@ -83,8 +83,8 @@ export default class MineList extends React.Component {
announcement,
globalOrderData
} = this.props;
let dataSource = null;
dataSource = productListForMineCenter.list.toArray();
let dataSource = productListForMineCenter.list.toArray();
return (
<View style={styles.container}>
... ... @@ -96,14 +96,18 @@ export default class MineList extends React.Component {
renderRow={this._renderRow}
renderHeader={this._renderHeader}
onScroll={(event) => {
// console.log('onScrollonScrollonScroll')
// console.log(event.nativeEvent.contentOffset.y)
ReactNative.NativeModules.YH_MineHelper.updateNavBarState(event.nativeEvent.contentOffset.y);
if (Platform.OS === 'ios' && event.nativeEvent.contentOffset.y < -60) {
}}
onScrollEndDrag={(event) => {
if (profile.uid != '0' && Platform.OS === 'ios' && event.nativeEvent.contentOffset.y < -60) {
this.props.onMineCenterRefresh && this.props.onMineCenterRefresh();
}
}}
refreshControl=
{
Platform.OS === 'ios' ? null:
profile.uid == '0' || Platform.OS === 'ios' ? null:
<RefreshControl
refreshing={false}
onRefresh={() => {
... ...
... ... @@ -47,15 +47,16 @@ export default class MineListHeader extends React.Component {
position:'absolute',
right:offset,
top:0,
backgroundColor:'red',
borderColor:'red',
paddingLeft:num<10?4:1,
paddingRight:num<10?4:1,
borderRadius: 10,
borderWidth: (Platform.OS==='ios' ? 3 : 5) / PixelRatio.get(),
backgroundColor:'#d0021b',
paddingLeft: 2.5,
paddingRight: 2.5,
paddingTop: Platform.OS === 'ios' ? 1 : 0.5,
borderRadius: 7,
height: 14,
minWidth: 14,
}}>
<Text style={{color: 'white',
fontSize:10,
fontSize:9,
textAlign: 'center',
textAlignVertical: 'center',
backgroundColor: 'transparent'}}>{num}</Text>
... ... @@ -70,17 +71,18 @@ export default class MineListHeader extends React.Component {
let offset = 0;
if (isNaN(num)) {
//兼容非数字
offset = 6;
} else if (num <= 0) {
//0不显示
return null;
} else if (num < 10) {
offset = 15;
offset = 25;
} else if (num < 100) {
offset = 15;
offset = 25;
} else if (num < 1000) {
offset = 10;
offset = 20;
} else if (num < 10000) {
offset = 5;
offset = 15;
} else {
offset = 0;
num = '9999+';
... ... @@ -90,14 +92,16 @@ export default class MineListHeader extends React.Component {
position:'absolute',
right:offset,
top:0,
backgroundColor:'black',
paddingLeft:num<10?4:1,
paddingRight:num<10?4:1,
borderRadius: 10,
borderWidth: (Platform.OS==='ios' ? 3 : 5) / PixelRatio.get(),
backgroundColor:'#444444',
paddingLeft: 2.5,
paddingRight: 2.5,
paddingTop: Platform.OS === 'ios' ? 1 : 0.5,
borderRadius: 7,
height: 14,
minWidth: 14,
}}>
<Text style={{color: 'white',
fontSize:10,
fontSize:9,
textAlign: 'center',
textAlignVertical: 'center',
backgroundColor: 'transparent'}}>{num}</Text>
... ... @@ -119,7 +123,7 @@ export default class MineListHeader extends React.Component {
num = 3;
}
return (<Image style={styles.user_level} resizeMode={'stretch'} source={vipPic[num-1]}/>);
return (<Image style={styles.user_level} source={vipPic[num-1]}/>);
}
... ... @@ -141,19 +145,19 @@ export default class MineListHeader extends React.Component {
} = this.props;
let oHigh = 0;
if (this.props.certificationInfo && this.props.certificationInfo.isBindedOrRelated === 'N') {
if (profile.uid != '0' && this.props.certificationInfo && this.props.certificationInfo.isBindedOrRelated === 'N') {
oHigh = oHigh + subRowHeight;
}
if (this.props.announcement && this.props.announcement.open === 'Y') {
oHigh = oHigh + subRowHeight;
}
if ((this.props.certificationInfo.isBindedOrRelated === 'N') || (this.props.announcement && this.props.announcement.open === 'Y')) {
if ((profile.uid != '0' && this.props.certificationInfo.isBindedOrRelated === 'N') || (this.props.announcement && this.props.announcement.open === 'Y')) {
oHigh = oHigh + 10;
}
if (this.props.globalOrderData && this.props.globalOrderData.hasOrder === 'Y') {
oHigh = oHigh + rowheight;
if (profile.uid != '0' && this.props.globalOrderData && this.props.globalOrderData.hasOrder === 'Y') {
oHigh = oHigh + rowheight + 11;
}
if (this.props.memberBill && this.props.memberBill.bill.open === 'Y') {
if (profile.uid != '0' && this.props.memberBill && this.props.memberBill.bill.open === 'Y') {
oHigh = oHigh + rowheight;
}
... ... @@ -162,14 +166,18 @@ export default class MineListHeader extends React.Component {
}
oHigh = topHeight + oHigh;
let bgImage = Platform.OS === 'ios' ? require('../../image/mine_top_boy.png') : require('../../image/mine_banner_boy.jpg');
let bgHeight = Platform.OS === 'ios' ? 245 : 175;
let bgMarginTop = Platform.OS === 'ios' ? -60 : 0;
let bgPaddingTop = Platform.OS === 'ios' ? 115: 45;
let bgHeight = Platform.OS === 'ios' ? 284 : 175;
let bgMarginTop = Platform.OS === 'ios' ? -95 : 0;
let bgPaddingTop = Platform.OS === 'ios' ? 160: 45;
let paddingContainer =(width - 36*5)/16;
let favStringFontSize = profile.uid != '0' ? 11 : 15;
return (
<View style={[styles.container,{height:oHigh}]}>
<Image source={bgImage}
style={{width: width, height: bgHeight,paddingTop:bgPaddingTop, marginTop: bgMarginTop}}
resizeMode={'stretch'}>
style={{width: width, height: bgHeight, paddingTop: bgPaddingTop, marginTop: bgMarginTop}}
resizeMode={'cover'}>
{
profile.uid != '0' ?
... ... @@ -184,10 +192,10 @@ export default class MineListHeader extends React.Component {
source={{uri: YH_Image.getSlicedUrl(profile.head_ico, 60, 60, 2)}}
resizeMode={'cover'}/>
<View style={{
flexDirection:'column',
flex:1,
marginLeft:8,
}}>
flexDirection:'column',
flex:1,
marginLeft:8,
}}>
<Text style={{
alignItems: 'center',
justifyContent: 'center',
... ... @@ -198,18 +206,19 @@ export default class MineListHeader extends React.Component {
{profile.profile_name}
</Text>
<View style={{
flexDirection:'row',
marginTop:3,
}}>
flexDirection:'row',
marginTop:3,
}}>
{this._renderVip()}
{
profile.vip_info.is_student == 0 ? null :
<Image style={{
width: 30,
height: 20,
marginLeft:4,
}} resizeMode={'stretch'}
source={require('../../image/mine_vip_stu.png')}/>
profile.vip_info.is_student == 1 ? <Image
style={{
width: 27,
height: 16,
marginLeft:5,
}}
source={require('../../image/mine_vip_stu.png')}
/> : null
}
</View>
</View>
... ... @@ -221,29 +230,17 @@ export default class MineListHeader extends React.Component {
marginTop:1,
justifyContent: 'flex-end',
}}>
{
profile.vip_info.is_student == 0 ? null :
<TouchableOpacity
onPress={() => this.props.onPressItem('mineStudentHome','')}>
<Image style={styles.renzheng} resizeMode={'stretch'}
source={require('../../image/renzheng_bg.png')}>
<Text style={styles.renzheng_text} numberOfLines={1}>
学生认证
</Text>
</Image>
</TouchableOpacity>
}
<View style={{
flexDirection:'row',
alignItems: 'center',
marginBottom:10,
marginBottom:20,
}}>
<Text style={{
alignItems: 'center',
justifyContent: 'center',
color: 'white',
fontSize:14,
marginRight:5,
fontSize: 12,
marginRight: 5,
backgroundColor: 'transparent',
}} numberOfLines={1}>
设置收货地址
... ... @@ -268,7 +265,16 @@ export default class MineListHeader extends React.Component {
</TouchableOpacity>
</View>
}
{
(profile.uid != '0' && profile.vip_info.is_student == 1) ? null :
<TouchableOpacity style={{position:'absolute',right:0,top:45}} onPress={() => this.props.onPressItem('mineStudentHome','')}>
<Image
style={{width: 80,height: 27,marginBottom:15}}
resizeMode={'stretch'} source={require('../../image/renzheng_bg.png')}>
<Text style={styles.renzheng_text} numberOfLines={1}>学生认证</Text>
</Image>
</TouchableOpacity>
}
<View style={styles.fav_container}>
<TouchableOpacity onPress={() => this.props.onPressItem('mineFavProduct','')}>
... ... @@ -278,16 +284,16 @@ export default class MineListHeader extends React.Component {
<Text
style={styles.top_number_text}>{mineInfoNum.product_favorite_total + globalOrderData.collect_count < 100 ? mineInfoNum.product_favorite_total + globalOrderData.collect_count : '99+'}</Text> : null
}
<Text style={styles.top_text}>收藏的商品</Text>
<Text style={[styles.top_text, {fontSize: favStringFontSize}]}>收藏的商品</Text>
</View>
</TouchableOpacity>
<View style={{
width: 0.5,
height: 30,
marginTop:6,
marginBottom:6,
backgroundColor: '#e5e5e5',
}}/>
width: 0.5,
height: 22,
marginTop:6,
marginBottom:6,
backgroundColor: '#f0f0f0',
}}/>
<TouchableOpacity onPress={() => this.props.onPressItem('mineFavBrand','')}>
<View style={styles.topnum_content}>
{
... ... @@ -295,16 +301,16 @@ export default class MineListHeader extends React.Component {
<Text
style={styles.top_number_text}>{mineInfoNum.brand_favorite_total < 100 ? mineInfoNum.brand_favorite_total : '99+'}</Text> : null
}
<Text style={styles.top_text}>收藏的品牌</Text>
<Text style={[styles.top_text, {fontSize: favStringFontSize}]}>收藏的品牌</Text>
</View>
</TouchableOpacity>
<View style={{
width: 0.5,
height: 30,
marginTop:6,
marginBottom:6,
backgroundColor: '#e5e5e5',
}}/>
width: 0.5,
height: 22,
marginTop:6,
marginBottom:6,
backgroundColor: '#f0f0f0',
}}/>
<TouchableOpacity onPress={() => this.props.onPressItem('mineBrowseHis','')}>
<View style={styles.topnum_content}>
{
... ... @@ -312,13 +318,18 @@ export default class MineListHeader extends React.Component {
<Text
style={styles.top_number_text}>{mineInfoNum.product_browse < 100 ? mineInfoNum.product_browse : '99+'}</Text> : null
}
<Text style={styles.top_text}>浏览记录</Text>
<Text style={[styles.top_text, {fontSize: favStringFontSize}]}>浏览记录</Text>
</View>
</TouchableOpacity>
</View>
</Image>
<View style={{
width: width,
height: 10,
backgroundColor: '#f0f0f0',
}}/>
{certificationInfo && certificationInfo.isBindedOrRelated === 'N' ?
{profile.uid != '0' && certificationInfo && certificationInfo.isBindedOrRelated === 'N' ?
<TouchableOpacity onPress={() => this.props.onPressItem('mineCertification','')}>
<View style={styles.sub_row}>
<Image style={styles.row_icon} resizeMode={'contain'}
... ... @@ -345,7 +356,7 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 0.5,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
</TouchableOpacity> : null
}
... ... @@ -356,16 +367,16 @@ export default class MineListHeader extends React.Component {
duration={announcement.time}
onPressAnnounceItem={(url, i) => this.props.onPressItem('mineAnnounce',url)}/> : null
}
{((certificationInfo.isBindedOrRelated === 'N') || (announcement && announcement.open === 'Y')) ?
{(profile.uid != '0' && (certificationInfo.isBindedOrRelated === 'N') || (announcement && announcement.open === 'Y')) ?
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/> : null
}
<TouchableOpacity onPress={() => this.props.onPressItem('mineOrder','')}>
<View style={styles.row}>
<Text style={[styles.icon_text,{fontSize:17, fontWeight:'400'}]} numberOfLines={1}>
<Text style={[styles.icon_text,{fontSize:17, fontWeight:'bold'}]} numberOfLines={1}>
我的订单
</Text>
<Text style={{
... ... @@ -381,9 +392,9 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 0.5,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<View style={styles.order_container}>
<View style={[styles.order_container,{paddingLeft: paddingContainer , paddingRight: paddingContainer ,}]}>
<TouchableOpacity onPress={() => this.props.onPressItem('dfkOrder','')}>
<View style={styles.order_content}>
{
... ... @@ -402,7 +413,7 @@ export default class MineListHeader extends React.Component {
}
<Text style={styles.order_text}>待发货</Text>
{
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.send_cargo_num) : null
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.wait_cargo_num) : null
}
</View>
</TouchableOpacity>
... ... @@ -413,7 +424,7 @@ export default class MineListHeader extends React.Component {
}
<Text style={styles.order_text}>待收货</Text>
{
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.wait_cargo_num) : null
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.send_cargo_num) : null
}
</View>
</TouchableOpacity>
... ... @@ -424,7 +435,7 @@ export default class MineListHeader extends React.Component {
}
<Text style={styles.order_text}>待晒单</Text>
{
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.toShareOrderNum) : null
(profile.uid != '0' && mineInfoNum) ? this._renderMineOrderNumberPoint(mineInfoNum.comment_total) : null
}
</View>
</TouchableOpacity>
... ... @@ -443,9 +454,9 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
{(globalOrderData && globalOrderData.hasOrder === 'Y') ?
{(profile.uid != '0' && globalOrderData && globalOrderData.hasOrder === 'Y') ?
<TouchableOpacity onPress={() => this.props.onPressItem('mineGlobalOrder','')}>
<View style={styles.row}>
<Image style={styles.row_icon} source={require('../../image/mine_globalpurchase_icon.png')}/>
... ... @@ -464,13 +475,13 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
</TouchableOpacity> : null
}
<View style={styles.row}>
<Text style={[styles.icon_text,{fontSize:17, fontWeight:'400'}]} numberOfLines={1}>
<Text style={[styles.icon_text,{fontSize:17, fontWeight:'bold'}]} numberOfLines={1}>
我的资产
</Text>
<Text style={{
... ... @@ -484,10 +495,10 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 0.5,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<View style={styles.order_container}>
<View style={[styles.order_container, {paddingLeft: paddingContainer , paddingRight: paddingContainer }]}>
<TouchableOpacity onPress={() => this.props.onPressItem('mineCoupon','')}>
<View style={styles.asset_content}>
{
... ... @@ -551,7 +562,7 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<TouchableOpacity onPress={() => this.props.onPressItem('mineGuang','')}>
<View style={styles.row}>
... ... @@ -568,7 +579,7 @@ export default class MineListHeader extends React.Component {
width: width-50,
height: 0.5,
marginLeft:50,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<TouchableOpacity onPress={() => this.props.onPressItem('mineShareOrder','')}>
<View style={styles.row}>
... ... @@ -582,13 +593,13 @@ export default class MineListHeader extends React.Component {
</View>
</TouchableOpacity>
{(memberBill && memberBill.bill && memberBill.bill.open === 'Y') ?
{(profile.uid != '0' && memberBill && memberBill.bill && memberBill.bill.open === 'Y') ?
<TouchableOpacity onPress={() => this.props.onPressItem('mineMemberInfo',memberBill.bill.userinfo)}>
<View style={{
width: width-50,
height: 0.5,
marginLeft:50,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<View style={styles.row}>
{
... ... @@ -608,7 +619,7 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
paddingLeft:30,
}}/>
... ... @@ -633,7 +644,7 @@ export default class MineListHeader extends React.Component {
width: width-50,
height: 0.5,
marginLeft:50,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
</TouchableOpacity> : null
);
... ... @@ -645,7 +656,7 @@ export default class MineListHeader extends React.Component {
(activityListInfo && (activityListInfo.list.size > 0)) ? <View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/> : null
}
... ... @@ -663,9 +674,9 @@ export default class MineListHeader extends React.Component {
<View style={{
width: width,
height: 10,
backgroundColor: '#e5e5e5',
backgroundColor: '#f0f0f0',
}}/>
<Text style={[styles.icon_text, {marginTop:15}]} numberOfLines={1}>
<Text style={[styles.icon_text, {fontSize: 16, height: 120, marginTop:15, marginBottom: bgMarginTop,}]} numberOfLines={1}>
为您优选新品
</Text>
</View>
... ... @@ -679,7 +690,7 @@ let subRowHeight = Math.ceil(35 * DEVICE_WIDTH_RATIO);//账号安全 通知层
let rowheight = 45;//wo的订单类似的高度,我的逛也用这个高度
let orderContainerHeight = 55;
let topHeight = 175 + rowheight + orderContainerHeight + 10 + rowheight + orderContainerHeight + 1 + 10 + rowheight * 3 + 1 + 20 + 60 + 10;
let topHeight = 175 + rowheight + orderContainerHeight + 10 + rowheight + orderContainerHeight + 1 + 10 + rowheight * 3 + 91;
let styles = StyleSheet.create({
container: {
... ... @@ -703,11 +714,12 @@ let styles = StyleSheet.create({
fav_container: {
flexDirection: 'row',
justifyContent: 'space-around',
alignItems: 'center',
width: width,
height: 50,
paddingTop: 3,
height: 44,
// paddingTop: 3,
backgroundColor: 'black',
opacity: Platform.OS === 'ios' ? 0.7 : 1.0,
opacity: 0.8,
},
mine_row_container: {
flexDirection: 'row',
... ... @@ -725,10 +737,12 @@ let styles = StyleSheet.create({
asset_content: {
flexDirection: 'column',
flex: 1,
justifyContent: 'center',
alignItems: 'center',
width: 80,
width: (width - 10) / 4,
paddingTop: 4,
paddingBottom: 4,
// backgroundColor:'red'
},
topnum_content: {
flexDirection: 'column',
... ... @@ -742,8 +756,8 @@ let styles = StyleSheet.create({
height: 30,
},
row_icon: {
width: 20,
height: 20,
width: 22,
height: 22,
marginRight: 10,
},
icon_right_arrow: {
... ... @@ -757,29 +771,34 @@ let styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'center',
marginLeft: 4,
fontSize: 16,
fontSize: 17,
color: '#444444',
},
order_text: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
fontSize: 11,
fontSize: 12,
fontFamily: 'STHeitiSC-Light',
color: '#444444',
},
top_number_text: {
alignItems: 'center',
justifyContent: 'center',
color: 'white',
fontSize: 14,
fontSize: 15,
textAlignVertical: 'center',
textAlign: 'center',
marginBottom: 0,
},
top_text: {
alignItems: 'center',
justifyContent: 'center',
color: 'white',
fontSize: 13,
fontSize: 11,
textAlignVertical: 'center',
textAlign: 'center',
// marginTop: 3,
},
open_text: {
marginTop: 30,
... ... @@ -845,11 +864,11 @@ let styles = StyleSheet.create({
paddingRight: 4,
borderRadius: 30,
borderColor: 'white',
borderWidth: (Platform.OS === 'ios' ? 1.0 : 1.5) / PixelRatio.get(),
borderWidth: 1.5,
},
user_level: {
width: 45,
height: 20,
width: 36,
height: 16,
},
renzheng: {
width: 80,
... ... @@ -865,6 +884,7 @@ let styles = StyleSheet.create({
textAlignVertical: 'center',
textAlign: 'center',
backgroundColor: 'transparent',
paddingTop: Platform.OS === 'ios' ? 7 : 0,
},
login_text: {
alignItems: 'center',
... ... @@ -874,7 +894,7 @@ let styles = StyleSheet.create({
textAlign: 'center',
textAlignVertical: 'center',
color: 'white',
fontSize: 15,
fontSize: 17,
borderRadius: Platform.OS === 'ios' ? 0 : 3,
borderWidth: (Platform.OS === 'ios' ? 3 : 5) / PixelRatio.get(),
borderColor: 'white',
... ... @@ -886,18 +906,19 @@ let styles = StyleSheet.create({
},
globalDot:{
backgroundColor:'red',
borderColor:'red',
backgroundColor:'#d0021b',
marginRight:10,
borderRadius: 10,
paddingLeft:4,
paddingRight:4,
borderWidth: (Platform.OS==='ios' ? 3 : 5) / PixelRatio.get(),
paddingLeft: 2.5,
paddingRight: 2.5,
paddingTop: Platform.OS === 'ios' ? 1 : 0.5,
borderRadius: 7,
height: 14,
minWidth: 14,
},
globalDotText:{
color: 'white',
fontSize:10,
fontSize: 9,
textAlign: 'center',
textAlignVertical: 'center',
backgroundColor: 'transparent'
... ...
... ... @@ -60,4 +60,7 @@ export default keyMirror({
GET_MINEALLICON_SUCCESS:null,
SET_SIMILAR_PRODUCT_INDEX:null,
LOGIN_IN_SUCCESS:null,
LOGIN_OUT_SUCCESS:null,
});
... ...
... ... @@ -48,6 +48,7 @@ class MineContainer extends Component {
this.subscription1 = NativeAppEventEmitter.addListener(
'UserDidLoginEvent',
(reminder) => {
this.props.actions.loginInSuccess(reminder.uid);
this.props.actions.onMineCenterRefresh();
}
);
... ... @@ -55,6 +56,7 @@ class MineContainer extends Component {
this.subscription2 = NativeAppEventEmitter.addListener(
'UserDidLogoutEvent',
(reminder) => {
this.props.actions.loginOutSuccess();
this.props.actions.onMineCenterRefresh();
}
);
... ... @@ -208,7 +210,11 @@ class MineContainer extends Component {
case 'mineActivity':
url = `http://m.yohobuy.com?openby:yohobuy={"action":"go.mineactivity","params":{"act_name":"${data.get('act_name')}","act_id":"${data.get('act_id')}","url":"${data.get('url')}"}}`;
NativeModules.YH_CommonHelper.logEvent('YB_MY_INV', {});
NativeModules.YH_MineHelper.setMineActivityClicked(data.get('act_id'));
if (Platform.OS === 'ios') {
} else {
NativeModules.YH_MineHelper.setMineActivityClicked(data.get('act_id'));
}
break;
case 'mineFeedback':
url = `http://m.yohobuy.com?openby:yohobuy={"action":"go.sfhome","params":{}}`;
... ...
... ... @@ -66,6 +66,9 @@ const {
SET_SIMILAR_PRODUCT_INDEX,
LOGIN_IN_SUCCESS,
LOGIN_OUT_SUCCESS,
} = require('../../constants/actionTypes').default;
export function productListForMineCenterRequest() {
... ... @@ -87,6 +90,19 @@ export function productListForMineCenterFailure() {
}
}
export function loginInSuccess(json) {
return {
type: LOGIN_IN_SUCCESS,
payload: json,
}
}
export function loginOutSuccess() {
return {
type: LOGIN_OUT_SUCCESS,
}
}
export function getMineUserInfoSuccess(json) {
return {
type: GET_MINEUSERINFO_SUCCESS,
... ... @@ -271,25 +287,13 @@ export function setSimilarIndex(rowID) {
export function getProductListForMineCenter() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
if (isFetching) {
return
}
console.log('----productListForInstallment-----');
dispatch(productListForMineCenterRequest());
return new MineService(app.host).fetchMineCenterProductList()
.then(json => {
console.log(json);
let payload = json;//product_list
if (payload.page > 1) {
let oldList = open.productListForMineCenter.list.toJS();
let list = [...oldList, ...payload.list];
payload.product_list = list;
}
dispatch(productListForMineCenterSuccess(payload));
dispatch(productListForMineCenterSuccess(json));
})
.catch(error => {
console.log(error);
dispatch(productListForMineCenterFailure());
});
}
... ... @@ -298,30 +302,28 @@ export function getProductListForMineCenter() {
export function getMineUserInfo() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
let {isFetching} = mine;
let funGetMineUserinfo = () => {
if (isFetching) {
return
}
console.log('----getMineUserInfo-----');
return new MineService(app.host).getMineUserInfo()
.then(json => {
console.log(json);
dispatch(getMineUserInfoSuccess(json));
})
.catch(error => {
console.log(error);
dispatch(getMineUserInfoFailure());
// 网络获取个人信息失败,不要设置uid
});
};
// 从native端获取登录状态,如果没有,才调用getMineUserInfoFailure,设置uid为0
ReactNative.NativeModules.YH_CommonHelper.uid()
.then(data => {
funGetMineUserinfo();
})
.catch(error => {
dispatch(getMineUserInfoFailure());
});
}
}
... ... @@ -329,7 +331,7 @@ export function getMineUserInfo() {
export function getMineUserInfoNum() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
let {isFetching} = mine;
if (isFetching) {
return;
... ... @@ -338,15 +340,13 @@ export function getMineUserInfoNum() {
dispatch(getMineUserInfoNumRequest());
let funGetMineUserInfoNum = () => {
console.log('----getMineUserInfoNum-----');
return new MineService(app.host).getMineUserInfoNum()
.then(json => {
ReactNative.NativeModules.YH_MineHelper.setShareOrderNum(json);
dispatch(getMineUserInfoNumSuccess(json));
})
.catch(error => {
console.log(error);
//dispatch(getMineUserInfoNumFailure());
});
};
... ... @@ -391,18 +391,14 @@ export function getMineUnreadMsg() {
export function getMineFavProNum() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
let funGetMineFavProNum = () => {
console.log('----getMineFavProNum-----');
return new MineService(app.singleHost).getMineFavProNum()
.then(json => {
console.log(json);
dispatch(getMineFavProNumSuccess(json));
})
.catch(error => {
console.log(error);
//dispatch(getMineFavProNumFailure());
});
};
... ... @@ -419,17 +415,14 @@ export function getMineFavProNum() {
export function getMineRedPackageNum() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
let funGetMineRedPackageNum = () => {
console.log('----getMineRedPackageNum-----');
return new MineService(app.host).getMineRedPackageNum()
.then(json => {
console.log(json);
dispatch(getMineRedPackageNumSuccess(json));
})
.catch(error => {
console.log(error);
});
};
... ... @@ -446,16 +439,13 @@ export function getMineRedPackageNum() {
export function getMineInstalemtInfo() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getMineInstalemtInfo-----');
return new MineService(app.host).getMineInstalemtInfo()
.then(json => {
console.log(json);
ReactNative.NativeModules.YH_MineHelper.setInstalmentStatus(json);
dispatch(getMineInstalemtInfoSuccess(json));
})
.catch(error => {
console.log(error);
dispatch(getMineInstalemtInfoFailure());
});
}
... ... @@ -464,26 +454,30 @@ export function getMineInstalemtInfo() {
export function getMineActivity() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getMineActivity-----');
return new MineService(app.host).getMineActivity()
.then(json => {
// 成功获取活动数据后,调用原生的getMineActivityWithClicked方法获取是否点击过该活动,决定页面是否展示小红点
ReactNative.NativeModules.YH_MineHelper.getMineActivityWithClicked(json)
.then(data => {
// 如果成功获取到活动关联的小红点数据,那么就返回由原生方法返回的data数据
let result = data;
//result = '[{"act_id":28,"act_name":"邀请好友赢福利","isHasClicked":false,"state":1,"url":"http://m.yohobuy.com/activity/invite/index?act_id=28"},{"act_id":29,"act_name":"邀请好友赢福利","isHasClicked":false,"state":1,"url":"http://m.yohobuy.com/activity/invite/index?act_id=29"},{"act_id":30,"act_name":"邀请好友赢福利","isHasClicked":true,"state":0,"url":"http://m.yohobuy.com/activity/invite/index?act_id=30"}]';
if (Platform.OS === 'android') {
result = JSON.parse(result);
}
console.log(result);
dispatch(getMineActivitySuccess(result));
})
.catch(error => {
// 如果未成功获取到活动关联的小红点数据,那么就返回由服务端成功获取到的json数据
dispatch(getMineActivitySuccess(json));
});
if (Platform.OS === 'ios') {
dispatch(getMineActivitySuccess(json));
} else {
// 成功获取活动数据后,调用原生的getMineActivityWithClicked方法获取是否点击过该活动,决定页面是否展示小红点
ReactNative.NativeModules.YH_MineHelper.getMineActivityWithClicked(json)
.then(data => {
// 如果成功获取到活动关联的小红点数据,那么就返回由原生方法返回的data数据
let result = data;
//result = '[{"act_id":28,"act_name":"邀请好友赢福利","isHasClicked":false,"state":1,"url":"http://m.yohobuy.com/activity/invite/index?act_id=28"},{"act_id":29,"act_name":"邀请好友赢福利","isHasClicked":false,"state":1,"url":"http://m.yohobuy.com/activity/invite/index?act_id=29"},{"act_id":30,"act_name":"邀请好友赢福利","isHasClicked":true,"state":0,"url":"http://m.yohobuy.com/activity/invite/index?act_id=30"}]';
if (Platform.OS === 'android') {
result = JSON.parse(result);
}
dispatch(getMineActivitySuccess(result));
})
.catch(error => {
// 如果未成功获取到活动关联的小红点数据,那么就返回由服务端成功获取到的json数据
dispatch(getMineActivitySuccess(json));
});
}
})
.catch(error => {
... ... @@ -495,16 +489,13 @@ export function getMineActivity() {
export function getMemberBillTask() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getMemberBillTask-----');
return new MineService(app.billHost).getMemberBillTask()
.then(json => {
console.log(json);
dispatch(getMemberBillTaskSuccess(json));
})
.catch(error => {
console.log(error);
//dispatch(getMemberBillTaskFailure());
});
}
}
... ... @@ -512,16 +503,13 @@ export function getMemberBillTask() {
export function getEnvelopesItem() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getEnvelopesItem-----');
return new MineService(app.host).getEnvelopesItem()
.then(json => {
console.log(json);
dispatch(getEnvelopesItemSuccess(json));
})
.catch(error => {
console.log(error);
//dispatch(getEnvelopesItemFailure());
});
}
}
... ... @@ -529,16 +517,22 @@ export function getEnvelopesItem() {
export function getCertificationData() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getCertificationData-----');
return new MineService(app.host).getCertificationData()
.then(json => {
console.log(json);
dispatch(getCertificationDataSuccess(json));
let funGetCertificationData = () => {
return new MineService(app.host).getCertificationData()
.then(json => {
dispatch(getCertificationDataSuccess(json));
})
.catch(error => {
});
};
ReactNative.NativeModules.YH_CommonHelper.uid()
.then(data => {
funGetCertificationData();
})
.catch(error => {
console.log(error);
//dispatch(getCertificationDataFailure());
});
}
}
... ... @@ -546,16 +540,13 @@ export function getCertificationData() {
export function getAnnouncement() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getAnnouncement-----');
return new MineService(app.host).getAnnouncement()
.then(json => {
console.log(json);
dispatch(getAnnouncementSuccess(json));
})
.catch(error => {
console.log(error);
//dispatch(getAnnouncementFailure());
});
}
}
... ... @@ -563,15 +554,14 @@ export function getAnnouncement() {
export function getGlobalOrderState() {
return (dispatch, getState) => {
let {app, mine} = getState();
let {isFetching, open} = mine;
let funGetGlobalOrderState = () => {
console.log('----getMineRedPackageNum-----');
return new MineService(app.globalApiHost).getGlobalOrderState()
.then(json => {
dispatch(getGlobalOrderStateSuccess(json));
})
.catch(error => {
});
};
... ... @@ -590,7 +580,6 @@ export function getMineAllIcon() {
let {app, mine} = getState();
let {isFetching, open} = mine;
console.log('----getMineAllIcon-----');
ReactNative.NativeModules.YH_MineHelper.getMineAllIcon()
.then(data => {
let result = data;
... ... @@ -601,6 +590,7 @@ export function getMineAllIcon() {
dispatch(getMineAllIconSuccess(result));
})
.catch(error => {
});
}
}
... ...
... ... @@ -7,8 +7,6 @@ let InitialState = Record({
open: new (Record({
productListForMineCenter: new (Record({
list: List(),
page: 1,
totalPage: 1,
similarIndex: -1,
})),
mineCenterInfo: '',
... ...
... ... @@ -63,6 +63,9 @@ const {
SET_SIMILAR_PRODUCT_INDEX,
LOGIN_IN_SUCCESS,
LOGIN_OUT_SUCCESS,
} = require('../../constants/actionTypes').default;
const initialState = new InitialState;
... ... @@ -73,15 +76,10 @@ export default function appReducer(state = initialState, action) {
switch (action.type) {
case MINECENTER_PRODUCT_SUCCESS: {
let {
page,
page_total,
product_list,
} = action.payload;
let productListForMineCenter = state.open.productListForMineCenter.set('list', Immutable.fromJS(product_list))
.set('page', page)
.set('totalPage', page_total);
return state.setIn(['open', 'productListForMineCenter'], productListForMineCenter);
return state.setIn(['open', 'productListForMineCenter', 'list'], Immutable.fromJS(product_list));
}
case SET_SIMILAR_PRODUCT_INDEX: {
... ... @@ -89,6 +87,19 @@ export default function appReducer(state = initialState, action) {
return state.setIn(['open', 'productListForMineCenter'], productListForMineCenter);
}
case LOGIN_IN_SUCCESS: {
let {
uid,
} = action.payload;
let newProfile = state.profile.set("uid", uid);
return state.set('profile', newProfile);
}
case LOGIN_OUT_SUCCESS: {
let newProfile = state.profile.set("uid", "0");
return state.set('profile', newProfile);
}
case GET_MINEUSERINFO_SUCCESS: {
let {
head_ico,
... ... @@ -109,10 +120,6 @@ export default function appReducer(state = initialState, action) {
return state.set('profile', newProfile);
}
case GET_MINEUSERINFO_FAILURE: {
let newProfile = state.profile.set("uid", "0");
return state.set('profile', newProfile);
}
case GET_MINEUSERINFONUM_REQUEST: {
return state.set('isFetching', true);
}
... ... @@ -125,7 +132,6 @@ export default function appReducer(state = initialState, action) {
inbox_total,
limitCodeNum,
product_browse,
product_favorite_total,
refund_exchange_num,
send_cargo_num,
showOrderNum,
... ... @@ -141,7 +147,6 @@ export default function appReducer(state = initialState, action) {
.set("inbox_total", inbox_total)
.set("limitCodeNum", limitCodeNum)
.set("product_browse", product_browse)
.set("product_favorite_total", product_favorite_total)
.set("refund_exchange_num", refund_exchange_num)
.set("send_cargo_num", send_cargo_num)
.set("showOrderNum", showOrderNum)
... ...