@@ -49,28 +49,33 @@ interface ConnectedGitHubConnectorProps {
49
49
appId : number ;
50
50
app : any ;
51
51
refreshApp : ( ) => void ;
52
+ triggerAutoSync ?: boolean ;
53
+ onAutoSyncComplete ?: ( ) => void ;
52
54
}
53
55
54
56
interface UnconnectedGitHubConnectorProps {
55
57
appId : number | null ;
56
58
folderName : string ;
57
59
settings : any ;
58
60
refreshSettings : ( ) => void ;
59
- refreshApp : ( ) => void ;
61
+ handleRepoSetupComplete : ( ) => void ;
60
62
expanded ?: boolean ;
61
63
}
62
64
63
65
function ConnectedGitHubConnector ( {
64
66
appId,
65
67
app,
66
68
refreshApp,
69
+ triggerAutoSync,
70
+ onAutoSyncComplete,
67
71
} : ConnectedGitHubConnectorProps ) {
68
72
const [ isSyncing , setIsSyncing ] = useState ( false ) ;
69
73
const [ syncError , setSyncError ] = useState < string | null > ( null ) ;
70
74
const [ syncSuccess , setSyncSuccess ] = useState < boolean > ( false ) ;
71
75
const [ showForceDialog , setShowForceDialog ] = useState ( false ) ;
72
76
const [ isDisconnecting , setIsDisconnecting ] = useState ( false ) ;
73
77
const [ disconnectError , setDisconnectError ] = useState < string | null > ( null ) ;
78
+ const autoSyncTriggeredRef = useRef ( false ) ;
74
79
75
80
const handleDisconnectRepo = async ( ) => {
76
81
setIsDisconnecting ( true ) ;
@@ -85,32 +90,51 @@ function ConnectedGitHubConnector({
85
90
}
86
91
} ;
87
92
88
- const handleSyncToGithub = async ( force : boolean = false ) => {
89
- setIsSyncing ( true ) ;
90
- setSyncError ( null ) ;
91
- setSyncSuccess ( false ) ;
92
- setShowForceDialog ( false ) ;
93
+ const handleSyncToGithub = useCallback (
94
+ async ( force : boolean = false ) => {
95
+ setIsSyncing ( true ) ;
96
+ setSyncError ( null ) ;
97
+ setSyncSuccess ( false ) ;
98
+ setShowForceDialog ( false ) ;
93
99
94
- try {
95
- const result = await IpcClient . getInstance ( ) . syncGithubRepo ( appId , force ) ;
96
- if ( result . success ) {
97
- setSyncSuccess ( true ) ;
98
- } else {
99
- setSyncError ( result . error || "Failed to sync to GitHub." ) ;
100
- // If it's a push rejection error, show the force dialog
101
- if (
102
- result . error ?. includes ( "rejected" ) ||
103
- result . error ?. includes ( "non-fast-forward" )
104
- ) {
105
- // Don't show force dialog immediately, let user see the error first
100
+ try {
101
+ const result = await IpcClient . getInstance ( ) . syncGithubRepo (
102
+ appId ,
103
+ force ,
104
+ ) ;
105
+ if ( result . success ) {
106
+ setSyncSuccess ( true ) ;
107
+ } else {
108
+ setSyncError ( result . error || "Failed to sync to GitHub." ) ;
109
+ // If it's a push rejection error, show the force dialog
110
+ if (
111
+ result . error ?. includes ( "rejected" ) ||
112
+ result . error ?. includes ( "non-fast-forward" )
113
+ ) {
114
+ // Don't show force dialog immediately, let user see the error first
115
+ }
106
116
}
117
+ } catch ( err : any ) {
118
+ setSyncError ( err . message || "Failed to sync to GitHub." ) ;
119
+ } finally {
120
+ setIsSyncing ( false ) ;
107
121
}
108
- } catch ( err : any ) {
109
- setSyncError ( err . message || "Failed to sync to GitHub." ) ;
110
- } finally {
111
- setIsSyncing ( false ) ;
122
+ } ,
123
+ [ appId ] ,
124
+ ) ;
125
+
126
+ // Auto-sync when triggerAutoSync prop is true
127
+ useEffect ( ( ) => {
128
+ if ( triggerAutoSync && ! autoSyncTriggeredRef . current ) {
129
+ autoSyncTriggeredRef . current = true ;
130
+ handleSyncToGithub ( false ) . finally ( ( ) => {
131
+ onAutoSyncComplete ?.( ) ;
132
+ } ) ;
133
+ } else if ( ! triggerAutoSync ) {
134
+ // Reset the ref when triggerAutoSync becomes false
135
+ autoSyncTriggeredRef . current = false ;
112
136
}
113
- } ;
137
+ } , [ triggerAutoSync ] ) ; // Only depend on triggerAutoSync to avoid unnecessary re-runs
114
138
115
139
return (
116
140
< div className = "w-full" data-testid = "github-connected-repo" >
@@ -268,7 +292,7 @@ function UnconnectedGitHubConnector({
268
292
folderName,
269
293
settings,
270
294
refreshSettings,
271
- refreshApp ,
295
+ handleRepoSetupComplete ,
272
296
expanded,
273
297
} : UnconnectedGitHubConnectorProps ) {
274
298
// --- Collapsible State ---
@@ -516,9 +540,10 @@ function UnconnectedGitHubConnector({
516
540
appId ,
517
541
) ;
518
542
}
543
+
519
544
setCreateRepoSuccess ( true ) ;
520
545
setRepoCheckError ( null ) ;
521
- refreshApp ( ) ;
546
+ handleRepoSetupComplete ( ) ;
522
547
} catch ( err : any ) {
523
548
setCreateRepoError (
524
549
err . message ||
@@ -882,13 +907,25 @@ export function GitHubConnector({
882
907
} : GitHubConnectorProps ) {
883
908
const { app, refreshApp } = useLoadApp ( appId ) ;
884
909
const { settings, refreshSettings } = useSettings ( ) ;
910
+ const [ pendingAutoSync , setPendingAutoSync ] = useState ( false ) ;
911
+
912
+ const handleRepoSetupComplete = useCallback ( ( ) => {
913
+ setPendingAutoSync ( true ) ;
914
+ refreshApp ( ) ;
915
+ } , [ refreshApp ] ) ;
916
+
917
+ const handleAutoSyncComplete = useCallback ( ( ) => {
918
+ setPendingAutoSync ( false ) ;
919
+ } , [ ] ) ;
885
920
886
921
if ( app ?. githubOrg && app ?. githubRepo && appId ) {
887
922
return (
888
923
< ConnectedGitHubConnector
889
924
appId = { appId }
890
925
app = { app }
891
926
refreshApp = { refreshApp }
927
+ triggerAutoSync = { pendingAutoSync }
928
+ onAutoSyncComplete = { handleAutoSyncComplete }
892
929
/>
893
930
) ;
894
931
} else {
@@ -898,7 +935,7 @@ export function GitHubConnector({
898
935
folderName = { folderName }
899
936
settings = { settings }
900
937
refreshSettings = { refreshSettings }
901
- refreshApp = { refreshApp }
938
+ handleRepoSetupComplete = { handleRepoSetupComplete }
902
939
expanded = { expanded }
903
940
/>
904
941
) ;
0 commit comments