feat(creator): 팬Talk 쓰기 화면을 연결한다

This commit is contained in:
Yu Sung
2026-07-06 22:54:20 +09:00
parent d129583d3b
commit 9c4c304fc6
11 changed files with 716 additions and 10 deletions

View File

@@ -0,0 +1,90 @@
import SwiftUI
struct SodaV2ActionModalButton {
let label: String?
let action: (() -> Void)?
}
struct SodaV2ActionModal: View {
let title: String
let message: String
let button1: SodaV2ActionModalButton?
let button2: SodaV2ActionModalButton?
let onDimmedTap: () -> Void
private var visibleButtons: [(label: String, action: () -> Void, isPrimary: Bool)] {
var buttons = [(label: String, action: () -> Void, isPrimary: Bool)]()
if let button2,
let label = button2.label,
let action = button2.action {
buttons.append((label, action, false))
}
if let button1,
let label = button1.label,
let action = button1.action {
buttons.append((label, action, true))
}
return buttons
}
var body: some View {
ZStack {
Color.black.opacity(0.6)
.ignoresSafeArea()
.onTapGesture(perform: onDimmedTap)
VStack(spacing: 0) {
Text(title)
.appFont(size: 20, weight: .bold)
.foregroundColor(Color.white)
.multilineTextAlignment(.center)
.frame(width: 340, height: 64)
Text(message)
.appFont(size: 16, weight: .regular)
.foregroundColor(Color.white)
.multilineTextAlignment(.center)
.padding(20)
.frame(width: 340)
buttonArea
.padding(.horizontal, 20)
.padding(.vertical, 14)
.frame(width: 340)
}
.background(Color.gray900)
.cornerRadius(14)
}
}
@ViewBuilder
private var buttonArea: some View {
let buttons = visibleButtons
if buttons.count == 1, let button = buttons.first {
actionButton(title: button.label, isPrimary: true, action: button.action)
} else if buttons.count == 2 {
HStack(spacing: 8) {
ForEach(Array(buttons.enumerated()), id: \.offset) { _, button in
actionButton(title: button.label, isPrimary: button.isPrimary, action: button.action)
}
}
}
}
private func actionButton(title: String, isPrimary: Bool, action: @escaping () -> Void) -> some View {
Button(action: action) {
Text(title)
.appFont(size: 18, weight: .medium)
.foregroundColor(isPrimary ? Color.soda400 : Color.white)
.frame(maxWidth: .infinity)
.padding(14)
.background(Color.clear)
.cornerRadius(100)
}
.buttonStyle(.plain)
}
}