// Dialog allowing the user to update/create links const React = require('react'); const { useState, useEffect, useMemo, useRef } = require('react'); const { StyleSheet } = require('react-native'); const { View, Text, TextInput, Button } = require('react-native'); import Modal from '../Modal'; import { themeStyle } from '@joplin/lib/theme'; import { _ } from '@joplin/lib/locale'; import { EditorControl } from './types'; import { useCallback } from 'react'; import SelectionFormatting from '@joplin/editor/SelectionFormatting'; interface LinkDialogProps { editorControl: EditorControl; selectionState: SelectionFormatting; visible: boolean; themeId: number; } const EditLinkDialog = (props: LinkDialogProps) => { // The content of the link selected in the editor (if any) const editorLinkData = props.selectionState.linkData; const [linkLabel, setLinkLabel] = useState(''); const [linkURL, setLinkURL] = useState(''); const linkInputRef = useRef(); // Reset the label and URL when shown/hidden useEffect(() => { setLinkLabel(editorLinkData.linkText ?? props.selectionState.selectedText); setLinkURL(editorLinkData.linkURL ?? ''); }, [ props.visible, editorLinkData.linkText, props.selectionState.selectedText, editorLinkData.linkURL, ]); const [styles, placeholderColor] = useMemo(() => { const theme = themeStyle(props.themeId); const styleSheet = StyleSheet.create({ modalContent: { margin: 15, padding: 30, backgroundColor: theme.backgroundColor, elevation: 5, shadowOffset: { width: 1, height: 1, }, shadowOpacity: 0.4, shadowRadius: 1, }, button: { color: theme.color2, backgroundColor: theme.backgroundColor2, }, text: { color: theme.color, }, header: { color: theme.color, fontSize: 22, }, input: { color: theme.color, backgroundColor: theme.backgroundColor, minHeight: 48, borderBottomColor: theme.backgroundColor3, borderBottomWidth: 1, }, inputContainer: { flexDirection: 'column', paddingBottom: 10, }, }); const placeholderColor = theme.colorFaded; return [styleSheet, placeholderColor]; }, [props.themeId]); const onSubmit = useCallback(() => { props.editorControl.updateLink(linkLabel, linkURL); props.editorControl.hideLinkDialog(); }, [props.editorControl, linkLabel, linkURL]); // See https://www.hingehealth.com/engineering-blog/accessible-react-native-textinput/ // for more about creating accessible RN inputs. const linkTextInput = ( {_('Link text')} { linkInputRef.current.focus(); }} onChangeText={(text: string) => setLinkLabel(text)} /> ); const linkURLInput = ( {_('URL')} setLinkURL(text)} /> ); return ( { props.editorControl.hideLinkDialog(); }}> {_('Edit link')} {linkTextInput} {linkURLInput}