Skip to content

Commit 9989d2e

Browse files
Fix Tasks Not Saving (#2034)
### Description Fixes a bug where tasks would not save after creating them due to an accidental change when removing a deprecated URL method. Also removes a few unnecessary view models in settings, and correctly handles errors thrown when saving workspace settings in UI (with a simple alert). ### Related Issues * N/A Reported on [discord](https://discord.com/channels/951544472238444645/952640521812193411/1362011473324540097) ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code ### Screenshots
1 parent ae86e53 commit 9989d2e

File tree

5 files changed

+49
-20
lines changed

5 files changed

+49
-20
lines changed

CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift

+13-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ final class CEWorkspaceSettings: ObservableObject {
1717

1818
private(set) var folderURL: URL
1919

20-
private var settingsURL: URL {
21-
folderURL.appending(path: "settings").appending(path: "json")
20+
var settingsURL: URL {
21+
folderURL.appending(path: "settings").appendingPathExtension("json")
2222
}
2323

2424
init(workspaceURL: URL) {
@@ -54,7 +54,17 @@ final class CEWorkspaceSettings: ObservableObject {
5454
/// Save``CEWorkspaceSettingsManager`` model to `.codeedit/settings.json`
5555
func savePreferences() throws {
5656
// If the user doesn't have any settings to save, don't save them.
57-
guard !settings.isEmpty() else { return }
57+
guard !settings.isEmpty() else {
58+
// Settings is empty, remove the file & directory if it's empty.
59+
if fileManager.fileExists(atPath: settingsURL.path()) {
60+
try fileManager.removeItem(at: settingsURL)
61+
62+
if try fileManager.contentsOfDirectory(atPath: folderURL.path()).isEmpty {
63+
try fileManager.removeItem(at: folderURL)
64+
}
65+
}
66+
return
67+
}
5868

5969
if !fileManager.fileExists(atPath: folderURL.path()) {
6070
try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true)

CodeEdit/Features/CEWorkspaceSettings/Views/CETaskFormView.swift

-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ struct CETaskFormView: View {
1212
@ObservedObject var task: CETask
1313
@State private var selectedEnvID: UUID?
1414

15-
@StateObject var settingsViewModel = SettingsViewModel()
1615
var body: some View {
1716
Form {
1817
Section {
@@ -85,7 +84,6 @@ struct CETaskFormView: View {
8584
}
8685
}
8786
.formStyle(.grouped)
88-
.environmentObject(settingsViewModel)
8987
}
9088

9189
func removeSelectedEnv() {
@@ -100,7 +98,3 @@ struct CETaskFormView: View {
10098
})
10199
}
102100
}
103-
104-
// #Preview {
105-
// CETaskFormView()
106-
// }

CodeEdit/Features/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift

-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ struct CEWorkspaceSettingsView: View {
1313
@EnvironmentObject var workspaceSettingsManager: CEWorkspaceSettings
1414
@EnvironmentObject var workspace: WorkspaceDocument
1515

16-
@StateObject var settingsViewModel = SettingsViewModel()
17-
1816
@State var selectedTaskID: UUID?
1917
@State var showAddTaskSheet: Bool = false
2018

@@ -68,7 +66,6 @@ struct CEWorkspaceSettingsView: View {
6866
}
6967
.padding()
7068
}
71-
.environmentObject(settingsViewModel)
7269
.sheet(isPresented: $showAddTaskSheet) {
7370
if let selectedTaskIndex = workspaceSettingsManager.settings.tasks.firstIndex(where: {
7471
$0.id == selectedTaskID

CodeEdit/Features/CEWorkspaceSettings/Views/EditCETaskView.swift

+16-8
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ struct EditCETaskView: View {
2323
Divider()
2424
HStack {
2525
Button(role: .destructive) {
26-
workspaceSettingsManager.settings.tasks.removeAll(where: {
27-
$0.id == task.id
28-
})
29-
try? workspaceSettingsManager.savePreferences()
30-
taskManager.deleteTask(taskID: task.id)
31-
self.dismiss()
26+
do {
27+
workspaceSettingsManager.settings.tasks.removeAll(where: {
28+
$0.id == task.id
29+
})
30+
try workspaceSettingsManager.savePreferences()
31+
taskManager.deleteTask(taskID: task.id)
32+
self.dismiss()
33+
} catch {
34+
NSAlert(error: error).runModal()
35+
}
3236
} label: {
3337
Text("Delete")
3438
.foregroundStyle(.red)
@@ -38,8 +42,12 @@ struct EditCETaskView: View {
3842
Spacer()
3943

4044
Button {
41-
try? workspaceSettingsManager.savePreferences()
42-
self.dismiss()
45+
do {
46+
try workspaceSettingsManager.savePreferences()
47+
self.dismiss()
48+
} catch {
49+
NSAlert(error: error).runModal()
50+
}
4351
} label: {
4452
Text("Done")
4553
.frame(minWidth: 56)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// CEWorkspaceSettingsTests.swift
3+
// CodeEditTests
4+
//
5+
// Created by Khan Winter on 4/21/25.
6+
//
7+
8+
import Foundation
9+
import Testing
10+
@testable import CodeEdit
11+
12+
struct CEWorkspaceSettingsTests {
13+
let settings: CEWorkspaceSettings = CEWorkspaceSettings(workspaceURL: URL(filePath: "/"))
14+
15+
@Test
16+
func settingsURLNoSpace() async throws {
17+
#expect(settings.folderURL.lastPathComponent == ".codeedit")
18+
#expect(settings.settingsURL.lastPathComponent == "settings.json")
19+
}
20+
}

0 commit comments

Comments
 (0)