fix keyboard refocus in editor

This commit is contained in:
ammarahm-ed
2021-08-03 10:26:27 +05:00
parent d3cab4939f
commit 299f52b5d7
6 changed files with 44 additions and 31 deletions

View File

@@ -9,7 +9,7 @@ import { hexToRGBA } from '../../utils/ColorUtils';
import { sleep } from '../../utils/TimeUtils'; import { sleep } from '../../utils/TimeUtils';
import { EditorWebView, textInput } from '../../views/Editor/Functions'; import { EditorWebView, textInput } from '../../views/Editor/Functions';
import tiny from '../../views/Editor/tiny/tiny'; import tiny from '../../views/Editor/tiny/tiny';
import { focusEditor } from '../../views/Editor/tiny/toolbar/constants'; import { focusEditor, reFocusEditor } from '../../views/Editor/tiny/toolbar/constants';
import { Toast } from '../Toast'; import { Toast } from '../Toast';
import { GetPremium } from './GetPremium'; import { GetPremium } from './GetPremium';
@@ -53,16 +53,7 @@ const ActionSheetWrapper = ({
}; };
const _onClose = async () => { const _onClose = async () => {
if (editing.isFocused === true) { await reFocusEditor();
textInput.current?.focus();
await sleep(10);
if (editing.focusType == 'editor') {
focusEditor();
} else {
Platform.OS === 'android' && EditorWebView.current.requestFocus();
tiny.call(EditorWebView, tiny.focusTitle);
}
}
if (onClose) { if (onClose) {
onClose(); onClose();
} }

View File

@@ -154,8 +154,8 @@ const EditorHeader = () => {
const showActionsheet = async () => { const showActionsheet = async () => {
let note = getNote() && db.notes.note(getNote().id).data; let note = getNote() && db.notes.note(getNote().id).data;
if (editing.isFocused) { if (editing.isFocused) {
tiny.call(EditorWebView, tiny.blur); Keyboard.dismiss();
await sleep(300); await sleep(500);
editing.isFocused = true; editing.isFocused = true;
} }

View File

@@ -19,10 +19,10 @@ window.blur();
const removeMarkdown = ` const removeMarkdown = `
tinymce.activeEditor.plugins.textpattern.setPatterns("") tinymce.activeEditor.plugins.textpattern.setPatterns("")
` `;
const setMarkdown = ` const setMarkdown = `
tinymce.activeEditor.plugins.textpattern.setPatterns(markdownPatterns) tinymce.activeEditor.plugins.textpattern.setPatterns(markdownPatterns)
` `;
const keyboardStateChanged = `(function() { const keyboardStateChanged = `(function() {
let node = tinymce.activeEditor.selection.getNode(); let node = tinymce.activeEditor.selection.getNode();
@@ -152,7 +152,6 @@ isLoading = false;
const html = value => post('html', value); const html = value => post('html', value);
const focusEditor = ` const focusEditor = `
window.focus();
tinymce.activeEditor.focus(); tinymce.activeEditor.focus();
`; `;
@@ -186,7 +185,7 @@ const onKeyboardShow = () => {
if (!editing.movedAway) { if (!editing.movedAway) {
editing.isFocused = true; editing.isFocused = true;
if (Platform.OS === 'ios') { if (Platform.OS === 'ios') {
if (editing.focusType === "title") return; if (editing.focusType === 'title') return;
call(EditorWebView, keyboardStateChanged); call(EditorWebView, keyboardStateChanged);
} }
} }

View File

@@ -1,7 +1,9 @@
import { createRef } from 'react'; import { createRef } from 'react';
import {Platform} from 'react-native'; import {Platform} from 'react-native';
import { eSendEvent } from '../../../../services/EventManager'; import { eSendEvent } from '../../../../services/EventManager';
import {EditorWebView} from '../../Functions'; import { editing } from '../../../../utils';
import { sleep } from '../../../../utils/TimeUtils';
import {EditorWebView, textInput} from '../../Functions';
import tiny from '../tiny'; import tiny from '../tiny';
export const properties = { export const properties = {
@@ -17,17 +19,32 @@ export function formatSelection(command) {
EditorWebView.current?.injectJavaScript(command); EditorWebView.current?.injectJavaScript(command);
} }
export function focusEditor(format,kill=true) { export async function focusEditor(format,kill=true) {
kill && eSendEvent("showTooltip"); kill && eSendEvent("showTooltip");
Platform.OS === 'android' && EditorWebView.current.requestFocus(); Platform.OS === "android" && EditorWebView.current.requestFocus();
if (format === 'link' || format === 'video') { if (format === 'link' || format === 'video') {
tiny.call(EditorWebView, tiny.blur + ' ' + tiny.focusEditor); tiny.call(EditorWebView, tiny.blur + ' ' + tiny.focusEditor);
} else { } else {
console.log('focus editor');
EditorWebView.current?.requestFocus();
tiny.call(EditorWebView, tiny.focusEditor); tiny.call(EditorWebView, tiny.focusEditor);
} }
} }
export async function reFocusEditor() {
if (editing.isFocused === true) {
await sleep(300);
textInput.current?.focus();
await sleep(300);
if (editing.focusType == 'editor') {
focusEditor(null,false);
} else {
Platform.OS === 'android' && EditorWebView.current?.requestFocus();
tiny.call(EditorWebView, tiny.focusTitle);
}
}
}
export function rgbToHex(color) { export function rgbToHex(color) {
color = '' + color; color = '' + color;
if (!color || color.indexOf('rgb') < 0) { if (!color || color.indexOf('rgb') < 0) {

View File

@@ -190,7 +190,7 @@ const ToolbarItem = ({
let user = await db.user.getUser(); let user = await db.user.getUser();
if (user && !user.isEmailConfirmed) { if (user && !user.isEmailConfirmed) {
if (editing.isFocused) { if (editing.isFocused) {
tiny.call(EditorWebView, tiny.blur); Keyboard.dismiss();
await sleep(300); await sleep(300);
editing.isFocused = true; editing.isFocused = true;
} }
@@ -206,7 +206,7 @@ const ToolbarItem = ({
} }
if (type === 'settings') { if (type === 'settings') {
if (editing.isFocused) { if (editing.isFocused) {
tiny.call(EditorWebView, tiny.blur); Keyboard.dismiss();
await sleep(300); await sleep(300);
editing.isFocused = true; editing.isFocused = true;
} }

View File

@@ -1,14 +1,19 @@
import { getLinkPreview } from 'link-preview-js'; import { getLinkPreview } from 'link-preview-js';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Platform } from 'react-native';
import { Image, ScrollView, View,TouchableOpacity } from 'react-native'; import { Image, ScrollView, View,TouchableOpacity } from 'react-native';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import { ActionIcon } from '../../../../components/ActionIcon'; import { ActionIcon } from '../../../../components/ActionIcon';
import Heading from '../../../../components/Typography/Heading'; import Heading from '../../../../components/Typography/Heading';
import Paragraph from '../../../../components/Typography/Paragraph'; import Paragraph from '../../../../components/Typography/Paragraph';
import { useTracked } from '../../../../provider'; import { useTracked } from '../../../../provider';
import { editing } from '../../../../utils';
import { openLinkInBrowser } from '../../../../utils/functions'; import { openLinkInBrowser } from '../../../../utils/functions';
import { SIZE } from '../../../../utils/SizeUtils'; import { SIZE } from '../../../../utils/SizeUtils';
import { INPUT_MODE, properties } from './constants'; import { sleep } from '../../../../utils/TimeUtils';
import { EditorWebView, textInput } from '../../Functions';
import tiny from '../tiny';
import { focusEditor, INPUT_MODE, properties, reFocusEditor } from './constants';
let prevLink = {}; let prevLink = {};
let prevHeight = 50; let prevHeight = 50;
@@ -90,8 +95,9 @@ const LinkPreview = ({setMode, value, onSubmit}) => {
const openLink = () => { const openLink = () => {
openLinkInBrowser(value, colors) openLinkInBrowser(value, colors)
.catch((e) => {}) .catch((e) => {})
.then((r) => { .then(async (r) => {
console.log('closed'); console.log('closed browser now');
await reFocusEditor();
}); });
}; };