Skip to content

Commit 9661e89

Browse files
authored
Merge pull request #1177 from nfdi4plants/feature/git_error
Use ErrorModal for Git Services
2 parents e3ea9ce + fa99302 commit 9661e89

4 files changed

Lines changed: 200 additions & 26 deletions

File tree

src/Electron/src/Renderer/Components/LeftSidebar/Git/GitSidebarPanel.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ open Browser.Dom
44
open Feliz
55
open Renderer.Components.Helper.ArcVaultHelper
66
open Swate.Components.Primitive.ErrorModal.Context
7+
open Swate.Components.Primitive.ErrorModal.Types
78

89
let mutable private gitVersionCheckStarted = false
910

@@ -28,7 +29,8 @@ let Main () =
2829
|> Promise.map (
2930
function
3031
| Ok() -> ()
31-
| Error message -> Browser.Dom.window.alert message
32+
| Error message ->
33+
errorCtx.enqueue (ErrorModalRequest.create (message, title = "Could not verify Git installation"))
3234
)
3335
|> ignore
3436
)

src/Electron/src/Renderer/Context/GitStateContext.fs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ open Feliz.UseElmish
77

88
open Renderer.Types
99
open Swate.Components.Page.GitSidebarTypes
10+
open Swate.Components.Primitive.ErrorModal.Context
11+
open Swate.Components.Primitive.ErrorModal.Types
1012
open Swate.Electron.Shared.GitTypes
1113
open Swate.Electron.Shared.IPCTypes
1214

@@ -54,7 +56,7 @@ module private Helper =
5456
| Ok(GitPageLoadResultDto.Unsupported unsupportedPage) -> Ok(PageState.GitUnsupportedPage unsupportedPage)
5557
| Error message -> Error message
5658

57-
let dependencies: GitDependencies = {
59+
let dependencies (reportError: GitErrorNotification -> unit) : GitDependencies = {
5860
getGitStatus = Renderer.GitApiClient.getGitStatus
5961
getGitBranches = Renderer.GitApiClient.getGitBranches
6062
getOriginRemoteRepositoryWebUrl = Renderer.GitApiClient.getOriginRepositoryWebUrl
@@ -93,6 +95,7 @@ module private Helper =
9395
confirmGitMergeResolution = Renderer.GitApiClient.confirmGitMergeResolution
9496
confirmLfsPrune = fun message -> window.confirm message
9597
confirmInstall = fun message -> window.confirm message
98+
reportError = reportError
9699
}
97100

98101
let GitStateCtx =
@@ -134,9 +137,25 @@ let GitStateCtxProvider (children: ReactElement) =
134137

135138
let appStateCtx = Renderer.Context.AppStateContext.useAppStateCtx ()
136139
let pageStateCtx = Renderer.Context.PageStateContext.usePageStateCtx ()
140+
let errorModalCtx = useErrorModalCtx ()
141+
let errorModalCtxRef = React.useRef errorModalCtx
142+
errorModalCtxRef.current <- errorModalCtx
143+
144+
let reportGitError =
145+
React.useCallback (
146+
(fun (notification: GitErrorNotification) ->
147+
errorModalCtxRef.current.enqueue (
148+
ErrorModalRequest.create (notification.Message, title = notification.Title)
149+
)
150+
),
151+
[||]
152+
)
153+
154+
let dependencies =
155+
React.useMemo ((fun _ -> Helper.dependencies reportGitError), [||])
137156

138157
let gitState, dispatch =
139-
React.useElmish ((fun () -> init ()), update Helper.dependencies pageStateCtx.setState, subscribe, [||])
158+
React.useElmish ((fun () -> init ()), update dependencies pageStateCtx.setState, subscribe, [||])
140159

141160
let refresh () = dispatch RefreshRequested
142161

src/Electron/src/Renderer/Context/GitWorkflow.fs

Lines changed: 88 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ type GitPullWorkflowResult = {
6969

7070
type InitRepositoryOutcome = { WarningMessage: string option }
7171

72+
type GitErrorNotification = { Title: string; Message: string }
73+
7274
type GitState = {
7375
Status: GitSidebarStatus
7476
ChangedFiles: GitSidebarChange[]
@@ -257,6 +259,7 @@ type GitDependencies = {
257259
GitConfirmMergeResolutionRequest -> JS.Promise<Result<GitConfirmMergeResolutionResult, string>>
258260
confirmLfsPrune: string -> bool
259261
confirmInstall: string -> bool
262+
reportError: GitErrorNotification -> unit
260263
}
261264

262265
let staleMergeConflictTokens = [|
@@ -509,6 +512,29 @@ let private applyPageChangeCmd (setPageState: PageState option -> unit) =
509512
fun _dispatch -> setPageState None
510513
]
511514

515+
let private reportErrorCmd (deps: GitDependencies) (title: string) (message: string) : Cmd<Msg> = [
516+
fun _dispatch -> deps.reportError { Title = title; Message = message }
517+
]
518+
519+
let private titleForWriteRequest =
520+
function
521+
| Fetch -> "Could not fetch changes"
522+
| Pull -> "Could not pull changes"
523+
| Push -> "Could not push changes"
524+
| PrimarySave _ -> "Could not save changes"
525+
| Clone _ -> "Could not clone repository"
526+
| CommitSelection _
527+
| CommitAll _ -> "Could not commit changes"
528+
| DiscardSelection _ -> "Could not discard changes"
529+
| SaveLfsSettings _ -> "Could not save Git LFS settings"
530+
| PruneLfsCache -> "Could not clean Git LFS cache"
531+
| DedupLfsStorage -> "Could not reduce Git LFS storage"
532+
| CreateBranch _ -> "Could not create branch"
533+
| SwitchBranch _ -> "Could not switch branch"
534+
535+
let private reportWriteErrorCmd deps request message =
536+
reportErrorCmd deps (titleForWriteRequest request) message
537+
512538
let private withBusyOperation busyOperation model = {
513539
model with
514540
BusyOperation = busyOperation
@@ -1048,7 +1074,11 @@ let update
10481074
PendingRefreshWarningNotice = None
10491075
}
10501076

1051-
nextModel, applyPageChangeCmd setPageState GitPageChange.Clear
1077+
nextModel,
1078+
Cmd.batch [
1079+
applyPageChangeCmd setPageState GitPageChange.Clear
1080+
reportErrorCmd deps "Could not refresh Git state" message
1081+
]
10521082
| RefreshCompleted(_, Ok refreshResult) when
10531083
refreshErrorMessage refreshResult |> Option.exists isMissingRepositoryMessage
10541084
->
@@ -1060,17 +1090,16 @@ let update
10601090
|> withBusyOperation None
10611091
|> fun state -> { state with CurrentProgress = None }
10621092

1063-
let hasError =
1064-
match refreshResult.Status, refreshErrorMessage refreshResult with
1065-
| Error _, _
1066-
| Ok _, Some _ -> true
1067-
| Ok _, None -> false
1093+
let refreshError = refreshErrorMessage refreshResult
10681094

10691095
let cmd =
1070-
if hasError then
1071-
applyPageChangeCmd setPageState GitPageChange.Clear
1072-
else
1073-
Cmd.none
1096+
match refreshError with
1097+
| Some message ->
1098+
Cmd.batch [
1099+
applyPageChangeCmd setPageState GitPageChange.Clear
1100+
reportErrorCmd deps "Could not refresh Git state" message
1101+
]
1102+
| None -> Cmd.none
10741103

10751104
nextModel, cmd
10761105
| InitRepositoryRequested when model.CurrentArcPath.IsNone -> model, Cmd.none
@@ -1104,7 +1133,7 @@ let update
11041133
PendingRefreshWarningNotice = None
11051134
}
11061135

1107-
nextModel, Cmd.none
1136+
nextModel, reportErrorCmd deps "Could not initialize Git repository" message
11081137
| InitRepositoryCompleted(_, Ok outcome) ->
11091138
let nextModel = {
11101139
model with
@@ -1159,7 +1188,11 @@ let update
11591188
ErrorNotice = Some message
11601189
}
11611190

1162-
nextModel, resolveReplyCmd reply (Error message)
1191+
nextModel,
1192+
Cmd.batch [
1193+
resolveReplyCmd reply (Error message)
1194+
reportErrorCmd deps "Could not open Git change" message
1195+
]
11631196
| ConfirmMergeResolutionRequested _ when model.CurrentArcPath.IsNone -> model, Cmd.none
11641197
| ConfirmMergeResolutionRequested request ->
11651198
match model.BusyOperation with
@@ -1206,9 +1239,10 @@ let update
12061239
Cmd.batch [
12071240
applyPageChangeCmd setPageState GitPageChange.Clear
12081241
Cmd.ofMsg RefreshRequested
1242+
reportErrorCmd deps "Could not confirm merge resolution" message
12091243
]
12101244
else
1211-
nextModel, Cmd.none
1245+
nextModel, reportErrorCmd deps "Could not confirm merge resolution" message
12121246
| ConfirmMergeResolutionCompleted(_, Ok outcome) ->
12131247
let nextModel =
12141248
model
@@ -1336,7 +1370,7 @@ let update
13361370
BusyNotice = None
13371371
ErrorNotice = Some message
13381372
},
1339-
Cmd.none
1373+
reportErrorCmd deps "Could not preview update from online" message
13401374
| CloneRequested(request, reply) -> model, Cmd.ofMsg (WriteRequested(Clone(request, reply)))
13411375
| PrimarySaveSelectionRequested request ->
13421376
model, Cmd.ofMsg (WriteRequested(PrimarySave(prepareCommitSelection model request)))
@@ -1394,7 +1428,7 @@ let update
13941428
model with
13951429
ErrorNotice = Some "ARC folder name must not be empty."
13961430
},
1397-
Cmd.none
1431+
reportErrorCmd deps "Could not rename ARC" "ARC folder name must not be empty."
13981432
else
13991433
let nextModel =
14001434
model
@@ -1434,7 +1468,7 @@ let update
14341468
CurrentProgress = None
14351469
ErrorNotice = Some message
14361470
},
1437-
Cmd.none
1471+
reportErrorCmd deps "Could not rename ARC" message
14381472
| PublishRenameCompleted(_, Ok _) ->
14391473
{
14401474
model with
@@ -1526,7 +1560,12 @@ let update
15261560
model, resolveStaleWriteCompletedCmd request result
15271561
| WriteCompleted(_, request, Error message) ->
15281562
let nextModel = writeErrorModel message model
1529-
nextModel, resolveCloneReplyCmd request (Error message)
1563+
1564+
nextModel,
1565+
Cmd.batch [
1566+
resolveCloneReplyCmd request (Error message)
1567+
reportWriteErrorCmd deps request message
1568+
]
15301569
| WriteCompleted(_, _, Ok(RequiresRemoteProjectRename message)) ->
15311570
let nextModel = {
15321571
model with
@@ -1565,7 +1604,11 @@ let update
15651604
InstallRetryState = GitInstallRetryState.Idle
15661605
}
15671606

1568-
nextModel, resolveCloneReplyCmd request (Error message)
1607+
nextModel,
1608+
Cmd.batch [
1609+
resolveCloneReplyCmd request (Error message)
1610+
reportErrorCmd deps "Git LFS installation required" message
1611+
]
15691612
| WriteInstallPromptAnswered(sessionId, request, true) ->
15701613
let busyOperation = busyOperationForWriteRequest request
15711614

@@ -1595,7 +1638,11 @@ let update
15951638
InstallRetryState = GitInstallRetryState.Idle
15961639
}
15971640

1598-
nextModel, resolveCloneReplyCmd request (Error message)
1641+
nextModel,
1642+
Cmd.batch [
1643+
resolveCloneReplyCmd request (Error message)
1644+
reportErrorCmd deps "Could not install Git LFS" message
1645+
]
15991646
| WriteInstallCompleted(_, request, Ok operationResult) when not operationResult.Success ->
16001647
let message =
16011648
operationResult.Message |> Option.defaultValue "Git LFS installation failed."
@@ -1608,7 +1655,11 @@ let update
16081655
InstallRetryState = GitInstallRetryState.Idle
16091656
}
16101657

1611-
nextModel, resolveCloneReplyCmd request (Error message)
1658+
nextModel,
1659+
Cmd.batch [
1660+
resolveCloneReplyCmd request (Error message)
1661+
reportErrorCmd deps "Could not install Git LFS" message
1662+
]
16121663
| WriteInstallCompleted(sessionId, request, Ok _) ->
16131664
let busyOperation = busyOperationForWriteRequest request
16141665

@@ -1658,15 +1709,29 @@ let update
16581709
PendingPostMergePush = false
16591710
}
16601711

1661-
nextModel, applyPageChangeCmd setPageState pageChange
1712+
nextModel,
1713+
Cmd.batch [
1714+
applyPageChangeCmd setPageState pageChange
1715+
reportErrorCmd deps "Could not push saved changes" message
1716+
]
16621717
| WriteCompleted(_, request, Ok(CompletedWithPendingRemoteConfirmation(_, _, _))) ->
16631718
let message = "Git operation produced an invalid pending remote confirmation."
16641719
let nextModel = writeErrorModel message model
1665-
nextModel, resolveCloneReplyCmd request (Error message)
1720+
1721+
nextModel,
1722+
Cmd.batch [
1723+
resolveCloneReplyCmd request (Error message)
1724+
reportWriteErrorCmd deps request message
1725+
]
16661726
| WriteCompleted(_, request, Ok(CompletedWithPendingRemoteFailure(_, _))) ->
16671727
let message = "Git operation produced an invalid pending remote failure."
16681728
let nextModel = writeErrorModel message model
1669-
nextModel, resolveCloneReplyCmd request (Error message)
1729+
1730+
nextModel,
1731+
Cmd.batch [
1732+
resolveCloneReplyCmd request (Error message)
1733+
reportWriteErrorCmd deps request message
1734+
]
16701735
| WriteCompleted(_, request, Ok(Completed success)) ->
16711736
let baseModel, pageChange, warningMessage = applyWriteSuccessModel model success
16721737

0 commit comments

Comments
 (0)