import Clipboard from '@react-native-clipboard/clipboard'; import React, { useEffect, useRef, useState } from 'react'; import { ActivityIndicator, TouchableOpacity, View } from 'react-native'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { useThemeStore } from '../../../stores/use-theme-store'; import { useAttachmentStore } from '../../../stores/use-attachment-store'; import { eSubscribeEvent, eUnSubscribeEvent, ToastEvent } from '../../../services/event-manager'; import Navigation from '../../../services/navigation'; import { db } from '../../../utils/database'; import { eClosePublishNoteDialog, eOpenPublishNoteDialog } from '../../../utils/events'; import { openLinkInBrowser } from '../../../utils/functions'; import { SIZE } from '../../../utils/size'; import DialogHeader from '../../dialog/dialog-header'; import { Button } from '../../ui/button'; import { IconButton } from '../../ui/icon-button'; import Input from '../../ui/input'; import Seperator from '../../ui/seperator'; import SheetWrapper from '../../ui/sheet'; import Heading from '../../ui/typography/heading'; import Paragraph from '../../ui/typography/paragraph'; import SearchService from '../../../services/search'; let passwordValue = null; const PublishNoteSheet = () => { const colors = useThemeStore(state => state.colors); const [visible, setVisible] = useState(false); const actionSheetRef = useRef(); const loading = useAttachmentStore(state => state.loading); const [selfDestruct, setSelfDestruct] = useState(false); const [isLocked, setIsLocked] = useState(false); const [note, setNote] = useState(null); const [publishing, setPublishing] = useState(false); const publishUrl = note && `https://monograph.notesnook.com/${db?.monographs.monograph(note?.id)}`; const isPublished = note && db?.monographs.isPublished(note?.id); const pwdInput = useRef(); useEffect(() => { eSubscribeEvent(eOpenPublishNoteDialog, open); eSubscribeEvent(eClosePublishNoteDialog, close); return () => { eUnSubscribeEvent(eOpenPublishNoteDialog, open); eUnSubscribeEvent(eClosePublishNoteDialog, close); }; }, []); const open = item => { setNote(item); setPublishing(false); setSelfDestruct(false); setIsLocked(false); setVisible(true); passwordValue = null; }; useEffect(() => { if (visible) { actionSheetRef.current?.show(); } }, [visible]); const close = () => { passwordValue = null; actionSheetRef.current?.hide(); }; const publishNote = async () => { if (publishing) return; setPublishing(true); try { if (note?.id) { if (isLocked && !passwordValue) return; await db.monographs.publish(note.id, { selfDestruct: selfDestruct, password: isLocked && passwordValue }); setNote(db.notes.note(note.id)?.data); Navigation.queueRoutesForUpdate( 'Notes', 'Favorites', 'ColoredNotes', 'TaggedNotes', 'TopicNotes' ); } } catch (e) { ToastEvent.show({ heading: 'Could not publish note', message: e.message, type: 'error', context: 'local' }); } setPublishing(false); }; const deletePublishedNote = async () => { if (publishing) return; setPublishing(true); try { if (note?.id) { await db.monographs.unpublish(note.id); setNote(db.notes.note(note.id)?.data); Navigation.queueRoutesForUpdate( 'Notes', 'Favorites', 'ColoredNotes', 'TaggedNotes', 'TopicNotes' ); } } catch (e) { ToastEvent.show({ heading: 'Could not unpublish note', message: e.message, type: 'error', context: 'local' }); } actionSheetRef.current?.hide(); setPublishing(false); }; return !visible ? null : ( { passwordValue = null; setVisible(false); }} > {publishing ? ( Please wait... {loading && `\nDownloading attachments (${loading?.current / loading?.total})`} ) : ( <> {isPublished && ( Published at: {publishUrl} { try { await openLinkInBrowser(publishUrl, colors.accent); } catch (e) {} }} size={SIZE.xs} style={{ marginTop: 5, color: colors.pri }} > Open in browser { Clipboard.setString(publishUrl); ToastEvent.show({ heading: 'Note publish url copied', type: 'success', context: 'local' }); }} color={colors.accent} size={SIZE.lg} name="content-copy" /> )} { if (publishing) return; setIsLocked(!isLocked); }} activeOpacity={0.9} style={{ flexDirection: 'row', alignItems: 'center', marginBottom: 10 }} > { if (publishing) return; setIsLocked(!isLocked); }} color={isLocked ? colors.accent : colors.icon} size={SIZE.lg} name={isLocked ? 'check-circle-outline' : 'checkbox-blank-circle-outline'} /> Password protection Published note can only be viewed by someone with the password. { setSelfDestruct(!selfDestruct); }} activeOpacity={0.9} style={{ flexDirection: 'row', alignItems: 'center' }} > { setSelfDestruct(!selfDestruct); }} color={selfDestruct ? colors.accent : colors.icon} size={SIZE.lg} name={selfDestruct ? 'check-circle-outline' : 'checkbox-blank-circle-outline'} /> Self destruct Published note link will be automatically deleted once it is viewed by someone. {isLocked ? ( <> (passwordValue = value)} blurOnSubmit secureTextEntry defaultValue={passwordValue} placeholder="Enter Password" /> ) : null}