import * as React from 'react'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { _, _n } from '@joplin/lib/locale'; import Note from '@joplin/lib/models/Note'; import DialogButtonRow from './DialogButtonRow'; import Dialog from '@joplin/lib/components/Dialog'; import DialogTitle from './DialogTitle'; import ShareService from '@joplin/lib/services/share/ShareService'; import { StateShare } from '@joplin/lib/services/share/reducer'; import { NoteEntity } from '@joplin/lib/services/database/types'; import Button from './Button/Button'; import { connect } from 'react-redux'; import { AppState } from '../app.reducer'; import SyncTargetRegistry from '@joplin/lib/SyncTargetRegistry'; import useOnShareLinkClick from '@joplin/lib/components/shared/ShareNoteDialog/useOnShareLinkClick'; import onUnshareNoteClick from '@joplin/lib/components/shared/ShareNoteDialog/onUnshareNoteClick'; import useShareStatusMessage from '@joplin/lib/components/shared/ShareNoteDialog/useShareStatusMessage'; import useEncryptionWarningMessage from '@joplin/lib/components/shared/ShareNoteDialog/useEncryptionWarningMessage'; import { SharingStatus } from '@joplin/lib/components/shared/ShareNoteDialog/types'; import useIsPublished from '@joplin/lib/components/shared/ShareNoteDialog/useIsPublished'; import { clipboard } from 'electron'; interface Props { themeId: number; noteIds: string[]; onClose: ()=> void; shares: StateShare[]; syncTargetId: number; } export function ShareNoteDialog(props: Props) { const [notes, setNotes] = useState([]); const [recursiveShare, setRecursiveShare] = useState(false); const [sharesState, setSharesState] = useState(SharingStatus.Unknown); const syncTargetInfo = useMemo(() => SyncTargetRegistry.infoById(props.syncTargetId), [props.syncTargetId]); const noteCount = notes.length; useEffect(() => { void ShareService.instance().refreshShares(); }, []); useEffect(() => { async function fetchNotes() { const result = []; for (const noteId of props.noteIds) { result.push(await Note.load(noteId)); } setNotes(result); } void fetchNotes(); }, [props.noteIds]); const buttonRow_click = () => { props.onClose(); }; const onCopyLinks = useCallback((links: string[]) => { clipboard.writeText(links.join('\n')); }, []); const shareLinkButton_click = useOnShareLinkClick({ setSharesState, onShareUrlsReady: onCopyLinks, notes, recursiveShare, }); const renderNoteList = (notes: NoteEntity[]) => { const noteComps = []; for (const note of notes) { noteComps.push(); } return
{noteComps}
; }; const statusMessage = useShareStatusMessage({ sharesState, noteCount }); const encryptionWarning = useEncryptionWarningMessage(); function renderEncryptionWarningMessage() { if (!encryptionWarning) return null; return
{encryptionWarning}
; } const onRecursiveShareChange = useCallback(() => { setRecursiveShare(v => !v); }, []); const renderRecursiveShareCheckbox = () => { if (!syncTargetInfo.supportsRecursiveLinkedNotes) return null; return (
); }; const renderContent = () => { return (
{renderNoteList(notes)} {renderRecursiveShareCheckbox()}
{statusMessage}
{renderEncryptionWarningMessage()}
); }; return ( {renderContent()} ); } interface NoteItemProps { note: NoteEntity; shares: StateShare[]; } const NoteItem: React.FC = ({ note, shares }) => { const published = useIsPublished(note, shares); const unshareButton = published && (