Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/Washer_CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
uses: actions/checkout@v4

- name: Setup Swift
uses: swift-actions/setup-swift@v2
uses: swift-actions/setup-swift@main
with:
swift-version: '5.9'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,17 @@ public struct WasherButton: View {
Button(action: {
self.action()
}) {
Text(text)
.font(.pretendard(.semiBold, size: 14))
.color(.gray50)
.padding(.vertical, verticalPadding)
.padding(.horizontal, horizontalPadding)
.background(
RoundedRectangle(cornerRadius: 30)
.fill(isPressed ? Color.color(.main100) : Color.color(.main100))
)
.scaleEffect(isPressed ? 0.9 : 1.0)

ZStack {
RoundedRectangle(cornerRadius: 8)
.fill(isPressed ? Color.color(.main100) : Color.color(.main100))

Text(text)
.font(.pretendard(.semiBold, size: 14))
.color(.gray50)
}
.padding(.horizontal, horizontalPadding)
.frame(height: 44)
.scaleEffect(isPressed ? 0.9 : 1.0)
}
.buttonStyle(PlainButtonStyle())
.gesture(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,11 @@ struct WasherTextField: View {
}
}
.padding(.horizontal, 16)
.frame(height: 44)
.frame(height: 42)
.onSubmit(onSubmit)
.focused($isFocused)
.foregroundColor(.color(.gray700))
.font(.pretendard(.semiBold, size: 14))
.font(.pretendard(.semiBold, size: 12))

if isSecure {
Button {
Expand Down Expand Up @@ -96,9 +96,9 @@ struct WasherTextField: View {
if isError {
Text(errorText)
.foregroundStyle(.red)
.font(.pretendard(.regular, size: 12))
.font(.pretendard(.regular, size: 11))
}
}
.padding(.horizontal, 16)
//.padding(.horizontal, 16)
}
}
2 changes: 1 addition & 1 deletion Projects/App/Sources/DesignSystem/DesignModifire.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ struct DesignModifireView: View {
var body: some View {
Text("Hello, Pretendard!")
.font(.pretendard(.semiBold, size: 20))
.color(.gray600)
.color(.gray200)
}
}

Expand Down
6 changes: 6 additions & 0 deletions Projects/App/Sources/Extension/Validator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,9 @@ struct Validator {
.evaluate(with: password)
}
}

extension Character {
var isHangul: Bool {
return ("κ°€"..."힣").contains(self)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,155 @@
import SwiftUI

struct InfoInputView: View {
@StateObject var authViewModel: AuthViewModel
@State var nameTextField: String = ""
@State var nameIsError: Bool = false
@State var schoolNumberTextField: String = ""
@State var schoolNumberIsError: Bool = false
@State var domitoryRoomTextField: String = ""
@State var domitoryRoomIsError: Bool = false
@State var selectedGender: String = "λ‚¨μž"
let genders = ["λ‚¨μž", "μ—¬μž"]

var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
VStack(spacing: 0) {
ZStack {
HStack {
WasherAsset.washerLeftButton.swiftUIImage
.padding(.leading, 26)
Spacer()
}

VStack(spacing: 6) {
Text("νšŒμ›κ°€μž…")
.font(.pretendard(.bold, size: 18))
.foregroundStyle(.black)

Text("둜그인 μ‹œ μ‚¬μš©ν•  정보λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”")
.font(.pretendard(.regular, size: 12))
.color(.gray300)
}
}
.padding(.top, 50)

WasherTextField(
"이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”",
text: $nameTextField,
title: "이름",
errorText: "이름은 ν•œκΈ€ 2~4μžμ—¬μ•Ό ν•©λ‹ˆλ‹€.",
isError: nameIsError
)
.padding(.top, 38)
.onChange(of: nameTextField) { newValue in
nameTextField = String(newValue.prefix(4))

let isOnlyHangul = nameTextField.allSatisfy { $0.isHangul }
nameIsError = !(isOnlyHangul && (2...4).contains(nameTextField.count))
}
.padding(.horizontal, 26)
.padding(.top, 34)

WasherTextField(
"ν•™λ²ˆμ„ μž…λ ₯ν•΄μ£Όμ„Έμš”",
text: $schoolNumberTextField,
title: "ν•™λ²ˆ",
errorText: "ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (예: 3314)",
isError: schoolNumberIsError
)
.onChange(of: schoolNumberTextField) { newValue in
schoolNumberTextField = String(newValue.prefix(4)).filter { $0.isNumber }
schoolNumberIsError = !isValidSchoolNumber(schoolNumberTextField)
}
.padding(.horizontal, 26)
.padding(.top, 34)

WasherTextField(
"κΈ°μˆ™μ‚¬ ν˜Έμ‹€μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”",
text: $domitoryRoomTextField,
title: "ν˜Έμ‹€",
errorText: "ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (예: 415)",
isError: domitoryRoomIsError
)
.onChange(of: domitoryRoomTextField) { newValue in
domitoryRoomTextField = String(newValue.prefix(3)).filter { $0.isNumber }
domitoryRoomIsError = !isValidRoomNumber(domitoryRoomTextField)
}
.padding(.horizontal, 26)
.padding(.top, 34)

HStack {
Text("성별")
.font(.pretendard(.bold, size: 14))
.color(.main100)
.padding(.top, 34)

Spacer()
}
.padding(.leading, 26)

HStack(spacing: 4) {
ForEach(genders, id: \.self) { gender in
ZStack {
RoundedRectangle(cornerRadius: 8)
.fill(selectedGender == gender ? Color.color(.main300) : Color.color(.gray50))

Text(gender)
.font(.pretendard(.semiBold, size: 14))
.color(.gray700)
}
.frame(height: 42)
.onTapGesture {
selectedGender = gender
Haptic.impact(style: .soft)
}
}
}
.padding(.horizontal, 26)
.padding(.top, 8)

Spacer()

Rectangle()
.frame(height: 2)
.color(.gray50)

WasherButton(
text: "λ‹€μŒ",
horizontalPadding: 26
) {}
.disabled(!isFormValid)
.padding(.top, 10)
.padding(.bottom, 30)
}
}

// MARK: - μ •κ·œμ‹ 검사 ν•¨μˆ˜λ“€

func isValidName(_ name: String) -> Bool {
let regex = #"^[κ°€-힣]{2,4}$"#
return name.range(of: regex, options: .regularExpression) != nil
}

func isValidSchoolNumber(_ number: String) -> Bool {
let regex = #"^[1-3][1-4](0[1-9]|1[0-8])$"#
return number.range(of: regex, options: .regularExpression) != nil
}

func isValidRoomNumber(_ number: String) -> Bool {
let regex = #"^[2-5](0[0-9]|1[0-9]|20)$"#
return number.range(of: regex, options: .regularExpression) != nil
}

var isFormValid: Bool {
return isValidName(nameTextField) &&
isValidSchoolNumber(schoolNumberTextField) &&
isValidRoomNumber(domitoryRoomTextField) &&
!nameTextField.isEmpty &&
!schoolNumberTextField.isEmpty &&
!domitoryRoomTextField.isEmpty
}
}

#Preview {
InfoInputView()
InfoInputView(authViewModel: AuthViewModel())
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,22 +47,25 @@ struct SignInView: View {
errorText: "이메일 ν˜•μ‹μ΄ λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.",
isError: computedEmailError
)
.padding(.leading, 26)
.padding(.trailing, 8)

Text("@")
.font(.pretendard(.medium, size: 18))
.color(.gray400)
.padding(.top, 32)

Text("gsm.hs.kr")
.font(.pretendard(.medium, size: 14))
.font(.pretendard(.medium, size: 12))
.color(.gray400)
.padding(.horizontal, 16)
.frame(height: 44)
.background(
RoundedRectangle(cornerRadius: 8)
.color(.gray50)
)
.padding(.horizontal, 16)
.padding(.horizontal, 8)
.padding(.trailing, 18)
.padding(.top, 20)
}
.padding(.top, 64)
Expand All @@ -76,6 +79,7 @@ struct SignInView: View {
isSecure: true
)
.padding(.top, 34)
.padding(.horizontal, 26)

Button {
isLoggedIn.toggle()
Expand All @@ -90,14 +94,13 @@ struct SignInView: View {

Spacer()
}
.padding(.leading, 16)
.padding(.leading, 26)
.padding(.top, 6)
}

WasherButton(
text: "둜그인",
horizontalPadding: 166,
verticalPadding: 17
horizontalPadding: 26
) {
authViewModel.setupEmail(email: emailTextField)
authViewModel.setupPassword(password: passwordTextField)
Expand Down
Loading
Loading