mirror of
https://github.com/timepill/timepill-app.git
synced 2025-04-30 09:59:31 +08:00
Compare commits
12 commits
792c29864d
...
7d1feea76c
Author | SHA1 | Date | |
---|---|---|---|
|
7d1feea76c | ||
|
e9317cbbfa | ||
|
daf7a95b1b | ||
|
33c030934e | ||
|
83e5b55072 | ||
|
6da70b09b1 | ||
|
d169cf348a | ||
|
55a1003c90 | ||
|
2e8c40d119 | ||
|
4bdedaf170 | ||
|
c9c1ceff83 | ||
|
f222c159d9 |
17 changed files with 512 additions and 146 deletions
131
src/component/block/blockUserList.js
Normal file
131
src/component/block/blockUserList.js
Normal 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
|
||||||
|
}
|
||||||
|
});
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
|
@ -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
49
src/page/BlockUserPage.js
Normal 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
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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}) {
|
||||||
|
|
|
@ -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 ? (
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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,
|
||||||
}
|
}
|
|
@ -7,5 +7,7 @@ export default {
|
||||||
commentPressed: 'commentPressed',
|
commentPressed: 'commentPressed',
|
||||||
passwordUpdated: 'passwordUpdated',
|
passwordUpdated: 'passwordUpdated',
|
||||||
updateNewsRead: 'updateNewsRead',
|
updateNewsRead: 'updateNewsRead',
|
||||||
userInfoUpdated: 'userInfoUpdated'
|
userInfoUpdated: 'userInfoUpdated',
|
||||||
|
|
||||||
|
userBlocked: 'userBlocked',
|
||||||
}
|
}
|
Loading…
Reference in a new issue