UNPKG

react-native-cn-richtext-editor

Version:
133 lines 4.64 kB
import Constants from 'expo-constants'; import qs from 'qs'; import Linking from './LinkingModule'; const { manifest } = Constants; const USES_CUSTOM_SCHEME = Constants.appOwnership === 'standalone' && manifest.scheme; let HOST_URI = manifest.hostUri; if (!HOST_URI && !USES_CUSTOM_SCHEME) { // we're probably not using up-to-date xdl, so just fake it for now // we have to remove the /--/ on the end since this will be inserted again later HOST_URI = _removeScheme(Constants.linkingUri).replace(/\/--($|\/.*$)/, ''); } const IS_EXPO_HOSTED = HOST_URI && (/^(.*\.)?(expo\.io|exp\.host|exp\.direct|expo\.test)(:.*)?(\/.*)?$/.test(HOST_URI) || manifest.developer); function _removeScheme(url) { return url.replace(/^[a-zA-Z0-9+.-]+:\/\//, ''); } function _removePort(url) { return url.replace(/(?=([a-zA-Z0-9+.-]+:\/\/)?[^/]):\d+/, ''); } function _removeLeadingSlash(url) { return url.replace(/^\//, ''); } function _removeTrailingSlash(url) { return url.replace(/\/$/, ''); } function _removeTrailingSlashAndQueryString(url) { return url.replace(/\/?\?.*$/, ''); } function makeUrl(path = '', queryParams = {}) { let scheme = 'exp'; if (Constants.appOwnership === 'standalone') { scheme = manifest.scheme || (manifest.detach && manifest.detach.scheme); } if (!scheme) { throw new Error('Cannot make a deep link into a standalone app with no custom scheme defined'); } let hostUri = HOST_URI || ''; if (USES_CUSTOM_SCHEME && IS_EXPO_HOSTED) { hostUri = ''; } if (path) { if (IS_EXPO_HOSTED && hostUri) { path = `/--/${_removeLeadingSlash(path)}`; } if (!path.startsWith('/') && hostUri) { path = `/${path}`; } else if (path.startsWith('/') && !hostUri) { path = path.substr(1); } } else { path = ''; } // merge user-provided query params with any that were already in the hostUri // e.g. release-channel let queryString = ''; let queryStringMatchResult = hostUri.match(/(.*)\?(.+)/); if (queryStringMatchResult) { hostUri = queryStringMatchResult[1]; queryString = queryStringMatchResult[2]; let paramsFromHostUri = {}; try { let parsedParams = qs.parse(queryString); if (typeof parsedParams === 'object') { paramsFromHostUri = parsedParams; } } catch (e) { } queryParams = { ...queryParams, ...paramsFromHostUri, }; } queryString = qs.stringify(queryParams); if (queryString) { queryString = `?${queryString}`; } hostUri = _removeTrailingSlash(hostUri); return encodeURI(`${scheme}://${hostUri}${path}${queryString}`); } function parse(url) { if (!url) { throw new Error('parse cannot be called with a null value'); } // iOS client sometimes strips out the port from the initial URL // even when it's included in the hostUri. // This function should be able to handle both cases, so we strip off the port // both here and from the hostUri. let decodedUrl = _removePort(decodeURI(url)); let path; let queryParams = {}; let queryStringMatchResult = decodedUrl.match(/(.*)\?(.+)/); if (queryStringMatchResult) { decodedUrl = queryStringMatchResult[1]; queryParams = qs.parse(queryStringMatchResult[2]); } // strip off the hostUri from the host and path let hostUri = HOST_URI || ''; let hostUriStripped = _removePort(_removeTrailingSlashAndQueryString(hostUri)); if (hostUriStripped && decodedUrl.indexOf(hostUriStripped) > -1) { path = decodedUrl.substr(decodedUrl.indexOf(hostUriStripped) + hostUriStripped.length); } else { path = _removeScheme(decodedUrl); } path = _removeLeadingSlash(path); if (IS_EXPO_HOSTED && !USES_CUSTOM_SCHEME && path.startsWith('--/')) { path = path.substr(3); } else if (path.indexOf('+') > -1) { path = path.substr(path.indexOf('+') + 1); } return { path, queryParams }; } async function parseInitialURLAsync() { const initialUrl = await Linking.getInitialURL(); if (!initialUrl) { return { path: null, queryParams: null, }; } return parse(initialUrl); } // @ts-ignore fix this... let newLinking = new Linking.constructor(); newLinking.makeUrl = makeUrl; newLinking.parse = parse; newLinking.parseInitialURLAsync = parseInitialURLAsync; export default newLinking; //# sourceMappingURL=Linking.js.map