и комментарии покрасивее ибо кошмар какое уродство было

This commit is contained in:
Lain Iwakura 2025-08-07 13:36:57 +03:00
parent 0a7c561387
commit 08119cd209
No known key found for this signature in database
GPG Key ID: C7C18257F2ADC6F8
2 changed files with 214 additions and 107 deletions

View File

@ -11,77 +11,120 @@ struct AddCommentView: View {
@State private var isLoading = false @State private var isLoading = false
@State private var errorMessage: String? @State private var errorMessage: String?
@State private var showingSuccess = false @State private var showingSuccess = false
@FocusState private var isTextFocused: Bool
var body: some View { var body: some View {
NavigationView { NavigationView {
Form { VStack(spacing: 0) {
Section { VStack(spacing: 16) {
TextField("Текст комментария", text: $text) VStack(alignment: .leading, spacing: 8) {
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(minHeight: 100)
}
.ignoresSafeArea(.keyboard, edges: .bottom)
Section {
if !settings.passcode.isEmpty {
HStack { HStack {
Image(systemName: "checkmark.circle.fill") Text("Комментарий")
.foregroundColor(.green) .font(.headline)
Text("Passcode настроен") .foregroundColor(.primary)
.foregroundColor(.green) Spacer()
Text("\(text.count)")
.font(.caption)
.foregroundColor(.secondary)
} }
} else {
TextEditor(text: $text)
.focused($isTextFocused)
.frame(minHeight: 120)
.padding(12)
.background(Color(.secondarySystemBackground))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(isTextFocused ? Color.accentColor : Color.clear, lineWidth: 2)
)
.overlay(
Group {
if text.isEmpty {
HStack {
VStack {
Text("Напишите ваш комментарий...")
.foregroundColor(.secondary)
.padding(.top, 20)
.padding(.leading, 16)
Spacer()
}
Spacer()
}
}
}
)
}
HStack(spacing: 8) {
Image(systemName: settings.passcode.isEmpty ? "exclamationmark.triangle.fill" : "checkmark.circle.fill")
.foregroundColor(settings.passcode.isEmpty ? .orange : .green)
Text(settings.passcode.isEmpty ? "Passcode не настроен" : "Passcode настроен")
.font(.caption)
.foregroundColor(settings.passcode.isEmpty ? .orange : .green)
Spacer()
}
.padding(.horizontal, 4)
if let error = errorMessage {
HStack { HStack {
Image(systemName: "exclamationmark.triangle.fill") Image(systemName: "xmark.circle.fill")
.foregroundColor(.orange) .foregroundColor(.red)
VStack(alignment: .leading) { Text(error)
Text("Passcode не настроен") .font(.caption)
.foregroundColor(.orange) .foregroundColor(.red)
Text("Постинг может быть ограничен") Spacer()
.font(.caption) }
.foregroundColor(.secondary) .padding(.horizontal, 4)
}
}
.padding(.horizontal, 20)
.padding(.top, 20)
Spacer()
VStack(spacing: 12) {
Button(action: addComment) {
HStack {
if isLoading {
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: .white))
.scaleEffect(0.8)
} else {
Image(systemName: "plus.circle.fill")
} }
Text(isLoading ? "Отправка..." : "Добавить комментарий")
} }
.frame(maxWidth: .infinity)
.frame(height: 50)
.background(text.isEmpty || isLoading ? Color.gray : Color.accentColor)
.foregroundColor(.white)
.cornerRadius(25)
.animation(.easeInOut(duration: 0.2), value: text.isEmpty)
} }
} .disabled(text.isEmpty || isLoading)
if let error = errorMessage { Button("Отмена") {
Section { dismiss()
Text(error)
.foregroundColor(.red)
} }
.foregroundColor(.secondary)
} }
.padding(.horizontal, 20)
.padding(.bottom, 20)
} }
.navigationTitle("Комментарий в тред \(threadId)") .navigationTitle("Тред \(threadId)")
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(false) .onAppear {
.navigationBarItems( isTextFocused = true
leading: Button("Отмена") {
dismiss()
},
trailing: Button("Добавить") {
addComment()
}
.disabled(text.isEmpty || isLoading)
)
.overlay {
if isLoading {
VStack {
ProgressView()
.progressViewStyle(CircularProgressViewStyle())
Text("Добавление комментария...")
.foregroundColor(.secondary)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(.systemBackground))
}
} }
.alert("Комментарий добавлен", isPresented: $showingSuccess) { .alert("Успешно!", isPresented: $showingSuccess) {
Button("OK") { Button("OK") {
dismiss() dismiss()
} }
} message: { } message: {
Text("Комментарий успешно добавлен") Text("Комментарий добавлен")
} }
} }
} }

View File

@ -11,79 +11,143 @@ struct CreateThreadView: View {
@State private var isLoading = false @State private var isLoading = false
@State private var errorMessage: String? @State private var errorMessage: String?
@State private var showingSuccess = false @State private var showingSuccess = false
@FocusState private var titleFocused: Bool
@FocusState private var textFocused: Bool
var body: some View { var body: some View {
NavigationView { NavigationView {
Form { VStack(spacing: 0) {
Section { ScrollView {
TextField("Заголовок треда", text: $title) VStack(spacing: 20) {
.textFieldStyle(RoundedBorderTextFieldStyle()) VStack(alignment: .leading, spacing: 8) {
HStack {
TextField("Текст треда", text: $text) Text("Заголовок")
.textFieldStyle(RoundedBorderTextFieldStyle()) .font(.headline)
.frame(minHeight: 100) .foregroundColor(.primary)
} Spacer()
.ignoresSafeArea(.keyboard, edges: .bottom) Text("\(title.count)")
Section {
if !settings.passcode.isEmpty {
HStack {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)
Text("Passcode настроен")
.foregroundColor(.green)
}
} else {
HStack {
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(.orange)
VStack(alignment: .leading) {
Text("Passcode не настроен")
.foregroundColor(.orange)
Text("Постинг может быть ограничен")
.font(.caption) .font(.caption)
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
TextField("Введите заголовок треда", text: $title)
.focused($titleFocused)
.padding(16)
.background(Color(.secondarySystemBackground))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(titleFocused ? Color.accentColor : Color.clear, lineWidth: 2)
)
}
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("Содержание")
.font(.headline)
.foregroundColor(.primary)
Spacer()
Text("\(text.count)")
.font(.caption)
.foregroundColor(.secondary)
}
TextEditor(text: $text)
.focused($textFocused)
.frame(minHeight: 140)
.padding(12)
.background(Color(.secondarySystemBackground))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(textFocused ? Color.accentColor : Color.clear, lineWidth: 2)
)
.overlay(
Group {
if text.isEmpty {
HStack {
VStack {
Text("Напишите содержание треда...")
.foregroundColor(.secondary)
.padding(.top, 20)
.padding(.leading, 16)
Spacer()
}
Spacer()
}
}
}
)
}
HStack(spacing: 8) {
Image(systemName: settings.passcode.isEmpty ? "exclamationmark.triangle.fill" : "checkmark.circle.fill")
.foregroundColor(settings.passcode.isEmpty ? .orange : .green)
Text(settings.passcode.isEmpty ? "Passcode не настроен" : "Passcode настроен")
.font(.caption)
.foregroundColor(settings.passcode.isEmpty ? .orange : .green)
Spacer()
}
.padding(.horizontal, 4)
if let error = errorMessage {
HStack {
Image(systemName: "xmark.circle.fill")
.foregroundColor(.red)
Text(error)
.font(.caption)
.foregroundColor(.red)
Spacer()
}
.padding(.horizontal, 4)
} }
} }
.padding(.horizontal, 20)
.padding(.top, 20)
} }
if let error = errorMessage { VStack(spacing: 12) {
Section { Button(action: createThread) {
Text(error) HStack {
.foregroundColor(.red) if isLoading {
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: .white))
.scaleEffect(0.8)
} else {
Image(systemName: "plus.circle.fill")
}
Text(isLoading ? "Создание..." : "Создать тред")
}
.frame(maxWidth: .infinity)
.frame(height: 50)
.background(title.isEmpty || text.isEmpty || isLoading ? Color.gray : Color.accentColor)
.foregroundColor(.white)
.cornerRadius(25)
.animation(.easeInOut(duration: 0.2), value: title.isEmpty || text.isEmpty)
} }
.disabled(title.isEmpty || text.isEmpty || isLoading)
Button("Отмена") {
dismiss()
}
.foregroundColor(.secondary)
} }
.padding(.horizontal, 20)
.padding(.bottom, 20)
} }
.navigationTitle("Создать тред /\(boardCode)/") .navigationTitle("/\(boardCode)/")
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.navigationBarItems( .onAppear {
leading: Button("Отмена") { titleFocused = true
dismiss()
},
trailing: Button("Создать") {
createThread()
}
.disabled(title.isEmpty || text.isEmpty || isLoading)
)
.overlay {
if isLoading {
VStack {
ProgressView()
.progressViewStyle(CircularProgressViewStyle())
Text("Создание треда...")
.foregroundColor(.secondary)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(.systemBackground))
}
} }
.alert("Тред создан", isPresented: $showingSuccess) { .alert("Успешно!", isPresented: $showingSuccess) {
Button("OK") { Button("OK") {
dismiss() dismiss()
} }
} message: { } message: {
Text("Тред успешно создан") Text("Тред создан")
} }
} }
} }