@@ -30,6 +30,7 @@ import {
3030} from './modules/app-core/workspace-local-helpers.js'
3131import { createWorkspaceEditorHelpers } from './modules/app-core/workspace-editor-helpers.js'
3232import { createEditedIndicatorVisibilityController } from './modules/app-core/edited-indicator-visibility-controller.js'
33+ import { createPublishTrailingNewlineNormalizer } from './modules/app-core/publish-trailing-newline-normalizer.js'
3334import { createLayoutDiagnosticsSetup } from './modules/app-core/layout-diagnostics-setup.js'
3435import { createWorkspaceControllersSetup } from './modules/app-core/workspace-controllers-setup.js'
3536import { createGitHubWorkflowsSetup } from './modules/app-core/github-workflows-setup.js'
@@ -393,6 +394,8 @@ const githubAiContextState = {
393394 hasSyncedActivePrEditorContent : false ,
394395}
395396
397+ let workspacePrContextState = 'inactive'
398+
396399let chatDrawerController = {
397400 setOpen : ( ) => { } ,
398401 setSelectedRepository : ( ) => { } ,
@@ -492,11 +495,16 @@ const getCurrentGitHubToken = () => githubAiContextState.token ?? byotControls.g
492495const getCurrentSelectedRepository = ( ) =>
493496 githubAiContextState . selectedRepository ?? byotControls . getSelectedRepository ( )
494497
498+ const getCurrentSelectedRepositoryFullName = ( ) =>
499+ getCurrentSelectedRepository ( ) ?. fullName ?? ''
500+
495501const getWorkspaceContextSnapshot = createWorkspaceContextSnapshotGetter ( {
496- getCurrentSelectedRepository,
502+ getCurrentSelectedRepository : getCurrentSelectedRepositoryFullName ,
497503 githubPrBaseBranch,
498504 githubPrHeadBranch,
499505 githubPrTitle,
506+ getActivePrContext : ( ) => githubAiContextState . activePrContext ,
507+ getPrContextState : ( ) => workspacePrContextState ,
500508} )
501509
502510let loadedComponentTabId = 'component'
@@ -597,11 +605,8 @@ const ensureWorkspaceTabsShape = createEnsureWorkspaceTabsShape({
597605const buildWorkspaceTabsSnapshot = ( ) =>
598606 workspaceSyncController . buildWorkspaceTabsSnapshot ( )
599607
600- const reconcileWorkspaceTabsWithPushUpdates = fileUpdates =>
601- workspaceSyncController . reconcileWorkspaceTabsWithPushUpdates ( fileUpdates )
602-
603- const getWorkspacePrFileCommits = ( ) =>
604- workspaceSyncController . getWorkspacePrFileCommits ( )
608+ const getWorkspacePrFileCommits = options =>
609+ workspaceSyncController . getWorkspacePrFileCommits ( options )
605610
606611const getEditorSyncTargets = ( ) => workspaceSyncController . getEditorSyncTargets ( )
607612
@@ -634,7 +639,7 @@ const {
634639 getActiveWorkspaceCreatedAt : ( ) => activeWorkspaceCreatedAt ,
635640 setActiveWorkspaceRecordId : value => ( activeWorkspaceRecordId = value ) ,
636641 setActiveWorkspaceCreatedAt : value => ( activeWorkspaceCreatedAt = value ) ,
637- getCurrentSelectedRepository,
642+ getCurrentSelectedRepository : getCurrentSelectedRepositoryFullName ,
638643 getActiveWorkspaceRecordId : ( ) => activeWorkspaceRecordId ,
639644 setIsApplyingWorkspaceSnapshot : value => ( isApplyingWorkspaceSnapshot = value ) ,
640645 ensureWorkspaceTabsShape,
@@ -700,6 +705,41 @@ editedIndicatorVisibilityController.setRefreshHandlers({
700705 renderWorkspaceTabs,
701706} )
702707
708+ const normalizeWorkspaceEditorsTrailingNewlineAfterPublish =
709+ createPublishTrailingNewlineNormalizer ( {
710+ workspaceTabsState,
711+ getLoadedTabIds : ( ) => [ loadedComponentTabId , loadedStylesTabId ] ,
712+ getJsxSource : ( ) => getJsxSource ( ) ,
713+ getCssSource : ( ) => getCssSource ( ) ,
714+ setJsxSource,
715+ setCssSource,
716+ setSuppressEditorChangeSideEffects : value => {
717+ suppressEditorChangeSideEffects = value
718+ } ,
719+ queueWorkspaceSave : ( ) => queueWorkspaceSave ( ) ,
720+ } )
721+
722+ const reconcileWorkspaceTabsWithPushUpdates = fileUpdates => {
723+ normalizeWorkspaceEditorsTrailingNewlineAfterPublish ( )
724+ return workspaceSyncController . reconcileWorkspaceTabsWithPushUpdates ( fileUpdates )
725+ }
726+
727+ const setWorkspacePrContextState = nextState => {
728+ if ( typeof nextState !== 'string' || ! nextState . trim ( ) ) {
729+ return
730+ }
731+
732+ workspacePrContextState = nextState . trim ( )
733+ }
734+
735+ const persistWorkspacePrContextState = nextState => {
736+ setWorkspacePrContextState ( nextState )
737+ queueWorkspaceSave ( )
738+ void flushWorkspaceSave ( ) . catch ( ( ) => {
739+ /* Save failures are already surfaced through saver onError. */
740+ } )
741+ }
742+
703743const githubWorkflows = createGitHubWorkflowsSetup ( {
704744 factories : {
705745 createGitHubPrEditorSyncController,
@@ -774,9 +814,20 @@ const githubWorkflows = createGitHubWorkflowsSetup({
774814 getStyleMode : ( ) => styleMode . value ,
775815 getActivePrContextSyncKey,
776816 prContextUi,
777- onPrContextStateChange : ( ) => {
817+ onPrContextStateChange : activeContext => {
818+ if ( activeContext ?. prTitle ) {
819+ setWorkspacePrContextState ( 'active' )
820+ } else if ( workspacePrContextState === 'active' ) {
821+ setWorkspacePrContextState ( 'inactive' )
822+ }
778823 editedIndicatorVisibilityController . refreshIndicators ( )
779824 } ,
825+ onPrContextClosed : ( ) => {
826+ persistWorkspacePrContextState ( 'closed' )
827+ } ,
828+ onPrContextDisconnected : ( ) => {
829+ persistWorkspacePrContextState ( 'disconnected' )
830+ } ,
780831 getTokenForVisibility : ( ) => githubAiContextState . token ,
781832 closeWorkspacesDrawer : ( ) => {
782833 void workspacesDrawerController ?. setOpen ( false )
0 commit comments