// @flow import { isNameValid, isURIValid, normalizeURI, parseURI } from 'util/lbryURI'; import { URL as SITE_URL, URL_LOCAL, URL_DEV } from 'config'; import { SEARCH_OPTIONS } from 'constants/search'; export function createNormalizedSearchKey(query: string) { const FROM = '&from='; // Ignore the "page" (`from`) because we don't care what the last page // searched was, we want everything. let normalizedQuery = query; if (normalizedQuery.includes(FROM)) { const a = normalizedQuery.indexOf(FROM); const b = normalizedQuery.indexOf('&', a + FROM.length); if (b > a) { normalizedQuery = normalizedQuery.substring(0, a) + normalizedQuery.substring(b); } else { normalizedQuery = normalizedQuery.substring(0, a); } } return normalizedQuery; } /** * getUriForSearchTerm * @param term * @returns {string[]|*[]|(string|string)[]} */ export function getUriForSearchTerm(term: string) { const WEB_DEV_PREFIX = `${URL_DEV}/`; const WEB_LOCAL_PREFIX = `${URL_LOCAL}/`; const WEB_PROD_PREFIX = `${SITE_URL}/`; const ODYSEE_PREFIX = `https://odysee.com/`; const includesLbryTvProd = term.includes(WEB_PROD_PREFIX); const includesOdysee = term.includes(ODYSEE_PREFIX); const includesLbryTvLocal = term.includes(WEB_LOCAL_PREFIX); const includesLbryTvDev = term.includes(WEB_DEV_PREFIX); const wasCopiedFromWeb = includesLbryTvDev || includesLbryTvLocal || includesLbryTvProd || includesOdysee; const isLbryUrl = term.startsWith('lbry://') && term !== 'lbry://'; const error = ''; const addLbryIfNot = (term) => { return term.startsWith('lbry://') ? term : `lbry://${term}`; }; if (wasCopiedFromWeb) { let prefix = WEB_PROD_PREFIX; if (includesLbryTvLocal) prefix = WEB_LOCAL_PREFIX; if (includesLbryTvDev) prefix = WEB_DEV_PREFIX; if (includesOdysee) prefix = ODYSEE_PREFIX; let query = (term && term.slice(prefix.length).replace(/:/g, '#')) || ''; try { const lbryUrl = `lbry://${query}`; parseURI(lbryUrl); return [lbryUrl, null]; } catch (e) { return [query, 'error']; } } if (!isLbryUrl) { if (term.startsWith('@')) { if (isNameValid(term.slice(1))) { return [term, null]; } else { return [term, error]; } } return [addLbryIfNot(term), null]; } else { try { const isValid = isURIValid(term); if (isValid) { let uri; try { uri = normalizeURI(term); } catch (e) { return [term, null]; } return [uri, null]; } else { return [term, null]; } } catch (e) { return [term, 'error']; } } } export function getRecommendationSearchOptions(matureEnabled: boolean, claimIsMature: boolean, claimId: string) { const options = { size: 20, nsfw: matureEnabled, isBackgroundSearch: true }; if (matureEnabled || !claimIsMature) { options[SEARCH_OPTIONS.RELATED_TO] = claimId; } return options; }