Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

πŸ”€ :: [#63] λ°•λžŒνšŒ 생성 퍼블리싱 #65

Merged
merged 1 commit into from
Nov 15, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
//
// ExpoApplicationView.swift
// Expo-iOS
//
// Created by μ„œμ§€μ™„ on 11/15/24.
// Copyright Β© 2024 SchoolofCompany. All rights reserved.
//

import SwiftUI

struct ExpoApplicationView: View {
@Environment(\.dismiss) var dismiss
@State private var titleTextField: String = ""
@State private var descriptionTextField: String = ""
@State private var locationTextField: String = ""
@State private var locationDetailTextField: String = ""
@State private var date: [String] = ["", ""]
@State private var trainingCount: [String] = [""]
@State private var selectedImage: UIImage? = nil
@State private var isImagePickerPresented = false

var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 0) {
Text("사진")
.expoFont(.body2B)
.padding(.leading, 14)
.padding(.top, 20)
Button {
isImagePickerPresented.toggle()
} label: {
ZStack {
ExpoIOSAsset.Assets.photoget.swiftUIImage
.resizable()
.frame(maxWidth: .infinity, maxHeight: 185, alignment: .center)
.padding(.top, 8)
.padding(.horizontal, 15)

selectedImage.map { image in
Image(uiImage: image)
.resizable()

.frame(height: 173)
.cornerRadius(6)
.padding(.horizontal, 18)
}
.padding(.top, 7.5)
}
}

HStack(spacing: 6) {
ExpoIOSAsset.Assets.warning.swiftUIImage

Text("이미지 343 Γ— 178 μ‚¬μ΄μ¦ˆλ‘œ λ“±λ‘ν•΄μ£Όμ„Έμš”.")
.expoFont(.caption2R)
.expoColor(ExpoColor.gray300)
}
.padding(.leading, 15)
.padding(.top, 6)

ExpoTextField(
"제λͺ©μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”.",
text: $titleTextField,
title: "제λͺ©"
)
.onChange(of: titleTextField) { newValue in
if newValue.count > 30 {
titleTextField = String(newValue.prefix(30))
}
}
.padding(.top, 28)

HStack {
Spacer()
Text("\(titleTextField.count)/30")
.padding(.trailing, 16)
.padding(.top, 6)
.expoFont(.caption2R)
.expoColor(ExpoColor.main)
}

HStack(spacing: -10) {
ExpoTextField(
"μ‹œμž‘μΌ",
text: $date[0],
title: "λͺ¨μ§‘κΈ°κ°„"
)
.onChange(of: date[0]) { newValue in
date[0] = formatDateInput(newValue)
}

ExpoTextField(
"마감일",
text: $date[1]
)
.padding(.top, 30)
.frame(width: 210)
.onChange(of: date[1]) { newValue in
date[1] = formatDateInput(newValue)
}
}

HStack(spacing: 6) {
ExpoIOSAsset.Assets.warning.swiftUIImage

Text("μ‹œμž‘μΌκ³Ό 마감일 μž…λ ₯μ‹œ β€˜ yyyy.mm.dd β€˜ ν˜•μ‹μœΌλ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”")
.expoFont(.caption2R)
.expoColor(ExpoColor.gray300)
}
.padding(.leading, 15)
.padding(.top, 6)

ExpoTextEditor(
"μ†Œκ°œκΈ€μ„ μž‘μ„±ν•΄μ£Όμ„Έμš”.",
text: $descriptionTextField,
title: "μ†Œκ°œκΈ€"
)
.onChange(of: descriptionTextField) { newValue in
if newValue.count > 1000 {
descriptionTextField = String(newValue.prefix(1000))
}
}
.padding(.top, 28)

HStack {
Spacer()
Text("\(descriptionTextField.count)/1000")
.padding(.trailing, 16)
.padding(.top, 6)
.expoFont(.caption2R)
.expoColor(ExpoColor.main)
}

Text("μ—°μˆ˜ μ’…λ₯˜")
.expoFont(.body2B)
.padding(.leading, 14)
.padding(.top, 28)
.padding(.bottom, 8)

VStack(spacing: 0) {
ForEach(trainingCount.indices, id: \.self) { index in
HStack(spacing: 0) {
Text("\(index + 1)")
.padding(.leading, 32)
.expoColor(ExpoColor.gray500)

TextField("μ—°μˆ˜λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.", text: $trainingCount[index])
.padding(.leading, 12)

Spacer()

Button {
if trainingCount.count > 1 {
trainingCount.remove(at: index)
}
} label: {
ExpoIOSAsset.Assets.grayXButton.swiftUIImage
.padding(.trailing, 32)
}
}
.expoFont(.body2R)
.padding(.bottom, 34)
}

Button {
trainingCount.append("")
} label: {
HStack(spacing: 8) {
ExpoIOSAsset.Assets.plusBlue.swiftUIImage
Text("μΆ”κ°€ν•˜κΈ°")
.expoFont(.caption1B)
.expoColor(ExpoColor.main300)
}
.padding(.bottom, 26)
}
}
.padding(.top, 26)
.overlay {
RoundedRectangle(cornerRadius: 8)
.strokeBorder(ExpoColor.gray300.swiftUIColor)
.padding(.horizontal, 16)

}

Text("μž₯μ†Œ")
.expoFont(.body2B)
.padding(.leading, 14)
.padding(.top, 28)
.padding(.bottom, 8)


ExpoTextField(
"μž₯μ†Œλ₯Ό μ•Œλ €μ£Όμ„Έμš”.",
text: $locationTextField
)
.overlay(
HStack(spacing: 0) {
Spacer()
Button {
/// Action / Daum μœ„μΉ˜μ°ΎκΈ°
} label: {
ExpoIOSAsset.Assets.location.swiftUIImage
.padding(.trailing, 34)
}
}
)

ExpoTextField(
"μƒμ„Έμ£Όμ†Œλ₯Ό μ•Œλ €μ£Όμ„Έμš”.",
text: $locationDetailTextField
)
.padding(.top, 8)

HStack(spacing: 0) {
Spacer()
ExpoButton(
text: "μˆ˜μ • μ™„λ£Œ",
horizontalPadding: 156,
verticalPadding: 14,
backColor: ExpoColor.main.swiftUIColor,
actionColor: ExpoColor.main300.swiftUIColor
)
.padding(.top, 24)
.disabled(!isFormValid)

Spacer()
}

Spacer()
}
.sheet(isPresented: $isImagePickerPresented) {
ImagePicker(selectedImage: $selectedImage)
}
}
}

private var isFormValid: Bool {
return !titleTextField.isEmpty &&
!descriptionTextField.isEmpty &&
!locationTextField.isEmpty &&
!locationDetailTextField.isEmpty &&
date.allSatisfy { $0.count == 10 } &&
selectedImage != nil
}
}

#Preview {
ExpoApplicationView()
}
Loading