const React = require("react");
const Component = React.Component;
const { TouchableOpacity, Button, Text, Image, StyleSheet, ScrollView, View } = require("react-native");
const { connect } = require("react-redux");
const Icon = require("react-native-vector-icons/Ionicons").default;
const { Log } = require("lib/log.js");
const Tag = require("lib/models/Tag.js");
const Note = require("lib/models/Note.js");
const Folder = require("lib/models/Folder.js");
const Setting = require("lib/models/Setting.js");
const { FoldersScreenUtils } = require("lib/folders-screen-utils.js");
const { Synchronizer } = require("lib/synchronizer.js");
const { reg } = require("lib/registry.js");
const { _ } = require("lib/locale.js");
const { globalStyle, themeStyle } = require("lib/components/global-style.js");
const shared = require("lib/components/shared/side-menu-shared.js");
class SideMenuContentComponent extends Component {
constructor() {
super();
this.state = {
syncReportText: "",
//width: 0,
};
this.styles_ = {};
}
styles() {
const theme = themeStyle(this.props.theme);
if (this.styles_[this.props.theme]) return this.styles_[this.props.theme];
this.styles_ = {};
let styles = {
menu: {
flex: 1,
backgroundColor: theme.backgroundColor,
borderTopWidth: 1,
borderTopColor: theme.dividerColor,
},
button: {
flex: 1,
flexDirection: "row",
height: 36,
alignItems: "center",
paddingLeft: theme.marginLeft,
paddingRight: theme.marginRight,
},
buttonText: {
flex: 1,
color: theme.color,
paddingLeft: 10,
fontSize: theme.fontSize,
},
syncStatus: {
paddingLeft: theme.marginLeft,
paddingRight: theme.marginRight,
color: theme.colorFaded,
fontSize: theme.fontSizeSmaller,
},
tagItemList: {
flex: 1,
flexDirection: "row",
flexWrap: "wrap",
},
};
styles.folderButton = Object.assign({}, styles.button);
styles.folderButtonText = Object.assign({}, styles.buttonText);
styles.folderButtonSelected = Object.assign({}, styles.folderButton);
styles.folderButtonSelected.backgroundColor = theme.selectedColor;
styles.folderIcon = Object.assign({}, theme.icon);
styles.folderIcon.color = "#0072d5";
styles.tagButton = Object.assign({}, styles.button);
styles.tagButtonSelected = Object.assign({}, styles.tagButton);
styles.tagButtonSelected.backgroundColor = theme.selectedColor;
styles.tagButtonSelected.borderRadius = 1000;
styles.tagButtonText = Object.assign({}, styles.buttonText);
styles.tagButtonText.flex = 0;
styles.syncButton = Object.assign({}, styles.button);
styles.syncButtonText = Object.assign({}, styles.buttonText);
this.styles_[this.props.theme] = StyleSheet.create(styles);
return this.styles_[this.props.theme];
}
folder_press(folder) {
this.props.dispatch({ type: "SIDE_MENU_CLOSE" });
this.props.dispatch({
type: "NAV_GO",
routeName: "Notes",
folderId: folder.id,
});
}
tag_press(tag) {
this.props.dispatch({ type: "SIDE_MENU_CLOSE" });
this.props.dispatch({
type: "NAV_GO",
routeName: "Notes",
tagId: tag.id,
});
}
async synchronize_press() {
const actionDone = await shared.synchronize_press(this);
if (actionDone === "auth") this.props.dispatch({ type: "SIDE_MENU_CLOSE" });
}
folderItem(folder, selected) {
const iconComp = selected ? : ;
const folderButtonStyle = selected ? this.styles().folderButtonSelected : this.styles().folderButton;
return (
{
this.folder_press(folder);
}}
>
{iconComp}
{Folder.displayTitle(folder)}
);
}
tagItem(tag, selected) {
const iconComp = ;
const tagButtonStyle = selected ? this.styles().tagButtonSelected : this.styles().tagButton;
return (
{
this.tag_press(tag);
}}
>
{iconComp}
{Tag.displayTitle(tag)}
);
}
synchronizeButton(state) {
const title = state == "sync" ? _("Synchronise") : _("Cancel synchronisation");
const iconComp = state == "sync" ? : ;
return (
{
this.synchronize_press();
}}
>
{iconComp}
{title}
);
}
makeDivider(key) {
return ;
}
render() {
let items = [];
const theme = themeStyle(this.props.theme);
// HACK: inner height of ScrollView doesn't appear to be calculated correctly when
// using padding. So instead creating blank elements for padding bottom and top.
items.push();
if (this.props.folders.length) {
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
items = items.concat(folderItems);
if (items.length) items.push(this.makeDivider("divider_1"));
}
if (this.props.tags.length) {
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
items.push(
{tagItems}
);
if (tagItems.length) items.push(this.makeDivider("divider_2"));
}
let lines = Synchronizer.reportToLines(this.props.syncReport);
while (lines.length < 10) lines.push(""); // Add blank lines so that height of report text is fixed and doesn't affect scrolling
const syncReportText = lines.join("\n");
items.push(this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync"));
items.push(
{syncReportText}
);
items.push();
let style = {
flex: 1,
borderRightWidth: 1,
borderRightColor: globalStyle.dividerColor,
backgroundColor: theme.backgroundColor,
};
return (
{items}
);
}
}
const SideMenuContent = connect(state => {
return {
folders: state.folders,
tags: state.tags,
syncStarted: state.syncStarted,
syncReport: state.syncReport,
selectedFolderId: state.selectedFolderId,
selectedTagId: state.selectedTagId,
notesParentType: state.notesParentType,
locale: state.settings.locale,
theme: state.settings.theme,
opacity: state.sideMenuOpenPercent,
};
})(SideMenuContentComponent);
module.exports = { SideMenuContent };