1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-06-06 22:46:29 +02:00

149 lines
3.9 KiB
JavaScript
Raw Normal View History

2018-03-09 17:49:35 +00:00
const React = require("react");
const Component = React.Component;
const { StyleSheet, Text } = require("react-native");
const Icon = require("react-native-vector-icons/Ionicons").default;
const ReactNativeActionButton = require("react-native-action-button").default;
const { connect } = require("react-redux");
const { globalStyle } = require("lib/components/global-style.js");
const { Log } = require("lib/log.js");
const { _ } = require("lib/locale.js");
2017-05-16 21:05:53 +00:00
const styles = StyleSheet.create({
actionButtonIcon: {
fontSize: 20,
height: 22,
2018-03-09 17:49:35 +00:00
color: "white",
2017-05-16 21:05:53 +00:00
},
2017-07-30 23:04:26 +02:00
itemText: {
// fontSize: 14, // Cannot currently set fontsize since the bow surrounding the label has a fixed size
2018-03-09 17:49:35 +00:00
},
2017-05-16 21:05:53 +00:00
});
class ActionButtonComponent extends React.Component {
2017-07-14 00:35:37 +01:00
constructor() {
super();
this.state = {
2017-07-15 19:21:39 +01:00
buttonIndex: 0,
2017-07-14 00:35:37 +01:00
};
}
2017-07-15 00:12:32 +01:00
componentWillReceiveProps(newProps) {
2018-03-09 17:49:35 +00:00
if ("buttonIndex" in newProps) {
2017-07-15 19:21:39 +01:00
this.setState({ buttonIndex: newProps.buttonIndex });
2017-07-15 00:12:32 +01:00
}
}
2017-05-24 20:51:50 +00:00
newTodo_press() {
this.props.dispatch({
2018-03-09 17:49:35 +00:00
type: "NAV_GO",
routeName: "Note",
2017-05-24 20:51:50 +00:00
noteId: null,
folderId: this.props.parentFolderId,
2018-03-09 17:49:35 +00:00
itemType: "todo",
2017-05-24 20:51:50 +00:00
});
}
2017-05-16 21:05:53 +00:00
newNote_press() {
this.props.dispatch({
2018-03-09 17:49:35 +00:00
type: "NAV_GO",
routeName: "Note",
2017-05-16 21:05:53 +00:00
noteId: null,
folderId: this.props.parentFolderId,
2018-03-09 17:49:35 +00:00
itemType: "note",
2017-05-16 21:05:53 +00:00
});
}
newFolder_press() {
this.props.dispatch({
2018-03-09 17:49:35 +00:00
type: "NAV_GO",
routeName: "Folder",
2017-05-16 21:05:53 +00:00
folderId: null,
});
}
render() {
2017-07-14 00:35:37 +01:00
let buttons = this.props.buttons ? this.props.buttons : [];
2017-05-24 20:51:50 +00:00
2017-07-14 00:35:37 +01:00
if (this.props.addFolderNoteButtons) {
if (this.props.folders.length) {
buttons.push({
2018-03-09 17:49:35 +00:00
title: _("New to-do"),
onPress: () => {
this.newTodo_press();
},
color: "#9b59b6",
icon: "md-checkbox-outline",
2017-07-14 00:35:37 +01:00
});
buttons.push({
2018-03-09 17:49:35 +00:00
title: _("New note"),
onPress: () => {
this.newNote_press();
},
color: "#9b59b6",
icon: "md-document",
2017-07-14 00:35:37 +01:00
});
}
buttons.push({
2018-03-09 17:49:35 +00:00
title: _("New notebook"),
onPress: () => {
this.newFolder_press();
},
color: "#3498db",
icon: "md-folder",
2017-07-14 00:35:37 +01:00
});
}
2017-05-24 20:51:50 +00:00
2017-07-14 00:35:37 +01:00
let buttonComps = [];
for (let i = 0; i < buttons.length; i++) {
let button = buttons[i];
2018-03-09 17:49:35 +00:00
let buttonTitle = button.title ? button.title : "";
let key = buttonTitle.replace(/\s/g, "_") + "_" + button.icon;
2017-07-14 00:35:37 +01:00
buttonComps.push(
<ReactNativeActionButton.Item key={key} buttonColor={button.color} title={buttonTitle} onPress={button.onPress}>
<Icon name={button.icon} style={styles.actionButtonIcon} />
2017-05-16 21:05:53 +00:00
</ReactNativeActionButton.Item>
2017-07-08 23:57:09 +01:00
);
}
2017-05-24 20:51:50 +00:00
2017-07-14 00:35:37 +01:00
if (!buttonComps.length && !this.props.mainButton) {
2018-03-09 17:49:35 +00:00
return <ReactNativeActionButton style={{ display: "none" }} />;
2017-07-14 00:35:37 +01:00
}
let mainButton = this.props.mainButton ? this.props.mainButton : {};
2018-03-09 17:49:35 +00:00
let mainIcon = mainButton.icon ? <Icon name={mainButton.icon} style={styles.actionButtonIcon} /> : <Icon name="md-add" style={styles.actionButtonIcon} />;
2017-07-14 00:35:37 +01:00
2017-07-15 19:21:39 +01:00
if (this.props.multiStates) {
2018-03-09 17:49:35 +00:00
if (!this.props.buttons || !this.props.buttons.length) throw new Error("Multi-state button requires at least one state");
if (this.state.buttonIndex < 0 || this.state.buttonIndex >= this.props.buttons.length) throw new Error("Button index out of bounds: " + this.state.buttonIndex + "/" + this.props.buttons.length);
2017-07-15 19:21:39 +01:00
let button = this.props.buttons[this.state.buttonIndex];
2018-03-09 17:49:35 +00:00
let mainIcon = <Icon name={button.icon} style={styles.actionButtonIcon} />;
2017-07-14 00:35:37 +01:00
return (
<ReactNativeActionButton
icon={mainIcon}
buttonColor="rgba(231,76,60,1)"
2018-03-09 17:49:35 +00:00
onPress={() => {
button.onPress();
}}
2017-07-14 00:35:37 +01:00
/>
);
} else {
return (
2018-03-09 17:49:35 +00:00
<ReactNativeActionButton textStyle={styles.itemText} icon={mainIcon} buttonColor="rgba(231,76,60,1)" onPress={function() {}}>
{buttonComps}
2017-07-14 00:35:37 +01:00
</ReactNativeActionButton>
);
}
2017-05-16 21:05:53 +00:00
}
}
2018-03-09 17:49:35 +00:00
const ActionButton = connect(state => {
return {
folders: state.folders,
locale: state.settings.locale,
};
})(ActionButtonComponent);
2017-05-16 21:05:53 +00:00
2018-03-09 17:49:35 +00:00
module.exports = { ActionButton };