Compare commits

...

12 commits

Author SHA1 Message Date
dependabot[bot]
7d1feea76c
Merge 2257f4c31a into e9317cbbfa 2024-12-03 02:54:53 +00:00
fatsheep1919
e9317cbbfa 关注按钮高度调整字号调整 2020-06-07 15:21:38 +08:00
fatsheep1919
daf7a95b1b 取消关注按钮背景色修改 2020-06-07 14:44:51 +08:00
xuwenyang
33c030934e Merge branch 'master' of github.com:timepill/timepill-app 2020-01-20 23:27:45 +08:00
xuwenyang
83e5b55072 关注,取消关注,屏蔽 2020-01-20 23:27:08 +08:00
mx1700
6da70b09b1 修复屏蔽借口报错问题 2020-01-20 21:17:37 +08:00
li.zhaoguang
d169cf348a Merge remote-tracking branch 'origin/master' 2020-01-04 16:25:53 +08:00
xuwenyang
55a1003c90 进入自己的主页右上角显示设置 2020-01-04 16:02:01 +08:00
xuwenyang
2e8c40d119 关注提醒显示头像 2019-11-09 22:04:18 +08:00
xuwenyang
4bdedaf170 提醒
评论和ok绷展示头像
点击头像进入对方用户详情页
点击其他区域进入日记详情页
2019-11-09 17:06:37 +08:00
li.zhaoguang
c9c1ceff83 增加屏蔽 2019-09-22 16:42:40 +08:00
li.zhaoguang
f222c159d9 更换 用户信息 & 提醒接口 到v2 API 2019-09-22 16:25:04 +08:00
17 changed files with 512 additions and 146 deletions

View file

@ -0,0 +1,131 @@
import React, {Component} from 'react';
import {StyleSheet, Text, View, InteractionManager, FlatList, Alert} from 'react-native';
import {Navigation} from 'react-native-navigation';
import Ionicons from 'react-native-vector-icons/Ionicons';
import Touchable from '../touchable';
import Color from '../../style/color';
import Api from '../../util/api';
import UserIcon from '../userIcon';
import Loading from '../loading';
import {ListFooterEnd} from '../listFooter';
export default class BlockUserList extends Component {
constructor(props) {
super(props);
this.state = {
users: [],
isLoading: true
};
}
componentDidMount() {
InteractionManager.runAfterInteractions(() => {
this.refresh();
});
}
_onDeletePress(user) {
Alert.alert('提示', '确定解除屏蔽?', [
{text: '确定', style: 'destructive', onPress: () => {
Api.deleteUserBlock(user.id)
.then(() => {
let filterUsers = this.state.users.filter((it) => it.id !== user.id);
this.setState({
users: filterUsers
});
})
.catch(e => {
Alert.alert('解除屏蔽失败');
});
}},
{text: '取消', onPress: () => {}}
]);
}
refresh() {
Api.getBlockUsers()
.then(data => {
if (data) {
this.setState({
users: data.users || [],
});
}
})
.catch(e => {
console.log('block user error:', e);
})
.finally(() => {
this.setState({
isLoading: false
});
});
}
render() {
if (this.state.isLoading) {
return <Loading visible={this.state.isLoading}></Loading>;
}
return (
<View style={localStyle.container}>
<FlatList style={localStyle.list}
data={this.state.users}
keyExtractor={(item, index) => {
return item.id ? item.id.toString() : index;
}}
renderItem={({item}) => {
return (
<Touchable key={item.id} onPress={() => {}}>
<View style={localStyle.box}>
<UserIcon iconUrl={item.iconUrl} onPress={() => {}}></UserIcon>
<Text style={localStyle.userName}>{item.name}</Text>
<Touchable onPress={() => this._onDeletePress(item)}>
<Ionicons name="md-close" size={20}
style={localStyle.removeIcon}
color={Color.inactiveText}
/>
</Touchable>
</View>
</Touchable>
);
}}
ListFooterComponent={() => <ListFooterEnd></ListFooterEnd>}
/>
</View>
);
}
}
const localStyle = StyleSheet.create({
container: {
flex: 1
},
list: {
height: '100%'
},
box: {
flexDirection: 'row',
borderBottomWidth: 1,
borderColor: Color.line,
alignItems: 'center',
backgroundColor: 'white',
paddingLeft: 25
},
userName: {
flex: 1,
color: Color.text,
fontSize: 16
},
removeIcon: {
padding: 20
}
});

View file

@ -122,6 +122,14 @@ export default class DiaryList extends Component {
}); });
} }
filter(blockUserId) {
let diaries = this.state.diaries;
let filtered = diaries.filter(d => d.user.id != blockUserId);
this.setState({
diaries: filtered
});
}
refreshOne(index, diary) { refreshOne(index, diary) {
if(diary) { if(diary) {
let list = this.state.diaries; let list = this.state.diaries;

View file

@ -2,21 +2,11 @@ import React, {Component} from 'react';
import {Image, StyleSheet, Text, View, TouchableOpacity} from 'react-native'; import {Image, StyleSheet, Text, View, TouchableOpacity} from 'react-native';
import Ionicons from 'react-native-vector-icons/Ionicons'; import Ionicons from 'react-native-vector-icons/Ionicons';
import UserIcon from '../userIcon';
import Touchable from '../touchable'; import Touchable from '../touchable';
import Color from '../../style/color'; import Color from '../../style/color';
function unique(array) {
let n = [];
for(let i=0; i<array.length; i++) {
if(n.indexOf(array[i]) == -1) {
n.push(array[i])
};
}
return n;
}
export default class Notification extends Component { export default class Notification extends Component {
_onDeletePress(msg) { _onDeletePress(msg) {
@ -47,14 +37,43 @@ export default class Notification extends Component {
} }
renderComment(msg) { renderComment(msg) {
const users = unique(msg.list.map(it => it.content.author.name)).join('、'); const max = 5;
const body = `${users} 回复了你`; const formatMsg = {};
let key = null;
for (let i=0; i<msg.list.length; i++) {
key = msg.list[i].link_user_id;
if (!formatMsg[key]) {
formatMsg[key] = {
userId: msg.list[i].content.author.id,
userIcon: msg.list[i].link_user_icon,
userName: msg.list[i].content.author.name,
};
}
}
return ( return (
<Touchable key={msg.link_id} onPress={() => this.props.onCommentPress(msg)}> <Touchable key={msg.link_id} onPress={() => this.props.onCommentPress(msg)}>
<View style={localStyle.container}> <View style={localStyle.container}>
<Ionicons name="ios-text" size={16} style={localStyle.icon} color={Color.light} /> <Ionicons name="ios-text" size={16} style={localStyle.icon} color={Color.light} />
<Text style={localStyle.text}>{body}</Text> {
Object.keys(formatMsg).map((it, index) => {
if (index >= max) {
return null;
}
return (
<UserIcon key={formatMsg[it].userId || index}
iconUrl={formatMsg[it].userIcon}
width={24} height={24}
onPress={() => this.props.onUserIconPress(formatMsg[it])}
/>
);
})
}
<Text style={localStyle.text}>
{Object.keys(formatMsg).length > max ? '等' : ''}回复了你
</Text>
{this.renderDeleteButton(msg)} {this.renderDeleteButton(msg)}
</View> </View>
</Touchable> </Touchable>
@ -62,13 +81,17 @@ export default class Notification extends Component {
} }
renderFollow(msg) { renderFollow(msg) {
const body = `${msg.content.user.name} 关注了你`; const userIcon = msg.link_user_icon;
return ( return (
<Touchable key={msg.link_id} onPress={() => this.props.onFollowPress(msg)}> <Touchable key={msg.link_id} onPress={() => this.props.onFollowPress(msg)}>
<View style={localStyle.container}> <View style={localStyle.container}>
<Ionicons name="ios-heart" size={16} style={localStyle.icon} color='#d9534f' /> <Ionicons name="ios-heart" size={14} style={localStyle.icon} color='#d9534f' />
<Text key={msg.link_id} style={localStyle.text}>{body}</Text> <UserIcon
iconUrl={userIcon}
width={24} height={24}
/>
<Text style={localStyle.text}>关注了你</Text>
{this.renderDeleteButton(msg)} {this.renderDeleteButton(msg)}
</View> </View>
</Touchable> </Touchable>
@ -76,7 +99,11 @@ export default class Notification extends Component {
} }
renderLike(msg) { renderLike(msg) {
const body = `${msg.content.user.name} 给了你一个OK绷`; const userData = {
userId: msg.content.user.id,
userIcon: msg.link_user_icon,
userName: msg.content.user.name,
}
return ( return (
<Touchable key={msg.link_id} onPress={() => this.props.onLikePress(msg)}> <Touchable key={msg.link_id} onPress={() => this.props.onLikePress(msg)}>
@ -88,7 +115,12 @@ export default class Notification extends Component {
} }
style={localStyle.icon2} style={localStyle.icon2}
/> />
<Text style={localStyle.text}>{body}</Text> <UserIcon
iconUrl={userData.userIcon}
width={24} height={24}
onPress={() => this.props.onUserIconPress(userData)}
/>
<Text style={localStyle.text}>给了你一个OK绷</Text>
{this.renderDeleteButton(msg)} {this.renderDeleteButton(msg)}
</View> </View>
</Touchable> </Touchable>
@ -108,17 +140,18 @@ const localStyle = StyleSheet.create({
icon: { icon: {
marginRight: 10, marginRight: 10,
marginTop: 1, marginTop: 1,
lineHeight: 20 lineHeight: 28
}, },
text: { text: {
flex: 1, flex: 1,
lineHeight: 20 lineHeight: 28
}, },
icon2: { icon2: {
width: 15, width: 15,
height: 15, height: 15,
marginRight: 10, marginLeft: -1,
marginTop: 4, marginRight: 9,
marginTop: 7,
}, },
delete: { delete: {
lineHeight: 20, lineHeight: 20,

View file

@ -107,6 +107,29 @@ export default class NotificationList extends Component {
} }
} }
_onUserIconPress(msg) {
Navigation.push(this.props.componentId, {
component: {
name: 'User',
options: {
bottomTabs: {
visible: false,
// hide bottom tab for android
drawBehind: true,
animate: true
}
},
passProps: {
user: {
id: msg.userId,
name: msg.userName,
}
}
}
});
}
_onCommentPress(msg) { _onCommentPress(msg) {
Navigation.push(this.props.componentId, { Navigation.push(this.props.componentId, {
component: { component: {
@ -160,7 +183,7 @@ export default class NotificationList extends Component {
_onLikePress(msg) { _onLikePress(msg) {
Navigation.push(this.props.componentId, { Navigation.push(this.props.componentId, {
component: { component: {
name: 'User', name: 'DiaryDetail',
options: { options: {
bottomTabs: { bottomTabs: {
visible: false, visible: false,
@ -171,7 +194,7 @@ export default class NotificationList extends Component {
} }
}, },
passProps: { passProps: {
user: msg.content.user diaryId: msg.content.dairy_id
} }
} }
}); });
@ -200,11 +223,12 @@ export default class NotificationList extends Component {
renderItem={({item}) => { renderItem={({item}) => {
return ( return (
<Notification msg={item} <Notification msg={item}
onCommentPress={this._onCommentPress.bind(this)} onUserIconPress={this._onUserIconPress.bind(this)}
onFollowPress={this._onFollowPress.bind(this)} onCommentPress={this._onCommentPress.bind(this)}
onLikePress={this._onLikePress.bind(this)} onFollowPress={this._onFollowPress.bind(this)}
onDeletePress={this._onDeletePress.bind(this)} onLikePress={this._onLikePress.bind(this)}
showDelete={this.props.isSetRead} onDeletePress={this._onDeletePress.bind(this)}
showDelete={this.props.isSetRead}
/> />
); );
}} }}

View file

@ -24,8 +24,7 @@ export default class UserIcon extends Component {
render() { render() {
return ( return (
<Avatar rounded <Avatar rounded containerStyle={localStyle.container}
containerStyle={localStyle.container}
width={this.props.width || 40} width={this.props.width || 40}
height={this.props.height || 40} height={this.props.height || 40}
source={{uri: this.state.iconUrl}} source={{uri: this.state.iconUrl}}

View file

@ -1,14 +1,14 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {StyleSheet, Text, View, ScrollView, InteractionManager} from 'react-native'; import {StyleSheet, Text, View, ScrollView, InteractionManager, Alert} from 'react-native';
import {Avatar} from "react-native-elements"; import {Avatar, Button} from "react-native-elements";
import moment from 'moment'; import moment from 'moment';
import Color from '../style/color'; import Color from '../style/color';
import Api from '../util/api'; import Api from '../util/api';
import Msg from '../util/msg'; import Msg from '../util/msg';
import UserIcon from './userIcon' import UserIcon from './userIcon';
import Loading from './loading' import Loading from './loading';
export default class UserIntro extends Component { export default class UserIntro extends Component {
@ -18,37 +18,76 @@ export default class UserIntro extends Component {
this.state = { this.state = {
user: props.user, user: props.user,
followed: 0,
isLoading: true isLoading: true
}; };
} }
componentDidMount() { componentDidMount() {
Api.getSelfInfoByStore() InteractionManager.runAfterInteractions(() => {
.then(user => { this.refresh();
this.selfInfo = user; });
InteractionManager.runAfterInteractions(() => {
this.refresh();
});
});
} }
refresh() { _onAddFollow() {
let userId = this.state.user ? this.state.user.id : this.selfInfo.id; Api.addFollow(this.state.user.id)
Api.getUserInfo(userId) .then(() => {
.then(user => {
this.setState({ this.setState({
user: user followed: 1
}); });
Alert.alert('已关注');
}) })
.catch(e => { .catch(e => {
Msg.showMsg('用户信息加载失败'); Alert.alert('关注失败');
}) })
.finally(() => { }
_onDeleteFollow() {
Api.deleteFollow(this.state.user.id)
.then(() => {
this.setState({ this.setState({
isLoading: false followed: -1,
});
Alert.alert('已取消关注');
})
.catch(e => {
Alert.alert('取消关注失败');
})
}
refresh(userId) {
let targetId = userId;
if(!targetId) {
targetId = this.state.user ? this.state.user.id : null;
}
if(targetId) {
Api.getUserInfo(targetId)
.then(user => {
this.setState({
user: user
});
}) })
.catch(e => {
Msg.showMsg('用户信息加载失败');
})
.finally(() => {
this.setState({
isLoading: false
})
});
}
}
refreshFollowed(followed = 0) {
if(followed) {
this.setState({
followed: followed
}); });
}
} }
render() { render() {
@ -57,10 +96,37 @@ export default class UserIntro extends Component {
} }
const user = this.state.user; const user = this.state.user;
const followed = this.state.followed;
return user ? ( return user ? (
<ScrollView style={localStyle.container} automaticallyAdjustContentInsets={false}> <ScrollView style={localStyle.container} automaticallyAdjustContentInsets={false}>
<View style={localStyle.userIcon}> <View style={localStyle.userIcon}>
<UserIcon width={90} height={90} iconUrl={user.coverUrl} /> <UserIcon width={90} height={90} iconUrl={user.coverUrl} />
{
followed < 0
? <Button title="+关注"
outline={true}
color={Color.primary}
borderRadius={5}
buttonStyle={localStyle.followButton}
fontSize={14}
onPress={this._onAddFollow.bind(this)}
/>
: (
followed > 0
? <Button title="取消关注"
outline={true}
color={Color.primary}
borderRadius={5}
buttonStyle={localStyle.followButton}
fontSize={14}
onPress={this._onDeleteFollow.bind(this)}
/>
: null
)
}
<Text style={localStyle.userTitle}>{user.name}</Text> <Text style={localStyle.userTitle}>{user.name}</Text>
</View> </View>
@ -84,14 +150,25 @@ const localStyle = StyleSheet.create({
backgroundColor: 'white' backgroundColor: 'white'
}, },
userIcon: { userIcon: {
height: 230, marginTop: 20,
backgroundColor: 'white', backgroundColor: 'white',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center' justifyContent: 'center'
}, },
followButton: {
width: 90,
height: 28,
marginTop: 20,
marginRight: 5,
paddingTop: 5,
paddingBottom: 5,
alignItems: 'center',
justifyContent: 'center'
},
userTitle: { userTitle: {
fontSize: 22, fontSize: 22,
marginTop: 30, marginTop: 30,
marginRight: 3,
fontWeight: 'bold', fontWeight: 'bold',
color: '#000' color: '#000'
}, },

49
src/page/BlockUserPage.js Normal file
View file

@ -0,0 +1,49 @@
import React, {Component} from 'react';
import {StyleSheet, Text, View} from 'react-native';
import BlockUserList from '../component/block/blockUserList';
export default class BlockUserPage extends Component {
constructor(props) {
super(props);
this.state = {
};
}
static options(passProps) {
return {
topBar: {
title: {
text: '屏蔽'
}
},
statusBar: {
backgroundColor: 'white',
style: 'dark'
}
};
}
render() {
return (
<View style={localStyle.wrap}>
<BlockUserList ref={(r) => this.list = r}
{...this.props}
></BlockUserList>
</View>
);
}
}
const localStyle = StyleSheet.create({
wrap: {
flex: 1,
backgroundColor: '#fff',
paddingTop: 1
}
});

View file

@ -1,8 +1,9 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {StyleSheet, Text, View} from 'react-native'; import {StyleSheet, Text, View, DeviceEventEmitter} from 'react-native';
import {Navigation} from 'react-native-navigation'; import {Navigation} from 'react-native-navigation';
import Api from '../util/api'; import Api from '../util/api';
import Event from "../util/event";
import {Icon} from '../style/icon'; import {Icon} from '../style/icon';
import Color from '../style/color'; import Color from '../style/color';
@ -64,6 +65,15 @@ export default class FollowPage extends Component {
} }
} }
); );
this.blockUserListener = DeviceEventEmitter.addListener(Event.userBlocked, (param) => {
this.diaryList.filter(param.blockUserId);
});
}
componentWillUnmount() {
this.bottomTabEventListener.remove();
this.blockUserListener.remove();
} }
render() { render() {

View file

@ -1,5 +1,5 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {StyleSheet, Text, View, Animated} from 'react-native'; import {StyleSheet, Text, View, Animated, DeviceEventEmitter} from 'react-native';
import { import {
PagerScroll, PagerScroll,
TabView, TabView,
@ -8,7 +8,9 @@ import {
} from 'react-native-tab-view'; } from 'react-native-tab-view';
import Api from '../util/api'; import Api from '../util/api';
import Event from "../util/event";
import Color from '../style/color'; import Color from '../style/color';
import FollowUserList from '../component/follow/followUserList' import FollowUserList from '../component/follow/followUserList'
import FollowingUserData from '../dataLoader/followingUserData' import FollowingUserData from '../dataLoader/followingUserData'
import FollowedByUserData from '../dataLoader/followedByUserData' import FollowedByUserData from '../dataLoader/followedByUserData'
@ -44,6 +46,21 @@ export default class FollowUserPage extends Component {
}; };
} }
componentDidMount() {
this.blockUserListener = DeviceEventEmitter.addListener(Event.userBlocked, (param) => {
if (this.followingList) {
this.followingList.refresh();
}
if (this.folloedByList) {
this.folloedByList.refresh();
}
});
}
componentWillUnmount() {
this.blockUserListener.remove();
}
_renderLabel = props => ({route}) => { _renderLabel = props => ({route}) => {
let routes = props.navigationState.routes; let routes = props.navigationState.routes;
let index = props.navigationState.index; let index = props.navigationState.index;
@ -72,14 +89,14 @@ export default class FollowUserPage extends Component {
}; };
_renderScene = SceneMap({ _renderScene = SceneMap({
following: () => <FollowUserList following: () => <FollowUserList ref={(r) => this.followingList = r}
listType={'followingUser'} dataSource={new FollowingUserData()} listType={'followingUser'} dataSource={new FollowingUserData()}
onDeletePress={async (id) => { onDeletePress={async (id) => {
return Api.deleteFollow(id); return Api.deleteFollow(id);
}} }}
{...this.props} {...this.props}
/>, />,
followedBy: () => <FollowUserList followedBy: () => <FollowUserList ref={(r) => this.followedByList = r}
listType={'followedByUser'} dataSource={new FollowedByUserData()} listType={'followedByUser'} dataSource={new FollowedByUserData()}
onDeletePress={async (id) => { onDeletePress={async (id) => {
return Api.deleteFollowBy(id); return Api.deleteFollowBy(id);

View file

@ -9,7 +9,8 @@ import {
Modal, Modal,
TouchableWithoutFeedback, TouchableWithoutFeedback,
InteractionManager, InteractionManager,
StatusBar StatusBar,
DeviceEventEmitter,
} from 'react-native'; } from 'react-native';
import {Navigation} from 'react-native-navigation'; import {Navigation} from 'react-native-navigation';
import {Button} from 'react-native-elements'; import {Button} from 'react-native-elements';
@ -18,6 +19,7 @@ import ActionSheet from 'react-native-actionsheet-api';
import Color from '../style/color' import Color from '../style/color'
import Api from '../util/api'; import Api from '../util/api';
import Update from '../util/update'; import Update from '../util/update';
import Event from '../util/event'
import DiaryList from '../component/diary/diaryList' import DiaryList from '../component/diary/diaryList'
import HomeDiaryData from '../dataLoader/homeDiaryData'; import HomeDiaryData from '../dataLoader/homeDiaryData';
@ -76,10 +78,15 @@ export default class HomePage extends Component {
Update.updateAndroid(); Update.updateAndroid();
}, 2000); }, 2000);
} }
this.blockUserListener = DeviceEventEmitter.addListener(Event.userBlocked, (param) => {
this.diaryList.filter(param.blockUserId);
});
} }
componentWillUnmount() { componentWillUnmount() {
this.bottomTabEventListener.remove(); this.bottomTabEventListener.remove();
this.blockUserListener.remove();
} }
startTimer() { startTimer() {

View file

@ -40,15 +40,6 @@ export default class NotificationPage extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
Navigation.events().bindComponent(this); Navigation.events().bindComponent(this);
// const ds = new ListView.DataSource({
// rowHasChanged: (r1, r2) => r1 !== r2
// });
// this.state = ({
// messages: [],
// messagesDataSource: ds,
// refreshing: true,
// });
} }
navigationButtonPressed({buttonId}) { navigationButtonPressed({buttonId}) {

View file

@ -179,6 +179,13 @@ export default class SettingPage extends Component {
{/*</View>*/} {/*</View>*/}
</View> </View>
<View style={localStyle.group}>
<TouchableOpacity style={localStyle.item} onPress={() => this.jumpTo('BlockUser')}>
<Text style={localStyle.title}>屏蔽</Text>
<Ionicons name="ios-arrow-forward" style={localStyle.arrow} size={18}/>
</TouchableOpacity>
</View>
<View style={localStyle.group}> <View style={localStyle.group}>
{ {
Api.IS_IOS ? ( Api.IS_IOS ? (

View file

@ -61,10 +61,14 @@ export default class TopicPage extends Component {
this.diaryListener = DeviceEventEmitter.addListener(Event.updateDiarys, (param) => { this.diaryListener = DeviceEventEmitter.addListener(Event.updateDiarys, (param) => {
this.diaryList.refresh(); this.diaryList.refresh();
}); });
this.blockUserListener = DeviceEventEmitter.addListener(Event.userBlocked, (param) => {
this.diaryList.filter(param.blockUserId);
});
} }
componentWillUnmount() { componentWillUnmount() {
this.diaryListener.remove(); this.diaryListener.remove();
this.blockUserListener.remove();
} }
render() { render() {

View file

@ -8,6 +8,7 @@ import {
} from 'react-native-tab-view'; } from 'react-native-tab-view';
import {Navigation} from 'react-native-navigation'; import {Navigation} from 'react-native-navigation';
import Msg from '../util/msg';
import Api from '../util/api'; import Api from '../util/api';
import {Icon} from '../style/icon'; import {Icon} from '../style/icon';
import Event from "../util/event"; import Event from "../util/event";
@ -48,8 +49,8 @@ export default class UserPage extends Component {
text: passProps.user.name text: passProps.user.name
}, },
rightButtons: [{ rightButtons: [{
id: 'followIcon', id: 'navButtonMore',
icon: Icon.navButtonFollow icon: Icon.navButtonMore
}] }]
}, },
statusBar: { statusBar: {
@ -76,41 +77,26 @@ export default class UserPage extends Component {
} }
navigationButtonPressed({buttonId}) { navigationButtonPressed({buttonId}) {
if(buttonId == 'followIcon') { if(buttonId == 'navButtonMore') {
Api.addFollow(this.userId) ActionSheet.showActionSheetWithOptions({
.then(() => { options: ['屏蔽', '取消'],
Navigation.mergeOptions(this.props.componentId, { cancelButtonIndex: 1,
topBar: { destructiveButtonIndex: 0
rightButtons: [{
id: 'navButtonFollowSelected',
icon: Icon.navButtonFollowSelected
}]
}
});
Alert.alert('已关注'); }, (index) => {
}) if(index == 0) {
.catch(e => { Api.addUserBlock(this.userId)
Alert.alert('关注失败'); .then(() => {
}) DeviceEventEmitter.emit(Event.userBlocked, {blockUserId: this.userId});
Navigation.popToRoot(this.props.componentId);
} else if(buttonId == 'navButtonFollowSelected') { Msg.showMsg('该用户已被屏蔽');
Api.deleteFollow(this.userId) })
.then(() => { .catch(e => {
Navigation.mergeOptions(this.props.componentId, { console.log('block error:', e);
topBar: { Alert.alert('屏蔽失败');
rightButtons: [{ });
id: 'followIcon', }
icon: Icon.navButtonFollow });
}]
}
});
Alert.alert('已取消关注');
})
.catch(e => {
Alert.alert('取消关注失败');
})
} else if(buttonId == 'setting') { } else if(buttonId == 'setting') {
Navigation.push(this.props.componentId, { Navigation.push(this.props.componentId, {
@ -131,23 +117,27 @@ export default class UserPage extends Component {
} }
componentDidMount() { componentDidMount() {
if(this.userId) { Api.getSelfInfoByStore()
Api.getRelation(this.userId) .then(user => {
.then(re => { if(!this.userId || (user && user.id == this.userId)) {
this.followed = re; this.userIntro.refresh(user.id);
if(this.followed) { Navigation.mergeOptions(this.props.componentId, {
Navigation.mergeOptions(this.props.componentId, { topBar: {
topBar: { rightButtons: [{
rightButtons: [{ id: 'setting',
id: 'navButtonFollowSelected', icon: Icon.navButtonSetting
icon: Icon.navButtonFollowSelected }]
}] }
} });
});
}
});
} } else {
Api.getRelation(this.userId)
.then(re => {
this.followed = re ? 1 : -1;
this.userIntro.refreshFollowed(this.followed);
});
}
});
this.notebookListener = DeviceEventEmitter.addListener(Event.updateNotebooks, (param) => { this.notebookListener = DeviceEventEmitter.addListener(Event.updateNotebooks, (param) => {
this.notebookList.refresh(); this.notebookList.refresh();

View file

@ -1,24 +1,25 @@
export default { export default {
About: require("./AboutPage.js").default, About: require("./AboutPage.js").default,
DiaryDetail: require("./DiaryDetailPage.js").default, BlockUser: require("./BlockUserPage.js").default,
Empty: require("./EmptyPage.js").default, DiaryDetail: require("./DiaryDetailPage.js").default,
Feedback: require("./FeedbackPage.js").default, Empty: require("./EmptyPage.js").default,
Follow: require("./FollowPage.js").default, Feedback: require("./FeedbackPage.js").default,
FollowUser: require("./FollowUserPage.js").default, Follow: require("./FollowPage.js").default,
Home: require("./HomePage.js").default, FollowUser: require("./FollowUserPage.js").default,
NotebookDetail: require("./NotebookDetailPage.js").default, Home: require("./HomePage.js").default,
NotebookEdit: require("./NotebookEditPage.js").default, NotebookDetail: require("./NotebookDetailPage.js").default,
NotebookMerge: require("./NotebookMergePage.js").default, NotebookEdit: require("./NotebookEditPage.js").default,
NotificationHistory: require("./NotificationHistoryPage.js").default, NotebookMerge: require("./NotebookMergePage.js").default,
Notification: require("./NotificationPage.js").default, NotificationHistory: require("./NotificationHistoryPage.js").default,
Password: require("./PasswordPage.js").default, Notification: require("./NotificationPage.js").default,
Photo: require("./PhotoPage.js").default, Password: require("./PasswordPage.js").default,
Setting: require("./SettingPage.js").default, Photo: require("./PhotoPage.js").default,
Topic: require("./TopicPage.js").default, Setting: require("./SettingPage.js").default,
UserInfoEdit: require("./UserInfoEditPage.js").default, Topic: require("./TopicPage.js").default,
UserIntroEdit: require("./UserIntroEditPage.js").default, UserInfoEdit: require("./UserInfoEditPage.js").default,
UserNameEdit: require("./UserNameEditPage.js").default, UserIntroEdit: require("./UserIntroEditPage.js").default,
User: require("./UserPage.js").default, UserNameEdit: require("./UserNameEditPage.js").default,
WebView: require("./WebViewPage.js").default, User: require("./UserPage.js").default,
Write: require("./WritePage.js").default WebView: require("./WebViewPage.js").default,
Write: require("./WritePage.js").default
} }

View file

@ -140,7 +140,7 @@ async function syncSplash() {
} }
async function getSelfInfo() { async function getSelfInfo() {
return call('GET', '/users/my'); return callV2('GET', '/users/my');
} }
async function getSelfInfoByStore() { async function getSelfInfoByStore() {
@ -148,7 +148,7 @@ async function getSelfInfoByStore() {
} }
async function getUserInfo(id) { async function getUserInfo(id) {
return call('GET', '/users/' + id) return callV2('GET', '/users/' + id)
} }
async function updateUserIcon(photoUri) { async function updateUserIcon(photoUri) {
@ -267,7 +267,7 @@ async function getMessages() {
} }
async function getMessagesHistory() { async function getMessagesHistory() {
return call('GET', '/tip/history'); return callV2('GET', '/tips/history');
} }
async function deleteMessage(ids) { async function deleteMessage(ids) {
@ -368,11 +368,23 @@ async function getUpdateInfo() {
return callV2('GET', '/updateInfo'); return callV2('GET', '/updateInfo');
} }
async function addUserBlock(user_id) {
return call('POST', `/blocks/${user_id}`);
}
async function deleteUserBlock(user_id) {
return call('DELETE', `/blocks/${user_id}`);
}
async function getBlockUsers() {
return call('GET', `/blocks`);
}
export async function updatePushInfo() { export async function updatePushInfo() {
return callV2('POST', '/push'); return callV2('POST', '/push');
} }
async function upload(method, api, body) { async function upload(method, api, body) {
let token = await Token.getUserToken(); let token = await Token.getUserToken();
let formData = new FormData(); let formData = new FormData();
@ -577,4 +589,8 @@ export default {
getUpdateInfo, getUpdateInfo,
updatePushInfo, updatePushInfo,
addUserBlock,
deleteUserBlock,
getBlockUsers,
} }

View file

@ -7,5 +7,7 @@ export default {
commentPressed: 'commentPressed', commentPressed: 'commentPressed',
passwordUpdated: 'passwordUpdated', passwordUpdated: 'passwordUpdated',
updateNewsRead: 'updateNewsRead', updateNewsRead: 'updateNewsRead',
userInfoUpdated: 'userInfoUpdated' userInfoUpdated: 'userInfoUpdated',
userBlocked: 'userBlocked',
} }