|
| 1 | +import React, { useEffect, useState } from 'react' |
| 2 | +import { StyleSheet, View, Pressable } from 'react-native' |
| 3 | +import { Picker } from '@react-native-picker/picker' |
| 4 | + |
| 5 | +import globalStyle from '../../globalStyle' |
| 6 | +import { Servers } from '../../context/serversContext' |
| 7 | +import Dialog, { dialogStyles } from '../Dialog' |
| 8 | +import Text from '../Text' |
| 9 | +import TextField from '../TextField' |
| 10 | +import { protocolMap } from '../../minecraft/utils' |
| 11 | + |
| 12 | +const EditServerDialog = ({ |
| 13 | + servers, |
| 14 | + darkMode, |
| 15 | + editServer, |
| 16 | + deleteServer, |
| 17 | + editServerDialogOpen, |
| 18 | + setEditServerDialogOpen |
| 19 | +}: { |
| 20 | + servers: Servers |
| 21 | + darkMode: boolean |
| 22 | + editServer: ( |
| 23 | + serverName: string, |
| 24 | + version: keyof typeof protocolMap, |
| 25 | + address: string |
| 26 | + ) => void |
| 27 | + deleteServer: (server: string) => void |
| 28 | + editServerDialogOpen: string | boolean |
| 29 | + setEditServerDialogOpen: (server: string | boolean) => void |
| 30 | +}) => { |
| 31 | + const [ipAddr, setIpAddr] = useState('') |
| 32 | + const [ipAddrRed, setIpAddrRed] = useState(false) |
| 33 | + const [newServerName, setNewServerName] = useState('') |
| 34 | + const [serverNameRed, setServerNameRed] = useState(false) |
| 35 | + const [serverVersion, setServerVersion] = |
| 36 | + useState<keyof typeof protocolMap>('auto') |
| 37 | + |
| 38 | + const invalidServerName = newServerName.length > 32 |
| 39 | + |
| 40 | + // Reset properties whenever dialog opens (could also happen when server changes, though, but this is unlikely). |
| 41 | + const server = |
| 42 | + typeof editServerDialogOpen === 'string' && servers[editServerDialogOpen] |
| 43 | + useEffect(() => { |
| 44 | + setIpAddrRed(false) |
| 45 | + setServerNameRed(false) |
| 46 | + if (server) { |
| 47 | + setNewServerName(editServerDialogOpen) |
| 48 | + setServerVersion(server.version) |
| 49 | + setIpAddr(server.address) |
| 50 | + } else { |
| 51 | + setNewServerName('') |
| 52 | + setServerVersion('auto') |
| 53 | + setIpAddr('') |
| 54 | + } |
| 55 | + }, [editServerDialogOpen, server]) |
| 56 | + |
| 57 | + const closeDialog = () => setEditServerDialogOpen(false) |
| 58 | + |
| 59 | + const handleDeleteServer = () => { |
| 60 | + if (typeof editServerDialogOpen !== 'string') return |
| 61 | + deleteServer(editServerDialogOpen) |
| 62 | + closeDialog() |
| 63 | + } |
| 64 | + |
| 65 | + const handleEditServer = () => { |
| 66 | + const edit = typeof editServerDialogOpen === 'string' |
| 67 | + if ( |
| 68 | + !newServerName || |
| 69 | + invalidServerName || |
| 70 | + (!edit && servers[newServerName]) || |
| 71 | + (edit && servers[newServerName] && newServerName !== editServerDialogOpen) |
| 72 | + ) { |
| 73 | + return setServerNameRed(true) |
| 74 | + } else if (ipAddr === '') { |
| 75 | + return setIpAddrRed(true) |
| 76 | + } |
| 77 | + editServer(newServerName, serverVersion, ipAddr) |
| 78 | + closeDialog() |
| 79 | + } |
| 80 | + |
| 81 | + const modalButtonCancelText = darkMode |
| 82 | + ? dialogStyles.modalButtonCancelDarkText |
| 83 | + : dialogStyles.modalButtonCancelText |
| 84 | + |
| 85 | + return ( |
| 86 | + <Dialog visible={!!editServerDialogOpen} onRequestClose={closeDialog}> |
| 87 | + <Text style={dialogStyles.modalTitle}> |
| 88 | + {typeof editServerDialogOpen === 'string' ? 'Edit' : 'Add'} Server |
| 89 | + </Text> |
| 90 | + <TextField |
| 91 | + red={serverNameRed || invalidServerName} |
| 92 | + value={newServerName} |
| 93 | + onChangeText={setNewServerName} |
| 94 | + placeholder='Server Name' |
| 95 | + /> |
| 96 | + <TextField |
| 97 | + red={ipAddrRed} |
| 98 | + value={ipAddr} |
| 99 | + onChangeText={setIpAddr} |
| 100 | + placeholder='IP Address' |
| 101 | + /> |
| 102 | + <Picker |
| 103 | + selectedValue={serverVersion} |
| 104 | + style={darkMode ? styles.addServerPickerDark : styles.addServerPicker} |
| 105 | + onValueChange={itemValue => setServerVersion(itemValue)} |
| 106 | + dropdownIconColor={darkMode ? '#ffffff' : '#000000'} |
| 107 | + > |
| 108 | + <Picker.Item label='Auto' value='auto' /> |
| 109 | + <Picker.Item label='1.19.1/1.19.2' value='1.19.1' /> |
| 110 | + <Picker.Item label='1.19' value='1.19' /> |
| 111 | + <Picker.Item label='1.18.2' value='1.18.2' /> |
| 112 | + <Picker.Item label='1.18/1.18.1' value='1.18' /> |
| 113 | + <Picker.Item label='1.17.1' value='1.17.1' /> |
| 114 | + <Picker.Item label='1.17' value='1.17' /> |
| 115 | + <Picker.Item label='1.16.4/1.16.5' value='1.16.4' /> |
| 116 | + </Picker> |
| 117 | + <View style={dialogStyles.modalButtons}> |
| 118 | + {typeof editServerDialogOpen === 'string' && ( |
| 119 | + <Pressable |
| 120 | + onPress={handleDeleteServer} |
| 121 | + android_ripple={{ color: '#aaa' }} |
| 122 | + style={dialogStyles.modalButton} |
| 123 | + > |
| 124 | + <Text style={styles.deleteServerButtonText}>DELETE</Text> |
| 125 | + </Pressable> |
| 126 | + )} |
| 127 | + <View style={globalStyle.flexSpacer} /> |
| 128 | + <Pressable |
| 129 | + onPress={closeDialog} |
| 130 | + android_ripple={{ color: '#aaa' }} |
| 131 | + style={dialogStyles.modalButton} |
| 132 | + > |
| 133 | + <Text style={modalButtonCancelText}>CANCEL</Text> |
| 134 | + </Pressable> |
| 135 | + <Pressable |
| 136 | + onPress={handleEditServer} |
| 137 | + android_ripple={{ color: '#aaa' }} |
| 138 | + style={dialogStyles.modalButton} |
| 139 | + > |
| 140 | + <Text style={dialogStyles.modalButtonText}> |
| 141 | + {typeof editServerDialogOpen === 'string' ? 'EDIT' : 'ADD'} |
| 142 | + </Text> |
| 143 | + </Pressable> |
| 144 | + </View> |
| 145 | + </Dialog> |
| 146 | + ) |
| 147 | +} |
| 148 | + |
| 149 | +const styles = StyleSheet.create({ |
| 150 | + addServerPickerDark: { color: '#ffffff' }, |
| 151 | + addServerPicker: { color: '#000000' }, |
| 152 | + deleteServerButtonText: { color: '#ff0000', fontWeight: 'bold' } |
| 153 | +}) |
| 154 | + |
| 155 | +export default EditServerDialog |
0 commit comments