|
|
import SwiftUI
|
|
|
|
|
|
// MARK: - 社交平台输入组件
|
|
|
struct SocialInputView: View {
|
|
|
@Binding var username: String
|
|
|
@Binding var message: String
|
|
|
let platform: SocialPlatform
|
|
|
@FocusState var focusedField: SocialField?
|
|
|
|
|
|
// 社交平台枚举
|
|
|
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 "用户名或链接"
|
|
|
case .facebook: return "用户名或链接"
|
|
|
case .twitter: return "用户名"
|
|
|
case .tiktok: return "用户名"
|
|
|
case .snapchat: return "用户名"
|
|
|
case .whatsapp: return "输入WhatsApp电话号码"
|
|
|
case .viber: return "电话号码"
|
|
|
case .spotify: return "歌曲或播放列表链接"
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var hint: String {
|
|
|
switch self {
|
|
|
case .instagram: return "输入Instagram用户名"
|
|
|
case .facebook: return "输入Facebook用户ID或链接"
|
|
|
case .twitter: return "输入X用户名或完整链接"
|
|
|
case .tiktok: return "输入TikTok用户名或完整链接"
|
|
|
case .snapchat: return "输入Snapchat用户名"
|
|
|
case .whatsapp: return "输入WhatsApp消息内容"
|
|
|
case .viber: return "输入Viber电话号码"
|
|
|
case .spotify: return "输入Spotify歌曲或播放列表链接"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 社交字段枚举
|
|
|
enum SocialField: Hashable {
|
|
|
case username, message
|
|
|
}
|
|
|
|
|
|
var body: some View {
|
|
|
VStack(spacing: 16) {
|
|
|
// 平台信息
|
|
|
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))
|
|
|
)
|
|
|
|
|
|
// 用户名/链接 (必填)
|
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
|
HStack {
|
|
|
// 根据平台显示不同的提示
|
|
|
Text(getInputLabel())
|
|
|
.font(.subheadline)
|
|
|
.foregroundColor(.primary)
|
|
|
Text("*")
|
|
|
.foregroundColor(.red)
|
|
|
Spacer()
|
|
|
}
|
|
|
|
|
|
TextField(platform.placeholder, text: $username)
|
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
|
.autocapitalization(.none)
|
|
|
.focused($focusedField, equals: .username)
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 格式说明
|
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
|
HStack {
|
|
|
Image(systemName: "info.circle")
|
|
|
.font(.caption)
|
|
|
.foregroundColor(.blue)
|
|
|
|
|
|
Text("格式说明")
|
|
|
.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("完成") {
|
|
|
focusedField = nil
|
|
|
}
|
|
|
.foregroundColor(.blue)
|
|
|
.font(.system(size: 16, weight: .medium))
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// MARK: - 根据平台获取输入标签
|
|
|
private func getInputLabel() -> String {
|
|
|
switch platform {
|
|
|
case .instagram:
|
|
|
return "Instagram用户名"
|
|
|
case .facebook:
|
|
|
return "用户ID或链接"
|
|
|
case .twitter:
|
|
|
return "X用户名"
|
|
|
case .tiktok:
|
|
|
return "TikTok用户名"
|
|
|
case .snapchat:
|
|
|
return "Snapchat用户名"
|
|
|
case .whatsapp:
|
|
|
return "WhatsApp电话号码"
|
|
|
case .viber:
|
|
|
return "Viber电话号码"
|
|
|
case .spotify:
|
|
|
return "歌曲链接或ID"
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private func getFormatHint() -> String {
|
|
|
switch platform {
|
|
|
case .instagram:
|
|
|
return "• 输入Instagram用户名\n• 将生成instagram://user?username=用户名格式"
|
|
|
case .facebook:
|
|
|
return "• 输入Facebook用户ID或完整链接\n• 将自动提取用户名并生成fb://profile/格式\n• 支持:username 或 https://facebook.com/username"
|
|
|
case .twitter:
|
|
|
return "• 可以输入用户名(如:username)\n• 将生成twitter://user?screen_name=格式\n• 用户扫描后可直接打开X应用"
|
|
|
case .tiktok:
|
|
|
return "• 输入TikTok用户名(如:username)\n• 将生成https://www.tiktok.com/@username格式\n• 用户扫描后可直接访问TikTok主页"
|
|
|
case .snapchat:
|
|
|
return "• 输入Snapchat用户名\n• 例如:username"
|
|
|
case .whatsapp:
|
|
|
return "• 输入WhatsApp电话号码(如:+1234567890)\n• 将生成whatsapp://send?phone=电话号码格式\n• 用户扫描后可直接打开WhatsApp聊天"
|
|
|
case .viber:
|
|
|
return "• 输入Viber电话号码(如:+1234567890)\n• 将生成viber://add?number=格式\n• 用户扫描后可直接添加Viber联系人"
|
|
|
case .spotify:
|
|
|
return "• 输入歌曲或播放列表链接\n• 或输入Spotify ID"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#Preview {
|
|
|
SocialInputView(
|
|
|
username: .constant(""),
|
|
|
message: .constant(""),
|
|
|
platform: .tiktok
|
|
|
)
|
|
|
}
|