fix(action): commit tag order and favorite changes immediately
꼬리표 순서 변경 시트와 즐겨찾기 토글(리스트 스와이프·상세 화면)이
DataChange.commit 없이 autosave에만 의존해, 저장 확정이 지연되고
꼬리표 순서를 쓰는 워치 앱 그룹핑이 다음 커밋 시점까지 낡은 순서로
남을 수 있었다.
- TagOrderSheet: 드래그마다가 아니라 시트가 닫힐 때 1회만 커밋
('완료'와 스와이프 내리기 모두 onDisappear 경로) — 위젯 리로드 연발 방지
- 즐겨찾기 토글 2곳: 변경 즉시 커밋
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
parent
417070bde7
commit
d023f3eca1
@ -131,6 +131,7 @@ struct ActionListView: View {
|
|||||||
.swipeActions(edge: .leading, allowsFullSwipe: true) {
|
.swipeActions(edge: .leading, allowsFullSwipe: true) {
|
||||||
Button {
|
Button {
|
||||||
action.isFavorite.toggle()
|
action.isFavorite.toggle()
|
||||||
|
DataChange.commit(context: context)
|
||||||
} label: {
|
} label: {
|
||||||
Label(
|
Label(
|
||||||
action.isFavorite ? String(localized: "즐겨찾기 해제") : String(localized: "즐겨찾기"),
|
action.isFavorite ? String(localized: "즐겨찾기 해제") : String(localized: "즐겨찾기"),
|
||||||
@ -174,8 +175,13 @@ struct ActionRow: View {
|
|||||||
|
|
||||||
struct TagOrderSheet: View {
|
struct TagOrderSheet: View {
|
||||||
@Environment(\.dismiss) private var dismiss
|
@Environment(\.dismiss) private var dismiss
|
||||||
|
@Environment(\.modelContext) private var context
|
||||||
@Query(sort: [SortDescriptor(\Tag.sortOrder), SortDescriptor(\Tag.createdAt)]) private var tags: [Tag]
|
@Query(sort: [SortDescriptor(\Tag.sortOrder), SortDescriptor(\Tag.createdAt)]) private var tags: [Tag]
|
||||||
|
|
||||||
|
/// 드래그로 순서가 바뀌었는지 — 시트가 닫힐 때 한 번만 커밋해
|
||||||
|
/// 드래그마다 위젯·워치 갱신이 연발되지 않게 한다
|
||||||
|
@State private var orderChanged = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
List {
|
List {
|
||||||
@ -191,6 +197,7 @@ struct TagOrderSheet: View {
|
|||||||
for (index, tag) in ordered.enumerated() {
|
for (index, tag) in ordered.enumerated() {
|
||||||
tag.sortOrder = index
|
tag.sortOrder = index
|
||||||
}
|
}
|
||||||
|
orderChanged = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.environment(\.editMode, .constant(.active))
|
.environment(\.editMode, .constant(.active))
|
||||||
@ -203,6 +210,11 @@ struct TagOrderSheet: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.presentationDetents([.medium, .large])
|
.presentationDetents([.medium, .large])
|
||||||
|
.onDisappear {
|
||||||
|
// 꼬리표 순서는 워치 앱 그룹핑 순서에도 쓰이므로 닫힐 때 커밋
|
||||||
|
// ('완료' 버튼과 스와이프 내리기 둘 다 이 경로를 지난다)
|
||||||
|
if orderChanged { DataChange.commit(context: context) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +236,11 @@ struct ActionDetailView: View {
|
|||||||
Spacer()
|
Spacer()
|
||||||
Text(action.name).foregroundStyle(.secondary)
|
Text(action.name).foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
Toggle(isOn: Bindable(action).isFavorite) {
|
// 리스트 스와이프 토글과 동일하게 변경 즉시 커밋 (저장 확정)
|
||||||
|
Toggle(isOn: Binding(
|
||||||
|
get: { action.isFavorite },
|
||||||
|
set: { action.isFavorite = $0; DataChange.commit(context: context) }
|
||||||
|
)) {
|
||||||
Label {
|
Label {
|
||||||
Text("즐겨찾기")
|
Text("즐겨찾기")
|
||||||
} icon: {
|
} icon: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user