2021-03-21 23:06:53 +01:00
|
|
|
import apiInstance from '@api/instance'
|
2021-05-12 15:40:55 +02:00
|
|
|
import navigationRef from '@helpers/navigationRef'
|
2020-12-20 18:41:28 +01:00
|
|
|
import { store } from '@root/store'
|
2021-03-21 23:06:53 +01:00
|
|
|
import { SearchResult } from '@utils/queryHooks/search'
|
|
|
|
import { getInstanceUrl } from '@utils/slices/instancesSlice'
|
2021-01-01 16:48:16 +01:00
|
|
|
import { getSettingsBrowser } from '@utils/slices/settingsSlice'
|
2020-12-20 18:41:28 +01:00
|
|
|
import * as Linking from 'expo-linking'
|
|
|
|
import * as WebBrowser from 'expo-web-browser'
|
|
|
|
|
2021-03-21 23:06:53 +01:00
|
|
|
// https://social.xmflsct.com/web/statuses/105590085754428765 <- default
|
|
|
|
// https://social.xmflsct.com/@tooot/105590085754428765 <- pretty
|
|
|
|
const matcherStatus = new RegExp(
|
|
|
|
/http[s]?:\/\/(.*)\/(web\/statuses|@.*)\/([0-9]*)/
|
|
|
|
)
|
|
|
|
|
|
|
|
// https://social.xmflsct.com/web/accounts/14195 <- default
|
|
|
|
// https://social.xmflsct.com/@tooot <- pretty
|
|
|
|
const matcherAccount = new RegExp(
|
|
|
|
/http[s]?:\/\/(.*)\/(web\/accounts\/([0-9]*)|@.*)/
|
|
|
|
)
|
|
|
|
|
|
|
|
export let loadingLink = false
|
|
|
|
|
2021-08-29 16:08:02 +02:00
|
|
|
const openLink = async (url: string, navigation?: any) => {
|
2021-03-21 23:06:53 +01:00
|
|
|
if (loadingLink) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleNavigation = (
|
|
|
|
page: 'Tab-Shared-Toot' | 'Tab-Shared-Account',
|
|
|
|
options: {}
|
|
|
|
) => {
|
|
|
|
if (navigation) {
|
|
|
|
// @ts-ignore
|
|
|
|
navigation.push(page, options)
|
|
|
|
} else {
|
2022-05-08 23:40:42 +02:00
|
|
|
// @ts-ignore
|
2021-08-29 15:25:38 +02:00
|
|
|
navigationRef.navigate(page, options)
|
2021-03-21 23:06:53 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If a tooot can be found
|
|
|
|
const matchedStatus = url.match(matcherStatus)
|
|
|
|
if (matchedStatus) {
|
|
|
|
// If the link in current instance
|
|
|
|
const instanceUrl = getInstanceUrl(store.getState())
|
|
|
|
if (matchedStatus[1] === instanceUrl) {
|
|
|
|
handleNavigation('Tab-Shared-Toot', {
|
|
|
|
toot: { id: matchedStatus[3] }
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
loadingLink = true
|
|
|
|
let response
|
|
|
|
try {
|
|
|
|
response = await apiInstance<SearchResult>({
|
|
|
|
version: 'v2',
|
|
|
|
method: 'get',
|
|
|
|
url: 'search',
|
|
|
|
params: { type: 'statuses', q: url, limit: 1, resolve: true }
|
|
|
|
})
|
|
|
|
} catch {}
|
|
|
|
if (response && response.body && response.body.statuses.length) {
|
|
|
|
handleNavigation('Tab-Shared-Toot', {
|
|
|
|
toot: response.body.statuses[0]
|
|
|
|
})
|
|
|
|
loadingLink = false
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If an account can be found
|
|
|
|
const matchedAccount = url.match(matcherAccount)
|
|
|
|
console.log(matchedAccount)
|
|
|
|
if (matchedAccount) {
|
|
|
|
// If the link in current instance
|
|
|
|
const instanceUrl = getInstanceUrl(store.getState())
|
|
|
|
if (matchedAccount[1] === instanceUrl) {
|
|
|
|
if (matchedAccount[3] && matchedAccount[3].match(/[0-9]*/)) {
|
|
|
|
handleNavigation('Tab-Shared-Account', {
|
|
|
|
account: { id: matchedAccount[3] }
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
loadingLink = true
|
|
|
|
let response
|
|
|
|
try {
|
|
|
|
response = await apiInstance<SearchResult>({
|
|
|
|
version: 'v2',
|
|
|
|
method: 'get',
|
|
|
|
url: 'search',
|
|
|
|
params: { type: 'accounts', q: url, limit: 1, resolve: true }
|
|
|
|
})
|
|
|
|
} catch {}
|
|
|
|
if (response && response.body && response.body.accounts.length) {
|
|
|
|
handleNavigation('Tab-Shared-Account', {
|
|
|
|
account: response.body.accounts[0]
|
|
|
|
})
|
|
|
|
loadingLink = false
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
loadingLink = false
|
2020-12-20 18:41:28 +01:00
|
|
|
switch (getSettingsBrowser(store.getState())) {
|
2021-08-11 00:04:12 +02:00
|
|
|
// Some links might end with an empty space at the end that triggers an error
|
2020-12-20 18:41:28 +01:00
|
|
|
case 'internal':
|
2021-08-11 00:04:12 +02:00
|
|
|
await WebBrowser.openBrowserAsync(encodeURI(url), {
|
2021-02-28 17:41:21 +01:00
|
|
|
dismissButtonStyle: 'close',
|
|
|
|
enableBarCollapsing: true
|
|
|
|
})
|
2020-12-20 18:41:28 +01:00
|
|
|
break
|
|
|
|
case 'external':
|
2021-08-11 00:04:12 +02:00
|
|
|
await Linking.openURL(encodeURI(url))
|
2020-12-20 18:41:28 +01:00
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default openLink
|