2020-09-24 09:51:15 +05:00
|
|
|
import React, {Fragment, useEffect, useState} from 'react';
|
2020-09-07 12:33:35 +05:00
|
|
|
import {
|
|
|
|
|
Modal,
|
2020-09-24 09:51:15 +05:00
|
|
|
Platform,
|
2020-09-07 12:33:35 +05:00
|
|
|
StyleSheet,
|
|
|
|
|
Text,
|
|
|
|
|
TouchableOpacity,
|
|
|
|
|
View,
|
|
|
|
|
} from 'react-native';
|
2020-09-24 09:51:15 +05:00
|
|
|
import FileViewer from 'react-native-file-viewer';
|
2020-09-07 12:33:35 +05:00
|
|
|
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
|
2020-10-12 17:49:03 +05:00
|
|
|
import RNFetchBlob from 'rn-fetch-blob';
|
2020-09-07 12:33:35 +05:00
|
|
|
import {opacity, ph, pv, SIZE, WEIGHT} from '../../common/common';
|
|
|
|
|
import {useTracked} from '../../provider';
|
2020-09-24 09:51:15 +05:00
|
|
|
import storage from '../../utils/storage';
|
2020-10-12 17:49:03 +05:00
|
|
|
import {DDS, getElevation, sleep, ToastEvent} from '../../utils/utils';
|
2020-09-24 09:51:15 +05:00
|
|
|
import {Button} from '../Button/index';
|
2020-09-27 13:05:26 +05:00
|
|
|
import BaseDialog from '../Dialog/base-dialog';
|
|
|
|
|
import DialogHeader from '../Dialog/dialog-header';
|
2020-09-07 12:33:35 +05:00
|
|
|
import {Loading} from '../Loading';
|
2020-09-24 09:51:15 +05:00
|
|
|
import Seperator from '../Seperator';
|
2020-09-20 14:37:46 +05:00
|
|
|
|
2020-09-07 12:33:35 +05:00
|
|
|
const {
|
|
|
|
|
eSubscribeEvent,
|
|
|
|
|
eUnSubscribeEvent,
|
|
|
|
|
} = require('../../services/eventManager');
|
|
|
|
|
const {
|
|
|
|
|
eOpenExportDialog,
|
|
|
|
|
eCloseExportDialog,
|
|
|
|
|
} = require('../../services/events');
|
|
|
|
|
|
|
|
|
|
const ExportDialog = () => {
|
|
|
|
|
const [state, dispatch] = useTracked();
|
|
|
|
|
const {colors, tags, premiumUser} = state;
|
2020-09-10 10:19:36 +05:00
|
|
|
const [visible, setVisible] = useState(false);
|
2020-09-07 12:33:35 +05:00
|
|
|
const [notes, setNotes] = useState([]);
|
|
|
|
|
const [exporting, setExporting] = useState(false);
|
|
|
|
|
const [complete, setComplete] = useState(false);
|
2020-09-20 14:37:46 +05:00
|
|
|
const [doneText, setDoneText] = useState(null);
|
2020-09-20 15:05:16 +05:00
|
|
|
const [result, setResult] = useState({});
|
2020-09-07 12:33:35 +05:00
|
|
|
useEffect(() => {
|
|
|
|
|
eSubscribeEvent(eOpenExportDialog, open);
|
|
|
|
|
eSubscribeEvent(eCloseExportDialog, close);
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
eUnSubscribeEvent(eOpenExportDialog, open);
|
|
|
|
|
eUnSubscribeEvent(eCloseExportDialog, close);
|
|
|
|
|
};
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const open = (data) => {
|
|
|
|
|
setVisible(true);
|
|
|
|
|
setNotes(data);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const close = (data) => {
|
|
|
|
|
setComplete(false);
|
|
|
|
|
setExporting(false);
|
|
|
|
|
setVisible(false);
|
2020-09-20 14:37:46 +05:00
|
|
|
setNotes([]);
|
|
|
|
|
};
|
|
|
|
|
|
2020-09-20 15:40:19 +05:00
|
|
|
const save = async (func, name) => {
|
2020-09-20 15:05:16 +05:00
|
|
|
setExporting(true);
|
|
|
|
|
let res;
|
|
|
|
|
for (var i = 0; i < notes.length; i++) {
|
|
|
|
|
let note = notes[i];
|
|
|
|
|
res = await func(note);
|
|
|
|
|
if (!res) {
|
|
|
|
|
setExporting(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
setDoneText(
|
|
|
|
|
`Note exported successfully! You can find the exported note in ${
|
|
|
|
|
Platform.OS === 'ios'
|
|
|
|
|
? 'Files Manager/Notesnook'
|
|
|
|
|
: `Storage/Notesnook/exported/${name}`
|
|
|
|
|
}.`,
|
|
|
|
|
);
|
2020-09-20 15:40:19 +05:00
|
|
|
|
|
|
|
|
setResult(res);
|
2020-09-20 15:05:16 +05:00
|
|
|
setComplete(true);
|
2020-09-07 12:33:35 +05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const actions = [
|
|
|
|
|
{
|
|
|
|
|
title: 'PDF',
|
2020-09-20 14:37:46 +05:00
|
|
|
func: async () => {
|
2020-10-12 17:49:03 +05:00
|
|
|
|
2020-09-20 15:40:19 +05:00
|
|
|
await save(storage.saveToPDF, 'PDF');
|
2020-09-20 14:37:46 +05:00
|
|
|
},
|
2020-09-07 12:33:35 +05:00
|
|
|
icon: 'file-pdf-box',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Markdown',
|
2020-09-20 15:05:16 +05:00
|
|
|
func: async () => {
|
2020-09-20 15:40:19 +05:00
|
|
|
await save(storage.saveToMarkdown, 'Markdown');
|
2020-09-20 15:05:16 +05:00
|
|
|
},
|
2020-09-07 12:33:35 +05:00
|
|
|
icon: 'language-markdown',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Plain Text',
|
2020-09-20 15:05:16 +05:00
|
|
|
func: async () => {
|
2020-09-20 15:40:19 +05:00
|
|
|
await save(storage.saveToText, 'Text');
|
2020-09-20 15:05:16 +05:00
|
|
|
},
|
2020-09-07 12:33:35 +05:00
|
|
|
icon: 'card-text',
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'HTML',
|
2020-09-20 15:05:16 +05:00
|
|
|
func: async () => {
|
2020-09-20 15:40:19 +05:00
|
|
|
await save(storage.saveToHTML, 'Html');
|
2020-09-20 15:05:16 +05:00
|
|
|
},
|
2020-09-07 12:33:35 +05:00
|
|
|
icon: 'language-html5',
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return (
|
2020-09-27 13:05:26 +05:00
|
|
|
<BaseDialog onRequestClose={close} visible={visible}>
|
|
|
|
|
<View
|
|
|
|
|
style={[
|
|
|
|
|
{
|
2020-10-04 09:46:50 +05:00
|
|
|
width: DDS.isTab ? 350 : '80%',
|
2020-09-27 13:05:26 +05:00
|
|
|
backgroundColor: colors.bg,
|
|
|
|
|
},
|
|
|
|
|
styles.container,
|
|
|
|
|
]}>
|
2020-09-27 13:14:24 +05:00
|
|
|
<DialogHeader
|
|
|
|
|
icon="export"
|
|
|
|
|
title="Export Note"
|
|
|
|
|
paragraph={
|
|
|
|
|
exporting
|
|
|
|
|
? null
|
|
|
|
|
: 'Export your note in any of the following formats.'
|
|
|
|
|
}
|
|
|
|
|
/>
|
2020-09-20 14:37:46 +05:00
|
|
|
|
2020-09-27 13:05:26 +05:00
|
|
|
<Seperator half />
|
|
|
|
|
{exporting ? (
|
|
|
|
|
<Loading
|
|
|
|
|
done={complete}
|
|
|
|
|
doneText={doneText}
|
2020-10-12 17:49:03 +05:00
|
|
|
onDone={async () => {
|
|
|
|
|
close();
|
|
|
|
|
await sleep(500);
|
2020-09-27 13:05:26 +05:00
|
|
|
FileViewer.open(result.filePath, {
|
|
|
|
|
showOpenWithDialog: true,
|
|
|
|
|
showAppsSuggestions: true,
|
|
|
|
|
}).catch((e) => {
|
|
|
|
|
console.log(e);
|
|
|
|
|
ToastEvent.show(
|
|
|
|
|
`No application found to open ${result.name} file`,
|
|
|
|
|
);
|
|
|
|
|
});
|
2020-10-12 17:49:03 +05:00
|
|
|
|
2020-09-27 13:05:26 +05:00
|
|
|
}}
|
|
|
|
|
tagline="Exporting notes"
|
|
|
|
|
/>
|
|
|
|
|
) : (
|
|
|
|
|
<>
|
|
|
|
|
<View style={styles.buttonContainer}>
|
|
|
|
|
{actions.map((item) => (
|
|
|
|
|
<Fragment key={item.title}>
|
|
|
|
|
<Seperator half />
|
|
|
|
|
<Button
|
|
|
|
|
width="100%"
|
|
|
|
|
title={item.title}
|
|
|
|
|
icon={item.icon}
|
|
|
|
|
activeOpacity={opacity}
|
|
|
|
|
onPress={item.func}
|
|
|
|
|
/>
|
|
|
|
|
</Fragment>
|
|
|
|
|
))}
|
|
|
|
|
</View>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
2020-09-07 12:33:35 +05:00
|
|
|
</View>
|
2020-09-27 13:05:26 +05:00
|
|
|
</BaseDialog>
|
2020-09-07 12:33:35 +05:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
|
container: {
|
|
|
|
|
...getElevation(5),
|
|
|
|
|
maxHeight: 350,
|
|
|
|
|
borderRadius: 5,
|
|
|
|
|
paddingHorizontal: ph,
|
|
|
|
|
paddingVertical: pv,
|
|
|
|
|
},
|
|
|
|
|
buttonContainer: {
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
},
|
|
|
|
|
button: {
|
|
|
|
|
paddingVertical: pv,
|
|
|
|
|
paddingHorizontal: ph,
|
|
|
|
|
marginTop: 10,
|
|
|
|
|
borderRadius: 5,
|
|
|
|
|
width: '100%',
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
borderWidth: 1,
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
},
|
|
|
|
|
buttonText: {
|
|
|
|
|
fontFamily: WEIGHT.medium,
|
|
|
|
|
color: 'white',
|
|
|
|
|
fontSize: SIZE.sm,
|
|
|
|
|
marginLeft: 5,
|
|
|
|
|
},
|
|
|
|
|
overlay: {
|
|
|
|
|
width: '100%',
|
|
|
|
|
height: '100%',
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export default ExportDialog;
|