From 022021014c2921174478b06ff1f33450a63220da Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Sat, 16 Aug 2025 12:43:50 +1000 Subject: [PATCH] Validates url when adding a link --- .../UserInterfaceState.xcuserstate | Bin 37485 -> 37485 bytes .../Resources/en.lproj/Localizable.strings | 1 + .../zh-Hans.lproj/Localizable.strings | 6 + mobile/Heygo/Views/LinkFormView.swift | 124 +++++++++++++++++- 4 files changed, 130 insertions(+), 1 deletion(-) diff --git a/mobile/Heygo.xcodeproj/project.xcworkspace/xcuserdata/junv.xcuserdatad/UserInterfaceState.xcuserstate b/mobile/Heygo.xcodeproj/project.xcworkspace/xcuserdata/junv.xcuserdatad/UserInterfaceState.xcuserstate index f9bd4c5e20f929dcd670f119c4807549d18f0309..f5a375a722f34d53a66636f35a4a6fbef94bd8ba 100644 GIT binary patch delta 340 zcmaF6gz4=PrVVeI_~ls?SQJ^bS#(%*S@c+pHveII#>!~C`7y@{ZD#idgUJ_7WGD0H zX+^L|ut+nAEn?PTk!twg$mqI=@dt}+!;(fuw+4f_l>Fq<+|;}hpVYkck_sIzD=OExlkH!}K6PS9y&W6=kyHJCi# zRE^ab$TFFH%2Z{uvRM@)8^nsui_KjW`Isfyw=^>OH~ej63IMt+!Ov*&`7H0rMUe&U zvW<+-fKHj5A1%3=DJqQ-Ca^g_`m_S8@E)O!PMQ<%hcD@-!#y)%5;tCS<`E#k4?Xs{xD-S d<18|R0J&k{*STtC4SWH+!~4`7y@{ZAP!jx>=seED|g- z3}TB}Bw3_bq#GGs8yVdi8QmAN$g;>WOExlkG%|WlPS9y&V^L+`XHlDc#Z-+|6Ufq< z{NGf?^fCi410Rs5%VNMFwunWKS*MZFyW#&L7DL7#jf_4GOBxK~Qu32ab5rw5d{Xn$ zOELr<6E-WGRWY&|HY@?E*u2=>MUjtvGtep~|3;>OhQAF4lN0=mCdY+nPPX?`oLm@L z$Zpuk_zb9aa(=YrW~Qh#Mwr0n{OHpPtU?zr9^W$AzDAzen89RoVvR9}{Y8^^CcjOY zOj%7iOu0>kOhrv4Or=a^OkGXOO=p-cG+k$U(DbnB8Pl7lZ%p5r{x)MUV>V+o<1*tl f<2MsDQ`mgD Bool { + // First check if it's a valid URL + guard let url = URL(string: urlString) else { + return false + } + + // Check if it has a scheme + guard let scheme = url.scheme else { + return false + } + + // Allow http, https, and other common schemes + let allowedSchemes = ["http", "https", "ftp", "mailto", "tel", "sms"] + if !allowedSchemes.contains(scheme.lowercased()) { + return false + } + + // Check if it has a host for http/https URLs + if ["http", "https"].contains(scheme.lowercased()) { + guard let host = url.host, !host.isEmpty else { + return false + } + } + + return true + } + private func toggleTag(_ tag: Tag) { if selectedTags.contains(where: { $0.id == tag.id }) { selectedTags.removeAll { $0.id == tag.id } @@ -250,6 +348,23 @@ struct LinkFormView: View { } private func saveLink() { + // Clear any previous error + saveErrorMessage = "" + showingSaveError = false + + // Validate before saving + if !aliasValidationMessage.isEmpty { + saveErrorMessage = aliasValidationMessage + showingSaveError = true + return + } + + if !urlValidationMessage.isEmpty && selectedLinkType != .custom { + saveErrorMessage = urlValidationMessage + showingSaveError = true + return + } + let success: Bool if isEditing, let link = link { @@ -275,6 +390,13 @@ struct LinkFormView: View { if success { presentationMode.wrappedValue.dismiss() + } else { + // Show error from view model + if let errorMessage = linkViewModel.errorMessage { + saveErrorMessage = errorMessage + showingSaveError = true + linkViewModel.errorMessage = nil // Clear the error + } } } }