ContentView.swift
//
// ContentView.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct ContentView: View {
@State var username = ""
@State var password = ""
@State var invalidpassword = 0
@State var invalidusername = 0
@State private var showText: Bool = false
var body: some View {
VStack {
HStack{
Image("logo")
.resizable()
.frame(width: 150, height: 130, alignment: .center)
}
HStack {
Image(systemName: "person")
.foregroundColor(.gray)
TextField("Username", text: $username)
}
.padding()
.background(Color("Color"))
.cornerRadius(8)
.overlay(RoundedRectangle(cornerRadius: 8)
.stroke(lineWidth: 1)
.foregroundColor(invalidusername == 0 ? Color.clear : Color.red)
)
.padding(.bottom, 20)
.modifier(ShakeEffect(animatableData: CGFloat(invalidusername)))
HStack {
Image(systemName: "lock")
.foregroundColor(.gray)
if showText {
TextField("", text: $password)
}else {
SecureField("Password", text: $password)
}
Button(action: {
showText.toggle()
}, label: {
Image(systemName: showText ? "eye.slash.fill" : "eye.fill")
.foregroundColor(.gray)
})
}
.padding()
.background(Color("Color"))
.cornerRadius(8)
.overlay(RoundedRectangle(cornerRadius: 8)
.stroke(lineWidth: 1)
.foregroundColor(invalidpassword == 0 ? Color.clear : Color.red)
)
.padding(.bottom, 20)
.modifier(ShakeEffect(animatableData: CGFloat(invalidpassword)))
Button(action: {
}, label: {
Text("Forgot password").padding()
})
Button(action: {
withAnimation(.default) {
loginUser()
}
}, label: {
Text("Login")
.font(.headline).bold().foregroundColor(.white).padding()
.frame(width: 250, height: 50)
.background(Color.blue)
.cornerRadius(10)
})
HStack {
Text("Don't have an account?")
Button(action: {
}, label: {
Text("Sign Up")
})
}.padding()
}.padding()
}
private func loginUser() {
if username == "" {
self.invalidusername += 1
print("Username is required")
} else if password == "" {
self.invalidpassword += 1
self.invalidusername = 0
print("password is required")
}else {
self.invalidpassword = 0
print("email : \(username) pass : \(password)")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct ShakeEffect : GeometryEffect {
var travelDistance : CGFloat = 6
var numOfShake : CGFloat = 4
var animatableData: CGFloat
func effectValue(size: CGSize) -> ProjectionTransform {
ProjectionTransform(CGAffineTransform(translationX: travelDistance * sin(animatableData * .pi * numOfShake), y: 0))
}
}
