и комментарии покрасивее ибо кошмар какое уродство было
This commit is contained in:
parent
0a7c561387
commit
08119cd209
@ -11,77 +11,120 @@ struct AddCommentView: View {
|
||||
@State private var isLoading = false
|
||||
@State private var errorMessage: String?
|
||||
@State private var showingSuccess = false
|
||||
@FocusState private var isTextFocused: Bool
|
||||
|
||||
var body: some View {
|
||||
NavigationView {
|
||||
Form {
|
||||
Section {
|
||||
TextField("Текст комментария", text: $text)
|
||||
.textFieldStyle(RoundedBorderTextFieldStyle())
|
||||
.frame(minHeight: 100)
|
||||
}
|
||||
.ignoresSafeArea(.keyboard, edges: .bottom)
|
||||
|
||||
Section {
|
||||
if !settings.passcode.isEmpty {
|
||||
VStack(spacing: 0) {
|
||||
VStack(spacing: 16) {
|
||||
VStack(alignment: .leading, spacing: 8) {
|
||||
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("Постинг может быть ограничен")
|
||||
Text("Комментарий")
|
||||
.font(.headline)
|
||||
.foregroundColor(.primary)
|
||||
Spacer()
|
||||
Text("\(text.count)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
|
||||
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 {
|
||||
Section {
|
||||
Text(error)
|
||||
HStack {
|
||||
Image(systemName: "xmark.circle.fill")
|
||||
.foregroundColor(.red)
|
||||
Text(error)
|
||||
.font(.caption)
|
||||
.foregroundColor(.red)
|
||||
Spacer()
|
||||
}
|
||||
.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")
|
||||
}
|
||||
.navigationTitle("Комментарий в тред \(threadId)")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.navigationBarBackButtonHidden(false)
|
||||
.navigationBarItems(
|
||||
leading: Button("Отмена") {
|
||||
dismiss()
|
||||
},
|
||||
trailing: Button("Добавить") {
|
||||
addComment()
|
||||
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)
|
||||
)
|
||||
.overlay {
|
||||
if isLoading {
|
||||
VStack {
|
||||
ProgressView()
|
||||
.progressViewStyle(CircularProgressViewStyle())
|
||||
Text("Добавление комментария...")
|
||||
|
||||
Button("Отмена") {
|
||||
dismiss()
|
||||
}
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.background(Color(.systemBackground))
|
||||
.padding(.horizontal, 20)
|
||||
.padding(.bottom, 20)
|
||||
}
|
||||
.navigationTitle("Тред \(threadId)")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.onAppear {
|
||||
isTextFocused = true
|
||||
}
|
||||
.alert("Комментарий добавлен", isPresented: $showingSuccess) {
|
||||
.alert("Успешно!", isPresented: $showingSuccess) {
|
||||
Button("OK") {
|
||||
dismiss()
|
||||
}
|
||||
} message: {
|
||||
Text("Комментарий успешно добавлен")
|
||||
Text("Комментарий добавлен")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,79 +11,143 @@ struct CreateThreadView: View {
|
||||
@State private var isLoading = false
|
||||
@State private var errorMessage: String?
|
||||
@State private var showingSuccess = false
|
||||
@FocusState private var titleFocused: Bool
|
||||
@FocusState private var textFocused: Bool
|
||||
|
||||
var body: some View {
|
||||
NavigationView {
|
||||
Form {
|
||||
Section {
|
||||
TextField("Заголовок треда", text: $title)
|
||||
.textFieldStyle(RoundedBorderTextFieldStyle())
|
||||
|
||||
TextField("Текст треда", text: $text)
|
||||
.textFieldStyle(RoundedBorderTextFieldStyle())
|
||||
.frame(minHeight: 100)
|
||||
}
|
||||
.ignoresSafeArea(.keyboard, edges: .bottom)
|
||||
|
||||
Section {
|
||||
if !settings.passcode.isEmpty {
|
||||
VStack(spacing: 0) {
|
||||
ScrollView {
|
||||
VStack(spacing: 20) {
|
||||
VStack(alignment: .leading, spacing: 8) {
|
||||
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("Постинг может быть ограничен")
|
||||
Text("Заголовок")
|
||||
.font(.headline)
|
||||
.foregroundColor(.primary)
|
||||
Spacer()
|
||||
Text("\(title.count)")
|
||||
.font(.caption)
|
||||
.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)
|
||||
)
|
||||
}
|
||||
|
||||
if let error = errorMessage {
|
||||
Section {
|
||||
Text(error)
|
||||
.foregroundColor(.red)
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("Создать тред /\(boardCode)/")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.navigationBarItems(
|
||||
leading: Button("Отмена") {
|
||||
dismiss()
|
||||
},
|
||||
trailing: Button("Создать") {
|
||||
createThread()
|
||||
}
|
||||
.disabled(title.isEmpty || text.isEmpty || isLoading)
|
||||
)
|
||||
.overlay {
|
||||
if isLoading {
|
||||
VStack {
|
||||
ProgressView()
|
||||
.progressViewStyle(CircularProgressViewStyle())
|
||||
Text("Создание треда...")
|
||||
VStack(alignment: .leading, spacing: 8) {
|
||||
HStack {
|
||||
Text("Содержание")
|
||||
.font(.headline)
|
||||
.foregroundColor(.primary)
|
||||
Spacer()
|
||||
Text("\(text.count)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.background(Color(.systemBackground))
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
.alert("Тред создан", isPresented: $showingSuccess) {
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
VStack(spacing: 12) {
|
||||
Button(action: createThread) {
|
||||
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(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)/")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.onAppear {
|
||||
titleFocused = true
|
||||
}
|
||||
.alert("Успешно!", isPresented: $showingSuccess) {
|
||||
Button("OK") {
|
||||
dismiss()
|
||||
}
|
||||
} message: {
|
||||
Text("Тред успешно создан")
|
||||
Text("Тред создан")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user