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
< / R e a c t N a t i v e A c t i o n B u t t o n . I t e m >
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
< / R e a c t N a t i v e A c t i o n B u t t o n >
) ;
}
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 } ;