[+] Merge Account Branch: Implement Register, Login, Logout, Delete
[+] Merge Account Branch: Implement Register, Login, Logout, Delete
This commit is contained in:
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
/**
|
||||||
|
Account view controller controlling the two separate view controllers
|
||||||
|
*/
|
||||||
class AccountViewController: UIViewController
|
class AccountViewController: UIViewController
|
||||||
{
|
{
|
||||||
@IBOutlet var vLogin: UIView!
|
@IBOutlet var vLogin: UIView!
|
||||||
@@ -80,29 +83,28 @@ class LoginVC: UIViewController
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Error messages
|
||||||
|
let errors = ["409 - [\"A0111\"]": "Account already exists, please login instead.",
|
||||||
|
"401 -": "Incorrect username/password",
|
||||||
|
"404 -": "Username does not exist in the database",
|
||||||
|
]
|
||||||
|
|
||||||
// Send register request
|
// Send register request
|
||||||
let a = alert(login ? "Logging in..." : "Registering...", "Please Wait")
|
sendReq(login ? APIs.login : APIs.register,
|
||||||
send(login ? APIs.login : APIs.register, ["username": name, "password": pass.sha256])
|
title: login ? "Logging in..." : "Registering...", errors: errors,
|
||||||
|
params: ["username": name, "password": pass.sha256])
|
||||||
{
|
{
|
||||||
// Store username and password
|
// Store username and password
|
||||||
localStorage["name"] = name
|
localStorage["name"] = name
|
||||||
localStorage["pass"] = pass.sha256
|
localStorage["pass"] = pass.sha256
|
||||||
localStorage["id"] = $0
|
localStorage["id"] = $0
|
||||||
|
|
||||||
a.dismiss
|
// Send feedback
|
||||||
{
|
if login { self.msg("Login success!", "Now you can use account features, yay!") }
|
||||||
// Send feedback
|
else { self.msg("Registration success!", "Now you have an account, yay!") }
|
||||||
if login { self.msg("Login success!", "Now you can use account features, yay!") }
|
|
||||||
else { self.msg("Registration success!", "Now you have an account, yay!") }
|
// Hide registration and show account detail view
|
||||||
|
AccountViewController.this.login()
|
||||||
// Hide registration and show account detail view
|
|
||||||
ui { AccountViewController.this.login() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err:
|
|
||||||
{
|
|
||||||
print($0)
|
|
||||||
a.dismiss { self.msg("An error occurred", "Maybe the server is on fire, just wait a few hours.") }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,6 +125,9 @@ class LoginVC: UIViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Account manage view controller
|
||||||
|
*/
|
||||||
class ManageVC: UIViewController
|
class ManageVC: UIViewController
|
||||||
{
|
{
|
||||||
static var this: ManageVC!
|
static var this: ManageVC!
|
||||||
@@ -157,4 +162,17 @@ class ManageVC: UIViewController
|
|||||||
{
|
{
|
||||||
AccountViewController.this.logout()
|
AccountViewController.this.logout()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Called when the user clicks the delete account button
|
||||||
|
*/
|
||||||
|
@IBAction func deleteAccount(_ sender: Any)
|
||||||
|
{
|
||||||
|
sendReq(APIs.delete, title: "Deleting...")
|
||||||
|
{
|
||||||
|
print("Deleted! \($0)")
|
||||||
|
self.msg("Deleted!", "You are erased from our database, you no longer exist.")
|
||||||
|
self.logout(sender)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -638,7 +638,7 @@
|
|||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3pJ-zP-vKy">
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3pJ-zP-vKy">
|
||||||
<rect key="frame" x="100" y="0.0" width="274" height="34"/>
|
<rect key="frame" x="100" y="0.0" width="274" height="34"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<textInputTraits key="textInputTraits" secureTextEntry="YES" textContentType="new-password"/>
|
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
@@ -690,13 +690,13 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="gYR-mG-zfS">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="gYR-mG-zfS">
|
||||||
<rect key="frame" x="20" y="0.0" width="374" height="371"/>
|
<rect key="frame" x="20" y="0.0" width="374" height="270"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gUf-g1-1af">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gUf-g1-1af">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="374" height="170"/>
|
<rect key="frame" x="0.0" y="0.0" width="374" height="170"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yVW-fL-SIQ">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="person.crop.circle.badge.checkmark" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="yVW-fL-SIQ">
|
||||||
<rect key="frame" x="132" y="0.0" width="110" height="110"/>
|
<rect key="frame" x="130.5" y="0.0" width="111.5" height="109.5"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="110" id="So8-k5-nLS"/>
|
<constraint firstAttribute="width" constant="110" id="So8-k5-nLS"/>
|
||||||
<constraint firstAttribute="height" constant="110" id="inA-vb-CrL"/>
|
<constraint firstAttribute="height" constant="110" id="inA-vb-CrL"/>
|
||||||
@@ -728,44 +728,23 @@
|
|||||||
<constraint firstAttribute="trailing" secondItem="cT0-Ux-t7H" secondAttribute="trailing" constant="20" id="yRX-lY-fXX"/>
|
<constraint firstAttribute="trailing" secondItem="cT0-Ux-t7H" secondAttribute="trailing" constant="20" id="yRX-lY-fXX"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="o9J-ZW-PSX">
|
|
||||||
<rect key="frame" x="0.0" y="190" width="374" height="31"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Auto Backup" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QTC-5i-6b9">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="305" height="31"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
|
||||||
<nil key="textColor"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fRF-sU-NPD">
|
|
||||||
<rect key="frame" x="325" y="0.0" width="51" height="31"/>
|
|
||||||
</switch>
|
|
||||||
</subviews>
|
|
||||||
</stackView>
|
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="eUn-CF-BxW">
|
|
||||||
<rect key="frame" x="0.0" y="241" width="374" height="30"/>
|
|
||||||
<subviews>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qrI-ZV-4EL">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="187" height="30"/>
|
|
||||||
<state key="normal" title="Backup Config"/>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="adM-2W-pdW">
|
|
||||||
<rect key="frame" x="187" y="0.0" width="187" height="30"/>
|
|
||||||
<state key="normal" title="Restore Backup"/>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
</stackView>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3pG-br-PVl">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3pG-br-PVl">
|
||||||
<rect key="frame" x="0.0" y="291" width="374" height="30"/>
|
<rect key="frame" x="0.0" y="190" width="374" height="30"/>
|
||||||
<state key="normal" title="Log Out">
|
<state key="normal" title="Log Out">
|
||||||
<color key="titleColor" systemColor="systemOrangeColor"/>
|
<color key="titleColor" systemColor="systemOrangeColor"/>
|
||||||
</state>
|
</state>
|
||||||
|
<connections>
|
||||||
|
<action selector="logout:" destination="3gV-kF-UbK" eventType="touchUpInside" id="dyQ-AR-u9Y"/>
|
||||||
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="awy-Du-cqu">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="awy-Du-cqu">
|
||||||
<rect key="frame" x="0.0" y="341" width="374" height="30"/>
|
<rect key="frame" x="0.0" y="240" width="374" height="30"/>
|
||||||
<state key="normal" title="Delete Account">
|
<state key="normal" title="Delete Account">
|
||||||
<color key="titleColor" systemColor="systemRedColor"/>
|
<color key="titleColor" systemColor="systemRedColor"/>
|
||||||
</state>
|
</state>
|
||||||
|
<connections>
|
||||||
|
<action selector="deleteAccount:" destination="3gV-kF-UbK" eventType="touchUpInside" id="iQ9-m9-VIm"/>
|
||||||
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
@@ -778,6 +757,10 @@
|
|||||||
<constraint firstAttribute="trailing" secondItem="gYR-mG-zfS" secondAttribute="trailing" constant="20" id="fxQ-LY-4QQ"/>
|
<constraint firstAttribute="trailing" secondItem="gYR-mG-zfS" secondAttribute="trailing" constant="20" id="fxQ-LY-4QQ"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
|
<connections>
|
||||||
|
<outlet property="lJoinDate" destination="cT0-Ux-t7H" id="1XG-r8-Qr4"/>
|
||||||
|
<outlet property="lUsername" destination="kAN-ll-4wh" id="3Ta-rI-wql"/>
|
||||||
|
</connections>
|
||||||
</viewController>
|
</viewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="pLc-eQ-yBW" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="pLc-eQ-yBW" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
@@ -789,6 +772,7 @@
|
|||||||
<image name="checkmark" catalog="system" width="128" height="114"/>
|
<image name="checkmark" catalog="system" width="128" height="114"/>
|
||||||
<image name="hammer.fill" catalog="system" width="128" height="117"/>
|
<image name="hammer.fill" catalog="system" width="128" height="117"/>
|
||||||
<image name="person.crop.circle" catalog="system" width="128" height="121"/>
|
<image name="person.crop.circle" catalog="system" width="128" height="121"/>
|
||||||
|
<image name="person.crop.circle.badge.checkmark" catalog="system" width="128" height="113"/>
|
||||||
<image name="trash.fill" catalog="system" width="121" height="128"/>
|
<image name="trash.fill" catalog="system" width="121" height="128"/>
|
||||||
<systemColor name="secondaryLabelColor">
|
<systemColor name="secondaryLabelColor">
|
||||||
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
|||||||
@@ -139,7 +139,25 @@ extension UIViewController
|
|||||||
func msg(_ title: String, _ message: String) -> UIAlertController { alert(title, message, okayable: true) }
|
func msg(_ title: String, _ message: String) -> UIAlertController { alert(title, message, okayable: true) }
|
||||||
|
|
||||||
/// More convenient dismiss function
|
/// More convenient dismiss function
|
||||||
func dismiss(_ completion: (() -> Void)? = nil) { dismiss(animated: false, completion: completion) }
|
func dismiss(_ completion: (() -> Void)? = nil) { ui { self.dismiss(animated: false, completion: completion) } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
Send a http request even more conveniently
|
||||||
|
*/
|
||||||
|
func sendReq<T: Decodable>(_ api: API<T>, title: String, errors: [String: String] = [:], params: [String: String]? = [:], _ success: @escaping (T) -> Void, err: @escaping (String) -> Void = {it in})
|
||||||
|
{
|
||||||
|
// Send request
|
||||||
|
let a = alert(title, "Please Wait")
|
||||||
|
send(api, params) { it in a.dismiss { success(it) } }
|
||||||
|
err:
|
||||||
|
{
|
||||||
|
// Display error message
|
||||||
|
print("===== Error: \($0) =====")
|
||||||
|
let message = errors[$0.trimmingCharacters(in: .whitespaces)]
|
||||||
|
?? "Maybe the server is on fire, just wait a few hours."
|
||||||
|
a.dismiss { self.msg("An error occurred", message) }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user