From 69102547535d481f383b61c90d177d389eeb4e40 Mon Sep 17 00:00:00 2001 From: piri Date: Mon, 12 Aug 2024 21:58:46 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Refactor:=20=EA=B8=B0=EB=A1=9D=EC=B0=A8?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EC=A7=80=EC=97=AD=EB=AA=85=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/View/MainView/MainView.swift | 11 +---- .../View/RecordReadView/RecordChartView.swift | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/2024-MC3-Team4-NewT/Source/View/MainView/MainView.swift b/2024-MC3-Team4-NewT/Source/View/MainView/MainView.swift index a2fb902..1e8b9d2 100644 --- a/2024-MC3-Team4-NewT/Source/View/MainView/MainView.swift +++ b/2024-MC3-Team4-NewT/Source/View/MainView/MainView.swift @@ -70,16 +70,7 @@ struct MainView: View { .ignoresSafeArea(edges: .bottom) .onAppear { loadSelectedItem() // 뷰가 나타날 때 UserDefaults에서 선택된 항목을 불러옴 -// for item in chartRow { -// if let aa = item.surfingRecordStartTime { -// print("\(aa):통과") -// } else { -// modelContext.delete(item) -// } -// } - - -// fbo.fetchFirebase(modelContext: modelContext, collectionName: mappedItem, chartRow: chartRow) + } .onChange(of:isLocationChanged){ loadSelectedItem() diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift index b977c77..0b693ba 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift @@ -7,6 +7,10 @@ struct RecordChartView: View { @Query private var surfingRecordOneData: [SurfingRecordOne] @ObservedObject var viewModel = RecordChartViewModel() @State var isLocationSelected = false + private let selectionKey = "selectionKey" + @State private var selectedItem: String = "" + @State private var mappedItem: String = "" + private let defaultItem = "포항 월포해변" var body: some View { NavigationStack { ZStack { @@ -16,7 +20,7 @@ struct RecordChartView: View { VStack(spacing: 0) { NavigationLink(destination: LocationView(isLocationSelected: $isLocationSelected)) { HStack { - Text(viewModel.selectedItem ?? "포항 신항만해변A") + Text(selectedItem) .font(.SubheadingSemiBold) Image(systemName: "chevron.down") Spacer() @@ -45,6 +49,40 @@ struct RecordChartView: View { }.padding(.top, 50) } } + .onAppear{ + aaa() + } + } + func aaa(){ + if let savedItem = UserDefaults.standard.string(forKey: selectionKey) { + let components = savedItem.split(separator: " ", maxSplits: 1) // 첫 번째로만 분리 + if components.count == 2 { + let regionName = String(components[0]) + let itemName = String(components[1]) + + + + selectedItem = itemName + // 매핑된 값이 존재하면 mappedItem에 저장, 그렇지 않으면 빈 문자열로 초기화 + if let mappedValue = beachToEnglishMap["\(itemName)"] { + mappedItem = mappedValue + } else { + mappedItem = "" + } + } + + print("로드:\(selectedItem), 매핑된 값:\(mappedItem)") + } else { + // UserDefaults에 값이 없으면 기본값 설정 + selectedItem = defaultItem + if let defaultMappedValue = beachToEnglishMap[defaultItem] { + mappedItem = defaultMappedValue + } else { + mappedItem = "" + } + UserDefaults.standard.set(defaultItem, forKey: selectionKey) // 기본값을 UserDefaults에 저장 + + } } } From e160483519f1b5a0bca331c7416f84f95792df1d Mon Sep 17 00:00:00 2001 From: piri Date: Tue, 13 Aug 2024 01:35:45 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Feat:=20=ED=95=80=EA=B3=A0=EC=A0=95=20?= =?UTF-8?q?=EC=B0=A8=ED=8A=B8=20=EB=93=A4=EC=96=B4=EA=B0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resource/Utils/DateFormatterManager.swift | 3 ++ .../RecordReadView/RecordChartTestView.swift | 47 ++++++++++--------- .../View/RecordReadView/RecordItemView.swift | 29 +++++++++--- .../ViewModel/RecordChartViewModel.swift | 33 ++++++++++++- 4 files changed, 84 insertions(+), 28 deletions(-) diff --git a/2024-MC3-Team4-NewT/Resource/Utils/DateFormatterManager.swift b/2024-MC3-Team4-NewT/Resource/Utils/DateFormatterManager.swift index 6179da3..cbc8a5e 100644 --- a/2024-MC3-Team4-NewT/Resource/Utils/DateFormatterManager.swift +++ b/2024-MC3-Team4-NewT/Resource/Utils/DateFormatterManager.swift @@ -69,4 +69,7 @@ class DateFormatterManager { formatter.locale = Locale(identifier: "ko_kr") return formatter.string(from: date) } + func convertDateToString(date: Date) -> String { + return longDateFormatter.string(from: date) + } } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift index f4b0de7..b553d6b 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift @@ -1,13 +1,13 @@ import Foundation import SwiftUI import SwiftData + struct RecordChartTestView: View { @Query private var surfingRecordOneData: [SurfingRecordOne] @ObservedObject var viewModel: RecordChartViewModel @Query(sort: \ChartRow.time) var chartRow: [ChartRow] var recordOne: SurfingRecordOne @EnvironmentObject var myObject: MyObservableObject - @State private var showAlert = false @State private var selectedItem: ChartRow? var body: some View { @@ -44,20 +44,27 @@ struct RecordChartTestView: View { if viewModel.isPinButton[recordOne.id] == true { Button { selectedItem = row - showAlert = true + viewModel.isChartPinButotn[row.id, default: false].toggle() - // print ("고정 row: \(row.id)") - if (viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3) { - viewModel.isPinCounter += 1 + viewModel.rowTime=row.time + // UserDefaults에 pinTime 저장 + viewModel.confirm(row.time, row.surfingRecordStartTime ?? Date()) + print("isRecord:\(viewModel.isRecord)") + if viewModel.isRecord == false{ + viewModel.showPin = true } - else if (viewModel.isChartPinButotn[row.id] == false) { + viewModel.pinRecord = row.surfingRecordStartTime ?? Date() + if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { + viewModel.isPinCounter += 1 + } else if viewModel.isChartPinButotn[row.id] == false { viewModel.isPinCounter -= 1 viewModel.isChartPinButotn[row.id] = false - } - else { + removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 + } else { viewModel.isChartPinButotn[row.id] = false } + } label: { Image(systemName: "checkmark.circle.fill") .frame(width: 20) @@ -106,23 +113,21 @@ struct RecordChartTestView: View { .onAppear{ print ("****row: \(row.id)") } + } } } } - .alert(isPresented: $showAlert) { - Alert( - title: Text("차트를 고정하시겠습니까?"), - primaryButton: .default(Text("Yes"), action: { - if let item = selectedItem { - myObject.pinChart.append(item) -// DateFormatterManager.shared.dateFromString("1999-11-19 00:00:00") -// try? modelContext.save() - print("Selected index: \(index)") - } - }), - secondaryButton: .cancel(Text("No")) - ) + } + + + + // UserDefaults에서 row.time을 제거하는 함수 + private func removePinTime(_ time: String) { + var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] + if let index = pinTimes.firstIndex(of: time) { + pinTimes.remove(at: index) + UserDefaults.standard.set(pinTimes, forKey: "pinTime") } } } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift index 4323f50..e5dac62 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift @@ -4,10 +4,10 @@ import SwiftData struct RecordItemView: View { var item: SurfingRecordOne @ObservedObject var viewModel: RecordChartViewModel - @Environment(\.modelContext) var modelContext // Access the SwiftData context -// @Query var pinModel:[Pin] - @State private var showDeleteConfirmation = false // State to show the confirmation alert - + @Environment(\.modelContext) var modelContext + @State private var showDeleteConfirmation = false + + var body: some View { ZStack(alignment: .top) { Color.white @@ -97,8 +97,6 @@ struct RecordItemView: View { .foregroundColor(.white) VStack(alignment: .leading, spacing: 0) { Button { - item.charts.first?.isHighTide = true - viewModel.isPinButton[item.id, default: false].toggle() viewModel.isEllipsisOnOff[item.id, default: false].toggle() } label: { @@ -161,6 +159,25 @@ struct RecordItemView: View { secondaryButton: .cancel(Text("취소")) ) } + .alert(isPresented: $viewModel.showPin) { + Alert( + title: Text("차트를 고정하시겠습니까?"), + primaryButton: .default(Text("네")) { + print("test") + viewModel.savePinTime(viewModel.rowTime,viewModel.pinRecord) + }, + secondaryButton: .cancel(Text("취소")) + ) + } + .alert(isPresented: $viewModel.isRecord) { + Alert( + title: Text("이미 등록된 차트입니다."), + dismissButton: .default(Text("취소")) { + print("test") + } + ) + } + } private func deleteRecord(item: SurfingRecordOne) { diff --git a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift index d1d8f9f..452b11a 100644 --- a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift +++ b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift @@ -21,7 +21,10 @@ class RecordChartViewModel: ObservableObject { @Published var selectedItemBackgroundColor: Color = Color("backgroundSkyblue") @Published var selectedItemColor: Color = Color("surfBlue") @Published var isSelectButton: Bool = true - + @Published var showPin = false + @Published var rowTime = "" + @Published var pinRecord = Date() + @Published var isRecord = false func filteredRecordChart(charts: [ChartRow], recordOne: SurfingRecordOne) -> [ChartRow] { var 필터된데이터: [ChartRow] = [] @@ -80,8 +83,36 @@ class RecordChartViewModel: ObservableObject { for key in isEllipsisOnOff.keys { if key != id { isEllipsisOnOff[key] = false + } } isEllipsisOnOff[id, default: false].toggle() + + } + // UserDefaults에 row.time을 추가하는 함수 + func savePinTime(_ time: String,_ date: Date) { + var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] + + var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] + var convertDate = DateFormatterManager.shared.convertDateToString(date: date) + if !pinRecord.contains(convertDate) { + pinRecord.append(convertDate) + UserDefaults.standard.set(pinRecord, forKey: "pinRecord") + print("들어갔음record:\(convertDate)") + pinTimes.append(time) + UserDefaults.standard.set(pinTimes, forKey: "pinTime") + print("들어갔음time:\(time)") + } + + + } + func confirm(_ time: String,_ date: Date){ + var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] + + var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] + var convertDate = DateFormatterManager.shared.convertDateToString(date: date) + if pinRecord.contains(convertDate) { + isRecord = true + } } } From 29abd26344624948d83a01eee662513c771cc0f2 Mon Sep 17 00:00:00 2001 From: piri Date: Tue, 13 Aug 2024 02:08:34 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Feat:=20=ED=95=80=EA=B3=A0=EC=A0=95=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20=EC=9E=88=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20=EC=95=8C=EB=A6=BC=20=EB=82=98=EC=98=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/RecordReadView/ModalView.swift | 2 +- .../RecordReadView/RecordChartTestView.swift | 29 ++++++++++++------- .../View/RecordReadView/RecordItemView.swift | 10 +++++-- .../ViewModel/RecordChartViewModel.swift | 6 ++-- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift index 8f16cb2..bb49ae8 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift @@ -8,7 +8,7 @@ struct ModalView: View { var body: some View { ScrollView{ ForEach(surfingRecordOneData, id: \.id) { item in - if ( item.id == viewModel.isID) { + if ( item.id == viewModel.chartRowId) { VStack(spacing: 0){ HStack{ Text(DateFormatterManager.shared.dateFormatter(from: item.surfingStartTime)) diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift index b553d6b..c21e47b 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift @@ -10,6 +10,7 @@ struct RecordChartTestView: View { @EnvironmentObject var myObject: MyObservableObject @State private var selectedItem: ChartRow? + var body: some View { VStack(spacing: 0) { let data = viewModel.filteredRecordChart(charts: chartRow, recordOne: recordOne) @@ -45,30 +46,36 @@ struct RecordChartTestView: View { Button { selectedItem = row - viewModel.isChartPinButotn[row.id, default: false].toggle() + viewModel.isChartPinButton[row.id, default: false].toggle() viewModel.rowTime=row.time // UserDefaults에 pinTime 저장 + viewModel.pinRecord = row.surfingRecordStartTime ?? Date() viewModel.confirm(row.time, row.surfingRecordStartTime ?? Date()) print("isRecord:\(viewModel.isRecord)") + viewModel.chartRowId = row.id if viewModel.isRecord == false{ viewModel.showPin = true } - viewModel.pinRecord = row.surfingRecordStartTime ?? Date() - if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { - viewModel.isPinCounter += 1 - } else if viewModel.isChartPinButotn[row.id] == false { - viewModel.isPinCounter -= 1 - viewModel.isChartPinButotn[row.id] = false - removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 - } else { - viewModel.isChartPinButotn[row.id] = false + else{ +// viewModel.isChartPinButotn[row.id] = false } +// viewModel.isChartPinButotn[row.id] = false +// if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { +// viewModel.isPinCounter += 1 +// } else if viewModel.isChartPinButotn[row.id] == false { +// viewModel.isPinCounter -= 1 +// viewModel.isChartPinButotn[row.id] = false +// removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 +// } else { +// viewModel.isChartPinButotn[row.id] = false +// } + } label: { Image(systemName: "checkmark.circle.fill") .frame(width: 20) - .foregroundColor(viewModel.isChartPinButotn[row.id] == true ? Color("surfBlue") : Color(.systemGroupedBackground)) + .foregroundColor(viewModel.isChartPinButton[row.id] == true ? Color("surfBlue") : Color(.systemGroupedBackground)) } } Text(DateFormatterManager.shared.timeToHourFormatter(row.time)) diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift index e5dac62..2d9e71a 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift @@ -50,7 +50,7 @@ struct RecordItemView: View { Spacer() if item.memo.isEmpty { Button { - viewModel.isID = item.id + viewModel.chartRowId = item.id // 메모 추가하기 눌렀을 때 보이는 화면 만들어야 함!! } label: { Text("메모 추가하기 ") @@ -64,7 +64,7 @@ struct RecordItemView: View { } else { Button { viewModel.ismemo.toggle() - viewModel.isID = item.id + viewModel.chartRowId = item.id } label: { Text("메모 확인하기 ") .font(.CaptionMedium) @@ -97,6 +97,8 @@ struct RecordItemView: View { .foregroundColor(.white) VStack(alignment: .leading, spacing: 0) { Button { + print("recordId:\(item.id)") + viewModel.recordId = item.id viewModel.isPinButton[item.id, default: false].toggle() viewModel.isEllipsisOnOff[item.id, default: false].toggle() } label: { @@ -174,6 +176,10 @@ struct RecordItemView: View { title: Text("이미 등록된 차트입니다."), dismissButton: .default(Text("취소")) { print("test") + + viewModel.isChartPinButton[viewModel.chartRowId] = false +// viewModel.isEllipsisOnOff[viewModel.recordId] = false + viewModel.isPinButton[viewModel.recordId] = false } ) } diff --git a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift index 452b11a..b9e7e1a 100644 --- a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift +++ b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift @@ -9,11 +9,13 @@ class RecordChartViewModel: ObservableObject { @Published var stopTime = Date() @Published var isEllipsisOnOff: [UUID: Bool] = [:] @Published var ismemo: Bool = false - @Published var isID: UUID = UUID() + @Published var chartRowId: UUID = UUID() @Published var isPinButton: [UUID: Bool] = [:] - @Published var isChartPinButotn: [UUID: Bool] = [:] + @Published var isChartPinButton: [UUID: Bool] = [:] @Published var isMemoCheckingButton: [UUID: Bool] = [:] @Published var isPinCounter: Int = 0 + @Published var recordId = UUID() + /// LotationView 변수 @Published var selectedRegion: Region? = nil From 6873264d3a7451378ca60c48117645cdf7f856fe Mon Sep 17 00:00:00 2001 From: piri Date: Tue, 13 Aug 2024 02:40:49 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Feat:=20=ED=95=80=EA=B3=A0=EC=A0=95=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B3=B4=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/RecordReadView/CategoriesView.swift | 42 ++++++----- .../View/RecordReadView/ModalView.swift | 4 +- .../RecordReadView/RecordChartTestView.swift | 24 +++---- .../View/RecordReadView/RecordChartView.swift | 71 ++++++++++++++----- .../View/RecordReadView/RecordItemView.swift | 11 ++- .../ViewModel/RecordChartViewModel.swift | 11 ++- 6 files changed, 102 insertions(+), 61 deletions(-) diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/CategoriesView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/CategoriesView.swift index 6d649c4..00554fe 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/CategoriesView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/CategoriesView.swift @@ -7,9 +7,11 @@ struct CategoriesView: View { var body: some View { HStack{ - ForEach(0..<5) { index in + Spacer() + .frame(width: 25) + ForEach(0..<2) { index in Button { - viewModel.categories = index + viewModel.categoryIndex = index } label: { if (index == 0){ Text("전체") @@ -17,32 +19,34 @@ struct CategoriesView: View { else if (index == 1){ Text("핀 고정") } - else if (index == 2){ - Text("날짜 선택") - } - else if (index == 3){ - HStack(spacing: 0){ - Text("별점 ") - Image(systemName: "chevron.down") - } - } - else{ - HStack(spacing: 0){ - Text("최신순 ") - Image(systemName: "chevron.down") - } - } +// else if (index == 2){ +// Text("날짜 선택") +// } +// else if (index == 3){ +// HStack(spacing: 0){ +// Text("별점 ") +// Image(systemName: "chevron.down") +// } +// } +// else{ +// HStack(spacing: 0){ +// Text("최신순 ") +// Image(systemName: "chevron.down") +// } +// } }.font(.Body2Medium) - .foregroundColor(viewModel.categories == index ? Color.white : Color.black) + .foregroundColor(viewModel.categoryIndex == index ? Color.white : Color.black) .padding(.horizontal, 10) .padding(.vertical, 6) - .background(viewModel.categories == index ? Color("surfBlue") : Color.white) + .background(viewModel.categoryIndex == index ? Color("surfBlue") : Color.white) .cornerRadius(20) .overlay( RoundedRectangle(cornerRadius: 20) .stroke(Color.black.opacity(0.15), lineWidth: 0.75) ) + } + Spacer() } } } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift index bb49ae8..f20497c 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/ModalView.swift @@ -41,7 +41,7 @@ struct ModalView: View { Text(viewModel.evaluationText(for: item.evaluationValue)) .font(.Body2Medium) .foregroundColor(.black.opacity(0.7)) - + } .padding(5) .background(Color("backgroundSkyblue")) @@ -59,7 +59,7 @@ struct ModalView: View { RecordChartTestView(viewModel: viewModel, recordOne: item) }.padding(.horizontal) -// .overlay(.yellow.opacity(0.3)) + // .overlay(.yellow.opacity(0.3)) .padding(.vertical, 30) } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift index c21e47b..f9fcd03 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift @@ -52,24 +52,24 @@ struct RecordChartTestView: View { viewModel.pinRecord = row.surfingRecordStartTime ?? Date() viewModel.confirm(row.time, row.surfingRecordStartTime ?? Date()) print("isRecord:\(viewModel.isRecord)") - viewModel.chartRowId = row.id + viewModel.chartRowId = row.id if viewModel.isRecord == false{ viewModel.showPin = true } else{ -// viewModel.isChartPinButotn[row.id] = false + // viewModel.isChartPinButotn[row.id] = false } -// viewModel.isChartPinButotn[row.id] = false -// if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { -// viewModel.isPinCounter += 1 -// } else if viewModel.isChartPinButotn[row.id] == false { -// viewModel.isPinCounter -= 1 -// viewModel.isChartPinButotn[row.id] = false -// removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 -// } else { -// viewModel.isChartPinButotn[row.id] = false -// } + // viewModel.isChartPinButotn[row.id] = false + // if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { + // viewModel.isPinCounter += 1 + // } else if viewModel.isChartPinButotn[row.id] == false { + // viewModel.isPinCounter -= 1 + // viewModel.isChartPinButotn[row.id] = false + // removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 + // } else { + // viewModel.isChartPinButotn[row.id] = false + // } } label: { diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift index 0b693ba..8f61306 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift @@ -7,10 +7,13 @@ struct RecordChartView: View { @Query private var surfingRecordOneData: [SurfingRecordOne] @ObservedObject var viewModel = RecordChartViewModel() @State var isLocationSelected = false - private let selectionKey = "selectionKey" + private let selectionKey = "selectionKey" @State private var selectedItem: String = "" @State private var mappedItem: String = "" private let defaultItem = "포항 월포해변" + private let pinRecordKey = "pinRecord" + + var body: some View { NavigationStack { ZStack { @@ -32,35 +35,47 @@ struct RecordChartView: View { CategoriesView(viewModel: viewModel) - Spacer().frame(height: 16) + Spacer() + .frame(height: 16) - ScrollView { - ForEach(surfingRecordOneData, id: \.id) { item in - RecordItemView(item: item, viewModel: viewModel) - .onAppear{ - print("큰 차트 item.id \(item.id)") - } - - + if viewModel.categoryIndex == 0 { + // 카테고리 0에 대한 처리 + ScrollView { + ForEach(surfingRecordOneData, id: \.id) { item in + RecordItemView(item: item, viewModel: viewModel) + .onAppear{ + print("큰 차트 item.id \(item.id)") + } + } + Spacer() + .frame(height: 60) + } + } else if viewModel.categoryIndex == 1 { + // pinRecord에 저장된 값과 일치하는 surfingStartTime을 가진 Record만 표시 + ScrollView { + let pinnedRecords = getPinnedRecords() + ForEach(pinnedRecords, id: \.id) { item in + RecordItemView(item: item, viewModel: viewModel) + } + Spacer() + .frame(height: 60) } - Spacer() - .frame(height: 60) } - }.padding(.top, 50) + } + .padding(.top, 50) } } .onAppear{ aaa() } } + func aaa(){ if let savedItem = UserDefaults.standard.string(forKey: selectionKey) { let components = savedItem.split(separator: " ", maxSplits: 1) // 첫 번째로만 분리 if components.count == 2 { let regionName = String(components[0]) let itemName = String(components[1]) - - selectedItem = itemName // 매핑된 값이 존재하면 mappedItem에 저장, 그렇지 않으면 빈 문자열로 초기화 @@ -81,9 +96,29 @@ struct RecordChartView: View { mappedItem = "" } UserDefaults.standard.set(defaultItem, forKey: selectionKey) // 기본값을 UserDefaults에 저장 - } } -} - + + // UserDefaults에서 pinRecord를 불러와 필터링된 Record 배열 반환 + func getPinnedRecords() -> [SurfingRecordOne] { + guard let pinnedStartTimesStrings = UserDefaults.standard.array(forKey: "pinRecord") as? [String] else { + return [] + } + + let pinnedStartTimes = pinnedStartTimesStrings.compactMap { DateFormatterManager.shared.longDateFormatter.date(from: $0) } + + print("핀시작:\(pinnedStartTimes)") + for item in surfingRecordOneData { + print("데이터:\(item.surfingStartTime)") + } + + let filteredRecords = surfingRecordOneData.filter { item in + pinnedStartTimes.contains { pinnedTime in + DateFormatterManager.shared.longDateFormatter.string(from: pinnedTime) == DateFormatterManager.shared.longDateFormatter.string(from: item.surfingStartTime) + } + } + + return filteredRecords + } +} diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift index 2d9e71a..0d6c5fc 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift @@ -156,7 +156,7 @@ struct RecordItemView: View { Alert( title: Text("기록을 삭제하시겠습니까?"), primaryButton: .destructive(Text("삭제")) { - deleteRecord(item: item) + viewModel.deleteRecord(item: item, modelContext: modelContext) }, secondaryButton: .cancel(Text("취소")) ) @@ -178,16 +178,13 @@ struct RecordItemView: View { print("test") viewModel.isChartPinButton[viewModel.chartRowId] = false -// viewModel.isEllipsisOnOff[viewModel.recordId] = false + // viewModel.isEllipsisOnOff[viewModel.recordId] = false viewModel.isPinButton[viewModel.recordId] = false } ) } - + } - private func deleteRecord(item: SurfingRecordOne) { - modelContext.delete(item) // Delete the SurfingRecordOne object from the context - try? modelContext.save() // Save the context to persist changes - } + } diff --git a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift index b9e7e1a..dff7684 100644 --- a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift +++ b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift @@ -3,7 +3,7 @@ import SwiftData class RecordChartViewModel: ObservableObject { - @Published var categories: Int = 0 + @Published var categoryIndex: Int = 0 @Published var selectedDate = Date() @Published var startTime = Date() @Published var stopTime = Date() @@ -28,6 +28,7 @@ class RecordChartViewModel: ObservableObject { @Published var pinRecord = Date() @Published var isRecord = false + func filteredRecordChart(charts: [ChartRow], recordOne: SurfingRecordOne) -> [ChartRow] { var 필터된데이터: [ChartRow] = [] @@ -94,7 +95,7 @@ class RecordChartViewModel: ObservableObject { // UserDefaults에 row.time을 추가하는 함수 func savePinTime(_ time: String,_ date: Date) { var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] - + var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] var convertDate = DateFormatterManager.shared.convertDateToString(date: date) if !pinRecord.contains(convertDate) { @@ -110,11 +111,15 @@ class RecordChartViewModel: ObservableObject { } func confirm(_ time: String,_ date: Date){ var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] - + var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] var convertDate = DateFormatterManager.shared.convertDateToString(date: date) if pinRecord.contains(convertDate) { isRecord = true } } + func deleteRecord(item: SurfingRecordOne,modelContext:ModelContext) { + modelContext.delete(item) // Delete the SurfingRecordOne object from the context + try? modelContext.save() // Save the context to persist changes + } } From 89e816069f30a9836459d9d19f6f3a5603c8944b Mon Sep 17 00:00:00 2001 From: piri Date: Tue, 13 Aug 2024 03:32:53 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Feat:=20=EC=B0=A8=ED=8A=B8=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2024-MC3-Team4-NewT.xcodeproj/project.pbxproj | 4 + .../RecordReadView/RecordChartTestView.swift | 61 +++---- .../View/RecordReadView/RecordChartView.swift | 2 +- .../View/RecordReadView/RecordItemView.swift | 44 +++-- .../View/RecordReadView/RecordItemView2.swift | 159 ++++++++++++++++++ .../ViewModel/RecordChartViewModel.swift | 107 ++++-------- 6 files changed, 250 insertions(+), 127 deletions(-) create mode 100644 2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView2.swift diff --git a/2024-MC3-Team4-NewT.xcodeproj/project.pbxproj b/2024-MC3-Team4-NewT.xcodeproj/project.pbxproj index d3079ed..7684b45 100644 --- a/2024-MC3-Team4-NewT.xcodeproj/project.pbxproj +++ b/2024-MC3-Team4-NewT.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 21353F612C6786570095CA6D /* BeachMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21353F602C6786570095CA6D /* BeachMapper.swift */; }; 21353F632C6873380095CA6D /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21353F622C6873380095CA6D /* OnboardingView.swift */; }; + 21353F652C6A8A8B0095CA6D /* RecordItemView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21353F642C6A8A8B0095CA6D /* RecordItemView2.swift */; }; 213A4A742C605E3F00786C97 /* RecordReadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213A4A732C605E3F00786C97 /* RecordReadView.swift */; }; 213A4A762C60609600786C97 /* ChartHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213A4A752C60609600786C97 /* ChartHeaderView.swift */; }; 21588AFD2C5C75E6003E3489 /* FirebaseSDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21588AFC2C5C75E6003E3489 /* FirebaseSDView.swift */; }; @@ -76,6 +77,7 @@ /* Begin PBXFileReference section */ 21353F602C6786570095CA6D /* BeachMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeachMapper.swift; sourceTree = ""; }; 21353F622C6873380095CA6D /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = ""; }; + 21353F642C6A8A8B0095CA6D /* RecordItemView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordItemView2.swift; sourceTree = ""; }; 213A4A732C605E3F00786C97 /* RecordReadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordReadView.swift; sourceTree = ""; }; 213A4A752C60609600786C97 /* ChartHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartHeaderView.swift; sourceTree = ""; }; 21588AFC2C5C75E6003E3489 /* FirebaseSDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseSDView.swift; sourceTree = ""; }; @@ -162,6 +164,7 @@ 719EA9CC2C5A56730090BAB5 /* RecordChartView.swift */, 712B07632C631EC8001DC52C /* RecordItemView.swift */, 213A4A732C605E3F00786C97 /* RecordReadView.swift */, + 21353F642C6A8A8B0095CA6D /* RecordItemView2.swift */, ); path = RecordReadView; sourceTree = ""; @@ -493,6 +496,7 @@ 719EA9C52C57729E0090BAB5 /* Font.swift in Sources */, 21588B082C5CC2CA003E3489 /* DateFormatterManager.swift in Sources */, 7159C18E2C60C549007300D6 /* RecordChartViewModel.swift in Sources */, + 21353F652C6A8A8B0095CA6D /* RecordItemView2.swift in Sources */, 21588B142C600CAA003E3489 /* TabBarButton.swift in Sources */, 712B07642C631EC8001DC52C /* RecordItemView.swift in Sources */, 715BA4CC2C6111FF00477938 /* ModalView.swift in Sources */, diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift index f9fcd03..b58adb5 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartTestView.swift @@ -1,7 +1,6 @@ import Foundation import SwiftUI import SwiftData - struct RecordChartTestView: View { @Query private var surfingRecordOneData: [SurfingRecordOne] @ObservedObject var viewModel: RecordChartViewModel @@ -9,8 +8,7 @@ struct RecordChartTestView: View { var recordOne: SurfingRecordOne @EnvironmentObject var myObject: MyObservableObject @State private var selectedItem: ChartRow? - - + @State var kkk = false var body: some View { VStack(spacing: 0) { let data = viewModel.filteredRecordChart(charts: chartRow, recordOne: recordOne) @@ -47,31 +45,14 @@ struct RecordChartTestView: View { selectedItem = row viewModel.isChartPinButton[row.id, default: false].toggle() - viewModel.rowTime=row.time - // UserDefaults에 pinTime 저장 + viewModel.rowTime = row.time viewModel.pinRecord = row.surfingRecordStartTime ?? Date() - viewModel.confirm(row.time, row.surfingRecordStartTime ?? Date()) - print("isRecord:\(viewModel.isRecord)") - viewModel.chartRowId = row.id - if viewModel.isRecord == false{ - viewModel.showPin = true + viewModel.confirmPin(row.time, row.surfingRecordStartTime ?? Date()) + viewModel.isRecord = true + if viewModel.isRecord == false { + kkk = true } - else{ - // viewModel.isChartPinButotn[row.id] = false - } - - // viewModel.isChartPinButotn[row.id] = false - // if viewModel.isChartPinButotn[row.id] == true && viewModel.isPinCounter < 3 { - // viewModel.isPinCounter += 1 - // } else if viewModel.isChartPinButotn[row.id] == false { - // viewModel.isPinCounter -= 1 - // viewModel.isChartPinButotn[row.id] = false - // removePinTime(row.time) // Pin 해제 시 UserDefaults에서 제거 - // } else { - // viewModel.isChartPinButotn[row.id] = false - // } - - + } label: { Image(systemName: "checkmark.circle.fill") .frame(width: 20) @@ -117,24 +98,26 @@ struct RecordChartTestView: View { .padding(.horizontal, 10) } } - .onAppear{ - print ("****row: \(row.id)") - } } } } + } - } - - - - // UserDefaults에서 row.time을 제거하는 함수 - private func removePinTime(_ time: String) { - var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] - if let index = pinTimes.firstIndex(of: time) { - pinTimes.remove(at: index) - UserDefaults.standard.set(pinTimes, forKey: "pinTime") + .alert(isPresented: $kkk) { + Alert( + title: Text("차트를 고정하시겠습니까?"), + primaryButton: .default(Text("네")) { + print("Pin saved.") + viewModel.savePinTime(viewModel.rowTime, viewModel.pinRecord) + viewModel.isChartPinButton[viewModel.chartRowId] = false + viewModel.isPinButton[viewModel.recordId] = false + }, + secondaryButton: .cancel(Text("취소")) + ) } + + } + } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift index 8f61306..5f0f86d 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordChartView.swift @@ -55,7 +55,7 @@ struct RecordChartView: View { ScrollView { let pinnedRecords = getPinnedRecords() ForEach(pinnedRecords, id: \.id) { item in - RecordItemView(item: item, viewModel: viewModel) + RecordItemView2(item: item, viewModel: viewModel) } Spacer() .frame(height: 60) diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift index 0d6c5fc..5650246 100644 --- a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView.swift @@ -98,6 +98,7 @@ struct RecordItemView: View { VStack(alignment: .leading, spacing: 0) { Button { print("recordId:\(item.id)") + print("쇼핀:\(viewModel.showPin)") viewModel.recordId = item.id viewModel.isPinButton[item.id, default: false].toggle() viewModel.isEllipsisOnOff[item.id, default: false].toggle() @@ -128,7 +129,8 @@ struct RecordItemView: View { Divider() Button { - showDeleteConfirmation = true // Show the delete confirmation alert + showDeleteConfirmation = true + deleteRecord(item: item)// Show the delete confirmation alert } label: { HStack { Text("삭제") @@ -156,7 +158,7 @@ struct RecordItemView: View { Alert( title: Text("기록을 삭제하시겠습니까?"), primaryButton: .destructive(Text("삭제")) { - viewModel.deleteRecord(item: item, modelContext: modelContext) + deleteRecord(item: item) }, secondaryButton: .cancel(Text("취소")) ) @@ -165,26 +167,36 @@ struct RecordItemView: View { Alert( title: Text("차트를 고정하시겠습니까?"), primaryButton: .default(Text("네")) { - print("test") - viewModel.savePinTime(viewModel.rowTime,viewModel.pinRecord) - }, - secondaryButton: .cancel(Text("취소")) - ) - } - .alert(isPresented: $viewModel.isRecord) { - Alert( - title: Text("이미 등록된 차트입니다."), - dismissButton: .default(Text("취소")) { - print("test") - + print("Pin saved.") + viewModel.savePinTime(viewModel.rowTime, viewModel.pinRecord) viewModel.isChartPinButton[viewModel.chartRowId] = false - // viewModel.isEllipsisOnOff[viewModel.recordId] = false viewModel.isPinButton[viewModel.recordId] = false - } + }, + secondaryButton: .cancel(Text("취소")) ) } + +// .alert(isPresented: $viewModel.isRecord) { +// Alert( +// title: Text("이미 등록된 차트입니다."), +// dismissButton: .default(Text("취소")) { +// print("test") +// +// viewModel.isChartPinButton[viewModel.chartRowId] = false +// // viewModel.isEllipsisOnOff[viewModel.recordId] = false +// viewModel.isPinButton[viewModel.recordId] = false +// viewModel.showPin = false +// viewModel.isRecord = false +// } +// ) +// } } + // 기록 삭제 함수 + func deleteRecord(item: SurfingRecordOne) { + modelContext.delete(item) + try? modelContext.save() + } } diff --git a/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView2.swift b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView2.swift new file mode 100644 index 0000000..56c6eb9 --- /dev/null +++ b/2024-MC3-Team4-NewT/Source/View/RecordReadView/RecordItemView2.swift @@ -0,0 +1,159 @@ +// +// RecordItemView2.swift +// 2024-MC3-Team4-NewT +// +// Created by ram on 8/13/24. +// +import SwiftUI +import SwiftData + +struct RecordItemView2: View { + var item: SurfingRecordOne + @ObservedObject var viewModel: RecordChartViewModel + @Environment(\.modelContext) var modelContext + @State private var showDeleteConfirmation = false + + var body: some View { + ZStack(alignment: .top) { + Color.white + VStack(spacing: 0) { + VStack { + HStack { + Text(DateFormatterManager.shared.dateFormatter(from: item.surfingStartTime)) + .font(.SubheadingBold) + .foregroundColor(Color("surfBlue")) + Spacer() + Button { + withAnimation { + viewModel.updateEllipsisState(for: item.id) + } + } label: { + Image(systemName: "ellipsis") + .resizable() + .scaledToFit() + .frame(width: 28) + .foregroundColor(.black) + } + } + HStack(spacing: 0) { + HStack(spacing: 0) { + Image(systemName: "star.fill") + .resizable() + .scaledToFit() + .frame(height: 13) + .foregroundColor(Color("surfBlue")) + Text(" \(item.evaluationValue)점, ") + .font(.Body2SemiBold) + .foregroundColor(.black.opacity(0.7)) + Text(viewModel.evaluationText(for: item.evaluationValue)) + .font(.Body2Medium) + .foregroundColor(.black.opacity(0.7)) + } + .padding(5) + .background(.white.opacity(0.6)) + .cornerRadius(12) + Spacer() + if item.memo.isEmpty { + Button { + viewModel.chartRowId = item.id + // 메모 추가하기 눌렀을 때 보이는 화면 만들어야 함!! + } label: { + Text("메모 추가하기 ") + .font(.CaptionMedium) + Image(systemName: "plus") + .resizable() + .scaledToFit() + .frame(height: 12) + } + .foregroundColor(Color.black.opacity(0.5)) + } else { + Button { + viewModel.ismemo.toggle() + viewModel.chartRowId = item.id + } label: { + Text("메모 확인하기 ") + .font(.CaptionMedium) + Image(systemName: "chevron.right") + .resizable() + .scaledToFit() + .frame(height: 12) + } + .foregroundColor(Color.black.opacity(0.8)) + .sheet(isPresented: $viewModel.ismemo) { + ModalView(viewModel: viewModel) + .presentationDetents([.fraction(0.8)]) + } + } + } + } + .padding(.top) + .padding(.bottom) + .padding(.horizontal) + .background(Color("backgroundSkyblue")) + + RecordChartTestView(viewModel: viewModel, recordOne: item) + } + + if viewModel.isEllipsisOnOff[item.id] == true { + HStack { + Spacer() + ZStack { + Rectangle() + .foregroundColor(.white) + VStack(alignment: .leading, spacing: 0) { + Button { + print("recordId:\(item.id)") + removePinRecord(for: item.surfingStartTime) + viewModel.updateEllipsisState(for: item.id) + } label: { + HStack { + Text("핀 고정 제거") + Spacer() + Image(systemName: "pin") + } + .foregroundColor(.black) + .frame(width: 218, height: 44) + .padding(.leading) + } + + Divider() + Button { + // Your edit action here + } label: { + HStack { + Text("수정") + Spacer() + Image(systemName: "pencil") + } + .foregroundColor(.black) + .frame(width: 218, height: 44) + .padding(.leading) + } + + } + } + .frame(width: 250, height: 100) + .cornerRadius(12) + .shadow(radius: 10) + .padding(.top, 47) + .padding(.trailing, 16) + } + } + } + .cornerRadius(24) + .padding(.horizontal) + .padding(.bottom) + + } + + private func removePinRecord(for startTime: Date) { + var pinRecords = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] + let convertDate = DateFormatterManager.shared.convertDateToString(date: startTime) + + if let index = pinRecords.firstIndex(of: convertDate) { + pinRecords.remove(at: index) + UserDefaults.standard.set(pinRecords, forKey: "pinRecord") + print("Removed pin for Date: \(convertDate)") + } + } +} diff --git a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift index dff7684..5cd31a3 100644 --- a/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift +++ b/2024-MC3-Team4-NewT/Source/ViewModel/RecordChartViewModel.swift @@ -1,7 +1,6 @@ import SwiftUI import SwiftData - class RecordChartViewModel: ObservableObject { @Published var categoryIndex: Int = 0 @Published var selectedDate = Date() @@ -16,62 +15,23 @@ class RecordChartViewModel: ObservableObject { @Published var isPinCounter: Int = 0 @Published var recordId = UUID() - - /// LotationView 변수 + // LocationView 관련 변수 @Published var selectedRegion: Region? = nil @Published var selectedItem: String = "포항 신항만해변" @Published var selectedItemBackgroundColor: Color = Color("backgroundSkyblue") - @Published var selectedItemColor: Color = Color("surfBlue") + @Published var selectedItemColor = Color("surfBlue") @Published var isSelectButton: Bool = true @Published var showPin = false @Published var rowTime = "" @Published var pinRecord = Date() @Published var isRecord = false - + // RecordChart에서 필터링된 데이터를 반환하는 함수 func filteredRecordChart(charts: [ChartRow], recordOne: SurfingRecordOne) -> [ChartRow] { - var 필터된데이터: [ChartRow] = [] - - for chartRow in charts { - if let associatedRecord = chartRow.surfingRecordStartTime { - if associatedRecord == recordOne.surfingStartTime { - 필터된데이터.append(chartRow) - } - } - } - - for test in 필터된데이터{ - // print("필터:\(test.time)") - } - // print("필터된 데이터:\(필터된데이터.first?.time)") - return 필터된데이터 - } - - var chartCounter: Int { - var counter: Int = 1 - if stopHour > startHour { - counter = (stopHour - startHour) + 1 - } - return counter - } - - var startHour: Int { - let calendar = Calendar.current - return calendar.component(.hour, from: startTime) - } - - var stopHour: Int { - let calendar = Calendar.current - return calendar.component(.hour, from: stopTime) - } - - func date(from date: Date) -> String { - let formatter = DateFormatter() - formatter.locale = Locale(identifier: "ko_kr") - formatter.dateFormat = "MM월 dd일 (E)" - return formatter.string(from: date) + return charts.filter { $0.surfingRecordStartTime == recordOne.surfingStartTime } } - + + // 평가 텍스트를 반환하는 함수 func evaluationText(for value: Int) -> String { switch value { case 1: return "별로예요" @@ -81,45 +41,50 @@ class RecordChartViewModel: ObservableObject { default: return "최고예요" } } - + + // Ellipsis 상태 업데이트 함수 func updateEllipsisState(for id: UUID) { for key in isEllipsisOnOff.keys { if key != id { isEllipsisOnOff[key] = false - } } isEllipsisOnOff[id, default: false].toggle() - } - // UserDefaults에 row.time을 추가하는 함수 - func savePinTime(_ time: String,_ date: Date) { + + // Pin Time 저장 함수 + func savePinTime(_ time: String, _ date: Date) { var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] - - var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] - var convertDate = DateFormatterManager.shared.convertDateToString(date: date) - if !pinRecord.contains(convertDate) { - pinRecord.append(convertDate) - UserDefaults.standard.set(pinRecord, forKey: "pinRecord") - print("들어갔음record:\(convertDate)") + var pinRecords = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] + + let convertDate = DateFormatterManager.shared.convertDateToString(date: date) + if !pinRecords.contains(convertDate) { + pinRecords.append(convertDate) pinTimes.append(time) + UserDefaults.standard.set(pinRecords, forKey: "pinRecord") UserDefaults.standard.set(pinTimes, forKey: "pinTime") - print("들어갔음time:\(time)") + print("Pin saved - Date: \(convertDate), Time: \(time)") } - - } - func confirm(_ time: String,_ date: Date){ - var pinTimes = UserDefaults.standard.stringArray(forKey: "pinTime") ?? [] + + // 기록이 이미 존재하는지 확인하는 함수 + @MainActor + func confirmPin(_ time: String, _ date: Date) { + let pinRecords = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] + let convertDate = DateFormatterManager.shared.convertDateToString(date: date) - var pinRecord = UserDefaults.standard.stringArray(forKey: "pinRecord") ?? [] - var convertDate = DateFormatterManager.shared.convertDateToString(date: date) - if pinRecord.contains(convertDate) { - isRecord = true + if pinRecords.contains(convertDate) { + self.isRecord = true + print("변경isRecord") + } else { + + self.showPin = true + print("변경showPin") + } } - func deleteRecord(item: SurfingRecordOne,modelContext:ModelContext) { - modelContext.delete(item) // Delete the SurfingRecordOne object from the context - try? modelContext.save() // Save the context to persist changes - } + + } + +