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) {
|
||||
Button {
|
||||
action.isFavorite.toggle()
|
||||
DataChange.commit(context: context)
|
||||
} label: {
|
||||
Label(
|
||||
action.isFavorite ? String(localized: "즐겨찾기 해제") : String(localized: "즐겨찾기"),
|
||||
@ -174,8 +175,13 @@ struct ActionRow: View {
|
||||
|
||||
struct TagOrderSheet: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.modelContext) private var context
|
||||
@Query(sort: [SortDescriptor(\Tag.sortOrder), SortDescriptor(\Tag.createdAt)]) private var tags: [Tag]
|
||||
|
||||
/// 드래그로 순서가 바뀌었는지 — 시트가 닫힐 때 한 번만 커밋해
|
||||
/// 드래그마다 위젯·워치 갱신이 연발되지 않게 한다
|
||||
@State private var orderChanged = false
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
List {
|
||||
@ -191,6 +197,7 @@ struct TagOrderSheet: View {
|
||||
for (index, tag) in ordered.enumerated() {
|
||||
tag.sortOrder = index
|
||||
}
|
||||
orderChanged = true
|
||||
}
|
||||
}
|
||||
.environment(\.editMode, .constant(.active))
|
||||
@ -203,6 +210,11 @@ struct TagOrderSheet: View {
|
||||
}
|
||||
}
|
||||
.presentationDetents([.medium, .large])
|
||||
.onDisappear {
|
||||
// 꼬리표 순서는 워치 앱 그룹핑 순서에도 쓰이므로 닫힐 때 커밋
|
||||
// ('완료' 버튼과 스와이프 내리기 둘 다 이 경로를 지난다)
|
||||
if orderChanged { DataChange.commit(context: context) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -224,7 +236,11 @@ struct ActionDetailView: View {
|
||||
Spacer()
|
||||
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 {
|
||||
Text("즐겨찾기")
|
||||
} icon: {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user