Readme
This commit is contained in:
@@ -198,6 +198,7 @@ struct UserProfileView: View {
|
||||
let cleanEmail = email.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
let normalizedPhone = normalizePhoneNumberForAPI(phone)
|
||||
let cleanPhoto = profilePicture.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
let newPhoto = cleanPhoto.hasPrefix("data:") ? cleanPhoto : nil
|
||||
|
||||
isSaving = true
|
||||
defer { isSaving = false }
|
||||
@@ -207,7 +208,7 @@ struct UserProfileView: View {
|
||||
name: cleanName,
|
||||
email: cleanEmail,
|
||||
phoneNumber: normalizedPhone,
|
||||
profilePicture: cleanPhoto.isEmpty ? nil : cleanPhoto
|
||||
profilePicture: newPhoto
|
||||
)
|
||||
|
||||
if response.error {
|
||||
@@ -231,10 +232,26 @@ struct UserProfileView: View {
|
||||
|
||||
let cleanCpf = cpf.filter(\.isNumber)
|
||||
if cleanCpf.count == 11 {
|
||||
appState.profile.cpf = cleanCpf
|
||||
Task<Void, Never> {
|
||||
do { _ = try await ApiService().updateProfileCpf(cpf: cleanCpf) } catch {}
|
||||
guard isValidCPF(cleanCpf) else {
|
||||
SnackbarCenter.shared.show(
|
||||
title: "CPF inválido. Verifique e tente novamente.",
|
||||
style: .error,
|
||||
icon: "xmark.octagon.fill",
|
||||
duration: 3.0
|
||||
)
|
||||
return
|
||||
}
|
||||
let cpfResponse = try await ApiService().updateProfileCpf(cpf: cleanCpf)
|
||||
if cpfResponse.error {
|
||||
SnackbarCenter.shared.show(
|
||||
title: cpfResponse.message ?? "Não foi possível atualizar o CPF.",
|
||||
style: .error,
|
||||
icon: "xmark.octagon.fill",
|
||||
duration: 3.0
|
||||
)
|
||||
return
|
||||
}
|
||||
appState.profile.cpf = cleanCpf
|
||||
}
|
||||
SessionStateStore.setActiveUserKey(
|
||||
SessionStateStore.makeUserKey(profileId: appState.profile.id, email: appState.profile.email)
|
||||
@@ -291,6 +308,20 @@ struct UserProfileView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func isValidCPF(_ digits: String) -> Bool {
|
||||
guard digits.count == 11, digits.unicodeScalars.allSatisfy({ CharacterSet.decimalDigits.contains($0) }) else { return false }
|
||||
guard Set(digits).count > 1 else { return false }
|
||||
func checkDigit(_ d: String, _ length: Int) -> Bool {
|
||||
let sum = d.prefix(length).enumerated().reduce(0) { acc, pair in
|
||||
acc + (Int(String(pair.element)) ?? 0) * (length + 1 - pair.offset)
|
||||
}
|
||||
let rem = (sum * 10) % 11
|
||||
let expected = rem == 10 ? 0 : rem
|
||||
return Int(String(d[d.index(d.startIndex, offsetBy: length)])) == expected
|
||||
}
|
||||
return checkDigit(digits, 9) && checkDigit(digits, 10)
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
@MainActor
|
||||
private func applySelectedPhoto(_ item: PhotosPickerItem?) async {
|
||||
|
||||
Reference in New Issue
Block a user