From 72f3828d0385a6b404f5562ed8068cf385bfe862 Mon Sep 17 00:00:00 2001 From: Rexogamer Date: Thu, 9 May 2024 17:49:37 +0100 Subject: [PATCH] fix: clean up circular imports --- i18n/i18n.ts | 2 +- src/Generic.tsx | 74 +--------- src/MessageBox.tsx | 3 +- src/Modals.tsx | 3 +- src/Profile.tsx | 132 +----------------- src/SideMenu.tsx | 3 +- src/components/Notification.tsx | 3 +- src/components/common/MarkdownView.tsx | 13 +- src/components/common/atoms/Avatar.tsx | 131 +++++++++++++++++ src/components/common/atoms/BackButton.tsx | 2 +- src/components/common/atoms/Button.tsx | 2 +- src/components/common/atoms/ChannelButton.tsx | 2 +- src/components/common/atoms/Checkbox.tsx | 2 +- src/components/common/atoms/ContextButton.tsx | 2 +- src/components/common/atoms/CopyIDButton.tsx | 2 +- src/components/common/atoms/GeneralAvatar.tsx | 31 ++++ .../common/atoms/InputWithButton.tsx | 7 +- src/components/common/atoms/Link.tsx | 4 +- src/components/common/atoms/Text.tsx | 2 +- src/components/common/atoms/Username.tsx | 8 +- src/components/common/atoms/index.tsx | 2 + src/components/common/messaging/Emoji.tsx | 6 +- .../common/messaging/InviteEmbed.tsx | 4 +- src/components/common/messaging/Message.tsx | 19 ++- .../common/messaging/ReplyMessage.tsx | 3 +- src/components/common/messaging/index.ts | 5 - src/components/navigation/ChannelIcon.tsx | 1 - src/components/navigation/ServerList.tsx | 3 +- src/components/pages/HomePage.tsx | 6 +- src/components/sheets/BotInviteSheet.tsx | 4 +- src/components/sheets/MessageMenuSheet.tsx | 2 +- src/components/sheets/ProfileSheet.tsx | 8 +- src/components/sheets/ReportSheet.tsx | 3 +- src/components/sheets/ServerInfoSheet.tsx | 9 +- src/components/sheets/ServerInviteSheet.tsx | 4 +- src/components/sheets/SettingsSheet.tsx | 5 +- src/lib/utils/index.ts | 1 + src/lib/utils/utils.ts | 47 ++++++- 38 files changed, 285 insertions(+), 275 deletions(-) create mode 100644 src/components/common/atoms/Avatar.tsx create mode 100644 src/components/common/atoms/GeneralAvatar.tsx diff --git a/i18n/i18n.ts b/i18n/i18n.ts index e18701f1..9c9d358f 100644 --- a/i18n/i18n.ts +++ b/i18n/i18n.ts @@ -4,7 +4,7 @@ import 'intl-pluralrules'; import {resources} from '@rvmob-i18n/languages'; import {languageDetectorPlugin} from '@rvmob-i18n/getLanguage'; -import {Text} from '@rvmob/components/common/atoms'; +import {Text} from '@rvmob/components/common/atoms/Text'; i18n .use(initReactI18next) // passes i18n down to react-i18next diff --git a/src/Generic.tsx b/src/Generic.tsx index 08a9feb8..3f389787 100644 --- a/src/Generic.tsx +++ b/src/Generic.tsx @@ -1,22 +1,11 @@ -import {Linking, View} from 'react-native'; - import AsyncStorage from '@react-native-async-storage/async-storage'; import {API, Channel, Client, Message, Server} from 'revolt.js'; import {setLanguage} from '@rvmob-i18n/i18n'; import {languages} from '@rvmob-i18n/languages'; -import {Image} from '@rvmob/crossplat/Image'; import {setTheme, themes} from '@rvmob/Theme'; -import { - DEFAULT_API_URL, - DEFAULT_MAX_SIDE, - DISCOVER_URL, - LOADING_SCREEN_REMARKS, - RE_INVITE, - RE_BOT_INVITE, - WIKI_URL, -} from '@rvmob/lib/consts'; +import {DEFAULT_API_URL, LOADING_SCREEN_REMARKS} from '@rvmob/lib/consts'; import { CreateChannelModalProps, DeletableObject, @@ -418,67 +407,6 @@ getAPIURL().then(url => { }); }); -export const openUrl = (url: string) => { - console.log(`[FUNCTIONS] Handling URL: ${url}`); - if (url.startsWith('/@')) { - console.log(`[FUNCTIONS] Opening user profile from URL: ${url}`); - let id = url.slice(2); - let user = client.users.get(id); - if (user) { - app.openProfile(user); - } - return; - } - let match = url.match(RE_INVITE); - let isDiscover = url.match(DISCOVER_URL); - let isWiki = url.match(WIKI_URL); - if (match && !isWiki && !isDiscover) { - console.log(`[FUNCTIONS] Opening server invite from URL: ${url}`); - app.openInvite(match[0].split('/').pop()); - return; - } - let botmatch = url.match(RE_BOT_INVITE); - if (botmatch) { - console.log(`[FUNCTIONS] Opening bot invite from URL: ${url}`); - app.openBotInvite(botmatch[0].split('/').pop()); - return; - } - if (url.startsWith('/bot/')) { - console.log(`[FUNCTIONS] Opening bot invite from URL: ${url}`); - const id = url.split('/'); - app.openBotInvite(id[2]); - return; - } - - Linking.openURL(url); -}; - -export const GeneralAvatar = ({ - attachment, - size, - directory, -}: { - attachment: any; - size: number; - directory?: string; -}) => { - const uri = directory - ? client.configuration?.features.autumn.url + directory + attachment - : client.generateFileURL(attachment) + '?max_side=' + DEFAULT_MAX_SIDE; - return ( - - { - - } - - ); -}; - export var selectedRemark = LOADING_SCREEN_REMARKS[ Math.floor(Math.random() * LOADING_SCREEN_REMARKS.length) diff --git a/src/MessageBox.tsx b/src/MessageBox.tsx index cb8d8f6a..bcccbe49 100644 --- a/src/MessageBox.tsx +++ b/src/MessageBox.tsx @@ -11,9 +11,8 @@ import {ulid} from 'ulid'; import {DocumentPicker} from './crossplat/DocumentPicker'; import {app, client, setFunction} from './Generic'; -import {Avatar} from './Profile'; import {styles, currentTheme} from './Theme'; -import {Text, Username} from './components/common/atoms'; +import {Avatar, Text, Username} from './components/common/atoms'; import {USER_IDS} from './lib/consts'; import {ReplyingMessage} from './lib/types'; import {getReadableFileSize, showToast} from './lib/utils'; diff --git a/src/Modals.tsx b/src/Modals.tsx index dbe987af..a72918f5 100644 --- a/src/Modals.tsx +++ b/src/Modals.tsx @@ -7,12 +7,13 @@ import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIc import {API, Channel, Server, User} from 'revolt.js'; -import {app, client, openUrl, setFunction} from './Generic'; +import {app, client, setFunction} from './Generic'; import { CreateChannelModalProps, DeletableObject, TextEditingModalProps, } from './lib/types'; +import {openUrl} from '@rvmob/lib/utils'; import {currentTheme} from './Theme'; import {GapView} from './components/layout'; import { diff --git a/src/Profile.tsx b/src/Profile.tsx index dc5a08ac..ef73c55f 100644 --- a/src/Profile.tsx +++ b/src/Profile.tsx @@ -1,135 +1,13 @@ import {observer} from 'mobx-react-lite'; -import {client, app} from './Generic'; +import {client} from './Generic'; import {currentTheme} from './Theme'; -import {Pressable, View} from 'react-native'; +import {View} from 'react-native'; import {Server, User, Channel} from 'revolt.js'; -import {Text, Username} from './components/common/atoms'; -import {Image} from '@rvmob/crossplat/Image'; -import {DEFAULT_MAX_SIDE} from './lib/consts'; +import {Avatar} from '@rvmob/components/common/atoms/Avatar'; +import {Text} from '@rvmob/components/common/atoms/Text'; +import {Username} from '@rvmob/components/common/atoms/Username'; import {getColour} from './lib/utils'; -type AvatarProps = { - channel?: Channel; - user?: User | null; - server?: Server; - status?: boolean; - size?: number; - backgroundColor?: string; - masquerade?: string; - pressable?: boolean; -}; - -export const Avatar = observer( - ({ - channel, - user, - server, - status, - size, - backgroundColor, - masquerade, - pressable, - }: AvatarProps) => { - let memberObject = - server && user - ? client.members.getKey({ - server: server?._id, - user: user?._id, - }) - : null; - let statusColor; - let statusScale = 2.7; - if (status) { - const s = user?.online ? user.status?.presence || 'Online' : 'Offline'; - statusColor = currentTheme[`status${s}`]; - } - let Container = pressable - ? ({children}) => ( - app.openImage(memberObject?.avatar || user?.avatar)}> - {children} - - ) - : View; - if (user) { - return ( - - - ) : null} - - ); - } - if (channel) { - return ( - - {channel?.generateIconURL() ? ( - { - /* FIXME: Rendering emojis reveals spoiler markdown - renderEmojis(node.content)*/ + /* FIXME: Rendering emoji reveals spoiler markdown + renderEmoji(node.content)*/ node.content } @@ -63,7 +64,7 @@ const spoilerRule = { return ( - {renderEmojis(node.content)} + {renderEmoji(node.content)} ); }, diff --git a/src/components/common/atoms/Avatar.tsx b/src/components/common/atoms/Avatar.tsx new file mode 100644 index 00000000..62860961 --- /dev/null +++ b/src/components/common/atoms/Avatar.tsx @@ -0,0 +1,131 @@ +import {Pressable, View} from 'react-native'; +import {observer} from 'mobx-react-lite'; + +import {Server, User, Channel} from 'revolt.js'; + +import {Image} from '@rvmob/crossplat/Image'; +import {app, client} from '@rvmob/Generic'; +import {currentTheme} from '@rvmob/Theme'; +import {DEFAULT_MAX_SIDE} from '@rvmob/lib/consts'; + +type AvatarProps = { + channel?: Channel; + user?: User | null; + server?: Server; + status?: boolean; + size?: number; + backgroundColor?: string; + masquerade?: string; + pressable?: boolean; +}; + +export const Avatar = observer( + ({ + channel, + user, + server, + status, + size, + backgroundColor, + masquerade, + pressable, + }: AvatarProps) => { + let memberObject = + server && user + ? client.members.getKey({ + server: server?._id, + user: user?._id, + }) + : null; + let statusColor; + let statusScale = 2.7; + if (status) { + const s = user?.online ? user.status?.presence || 'Online' : 'Offline'; + statusColor = currentTheme[`status${s}`]; + } + let Container = pressable + ? ({children}) => ( + app.openImage(memberObject?.avatar || user?.avatar)}> + {children} + + ) + : View; + if (user) { + return ( + + + ) : null} + + ); + } + if (channel) { + return ( + + {channel?.generateIconURL() ? ( + { + const uri = directory + ? client.configuration?.features.autumn.url + directory + attachment + : client.generateFileURL(attachment) + '?max_side=' + DEFAULT_MAX_SIDE; + return ( + + { + + } + + ); +}; diff --git a/src/components/common/atoms/InputWithButton.tsx b/src/components/common/atoms/InputWithButton.tsx index b9defa87..1ae6007d 100644 --- a/src/components/common/atoms/InputWithButton.tsx +++ b/src/components/common/atoms/InputWithButton.tsx @@ -4,9 +4,10 @@ import {TextInput, View, ViewStyle} from 'react-native'; import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'; -import {showToast} from '../../../lib/utils'; -import {currentTheme, styles} from '../../../Theme'; -import {Button, Text} from '.'; +import {showToast} from '@rvmob/lib/utils'; +import {currentTheme, styles} from '@rvmob/Theme'; +import {Button} from '@rvmob/components/common/atoms/Button'; +import {Text} from '@rvmob/components/common/atoms/Text'; // TODO: move these once i figure out what to do with the plain Input component/where it'll be useful diff --git a/src/components/common/atoms/Link.tsx b/src/components/common/atoms/Link.tsx index 3854c61c..02c3accd 100644 --- a/src/components/common/atoms/Link.tsx +++ b/src/components/common/atoms/Link.tsx @@ -1,8 +1,8 @@ import {TouchableOpacity} from 'react-native'; -import {openUrl} from '../../../Generic'; -import {styles} from '../../../Theme'; +import {styles} from '@rvmob/Theme'; import {Text} from './Text'; +import {openUrl} from '@rvmob/lib/utils'; type LinkProps = { link: string; diff --git a/src/components/common/atoms/Text.tsx b/src/components/common/atoms/Text.tsx index 1fbe5b9e..098a4ce5 100644 --- a/src/components/common/atoms/Text.tsx +++ b/src/components/common/atoms/Text.tsx @@ -1,6 +1,6 @@ import {Text as NativeText /*, TextProps, TextStyle*/} from 'react-native'; -import {currentTheme, styles} from '../../../Theme'; +import {currentTheme, styles} from '@rvmob/Theme'; // TODO: fix typing issue (the children prop seemingly isn't being set to any) then stop using any for the Text component itself // type FullTextProps = TextProps & { diff --git a/src/components/common/atoms/Username.tsx b/src/components/common/atoms/Username.tsx index 77f48f15..d983ab50 100644 --- a/src/components/common/atoms/Username.tsx +++ b/src/components/common/atoms/Username.tsx @@ -3,11 +3,11 @@ import {observer} from 'mobx-react-lite'; import {Server, User} from 'revolt.js'; -import {app, client} from '../../../Generic'; -import {currentTheme, styles} from '../../../Theme'; +import {app, client} from '@rvmob/Generic'; +import {currentTheme, styles} from '@rvmob/Theme'; import {Text} from './Text'; -import {USER_IDS} from '../../../lib/consts'; -import {getColour} from '../../../lib/utils'; +import {USER_IDS} from '@rvmob/lib/consts'; +import {getColour} from '@rvmob/lib/utils'; type UsernameProps = { server?: Server; diff --git a/src/components/common/atoms/index.tsx b/src/components/common/atoms/index.tsx index 689dcc1a..f155c15b 100644 --- a/src/components/common/atoms/index.tsx +++ b/src/components/common/atoms/index.tsx @@ -1,9 +1,11 @@ +export {Avatar} from './Avatar'; export {BackButton} from './BackButton'; export {Button} from './Button'; export {ChannelButton} from './ChannelButton'; export {Checkbox} from './Checkbox'; export {ContextButton} from './ContextButton'; export {CopyIDButton} from './CopyIDButton'; +export {GeneralAvatar} from './GeneralAvatar'; export {InputWithButton} from './InputWithButton'; export {Link} from './Link'; export {Text} from './Text'; diff --git a/src/components/common/messaging/Emoji.tsx b/src/components/common/messaging/Emoji.tsx index dcf22f6f..6bb0afd2 100644 --- a/src/components/common/messaging/Emoji.tsx +++ b/src/components/common/messaging/Emoji.tsx @@ -14,7 +14,7 @@ import { RE_UNICODE_EMOJI, } from '../../../lib/consts'; -export const SvgEmoji = ({id, pack}: {id: string; pack: EmojiPacks}) => { +const SvgEmoji = ({id, pack}: {id: string; pack: EmojiPacks}) => { const [error, setError] = useState(false); if (error) { return {`:${id}:`}; @@ -33,7 +33,7 @@ export const SvgEmoji = ({id, pack}: {id: string; pack: EmojiPacks}) => { /> ); }; -export const CustomEmoji = ({id}: {id: string}) => { +const CustomEmoji = ({id}: {id: string}) => { const [error, setError] = useState(false); if (error) { return {`:${id}:`}; @@ -49,7 +49,7 @@ export const CustomEmoji = ({id}: {id: string}) => { ); }; -export function renderEmojis(content: string) { +export function renderEmoji(content: string) { const tokens = content.split(RE_CUSTOM_EMOJI); // get the emoji pack; default to system diff --git a/src/components/common/messaging/InviteEmbed.tsx b/src/components/common/messaging/InviteEmbed.tsx index 07bf90bd..017f731f 100644 --- a/src/components/common/messaging/InviteEmbed.tsx +++ b/src/components/common/messaging/InviteEmbed.tsx @@ -4,9 +4,9 @@ import {observer} from 'mobx-react-lite'; import {API, Message} from 'revolt.js'; -import {GeneralAvatar, app, client} from '../../../Generic'; +import {app, client} from '../../../Generic'; import {currentTheme} from '../../../Theme'; -import {Button, Text} from '../atoms'; +import {Button, GeneralAvatar, Text} from '../atoms'; const InviteBackground = observer(({children}: {children: any}) => { return ( diff --git a/src/components/common/messaging/Message.tsx b/src/components/common/messaging/Message.tsx index ae0f181a..f1ae9ed3 100644 --- a/src/components/common/messaging/Message.tsx +++ b/src/components/common/messaging/Message.tsx @@ -7,21 +7,18 @@ import {enGB, enUS} from 'date-fns/locale'; import {Message as RevoltMessage} from 'revolt.js'; import {decodeTime} from 'ulid'; -import { - InviteEmbed, - MessageEmbed, - MessageReactions, - PlatformModerationMessage, - ReplyMessage, -} from './'; -import {app, client, openUrl} from '../../../Generic'; -import {Avatar} from '../../../Profile'; +import {InviteEmbed} from './InviteEmbed'; +import {MessageEmbed} from './MessageEmbed'; +import {MessageReactions} from './MessageReactions'; +import {PlatformModerationMessage} from './PlatformModerationMessage'; +import {ReplyMessage} from './ReplyMessage'; +import {app, client} from '../../../Generic'; import {currentTheme, styles} from '../../../Theme'; import {Image} from '@rvmob/crossplat/Image'; -import {Text, Username} from '../atoms'; +import {Avatar, Text, Username} from '../atoms'; import {MarkdownView} from '../MarkdownView'; import {RE_INVITE, USER_IDS} from '../../../lib/consts'; -import {getReadableFileSize, parseRevoltNodes} from '../../../lib/utils'; +import {getReadableFileSize, openUrl, parseRevoltNodes} from '@rvmob/lib/utils'; type MessageProps = { message: RevoltMessage; diff --git a/src/components/common/messaging/ReplyMessage.tsx b/src/components/common/messaging/ReplyMessage.tsx index 1bc216ad..e12934a7 100644 --- a/src/components/common/messaging/ReplyMessage.tsx +++ b/src/components/common/messaging/ReplyMessage.tsx @@ -2,9 +2,8 @@ import {View} from 'react-native'; import {Message} from 'revolt.js'; -import {Avatar} from '../../../Profile'; import {styles} from '../../../Theme'; -import {Text, Username} from '../atoms'; +import {Avatar, Text, Username} from '../atoms'; type ReplyProps = { message?: Message; diff --git a/src/components/common/messaging/index.ts b/src/components/common/messaging/index.ts index 02d32ebc..7d781e35 100644 --- a/src/components/common/messaging/index.ts +++ b/src/components/common/messaging/index.ts @@ -1,6 +1 @@ -export {InviteEmbed} from './InviteEmbed'; export {Message} from './Message'; -export {MessageEmbed} from './MessageEmbed'; -export {MessageReactions} from './MessageReactions'; -export {PlatformModerationMessage} from './PlatformModerationMessage'; -export {ReplyMessage} from './ReplyMessage'; diff --git a/src/components/navigation/ChannelIcon.tsx b/src/components/navigation/ChannelIcon.tsx index 4bfa4996..d0273468 100644 --- a/src/components/navigation/ChannelIcon.tsx +++ b/src/components/navigation/ChannelIcon.tsx @@ -1,4 +1,3 @@ - import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'; diff --git a/src/components/navigation/ServerList.tsx b/src/components/navigation/ServerList.tsx index 0a60f75b..1adf638a 100644 --- a/src/components/navigation/ServerList.tsx +++ b/src/components/navigation/ServerList.tsx @@ -5,11 +5,12 @@ import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIc import {decodeTime} from 'ulid'; -import {client, openUrl} from '../../Generic'; +import {client} from '@rvmob/Generic'; import {currentTheme, styles} from '../../Theme'; import {Text} from '../common/atoms'; import {Image} from '@rvmob/crossplat/Image'; import {DEFAULT_MAX_SIDE} from '../../lib/consts'; +import {openUrl} from '@rvmob/lib/utils'; export const ServerList = observer( ({ diff --git a/src/components/pages/HomePage.tsx b/src/components/pages/HomePage.tsx index c44dd5a9..75e0fe25 100644 --- a/src/components/pages/HomePage.tsx +++ b/src/components/pages/HomePage.tsx @@ -2,15 +2,15 @@ import {TouchableOpacity, View} from 'react-native'; import {useTranslation} from 'react-i18next'; import {observer} from 'mobx-react-lite'; -import {app, client, openUrl} from '@rvmob/Generic'; -import {Avatar} from '@rvmob/Profile'; +import {app, client} from '@rvmob/Generic'; import { SPECIAL_DATES, SPECIAL_DATE_OBJECTS, SPECIAL_SERVERS, } from '@rvmob/lib/consts'; +import {openUrl} from '@rvmob/lib/utils'; import {styles} from '@rvmob/Theme'; -import {Button, Text, Username} from '@rvmob/components/common/atoms'; +import {Avatar, Button, Text, Username} from '@rvmob/components/common/atoms'; import {ChannelIcon} from '@rvmob/components/navigation/ChannelIcon'; import {ChannelHeader} from '@rvmob/components/navigation/ChannelHeader'; diff --git a/src/components/sheets/BotInviteSheet.tsx b/src/components/sheets/BotInviteSheet.tsx index e5c153d2..fca8f335 100644 --- a/src/components/sheets/BotInviteSheet.tsx +++ b/src/components/sheets/BotInviteSheet.tsx @@ -4,9 +4,9 @@ import {observer} from 'mobx-react-lite'; import {Server, User} from 'revolt.js'; -import {client, GeneralAvatar} from '../../Generic'; +import {client} from '../../Generic'; import {currentTheme} from '../../Theme'; -import {Button, Text} from '../common/atoms'; +import {Button, GeneralAvatar, Text} from '../common/atoms'; import {ServerList} from '../navigation/ServerList'; export const BotInviteSheet = observer( diff --git a/src/components/sheets/MessageMenuSheet.tsx b/src/components/sheets/MessageMenuSheet.tsx index 01b569df..66a580d0 100644 --- a/src/components/sheets/MessageMenuSheet.tsx +++ b/src/components/sheets/MessageMenuSheet.tsx @@ -13,7 +13,7 @@ import {app, setFunction} from '../../Generic'; import {currentTheme, styles} from '../../Theme'; import {ContextButton, CopyIDButton, Text} from '../common/atoms'; import {BottomSheet} from '../common/BottomSheet'; -import {ReplyMessage} from '../common/messaging'; +import {ReplyMessage} from '../common/messaging/ReplyMessage'; export const MessageMenuSheet = observer(() => { const [message, setMessage] = useState(null as Message | null); diff --git a/src/components/sheets/ProfileSheet.tsx b/src/components/sheets/ProfileSheet.tsx index 697f0ba0..97dacef5 100644 --- a/src/components/sheets/ProfileSheet.tsx +++ b/src/components/sheets/ProfileSheet.tsx @@ -12,15 +12,17 @@ import FA5Icon from 'react-native-vector-icons/FontAwesome5'; import {User, Server} from 'revolt.js'; -import {app, client, GeneralAvatar, openUrl, setFunction} from '../../Generic'; +import {app, client, setFunction} from '@rvmob/Generic'; import {BADGES, USER_IDS} from '../../lib/consts'; -import {parseRevoltNodes, showToast} from '../../lib/utils'; -import {Avatar, MiniProfile, RoleView} from '../../Profile'; +import {openUrl, parseRevoltNodes, showToast} from '@rvmob/lib/utils'; +import {MiniProfile, RoleView} from '@rvmob/Profile'; import {currentTheme, styles} from '../../Theme'; import { + Avatar, Button, ContextButton, CopyIDButton, + GeneralAvatar, Link, Text, Username, diff --git a/src/components/sheets/ReportSheet.tsx b/src/components/sheets/ReportSheet.tsx index 40d64e3b..e75a1549 100644 --- a/src/components/sheets/ReportSheet.tsx +++ b/src/components/sheets/ReportSheet.tsx @@ -10,9 +10,8 @@ import {Message} from 'revolt.js'; import {app, client, setFunction} from '../../Generic'; import {USER_IDS} from '../../lib/consts'; import type {ReportedObject} from '../../lib/types'; -import {Avatar} from '../../Profile'; import {currentTheme} from '../../Theme'; -import {Button, Text, Username} from '../common/atoms'; +import {Avatar, Button, Text, Username} from '../common/atoms'; import {MarkdownView} from '../common/MarkdownView'; import {BottomSheet} from '../common/BottomSheet'; diff --git a/src/components/sheets/ServerInfoSheet.tsx b/src/components/sheets/ServerInfoSheet.tsx index dfc10e0f..a1f65bb0 100644 --- a/src/components/sheets/ServerInfoSheet.tsx +++ b/src/components/sheets/ServerInfoSheet.tsx @@ -9,11 +9,16 @@ import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIc import {Member, Server} from 'revolt.js'; -import {GeneralAvatar, app, client, setFunction} from '../../Generic'; +import {app, client, setFunction} from '../../Generic'; import {SERVER_FLAGS, SPECIAL_SERVERS} from '../../lib/consts'; import {showToast} from '../../lib/utils'; import {currentTheme, styles} from '../../Theme'; -import {ContextButton, CopyIDButton, Text} from '../common/atoms'; +import { + ContextButton, + CopyIDButton, + GeneralAvatar, + Text, +} from '../common/atoms'; import {BottomSheet} from '../common/BottomSheet'; import {MarkdownView} from '../common/MarkdownView'; import {Image} from '@rvmob/crossplat/Image'; diff --git a/src/components/sheets/ServerInviteSheet.tsx b/src/components/sheets/ServerInviteSheet.tsx index b4ceba46..14e64e7a 100644 --- a/src/components/sheets/ServerInviteSheet.tsx +++ b/src/components/sheets/ServerInviteSheet.tsx @@ -5,9 +5,9 @@ import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIc import {API} from 'revolt.js'; -import {app, client, GeneralAvatar} from '../../Generic'; +import {app, client} from '../../Generic'; import {currentTheme} from '../../Theme'; -import {Button, Text} from '../common/atoms'; +import {Button, GeneralAvatar, Text} from '../common/atoms'; import {Image} from '@rvmob/crossplat/Image'; export const ServerInviteSheet = observer( diff --git a/src/components/sheets/SettingsSheet.tsx b/src/components/sheets/SettingsSheet.tsx index be6d4447..4115d660 100644 --- a/src/components/sheets/SettingsSheet.tsx +++ b/src/components/sheets/SettingsSheet.tsx @@ -16,14 +16,15 @@ import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIc import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; import AppInfo from '../../../package.json'; -import {app, client, openUrl, setFunction} from '../../Generic'; +import {app, client, setFunction} from '../../Generic'; import { CONTRIBUTORS_LIST, FEDI_PROFILE, GITHUB_REPO, OPEN_ISSUES, } from '@rvmob/lib/consts'; -import {SettingsSection} from '../../lib/types'; +import {SettingsSection} from '@rvmob/lib/types'; +import {openUrl} from '@rvmob/lib/utils'; import {currentTheme, styles} from '../../Theme'; import {BackButton, ContextButton, Link, Text} from '../common/atoms'; import {SettingsCategory} from '../common/settings'; diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 3fa95a70..88c9b266 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -3,6 +3,7 @@ export { calculateGrouped, fetchMessages, getReadableFileSize, + openUrl, parseRevoltNodes, showToast, sleep, diff --git a/src/lib/utils/utils.ts b/src/lib/utils/utils.ts index ae855057..591b9df0 100644 --- a/src/lib/utils/utils.ts +++ b/src/lib/utils/utils.ts @@ -1,11 +1,17 @@ -import {Platform, ToastAndroid} from 'react-native'; +import {Linking, Platform, ToastAndroid} from 'react-native'; import {differenceInMinutes, isSameDay} from 'date-fns'; import {Channel, Message} from 'revolt.js'; import {decodeTime} from 'ulid'; -import {client} from '@rvmob/Generic'; -import {DEFAULT_MESSAGE_LOAD_COUNT} from '@rvmob/lib/consts'; +import {app, client} from '@rvmob/Generic'; +import { + DEFAULT_MESSAGE_LOAD_COUNT, + DISCOVER_URL, + RE_BOT_INVITE, + RE_INVITE, + WIKI_URL, +} from '@rvmob/lib/consts'; /** * Sleep for the specified amount of milliseconds before continuing. @@ -138,3 +144,38 @@ export function showToast(badgeName: string) { ); } } + +export const openUrl = (url: string) => { + console.log(`[FUNCTIONS] Handling URL: ${url}`); + if (url.startsWith('/@')) { + console.log(`[FUNCTIONS] Opening user profile from URL: ${url}`); + let id = url.slice(2); + let user = client.users.get(id); + if (user) { + app.openProfile(user); + } + return; + } + let match = url.match(RE_INVITE); + let isDiscover = url.match(DISCOVER_URL); + let isWiki = url.match(WIKI_URL); + if (match && !isWiki && !isDiscover) { + console.log(`[FUNCTIONS] Opening server invite from URL: ${url}`); + app.openInvite(match[0].split('/').pop()); + return; + } + let botmatch = url.match(RE_BOT_INVITE); + if (botmatch) { + console.log(`[FUNCTIONS] Opening bot invite from URL: ${url}`); + app.openBotInvite(botmatch[0].split('/').pop()); + return; + } + if (url.startsWith('/bot/')) { + console.log(`[FUNCTIONS] Opening bot invite from URL: ${url}`); + const id = url.split('/'); + app.openBotInvite(id[2]); + return; + } + + Linking.openURL(url); +};