Skip to content
Merged
Show file tree
Hide file tree
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
34 changes: 6 additions & 28 deletions CodeEdit/Features/Git/SourceControlManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ final class SourceControlManager: ObservableObject {
let editorManager: EditorManager
weak var fileManager: CEWorkspaceFileManager?

// Timer for periodic fetch
private var fetchTimer: Timer?

/// A list of changed files
@Published var changedFiles: [CEWorkspaceFile] = []

Expand Down Expand Up @@ -116,27 +113,10 @@ final class SourceControlManager: ObservableObject {
fileManager.notifyObservers(updatedItems: updatedStatusFor)
}

/// Start periodic fetch with a specified interval
func startPeriodicFetch(interval: TimeInterval) {
fetchTimer?.invalidate() // Invalidate any existing timer
fetch()
fetchTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in
self?.fetch()
}
}

/// Fetch from remote
func fetch() {
Task {
try await gitClient.fetchFromRemote()
await self.refreshNumberOfUnsyncedCommits()
}
}

/// Stops the periodic fetch
func stopPeriodicFetch() {
fetchTimer?.invalidate()
fetchTimer = nil
func fetch() async throws {
try await gitClient.fetchFromRemote()
await self.refreshNumberOfUnsyncedCommits()
}

/// Refresh current branch
Expand Down Expand Up @@ -314,11 +294,9 @@ final class SourceControlManager: ObservableObject {

/// Validate repository
func validate() async throws {
Task {
let isGitRepository = try await gitClient.validate()
await MainActor.run {
self.isGitRepository = isGitRepository
}
let isGitRepository = await gitClient.validate()
await MainActor.run {
self.isGitRepository = isGitRepository
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,15 @@ struct SourceControlNavigatorView: View {
VStack(spacing: 0) {
SourcControlNavigatorTabs()
.environmentObject(sourceControlManager)
.onAppear {
sourceControlManager.startPeriodicFetch(interval: 10)
}
.onDisappear {
sourceControlManager.stopPeriodicFetch()
.task {
do {
while true {
try await sourceControlManager.fetch()
try await Task.sleep(for: .seconds(10))
}
} catch {
// TODO: if source fetching fails, display message
}
}
}
.safeAreaInset(edge: .bottom, spacing: 0) {
Expand Down