1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-27 10:32:58 +02:00
joplin/ReactNativeClient/lib/components/action-button.js

134 lines
3.6 KiB
JavaScript
Raw Normal View History

2019-07-29 15:43:53 +02:00
const React = require('react');
2019-07-29 15:58:33 +02:00
const { StyleSheet } = require('react-native');
const Note = require('lib/models/Note');
const Icon = require('react-native-vector-icons/Ionicons').default;
const ReactNativeActionButton = require('react-native-action-button').default;
const { connect } = require('react-redux');
const { _ } = require('lib/locale.js');
2017-05-16 23:05:53 +02:00
2020-02-09 16:51:12 +02:00
Icon.loadFont();
2017-05-16 23:05:53 +02:00
const styles = StyleSheet.create({
actionButtonIcon: {
fontSize: 20,
height: 22,
color: 'white',
2017-05-16 23:05:53 +02: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
2019-07-29 15:43:53 +02:00
},
2017-05-16 23:05:53 +02:00
});
class ActionButtonComponent extends React.Component {
2017-07-14 01:35:37 +02:00
constructor() {
super();
this.state = {
2017-07-15 20:21:39 +02:00
buttonIndex: 0,
2017-07-14 01:35:37 +02:00
};
}
UNSAFE_componentWillReceiveProps(newProps) {
if ('buttonIndex' in newProps) {
2017-07-15 20:21:39 +02:00
this.setState({ buttonIndex: newProps.buttonIndex });
2017-07-15 01:12:32 +02:00
}
}
async newNoteNavigate(folderId, isTodo) {
const newNote = await Note.save({
parent_id: folderId,
is_todo: isTodo ? 1 : 0,
}, { provisional: true });
2017-05-24 22:51:50 +02:00
this.props.dispatch({
type: 'NAV_GO',
routeName: 'Note',
noteId: newNote.id,
2017-05-24 22:51:50 +02:00
});
}
newTodo_press() {
this.newNoteNavigate(this.props.parentFolderId, true);
}
2017-05-16 23:05:53 +02:00
newNote_press() {
this.newNoteNavigate(this.props.parentFolderId, false);
2017-05-16 23:05:53 +02:00
}
render() {
const buttons = this.props.buttons ? this.props.buttons : [];
2017-05-24 22:51:50 +02:00
2017-07-14 01:35:37 +02:00
if (this.props.addFolderNoteButtons) {
if (this.props.folders.length) {
buttons.push({
title: _('New to-do'),
2019-07-29 15:43:53 +02:00
onPress: () => {
this.newTodo_press();
},
color: '#9b59b6',
icon: 'md-checkbox-outline',
2017-07-14 01:35:37 +02:00
});
buttons.push({
title: _('New note'),
2019-07-29 15:43:53 +02:00
onPress: () => {
this.newNote_press();
},
color: '#9b59b6',
icon: 'md-document',
2017-07-14 01:35:37 +02:00
});
}
}
2017-05-24 22:51:50 +02:00
const buttonComps = [];
2017-07-14 01:35:37 +02:00
for (let i = 0; i < buttons.length; i++) {
const button = buttons[i];
const buttonTitle = button.title ? button.title : '';
const key = `${buttonTitle.replace(/\s/g, '_')}_${button.icon}`;
2017-07-14 01:35:37 +02: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 23:05:53 +02:00
</ReactNativeActionButton.Item>
2017-07-09 00:57:09 +02:00
);
}
2017-05-24 22:51:50 +02:00
2017-07-14 01:35:37 +02:00
if (!buttonComps.length && !this.props.mainButton) {
2019-07-29 15:43:53 +02:00
return <ReactNativeActionButton style={{ display: 'none' }} />;
2017-07-14 01:35:37 +02:00
}
const mainButton = this.props.mainButton ? this.props.mainButton : {};
const mainIcon = mainButton.icon ? <Icon name={mainButton.icon} style={styles.actionButtonIcon} /> : <Icon name="md-add" style={styles.actionButtonIcon} />;
2017-07-14 01:35:37 +02:00
2017-07-15 20:21:39 +02:00
if (this.props.multiStates) {
if (!this.props.buttons || !this.props.buttons.length) throw new Error('Multi-state button requires at least one state');
2019-09-19 23:51:18 +02:00
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}`);
const button = this.props.buttons[this.state.buttonIndex];
const mainIcon = <Icon name={button.icon} style={styles.actionButtonIcon} />;
2017-07-14 01:35:37 +02:00
return (
<ReactNativeActionButton
icon={mainIcon}
buttonColor="rgba(231,76,60,1)"
2019-07-29 15:43:53 +02:00
onPress={() => {
button.onPress();
}}
2017-07-14 01:35:37 +02:00
/>
);
} else {
return (
2019-07-29 15:43:53 +02:00
<ReactNativeActionButton textStyle={styles.itemText} icon={mainIcon} buttonColor="rgba(231,76,60,1)" onPress={function() {}}>
{buttonComps}
2017-07-14 01:35:37 +02:00
</ReactNativeActionButton>
);
}
2017-05-16 23:05:53 +02:00
}
}
const ActionButton = connect(state => {
2019-07-29 15:43:53 +02:00
return {
folders: state.folders,
locale: state.settings.locale,
};
})(ActionButtonComponent);
2017-05-16 23:05:53 +02:00
2019-07-29 15:43:53 +02:00
module.exports = { ActionButton };