diff --git a/gui/src/main.rs b/gui/src/main.rs index db94be5..cf08715 100644 --- a/gui/src/main.rs +++ b/gui/src/main.rs @@ -16,6 +16,15 @@ fn address_is_valid(addr: &str) -> bool { !addr.is_empty() && !addr.contains(':') } +fn split_host_port(input: &str) -> (String, Option) { + if let Some((host, port)) = input.rsplit_once(':') { + if !port.is_empty() && port.chars().all(|c| c.is_ascii_digit()) { + return (host.to_string(), Some(port.to_string())); + } + } + (input.to_string(), None) +} + #[derive(Clone, Copy, PartialEq, Eq)] pub enum UserIcon { Normal, @@ -900,7 +909,13 @@ fn AddServerModal(on_save: EventHandler, on_cancel: EventHandler<() placeholder: "mumble.example.com", pattern: ADDRESS_PATTERN, value: "{address.read()}", - oninput: move |evt| address.set(evt.value().clone()), + oninput: move |evt| { + let (host, maybe_port) = split_host_port(&evt.value()); + address.set(host); + if let Some(p) = maybe_port { + port.set(p); + } + }, required: true, } div { @@ -1028,7 +1043,13 @@ fn EditServerModal( placeholder: "mumble.example.com", pattern: ADDRESS_PATTERN, value: "{address.read()}", - oninput: move |evt| address.set(evt.value().clone()), + oninput: move |evt| { + let (host, maybe_port) = split_host_port(&evt.value()); + address.set(host); + if let Some(p) = maybe_port { + port.set(p); + } + }, required: true, } div {