import SwiftUI // MARK: - Contact Information Input Component struct ContactInputView: View { @Binding var firstName: String @Binding var lastName: String @Binding var phone: String @Binding var email: String @Binding var company: String @Binding var title: String @Binding var address: String @Binding var website: String @Binding var nickname: String @Binding var birthday: Date @Binding var note: String @FocusState var focusedField: ContactField? // Contact field enum enum ContactField: Hashable { case firstName, lastName, phone, email, company, title, address, website, nickname, birthday, note } var body: some View { VStack(spacing: 16) { // Name HStack(spacing: 12) { VStack(alignment: .leading, spacing: 8) { HStack { Text("first_name".localized) .font(.subheadline) .foregroundColor(.primary) Text("*") .foregroundColor(.red) Spacer() } TextField("first_name".localized, text: $firstName) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .firstName) } VStack(alignment: .leading, spacing: 8) { HStack { Text("last_name".localized) .font(.subheadline) .foregroundColor(.primary) Text("*") .foregroundColor(.red) Spacer() } TextField("last_name".localized, text: $lastName) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .lastName) } } // Nickname VStack(alignment: .leading, spacing: 8) { HStack { Text("nickname".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("nickname".localized, text: $nickname) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .nickname) } // Phone VStack(alignment: .leading, spacing: 8) { HStack { Text("phone_number".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("contact_phone_placeholder".localized, text: $phone) .textFieldStyle(RoundedBorderTextFieldStyle()) .keyboardType(.phonePad) .focused($focusedField, equals: .phone) } // Email VStack(alignment: .leading, spacing: 8) { HStack { Text("email".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("contact_email_placeholder".localized, text: $email) .textFieldStyle(RoundedBorderTextFieldStyle()) .keyboardType(.emailAddress) .autocapitalization(.none) .focused($focusedField, equals: .email) } // Company VStack(alignment: .leading, spacing: 8) { HStack { Text("company".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("company_name".localized, text: $company) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .company) } // Title VStack(alignment: .leading, spacing: 8) { HStack { Text("title".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("title_name".localized, text: $title) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .title) } // Address VStack(alignment: .leading, spacing: 8) { HStack { Text("address".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("detailed_address".localized, text: $address) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .address) } // Website VStack(alignment: .leading, spacing: 8) { HStack { Text("website".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("https://example.com", text: $website) .textFieldStyle(RoundedBorderTextFieldStyle()) .keyboardType(.URL) .autocapitalization(.none) .focused($focusedField, equals: .website) } // Birthday VStack(alignment: .leading, spacing: 8) { HStack { Text("birthday".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } DatePicker("select_birthday".localized, selection: $birthday, displayedComponents: .date) .datePickerStyle(CompactDatePickerStyle()) .focused($focusedField, equals: .birthday) } // Note VStack(alignment: .leading, spacing: 8) { HStack { Text("note".localized) .font(.subheadline) .foregroundColor(.primary) Spacer() } TextField("note_info".localized, text: $note) .textFieldStyle(RoundedBorderTextFieldStyle()) .focused($focusedField, equals: .note) } } .toolbar { ToolbarItemGroup(placement: .keyboard) { Spacer() Button("done".localized) { focusedField = nil } .foregroundColor(.blue) .font(.system(size: 16, weight: .medium)) } } } } #Preview { ContactInputView( firstName: .constant(""), lastName: .constant(""), phone: .constant(""), email: .constant(""), company: .constant(""), title: .constant(""), address: .constant(""), website: .constant(""), nickname: .constant(""), birthday: .constant(Date()), note: .constant("") ) }