增加合并日记本功能

This commit is contained in:
mx1700 2019-08-25 21:40:53 +08:00
parent d1ebc9e9b9
commit afaee92fff
5 changed files with 190 additions and 21 deletions

View file

@ -13,6 +13,7 @@ import {Navigation} from 'react-native-navigation';
import Api from '../../util/api';
import Notebook from './notebook'
import NotebookAdd from './notebookAdd'
import {Icon} from "../../style/icon";
export default class NotebookList extends Component {
@ -72,6 +73,11 @@ export default class NotebookList extends Component {
}
_onNotebookPress(notebook) {
if(this.props.onPress) {
this.props.onPress(notebook);
return
}
Navigation.push(this.props.componentId, {
component: {
name: 'NotebookDetail',
@ -102,6 +108,10 @@ export default class NotebookList extends Component {
notebooks.unshift({id: 'new'});
}
if(this.props.filter) {
notebooks = notebooks.filter(this.props.filter);
}
let groups = this.createGroup(notebooks, this.itemsPerRow);
this.setState({
notebooks: groups

View file

@ -172,6 +172,26 @@ export default class NotebookEditPage extends Component {
});
}
openMargePage() {
Navigation.push(this.props.componentId, {
component: {
name: 'NotebookMerge',
passProps: {
notebook: this.props.notebook
},
options: {
bottomTabs: {
visible: false,
// hide bottom tab for android
drawBehind: true,
animate: true
}
}
}
});
}
render() {
const tip = this.props.notebook ? (
<View style={{padding: 15}}>
@ -241,7 +261,16 @@ export default class NotebookEditPage extends Component {
onPress={this._onEditCover.bind(this)}>
<Text style={localStyle.editCover}>设置封面</Text>
</TouchableOpacity>
{(this.state.notebook.isExpired) && (
<>
<View style={localStyle.line} />
<TouchableOpacity style={localStyle.item} onPress={this.openMargePage.bind(this)}>
<Text style={localStyle.editCover}>合并日记本</Text>
</TouchableOpacity>
</>
)}
</View>
<View style={localStyle.group}>
<TouchableOpacity style={localStyle.item}
onPress={this._onDelete.bind(this)}>

View file

@ -0,0 +1,125 @@
import {Component} from "react";
import UserBooks from "../component/notebook/notebookList";
import {ActivityIndicator, Alert, Animated, DeviceEventEmitter, Easing, Modal, Platform, View} from "react-native";
import React from "react";
import Api from '../util/api';
import colors from '../style/color';
import Toast from "react-native-root-toast";
import Event from "../util/event";
import {Navigation} from "react-native-navigation";
export default class NotebookMergePage extends Component {
constructor(props) {
super(props);
this.state = {
loading: false
}
}
static options(passProps) {
return {
topBar: {
title: {
text: '合并日记本'
},
backButton: {
title: passProps.backTitle ? passProps.backTitle : '返回'
}
},
bottomTabs: {
visible: false,
// hide bottom tab for android
drawBehind: true,
animate: true
}
};
}
componentDidMount() {
(async() => {
let user = await Api.getSelfInfoByStore();
this.setState({user: user});
})()
}
onPress = (book) => {
Alert.alert('提示', '确认将《' + book.subject + '》合并到当前日记本?',[
{text: '确认合并', style: 'destructive', onPress: () => this.margeBooks(book)},
{text: '取消', onPress: () => console.log('OK Pressed!')},
]);
};
margeBooks = async (book) => {
this.setState({loading: true});
let err = null;
try {
await Api.margeNotebook(book.id, this.props.notebook.id);
} catch (e) {
err = e.message;
}
this.setState({loading: false});
if (err) {
let msg = "合并失败" + "\n" + err;
Toast.show(msg, {
duration: 2000,
position: 250,
shadow: false,
hideOnPress: true,
});
} else {
DeviceEventEmitter.emit(Event.updateNotebooks);
Toast.show("合并完成", {
duration: 2000,
position: 250,
shadow: false,
hideOnPress: true,
});
Navigation.popToRoot(this.props.componentId);
}
};
closeModal() {
Animated.parallel([
Animated.timing(
this.state.fadeAnimOpacity,
{toValue: 0, duration: 350, easing: Easing.out(Easing.cubic)}
),
Animated.timing(
this.state.fadeAnimHeight,
{toValue: 0, duration: 350, easing: Easing.out(Easing.cubic)}
)
]).start(() => {
this.setState({modalVisible: false});
});
}
render() {
if(!this.state.user) {
return null;
}
return (
<View style={{flex: 1, backgroundColor: "white"}}>
<Modal
visible={this.state.loading}
transparent={true}
onRequestClose={() => {}}>
<View style={{ flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "rgba(255, 255, 255, 0.8)" }}>
<ActivityIndicator animating={true} color={colors.light} size={Platform.OS === 'android' ? 'large' : 'small'}/>
</View>
</Modal>
<UserBooks
user={this.state.user}
// userId={this.props.notebook.user_id}
// mySelf={true}
// showAdd={false}
filter={(book) => book.isExpired && book.id !== this.props.notebook.id}
onPress={this.onPress}
/>
</View>
);
}
}

View file

@ -8,6 +8,7 @@ FollowUser: require("./FollowUserPage.js").default,
Home: require("./HomePage.js").default,
NotebookDetail: require("./NotebookDetailPage.js").default,
NotebookEdit: require("./NotebookEditPage.js").default,
NotebookMerge: require("./NotebookMergePage.js").default,
NotificationHistory: require("./NotificationHistoryPage.js").default,
Notification: require("./NotificationPage.js").default,
Password: require("./PasswordPage.js").default,

View file

@ -349,6 +349,9 @@ async function deleteNotebook(id) {
return call('DELETE', '/notebooks/' + id)
}
async function margeNotebook(from, to) {
return callV2('POST', `/notebooks/${from}/marge_to/${to}`);
}
async function report(user_id, diary_id) {
return call('POST', '/reports/', {
@ -567,6 +570,7 @@ export default {
createNotebook,
updateNotebook,
deleteNotebook,
margeNotebook,
report,
feedback,