From ac48c35710dffca83e7872bb33a6e8b8a643e45f Mon Sep 17 00:00:00 2001 From: ammarahm-ed Date: Sat, 9 Oct 2021 14:29:40 +0500 Subject: [PATCH] feat: fully implement new note widget on android --- .../app/src/main/assets/plaineditor.html | 27 +- .../src/main/res/drawable/widget_preview.png | Bin 0 -> 13297 bytes .../app/src/main/res/layout/note_widget.xml | 3 +- .../app/src/main/res/xml/note_widget_info.xml | 6 +- .../html/Web.bundle/site/plaineditor.html | 27 +- apps/mobile/share/index.js | 633 ++++++++---------- 6 files changed, 320 insertions(+), 376 deletions(-) create mode 100644 apps/mobile/android/app/src/main/res/drawable/widget_preview.png diff --git a/apps/mobile/android/app/src/main/assets/plaineditor.html b/apps/mobile/android/app/src/main/assets/plaineditor.html index 1a42a4fc2..fb1d9d434 100644 --- a/apps/mobile/android/app/src/main/assets/plaineditor.html +++ b/apps/mobile/android/app/src/main/assets/plaineditor.html @@ -6,6 +6,7 @@ Note Diff Preview + -
+
diff --git a/apps/mobile/android/app/src/main/res/drawable/widget_preview.png b/apps/mobile/android/app/src/main/res/drawable/widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..44c9af89a4d4a1cf808286d100aa78de4e2fd358 GIT binary patch literal 13297 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 + \ No newline at end of file diff --git a/apps/mobile/html/Web.bundle/site/plaineditor.html b/apps/mobile/html/Web.bundle/site/plaineditor.html index 1a42a4fc2..fb1d9d434 100644 --- a/apps/mobile/html/Web.bundle/site/plaineditor.html +++ b/apps/mobile/html/Web.bundle/site/plaineditor.html @@ -6,6 +6,7 @@ Note Diff Preview + -
+
diff --git a/apps/mobile/share/index.js b/apps/mobile/share/index.js index a5b045a2a..bdd477d4b 100644 --- a/apps/mobile/share/index.js +++ b/apps/mobile/share/index.js @@ -1,6 +1,7 @@ +import Clipboard from '@react-native-clipboard/clipboard'; import absolutify from 'absolutify'; -import {getLinkPreview} from 'link-preview-js'; -import React, {useEffect, useRef, useState} from 'react'; +import { getLinkPreview } from 'link-preview-js'; +import React, { useEffect, useRef, useState } from 'react'; import { ActivityIndicator, Appearance, @@ -9,24 +10,25 @@ import { Platform, SafeAreaView, Text, - TextInput, TouchableOpacity, useWindowDimensions, View } from 'react-native'; -import Animated, {Easing, timing, useValue} from 'react-native-reanimated'; +import Animated, { Easing, timing, useValue } from 'react-native-reanimated'; +import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import WebView from 'react-native-webview'; import ShareExtension from 'rn-extensions-share'; -import sanitize from 'sanitize-html'; import validator from 'validator'; -import {getElevation, showTooltip, TOOLTIP_POSITIONS} from '../src/utils'; -import {COLOR_SCHEME_DARK, COLOR_SCHEME_LIGHT} from '../src/utils/Colors'; -import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; -import Clipboard from '@react-native-clipboard/clipboard'; -import {db} from '../src/utils/database'; -import {SIZE} from '../src/utils/SizeUtils'; +import { + eSendEvent, + eSubscribeEvent, + eUnSubscribeEvent +} from '../src/services/EventManager'; +import { getElevation } from '../src/utils'; +import { COLOR_SCHEME_DARK, COLOR_SCHEME_LIGHT } from '../src/utils/Colors'; +import { db } from '../src/utils/database'; import Storage from '../src/utils/storage'; -import {sleep} from '../src/utils/TimeUtils'; +import { sleep } from '../src/utils/TimeUtils'; const AnimatedKAV = Animated.createAnimatedComponent(KeyboardAvoidingView); const AnimatedSAV = Animated.createAnimatedComponent(SafeAreaView); @@ -34,19 +36,10 @@ async function sanitizeHtml(site) { try { let html = await fetch(site); html = await html.text(); - let siteHtml = sanitize(html, { - allowedTags: sanitize.defaults.allowedTags.concat([ - 'img', - 'style', - 'head', - 'link' - ]), - allowedClasses: true, - allowVulnerableTags: true, - allowedAttributes: false, - allowProtocolRelative: true, - allowedSchemes: false - }); + let siteHtml = html.replace( + /(?:<(script|button|input|textarea|style|link)(?:\s[^>]*)?>)\s*((?:(?!<\1)[\s\S])*)\s*(?:<\/\1>)/g, + '' + ); return absolutify(siteHtml, site); } catch (e) { return ''; @@ -62,6 +55,30 @@ function makeHtmlFromPlainText(text) { return `

${text}

`; } +function getBaseUrl(site) { + var url = site.split('/').slice(0, 3).join('/'); + return url; +} + +async function absolutifyImgs(html, site) { + let parser = global.HTMLParser; + global.HTMLParser.body.innerHTML = html; + + let images = parser.querySelectorAll('img'); + for (var i = 0; i < images.length; i++) { + let img = images[i]; + let url = getBaseUrl(site); + if (!img.src.startsWith('http')) { + if (img.src.startsWith('//')) { + img.src = img.src.replace('//', 'https://'); + } else { + img.src = url + img.src; + } + } + } + return parser.body.innerHTML; +} + let defaultNote = { title: null, id: null, @@ -71,7 +88,6 @@ let defaultNote = { } }; -let editorContentValue = null; const modes = { 1: { @@ -101,13 +117,10 @@ const NotesnookShare = () => { const [loadingIntent, setLoadingIntent] = useState(true); const [loading, setLoading] = useState(false); const [floating, setFloating] = useState(false); - const [quickNote, setQuickNote] = useState(false); const [rawData, setRawData] = useState({ type: null, value: null }); - const textInputRef = useRef(); - const titleInputRef = useRef(); const {width, height} = useWindowDimensions(); const webviewRef = useRef(); const opacity = useValue(0); @@ -117,7 +130,6 @@ const NotesnookShare = () => { }; const prevAnimation = useRef(null); const [mode, setMode] = useState(1); - const [keyboard,setKeyboard] = useState(false); const animate = (opacityV, translateV) => { prevAnimation.current = translateV; @@ -134,86 +146,79 @@ const NotesnookShare = () => { }).start(); }; - const onKeyboardDidShow = (event) => { + const onKeyboardDidShow = event => { let kHeight = event.endCoordinates.height; - console.log('called') - translate.setValue(-kHeight/1.8); - } + //translate.setValue(-150); + }; const onKeyboardDidHide = () => { translate.setValue(0); - } + }; useEffect(() => { - let keyboardWillChangeFrame = Keyboard.addListener('keyboardWillChangeFrame', onKeyboardWillChangeFrame); - let keyboardDidShow = Keyboard.addListener("keyboardDidShow", onKeyboardDidShow); - let keyboardDidHide = Keyboard.addListener("keyboardDidHide", onKeyboardDidHide); + let keyboardWillChangeFrame = Keyboard.addListener( + 'keyboardWillChangeFrame', + onKeyboardWillChangeFrame + ); + let keyboardDidShow = Keyboard.addListener( + 'keyboardDidShow', + onKeyboardDidShow + ); + let keyboardDidHide = Keyboard.addListener( + 'keyboardDidHide', + onKeyboardDidHide + ); return () => { keyboardWillChangeFrame?.remove(); keyboardDidShow?.remove(); keyboardDidHide?.remove(); }; - },[]); + }, []); const onKeyboardWillChangeFrame = event => { - console.log('keyboad change frame',event) setFloating(event.endCoordinates.width !== width); }; - const showLinkPreview = async link => { - let _note = {...defaultNote}; - _note.title = 'Web link share'; - _note.content.data = !note.content.data - ? makeHtmlFromUrl(link) - : note.content.data + '\n' + makeHtmlFromUrl(link); + const showLinkPreview = async (note, link) => { + let _note = note; + _note.content.data = makeHtmlFromUrl(link); try { let preview = await getLinkPreview(link); _note.title = preview.siteName || preview.title; } catch (e) { console.log(e); } - setNote(_note); + return note; }; const loadData = async () => { try { - setNote(() => { - defaultNote.content.data = null; - return defaultNote; - }); const data = await ShareExtension.data(); - console.log(data); if (!data || data.length === 0) { setRawData({ value: '' }); + setNote({...defaultNote}); setLoadingIntent(false); - setQuickNote(true); return; } + let note = defaultNote; for (item of data) { if (item.type === 'text') { setRawData(item); if (validator.isURL(item.value)) { - await showLinkPreview(item.value); + note = await showLinkPreview(note, item.value); } else { - setNote(note => { - note.title = 'Note Share'; - note.content.data = note.content.data - ? note.content.data + '\n' + makeHtmlFromPlainText(item.value) - : makeHtmlFromPlainText(item.value); - - return note; - }); + note.content.data = makeHtmlFromPlainText(item.value); } } } + setNote({...note}); } catch (e) {} setLoadingIntent(false); }; useEffect(() => { - setNote(defaultNote); loadData(); sleep(50).then(() => { animate(1, 0); @@ -244,15 +249,20 @@ const NotesnookShare = () => { } const onPress = async () => { - titleInputRef.current?.blur(); - textInputRef.current?.blur(); + content = await getContent(); + if (!content || content === '') { + return; + } setLoading(true); - let add = async () => { - let _note = {...note}; - _note.content.data = - _note.content.data + makeHtmlFromPlainText(editorContentValue); - await db.notes.add(note); + let _note = { + ...note, + content: { + data: content, + type: 'tiny' + } + }; + await db.notes.add(_note); }; if (db && db.notes) { await add(); @@ -276,6 +286,35 @@ const NotesnookShare = () => { } }; + const getContent = () => { + return new Promise(resolve => { + let oncontent = value => { + eUnSubscribeEvent('share_content_event', oncontent); + resolve(value); + }; + eSubscribeEvent('share_content_event', oncontent); + webviewRef.current?.injectJavaScript(`(function() { + let html = document.querySelector(".htmldiff_div").innerHTML; + if (!html) { + html = ''; + } + reactNativeEventHandler('tiny', html); + })();`); + }); + }; + + const onMessage = event => { + if (!event) return; + let data = JSON.parse(event.nativeEvent.data); + if (data.type === 'tiny') { + eSendEvent('share_content_event', data.value); + } + }; + + useEffect(() => { + onLoad(); + }, [note]); + return ( { enabled={!floating && Platform.OS === 'ios'} onLayout={event => { if (prevAnimation.current === 0) return; - console.log('setting value here'); translate.setValue(event.nativeEvent.layout.height + 30); }} style={{ @@ -321,325 +359,180 @@ const NotesnookShare = () => { ] }} behavior="padding"> - {quickNote ? null : ( + - )} - - {loadingIntent ? ( - - - - - Parsing Data... - - - ) : ( - <> + position: 'absolute', + zIndex: 999, + ...getElevation(10), + right: 24, + bottom: -35 + }} + /> + - {quickNote ? null : ( - - - setNote(_note => { - _note.title = v; - return _note; - }) - } - onSubmitEditing={() => { - textInputRef.current?.focus(); - }} - blurOnSubmit={false} - placeholder="Note title" - /> - - )} - - {quickNote ? null : ( - - {[ - { - title: 'Plain text', - onPress: () => { - let html = validator.isURL(rawData.value) - ? makeHtmlFromUrl(rawData.value) - : makeHtmlFromPlainText(rawData.value); - setNote(note => { - note.content.data = html; - return note; - }); - onLoad(); - } - }, - ...[ - rawData?.value && validator.isURL(rawData.value) - ? { - title: 'Clip webpage', - onPress: async () => { - let html = await sanitizeHtml(rawData.value); - setNote(note => { - note.content.data = html; - return note; - }); - onLoad(); - } - } - : null - ] - ].map( - (item, index) => - item && ( -