import Button from '@app/components/Button' import GradientScrollView from '@app/components/GradientScrollView' import SettingsItem from '@app/components/SettingsItem' import { Server } from '@app/models/settings' import { selectSettings } from '@app/state/settings' import { useStore } from '@app/state/store' import colors from '@app/styles/colors' import font from '@app/styles/font' import { useNavigation } from '@react-navigation/native' import md5 from 'md5' import React, { useCallback, useState } from 'react' import { StyleSheet, Text, TextInput, View } from 'react-native' import { Switch } from 'react-native-gesture-handler' import { v4 as uuidv4 } from 'uuid' function replaceIndex(array: T[], index: number, replacement: T): T[] { const start = array.slice(0, index) const end = array.slice(index + 1) return [...start, replacement, ...end] } const ServerView: React.FC<{ id?: string }> = ({ id }) => { const navigation = useNavigation() const activeServer = useStore(selectSettings.activeServer) const setActiveServer = useStore(selectSettings.setActiveServer) const servers = useStore(selectSettings.servers) const setServers = useStore(selectSettings.setServers) const server = id ? servers.find(s => s.id === id) : undefined const [address, setAddress] = useState(server?.address || '') const [username, setUsername] = useState(server?.username || '') const [password, setPassword] = useState(server?.token ? 'password' : '') const [scrobble, setScrobble] = useState(server?.scrobble || false) const validate = useCallback(() => { return !!address && !!username && !!password }, [address, username, password]) const canRemove = useCallback(() => { return id && servers.length > 1 && activeServer?.id !== id }, [id, servers, activeServer]) const exit = useCallback(() => { if (navigation.canGoBack()) { navigation.goBack() } else { navigation.navigate('main') } }, [navigation]) const save = useCallback(() => { if (!validate()) { return } const salt = server?.salt || uuidv4() let token: string if (password === 'password' && server?.token) { token = server.token } else { token = md5(password + salt) } const update: Server = { id: server?.id || uuidv4(), address, username, salt, token, scrobble, } if (server) { setServers( replaceIndex( servers, servers.findIndex(s => s.id === id), update, ), ) } else { setServers([...servers, update]) } if (!activeServer) { setActiveServer(update.id) } exit() }, [ activeServer, address, exit, id, password, scrobble, server, servers, setActiveServer, setServers, username, validate, ]) const remove = useCallback(() => { if (!canRemove()) { return } const update = [...servers] update.splice( update.findIndex(s => s.id === id), 1, ) setServers(update) exit() }, [canRemove, exit, id, servers, setServers]) return ( Address Username Password