You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
11 KiB

import SwiftUI
// MARK: -
struct EmailInputConfig {
let emailAddress: Binding<String>
let emailSubject: Binding<String>
let emailBody: Binding<String>
let emailCc: Binding<String>
let emailBcc: Binding<String>
}
// MARK: - WiFi
struct WiFiInputConfig {
let ssid: Binding<String>
let password: Binding<String>
let encryptionType: Binding<WiFiInputView.WiFiEncryptionType>
}
// MARK: -
struct ContactInputConfig {
let firstName: Binding<String>
let lastName: Binding<String>
let phone: Binding<String>
let email: Binding<String>
let company: Binding<String>
let title: Binding<String>
let address: Binding<String>
let website: Binding<String>
let nickname: Binding<String>
let birthday: Binding<Date>
let note: Binding<String>
}
// MARK: -
struct LocationInputConfig {
let latitude: Binding<String>
let longitude: Binding<String>
let locationName: Binding<String>
}
// MARK: -
struct CalendarInputConfig {
let eventTitle: Binding<String>
let eventDescription: Binding<String>
let startDate: Binding<Date>
let endDate: Binding<Date>
let location: Binding<String>
}
// MARK: -
struct SocialInputConfig {
let username: Binding<String>
let message: Binding<String>
}
// MARK: -
struct PhoneInputConfig {
let phoneNumber: Binding<String>
let phoneMessage: Binding<String>
}
// MARK: - URL
struct URLInputConfig {
let url: Binding<String>
}
// MARK: -
struct TextInputConfig {
let content: Binding<String>
}
// MARK: -
struct InputComponentFactory {
//
static func createEmailInput(with config: EmailInputConfig) -> AnyView {
return AnyView(
EmailInputView(
emailAddress: config.emailAddress,
emailSubject: config.emailSubject,
emailBody: config.emailBody,
emailCc: config.emailCc,
emailBcc: config.emailBcc
)
)
}
// WiFi
static func createWiFiInput(with config: WiFiInputConfig) -> AnyView {
return AnyView(
WiFiInputView(
ssid: config.ssid,
password: config.password,
encryptionType: config.encryptionType
)
)
}
//
static func createContactInput(with config: ContactInputConfig) -> AnyView {
return AnyView(
ContactInputView(
firstName: config.firstName,
lastName: config.lastName,
phone: config.phone,
email: config.email,
company: config.company,
title: config.title,
address: config.address,
website: config.website,
nickname: config.nickname,
birthday: config.birthday,
note: config.note
)
)
}
//
static func createLocationInput(with config: LocationInputConfig) -> AnyView {
return AnyView(
LocationInputView(
latitude: config.latitude,
longitude: config.longitude,
locationName: config.locationName
)
)
}
//
static func createCalendarInput(with config: CalendarInputConfig) -> AnyView {
return AnyView(
CalendarInputView(
eventTitle: config.eventTitle,
eventDescription: config.eventDescription,
startDate: config.startDate,
endDate: config.endDate,
location: config.location
)
)
}
//
static func createSocialInput(with config: SocialInputConfig, platform: SocialInputView.SocialPlatform) -> AnyView {
return AnyView(
SocialInputView(
username: config.username,
message: config.message,
platform: platform
)
)
}
//
static func createPhoneInput(with config: PhoneInputConfig, inputType: PhoneInputView.PhoneInputType) -> AnyView {
return AnyView(
PhoneInputView(
phoneNumber: config.phoneNumber,
message: config.phoneMessage,
inputType: inputType
)
)
}
// URL
static func createURLInput(with config: URLInputConfig) -> AnyView {
return AnyView(
URLInputView(
url: config.url
)
)
}
//
static func createTextInput(with config: TextInputConfig, placeholder: String, maxCharacters: Int) -> AnyView {
return AnyView(
TextInputView(
content: config.content,
placeholder: placeholder,
maxCharacters: maxCharacters
)
)
}
// QR - CreateQRCodeView
static func createInputComponent(
for qrCodeType: QRCodeType,
emailConfig: EmailInputConfig? = nil,
wifiConfig: WiFiInputConfig? = nil,
contactConfig: ContactInputConfig? = nil,
locationConfig: LocationInputConfig? = nil,
calendarConfig: CalendarInputConfig? = nil,
socialConfig: SocialInputConfig? = nil,
phoneConfig: PhoneInputConfig? = nil,
urlConfig: URLInputConfig? = nil,
textConfig: TextInputConfig? = nil
) -> AnyView {
switch qrCodeType {
case .mail:
guard let config = emailConfig else {
return AnyView(EmptyView())
}
return createEmailInput(with: config)
case .wifi:
guard let config = wifiConfig else {
return AnyView(EmptyView())
}
return createWiFiInput(with: config)
case .vcard, .mecard:
guard let config = contactConfig else {
return AnyView(EmptyView())
}
return createContactInput(with: config)
case .location:
guard let config = locationConfig else {
return AnyView(EmptyView())
}
return createLocationInput(with: config)
case .calendar:
guard let config = calendarConfig else {
return AnyView(EmptyView())
}
return createCalendarInput(with: config)
case .instagram, .facebook, .twitter, .tiktok, .snapchat, .whatsapp, .viber, .spotify:
guard let config = socialConfig else {
return AnyView(EmptyView())
}
let platform = SocialInputView.SocialPlatform(rawValue: qrCodeType.rawValue.capitalized) ?? .instagram
return createSocialInput(with: config, platform: platform)
case .phone, .sms:
guard let config = phoneConfig else {
return AnyView(EmptyView())
}
let inputType: PhoneInputView.PhoneInputType = qrCodeType == .phone ? .phone : .sms
return createPhoneInput(with: config, inputType: inputType)
case .url:
guard let config = urlConfig else {
return AnyView(EmptyView())
}
return createURLInput(with: config)
default:
guard let config = textConfig else {
return AnyView(EmptyView())
}
return createTextInput(
with: config,
placeholder: getPlaceholderText(for: qrCodeType),
maxCharacters: getMaxCharacters(for: qrCodeType)
)
}
}
//
static func getPlaceholderText(for qrCodeType: QRCodeType) -> String {
switch qrCodeType {
case .text:
return NSLocalizedString("input_any_text_content", comment: "Input any text content")
case .phone:
return NSLocalizedString("input_phone_number", comment: "Input phone number")
case .sms:
return NSLocalizedString("input_sms_content", comment: "Input SMS content")
case .wifi:
return NSLocalizedString("input_wifi_info", comment: "Input WiFi information")
case .vcard:
return NSLocalizedString("input_contact_info", comment: "Input contact information")
case .mecard:
return NSLocalizedString("input_contact_info", comment: "Input contact information")
case .location:
return NSLocalizedString("input_location_info", comment: "Input location information")
case .calendar:
return NSLocalizedString("input_calendar_event_info", comment: "Input calendar event information")
case .instagram:
return NSLocalizedString("input_instagram_username", comment: "Input Instagram username")
case .facebook:
return NSLocalizedString("input_facebook_user_id_or_link", comment: "Input Facebook user ID or link")
case .spotify:
return NSLocalizedString("input_artist_and_song_info", comment: "Input artist and song information")
case .twitter:
return NSLocalizedString("input_x_info", comment: "Input X information")
case .whatsapp:
return NSLocalizedString("input_whatsapp_phone_number", comment: "Input WhatsApp phone number")
case .viber:
return NSLocalizedString("input_viber_phone_number", comment: "Input Viber phone number")
case .snapchat:
return NSLocalizedString("input_snapchat_info", comment: "Input Snapchat information")
case .tiktok:
return NSLocalizedString("input_tiktok_info", comment: "Input TikTok information")
case .mail:
return NSLocalizedString("input_email_content", comment: "Input email content")
case .url:
return NSLocalizedString("input_website_url", comment: "Input website URL")
}
}
//
private static func getMaxCharacters(for qrCodeType: QRCodeType) -> Int {
switch qrCodeType {
case .text:
return 150
case .phone, .sms:
return 100
case .wifi:
return 200
case .vcard, .mecard:
return 500
case .location:
return 200
case .calendar:
return 300
case .instagram, .facebook, .twitter, .tiktok, .snapchat, .whatsapp, .viber, .spotify:
return 200
case .mail:
return 1200
case .url:
return 500
}
}
}