From 37b87ececd0a3e24b71ba9dccccaa714ab47b774 Mon Sep 17 00:00:00 2001 From: robonen Date: Sun, 15 Mar 2026 21:40:20 +0700 Subject: [PATCH] refactor: notifications and settings view models; enhance login and registration UI --- Mayday.xcodeproj/project.pbxproj | 44 +++- .../AppIcon.appiconset/AppIcon-1024@1x.png | Bin 0 -> 83206 bytes .../AppIcon.appiconset/AppIcon-20@1x.png | Bin 0 -> 467 bytes .../AppIcon.appiconset/AppIcon-20@2x.png | Bin 0 -> 852 bytes .../AppIcon.appiconset/AppIcon-20@3x.png | Bin 0 -> 1307 bytes .../AppIcon.appiconset/AppIcon-29@1x.png | Bin 0 -> 660 bytes .../AppIcon.appiconset/AppIcon-29@2x.png | Bin 0 -> 1237 bytes .../AppIcon.appiconset/AppIcon-29@3x.png | Bin 0 -> 2019 bytes .../AppIcon.appiconset/AppIcon-40@1x.png | Bin 0 -> 852 bytes .../AppIcon.appiconset/AppIcon-40@2x.png | Bin 0 -> 1928 bytes .../AppIcon.appiconset/AppIcon-40@3x.png | Bin 0 -> 3086 bytes .../AppIcon.appiconset/AppIcon-60@2x.png | Bin 0 -> 3086 bytes .../AppIcon.appiconset/AppIcon-60@3x.png | Bin 0 -> 5477 bytes .../AppIcon.appiconset/AppIcon-76@1x.png | Bin 0 -> 1723 bytes .../AppIcon.appiconset/AppIcon-76@2x.png | Bin 0 -> 4268 bytes .../AppIcon.appiconset/AppIcon-83.5@2x.png | Bin 0 -> 4935 bytes .../AppIcon.appiconset/Contents.json | 107 ++++++++- .../Logo.imageset/Contents.json | 21 ++ Mayday/Assets.xcassets/Logo.imageset/logo.png | Bin 0 -> 83206 bytes Mayday/ContentView.swift | 5 +- Mayday/Info.plist | 4 +- Mayday/LaunchScreen.storyboard | 42 ++++ Mayday/Localizable.xcstrings | 35 --- Mayday/Mayday.entitlements | 5 + Mayday/Models/User.swift | 23 ++ Mayday/Services/AuthService.swift | 30 +-- Mayday/Services/HTTPClient.swift | 11 +- Mayday/Services/PreviewData.swift | 206 ------------------ Mayday/Services/PushNotificationService.swift | 42 +++- Mayday/ViewModels/AuthViewModel.swift | 37 +--- .../ViewModels/NotificationsViewModel.swift | 53 ++--- Mayday/ViewModels/SettingsViewModel.swift | 18 -- Mayday/Views/Auth/LoginView.swift | 149 +++++++------ Mayday/Views/Auth/RegisterView.swift | 160 ++++++++------ Mayday/Views/Auth/VerifyEmailView.swift | 187 +++++++++++----- .../NotificationDetailView.swift | 96 ++++---- .../Notifications/NotificationsView.swift | 69 +----- Mayday/Views/Settings/SettingsView.swift | 34 +-- Mayday/Views/UIKit/AppBackground.swift | 20 ++ Mayday/Views/UIKit/AppSecureField.swift | 25 +++ Mayday/Views/UIKit/AppTextField.swift | 25 +++ Mayday/Views/UIKit/CardContainer.swift | 22 ++ Mayday/Views/UIKit/NotificationIconView.swift | 47 ++++ Mayday/Views/UIKit/OTPDigitField.swift | 100 +++++++++ README.md | 48 +++- 45 files changed, 985 insertions(+), 680 deletions(-) create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-1024@1x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-20@1x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-29@1x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-40@1x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-76@1x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png create mode 100644 Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png create mode 100644 Mayday/Assets.xcassets/Logo.imageset/Contents.json create mode 100644 Mayday/Assets.xcassets/Logo.imageset/logo.png create mode 100644 Mayday/LaunchScreen.storyboard create mode 100644 Mayday/Mayday.entitlements delete mode 100644 Mayday/Services/PreviewData.swift create mode 100644 Mayday/Views/UIKit/AppBackground.swift create mode 100644 Mayday/Views/UIKit/AppSecureField.swift create mode 100644 Mayday/Views/UIKit/AppTextField.swift create mode 100644 Mayday/Views/UIKit/CardContainer.swift create mode 100644 Mayday/Views/UIKit/NotificationIconView.swift create mode 100644 Mayday/Views/UIKit/OTPDigitField.swift diff --git a/Mayday.xcodeproj/project.pbxproj b/Mayday.xcodeproj/project.pbxproj index 6ac4ea4..6a52731 100644 --- a/Mayday.xcodeproj/project.pbxproj +++ b/Mayday.xcodeproj/project.pbxproj @@ -32,9 +32,15 @@ AA000001000023 /* ChangePasswordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000023 /* ChangePasswordView.swift */; }; AA000001000024 /* SessionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000024 /* SessionsView.swift */; }; AA000001000025 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AA000002000025 /* Assets.xcassets */; }; - AA000001000026 /* PreviewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000026A /* PreviewData.swift */; }; + AA000001000034 /* AppTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000034 /* AppTextField.swift */; }; + AA000001000035 /* AppSecureField.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000035 /* AppSecureField.swift */; }; + AA000001000036 /* AppBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000036 /* AppBackground.swift */; }; + AA000001000037 /* CardContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000037 /* CardContainer.swift */; }; + AA000001000038 /* NotificationIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000038 /* NotificationIconView.swift */; }; + AA000001000039 /* OTPDigitField.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000039 /* OTPDigitField.swift */; }; AA000001000027 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = AA000002000027 /* Localizable.xcstrings */; }; AA000001000028 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = AA000002000028 /* InfoPlist.xcstrings */; }; + AA000001000040 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA000002000040 /* LaunchScreen.storyboard */; }; AA000001000030 /* MaydayLiveActivityBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000030 /* MaydayLiveActivityBundle.swift */; }; AA000001000031 /* MaydayLiveActivityLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000031 /* MaydayLiveActivityLiveActivity.swift */; }; AA000001000032 /* AlertAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA000002000008 /* AlertAttributes.swift */; }; @@ -93,11 +99,18 @@ AA000002000024 /* SessionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionsView.swift; sourceTree = ""; }; AA000002000025 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; AA000002000026 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AA000002000026A /* PreviewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewData.swift; sourceTree = ""; }; AA000002000027 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; AA000002000028 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + AA000002000029 /* Mayday.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Mayday.entitlements; sourceTree = ""; }; + AA000002000040 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; AA000002000030 /* MaydayLiveActivityBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaydayLiveActivityBundle.swift; sourceTree = ""; }; AA000002000031 /* MaydayLiveActivityLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaydayLiveActivityLiveActivity.swift; sourceTree = ""; }; + AA000002000034 /* AppTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTextField.swift; sourceTree = ""; }; + AA000002000035 /* AppSecureField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSecureField.swift; sourceTree = ""; }; + AA000002000036 /* AppBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppBackground.swift; sourceTree = ""; }; + AA000002000037 /* CardContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardContainer.swift; sourceTree = ""; }; + AA000002000038 /* NotificationIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationIconView.swift; sourceTree = ""; }; + AA000002000039 /* OTPDigitField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPDigitField.swift; sourceTree = ""; }; AA000002000033 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AA000008000001 /* MaydayLiveActivity.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MaydayLiveActivity.appex; sourceTree = BUILT_PRODUCTS_DIR; }; AA000009000001 /* Mayday.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Mayday.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -140,6 +153,8 @@ AA000002000026 /* Info.plist */, AA000002000027 /* Localizable.xcstrings */, AA000002000028 /* InfoPlist.xcstrings */, + AA000002000029 /* Mayday.entitlements */, + AA000002000040 /* LaunchScreen.storyboard */, AA000011000003 /* Models */, AA000011000004 /* Services */, AA000011000005 /* ViewModels */, @@ -168,7 +183,6 @@ AA000002000011 /* AuthService.swift */, AA000002000012 /* NotificationsAPIService.swift */, AA000002000013 /* PushNotificationService.swift */, - AA000002000026A /* PreviewData.swift */, ); path = Services; sourceTree = ""; @@ -189,6 +203,7 @@ AA000011000007 /* Auth */, AA000011000008 /* Notifications */, AA000011000009 /* Settings */, + AA000011000011 /* UIKit */, ); path = Views; sourceTree = ""; @@ -222,6 +237,19 @@ path = Settings; sourceTree = ""; }; + AA000011000011 /* UIKit */ = { + isa = PBXGroup; + children = ( + AA000002000034 /* AppTextField.swift */, + AA000002000035 /* AppSecureField.swift */, + AA000002000036 /* AppBackground.swift */, + AA000002000037 /* CardContainer.swift */, + AA000002000038 /* NotificationIconView.swift */, + AA000002000039 /* OTPDigitField.swift */, + ); + path = UIKit; + sourceTree = ""; + }; AA000011000010 /* MaydayLiveActivity */ = { isa = PBXGroup; children = ( @@ -326,6 +354,7 @@ AA000001000025 /* Assets.xcassets in Resources */, AA000001000027 /* Localizable.xcstrings in Resources */, AA000001000028 /* InfoPlist.xcstrings in Resources */, + AA000001000040 /* LaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -368,7 +397,12 @@ AA000001000022 /* SettingsView.swift in Sources */, AA000001000023 /* ChangePasswordView.swift in Sources */, AA000001000024 /* SessionsView.swift in Sources */, - AA000001000026 /* PreviewData.swift in Sources */, + AA000001000034 /* AppTextField.swift in Sources */, + AA000001000035 /* AppSecureField.swift in Sources */, + AA000001000036 /* AppBackground.swift in Sources */, + AA000001000037 /* CardContainer.swift in Sources */, + AA000001000038 /* NotificationIconView.swift in Sources */, + AA000001000039 /* OTPDigitField.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -399,6 +433,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = Mayday/Mayday.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = WA8SWY233K; @@ -426,6 +461,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = Mayday/Mayday.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = WA8SWY233K; diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-1024@1x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5c843bcd5a998265a25f724420cc4991aa0228 GIT binary patch literal 83206 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 literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f67e659e11d326652d613e23c5be16eda0a249 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(A-{0P8`RzpBrsCa4Ijui@diJdBUd=n}_hw1IMd5e;=<~T7tHN5s%e_pcS?~N_Vx$GV5 zcQi7vXDpa|Wvw2U(e|byd1-;9C4B7P${(`pZR1s_d9yfo;lf1In90^R;#gAhSZ5a7 z74v`T*z-+%!{jc%ZR`vBD-ZqYxngX&qH;x9MBc-+xD$7{s>0}n!KKpdkq7lTBhT*hIkHH6lU=@8{$hX0|2yV3^Ss)7*o3jY;sVPa+t<9e=H;J# z9{cB&=%*<>1~0gl?>`vnICqKfu7VCOzm2=YLhB!BHQ$qodu?<5n$ZG1mEAx8d$2yw zJkELhv|@D0ucFy%H{^XW?FBttn^ZG{T(W0%rZ%LB?7qDZj5nWZ(+0O4#V}GiJEho zZUwzIy}V7#c;jqS^^?3G1oDjHa_<~7%t_wa#{9`{UYX+?wjF){0#B>y=EPbb(aB3% z{^C~msy3i;kB-=W-aNYU zb0_U|R&w3q+z|PP?VT~1ZNk>Ox*wGOoP508u4?+W@2|GZxVE`kB6deNbL7EG$EGvsDA5T z_uR5w^0eQ*Lle8X%L4zMYMFEAYEZ+)bKB<$L`ScCq&4sP4ztJCGV|u-^xxe#xA@z( zDfXR=t>u}K{h1X!*MF?xYqA%Wc{p?Sq!j6WN!OQ6$@@_2Wxj326~}GsRA1cKyivg- zhv|^Xlb@P-4_p73nKreac`M;Ce@|m-FZaVL=9^9YlKr#QY?>F(xcdExMt08aZHYE5 z`!_BNEW5UUdFtE?CU#Gj+HYzoE4}np@8oKWGruCE-pGGjn^voS`*elni$!bZ&nRAQ z)L<=iV3&Zc)3+Hm*HmZ6hPkJEf8NBKFBdDbBW>G)w3DG*I&MDZ_SECE>5yJI|H|oY z8y-|CM)~RS#XMgpbG+c<*DbT=S21mwmGQe<-urxl)w4%@tacY3MP&9p%#kZ#zMo_$ z9^ZsLN^nCixHUj$y`o3wUn3o+z%E!~J`z zpxOB&o65FyT|8E&os&~Jx2UQqz92iNc;9|6=4;2j`OP-{n8e*vRzEdwVTr>xlM|Zy z?9)HQep~tYyoP9myyD$wrXMv{8y~ArS#(v)`Sddr2mealAH4DA^B2~^HZ*5r4nO&Bd(R)1q zp8mzo(=ksgp>*!lhzQo(DswAZuH8EJhb!^gr%q$uC9(`!EPu|k?2rA(RjjikN6)Y@ z|K!$Fjgwz5HN5?EVVdT`=bud-I4WkhpN)@cxphN*JtG=y{O!s7pYhkMGb~FCT$X_f NCQnyCmvv4FO#rkuQh@-&2Z+lu+WHMO9u(`dHwMEwLe75gZ`rlthtm}KRMh#6iUfytZfk;ynjrIn37Pvsr!?_`T2YkMY{aoOR01hASTK z)L(GxcQf0LzJ_@V&z$7;`OWmZIqc(7R+HxVh{;Urelq-SzP7<9tI&R@yK^?@(c`tZ43>mF$t>z!g^yP}f0 zr0JB*vsAIa6BQWQ0v9d|-Lg?@$H^Rd*PLXtl?&F~4o(Ry*jFT0DjN z%ReV~x8=rVXFf17n#_5){kYDlIqwVVC%*oWS!jCIW1*gbYs{l{Z#`H-^=B$(wkgc* zSN<&L?D_2F7qbn&-)HU6zElL*Pp>)l=8?g_AN$Sr zF56-%U)V5z$Jza-w7-2SzkUAJ<%KfA|0hj)&l0fE`cw$-U4f;)+4BnRectEq=sBNu j{E+qJdv}r_53MdpjwKj_Su!oh#g*+xPs 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 OaDbb$hZFl~2<_hjG{4ON literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-40@1x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f67e659e11d326652d613e23c5be16eda0a249 GIT binary patch literal 852 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 literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2c7381be6ebe3af97217004456e1568c1c36cf GIT binary patch literal 3086 zcmb_e`9Bnn79Ckf*}@}a9VYuyNDSF$Ft$+A6j?Iag~nDHJ6R^ns2KacjI|g^6J?9R zVC-bemYosN)Axt>{($#>IQQIp?)l;VbU!E7+|-bTnU5I&0I{}09AbgD`$hA^BtHA91f5=>zM#F(MSN@U&|Tz&Hw<==Fk9W&zR<~mUHeu zTT~A1fBU~ira9{k0N^|drl)O%qWOt%t3c>;-#?x{$kUTL_n5^ZUb2+Ld}TnC_qT&_ zT1G!$li) zZ1vh~?!#SulwC({q8{MX+TJ*A+`U@oa`27%Q~Bz#e^m^}_v^*TnLCZbX}tzC*(KBZjyj^(=KD9Bg=IvJ%*o%`&j zo)d=wVSSC67aA_Ls;%rx6&T zv7o)o>L+S)&3YUBxqW)Ci{^>a3;tV^V%m3_a?5t_$&!`TIZT z_3P~ktYGQfw6Fq;Vt3A=bfuKt+RMHkZyzg8faZy_?Zj{|-qkN@*z|(vTi2dWe3Qmw z@jlt9bq^)*@R?U4jlAx1x5Hd6R${f%KusXiLi|;{mT7*LSFQvD?`tfxD-%EC&74Y5Ft^#m-B6)jEBeIFh39yl@Qy4+I742?$#;U zRm~-QZ^WLyUaXnGcB#?PrGQjg&}SGewXc|GR5@=f`!wp@E0T%jc`i>L`HkO8@c z&RX4Fmd)7}f2+Q#t0|;AD`^ua%51^0-iM($>YNC8-%I6J@GRG0#3^UYN}Pk02qE#H zW5W2tj!dSBMd&UUH}S=0Ibh3tOcX2=$ElHsU4}*k@y43tZ{=B)Wf_f^n%eS&@_W1& zvzt0z94q0_kBPE>Pp``A8z^ z6?46Eix0h^@TIqtXUSOMO=thKYJcBLipw8~vS)F!T{g8=BbYMh)R)88LYcpEeQ}Xy zM$_~ng`I4@vx0EJ#~SkLDm{+|M(oaST3<92E1|xzU1OCP0%M&xDJdKsf^)*xI~*Zs z-g7Z1EKF3?`-`ewPK5I!c8=9NU4XCRt4U} zLTNAEa65rK3S1&c{>ciTqyp$ocA4q64T+R``34j5o>f0B68=H)@w>8ef$38R|6W=D z=}};xXL|AEN~Br3)?FJ$T=x4Rrd}$F^}V_%lOwqC(+jhZ@rqm#`x~K_N?UsU8b#JZ zR;F()KD+*es2GtMdsJA_zc#qMJR?NtuF0@bK2?Vd`Jp~+MF1!ATMojUTMm*Umgb=y z+TL=E3Wtuz0P`(BPENiEK=dMf<-X1l1hlYT+MigHnXD)Bm}W|SWzLVzv|uiL+pmFM;g9kF&ctzUuo~3o_fnz(ES`ARi7W}8bIxBvvP)1n&%q_IKFVfCjp&8G~aq7pDuHmnC0F#4Hh35 zf}s#YN(~f($He(HH+88%lZI`7+2Zw1>zd^FX}{3OqtS46j-=5dr$3|Wd6#+p8N3_I zr!kJT!3z!^4=0uQ*d*A;NQ*pM$##V4(&;?Gx!?r6TVTrG+96?NcejMRYkgD~Hcst9 zC}QmFyR{VQseFMPOKA^s&7$RkTA}Gd;{3M}l;z0FTcpEeKls7b3L-~jiAF}_C)&n= z@d3ozvN$NpV*eSbbY#WB`5FIskvz}HseTRSeEZzp@G%hvd)#;Q3ZuCySG!zdG`ELP zfmU$siSMcQ<6!MxgY#K-(j?m6V+8_FfFZAG>7Hiq8ec+=D?;C4=%D+E`cTo9huk-2 zcr$wGhkkzZ{NiHc*`tNt>o?wF^tfsIEQxAi8t37-n56m`J!V0bvSr-XZRa+jMo1({ zLn`jZ7&L6E@m_4%7y4SXIT%i=OJ zl||3>OKY`W7?-e&oovl^h6g})JkjykZmCJSCi=?|hi_Rev^`&!)&cjwXT4ybavl`^ z#_ZLlfcUYq|9N*A?%?FSgfxfL^QXE%D(BY<_&X(p>eUgv^FwNDwgO&5OO!F^`*Wb4+l&D4R$ z%_g(IXJ`dZ5Z4-CSLiGhgI*R;6$@ZpF literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e07f9192b984df27eb38ed813e4648154c3f0c2 GIT binary patch literal 5477 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 AL;wH) literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a87a599a70c5e10e50a57f1e48ab61a48b40b041 GIT binary patch literal 4268 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 UK0I>~`dcZ`QqxndQ$a-k2aTZdjQ{`u literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png b/Mayday/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..396755a2719f64fd639e14328e6c2713b73bedb6 GIT binary patch literal 4935 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 BaHIeL literal 0 HcmV?d00001 diff --git a/Mayday/Assets.xcassets/AppIcon.appiconset/Contents.json b/Mayday/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..b444bd8 100644 --- a/Mayday/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Mayday/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,8 +1,111 @@ { "images" : [ { - "idiom" : "universal", - "platform" : "ios", + "filename" : "AppIcon-20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "AppIcon-20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "AppIcon-29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "AppIcon-29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "AppIcon-40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "AppIcon-60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "AppIcon-20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "AppIcon-20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "AppIcon-29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "AppIcon-29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "AppIcon-40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "AppIcon-83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "AppIcon-1024@1x.png", + "idiom" : "ios-marketing", + "scale" : "1x", "size" : "1024x1024" } ], diff --git a/Mayday/Assets.xcassets/Logo.imageset/Contents.json b/Mayday/Assets.xcassets/Logo.imageset/Contents.json new file mode 100644 index 0000000..5f670ca --- /dev/null +++ b/Mayday/Assets.xcassets/Logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mayday/Assets.xcassets/Logo.imageset/logo.png b/Mayday/Assets.xcassets/Logo.imageset/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5c843bcd5a998265a25f724420cc4991aa0228 GIT binary patch literal 83206 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 remote-notification - UILaunchScreen - + UILaunchStoryboardName + LaunchScreen UIRequiredDeviceCapabilities armv7 diff --git a/Mayday/LaunchScreen.storyboard b/Mayday/LaunchScreen.storyboard new file mode 100644 index 0000000..b717203 --- /dev/null +++ b/Mayday/LaunchScreen.storyboard @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mayday/Localizable.xcstrings b/Mayday/Localizable.xcstrings index 7165986..9ea6149 100644 --- a/Mayday/Localizable.xcstrings +++ b/Mayday/Localizable.xcstrings @@ -1,9 +1,6 @@ { "sourceLanguage" : "ru", "strings" : { - "" : { - - }, "(%lld)" : { }, @@ -262,38 +259,6 @@ } } }, - "demo_badge" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "DEMO" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "ДЕМО" - } - } - } - }, - "demo_mode" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Demo mode" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Демо-режим" - } - } - } - }, "details_section" : { "localizations" : { "en" : { diff --git a/Mayday/Mayday.entitlements b/Mayday/Mayday.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Mayday/Mayday.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Mayday/Models/User.swift b/Mayday/Models/User.swift index a516268..ad530f8 100644 --- a/Mayday/Models/User.swift +++ b/Mayday/Models/User.swift @@ -16,6 +16,29 @@ struct UserResponse: Codable, Identifiable, Sendable { case createdAt = "created_at" case updatedAt = "updated_at" } + + init(id: UUID, email: String, status: UserStatus, metadata: [String: AnyCodable]? = nil, emailVerifiedAt: Date? = nil, roles: [String] = [], createdAt: Date, updatedAt: Date) { + self.id = id + self.email = email + self.status = status + self.metadata = metadata + self.emailVerifiedAt = emailVerifiedAt + self.roles = roles + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decode(UUID.self, forKey: .id) + email = try container.decode(String.self, forKey: .email) + status = try container.decode(UserStatus.self, forKey: .status) + metadata = try container.decodeIfPresent([String: AnyCodable].self, forKey: .metadata) + emailVerifiedAt = try container.decodeIfPresent(Date.self, forKey: .emailVerifiedAt) + roles = try container.decodeIfPresent([String].self, forKey: .roles) ?? [] + createdAt = try container.decode(Date.self, forKey: .createdAt) + updatedAt = try container.decode(Date.self, forKey: .updatedAt) + } } enum UserStatus: String, Codable, Sendable { diff --git a/Mayday/Services/AuthService.swift b/Mayday/Services/AuthService.swift index cd696fa..5362a0a 100644 --- a/Mayday/Services/AuthService.swift +++ b/Mayday/Services/AuthService.swift @@ -5,23 +5,8 @@ struct LoginResponse: Decodable, Sendable { let tokens: TokenPair } -struct RegisterResponse: Decodable, Sendable { - let user: UserResponse - - private enum CodingKeys: String, CodingKey { - case id, email, status, metadata, roles - case emailVerifiedAt = "email_verified_at" - case createdAt = "created_at" - case updatedAt = "updated_at" - } - - init(from decoder: Decoder) throws { - user = try UserResponse(from: decoder) - } -} - -struct VerifyEmailResponse: Decodable, Sendable { - let user: UserResponse +struct MessageResponse: Decodable, Sendable { + let message: String } actor AuthService { @@ -42,13 +27,12 @@ actor AuthService { return response } - func verifyEmail(email: String, code: String) async throws -> UserResponse { - let response: VerifyEmailResponse = try await client.request(.verifyEmail(email: email, code: code)) - return response.user + func verifyEmail(email: String, code: String) async throws { + let _: MessageResponse = try await client.request(.verifyEmail(email: email, code: code)) } func resendCode(email: String) async throws { - let _: ResendCodeResponse = try await client.request(.resendCode(email: email)) + let _: MessageResponse = try await client.request(.resendCode(email: email)) } func logout() async throws { @@ -64,8 +48,4 @@ actor AuthService { } } -struct ResendCodeResponse: Decodable, Sendable { - let message: String -} - struct EmptyResponse: Decodable, Sendable {} diff --git a/Mayday/Services/HTTPClient.swift b/Mayday/Services/HTTPClient.swift index 20ec2d6..293e3ba 100644 --- a/Mayday/Services/HTTPClient.swift +++ b/Mayday/Services/HTTPClient.swift @@ -166,8 +166,8 @@ actor HTTPClient { private init() { #if DEBUG - ssoBaseURL = "http://localhost:8081" - notificationBaseURL = "http://localhost:8092" + ssoBaseURL = "http://192.168.3.7:8081" + notificationBaseURL = "http://192.168.3.7:8092" #else ssoBaseURL = "https://id.robonen.ru" notificationBaseURL = "https://notify.robonen.ru" @@ -254,6 +254,13 @@ actor HTTPClient { throw APIError.serverError("HTTP \(httpResponse.statusCode)") } + // 204 No Content — return empty decodable if possible + if httpResponse.statusCode == 204 || data.isEmpty { + if let empty = EmptyResponse() as? T { + return empty + } + } + let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 do { diff --git a/Mayday/Services/PreviewData.swift b/Mayday/Services/PreviewData.swift deleted file mode 100644 index eae0d32..0000000 --- a/Mayday/Services/PreviewData.swift +++ /dev/null @@ -1,206 +0,0 @@ -#if DEBUG -import Foundation -import ActivityKit - -enum PreviewData { - nonisolated(unsafe) static var isPreviewMode = false - - static let mockUser = UserResponse( - id: UUID(uuidString: "00000000-0000-0000-0000-000000000001")!, - email: "demo@mayday.app", - status: .active, - metadata: nil, - emailVerifiedAt: Date(), - roles: ["user"], - createdAt: Date().addingTimeInterval(-90 * 86400), - updatedAt: Date() - ) - - static let mockNotifications: [AppNotification] = { - let now = Date() - let mockUserId = UUID(uuidString: "00000000-0000-0000-0000-000000000001")! - return [ - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000001")!, - userId: mockUserId, - scopeId: nil, - channel: .apns, - contentType: .plain, - templateId: nil, - subject: "Пожарная тревога", - body: "Обнаружено задымление на 12 этаже, корпус 9. Необходима немедленная эвакуация персонала.", - source: "Fire Alert", - metadata: ["Здание": "Корпус 9", "Этаж": "12", "Комната": "1A", "Датчик": "SM-4021"], - status: .sent, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-120), - readAt: nil, - createdAt: now.addingTimeInterval(-120) - ), - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000002")!, - userId: mockUserId, - scopeId: nil, - channel: .apns, - contentType: .plain, - templateId: nil, - subject: "Нарушение периметра", - body: "Зафиксировано несанкционированное проникновение через вход B2. Охрана уведомлена.", - source: "Security Alert", - metadata: ["Зона": "B2", "Камера": "CAM-17"], - status: .sent, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-300), - readAt: nil, - createdAt: now.addingTimeInterval(-300) - ), - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000003")!, - userId: mockUserId, - scopeId: nil, - channel: .apns, - contentType: .plain, - templateId: nil, - subject: "Пожарная тревога", - body: "Сработала пожарная сигнализация в серверной. Автоматическая система пожаротушения активирована.", - source: "Fire Alert", - metadata: ["Здание": "Корпус 9", "Этаж": "12", "Комната": "1A"], - status: .read, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-7200), - readAt: now.addingTimeInterval(-3600), - createdAt: now.addingTimeInterval(-7200) - ), - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000004")!, - userId: mockUserId, - scopeId: nil, - channel: .apns, - contentType: .plain, - templateId: nil, - subject: "Медицинская помощь", - body: "Запрос экстренной медицинской помощи на 3 этаже, кабинет 312. Бригада скорой помощи вызвана.", - source: "Medical Emergency", - metadata: ["Здание": "Корпус 9", "Этаж": "3", "Комната": "312"], - status: .read, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-7200), - readAt: now.addingTimeInterval(-5400), - createdAt: now.addingTimeInterval(-7200) - ), - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000005")!, - userId: mockUserId, - scopeId: nil, - channel: .inApp, - contentType: .plain, - templateId: nil, - subject: "Затопление", - body: "Обнаружена утечка воды в подвальном помещении. Аварийная служба на месте.", - source: "Water Leak", - metadata: ["Здание": "Корпус 3", "Этаж": "B1"], - status: .read, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-90000), - readAt: now.addingTimeInterval(-86400), - createdAt: now.addingTimeInterval(-90000) - ), - AppNotification( - id: UUID(uuidString: "10000000-0000-0000-0000-000000000006")!, - userId: mockUserId, - scopeId: nil, - channel: .inApp, - contentType: .plain, - templateId: nil, - subject: "Тестирование системы", - body: "Плановое тестирование системы оповещения. Действий не требуется.", - source: "Security Alert", - metadata: nil, - status: .read, - error: nil, - attempts: 1, - maxAttempts: 3, - nextRetryAt: nil, - sentAt: now.addingTimeInterval(-180000), - readAt: now.addingTimeInterval(-172800), - createdAt: now.addingTimeInterval(-180000) - ), - ] - }() - - static let mockSessions: [SessionResponse] = { - let now = Date() - return [ - SessionResponse( - id: UUID(uuidString: "20000000-0000-0000-0000-000000000001")!, - userAgent: "Mayday/1.0 (iPhone; iOS 18.3)", - ipAddress: "192.168.1.42", - isCurrent: true, - createdAt: now.addingTimeInterval(-3600), - expiresAt: now.addingTimeInterval(7 * 86400) - ), - SessionResponse( - id: UUID(uuidString: "20000000-0000-0000-0000-000000000002")!, - userAgent: "Mayday/1.0 (iPad; iPadOS 18.3)", - ipAddress: "192.168.1.100", - isCurrent: false, - createdAt: now.addingTimeInterval(-86400), - expiresAt: now.addingTimeInterval(6 * 86400) - ), - ] - }() - - static func startMockLiveActivity() async { - // End any existing demo activities first - for activity in Activity.activities where activity.attributes.alertId == "demo-fire-alert" { - let state = activity.content.state - await activity.end(ActivityContent(state: state, staleDate: nil), dismissalPolicy: .immediate) - } - - let attributes = AlertAttributes( - topic: "Fire Alert", - alertId: "demo-fire-alert", - severity: .critical - ) - let state = AlertAttributes.ContentState( - title: "Пожарная тревога", - value: "Корпус 9, этаж 12", - status: .active, - startedAt: Date().addingTimeInterval(-120), - updatedAt: Date() - ) - _ = try? Activity.request( - attributes: attributes, - content: ActivityContent(state: state, staleDate: Date().addingTimeInterval(3600)) - ) - } - - static func stopMockLiveActivity() async { - for activity in Activity.activities where activity.attributes.alertId == "demo-fire-alert" { - let resolvedState = AlertAttributes.ContentState( - title: "Пожарная тревога", - value: "Корпус 9, этаж 12", - status: .resolved, - startedAt: activity.content.state.startedAt, - updatedAt: Date() - ) - await activity.end(ActivityContent(state: resolvedState, staleDate: nil), dismissalPolicy: .immediate) - } - } -} -#endif diff --git a/Mayday/Services/PushNotificationService.swift b/Mayday/Services/PushNotificationService.swift index 848ca5c..58e77f4 100644 --- a/Mayday/Services/PushNotificationService.swift +++ b/Mayday/Services/PushNotificationService.swift @@ -39,7 +39,7 @@ class PushNotificationService: NSObject, ObservableObject, UNUserNotificationCen func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) async { guard let aps = userInfo["aps"] as? [String: Any] else { return } - // Handle Live Activity push + // Handle explicit Live Activity push (event inside aps) if let event = aps["event"] as? String { await handleLiveActivityPush(event: event, userInfo: userInfo, aps: aps) return @@ -49,6 +49,30 @@ class PushNotificationService: NSObject, ObservableObject, UNUserNotificationCen if let badge = aps["badge"] as? Int { try? await UNUserNotificationCenter.current().setBadgeCount(badge) } + + // Start a Live Activity from a regular push if metadata contains severity + if let metadata = userInfo["metadata"] as? [String: String], + let severityStr = metadata["severity"], + let severity = Severity(rawValue: severityStr), + let source = userInfo["source"] as? String, + let subject = userInfo["subject"] as? String { + + let alertId = (userInfo["notificationId"] as? String) ?? UUID().uuidString + let contentState = AlertAttributes.ContentState( + title: subject, + value: metadata["value"], + status: .active, + startedAt: Date(), + updatedAt: Date() + ) + await startLiveActivity( + userInfo: userInfo, + contentState: contentState, + topic: source, + alertId: alertId, + severity: severity + ) + } } private func handleLiveActivityPush(event: String, userInfo: [AnyHashable: Any], aps: [String: Any]) async { @@ -59,7 +83,13 @@ class PushNotificationService: NSObject, ObservableObject, UNUserNotificationCen switch event { case "start": - await startLiveActivity(userInfo: userInfo, contentState: contentState) + if let attributes = userInfo["attributes"] as? [String: Any], + let topic = attributes["topic"] as? String, + let alertId = attributes["alertId"] as? String, + let severityStr = attributes["severity"] as? String, + let severity = Severity(rawValue: severityStr) { + await startLiveActivity(userInfo: userInfo, contentState: contentState, topic: topic, alertId: alertId, severity: severity) + } case "update": await updateLiveActivity(alertId: userInfo["alertId"] as? String, contentState: contentState) case "end": @@ -69,13 +99,7 @@ class PushNotificationService: NSObject, ObservableObject, UNUserNotificationCen } } - private func startLiveActivity(userInfo: [AnyHashable: Any], contentState: AlertAttributes.ContentState) async { - guard let attributes = userInfo["attributes"] as? [String: Any], - let topic = attributes["topic"] as? String, - let alertId = attributes["alertId"] as? String, - let severityStr = attributes["severity"] as? String, - let severity = Severity(rawValue: severityStr) else { return } - + private func startLiveActivity(userInfo: [AnyHashable: Any], contentState: AlertAttributes.ContentState, topic: String, alertId: String, severity: Severity) async { // Info-level alerts don't warrant a persistent Live Activity — they are low-priority // and should only appear as a standard banner notification. guard severity != .info else { return } diff --git a/Mayday/ViewModels/AuthViewModel.swift b/Mayday/ViewModels/AuthViewModel.swift index 11c6c76..45d08e3 100644 --- a/Mayday/ViewModels/AuthViewModel.swift +++ b/Mayday/ViewModels/AuthViewModel.swift @@ -4,6 +4,7 @@ import SwiftUI @MainActor class AuthViewModel: ObservableObject { @Published var isAuthenticated = false + @Published var isCheckingAuth = true @Published var currentUser: UserResponse? @Published var isLoading = false @Published var error: String? @@ -12,39 +13,28 @@ class AuthViewModel: ObservableObject { private let keychain = KeychainService.shared func checkAuthStatus() async { - #if DEBUG - if PreviewData.isPreviewMode { - currentUser = PreviewData.mockUser - isAuthenticated = true - return - } - #endif guard keychain.loadAccessToken() != nil else { isAuthenticated = false + isCheckingAuth = false return } - isLoading = true - defer { isLoading = false } do { currentUser = try await auth.getMe() isAuthenticated = true + isCheckingAuth = false await requestPushIfNeeded() } catch APIError.unauthorized { isAuthenticated = false + isCheckingAuth = false } catch { - isAuthenticated = false + // Network/transient errors — keep authenticated if we already were + if !isAuthenticated { + isAuthenticated = false + } + isCheckingAuth = false } } - #if DEBUG - func enterPreviewMode() async { - PreviewData.isPreviewMode = true - currentUser = PreviewData.mockUser - isAuthenticated = true - await PreviewData.startMockLiveActivity() - } - #endif - func login(email: String, password: String) async { isLoading = true error = nil @@ -84,15 +74,6 @@ class AuthViewModel: ObservableObject { } func logout() async { - #if DEBUG - if PreviewData.isPreviewMode { - await PreviewData.stopMockLiveActivity() - PreviewData.isPreviewMode = false - isAuthenticated = false - currentUser = nil - return - } - #endif isLoading = true defer { isLoading = false } do { diff --git a/Mayday/ViewModels/NotificationsViewModel.swift b/Mayday/ViewModels/NotificationsViewModel.swift index 6ab75c9..f6fe139 100644 --- a/Mayday/ViewModels/NotificationsViewModel.swift +++ b/Mayday/ViewModels/NotificationsViewModel.swift @@ -10,6 +10,7 @@ class NotificationsViewModel: ObservableObject { @Published var isLoadingMore = false @Published var error: String? @Published var hasMore = true + private var hasLoadedOnce = false private let service = NotificationsAPIService.shared private let limit = 50 @@ -17,17 +18,13 @@ class NotificationsViewModel: ObservableObject { private var pollingTask: Task? func load() async { - #if DEBUG - if PreviewData.isPreviewMode { - notifications = PreviewData.mockNotifications - hasMore = false - return - } - #endif - isLoading = true + isLoading = !hasLoadedOnce error = nil currentOffset = 0 - defer { isLoading = false } + defer { + isLoading = false + hasLoadedOnce = true + } do { let page = try await service.getNotifications(limit: limit, offset: 0) notifications = page.notifications @@ -40,9 +37,6 @@ class NotificationsViewModel: ObservableObject { } func loadMore() async { - #if DEBUG - if PreviewData.isPreviewMode { return } - #endif guard !isLoadingMore && hasMore else { return } isLoadingMore = true defer { isLoadingMore = false } @@ -60,29 +54,33 @@ class NotificationsViewModel: ObservableObject { func markAsRead(_ notification: AppNotification) async { guard !notification.isRead else { return } - #if DEBUG - if PreviewData.isPreviewMode { - if let index = notifications.firstIndex(where: { $0.id == notification.id }) { - notifications[index] = notification.withReadAt(Date()) - } - return + + // Optimistic update — reflect read state immediately so the list + // shows the correct card style even if the user navigates back + // before the API call completes. + if let index = notifications.firstIndex(where: { $0.id == notification.id }) { + notifications[index] = notification.withReadAt(Date()) + unreadCount = max(0, unreadCount - 1) + updateBadge() } - #endif + do { try await service.markAsRead(id: notification.id) - if let index = notifications.firstIndex(where: { $0.id == notification.id }) { - notifications[index] = notification.withReadAt(Date()) - } - updateBadge() + } catch is CancellationError { + // View disappeared before the request finished — keep + // optimistic state; polling will reconcile if needed. } catch { + // Rollback on real failure + if let index = notifications.firstIndex(where: { $0.id == notification.id }) { + notifications[index] = notification + unreadCount += 1 + updateBadge() + } self.error = error.localizedDescription } } func markAllAsRead() async { - #if DEBUG - if PreviewData.isPreviewMode { return } - #endif do { try await service.markAllAsRead() await load() @@ -92,9 +90,6 @@ class NotificationsViewModel: ObservableObject { } func startPolling() { - #if DEBUG - if PreviewData.isPreviewMode { return } - #endif guard pollingTask == nil else { return } pollingTask = Task { while !Task.isCancelled { diff --git a/Mayday/ViewModels/SettingsViewModel.swift b/Mayday/ViewModels/SettingsViewModel.swift index d604382..0b5f307 100644 --- a/Mayday/ViewModels/SettingsViewModel.swift +++ b/Mayday/ViewModels/SettingsViewModel.swift @@ -11,12 +11,6 @@ class SettingsViewModel: ObservableObject { private let service = NotificationsAPIService.shared func loadSessions() async { - #if DEBUG - if PreviewData.isPreviewMode { - sessions = PreviewData.mockSessions - return - } - #endif isLoading = true defer { isLoading = false } do { @@ -27,12 +21,6 @@ class SettingsViewModel: ObservableObject { } func deleteSession(_ session: SessionResponse) async { - #if DEBUG - if PreviewData.isPreviewMode { - sessions.removeAll { $0.id == session.id } - return - } - #endif do { try await service.deleteSession(id: session.id) sessions.removeAll { $0.id == session.id } @@ -42,12 +30,6 @@ class SettingsViewModel: ObservableObject { } func changePassword(current: String, new: String) async -> Bool { - #if DEBUG - if PreviewData.isPreviewMode { - successMessage = String(localized: "password_changed_success") - return true - } - #endif isLoading = true error = nil defer { isLoading = false } diff --git a/Mayday/Views/Auth/LoginView.swift b/Mayday/Views/Auth/LoginView.swift index c8ca19a..c38a1f0 100644 --- a/Mayday/Views/Auth/LoginView.swift +++ b/Mayday/Views/Auth/LoginView.swift @@ -6,74 +6,101 @@ struct LoginView: View { @State private var password = "" @State private var showRegister = false + private var isFormInvalid: Bool { + email.isEmpty || password.isEmpty || authViewModel.isLoading + } + var body: some View { NavigationStack { - VStack(spacing: 24) { - Spacer() - VStack(spacing: 8) { - Image(systemName: "bell.badge.fill") - .font(.system(size: 60)) - .foregroundStyle(.red) - Text("Mayday") - .font(.largeTitle.bold()) - Text("login_subtitle") - .font(.subheadline) + ZStack { + ScrollView { + VStack(spacing: 24) { + Spacer(minLength: 24) + + VStack(spacing: 10) { + Image("Logo") + .resizable() + .scaledToFit() + .frame(width: 84, height: 84) + .clipShape(RoundedRectangle(cornerRadius: 18, style: .continuous)) + .shadow(color: .red.opacity(0.25), radius: 12, y: 6) + + Text("Mayday") + .font(.largeTitle.bold()) + + Text("login_subtitle") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + .padding(.top, 8) + + VStack(spacing: 14) { + AppTextField( + title: "Email", + icon: "envelope.fill", + text: $email + ) + .textContentType(.emailAddress) + .keyboardType(.emailAddress) + .autocorrectionDisabled() + .textInputAutocapitalization(.never) + + AppSecureField( + title: "password", + icon: "lock.fill", + text: $password + ) + .textContentType(.password) + } + + if let error = authViewModel.error { + Text(error) + .foregroundStyle(.red) + .font(.footnote) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .leading) + } + + Button { + Task { await authViewModel.login(email: email, password: password) } + } label: { + ZStack { + RoundedRectangle(cornerRadius: 14, style: .continuous) + .fill( + LinearGradient( + colors: [Color.red, Color.red.opacity(0.82)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(height: 52) + + if authViewModel.isLoading { + ProgressView() + .tint(.white) + } else { + Text("login_button") + .font(.headline) + .foregroundStyle(.white) + } + } + } + .disabled(isFormInvalid) + .opacity(isFormInvalid ? 0.6 : 1) + + Button("login_no_account") { + showRegister = true + } + .font(.footnote.weight(.semibold)) .foregroundStyle(.secondary) - } - VStack(spacing: 16) { - TextField("Email", text: $email) - .textFieldStyle(.roundedBorder) - .textContentType(.emailAddress) - .keyboardType(.emailAddress) - .autocorrectionDisabled() - .textInputAutocapitalization(.never) - - SecureField("password", text: $password) - .textFieldStyle(.roundedBorder) - .textContentType(.password) - } - - if let error = authViewModel.error { - Text(error) - .foregroundStyle(.red) - .font(.footnote) - .multilineTextAlignment(.center) - } - - Button { - Task { await authViewModel.login(email: email, password: password) } - } label: { - if authViewModel.isLoading { - ProgressView() - .frame(maxWidth: .infinity) - } else { - Text("login_button") - .frame(maxWidth: .infinity) + Spacer(minLength: 8) } + .cardContainer() } - .buttonStyle(.borderedProminent) - .disabled(email.isEmpty || password.isEmpty || authViewModel.isLoading) - - Button("login_no_account") { - showRegister = true - } - .font(.footnote) - - #if DEBUG - Button { - Task { await authViewModel.enterPreviewMode() } - } label: { - Label("demo_mode", systemImage: "play.circle.fill") - .font(.footnote) - .foregroundStyle(.secondary) - } - .padding(.top, 8) - #endif - - Spacer() } - .padding() + .appBackground() .navigationDestination(isPresented: $showRegister) { RegisterView() } diff --git a/Mayday/Views/Auth/RegisterView.swift b/Mayday/Views/Auth/RegisterView.swift index e4dffa0..e155e19 100644 --- a/Mayday/Views/Auth/RegisterView.swift +++ b/Mayday/Views/Auth/RegisterView.swift @@ -10,76 +10,110 @@ struct RegisterView: View { @State private var showVerify = false @State private var registeredEmail = "" + private var isFormInvalid: Bool { + !isFormValid || authViewModel.isLoading + } + var body: some View { - VStack(spacing: 24) { - Spacer() + ZStack { + ScrollView { + VStack(spacing: 24) { + Spacer(minLength: 24) - Text("register_title") - .font(.largeTitle.bold()) + VStack(spacing: 10) { + Image("Logo") + .resizable() + .scaledToFit() + .frame(width: 76, height: 76) + .clipShape(RoundedRectangle(cornerRadius: 18, style: .continuous)) + .shadow(color: .red.opacity(0.22), radius: 12, y: 6) - VStack(spacing: 16) { - TextField("Email", text: $email) - .textFieldStyle(.roundedBorder) - .textContentType(.emailAddress) - .keyboardType(.emailAddress) - .autocorrectionDisabled() - .textInputAutocapitalization(.never) - - SecureField("password", text: $password) - .textFieldStyle(.roundedBorder) - .textContentType(.newPassword) - - SecureField("confirm_password", text: $confirmPassword) - .textFieldStyle(.roundedBorder) - .textContentType(.newPassword) - } - - if password.count > 0 && password.count < 8 { - Text("password_min_length") - .foregroundStyle(.red) - .font(.footnote) - } - - if confirmPassword.count > 0 && password != confirmPassword { - Text("passwords_mismatch") - .foregroundStyle(.red) - .font(.footnote) - } - - if let error = authViewModel.error { - Text(error) - .foregroundStyle(.red) - .font(.footnote) - .multilineTextAlignment(.center) - } - - Button { - Task { - let success = await authViewModel.register(email: email, password: password) - if success { - registeredEmail = email - showVerify = true + Text("register_title") + .font(.largeTitle.bold()) } + + VStack(spacing: 14) { + AppTextField(title: "Email", icon: "envelope.fill", text: $email) + .textContentType(.emailAddress) + .keyboardType(.emailAddress) + .autocorrectionDisabled() + .textInputAutocapitalization(.never) + + AppSecureField(title: "password", icon: "lock.fill", text: $password) + .textContentType(.newPassword) + + AppSecureField(title: "confirm_password", icon: "lock.rotation", text: $confirmPassword) + .textContentType(.newPassword) + } + + if password.count > 0 && password.count < 8 { + Text("password_min_length") + .foregroundStyle(.red) + .font(.footnote) + .frame(maxWidth: .infinity, alignment: .leading) + } + + if confirmPassword.count > 0 && password != confirmPassword { + Text("passwords_mismatch") + .foregroundStyle(.red) + .font(.footnote) + .frame(maxWidth: .infinity, alignment: .leading) + } + + if let error = authViewModel.error { + Text(error) + .foregroundStyle(.red) + .font(.footnote) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + } + + Button { + Task { + let success = await authViewModel.register(email: email, password: password) + if success { + registeredEmail = email + showVerify = true + } + } + } label: { + ZStack { + RoundedRectangle(cornerRadius: 14, style: .continuous) + .fill( + LinearGradient( + colors: [Color.red, Color.red.opacity(0.82)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(height: 52) + + if authViewModel.isLoading { + ProgressView() + .tint(.white) + } else { + Text("register_button") + .font(.headline) + .foregroundStyle(.white) + } + } + } + .disabled(isFormInvalid) + .opacity(isFormInvalid ? 0.6 : 1) + + Button("register_has_account") { dismiss() } + .font(.footnote.weight(.semibold)) + .foregroundStyle(.secondary) + + Spacer(minLength: 8) } - } label: { - if authViewModel.isLoading { - ProgressView().frame(maxWidth: .infinity) - } else { - Text("register_button").frame(maxWidth: .infinity) - } + .cardContainer() + } + .navigationDestination(isPresented: $showVerify) { + VerifyEmailView(email: registeredEmail, password: password) } - .buttonStyle(.borderedProminent) - .disabled(!isFormValid || authViewModel.isLoading) - - Button("register_has_account") { dismiss() } - .font(.footnote) - - Spacer() - } - .padding() - .navigationDestination(isPresented: $showVerify) { - VerifyEmailView(email: registeredEmail) } + .appBackground() .navigationTitle("register_title") .navigationBarTitleDisplayMode(.inline) } diff --git a/Mayday/Views/Auth/VerifyEmailView.swift b/Mayday/Views/Auth/VerifyEmailView.swift index c3636cd..29ebdaa 100644 --- a/Mayday/Views/Auth/VerifyEmailView.swift +++ b/Mayday/Views/Auth/VerifyEmailView.swift @@ -2,98 +2,167 @@ import SwiftUI struct VerifyEmailView: View { let email: String + let password: String @EnvironmentObject var authViewModel: AuthViewModel @State private var codeDigits: [String] = Array(repeating: "", count: 6) @State private var resendCooldown = 0 - @FocusState private var focusedIndex: Int? + @State private var focusedIndex: Int? @State private var cooldownTask: Task? + private var code: String { + codeDigits.joined() + } + var body: some View { - VStack(spacing: 32) { - Spacer() - - VStack(spacing: 8) { - Text("verify_email_title") - .font(.largeTitle.bold()) - Text("verify_code_sent_to") - .foregroundStyle(.secondary) - Text(email) - .fontWeight(.semibold) + ScrollView { + contentCard + } + .appBackground() + .navigationTitle("verify_nav_title") + .navigationBarTitleDisplayMode(.inline) + .onAppear { focusedIndex = 0 } + .onDisappear { cooldownTask?.cancel() } + .onChange(of: code) { _, newValue in + if newValue.count == 6 { + Task { await submitCode(newValue) } } + } + } - HStack(spacing: 12) { - ForEach(0..<6, id: \.self) { index in - TextField("", text: $codeDigits[index]) - .frame(width: 44, height: 52) - .multilineTextAlignment(.center) - .font(.title2.bold()) - .keyboardType(.numberPad) - .textContentType(.oneTimeCode) - .overlay( - RoundedRectangle(cornerRadius: 8) - .stroke(focusedIndex == index ? Color.accentColor : Color.secondary, lineWidth: 2) - ) - .focused($focusedIndex, equals: index) - .onChange(of: codeDigits[index]) { _, newValue in - handleDigitChange(index: index, value: newValue) - } - } - } + + private var contentCard: some View { + VStack(spacing: 28) { + Spacer(minLength: 24) + + headerView + otpFieldsView if let error = authViewModel.error { Text(error) .foregroundStyle(.red) .font(.footnote) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) } - Button { - Task { await resendCode() } - } label: { + if code.count == 6 { + ProgressView() + .padding(.top, 2) + } + + resendButton + + Spacer(minLength: 8) + } + .cardContainer() + } + + private var headerView: some View { + VStack(spacing: 8) { + Image("Logo") + .resizable() + .scaledToFit() + .frame(width: 72, height: 72) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .shadow(color: .red.opacity(0.22), radius: 12, y: 6) + + Text("verify_email_title") + .font(.largeTitle.bold()) + + Text("verify_code_sent_to") + .font(.subheadline) + .foregroundStyle(.secondary) + + Text(email) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(.primary) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + + private var otpFieldsView: some View { + HStack(spacing: 10) { + ForEach(0..<6, id: \.self) { index in + otpField(at: index) + } + } + } + + private var resendButton: some View { + Button { + Task { await resendCode() } + } label: { + Group { if resendCooldown > 0 { Text("verify_resend_cooldown \(resendCooldown)") } else { Text("verify_resend") } } - .disabled(resendCooldown > 0) - - Spacer() + .font(.footnote.weight(.semibold)) + .foregroundStyle(resendCooldown > 0 ? Color.secondary : Color.red) + .padding(.horizontal, 14) + .padding(.vertical, 8) + .background(Color(.tertiarySystemFill)) + .clipShape(Capsule()) } - .padding() - .navigationTitle("verify_nav_title") - .navigationBarTitleDisplayMode(.inline) - .onAppear { focusedIndex = 0 } - .onDisappear { cooldownTask?.cancel() } + .disabled(resendCooldown > 0) } - private func handleDigitChange(index: Int, value: String) { - let filtered = value.filter { $0.isNumber } - if filtered.count > 1 { - // Paste handling - let digits = Array(filtered.prefix(6)) - for (i, d) in digits.enumerated() where i < 6 { - codeDigits[i] = String(d) + @ViewBuilder + private func otpField(at index: Int) -> some View { + OTPDigitField( + text: $codeDigits[index], + isFocused: focusedIndex == index, + onFocus: { focusedIndex = index }, + onInsert: { + if index < 5 { + focusedIndex = index + 1 + } + }, + onDeleteWhenEmpty: { + handleDeleteOnEmpty(at: index) + }, + onPaste: { digits in + handlePaste(digits, startingAt: index) } - focusedIndex = min(digits.count, 5) - } else { - codeDigits[index] = filtered.isEmpty ? "" : String(filtered.last!) - if !filtered.isEmpty && index < 5 { - focusedIndex = index + 1 - } - } + ) + .frame(width: 46, height: 56) + .background(Color(.secondarySystemBackground)) + .clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .stroke( + focusedIndex == index + ? Color.red.opacity(0.9) + : Color.primary.opacity(0.10), + lineWidth: focusedIndex == index ? 2 : 1 + ) + ) + } - let code = codeDigits.joined() - if code.count == 6 { - Task { await submitCode(code) } + private func handleDeleteOnEmpty(at index: Int) { + guard index > 0 else { return } + codeDigits[index - 1] = "" + focusedIndex = index - 1 + } + + private func handlePaste(_ digits: [String], startingAt startIndex: Int) { + guard !digits.isEmpty else { return } + for (offset, digit) in digits.enumerated() { + let target = startIndex + offset + guard target < codeDigits.count else { break } + codeDigits[target] = String(digit.prefix(1)) } + focusedIndex = min(startIndex + digits.count, codeDigits.count - 1) } private func submitCode(_ code: String) async { await authViewModel.verifyEmail(email: email, code: code) if authViewModel.error == nil { - // Auto-login after verification - in a real flow we'd re-login here - // since verify doesn't return tokens + await authViewModel.login(email: email, password: password) } } diff --git a/Mayday/Views/Notifications/NotificationDetailView.swift b/Mayday/Views/Notifications/NotificationDetailView.swift index cc798b2..a0a779e 100644 --- a/Mayday/Views/Notifications/NotificationDetailView.swift +++ b/Mayday/Views/Notifications/NotificationDetailView.swift @@ -1,24 +1,49 @@ import SwiftUI struct NotificationDetailView: View { - let notification: AppNotification - let viewModel: NotificationsViewModel + let notificationId: UUID + @ObservedObject var viewModel: NotificationsViewModel + + private var notification: AppNotification? { + viewModel.notifications.first { $0.id == notificationId } + } + + init(notification: AppNotification, viewModel: NotificationsViewModel) { + self.notificationId = notification.id + self.viewModel = viewModel + } var body: some View { + Group { + if let notification { + scrollContent(notification) + } + } + .background(Color(.systemGroupedBackground)) + .navigationTitle("details_section") + .navigationBarTitleDisplayMode(.inline) + .task { + if let notification, !notification.isRead { + await viewModel.markAsRead(notification) + } + } + } + + private func scrollContent(_ notification: AppNotification) -> some View { ScrollView { VStack(spacing: 0) { // Hero header - headerSection + headerSection(notification) // Info cards VStack(spacing: 16) { - detailsCard + detailsCard(notification) if let metadata = notification.metadata, !metadata.isEmpty { metadataCard(metadata) } - statusCard + statusCard(notification) } .padding(.horizontal, 16) .padding(.top, 24) @@ -44,29 +69,24 @@ struct NotificationDetailView: View { } } } - .background(Color(.systemGroupedBackground)) - .navigationTitle("details_section") - .navigationBarTitleDisplayMode(.inline) - .task { - await viewModel.markAsRead(notification) - } } // MARK: - Hero Header - private var headerSection: some View { - VStack(spacing: 16) { + private func headerSection(_ notification: AppNotification) -> some View { + let severity = NotificationSeverity(from: notification.metadata) + return VStack(spacing: 16) { ZStack { Circle() .fill(Color(.secondarySystemGroupedBackground)) .frame(width: 88, height: 88) - .shadow(color: topicColor.opacity(0.3), radius: 12, y: 4) + .shadow(color: severity.color.opacity(0.3), radius: 12, y: 4) Circle() - .fill(topicColor.opacity(0.15)) + .fill(severity.color.opacity(0.15)) .frame(width: 80, height: 80) - Image(systemName: topicIcon) + Image(systemName: severity.icon) .font(.system(size: 32)) - .foregroundStyle(topicColor) + .foregroundStyle(severity.color) } VStack(spacing: 6) { @@ -79,7 +99,7 @@ struct NotificationDetailView: View { .foregroundStyle(.secondary) } - statusBadge + statusBadge(for: notification) } .padding(.vertical, 28) .frame(maxWidth: .infinity) @@ -87,7 +107,7 @@ struct NotificationDetailView: View { // MARK: - Status Badge - private var statusBadge: some View { + private func statusBadge(for notification: AppNotification) -> some View { let (text, color): (String, Color) = notification.isRead ? (String(localized: "status_read"), .green) : (String(localized: "status_new"), .red) @@ -102,7 +122,7 @@ struct NotificationDetailView: View { // MARK: - Details Card - private var detailsCard: some View { + private func detailsCard(_ notification: AppNotification) -> some View { VStack(alignment: .leading, spacing: 12) { Label("details_section", systemImage: "doc.text.fill") .font(.subheadline.bold()) @@ -168,14 +188,14 @@ struct NotificationDetailView: View { // MARK: - Status Card - private var statusCard: some View { + private func statusCard(_ notification: AppNotification) -> some View { VStack(alignment: .leading, spacing: 12) { Label("status_section", systemImage: "clock.fill") .font(.subheadline.bold()) .foregroundStyle(.primary) VStack(spacing: 8) { - infoRow(icon: "paperplane.fill", label: String(localized: "channel_label"), value: channelLabel) + infoRow(icon: "paperplane.fill", label: String(localized: "channel_label"), value: channelLabel(for: notification)) Divider() infoRow(icon: "clock", label: String(localized: "received_label"), value: notification.createdAt.formatted(date: .abbreviated, time: .shortened)) if let readAt = notification.readAt { @@ -209,7 +229,7 @@ struct NotificationDetailView: View { // MARK: - Helpers - private var channelLabel: String { + private func channelLabel(for notification: AppNotification) -> String { switch notification.channel { case .inApp: return String(localized: "channel_in_app") case .apns: return "Push" @@ -218,34 +238,4 @@ struct NotificationDetailView: View { case .webhook: return "Webhook" } } - - private var topicIcon: String { - let lowered = (notification.source ?? "").lowercased() - if lowered.contains("fire") || lowered.contains("пожар") || lowered.contains("огонь") { - return "flame.fill" - } else if lowered.contains("medical") || lowered.contains("медиц") || lowered.contains("здоров") { - return "heart.fill" - } else if lowered.contains("security") || lowered.contains("безопас") { - return "shield.fill" - } else if lowered.contains("water") || lowered.contains("вод") || lowered.contains("затоп") { - return "drop.fill" - } else { - return "exclamationmark.triangle.fill" - } - } - - private var topicColor: Color { - let lowered = (notification.source ?? "").lowercased() - if lowered.contains("fire") || lowered.contains("пожар") || lowered.contains("огонь") { - return .red - } else if lowered.contains("medical") || lowered.contains("медиц") || lowered.contains("здоров") { - return .green - } else if lowered.contains("security") || lowered.contains("безопас") { - return .blue - } else if lowered.contains("water") || lowered.contains("вод") || lowered.contains("затоп") { - return .cyan - } else { - return .orange - } - } } diff --git a/Mayday/Views/Notifications/NotificationsView.swift b/Mayday/Views/Notifications/NotificationsView.swift index d128370..23c2567 100644 --- a/Mayday/Views/Notifications/NotificationsView.swift +++ b/Mayday/Views/Notifications/NotificationsView.swift @@ -36,21 +36,8 @@ struct NotificationsView: View { } .background(Color(.systemGroupedBackground)) .navigationTitle("notifications_title") + .navigationBarTitleDisplayMode(.inline) .toolbar { - #if DEBUG - if PreviewData.isPreviewMode { - ToolbarItem(placement: .topBarLeading) { - Button(action: {}) { - Text("demo_badge") - .font(.caption2.bold()) - } - .buttonStyle(.borderedProminent) - .tint(.orange) - .controlSize(.mini) - .allowsHitTesting(false) - } - } - #endif ToolbarItem(placement: .topBarTrailing) { Button { showSettings = true @@ -86,6 +73,7 @@ struct NotificationsView: View { NavigationLink(destination: NotificationDetailView(notification: notification, viewModel: viewModel)) { ActiveNotificationCard(notification: notification) } + .id("\(notification.id)-\(notification.isRead)") .buttonStyle(.plain) .padding(.horizontal, 16) .padding(.bottom, 12) @@ -103,6 +91,7 @@ struct NotificationsView: View { NavigationLink(destination: NotificationDetailView(notification: notification, viewModel: viewModel)) { ResolvedNotificationCard(notification: notification) } + .id("\(notification.id)-\(notification.isRead)") .buttonStyle(.plain) .padding(.horizontal, 16) .padding(.bottom, 12) @@ -146,7 +135,7 @@ struct ActiveNotificationCard: View { var body: some View { VStack(alignment: .leading, spacing: 12) { HStack(alignment: .top) { - NotificationIconView(source: notification.source, isActive: true) + NotificationIconView(severity: NotificationSeverity(from: notification.metadata), isActive: true) VStack(alignment: .leading, spacing: 2) { Text(notification.subject ?? "") @@ -206,7 +195,7 @@ struct ResolvedNotificationCard: View { var body: some View { VStack(alignment: .leading, spacing: 10) { HStack(alignment: .top) { - NotificationIconView(source: notification.source, isActive: false) + NotificationIconView(severity: NotificationSeverity(from: notification.metadata), isActive: false) VStack(alignment: .leading, spacing: 2) { Text(notification.subject ?? "") @@ -255,51 +244,3 @@ struct ResolvedNotificationCard: View { .shadow(color: .black.opacity(0.06), radius: 8, y: 2) } } - -// MARK: - Notification Icon - -struct NotificationIconView: View { - let source: String? - let isActive: Bool - - private var iconName: String { - let lowered = (source ?? "").lowercased() - if lowered.contains("fire") || lowered.contains("пожар") || lowered.contains("огонь") { - return "flame.fill" - } else if lowered.contains("medical") || lowered.contains("медиц") || lowered.contains("здоров") { - return "heart.fill" - } else if lowered.contains("security") || lowered.contains("безопас") { - return "shield.fill" - } else if lowered.contains("water") || lowered.contains("вод") || lowered.contains("затоп") { - return "drop.fill" - } else { - return "exclamationmark.triangle.fill" - } - } - - private var iconColor: Color { - let lowered = (source ?? "").lowercased() - if lowered.contains("fire") || lowered.contains("пожар") || lowered.contains("огонь") { - return .red - } else if lowered.contains("medical") || lowered.contains("медиц") || lowered.contains("здоров") { - return .green - } else if lowered.contains("security") || lowered.contains("безопас") { - return .blue - } else if lowered.contains("water") || lowered.contains("вод") || lowered.contains("затоп") { - return .cyan - } else { - return .orange - } - } - - var body: some View { - ZStack { - Circle() - .fill(isActive ? .white.opacity(0.25) : iconColor.opacity(0.12)) - .frame(width: 40, height: 40) - Image(systemName: iconName) - .font(.body) - .foregroundStyle(isActive ? .white : iconColor) - } - } -} diff --git a/Mayday/Views/Settings/SettingsView.swift b/Mayday/Views/Settings/SettingsView.swift index 0237473..086ba2e 100644 --- a/Mayday/Views/Settings/SettingsView.swift +++ b/Mayday/Views/Settings/SettingsView.swift @@ -59,6 +59,23 @@ struct SettingsView: View { Button("logout_all_button", role: .destructive) { showLogoutAllConfirm = true } + .confirmationDialog( + "logout_all_confirm", + isPresented: $showLogoutAllConfirm, + titleVisibility: .visible + ) { + Button("logout_all_action", role: .destructive) { + Task { + do { + _ = try await NotificationsAPIService.shared.logoutAll() + await authViewModel.logout() + } catch { + logoutAllError = error.localizedDescription + } + } + } + Button("cancel", role: .cancel) {} + } } } .navigationTitle("settings_title") @@ -75,23 +92,6 @@ struct SettingsView: View { SessionsView() .environmentObject(viewModel) } - .confirmationDialog( - "logout_all_confirm", - isPresented: $showLogoutAllConfirm, - titleVisibility: .visible - ) { - Button("logout_all_action", role: .destructive) { - Task { - do { - _ = try await NotificationsAPIService.shared.logoutAll() - await authViewModel.logout() - } catch { - logoutAllError = error.localizedDescription - } - } - } - Button("cancel", role: .cancel) {} - } .alert( "error_title", isPresented: Binding( diff --git a/Mayday/Views/UIKit/AppBackground.swift b/Mayday/Views/UIKit/AppBackground.swift new file mode 100644 index 0000000..c5a475c --- /dev/null +++ b/Mayday/Views/UIKit/AppBackground.swift @@ -0,0 +1,20 @@ +import SwiftUI + +struct AppBackgroundModifier: ViewModifier { + func body(content: Content) -> some View { + content.background( + LinearGradient( + colors: [Color(.systemGroupedBackground), Color.red.opacity(0.08)], + startPoint: .top, + endPoint: .bottom + ) + .ignoresSafeArea() + ) + } +} + +extension View { + func appBackground() -> some View { + modifier(AppBackgroundModifier()) + } +} diff --git a/Mayday/Views/UIKit/AppSecureField.swift b/Mayday/Views/UIKit/AppSecureField.swift new file mode 100644 index 0000000..f216ac6 --- /dev/null +++ b/Mayday/Views/UIKit/AppSecureField.swift @@ -0,0 +1,25 @@ +import SwiftUI + +struct AppSecureField: View { + let title: LocalizedStringKey + let icon: String + @Binding var text: String + + var body: some View { + HStack(spacing: 10) { + Image(systemName: icon) + .foregroundStyle(.secondary) + .frame(width: 18) + + SecureField(title, text: $text) + } + .padding(.horizontal, 14) + .padding(.vertical, 14) + .background(Color(.secondarySystemBackground)) + .clipShape(RoundedRectangle(cornerRadius: 14, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 14, style: .continuous) + .stroke(Color.primary.opacity(0.08), lineWidth: 1) + ) + } +} diff --git a/Mayday/Views/UIKit/AppTextField.swift b/Mayday/Views/UIKit/AppTextField.swift new file mode 100644 index 0000000..6c017ae --- /dev/null +++ b/Mayday/Views/UIKit/AppTextField.swift @@ -0,0 +1,25 @@ +import SwiftUI + +struct AppTextField: View { + let title: LocalizedStringKey + let icon: String + @Binding var text: String + + var body: some View { + HStack(spacing: 10) { + Image(systemName: icon) + .foregroundStyle(.secondary) + .frame(width: 18) + + TextField(title, text: $text) + } + .padding(.horizontal, 14) + .padding(.vertical, 14) + .background(Color(.secondarySystemBackground)) + .clipShape(RoundedRectangle(cornerRadius: 14, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 14, style: .continuous) + .stroke(Color.primary.opacity(0.08), lineWidth: 1) + ) + } +} diff --git a/Mayday/Views/UIKit/CardContainer.swift b/Mayday/Views/UIKit/CardContainer.swift new file mode 100644 index 0000000..b99b09a --- /dev/null +++ b/Mayday/Views/UIKit/CardContainer.swift @@ -0,0 +1,22 @@ +import SwiftUI + +struct CardContainerModifier: ViewModifier { + func body(content: Content) -> some View { + content + .padding(.horizontal, 20) + .padding(.vertical, 24) + .background(Color(.systemBackground).opacity(0.8)) + .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 28, style: .continuous) + .stroke(Color.primary.opacity(0.06), lineWidth: 1) + ) + .padding(16) + } +} + +extension View { + func cardContainer() -> some View { + modifier(CardContainerModifier()) + } +} diff --git a/Mayday/Views/UIKit/NotificationIconView.swift b/Mayday/Views/UIKit/NotificationIconView.swift new file mode 100644 index 0000000..aba8cdf --- /dev/null +++ b/Mayday/Views/UIKit/NotificationIconView.swift @@ -0,0 +1,47 @@ +import SwiftUI + +enum NotificationSeverity: String { + case critical + case warning + case info + case success + + var icon: String { + switch self { + case .critical: return "exclamationmark.triangle.fill" + case .warning: return "exclamationmark.circle.fill" + case .info: return "info.circle.fill" + case .success: return "checkmark.seal.fill" + } + } + + var color: Color { + switch self { + case .critical: return .red + case .warning: return .orange + case .info: return .blue + case .success: return .green + } + } + + init(from metadata: [String: String]?) { + let raw = metadata?["severity"]?.lowercased() ?? "" + self = NotificationSeverity(rawValue: raw) ?? .info + } +} + +struct NotificationIconView: View { + let severity: NotificationSeverity + let isActive: Bool + + var body: some View { + ZStack { + Circle() + .fill(isActive ? .white.opacity(0.25) : severity.color.opacity(0.12)) + .frame(width: 40, height: 40) + Image(systemName: severity.icon) + .font(.body) + .foregroundStyle(isActive ? .white : severity.color) + } + } +} diff --git a/Mayday/Views/UIKit/OTPDigitField.swift b/Mayday/Views/UIKit/OTPDigitField.swift new file mode 100644 index 0000000..47f67b9 --- /dev/null +++ b/Mayday/Views/UIKit/OTPDigitField.swift @@ -0,0 +1,100 @@ +import SwiftUI +import UIKit + +struct OTPDigitField: UIViewRepresentable { + @Binding var text: String + let isFocused: Bool + let onFocus: () -> Void + let onInsert: () -> Void + let onDeleteWhenEmpty: () -> Void + let onPaste: ([String]) -> Void + + func makeUIView(context: Context) -> BackspaceAwareTextField { + let textField = BackspaceAwareTextField() + textField.delegate = context.coordinator + textField.keyboardType = .numberPad + textField.textAlignment = .center + textField.font = UIFont.systemFont(ofSize: 24, weight: .bold) + textField.textContentType = .oneTimeCode + textField.onDeleteWhenEmpty = { + onDeleteWhenEmpty() + } + textField.addTarget(context.coordinator, action: #selector(Coordinator.editingChanged(_:)), for: .editingChanged) + return textField + } + + func updateUIView(_ uiView: BackspaceAwareTextField, context: Context) { + if uiView.text != text { + uiView.text = text + } + + if isFocused && !uiView.isFirstResponder { + DispatchQueue.main.async { + uiView.becomeFirstResponder() + } + } + } + + func makeCoordinator() -> Coordinator { + Coordinator(parent: self) + } + + final class Coordinator: NSObject, UITextFieldDelegate { + var parent: OTPDigitField + + init(parent: OTPDigitField) { + self.parent = parent + } + + func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { + parent.onFocus() + return true + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + parent.onFocus() + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if string.isEmpty { + return true + } + + let digits = string.filter { $0.isNumber } + guard !digits.isEmpty else { + return false + } + + if digits.count > 1 { + parent.onPaste(digits.map(String.init)) + return false + } + + parent.text = String(digits.prefix(1)) + parent.onInsert() + return false + } + + @objc + func editingChanged(_ textField: UITextField) { + let digitsOnly = (textField.text ?? "").filter { $0.isNumber } + let single = String(digitsOnly.prefix(1)) + if textField.text != single { + textField.text = single + } + parent.text = single + } + } +} + +final class BackspaceAwareTextField: UITextField { + var onDeleteWhenEmpty: (() -> Void)? + + override func deleteBackward() { + let wasEmpty = (text ?? "").isEmpty + super.deleteBackward() + if wasEmpty { + onDeleteWhenEmpty?() + } + } +} diff --git a/README.md b/README.md index 210a1e8..3d36267 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,46 @@ -# mayday -The app you hope you never get a notification from +

+ Mayday logo +

+ +

Mayday

+ +

+ The app you hope you never get a notification from. +

+ +

+ iOS app for emergency and critical alerts with clear severity states, + quick triage, and secure session-aware access. +

+ +## Highlights + +- Fast notification feed with unread/read sections +- Auto-mark as read on open with consistent UI state +- Severity-driven icon and color mapping from `metadata.severity` +- Auth flow with login, register, and email verification +- Account settings: sessions and password management + +## Tech + +- SwiftUI +- MVVM +- Async/await networking +- Keychain-backed auth token storage + +## Run + +1. Open `Mayday.xcodeproj` in Xcode +2. Select the `Mayday` scheme +3. Build and run on simulator or device + +## Project + +- App source: `Mayday/` +- Live Activity target: `MaydayLiveActivity/` + +## Icon Attribution + +Icon from [lucide.dev](https://lucide.dev), released under the ISC License. + +Copyright (c) 2026 Lucide Contributors