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.

238 lines
8.4 KiB

import SwiftUI
// MARK: - Social Platform Input Component
struct SocialInputView: View {
@Binding var username: String
@Binding var message: String
let platform: SocialPlatform
@FocusState var focusedField: SocialField?
// Social platform enum
enum SocialPlatform: String, CaseIterable {
case instagram = "Instagram"
case facebook = "Facebook"
case twitter = "X"
case tiktok = "Tiktok"
case snapchat = "Snapchat"
case whatsapp = "Whatsapp"
case viber = "Viber"
case spotify = "Spotify"
var displayName: String {
switch self {
case .instagram: return "Instagram"
case .facebook: return "Facebook"
case .twitter: return "X"
case .tiktok: return "TikTok"
case .snapchat: return "Snapchat"
case .whatsapp: return "WhatsApp"
case .viber: return "Viber"
case .spotify: return "Spotify"
}
}
var icon: String {
switch self {
case .instagram: return "camera"
case .facebook: return "person.2"
case .twitter: return "bird"
case .tiktok: return "music.note"
case .snapchat: return "ghost"
case .whatsapp: return "message"
case .viber: return "phone"
case .spotify: return "music.note.list"
}
}
var placeholder: String {
switch self {
case .instagram: return "instagram_placeholder".localized
case .facebook: return "facebook_placeholder".localized
case .twitter: return "twitter_placeholder".localized
case .tiktok: return "tiktok_placeholder".localized
case .snapchat: return "snapchat_placeholder".localized
case .whatsapp: return "whatsapp_placeholder".localized
case .viber: return "viber_placeholder".localized
case .spotify: return "spotify_placeholder".localized
}
}
var hint: String {
switch self {
case .instagram: return "instagram_hint".localized
case .facebook: return "facebook_hint".localized
case .twitter: return "twitter_hint".localized
case .tiktok: return "tiktok_hint".localized
case .snapchat: return "snapchat_hint".localized
case .whatsapp: return "whatsapp_hint".localized
case .viber: return "viber_hint".localized
case .spotify: return "spotify_hint".localized
}
}
}
// Social field enum
enum SocialField: Hashable {
case username, message
}
var body: some View {
VStack(spacing: 16) {
// Platform information
HStack {
Image(systemName: platform.icon)
.font(.title2)
.foregroundColor(.blue)
VStack(alignment: .leading, spacing: 2) {
Text(platform.displayName)
.font(.headline)
.foregroundColor(.primary)
Text(platform.hint)
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
}
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
RoundedRectangle(cornerRadius: 8)
.fill(Color.blue.opacity(0.1))
)
// Input field section
if platform == .spotify {
// Spotify specific: Artist and Song input fields
VStack(alignment: .leading, spacing: 12) {
// Artist input field
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("artist".localized)
.font(.subheadline)
.foregroundColor(.primary)
Text("*")
.foregroundColor(.red)
Spacer()
}
TextField("enter_artist_name".localized, text: $username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.autocapitalization(.none)
.focused($focusedField, equals: .username)
}
// Song input field
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("song_name".localized)
.font(.subheadline)
.foregroundColor(.primary)
Text("*")
.foregroundColor(.red)
Spacer()
}
TextField("enter_song_name".localized, text: $message)
.textFieldStyle(RoundedBorderTextFieldStyle())
.autocapitalization(.none)
.focused($focusedField, equals: .message)
}
}
} else {
// Single input field for other platforms
VStack(alignment: .leading, spacing: 8) {
HStack {
// Display different hints based on platform
Text(getInputLabel())
.font(.subheadline)
.foregroundColor(.primary)
Text("*")
.foregroundColor(.red)
Spacer()
}
TextField(platform.placeholder, text: $username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.autocapitalization(.none)
.focused($focusedField, equals: .username)
}
}
// Format instructions
VStack(alignment: .leading, spacing: 8) {
HStack {
Image(systemName: "info.circle")
.font(.caption)
.foregroundColor(.blue)
Text("format_instructions".localized)
.font(.caption)
.foregroundColor(.primary)
Spacer()
}
Text(getFormatHint())
.font(.caption)
.foregroundColor(.secondary)
.lineLimit(nil)
}
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
RoundedRectangle(cornerRadius: 8)
.fill(Color.blue.opacity(0.1))
)
}
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("done".localized) {
focusedField = nil
}
.foregroundColor(.blue)
.font(.system(size: 16, weight: .medium))
}
}
}
// MARK: - Get input label based on platform
private func getInputLabel() -> String {
switch platform {
case .instagram:
return "instagram_username".localized
case .facebook:
return "user_id_or_link".localized
case .twitter:
return "x_username".localized
case .tiktok:
return "tiktok_username".localized
case .snapchat:
return "snapchat_username".localized
case .whatsapp:
return "whatsapp_phone_number".localized
case .viber:
return "viber_phone_number".localized
case .spotify:
return "song_link_or_id".localized
}
}
private func getFormatHint() -> String {
return "social_format_hint".localized
}
}
#Preview {
SocialInputView(
username: .constant(""),
message: .constant(""),
platform: .tiktok
)
}