From c9edaa01e36765e7808a31a6437e673ea69048d4 Mon Sep 17 00:00:00 2001 From: Mustafa Buyukcelebi Date: Thu, 17 Oct 2019 12:10:10 +0300 Subject: [PATCH] Added post parser util --- .../container/searchModalContainer.js | 80 +++++++++++-------- src/utils/postUrlParser.js | 60 ++++++++++++++ 2 files changed, 108 insertions(+), 32 deletions(-) create mode 100644 src/utils/postUrlParser.js diff --git a/src/components/searchModal/container/searchModalContainer.js b/src/components/searchModal/container/searchModalContainer.js index 46a79c619..d8dbe74b0 100644 --- a/src/components/searchModal/container/searchModalContainer.js +++ b/src/components/searchModal/container/searchModalContainer.js @@ -8,10 +8,11 @@ import { search } from '../../../providers/esteem/esteem'; import { lookupAccounts, getTrendingTags } from '../../../providers/steem/dsteem'; // Constants -import { default as ROUTES } from '../../../constants/routeNames'; +import ROUTES from '../../../constants/routeNames'; // Utilities import { getResizedAvatar } from '../../../utils/image'; +import postUrlParser from '../../../utils/postUrlParser'; // Component import SearchModalView from '../view/searchModalView'; @@ -40,46 +41,61 @@ class SearchModalContainer extends PureComponent { }; _handleOnChangeSearchInput = text => { - const { isConnected } = this.props; + const { isConnected, navigation, handleOnClose } = this.props; + if (text && text.length < 2) return; if (this.timer) { clearTimeout(this.timer); } if (!isConnected) return; - this.timer = setTimeout(() => { - if (text && text !== '@' && text !== '#') { - if (text[0] === '@') { - lookupAccounts(text.substr(1)).then(res => { - const users = res.map(item => ({ - image: getResizedAvatar(item), - text: item, - ...item, - })); - this.setState({ searchResults: { type: 'user', data: users } }); - }); - } else if (text[0] === '#') { - getTrendingTags(text.substr(1)).then(res => { - const tags = res.map(item => ({ - text: `#${get(item, 'name', '')}`, - ...item, - })); + if (text && text !== '@' && text !== '#') { + if (text[0] === '@') { + lookupAccounts(text.substr(1)).then(res => { + const users = res.map(item => ({ + image: getResizedAvatar(item), + text: item, + ...item, + })); + this.setState({ searchResults: { type: 'user', data: users } }); + }); + } else if (text[0] === '#') { + getTrendingTags(text.substr(1)).then(res => { + const tags = res.map(item => ({ + text: `#${get(item, 'name', '')}`, + ...item, + })); - this.setState({ searchResults: { type: 'tag', data: tags } }); - }); - } else { - search({ q: text }).then(res => { - res.results = res.results - .filter(item => item.title !== '') - .map(item => ({ - image: item.img_url || getResizedAvatar(get(item, 'author')), - text: item.title, - ...item, - })); - this.setState({ searchResults: { type: 'content', data: get(res, 'results', []) } }); + this.setState({ searchResults: { type: 'tag', data: tags } }); + }); + } else if (text.includes('https')) { + console.log('test :'); + console.log('postUrlParser(text) :', postUrlParser(text)); + const { author, permlink } = postUrlParser(text); + console.log('author, permlink :', author, permlink); + if (author && permlink) { + handleOnClose(); + navigation.navigate({ + routeName: ROUTES.SCREENS.POST, + params: { + author, + permlink, + }, + key: permlink, }); } + } else { + search({ q: text }).then(res => { + res.results = res.results + .filter(item => item.title !== '') + .map(item => ({ + image: item.img_url || getResizedAvatar(get(item, 'author')), + text: item.title, + ...item, + })); + this.setState({ searchResults: { type: 'content', data: get(res, 'results', []) } }); + }); } - }, 500); + } }; _handleOnPressListItem = (type, item) => { diff --git a/src/utils/postUrlParser.js b/src/utils/postUrlParser.js new file mode 100644 index 000000000..41939e70f --- /dev/null +++ b/src/utils/postUrlParser.js @@ -0,0 +1,60 @@ +export default url => { + const parseCatAuthorPermlink = u => { + const r = /^https?:\/\/(.*)\/(.*)\/(@[\w.\d-]+)\/(.*)/i; + const match = u.match(r); + if (match && match.length === 5) { + return { + author: match[3].replace('@', ''), + permlink: match[4], + }; + } + + return null; + }; + + const parseAuthorPermlink = u => { + const r = /^https?:\/\/(.*)\/(@[\w.\d-]+)\/(.*)/i; + const match = u.match(r); + if (match && match.length === 4) { + return { + author: match[2].replace('@', ''), + permlink: match[3], + }; + } + + return null; + }; + + if ( + ['https://esteem.app', 'https://steemit.com', 'https://steempeak.com'].some(x => + url.startsWith(x), + ) + ) { + return parseCatAuthorPermlink(url); + } + + if (['https://busy.org', 'https://steemhunt.com'].some(x => url.startsWith(x))) { + return parseAuthorPermlink(url); + } + + // For non urls like @good-karma/esteem-london-presentation-e3105ba6637ed + let match = url.match(/^[/]?(@[\w.\d-]+)\/(.*)/); + if (match && match.length === 3) { + return { + author: match[1].replace('@', ''), + permlink: match[2], + }; + } + + // For non urls with category like esteem/@good-karma/esteem-london-presentation-e3105ba6637ed + match = url.match(/^[/]?([\w.\d-]+)\/(@[\w.\d-]+)\/(.*)/); + if (match && match.length === 4) { + return { + category: match[1], + author: match[2].replace('@', ''), + permlink: match[3], + }; + } + + return null; +};