- Added api for username check

- Added checks and error for the name, username and password
- On gender select adding values to the post reg struct.
- Handled the interest selection into a array to post to the reg struct
- Finalised the Age Select vc with gender select, date select, interest select
- Added Avatar API
This commit is contained in:
2024-05-08 19:36:20 +05:30
parent 3c69db0032
commit d6624b8de7
18 changed files with 714 additions and 73 deletions

View File

@@ -15,6 +15,8 @@ target 'WOKA' do
pod 'CollectionViewCenteredFlowLayout'
pod 'SDWebImage'
# Bottom line is for removing IPHONEOS_DEPLOYMENT_TARGET
post_install do |installer|
installer.generated_projects.each do |project|

View File

@@ -29,7 +29,6 @@
525954192BE8CC3400191286 /* ConstantString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954182BE8CC3400191286 /* ConstantString.swift */; };
5259541B2BE8D6F900191286 /* NetworkReachibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5259541A2BE8D6F900191286 /* NetworkReachibility.swift */; };
5259541D2BE8D94400191286 /* QueueHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5259541C2BE8D94400191286 /* QueueHelper.swift */; };
5259541F2BE8E93500191286 /* Config.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 5259541E2BE8E93500191286 /* Config.xcconfig */; };
525954212BE8EB7900191286 /* APIEndPoints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954202BE8EB7900191286 /* APIEndPoints.swift */; };
525954232BE8F00400191286 /* BaseResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954222BE8F00400191286 /* BaseResponseModel.swift */; };
525954252BE8F01600191286 /* ValueWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954242BE8F01600191286 /* ValueWrapper.swift */; };
@@ -40,6 +39,16 @@
525954302BEA394400191286 /* CustomAlerts.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5259542F2BEA394300191286 /* CustomAlerts.storyboard */; };
525954322BEA39D200191286 /* AddTapGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954312BEA39D200191286 /* AddTapGesture.swift */; };
525954342BEA620800191286 /* IntrestTopicDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954332BEA620800191286 /* IntrestTopicDM.swift */; };
525954352BEB4B3B00191286 /* Exo2-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8312BDBC3EF00E4CA14 /* Exo2-Thin.ttf */; };
525954362BEB4B3B00191286 /* Exo2-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E82F2BDBC3EF00E4CA14 /* Exo2-Medium.ttf */; };
525954372BEB4B3B00191286 /* Exo2-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E82E2BDBC3EF00E4CA14 /* Exo2-Bold.ttf */; };
525954382BEB4B3B00191286 /* Exo2-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8332BDBC3EF00E4CA14 /* Exo2-Regular.ttf */; };
525954392BEB4B3B00191286 /* Exo2-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8322BDBC3EF00E4CA14 /* Exo2-ExtraBold.ttf */; };
5259543A2BEB4B3B00191286 /* Exo2-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8302BDBC3EF00E4CA14 /* Exo2-SemiBold.ttf */; };
525954512BEB5EB700191286 /* SkeletonView in Frameworks */ = {isa = PBXBuildFile; productRef = 525954502BEB5EB700191286 /* SkeletonView */; };
5259545A2BEB67D200191286 /* DateFormatterLib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525954592BEB67D200191286 /* DateFormatterLib.swift */; };
5259545C2BEBB80400191286 /* AvatarDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5259545B2BEBB80400191286 /* AvatarDM.swift */; };
5259545E2BEBBA1A00191286 /* LoadingIndicatorImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5259545D2BEBBA1A00191286 /* LoadingIndicatorImageView.swift */; };
52663FF52BDFAB830001D8CE /* TextFieldErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52663FF42BDFAB830001D8CE /* TextFieldErrorView.swift */; };
52663FF72BDFACF60001D8CE /* ShadowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52663FF62BDFACF60001D8CE /* ShadowView.swift */; };
52663FF92BDFAF110001D8CE /* EmailVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52663FF82BDFAF110001D8CE /* EmailVM.swift */; };
@@ -85,12 +94,6 @@
9C27E16F2BDB866500EC1DA9 /* CellIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E16E2BDB866500EC1DA9 /* CellIdentifier.swift */; };
9C27E1722BDB86B600EC1DA9 /* OnBoardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E1702BDB86B600EC1DA9 /* OnBoardCell.swift */; };
9C27E1732BDB86B600EC1DA9 /* OnBoardCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9C27E1712BDB86B600EC1DA9 /* OnBoardCell.xib */; };
9C56E8342BDBC3F000E4CA14 /* Exo2-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E82E2BDBC3EF00E4CA14 /* Exo2-Bold.ttf */; };
9C56E8352BDBC3F000E4CA14 /* Exo2-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E82F2BDBC3EF00E4CA14 /* Exo2-Medium.ttf */; };
9C56E8362BDBC3F000E4CA14 /* Exo2-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8302BDBC3EF00E4CA14 /* Exo2-SemiBold.ttf */; };
9C56E8372BDBC3F000E4CA14 /* Exo2-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8312BDBC3EF00E4CA14 /* Exo2-Thin.ttf */; };
9C56E8382BDBC3F000E4CA14 /* Exo2-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8322BDBC3EF00E4CA14 /* Exo2-ExtraBold.ttf */; };
9C56E8392BDBC3F000E4CA14 /* Exo2-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E8332BDBC3EF00E4CA14 /* Exo2-Regular.ttf */; };
9C56E83B2BDBC6E600E4CA14 /* SelectAgeVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C56E83A2BDBC6E600E4CA14 /* SelectAgeVM.swift */; };
9C56E8462BDBEE6400E4CA14 /* EmailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C56E8452BDBEE6400E4CA14 /* EmailVC.swift */; };
9C56E8482BDBEFAB00E4CA14 /* AssetColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C56E8472BDBEFAB00E4CA14 /* AssetColor.swift */; };
@@ -163,6 +166,9 @@
5259542F2BEA394300191286 /* CustomAlerts.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CustomAlerts.storyboard; sourceTree = "<group>"; };
525954312BEA39D200191286 /* AddTapGesture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddTapGesture.swift; sourceTree = "<group>"; };
525954332BEA620800191286 /* IntrestTopicDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntrestTopicDM.swift; sourceTree = "<group>"; };
525954592BEB67D200191286 /* DateFormatterLib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFormatterLib.swift; sourceTree = "<group>"; };
5259545B2BEBB80400191286 /* AvatarDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarDM.swift; sourceTree = "<group>"; };
5259545D2BEBBA1A00191286 /* LoadingIndicatorImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingIndicatorImageView.swift; sourceTree = "<group>"; };
52663FF42BDFAB830001D8CE /* TextFieldErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldErrorView.swift; sourceTree = "<group>"; };
52663FF62BDFACF60001D8CE /* ShadowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowView.swift; sourceTree = "<group>"; };
52663FF82BDFAF110001D8CE /* EmailVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailVM.swift; sourceTree = "<group>"; };
@@ -241,6 +247,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
525954512BEB5EB700191286 /* SkeletonView in Frameworks */,
619A5A1BD8BD968ADC83C106 /* Pods_WOKA.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -486,6 +493,8 @@
52D774F02BDFC53B001D87DE /* StringSubScript.swift */,
52C6E01D2BE3847F00E22D59 /* BorderView.swift */,
525954312BEA39D200191286 /* AddTapGesture.swift */,
525954592BEB67D200191286 /* DateFormatterLib.swift */,
5259545D2BEBBA1A00191286 /* LoadingIndicatorImageView.swift */,
);
path = Helpers;
sourceTree = "<group>";
@@ -575,6 +584,7 @@
525954282BEA079500191286 /* UserEmailVerifyDM.swift */,
5259542A2BEA292800191286 /* UserRegPostModel.swift */,
525954332BEA620800191286 /* IntrestTopicDM.swift */,
5259545B2BEBB80400191286 /* AvatarDM.swift */,
);
path = Model;
sourceTree = "<group>";
@@ -655,6 +665,7 @@
);
name = WOKA;
packageProductDependencies = (
525954502BEB5EB700191286 /* SkeletonView */,
);
productName = WOKA;
productReference = 523ED25A2BDA2BC700CFED02 /* WOKA.app */;
@@ -730,6 +741,7 @@
);
mainGroup = 523ED2512BDA2BC700CFED02;
packageReferences = (
5259544F2BEB5EB700191286 /* XCRemoteSwiftPackageReference "SkeletonView" */,
);
productRefGroup = 523ED25B2BDA2BC700CFED02 /* Products */;
projectDirPath = "";
@@ -753,20 +765,19 @@
9CBCB2A82BE5105A007D7934 /* Home.storyboard in Resources */,
525954302BEA394400191286 /* CustomAlerts.storyboard in Resources */,
52C8B0632BDA6993003B51D0 /* Localizable.strings in Resources */,
9C56E8382BDBC3F000E4CA14 /* Exo2-ExtraBold.ttf in Resources */,
9C56E8372BDBC3F000E4CA14 /* Exo2-Thin.ttf in Resources */,
9C56E8352BDBC3F000E4CA14 /* Exo2-Medium.ttf in Resources */,
9C56E8342BDBC3F000E4CA14 /* Exo2-Bold.ttf in Resources */,
523ED2672BDA2BC900CFED02 /* Assets.xcassets in Resources */,
523ED26A2BDA2BC900CFED02 /* Base in Resources */,
52C8B05B2BDA5924003B51D0 /* WokaSplashSound.m4a in Resources */,
525954352BEB4B3B00191286 /* Exo2-Thin.ttf in Resources */,
525954362BEB4B3B00191286 /* Exo2-Medium.ttf in Resources */,
525954372BEB4B3B00191286 /* Exo2-Bold.ttf in Resources */,
525954382BEB4B3B00191286 /* Exo2-Regular.ttf in Resources */,
525954392BEB4B3B00191286 /* Exo2-ExtraBold.ttf in Resources */,
5259543A2BEB4B3B00191286 /* Exo2-SemiBold.ttf in Resources */,
523ED2652BDA2BC700CFED02 /* Base in Resources */,
52C6E01C2BE383C000E22D59 /* YourIntrestCell.xib in Resources */,
5259541F2BE8E93500191286 /* Config.xcconfig in Resources */,
9C56E8392BDBC3F000E4CA14 /* Exo2-Regular.ttf in Resources */,
52C6E0262BE3B46A00E22D59 /* SelectAvatarCell.xib in Resources */,
52C8B0712BDA7512003B51D0 /* PassingCloud.json in Resources */,
9C56E8362BDBC3F000E4CA14 /* Exo2-SemiBold.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -838,9 +849,11 @@
525954102BE8B72900191286 /* FontCustom.swift in Sources */,
5202AAFE2BDF90590043B7BD /* TextFieldImage.swift in Sources */,
52C6E0232BE3B3E300E22D59 /* SelectAvatarVC.swift in Sources */,
5259545C2BEBB80400191286 /* AvatarDM.swift in Sources */,
52C8B06C2BDA6E87003B51D0 /* LocalizedString.swift in Sources */,
525953D42BE8B2DF00191286 /* UIApplication.swift in Sources */,
52CC38C32BDF812F00B74C3E /* LocalisedElements.swift in Sources */,
5259545E2BEBBA1A00191286 /* LoadingIndicatorImageView.swift in Sources */,
52CA28FC2BE11A0400708B49 /* UserIntrestVM.swift in Sources */,
9C27E1602BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift in Sources */,
5259541D2BE8D94400191286 /* QueueHelper.swift in Sources */,
@@ -872,6 +885,7 @@
52CA28FA2BE119F500708B49 /* UserIntrestVC.swift in Sources */,
9C27E16B2BDB774D00EC1DA9 /* CarouselData.swift in Sources */,
525954212BE8EB7900191286 /* APIEndPoints.swift in Sources */,
5259545A2BEB67D200191286 /* DateFormatterLib.swift in Sources */,
523ED2602BDA2BC700CFED02 /* SceneDelegate.swift in Sources */,
9CBCB2AA2BE51A52007D7934 /* HomeVC.swift in Sources */,
52D774E92BDFBDA4001D87DE /* AuthenticationStringConstant.swift in Sources */,
@@ -1294,6 +1308,25 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
5259544F2BEB5EB700191286 /* XCRemoteSwiftPackageReference "SkeletonView" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Juanpe/SkeletonView.git";
requirement = {
kind = exactVersion;
version = 1.31.0;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
525954502BEB5EB700191286 /* SkeletonView */ = {
isa = XCSwiftPackageProductDependency;
package = 5259544F2BEB5EB700191286 /* XCRemoteSwiftPackageReference "SkeletonView" */;
productName = SkeletonView;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 523ED2522BDA2BC700CFED02 /* Project object */;
}

View File

@@ -404,7 +404,7 @@ Sent to Your Parents Email</string>
</constraints>
<color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" name="Exo2-Regular" family="Exo 2" pointSize="16"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" enablesReturnKeyAutomatically="YES" textContentType="name"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" enablesReturnKeyAutomatically="YES" textContentType="username"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="paddingLeftCustom">
<real key="value" value="25"/>
@@ -727,6 +727,7 @@ Sent to Your Parents Email</string>
<outlet property="collectionView" destination="s7g-G0-W2v" id="BEQ-be-g2O"/>
<outlet property="contentHeight" destination="auZ-NR-TCk" id="cCY-Sh-DxC"/>
<outlet property="datePicker" destination="QrL-xJ-2yI" id="KD6-A4-7fS"/>
<outlet property="fullName" destination="5fJ-Y1-sF5" id="Vgt-Nc-6Wc"/>
<outlet property="girlView" destination="6Ik-wa-umx" id="JOO-44-pWF"/>
<outlet property="nextBtn" destination="hAv-PV-elG" id="9sA-zr-2KJ"/>
<outlet property="scrollView" destination="tyX-OO-8o2" id="1Uh-2K-TFb"/>

View File

@@ -97,3 +97,21 @@ extension EmailVC : UITextFieldDelegate{
}
}
extension UITextField{
func hideError(){
if let rightView = self.rightView {
// Hide the right view
rightView.isHidden = true
// Check if the right view is hidden
if rightView.isHidden {
// If hidden, hide the associated error view
if let errorView = errorViews.object(forKey: self) {
errorView.isHidden = true
}
}
}
}
}

View File

@@ -39,12 +39,12 @@ class SelectAvatarVC: UIViewController {
extension SelectAvatarVC : UICollectionViewDelegate , UICollectionViewDataSource{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
return vm.avatarData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: K.CellIdentifier.Authentication.selectAvatarCell, for: indexPath) as! SelectAvatarCell
cell.setData()
cell.setData(data: vm.avatarData[indexPath.row])
return cell
}

View File

@@ -33,7 +33,7 @@ class UserDetailsRegisterVC : UIViewController{
}
// MARK: - Button Tap Handler
@IBAction func nextBtnTapped(_ sender: LocalisedElementsButton) {
guard let name = enterNameTF.text ,let userName = enterUserNameTF.text , let pass = enterPasswordTF.text else{return}
@@ -51,7 +51,7 @@ class UserDetailsRegisterVC : UIViewController{
*/
if userName.count < 3{
enterUserNameTF.rightView?.isHidden = false
enterUserNameTF.setError("Username is too short.", show: true)
enterUserNameTF.setError(K.ConstantString.shortUsername, show: true)
return
}
@@ -59,21 +59,35 @@ class UserDetailsRegisterVC : UIViewController{
Check for password
*/
if pass.count < 6{
enterPasswordTF.rightView?.isHidden = false
enterPasswordTF.setError("Name is too short.", show: true)
let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC
vcPush.contentLabel = K.ConstantString.shortPass
vcPush.mainTitleText = K.ConstantString.error
// vcPush.onDoneBlock = { isDone in }
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
self.present(vcPush, animated: true)
return
}
/*
Initializing our local data store for user Register
Check if the username exist or not
*/
AuthFunc.shareInstance.regData.full_name = name
AuthFunc.shareInstance.regData.username = userName
AuthFunc.shareInstance.regData.password = pass
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.userIntrestVC) as! UserIntrestVC
self.navigationController?.pushViewController(vc, animated: true)
vm.checkUsernameExist { isDone in
if isDone{
/*
Initializing our local data store for user Register
*/
AuthFunc.shareInstance.regData.full_name = name
AuthFunc.shareInstance.regData.username = userName
AuthFunc.shareInstance.regData.password = pass
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.userIntrestVC) as! UserIntrestVC
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
}
@@ -84,9 +98,11 @@ extension UserDetailsRegisterVC : UITextFieldDelegate{
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{
switch textField{
case enterNameTF:
textField.hideError()
if !string.nameCharacterOnly(){return false}
return ValidatorClass.sharedInstanec.limitCharacter(length: 50,textField, shouldChangeCharactersIn: range, replacementString: string)
case enterUserNameTF:
textField.hideError()
if !string.numberAndCharacterAndSpecialChar(){return false}
return ValidatorClass.sharedInstanec.limitCharacter(length: 16,textField, shouldChangeCharactersIn: range, replacementString: string)
case enterPasswordTF:

View File

@@ -19,6 +19,7 @@ class UserIntrestVC: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var nextBtn: LocalisedElementsButton!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var fullName: UILabel!
@IBOutlet weak var contentHeight: NSLayoutConstraint!
@@ -58,6 +59,54 @@ class UserIntrestVC: UIViewController {
}
@IBAction func nextBtnTapped(_ sender: LocalisedElementsButton) {
let dob = DateFormatterLib.dateModsDate(date: datePicker.date, dateReturnFormat: .yyyy_MM_dd, stringOrDate: .string).0
/*
Append the DOB to RegData
*/
AuthFunc.shareInstance.regData.date_of_birth = dob
// Check for Gender.
if AuthFunc.shareInstance.regData.gender == nil{
let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC
vcPush.contentLabel = K.ConstantString.genderSel
vcPush.mainTitleText = K.ConstantString.error
// vcPush.onDoneBlock = { isDone in }
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
self.present(vcPush, animated: true)
return
}
// Check for Intrest.
if AuthFunc.shareInstance.regData.interest_topic_id == nil || AuthFunc.shareInstance.regData.interest_topic_id?.count == 0{
let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC
vcPush.contentLabel = K.ConstantString.intrest
vcPush.mainTitleText = K.ConstantString.error
// vcPush.onDoneBlock = { isDone in }
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
self.present(vcPush, animated: true)
return
}
// Check for DOB.
if AuthFunc.shareInstance.regData.date_of_birth == nil{
let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC
vcPush.contentLabel = K.ConstantString.dob
vcPush.mainTitleText = K.ConstantString.error
// vcPush.onDoneBlock = { isDone in }
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
self.present(vcPush, animated: true)
return
}
let sb = UIStoryboard(name: K.StoryBoard.authenticationSB, bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Authentication.selectAvatarVC) as! SelectAvatarVC
self.navigationController?.pushViewController(vc, animated: true)
@@ -80,7 +129,19 @@ extension UserIntrestVC : UICollectionViewDelegate , UICollectionViewDataSource{
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
vm.intrestTopics[indexPath.row].isSelected?.toggle()
//Append remove intrest ID
if let id = vm.intrestTopics[indexPath.row].id{
if let topicID = AuthFunc.shareInstance.regData.interest_topic_id, let index = topicID.firstIndex(of: id){
AuthFunc.shareInstance.regData.interest_topic_id?.remove(at: index)
}else{
if AuthFunc.shareInstance.regData.interest_topic_id == nil {
AuthFunc.shareInstance.regData.interest_topic_id = []
}
AuthFunc.shareInstance.regData.interest_topic_id?.append(id)
}
}
print(AuthFunc.shareInstance.regData.interest_topic_id)
UIView.performWithoutAnimation {
self.collectionView.reloadItems(at: [IndexPath(row: indexPath.row, section: 0)])
}
@@ -115,3 +176,69 @@ extension UserIntrestVC : UICollectionViewDelegateFlowLayout{
}
}
extension UIView {
func startShimmeringViewAnimation() {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
let gradientColorOne = #colorLiteral(red: 0.7529411765, green: 0.7529411765, blue: 0.7529411765, alpha: 1).cgColor
let gradientColorTwo = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1).cgColor
gradientLayer.colors = [gradientColorOne, gradientColorTwo, gradientColorOne]
gradientLayer.locations = [0.0, 0.5, 1.0]
layer.addSublayer(gradientLayer)
startShimmerAnimation(on: gradientLayer)
}
func stopShimmeringViewAnimation() {
guard let gradientLayer = layer.sublayers?.first(where: { $0 is CAGradientLayer }) else {
return
}
gradientLayer.removeAllAnimations()
gradientLayer.removeFromSuperlayer()
}
private func startShimmerAnimation(on layer: CALayer) {
let animation = CABasicAnimation(keyPath: "locations")
animation.fromValue = [-1.0, -0.5, 0.0]
animation.toValue = [1.0, 1.5, 2.0]
animation.repeatCount = .infinity
animation.duration = 1.25
layer.add(animation, forKey: animation.keyPath)
}
}
import UIKit
class ShimmerView: UIView {
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
var gradientLayer: CAGradientLayer {
return layer as! CAGradientLayer
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, UIColor.clear.cgColor]
gradientLayer.locations = [0.0, 0.5, 1.0]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
let animation = CABasicAnimation(keyPath: "transform.translation.x")
animation.duration = 1.0
animation.fromValue = -frame.width
animation.toValue = frame.width
animation.repeatCount = Float.infinity
gradientLayer.add(animation, forKey: "shimmerAnimation")
}
}

View File

@@ -0,0 +1,32 @@
//
// AvatarDM.swift
// WOKA
//
// Created by MacBook Pro on 08/05/24.
//
import Foundation
// MARK: - AvatarDM
struct AvatarDM: Codable {
let result: [ResultRecords]?
let totalRecords: Int?
enum CodingKeys: String, CodingKey {
case result
case totalRecords = "total_records"
}
// MARK: - Result
struct ResultRecords: Codable {
let id: Int?
let avatarName: String?
let avatarImageURL: String?
enum CodingKeys: String, CodingKey {
case id
case avatarName = "avatar_name"
case avatarImageURL = "avatar_image_url"
}
}
}

View File

@@ -7,46 +7,35 @@
import Foundation
//[{"key":"full_name","value":"DemoUser","description":"mandatory","type":"text"},{"key":"username","value":"tests104","description":"mandatory","type":"text"},{"key":"password","value":"123456","description":"mandatory (minimum 6 character)","type":"text"},{"key":"gender","value":"1","description":"mandatory (1 for girl/female, 2 for boy/male)","type":"text"},{"key":"birthdate","value":"2015-11-1","description":"mandatory","type":"text"},{"key":"email","value":"pradyumn@wdimails.com1","description":"mandatory","type":"text"},{"key":"guardian_email","value":"pradyumn@wdimails.com1","description":"mandatroy if user type = 1","type":"text"},{"key":"user_type","value":"1","description":"mandatory ( 1 = below 16, 2 = above 16)","type":"text"},{"key":"language_id","value":"1","description":"mandatory","type":"text"},{"key":"ip_address","value":"111","description":"non mandatory","type":"text","enabled":false},{"key":"interest_topic_id[0]","value":"1","description":"mandatory if user type=1","type":"text"},{"key":"interest_topic_id[1]","value":"2","description":"mandatory if user type=1","type":"text"},{"key":"avtar","value":"avatar1.png","description":"mandatory","type":"text"},{"key":"add_child","value":"1","description":"mandatory when parent adding child","type":"text"}]
struct UserRegPostModel: Encodable {
var full_name: String?
var username : String?
var password : String?
var date_of_birth: String?
var contact_number: String?
var gender : Int? //mandatory (1 for girl/female, 2 for boy/male)
var date_of_birth: String? //2015-11-1
var email: String?
var street: String?
var town: String?
var country: String?
var state: String?
var zip_code: String?
var lat: String?
var lng: String?
var pin_code: String?
var cpin_code: String?
var one_signal_player_id: String?
var timezone: String?
var guardian_email: String?
var user_type: String?
var language_id: String?
var interest_topic_id: [Int]?
var avtar: String?
var add_child: String?
var dictionaryRepresentation: [String: Any] {
return [
"full_name": full_name ?? "",
"username" : username ?? "",
"password" : password ?? "",
"gender" : gender ?? "",
"date_of_birth": date_of_birth ?? "",
"contact_number": contact_number ?? "",
"email": email ?? "",
"street": street ?? "",
"town": town ?? "",
"country": country ?? "",
"state": state ?? "",
"zip_code": zip_code ?? "",
"lat": lat ?? "",
"lng": lng ?? "",
"pin_code": pin_code ?? "",
"cpin_code": cpin_code ?? "",
"one_signal_player_id": one_signal_player_id ?? "",
"timezone": timezone ?? ""
"guardian_email": guardian_email ?? "",
"user_type": user_type ?? "",
"language_id": language_id ?? "",
"interest_topic_id": interest_topic_id ?? [],
"avtar": avtar ?? "",
"add_child": add_child ?? "",
]
}
}

View File

@@ -21,7 +21,10 @@ class SelectAvatarCell: UICollectionViewCell {
self.roundCorner()
}
func setData(){
func setData(data : AvatarDM.ResultRecords){
if let url = data.avatarImageURL{
self.imageView.imageURL(url)
}
// self.imageView.image = UIImage(named: "avatar")
}
}

View File

@@ -8,17 +8,18 @@
import UIKit
class YourIntrestCell: UICollectionViewCell {
@IBOutlet weak var outerView: UIView!
@IBOutlet weak var intrestLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func layoutSubviews() {
outerView.roundCorner(radius: 20)
// outerView.backgroundColor = UIColor.white.withAlphaComponent(0.5)
// outerView.backgroundColor = UIColor.white.withAlphaComponent(0.5)
}
func setData(data : IntrestTopicDM.Result){
@@ -30,5 +31,4 @@ class YourIntrestCell: UICollectionViewCell {
outerView.backgroundColor = UIColor.white.withAlphaComponent(0.5)
}
}
}

View File

@@ -10,13 +10,14 @@ import UIKit
class SelectAvatarVM{
weak var vc : SelectAvatarVC!
var avatarData = [AvatarDM.ResultRecords]()
func initView(){
let color1 = #colorLiteral(red: 0.144693464, green: 0.1426281333, blue: 0.6686832905, alpha: 1)
let color2 = #colorLiteral(red: 0.6901960784, green: 0.2745098039, blue: 0.7568627451, alpha: 1)
vc.nextBtn.applyGradient(colors: [color1, color2], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
vc.nextBtn.roundCorner()
setupCell()
getAvatarListing()
}
func setupCell(){
@@ -24,4 +25,31 @@ class SelectAvatarVM{
vc.collectionView.delegate = self.vc
vc.collectionView.dataSource = self.vc
}
// MARK: - Get Intrests
func getAvatarListing(){
Utilities.startProgressHUD()
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.avatar_listing, method: .get) {(result : Result<BaseResponseModel<AvatarDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
switch data.success{
case 0:
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1:
Utilities.dismissProgressHUD()
if let avatarData = data.data?.result{
self.avatarData = avatarData
self.vc.collectionView.reloadData()
}
default:
break
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription, time: 2)
}
}
}
}

View File

@@ -6,6 +6,7 @@
//
import UIKit
import Alamofire
class UserDetailsRegisterVM{
@@ -30,7 +31,7 @@ class UserDetailsRegisterVM{
//Adding error view to the name tf
vc.enterNameTF.addRightButton(title: "", tintColor: UIColor.red, btnImage: UIImage(systemName: "exclamationmark.circle.fill"), target: self, action: #selector(errorName))
vc.enterNameTF.rightView?.isHidden = true
vc.enterUserNameTF.addRightButton(title: "", tintColor: UIColor.red, btnImage: UIImage(systemName: "exclamationmark.circle.fill"), target: self, action: #selector(errorName))
vc.enterUserNameTF.addRightButton(title: "", tintColor: UIColor.red, btnImage: UIImage(systemName: "exclamationmark.circle.fill"), target: self, action: #selector(errorUserName))
vc.enterUserNameTF.rightView?.isHidden = true
}
@@ -42,7 +43,7 @@ class UserDetailsRegisterVM{
}
@objc func errorUserName(){
let errorView = errorViews.object(forKey: vc.enterNameTF)
let errorView = errorViews.object(forKey: vc.enterUserNameTF)
if let errorView = errorView {
errorView.isHidden.toggle()
}
@@ -60,4 +61,37 @@ class UserDetailsRegisterVM{
i.delegate = vc.self
}
}
// MARK: - Get Intrests
func checkUsernameExist(onCompletion: @escaping (Bool) -> Void){
let params: Parameters = [
"email": AuthFunc.shareInstance.regData.email!,
"username": vc.enterUserNameTF.text!,
"user_type": AuthFunc.shareInstance.userType == .adult ? "2" :"1"
]
Utilities.startProgressHUD(msg: K.ConstantString.userNameVerify)
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Auth.check_exist_username, method: .post,parameters: params) {(result : Result<BaseResponseModel<IntrestTopicDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
//0 -> Username already used. , 1-> Username available
switch data.success{
case 0:
Utilities.dismissProgressHUD()
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
onCompletion(false)
case 1:
Utilities.dismissProgressHUD()
onCompletion(true)
default:
break
}
case .failure(let error):
Utilities.dismissProgressHUD()
self.vc.toast(msg: error.localizedDescription, time: 2)
onCompletion(false)
}
}
}
}

View File

@@ -11,14 +11,26 @@ import Alamofire
class UserIntrestVM{
weak var vc : UserIntrestVC!
var gender = GenderEnum.none
// var gender = GenderEnum.none
var intrestTopics = [IntrestTopicDM.Result]()
func initView(){
setupCell()
let bottomPadding: CGFloat = 60 // Adjust this value as needed
/*
Setting the minimum and maximum date as per user type
*/
if AuthFunc.shareInstance.userType == .adult{
vc.datePicker.minimumDate = Calendar.current.date(byAdding: .year, value: -150, to: Date())
vc.datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date())
}else{
vc.datePicker.minimumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date())
vc.datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -3, to: Date())
}
vc.fullName.text = (AuthFunc.shareInstance.regData.full_name != nil && AuthFunc.shareInstance.regData.full_name != "") ? AuthFunc.shareInstance.regData.full_name : "Guardian"
let bottomPadding: CGFloat = 60 // Adjust this value as needed
// Get the current content inset
var contentInset = vc.scrollView.contentInset
@@ -48,14 +60,14 @@ class UserIntrestVM{
func setGender(){
let alphaComp = 0.6
switch gender{
case .boy:
switch AuthFunc.shareInstance.regData.gender{
case 2:
vc.boyView.backgroundColor = UIColor.white
vc.girlView.backgroundColor = UIColor.white.withAlphaComponent(alphaComp)
case .girl:
case 1:
vc.girlView.backgroundColor = UIColor.white
vc.boyView.backgroundColor = UIColor.white.withAlphaComponent(alphaComp)
case .none:
default:
vc.girlView.backgroundColor = UIColor.white.withAlphaComponent(alphaComp)
vc.boyView.backgroundColor = UIColor.white.withAlphaComponent(alphaComp)
}
@@ -63,7 +75,7 @@ class UserIntrestVM{
@objc func boyBtnTapped() {
// Apply click effect animation
gender = .boy
AuthFunc.shareInstance.regData.gender = 2
UIView.animate(withDuration: 0.1, animations: {
self.vc.boyView.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
}) { _ in
@@ -75,7 +87,8 @@ class UserIntrestVM{
}
@objc func girlBtnTapped() {
gender = .girl
AuthFunc.shareInstance.regData.gender = 1
// Apply click effect animation
UIView.animate(withDuration: 0.1, animations: {
self.vc.girlView.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
@@ -118,7 +131,7 @@ class UserIntrestVM{
self.vc.view.layoutIfNeeded()
}
self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
// self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
default:
break
}

View File

@@ -19,5 +19,14 @@ extension K{
static let noInternet = "Make sure you are connected to the internet!"
static let minAge = "Minimum age requirement is 18 or above"
static let genderSel = "Please select Gender."
static let shortPass = "Password is too short."
static let shortUsername = "Username is too short."
static let userNameVerify = "Verifying Username"
static let intrest = "Please select intrest."
static let dob = "Please select DOB."
static let error = "Error"
}
}

View File

@@ -0,0 +1,298 @@
//
// DateFormatterLib.swift
// WOKA
//
// Created by MacBook Pro on 08/05/24.
//
import UIKit
class DateFormatterLib{
static func getMinutesDifferenceFromTwoDates(start: Date, end: Date) -> Int{
let diff = Int(end.timeIntervalSince1970 - start.timeIntervalSince1970)
let hours = diff / 3600
let minutes = (diff - hours * 3600) / 60
return minutes
}
static func convertToDate(dateFormat : DateFormats , dateStr : String) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = dateFormat.rawValue
let date = dateFormatter.date(from:dateStr)!
return date
}
static func dateConvert (date : String) -> String?{ // d-MMMM-yyyy h:mm a -> 27-June-2022 1:10 PM
let isoDate = date
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = dateFormatter.date(from:isoDate)!
dateFormatter.dateFormat = "d-MMMM-yyyy h:mm a"
let resultString = dateFormatter.string(from: date)
return resultString
}
static func getDate(date : String) -> String?{ // d-MMMM-yyyy h:mm a -> 27-June-2022 1:10 PM
let isoDate = date
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = dateFormatter.date(from:isoDate)!
dateFormatter.dateFormat = "d-MMMM-yyyy"
let resultString = dateFormatter.string(from: date)
return resultString
}
static func getTime(date : String) -> String?{ // d-MMMM-yyyy h:mm a -> 27-June-2022 1:10 PM
let isoDate = date
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = dateFormatter.date(from:isoDate)!
dateFormatter.dateFormat = "h:mm a"
let resultString = dateFormatter.string(from: date)
return resultString
}
static func time(date : Date)-> String{
let formatter = DateFormatter()
formatter.dateFormat = "h:mm a"
let currentTime = formatter.string(from: date)
return currentTime
}
static func date(date : Date)-> String{
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let currentTime = formatter.string(from: date)
return currentTime
}
static func timeFormat(dateStr : String) -> String?{ // am pm to 24 hour
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
let item = dateStr
let date = dateFormatter.date(from: item)!
dateFormatter.dateFormat = "HH:mm"
let currentTime = dateFormatter.string(from: date)
return currentTime
}
static func addMinToString(data : String , minToAdd : Double , format : DateFormats) -> (String? , Date?){
let isoDate = data
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let dateMod = dateFormatter.date(from:isoDate)!
let minAdded = dateMod.addingTimeInterval(minToAdd * 60)
dateFormatter.dateFormat = format.rawValue
let resultString = dateFormatter.string(from: minAdded)
return (resultString,minAdded)
}
static func addSecondToString(data : String , secondToAdd : Double , format : DateFormats) -> (String? , Date?){
let isoDate = data
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let dateMod = dateFormatter.date(from:isoDate)!
let minAdded = dateMod.addingTimeInterval(secondToAdd)
dateFormatter.dateFormat = format.rawValue
let resultString = dateFormatter.string(from: minAdded)
return (resultString,minAdded)
}
static func dateMods(dateStr : String,dateCurrentFormat : DateFormats, dateReturnFormat : DateFormats,stringOrDate : StringOrDate) -> (String?,Date?){
if dateStr == ""{
return ("",nil)
}
let isoDate = dateStr
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX 1991-11-29 00:00:00
dateFormatter.dateFormat = dateCurrentFormat.rawValue
let date = dateFormatter.date(from:isoDate)!
dateFormatter.dateFormat = dateReturnFormat.rawValue
switch stringOrDate {
case .date:
return (nil,date)
case .string:
let resultString = dateFormatter.string(from: date)
return (resultString,nil)
case .both:
let resultString = dateFormatter.string(from: date)
return (resultString,date)
}
}
static func abbrevationTimeConversion(dateStr : String, dateCurrentFormat : DateFormats, dateReturnFormat : DateFormats, timeZoneAbbrevation : TimeZoneAbbreviation) -> String?{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateCurrentFormat.rawValue
dateFormatter.timeZone = TimeZone(abbreviation: timeZoneAbbrevation.rawValue)
if let date = dateFormatter.date(from: dateStr) {
dateFormatter.timeZone = TimeZone.current
dateFormatter.dateFormat = dateReturnFormat.rawValue
return dateFormatter.string(from: date)
}
return nil
}
static func dateModsDate(date : Date, dateReturnFormat : DateFormats,stringOrDate : StringOrDate) -> (String?,Date?){
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateReturnFormat.rawValue
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX 1991-11-29 00:00:00
let dateFormatted = dateFormatter.string(from: date)
switch stringOrDate {
case .date:
return (nil,date)
case .string:
// let resultString = dateFormatter.string(from: date)
return (dateFormatted,nil)
case .both:
return (dateFormatted,date)
}
}
static func convertTimeStringToCurrentDate(time : String, format : DateFormats) -> Date?{
// Step 1: Get the current date
let currentDate = Date()
// Step 2: Parse the time string
let timeString = time // Replace with your desired time string
let timeFormatter = DateFormatter()
timeFormatter.timeZone = TimeZone.current // Use the current time zone
timeFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX 1991-11-29 00:00:00
timeFormatter.dateFormat = format.rawValue
if let time = timeFormatter.date(from: timeString) {
// Step 3: Combine the date and time
let calendar = Calendar.current
let combinedDate = calendar.date(bySettingHour: calendar.component(.hour, from: time),
minute: calendar.component(.minute, from: time),
second: calendar.component(.second, from: time),
of: currentDate)
if let combinedDate = combinedDate {
// Now, combinedDate contains the current date with the time from the time string
return combinedDate
} else {
return nil
}
} else {
return nil
}
}
}
extension Date {
func withAddedMinutes(minutes: Double) -> Date {
addingTimeInterval(minutes * 60)
}
func withAddedHours(hours: Double) -> Date {
withAddedMinutes(minutes: hours * 60)
}
static func -(lhs: Date, rhs: Int) -> Date {
return Calendar.current.date(byAdding: .day, value: -rhs, to: lhs)!
}
}
//enum DateFormats: String, CaseIterable {
// case yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"
// case yyyy_MM_dd_T_HH_mm_ss_SSSZ = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
// case HH_mm = "HH:mm"
// case yyyy_MM_dd = "yyyy-MM-dd"
// case HH_mm_ss = "HH:mm:ss"
// case yyyy_MM_dd_HH_mm_ss_Z = "yyyy-MM-dd HH:mm:ss Z" //2023-02-28 03:00:29 +0000
// case dd_MM_yyyy = "dd-MM-yyyy" // 26-06-1991
//}
enum StringOrDate {
case date
case string
case both
}
enum DateFormats: String, CaseIterable {
case d = "d" // 2
case EEEE = "EEEE" // wednesday
case EEE = "EEE" // wed
case yyyy_MM_dd_T_HH_mm_ss_SSSZ = "yyyy_MM_dd_T_HH_mm_ss_SSSZ"
case yyyy_MM_ddTHH_mm_ss_ssZ = "yyyy-MM-dd'T'HH:mm:ss:ssZ" //
case yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss" // 2023-07-25 14:03:07
case yyyy_MM_dd = "yyyy-MM-dd"
case MMMM_d_yyyy_h_mm_a = "MMMM d, yyyy, h:mm a" // December 6, 2022, 3:55 PM
case d_MMM_yyyy_at_h_mm_a = "d MMM yyyy 'at' h:mm a" // 27 Jan 2023 at 4:30 pm
case d_MMMM_yyyy_h_mm_a = "d MMMM yyyy, h:mm a" //2 Dec 2022, 12:34 PM
case dd_MM_yyyy = "dd-MM-yyyy" // 26-06-1991
case MM_dd_yyyy = "MM-dd-yyyy" // 06-26-1991
case h_mm_a_d_MMM_yyyy = "h:mm a, d MMM yyyy" // 2:45 pm, 22 Sep 2022
case h_mm_a_MMM_d_yyyy = "h:mm a, MMM d yyyy" // 11:07 AM, Aug 16 2022
case d_MMM_yyyy = "d MMM yyyy" // 28 Nov 2022
case d_MMMM_yyyy = "d MMMM yyyy" // 28 November 2022
case d_MMM__yyyy = "d MMM, yyyy" // 28 Nov, 2022
case MMM_d_yyyy = "MMM d, yyyy" // Nov 28, 2022
case MMMM_d = "MMMM, d" // March 16
// Times
case HH_mm = "HH:mm"
case HH_mm_ss = "HH:mm:ss"
case h_mm_a = "h:mm a"
case h_a = "hh a"
case h_mm_ss_a = "h:mm:ss a"
case d_MM = "d MMM" // 12 Oct
case h__mm__a = "h : mm a"
}
// List of abbrevation for different zones
enum TimeZoneAbbreviation: String {
case UTC = "UTC"
case GMT = "GMT"
case EST = "EST"
case CST = "CST"
case MST = "MST"
case PST = "PST"
case AST = "AST"
case AKST = "AKST"
case HST = "HST"
case AEDT = "AEDT"
case AEST = "AEST"
case ACDT = "ACDT"
case ACST = "ACST"
case AWST = "AWST"
case JST = "JST"
case KST = "KST"
case IST = "IST"
case CET = "CET"
case CEST = "CEST"
case EET = "EET"
case MSK = "MSK"
case NZST = "NZST"
case NST = "NST"
// Example usage:
// let timeZone: TimeZoneAbbreviation = .EST
// print("Time Zone Abbreviation: \(timeZone.rawValue)")
}

View File

@@ -0,0 +1,36 @@
//
// LoadingIndicatorImageView.swift
// WOKA
//
// Created by MacBook Pro on 08/05/24.
//
import UIKit
import SDWebImage
extension UIImageView {
func imageURL(_ url: String, color : UIColor = UIColor.black) {
let activityIndicator = UIActivityIndicatorView(style: .medium)
activityIndicator.tintColor = UIColor.darkGray
activityIndicator.color = color
activityIndicator.frame = CGRect(x: 0, y: 0, width: 64, height: 64)
activityIndicator.hidesWhenStopped = true
activityIndicator.startAnimating()
activityIndicator.translatesAutoresizingMaskIntoConstraints = true
// activityIndicator.center = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height / 2)
activityIndicator.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds))
// bottom is for resizing the indicator to be perfect in center
activityIndicator.autoresizingMask = (UIView.AutoresizingMask(rawValue: UIView.AutoresizingMask.RawValue(UInt8(UIView.AutoresizingMask.flexibleRightMargin.rawValue) | UInt8(UIView.AutoresizingMask.flexibleLeftMargin.rawValue) | UInt8(UIView.AutoresizingMask.flexibleBottomMargin.rawValue) | UInt8(UIView.AutoresizingMask.flexibleTopMargin.rawValue))))
self.addSubview(activityIndicator)
// Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { _ in
self.sd_setImage(with: URL(string: url.replacingOccurrences(of: " ", with: "%20"))) { (image, error, cacheType, url) in
activityIndicator.stopAnimating()
}
// }
}
}

View File

@@ -27,6 +27,8 @@ struct APIEndPoints {
static let user_email_verification = makeURL(path: "user_email_verification")
static let validate_otp = makeURL(path: "validate_otp")
static let interest_topic_listing = makeURL(path: "interest_topic_listing")
static let check_exist_username = makeURL(path: "check_exist_username")
static let avatar_listing = makeURL(path: "avatar_listing")
}
// Other endpoint categories...