Skip to content

Commit

Permalink
Rename link setting, support command click events.
Browse files Browse the repository at this point in the history
  • Loading branch information
retrixe committed Jan 31, 2022
1 parent d32a684 commit 1add228
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 30 deletions.
66 changes: 37 additions & 29 deletions src/screens/ChatScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ import { NativeStackNavigationProp } from '@react-navigation/native-stack'

import globalStyle from '../globalStyle'
import useDarkMode from '../context/useDarkMode'
import SettingsContext from '../context/settingsContext'
import ConnectionContext from '../context/connectionContext'
import SettingsContext, { Settings } from '../context/settingsContext'
import {
ChatToJsx,
parseValidJson,
mojangColorMap,
lightColorMap,
MinecraftChat,
ClickEvent,
ColorMap
} from '../minecraft/chatToJsx'
import { concatPacketData } from '../minecraft/packet'
Expand All @@ -39,45 +40,34 @@ interface Message {
text: MinecraftChat
}

const renderItem = (colorMap: ColorMap, settings: Settings) => {
const renderItem = (
colorMap: ColorMap,
clickEventHandler: (ce: ClickEvent) => void
) => {
const ItemRenderer = ({ item }: { item: Message }) => (
<View style={styles.androidScaleInvert}>
<ChatToJsx
chat={item.text}
component={Text}
colorMap={colorMap}
clickEventHandler={async ce => {
// TODO: run_command, suggest_command and URL prompt support.
if (
ce.action === 'open_url' &&
settings.webLinks &&
(ce.value.startsWith('https://') || ce.value.startsWith('http://'))
) {
await Linking.openURL(ce.value)
} else if (ce.action === 'copy_to_clipboard') {
Clipboard.setString(ce.value)
} // No open_file/change_page handling.
}}
clickEventHandler={clickEventHandler}
/>
</View>
)
return ItemRenderer // LOW-TODO: Performance implications?
} // https://reactnative.dev/docs/optimizing-flatlist-configuration
const ChatMessageList = (props: {
messages: Message[]
darkMode: boolean
settings: Settings
colorMap: ColorMap
clickEventHandler: (ce: ClickEvent) => void
}) => {
return (
<FlatList
inverted={Platform.OS !== 'android'}
data={props.messages}
style={[styles.androidScaleInvert, styles.chatArea]}
contentContainerStyle={styles.chatAreaScrollView}
renderItem={renderItem(
props.darkMode ? mojangColorMap : lightColorMap,
props.settings
)}
renderItem={renderItem(props.colorMap, props.clickEventHandler)}
/>
)
}
Expand Down Expand Up @@ -177,13 +167,14 @@ const ChatScreen = ({ navigation }: { navigation: ChatNavigationProp }) => {
}
}, [connection, setConnection, navigation])

const sendMessage = () => {
const trim = message.trim()
if (!connection || !trim) return
const sendMessage = (msg: string, saveHistory: boolean) => {
if (!connection || !msg) return
setMessage('')
if (trim.startsWith('/')) setCommandHistory(ch => ch.concat([trim]))
if (msg.startsWith('/') && saveHistory) {
setCommandHistory(ch => ch.concat([msg]))
}
connection.connection
.writePacket(0x03, concatPacketData([trim]))
.writePacket(0x03, concatPacketData([msg]))
.catch(errorHandler(addMessage, sendMessageErr))
}

Expand Down Expand Up @@ -235,24 +226,41 @@ const ChatScreen = ({ navigation }: { navigation: ChatNavigationProp }) => {
<>
<ChatMessageListMemo
messages={messages}
darkMode={darkMode}
settings={settings}
colorMap={darkMode ? mojangColorMap : lightColorMap}
clickEventHandler={async ce => {
// TODO: URL prompt support.
if (
ce.action === 'open_url' &&
settings.webLinks &&
(ce.value.startsWith('https://') ||
ce.value.startsWith('http://'))
) {
await Linking.openURL(ce.value)
} else if (ce.action === 'copy_to_clipboard') {
Clipboard.setString(ce.value)
} else if (ce.action === 'run_command') {
// TODO: This should be a prompt - sendMessage(ce.value, false)
setMessage(ce.value)
} else if (ce.action === 'suggest_command') {
setMessage(ce.value)
} // No open_file/change_page handling.
}}
/>
<View style={darkMode ? styles.textAreaDark : styles.textArea}>
<TextField
value={message}
maxLength={charLimit}
onChangeText={setMessage}
style={styles.textField}
onSubmitEditing={sendMessage}
onSubmitEditing={() => sendMessage(message.trim(), true)}
enablesReturnKeyAutomatically
returnKeyType='send'
blurOnSubmit={false}
autoCorrect={!settings.disableAutoCorrect}
/>
<Ionicons.Button
name='ios-send-sharp'
onPress={sendMessage}
onPress={() => sendMessage(message.trim(), true)}
iconStyle={styles.sendButtonIcon}
borderRadius={32}
/>
Expand Down
2 changes: 1 addition & 1 deletion src/screens/settings/SettingScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const SettingScreen = (props: { button?: JSX.Element }) => {
setValue={webLinks => setSettings({ webLinks })}
/>
<Setting
name='Prompt on link click'
name='Prompt on opening links'
value={settings.linkPrompt}
setValue={linkPrompt => setSettings({ linkPrompt })}
/>
Expand Down

0 comments on commit 1add228

Please sign in to comment.