From d06f4d6a3612823f7419ed95c372c55b7fd61f05 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 10 Aug 2023 16:14:12 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 13 ++ Podfile.lock | 49 ++++++- .../ic_blog_circle.imageset/Contents.json | 21 +++ .../ic_blog_circle.png | Bin 0 -> 8020 bytes .../ic_coin_w.imageset/Contents.json | 21 +++ .../ic_coin_w.imageset/ic_coin_w.png | Bin 0 -> 1834 bytes .../ic_forward.imageset/Contents.json | 21 +++ .../ic_forward.imageset/ic_forward.png | Bin 0 -> 223 bytes .../ic_headphones.imageset/Contents.json | 21 +++ .../ic_headphones.imageset/ic_headphones.png | Bin 0 -> 756 bytes .../Contents.json | 21 +++ .../ic_headphones_purple.png | Bin 0 -> 1316 bytes .../Contents.json | 21 +++ .../ic_instagram_circle.png | Bin 0 -> 8335 bytes .../Contents.json | 21 +++ .../ic_message_square_777.png | Bin 0 -> 471 bytes .../ic_myinfo_edit.imageset/Contents.json | 21 +++ .../ic_myinfo_edit.png | Bin 0 -> 332 bytes .../ic_settings.imageset/Contents.json | 21 +++ .../ic_settings.imageset/ic_settings.png | Bin 0 -> 976 bytes .../ic_website_circle.imageset/Contents.json | 21 +++ .../ic_website_circle.png | Bin 0 -> 7895 bytes .../ic_youtube_circle.imageset/Contents.json | 21 +++ .../ic_youtube_circle.png | Bin 0 -> 6485 bytes SodaLive/Sources/App/AppStep.swift | 2 + SodaLive/Sources/ContentView.swift | 4 + SodaLive/Sources/MyPage/Auth/AuthApi.swift | 44 ++++++ .../Sources/MyPage/Auth/AuthButtonView.swift | 27 ++++ .../Sources/MyPage/Auth/AuthRepository.swift | 20 +++ .../MyPage/Auth/AuthVerifyRequest.swift | 16 +++ SodaLive/Sources/MyPage/CanCardView.swift | 77 ++++++++++ SodaLive/Sources/MyPage/MyInfoCardView.swift | 95 +++++++++++++ SodaLive/Sources/MyPage/MyPageResponse.swift | 22 +++ SodaLive/Sources/MyPage/MyPageView.swift | 131 +++++++++++++++++- SodaLive/Sources/MyPage/MyPageViewModel.swift | 110 +++++++++++++++ .../MyPage/ReservationStatusView.swift | 67 +++++++++ .../MyPage/ServiceCenterButtonView.swift | 40 ++++++ .../Notification/GetMemberInfoResponse.swift | 21 +++ SodaLive/Sources/User/UserApi.swift | 9 +- SodaLive/Sources/User/UserRepository.swift | 4 + 40 files changed, 979 insertions(+), 3 deletions(-) create mode 100644 SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/ic_blog_circle.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_coin_w.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_coin_w.imageset/ic_coin_w.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_forward.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_forward.imageset/ic_forward.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_headphones.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_headphones.imageset/ic_headphones.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/ic_headphones_purple.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_instagram_circle.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_instagram_circle.imageset/ic_instagram_circle.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/ic_message_square_777.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/ic_myinfo_edit.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_settings.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_settings.imageset/ic_settings.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/ic_website_circle.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/ic_youtube_circle.png create mode 100644 SodaLive/Sources/MyPage/Auth/AuthApi.swift create mode 100644 SodaLive/Sources/MyPage/Auth/AuthButtonView.swift create mode 100644 SodaLive/Sources/MyPage/Auth/AuthRepository.swift create mode 100644 SodaLive/Sources/MyPage/Auth/AuthVerifyRequest.swift create mode 100644 SodaLive/Sources/MyPage/CanCardView.swift create mode 100644 SodaLive/Sources/MyPage/MyInfoCardView.swift create mode 100644 SodaLive/Sources/MyPage/MyPageResponse.swift create mode 100644 SodaLive/Sources/MyPage/MyPageViewModel.swift create mode 100644 SodaLive/Sources/MyPage/ReservationStatusView.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenterButtonView.swift create mode 100644 SodaLive/Sources/Settings/Notification/GetMemberInfoResponse.swift diff --git a/Podfile b/Podfile index dbac9d6..c0148f1 100644 --- a/Podfile +++ b/Podfile @@ -6,6 +6,7 @@ target 'SodaLive' do use_frameworks! # Pods for SodaLive + pod 'BootpayUI', '4.3.0' end @@ -14,5 +15,17 @@ target 'SodaLive-dev' do use_frameworks! # Pods for SodaLive-dev + pod 'BootpayUI', '4.3.0' end + +post_install do |installer| + installer.generated_projects.each do |project| + project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0' + end + end + end +end + diff --git a/Podfile.lock b/Podfile.lock index 78c6c10..3cf44b9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,3 +1,50 @@ -PODFILE CHECKSUM: 40957185212259305ead8c0beb4b1e5415b9b0df +PODS: + - Alamofire (5.7.1) + - Bootpay (4.2.9): + - CryptoSwift + - ObjectMapper + - BootpayUI (4.3.0): + - Alamofire + - Bootpay (~> 4.2.8) + - CryptoSwift + - JGProgressHUD + - ObjectMapper + - SCLAlertView + - SnapKit + - SwiftyJSON + - CryptoSwift (1.7.1) + - JGProgressHUD (2.2) + - ObjectMapper (4.2.0) + - SCLAlertView (0.8) + - SnapKit (5.6.0) + - SwiftyJSON (5.0.1) + +DEPENDENCIES: + - BootpayUI (= 4.3.0) + +SPEC REPOS: + trunk: + - Alamofire + - Bootpay + - BootpayUI + - CryptoSwift + - JGProgressHUD + - ObjectMapper + - SCLAlertView + - SnapKit + - SwiftyJSON + +SPEC CHECKSUMS: + Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88 + Bootpay: d753088334a16ce99094142beb66a6610a15d84b + BootpayUI: 54dcbe59a23e0d91b07a8add8115e1a6deace0f0 + CryptoSwift: d3d18dc357932f7e6d580689e065cf1f176007c1 + JGProgressHUD: d83d7a981b85d11205e19ff8ad5bb9c40571c847 + ObjectMapper: 1eb41f610210777375fa806bf161dc39fb832b81 + SCLAlertView: 6a77bb2edfc65e04dbe57725546cb4107a506b85 + SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25 + SwiftyJSON: 2f33a42c6fbc52764d96f13368585094bfd8aa5e + +PODFILE CHECKSUM: 2581dac8090335f039e33fdbf3ec7d78d7f961e8 COCOAPODS: 1.12.1 diff --git a/SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/Contents.json new file mode 100644 index 0000000..d5cea0f --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_blog_circle.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/ic_blog_circle.png b/SodaLive/Resources/Assets.xcassets/ic_blog_circle.imageset/ic_blog_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f9ab5be8a51dc0d5fe04939193702ff25133f4 GIT binary patch literal 8020 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 WLsc&rR}p{!0000 z+A|J9ijpeeL`X;=#7c-l1uBjJ6(!yo=4Z3PvG*}EJG*{pKT?~-nOQkse}9ji*Jm<^*icp>kxPT!s#ztsy77_RF=8G2NW5QKM@naUuP!a!D7$M6^3!12i z)y-E%DbO)h$7x_w%BRV>on=UXL_|dAQO*~|w>d}_+X3=s-1#$B5&3#P$1T1noL7YQ zvP2y+LoSqUh=JHd{Lg)#g1MX*mDpTKAqM!}(^Epg&!KY!L~@qs2k^atVT?P`+3d&M zHwqmLC8Fq@->h`s1S z7acb$i`c6!bkT96h7;)!^g0$BRvE5TopDcu?ejmN_o-L|+b3iPD>>2Gca%OMm&%_G z%-{MAmTx}*`=D@d z

BdvjXR>mUiK-5A1`V*S7wKg{kKujG3GF;f4^f&V87jcn-#{J_X89Ruuo2q=te5 zgpz(xq}hG=J-RZCiMe}+k8|gN5Hi?Vc<+zV- z{T?_6!_X`2mv0BBV=s}j$ATU2hsutmw1~A$b`6FK$6H>*92w-QkMDSkwfeEo0ddSM!Zp&+7#RHGI+B9$byN8}1)S=^w-@iTc6U0F*BFcW^nEM)qmhB^( zT{j<6s9d(ce+VitMx;_$EF$J#ene_qbB^;0<^EHx$7)OkK{-_BSV0g1?GtgRcpRp# zKONdoBW}Cn*VbTz?Nyju_kC8{1sMuwkHNxZc(dLJA>5W3Cw<0(7gnmAtzcDbu8inB zEH=%rp{u;w8vMi2)gxC{Y3{fvPHZ$2Iw(KIp$mNq@h>F-kwPgm%pRv^UWNk3O zQ1S85F(`H;=*FQ!@VwgD(b@11NCt84EFF1D)tPg?1_nU41XXUokPLIAq2r{#s)l9+Fe< z9L{~%HkoQ`5C_P-%6P47ah%QmAHmSxvwQA~Vulr*M(`}BB+g=r!p){CG9s#Ssc&HW zqRJdC5%)JvPg6pA@+t^Q$tXEjR=SBu`>HULZtNgzv4Hy`D5AZJ!#Np;9)mhWDU1*1 zfhK)}j!EM%G9LBDNn>|ZRX0vA5kf|wi@*;*GgzL6h#0*st($~2B_LvSqpELkXOsa~ zI%R4HCIv){@AhQ|cHZyg9Emy5q<~0lH;q>}^21`w5pSBzL1$ny(UR%hrxHdi`_2ef zZEPLHYIq_Kvj~ETRT;ePEDiyYL>{D3UC)n_`mGH)NDy3+;bQ47F7aHFeWXi5VkRY? zOM4zJw4N^#%0>;hLlw~(EaTotQsTL^MMM|8gxT4{$GtF7glgA=t6T$F+rkyXt)XyY zqrDvE)GZ2a714{mFY|et5#f#xT%%17Tw~N0rLbZ#Ay`b$xJgM#Nl8gbNl8gbN$D;A Y1sXfPY1sa0WdHyG07*qoM6N<$g2%gB^Z)<= literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_forward.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_forward.imageset/Contents.json new file mode 100644 index 0000000..cc06a6f --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_forward.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_forward.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_forward.imageset/ic_forward.png b/SodaLive/Resources/Assets.xcassets/ic_forward.imageset/ic_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..7c07caee9e9de79b281afe1c4481b114934f48f2 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^Hb894!VDyt`^29BDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}iUB?$uI>dsA3uKl|NsAo4hG?Bs6)z4*} HQ$iB}YfDTJ;?!K;`%eL1>Q6)vY#1RR&n&<+UHdr9s1`#emR|+`}s}h=9WoIY$r~u zw+rsva8C4mM7|u`l7qQS<{w1PA1-6}xVBpIabZJa2ktuHq-iX}hW8S4yRyi@~Ty~VuT z_t+MeMo!s#_Da{&m2YxCg{XI*ELv-_#mYbTH;eYg(1gPleaHJ*Luaqt`YTFG$Iy{& z%Zd}XR3>^WTuM{hXyutwp$V+GpwB$WLCcR?P2u z_#>BPnPDscvmF!GZCx4kLqGmQ)5pt+p5E5W&$|C({mINQso-S%dC>-7B4hA$^>bP0 Hl+XkK1nhP= literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/Contents.json new file mode 100644 index 0000000..5f15106 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_headphones_purple.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/ic_headphones_purple.png b/SodaLive/Resources/Assets.xcassets/ic_headphones_purple 1.imageset/ic_headphones_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..d285d3893e0f39b8c021a9737fc9ed94e8db5fc7 GIT binary patch literal 1316 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 Z_iuaqRi`32Cwc$?002ovPDHLkV1joS_H_UN literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/Contents.json new file mode 100644 index 0000000..94a4c86 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_message_square_777.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/ic_message_square_777.png b/SodaLive/Resources/Assets.xcassets/ic_message_square_777.imageset/ic_message_square_777.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a2ed2ae1e56c696be9e08d087ea3a47345ec23 GIT binary patch literal 471 zcmV;|0Vw{7P)@QG1^T}T)h8tc$pNF* zPqK*rC-}+O$R9xS$1%<&f*^44@(kniRaI3QMbT?l@|PfrE%CC!=D@UM*dD_$%z03B z+_;75<%kv36VswKgTC*(hGA@3=zy(r>aT=-6kD>`8fP(WItzX`$~ml?7e#TOB*_6r z#PdAcG|e5A=W+`e2p!EW%W~n$;A#2}Sdk`#NO^vc;IVFa$A_(8Ty{9d z2M=5nY~-M>zQ$x@?XogI#hNmZIw^s=bCj!P5;f zxg0U{GowU~7$T@lj<_VKRE}r~;!ffs%H@dGCPASW+_^u$Rm*Aq1>ao-gNI+T%$)!L N002ovPDHLkV1fW?$ov2R literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/Contents.json new file mode 100644 index 0000000..a68c1c1 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_myinfo_edit.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/ic_myinfo_edit.png b/SodaLive/Resources/Assets.xcassets/ic_myinfo_edit.imageset/ic_myinfo_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..133480bcba61dad0791d07cbea4dc848c8e5baca GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKx3?xrnI^qbVSkfJRf%L|H?mvmFKt5w}kh>GZ zx^prwfgI@opAc8~0-yglfY@JIKAz<{y~m9Xw^0V0heYv%S}ex_A~=?zu(xYo`g6x!PHE zKc4wCEITN6@!hsW)jh|(b|jwRU2pKdaC@#m`NAz7#~(19f8Fpr_4c+li#NL+W6t@< z*wi$*&o?{rRlZ(WUsKF~V``JG@ShV8{w?dtt3UPP?U9~>Qy(5y`Ucl+vut*Mueq(> zZ^Mr46XHL&TE6Yt++Vsbflu*#z`D4T!tMSwx1@{N<&W>&?Y&g;IM5pmp00i_>zopr E0HRlx0ssI2 literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_settings.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_settings.imageset/Contents.json new file mode 100644 index 0000000..51c56c0 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_settings.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_settings.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_settings.imageset/ic_settings.png b/SodaLive/Resources/Assets.xcassets/ic_settings.imageset/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..a31d5ae38a90170d0fb5410532ea2abe7edf0819 GIT binary patch literal 976 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2H;>5jgR3=A9lx&I`x0{M)^LGDfr z>(0r%1akZWd_r8^3w-`l4|FX39tAX6vLwham?6dYi{RZ22aP(}Uoc7i4X$)qdM!44 zrpjqQkr!1A3{1a0T^vI^jxP<5T(nw&C)ClwK_vbA{)_4hB-*m7U8xl z&UI@!woLb*LDiPke;QpGXd zE#Xg9eLt*Rc&PD1%Cs}Bn@YcRao)+fTW~05dENZ8mmWQPedoNDi%9lag|87_sfC%! z!tp;ubH8$3J*M@#+2ok6O7yj}PrKKY9AB1Exs_#Ad`tLq&6)fUrhhQpq1AYqSE{hR zy!m9JGke2(dlfOuwnMSC8<)OwN)&1rdF}Cl`KE)Oxlw`0%hR{_l6!kwGmtGBJy;5mO_&SR5rvpD=G@RHw#JY}4*slo8Q`JsIUp$pCD-@h$v@x8oC_2gVH z*`*d5Y`=Qv`MB0h?^XYJ0 zFXvyLa4tk^^~4h!RBz`l`P+NBs{ZwjHM$yHt;Vhsws!@l^+(?8_#QSf#Y>0J;?os_ z&MR4L%I%?{6{qJb%>s4pab*US-h93`g~^!Ri`-kJPN5=9=%ZiNW`+B zwUmrg(+c`n>{Hxh+&l&g2 zKD^%&zUBY%=VxP&h2FB-TQ3tkFZPGL-OGagiXr;^Yj4^sN>ns1dpx-Ym{%A)UHx3v IIVCg!0F_wlNB{r; literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/Contents.json new file mode 100644 index 0000000..80c43ec --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_website_circle.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/ic_website_circle.png b/SodaLive/Resources/Assets.xcassets/ic_website_circle.imageset/ic_website_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..6490fbb55a35a59268635a40760930d7914c46ab GIT binary patch literal 7895 zcmV;|9w_07P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91c%TCS1ONa40RR91cmMzZ00`n$?f?KDK}keGRCodHodrK7=+!MX?JagxqIp@s0^Zw_3XXc%9Z4qVE<>%+yCQqJh6Zxl4 zpRUb)n{wsKH6%N=Uw^GsrAn2i=gyt$2_S8W>w~X_S6Kvt zu#2z*;six;g&prG%9RJYc6fd8Gk#58US2wtXX%k6M>f{2TUYUU(33}KdFNU<%Mp9S z4L6j#=%S0tA)z$@qaPq$N7$J#(GH-Pd>(&-xF3nz$n`pW7T0@oa&j_=&m%nc{PWLC zQVY1zqemx2MMYI1G69LLPK9a3brPX8K?|O!7|ne&wB+I!lj%zU{q6DN#}8MpUOmTZU|R;@!Gi}!qk3atUK1EO66Otp zx#eN#S(tbdzl1pX4*>M1fTQU_g2RUoPb^=)d@3{!gtp#%QkgIYn$B?jG2#4*6)S%A z{rBIWUASYC9*GR0b8`2OoSe7K6a06yQ<9*3{r_T+e#ysi$5D zW}&Q_Hd^dHD*Eu4n3yK;VgnlN3GP3mGijJagF&~fGy!)IZIgYN8aos}m;0*pir=MB zBPh&A0nf0EB)EL}@^3qJ>hu--sE;dm9xv1kwWdsLP$V8ea1N7YhT^F_eIsz~~Gc$8*pvTPtm0*E;!37t{Ry-3m z)E{tHQ$xoC?i^FNR)#V`n$x>=>$VAAHD&~H1!3ESgoG_jW*peEWlO+1odE+_;HIRc z^ajwGNN!ue{fwG9oL=(RWr**lk_yPXd-m+PnGRPHlH3E3J65Y!ZF`+Mb@m1dY}x*f9Xo2$A_2jW$+HiVoIzW? zch#y@ew%0g2AHv23`E@qxNksY1+Jevdi3a+7hZVbSQ+GZNJs|Alc?s;m~7DysvkuB z51MdaYHI4H^z?MUCN2ExWGz^*pxl}@Yp#T-_aI6$KF=`(nivu;{Z29+J9g}2@N*rug zMW1^80p>@ohZ;ww-RLcU0TC0)_*~JX!!iDFKr>E^M5e;yCE_(af0X+~Z`1TjMa#BK zX7^I7Mxi!Vqe8}`nzwqJY50B5IIwc%%3m2L?*!Pk@VqZ}g{&@Jx~#*j>G1@G#}Z6i zU_&KqtUHBTrBxRXKl$X7D?KAM{FbjA5RcK4kHPbw0C@`jQg2kXM*s`l@#Dw0lEji( z4)-r%e$?PR>`dSQ6Eq(pP@1$kO*sCmB?*iZl(6HC487(Q55&=GN;6MxsOknJFmhk0g zo_Qv-q(s8;=5k=xtXUbf!Bg>SHYaHVK}i%83$SL1n7ZnN8qn&DedzpGN=hIc9~usz zQQxG~wFZouu~BcJG;VQ}6dU=?H{V2IUw#B| &$y}uOqaWLc7uU}u4CZRh`L~ZgZ zwIdNsI!a0#=8C2q7`+!Yxt7%|M@xD)81c_N_gpqxW}ZjGb^xO>EX!R;K1T}YRRmxy zy(*)W z^`jV6G)-2QYwgsJP-ry=eF9iy)x|eM7+M4Jg)n*so7VT5K`&sQW`1BMd1>$R&^>$h zyvB9O084t~qG@d} zOwp?UzY1I!rh`@1aX%BFw?O=97-t5vJjw&ZPd;s5Ip~XpwuV%~(Fj93Xw(Mwt9Z7Y zgkJS1F+X3@t_apxYcs)ccsG(2nRjtrEWozJ#KhVV-5&z;2;cEDZ;wBx-L1jP*EqWS z>_F7PCl9x7-CBE?tR%Tb%7hTC9yoB|Q9#xLh!%if1KthXx^?TKX3d&u6MN7dc>M!G z&@PFAYuBzFPKM3}kIu#oLT%K*ju00Ib3bd>u3cu(DYIt)Q(BR4eceJsE{WY1aG1*Tj#|b9U5gA5;NH60sP8RN~Q0z5|Cy@Y81IhkRcapo1XDK+`_pU|uI zU^@O`Hp8niSm3n7K7#9H)csq;kHrt8;>@QK+@WWIbabk;qUHZdUyN4LvE-+n{-!yk z_+@w}I<5p@XTA=AZM}Q%(+n8MfL_c`vL5XvZYW|e zWv2lKnBkm%(OA#99?CQAIj*7SM5Qov7{{ zcebR9QdXTp6elc&sXlQ?u-c7lxz{;VAGk>?sE;Ag zS@WS~8=0L!@{BwcVrUm|8a71$+-3#P?tD&7&ZmIJbKd)oG=6K3kS@MCN;`Gf_~7^T zLvam&bL?0er85BLEXMOh_EQYC|8uL98$jOykpD%3^Q%^^Y8X7|yiBACaV+$E4Z0Ts zqSUp(i{RZ6sOdxYvdkv#6WZ~JxVShyI}H`dMgF!3&3ejn>Ib6?-)iM zMlFvfejq2!-NJP*q<6l((-YCWdGkz+4|gNgH_kr6YM!g}t~rPYwUtmqY{g4MeFE)PnTh;rcAnYeO<4 z0NLOgG};<8Xiy+K_S5Pc<9Y4cwVmy^<0Z#)PPI|nUF5mrJ%7Ub_3M+g(Lt@HGKA7W zhtV$q=(fT(N@pRXqC3E(Jc!d^Ib;svl(#lsCE-Ixhp!onetQ{wO~UW*Xr{hGFc9Lr zUNpCPQP?r#V5STPS-W=a%Je%2KNAqJbfPRdgH&44U}yyWgVJ6x8%@udTxQ_a&Oxl=mS8!Es=&nFljp-rD@Q!gW6c)S|e}M4(9vNnoAqp7(R}pFVIwA zhsp^4tUz3t z2LCyLP#m#$_NwZC2#lE-B)G_eE&sC$rw|Gb&`e|kvb0H(6JT!4T4EB4GXJ6Sq@%ir z0t?`jD3Fe~-y9>fw8H|`j$Z2ZXd5l`_N2Xwq&;7T>GEI26^xEiUDEO-9p~prhYcFe z$c*ZYwAck&+0l)UG}>Sya@i8P&th~IAcxf)!=ZBm6;e}u9`~;K=1#u7ge5eC9g7&K zDEd2r6{K?!&kN+^?uPs|X>kry>T7^}zq|KC@f;KHG1(Gu@tP)dFw47=nn*b-GqluZ zIODq7NSw4zIZr+BYcav?En2j=3NVebl1?&`*q(b${Cnl~4O$_d36P7IE?sJH(L`2w zloe-CAG257gaWH7J^DHXF9A>|2(C^jQ=pdge9g6HlpK|_II6U8usiQ*(mxWZyM~uE zotBSLA`^hN0CIDl75A;;^q@%kqJeME5pG~vQRq!qB~fpWFB1Se7>(peJ#Ge=2bc=%g>0s@%Y8%X-ZZ@zNXOC30 zF=isd5>|32cY}DrF$fh{#KR%xeW zT5`HaH}ou%3I7m|^Q`|wM=eD_F(v7h*EdM8I(to#Vq<~5)tCmrhWVK=OJmARkXFwy z$!dfKiyi>ZU@1>JAh)FKUP&PQ(iWey1WT=|q7hpC7qZxQQ~+n$8Cfk@47FOi0HZy$ zmtc*mh9r6gFpRUoz_V-*4cdPl`O7b8Y)u-fiy3Nz_txX0?|OCrgcG=>z)h(1D!nq9*6Qqi&oh!OR*?J(5q zvI^1axHX0__U1AMi&i2#2-OZ6@s5{VLzdgBOtCI;1>R+YRuaP`{ikB7mB8hD<5GE| z*0Y(3+QAlEnN2O_>{~~*^jI4RHb*gwbbytW+RKxeoSfW{aHpjx{x317z(LD;WsBA# z!88`;W!pOv#ga?ym6S;O)v3P!zNpF1c$>dq>Dqun_H!8dyC z1b}`*XxuQJR*UJhL@J59B#M1b{;DwbKmGJm?U1nAJ|`WkBn#!Y&V}zt@OlWn35l>| zJKVBm%U#%&(;$32G$sL-$89GCJA6kE^;=B3wj)Q5oV5?NTpwBCTGp#J@JAAyE^IYS%ExTC zmHj`z5YchMgbB6yLt|t6r4=Z4rGY6zt(BG!h+}u6Wyi9<6c9nJfuMHc+f)1%z&cI` z{_ik>jaes&G-^4fI8BU)T^Zy6+UU=AvOlN&H8#FG+cHG^eIytS6n#kLd^QjvP6%YM?XsG(GZ2${tbzdKX)HI2AyGf*aMEW69lqqDL)Yk}_D3y_ zr2isDOHh8~dXq2d`SJ}X4<(W3pYbO#!mM$qXQgEjwfJ%O#b8e>&WhMdNS_H2YgT);|Z1Jp{;c`=WMLU%Lz4q7~r zMJ4?JLyBpK*#PSG;8hMy_z^-Xv$M0aR{&rR2s_Wq&q3hLyflECFahtIJ+BZ$+}(1R z%7+|<)Q!q@D@=-kVLH9_b-p_U@%tfOZJMbam(pm4PFb|-(4-_mpRp>0_s??u23E7# zrF|R7XN-OIr)5JRN2lM;2VkdqRz3v)2F$$MZ@+y@&6+i3OlX4WUrG43UJSPD(W6He zGc->CYBrVZCh|)JWU1&nNN=5B=kH7UYEA^MLfioW|Agyjd`ZjKZ>acx0o*@9$4bCm zTzEFH0Km#5IXO8O%hqg|JBN?&2lPc|NwNKe+Y#8EcaZm0kfRf5)iczLkW=k&ZwV)G zp-V%{t$_O>;J(XWvTK#9DQ?uLQQCHMBVPP@ys-3&h+tp(eMIKnD`~i|a?>>(FxmOzuR37;P`-Ql=LNuBa>)U_D^Pf>h2V5|MtNfcY|6 z@nIKw4j{crwEK4=d^-MlDu2dNqSefpaVU;t&i>D1)!`0|5EU7h>hEQfN$4F65SHug z6i5H>H4g2nt*{Fio^_)6oSKr7GM~TJ(K6s-U5OH`x7kRXOXp@Dehs&&BsQejRKk&_ zae$`tZwOm&F!>%eJ!i;}AvvXGUMj$Rm`_hOgHF~ohE4hlnc zXeIRj5DvVQr77%8-~ixiX6+t$A1w@!-c7>9ldMbZMHl{<|5eKG(xpo#@uyJLR|9h6 z?%lhuwofh>em#62APz8@&;?#kSMx|S`7l7gf%KL*EGnF>#{la?{-`RaSFc{O6E|Y` z)E9M;)TvXa^i``?8ULYBIPvhke;mNpTn|Z2gV#Ob_3KFPGh-76LC_)zU}zkdDpqc*lfKredOeY$n)R)O|7 z-SJL1^qm8&kem!p?}xV<=MF*csL3gwfE{?)~YYO@4oxo8Z$~OlV1QUVbt|`deZur z?lq{DZgd9vv$m>1$BrGprFX3@F=6M115DgE;;;K;db}H8wS@RCgyww=OhqQ}-6U1y zvEKkIMS#q$SFhd=5UByU=8v_6v-QOnU%YeW%9TGB$u%6|O~hMxxk%`NoXy5y_;G&1%HM`?O!mgdYH9c zrmgrdK#@gmuuipvFAvjSxf)*qo=gDfR~UU9f=?dVm%S-UumCn_0OVL|=%o<;2&$+J zAaCdTc~)t@;0=+#mv@oc`zXsW0B(xZZUERP0Qj>RGiC&BBYIE)7BGVc500)?t5$Og zBFoo}0DXqSt-#+x!G4eb#9gF54jVQsg(1(gRPI#3jfEGlay^~JaywZyQ|gM0B8hn! z5p;k>4_25+3R4~P+W-nSo=!Yq=_VVl_oW?&^zv8Po&XK-VLLEld zs8J(r2pdK@+fqIq$o4cEY#vLXGAXBD#tU!CX)3@D!cg0l5)u;nN}B0tbcGSwFku~j zA=@whi7S)SkL=5hV(c$qM*wUq$`?zSw&EvIfwjaY8y*B*Y8`x57!rV$F@@FciC7rX zotiy?sIGWP^g-_Da=mc+^y#|@E$@a79ompn^X`YxE2yw_0k$G#*hyJtP{#MQ#yr?< zZAnZD8Nd#LG-1K`xgw0{0b?E^UO?x-C`t7anDh?q^?O#^Is>Q)NaZEasiidSpt(9; z2as(be36R#F8z+R{M9fYXeVxfI`hEly?(p|(~0plugEtA~|fL;pVAF#>l zi#c=VgrxV)?hfq-z6QGbK$n`BSO6{$ZTkPDh0v$d__lKp>bXz@>)@+p0Co_B>Q;|C z8f#chnAnjag(O6$+v#{9Np=p5+(4){dl}EyBHceYz7J%Go%lj}{JqG(6|}Tdhlwzn zd;OV-HpZ*cEh7Fc7Nnnv@e(}`Tq_1E+hwsGK!BsULw zRJkng3Y60F)VdG|!)+YbXV8y&RByZmaoXCEg4Cv-J3^1 literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/Contents.json new file mode 100644 index 0000000..9bdb43c --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_youtube_circle.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/ic_youtube_circle.png b/SodaLive/Resources/Assets.xcassets/ic_youtube_circle.imageset/ic_youtube_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..80b476411183a1cd0f0b4f053304c4c94cbf6108 GIT binary patch literal 6485 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 literal 0 HcmV?d00001 diff --git a/SodaLive/Sources/App/AppStep.swift b/SodaLive/Sources/App/AppStep.swift index c21729c..ec23b2f 100644 --- a/SodaLive/Sources/App/AppStep.swift +++ b/SodaLive/Sources/App/AppStep.swift @@ -21,4 +21,6 @@ enum AppStep { case writeTextMessage(userId: Int?, nickname: String?) case writeVoiceMessage(userId: Int?, nickname: String?, onRefresh: () -> Void) + + case settings } diff --git a/SodaLive/Sources/ContentView.swift b/SodaLive/Sources/ContentView.swift index 21e2248..328f3f3 100644 --- a/SodaLive/Sources/ContentView.swift +++ b/SodaLive/Sources/ContentView.swift @@ -35,6 +35,10 @@ struct ContentView: View { case .writeVoiceMessage(let userId, let nickname, let onRefresh): VoiceMessageWriteView(replySenderId: userId, replySenderNickname: nickname, onRefresh: onRefresh) + case .settings: + EmptyView() + .frame(width: 0, height: 0, alignment: .topLeading) + default: EmptyView() .frame(width: 0, height: 0, alignment: .topLeading) diff --git a/SodaLive/Sources/MyPage/Auth/AuthApi.swift b/SodaLive/Sources/MyPage/Auth/AuthApi.swift new file mode 100644 index 0000000..a589b2a --- /dev/null +++ b/SodaLive/Sources/MyPage/Auth/AuthApi.swift @@ -0,0 +1,44 @@ +// +// AuthApi.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation +import Moya + +enum AuthApi { + case auth(request: AuthVerifyRequest) +} + +extension AuthApi: TargetType { + var baseURL: URL { + return URL(string: BASE_URL)! + } + + var path: String { + switch self { + case .auth: + return "/auth" + } + } + + var method: Moya.Method { + return .post + } + + var task: Task { + switch self { + case .auth(let request): + return .requestJSONEncodable(request) + } + } + + var headers: [String : String]? { + switch self { + default: + return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"] + } + } +} diff --git a/SodaLive/Sources/MyPage/Auth/AuthButtonView.swift b/SodaLive/Sources/MyPage/Auth/AuthButtonView.swift new file mode 100644 index 0000000..8ad1b66 --- /dev/null +++ b/SodaLive/Sources/MyPage/Auth/AuthButtonView.swift @@ -0,0 +1,27 @@ +// +// AuthButtonView.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import SwiftUI + +struct AuthButtonView: View { + var body: some View { + Text("본인인증") + .font(.custom(Font.bold.rawValue, size: 15.3)) + .foregroundColor(Color(hex: "eeeeee")) + .padding(.horizontal, 13.3) + .padding(.vertical, 20) + .frame(width: screenSize().width - 26.7, alignment: .leading) + .background(Color(hex: "664aab")) + .cornerRadius(6.7) + } +} + +struct AuthButtonView_Previews: PreviewProvider { + static var previews: some View { + AuthButtonView() + } +} diff --git a/SodaLive/Sources/MyPage/Auth/AuthRepository.swift b/SodaLive/Sources/MyPage/Auth/AuthRepository.swift new file mode 100644 index 0000000..668fab3 --- /dev/null +++ b/SodaLive/Sources/MyPage/Auth/AuthRepository.swift @@ -0,0 +1,20 @@ +// +// AuthRepository.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation +import CombineMoya +import Combine +import Moya + +final class AuthRepository { + private let api = MoyaProvider() + + func authCertificate(receiptId: String) -> AnyPublisher { + return api.requestPublisher(.auth(request: AuthVerifyRequest(receiptId: receiptId))) + } +} + diff --git a/SodaLive/Sources/MyPage/Auth/AuthVerifyRequest.swift b/SodaLive/Sources/MyPage/Auth/AuthVerifyRequest.swift new file mode 100644 index 0000000..3e4004a --- /dev/null +++ b/SodaLive/Sources/MyPage/Auth/AuthVerifyRequest.swift @@ -0,0 +1,16 @@ +// +// AuthVerifyRequest.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct AuthVerifyRequest: Encodable { + let receiptId: String + + enum CodingKeys : String, CodingKey { + case receiptId = "receipt_id" + } +} diff --git a/SodaLive/Sources/MyPage/CanCardView.swift b/SodaLive/Sources/MyPage/CanCardView.swift new file mode 100644 index 0000000..07235ba --- /dev/null +++ b/SodaLive/Sources/MyPage/CanCardView.swift @@ -0,0 +1,77 @@ +// +// CanCardView.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import SwiftUI + +struct CanCardView: View { + let data: MyPageResponse + let refresh: () -> Void + + var body: some View { + HStack(spacing: 0) { + Button(action: {}) { + HStack(spacing: 6.7) { + Text("\(data.chargeCan + data.rewardCan)") + .font(.custom(Font.bold.rawValue, size: 18.3)) + .foregroundColor(Color(hex: "eeeeee")) + + Image("ic_can") + + Image("ic_forward") + .resizable() + .frame(width: 20, height: 20) + } + } + + Spacer() + + Button(action: {}) { + HStack(spacing: 7) { + Image("ic_coin_w") + .resizable() + .frame(width: 26.7, height: 26.7) + + Text("충전") + .font(.custom(Font.bold.rawValue, size: 12)) + .foregroundColor(Color(hex: "fdca2f")) + } + .padding(.horizontal, 11.3) + .padding(.vertical, 7) + .overlay( + RoundedRectangle(cornerRadius: CGFloat(16.7)) + .stroke(lineWidth: 1) + .foregroundColor(Color(hex: "fdca2f")) + ) + .cornerRadius(16.7) + } + } + .padding(.horizontal, 13.3) + .padding(.vertical, 16.7) + .background(Color(hex: "222222")) + .cornerRadius(16.7) + } +} + +struct CanCardView_Previews: PreviewProvider { + static var previews: some View { + CanCardView( + data: MyPageResponse( + nickname: "완다 막시모프", + profileUrl: "https://test-cf.sodalive.net/profile/default-profile.png", + chargeCan: 0, + rewardCan: 150, + youtubeUrl: "", + instagramUrl: "", + websiteUrl: "", + blogUrl: "", + liveReservationCount: 0, + isAuth: false + ), + refresh: {} + ) + } +} diff --git a/SodaLive/Sources/MyPage/MyInfoCardView.swift b/SodaLive/Sources/MyPage/MyInfoCardView.swift new file mode 100644 index 0000000..0bdfbfe --- /dev/null +++ b/SodaLive/Sources/MyPage/MyInfoCardView.swift @@ -0,0 +1,95 @@ +// +// MyInfoCardView.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import SwiftUI +import Kingfisher + +struct MyInfoCardView: View { + + let data: MyPageResponse + let refresh: () -> Void + + var body: some View { + HStack(spacing: 13.3) { + KFImage(URL(string: data.profileUrl)) + .resizable() + .scaledToFill() + .frame(width: 90, height: 90, alignment: .top) + .clipShape(Circle()) + + VStack(alignment: .leading, spacing: 13.3) { + HStack(spacing: 0) { + Text(data.nickname) + .font(.custom(Font.bold.rawValue, size: 20)) + .foregroundColor(Color(hex: "eeeeee")) + + Spacer() + + Button(action: { + if AppState.shared.roomId <= 0 { + } + }) { + Image("ic_myinfo_edit") + .resizable() + .frame(width: 20, height: 20) + } + } + + HStack(spacing: 10) { + Spacer() + + if let websiteUrl = data.websiteUrl, websiteUrl.count > 0, let url = URL(string: websiteUrl), UIApplication.shared.canOpenURL(url) { + Button(action: {UIApplication.shared.open(url)}) { + Image("ic_website_circle") + } + } + + if let blogUrl = data.blogUrl, blogUrl.count > 0, let url = URL(string: blogUrl), UIApplication.shared.canOpenURL(url) { + Button(action: {UIApplication.shared.open(url)}) { + Image("ic_blog_circle") + } + } + + if let instagramUrl = data.instagramUrl, instagramUrl.count > 0, let url = URL(string: instagramUrl), UIApplication.shared.canOpenURL(url) { + Button(action: {UIApplication.shared.open(url)}) { + Image("ic_instagram_circle") + } + } + + if let youtubeUrl = data.youtubeUrl, youtubeUrl.count > 0, let url = URL(string: youtubeUrl), UIApplication.shared.canOpenURL(url) { + Button(action: {UIApplication.shared.open(url)}) { + Image("ic_youtube_circle") + } + } + } + } + } + .padding(20) + .background(Color(hex: "222222")) + .cornerRadius(16.7) + } +} + +struct MyInfoCardView_Previews: PreviewProvider { + static var previews: some View { + MyInfoCardView( + data: MyPageResponse( + nickname: "완다 막시모프", + profileUrl: "https://test-cf.sodalive.net/profile/default-profile.png", + chargeCan: 0, + rewardCan: 150, + youtubeUrl: "", + instagramUrl: "", + websiteUrl: "", + blogUrl: "", + liveReservationCount: 0, + isAuth: false + ), + refresh: {} + ) + } +} diff --git a/SodaLive/Sources/MyPage/MyPageResponse.swift b/SodaLive/Sources/MyPage/MyPageResponse.swift new file mode 100644 index 0000000..1635cf1 --- /dev/null +++ b/SodaLive/Sources/MyPage/MyPageResponse.swift @@ -0,0 +1,22 @@ +// +// MyPageResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct MyPageResponse: Decodable { + let nickname: String + let profileUrl: String + let chargeCan: Int + let rewardCan: Int + let youtubeUrl: String? + let instagramUrl: String? + let websiteUrl: String? + let blogUrl: String? + let liveReservationCount: Int + let isAuth: Bool +} + diff --git a/SodaLive/Sources/MyPage/MyPageView.swift b/SodaLive/Sources/MyPage/MyPageView.swift index be2a68d..ff5ce0d 100644 --- a/SodaLive/Sources/MyPage/MyPageView.swift +++ b/SodaLive/Sources/MyPage/MyPageView.swift @@ -7,9 +7,138 @@ import SwiftUI +import Bootpay +import BootpayUI +import PopupView +import RefreshableScrollView + struct MyPageView: View { + + @StateObject var viewModel = MyPageViewModel() + + @State private var payload = Payload() + var body: some View { - Text("MyPage") + BaseView(isLoading: $viewModel.isLoading) { + if viewModel.isShowAuthView { + BootpayUI(payload: payload, requestType: BootpayRequest.TYPE_AUTHENTICATION) + .onConfirm { + DEBUG_LOG("onConfirm: \($0)") + return true + } + .onCancel { + DEBUG_LOG("onCancel: \($0)") + } + .onError { + DEBUG_LOG("onError: \($0)") + viewModel.errorMessage = "본인인증 중 오류가 발생했습니다." + viewModel.isShowPopup = true + viewModel.isShowAuthView = false + } + .onDone { + DEBUG_LOG("onDone: \($0)") + viewModel.authVerify($0) + } + .onClose { + DEBUG_LOG("onClose") + viewModel.isShowAuthView = false + } + } else { + GeometryReader { geo in + VStack { + HomeNavigationBar(title: "마이 페이지") { + Image("ic_settings") + .resizable() + .frame(width: 20, height: 20) + .onTapGesture { + AppState.shared.setAppStep(step: .settings) + } + } + RefreshableScrollView( + refreshing: $viewModel.isLoading, + action: { + viewModel.getMypage() + } + ) { + VStack(spacing: 0) { + if let data = viewModel.myPageResponse { + MyInfoCardView(data: data) { + viewModel.getMypage() + } + .frame(width: screenSize().width - 26.7) + .padding(.top, 13.3) + + if UserDefaults.string(forKey: .role) == MemberRole.CREATOR.rawValue { + Text("내 채널 보기") + .frame(width: screenSize().width - 26.7, height: 46.7) + .font(.custom(Font.bold.rawValue, size: 15.3)) + .foregroundColor(Color(hex: "eeeeee")) + .background(Color(hex: "352953")) + .cornerRadius(6.7) + .overlay( + RoundedRectangle(cornerRadius: 6.7) + .stroke(Color(hex: "9970ff"), lineWidth: 1.3) + ) + .padding(.top, 26.7) + .onTapGesture {} + } + + CanCardView(data: data) { + viewModel.getMypage() + } + .frame(width: screenSize().width - 26.7) + .padding(.top, 26.7) + + ReservationStatusView(data: data) + .padding(.top, 33.3) + + ServiceCenterButtonView() + .padding(.top, 40) + .padding(.bottom, data.isAuth ? 40 : 0) + + if !data.isAuth { + AuthButtonView() + .padding(.vertical, 40) + .onTapGesture { + viewModel.isShowAuthView = true + } + } + } + } + } + } + .frame(width: geo.size.width, height: geo.size.height) + } + .onAppear { + viewModel.getMypage() + } + } + } + .popup(isPresented: $viewModel.isShowPopup, type: .toast, position: .top, autohideIn: 2) { + GeometryReader { geo in + HStack { + Spacer() + Text(viewModel.errorMessage) + .padding(.vertical, 13.3) + .frame(width: geo.size.width - 66.7, alignment: .center) + .font(.custom(Font.medium.rawValue, size: 12)) + .background(Color(hex: "9970ff")) + .foregroundColor(Color.white) + .multilineTextAlignment(.center) + .cornerRadius(20) + .padding(.top, 66.7) + Spacer() + } + } + } + .onAppear { + payload.applicationId = BOOTPAY_APP_ID + payload.price = 0 + payload.pg = "다날" + payload.method = "본인인증" + payload.orderName = "본인인증" + payload.authenticationId = "\(UserDefaults.string(forKey: .nickname))__\(String(NSTimeIntervalSince1970))" + } } } diff --git a/SodaLive/Sources/MyPage/MyPageViewModel.swift b/SodaLive/Sources/MyPage/MyPageViewModel.swift new file mode 100644 index 0000000..ca990ef --- /dev/null +++ b/SodaLive/Sources/MyPage/MyPageViewModel.swift @@ -0,0 +1,110 @@ +// +// MyPageViewModel.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation +import Combine + +final class MyPageViewModel: ObservableObject { + + private let repository = UserRepository() + private let authRepository = AuthRepository() + private var subscription = Set() + + @Published var myPageResponse: MyPageResponse? = nil + + @Published var errorMessage = "" + @Published var isShowPopup = false + @Published var isLoading = false + @Published var isShowAuthView = false + + func getMypage() { + isLoading = true + + repository.getMypage() + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponse.self, from: responseData) + + if let data = decoded.data, decoded.success { + self.myPageResponse = data + } else { + if let message = decoded.message { + self.errorMessage = message + } else { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + } + + self.isShowPopup = true + } + } catch { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowPopup = true + } + } + .store(in: &subscription) + } + + func authVerify(_ data: [String: Any]) { + isLoading = true + + let _data = data["data"] as? [String: Any] + + if let data = _data { + let receiptId = data["receipt_id"] as! String + + authRepository.authCertificate(receiptId: receiptId) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { [unowned self] response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData) + + if decoded.success { + self.errorMessage = "본인인증이 완료되었습니다." + self.isShowPopup = true + self.getMypage() + } else { + if let message = decoded.message { + self.errorMessage = message + } else { + self.errorMessage = "본인인증 중 오류가 발생했습니다.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + } + self.isShowPopup = true + } + } catch { + self.errorMessage = "본인인증 중 오류가 발생했습니다.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowPopup = true + } + } + .store(in: &subscription) + } else { + isLoading = false + errorMessage = "본인인증 중 오류가 발생했습니다." + isShowPopup = true + } + } +} diff --git a/SodaLive/Sources/MyPage/ReservationStatusView.swift b/SodaLive/Sources/MyPage/ReservationStatusView.swift new file mode 100644 index 0000000..96a95e1 --- /dev/null +++ b/SodaLive/Sources/MyPage/ReservationStatusView.swift @@ -0,0 +1,67 @@ +// +// ReservationStatusView.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import SwiftUI + +struct ReservationStatusView: View { + let data: MyPageResponse + + var body: some View { + VStack(alignment: .leading, spacing: 13.3) { + Text("예약현황") + .font(.custom(Font.bold.rawValue, size: 18.3)) + .foregroundColor(Color(hex: "eeeeee")) + + HStack(spacing: 0) { + let width = screenSize().width - 26.7 + + HStack(spacing: 6.7) { + Image("ic_tabbar_live_selected") + .resizable() + .frame(width: 20, height: 20) + + Text("라이브") + .font(.custom(Font.medium.rawValue, size: 14.7)) + .foregroundColor(Color(hex: "eeeeee")) + + Text("\(data.liveReservationCount)") + .font(.custom(Font.medium.rawValue, size: 14.7)) + .foregroundColor(Color(hex: "9970ff")) + } + .frame(width: width, height: 46.7) + .background(Color(hex: "352953")) + .cornerRadius(6.7) + .overlay( + RoundedRectangle(cornerRadius: 6.7) + .stroke(Color(hex: "9970ff"), lineWidth: 1.3) + ) + .onTapGesture { + } + } + } + .frame(width: screenSize().width - 26.7, alignment: .leading) + } +} + +struct ReservationStatusView_Previews: PreviewProvider { + static var previews: some View { + ReservationStatusView( + data: MyPageResponse( + nickname: "완다 막시모프", + profileUrl: "https://test-cf.sodalive.net/profile/default-profile.png", + chargeCan: 0, + rewardCan: 150, + youtubeUrl: "", + instagramUrl: "", + websiteUrl: "", + blogUrl: "", + liveReservationCount: 0, + isAuth: false + ) + ) + } +} diff --git a/SodaLive/Sources/MyPage/ServiceCenterButtonView.swift b/SodaLive/Sources/MyPage/ServiceCenterButtonView.swift new file mode 100644 index 0000000..77eb9b0 --- /dev/null +++ b/SodaLive/Sources/MyPage/ServiceCenterButtonView.swift @@ -0,0 +1,40 @@ +// +// ServiceCenterButtonView.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import SwiftUI + +struct ServiceCenterButtonView: View { + var body: some View { + HStack(spacing: 13.7) { + Image("ic_headphones") + .resizable() + .frame(width: 26.7, height: 26.7) + + Text("소다라이브 고객센터") + .font(.custom(Font.bold.rawValue, size: 15.3)) + .foregroundColor(.white) + + Spacer() + + Image("ic_forward") + .resizable() + .frame(width: 20, height: 20) + } + .padding(.horizontal, 13.3) + .frame(width: screenSize().width - 26.7, height: 66.7) + .background(Color(hex: "664aab")) + .cornerRadius(6.7) + .onTapGesture { + } + } +} + +struct ServiceCenterButtonView_Previews: PreviewProvider { + static var previews: some View { + ServiceCenterButtonView() + } +} diff --git a/SodaLive/Sources/Settings/Notification/GetMemberInfoResponse.swift b/SodaLive/Sources/Settings/Notification/GetMemberInfoResponse.swift new file mode 100644 index 0000000..c7be304 --- /dev/null +++ b/SodaLive/Sources/Settings/Notification/GetMemberInfoResponse.swift @@ -0,0 +1,21 @@ +// +// GetMemberInfoResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +enum MemberRole: String, Decodable { + case USER, CREATOR, AGENT, ADMIN, BOT +} + +struct GetMemberInfoResponse: Decodable { + let can: Int + let isAuth: Bool + let role: MemberRole + let messageNotice: Bool? + let followingChannelLiveNotice: Bool? + let followingChannelUploadContentNotice: Bool? +} diff --git a/SodaLive/Sources/User/UserApi.swift b/SodaLive/Sources/User/UserApi.swift index afa3eed..8f82bfb 100644 --- a/SodaLive/Sources/User/UserApi.swift +++ b/SodaLive/Sources/User/UserApi.swift @@ -13,6 +13,7 @@ enum UserApi { case signUp(parameters: [MultipartFormData]) case findPassword(request: ForgotPasswordRequest) case searchUser(nickname: String) + case getMypage } extension UserApi: TargetType { @@ -33,6 +34,9 @@ extension UserApi: TargetType { case .searchUser: return "/member/search" + + case .getMypage: + return "/member/mypage" } } @@ -41,7 +45,7 @@ extension UserApi: TargetType { case .login, .signUp, .findPassword: return .post - case .searchUser: + case .searchUser, .getMypage: return .get } } @@ -59,6 +63,9 @@ extension UserApi: TargetType { case .searchUser(let nickname): return .requestParameters(parameters: ["nickname" : nickname], encoding: URLEncoding.queryString) + + case .getMypage: + return .requestParameters(parameters: ["container" : "ios"], encoding: URLEncoding.queryString) } } diff --git a/SodaLive/Sources/User/UserRepository.swift b/SodaLive/Sources/User/UserRepository.swift index 729d40a..ce3633c 100644 --- a/SodaLive/Sources/User/UserRepository.swift +++ b/SodaLive/Sources/User/UserRepository.swift @@ -28,4 +28,8 @@ final class UserRepository { func searchUser(nickname: String) -> AnyPublisher { return api.requestPublisher(.searchUser(nickname: nickname)) } + + func getMypage() -> AnyPublisher { + return api.requestPublisher(.getMypage) + } }