Skip to content

Commit 22529b1

Browse files
committed
Replace preview ongoing modal with a non-blocking implementation to prevent duplicate modals
1 parent 5f16d19 commit 22529b1

7 files changed

Lines changed: 93 additions & 7 deletions

File tree

‎packages/shared/src/constants/dictionary.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ export const dictionary = {
108108
},
109109

110110
warning_message: {
111-
PREVIEW_ONGOING: 'A new response has been received, switch now?',
112111
SKIPPING_INVALID_PATH: (file_path: string) =>
113112
`Skipping applying change to invalid path: ${file_path}.`,
114113
CODE_COMPLETIONS_NO_SELECTION:

‎packages/ui/src/components/editor/panel/modals/Modal/Modal.module.scss‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
text-align: center;
4242
font-weight: 500;
4343
font-size: 14px;
44-
padding: 9px 12px 0 12px;
44+
padding: 10px 12px 0 12px;
4545

4646
&--with-icon {
4747
padding-top: 6px;

‎packages/vscode/src/commands/apply-chat-response-command/apply-chat-response-command.ts‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,21 @@ export const apply_chat_response_command = (params: {
8484
command: 'RESPONSE_HISTORY',
8585
history
8686
})
87-
const choice = await vscode.window.showInformationMessage(
88-
dictionary.warning_message.PREVIEW_ONGOING,
89-
'Switch'
90-
)
87+
88+
if (params.panel_provider.preview_switch_choice_resolver) {
89+
// The "switch preview" modal is already visible for a previous
90+
// response. The current response has been added to the history,
91+
// so we can just return and avoid showing a second modal.
92+
return
93+
}
94+
95+
const choice = await new Promise<'Switch' | undefined>((resolve) => {
96+
params.panel_provider.preview_switch_choice_resolver = resolve
97+
params.panel_provider.send_message({
98+
command: 'SHOW_PREVIEW_ONGOING_MODAL'
99+
})
100+
})
101+
params.panel_provider.preview_switch_choice_resolver = undefined
91102

92103
if (choice == 'Switch') {
93104
placeholder_created_at_for_update = new_item.created_at

‎packages/vscode/src/views/panel/backend/panel-provider.ts‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as path from 'path'
33
import { WebSocketManager } from '@/services/websocket-manager'
44
import { FrontendMessage, BackendMessage } from '../types/messages'
55
import { ApiManager } from '@/services/api-manager'
6-
import { WebsitesProvider } from '@/context/providers/websites-provider'
6+
import { WebsitesProvider } from '@/context/providers/websites/websites-provider'
77
import { OpenEditorsProvider } from '@/context/providers/open-editors/open-editors-provider'
88
import { WorkspaceProvider } from '@/context/providers/workspace/workspace-provider'
99
import { token_count_emitter } from '@/context/context-initialization'
@@ -126,6 +126,10 @@ export class PanelProvider implements vscode.WebviewViewProvider {
126126
timestamp: number
127127
} | null = null
128128

129+
public preview_switch_choice_resolver:
130+
| ((choice: 'Switch' | undefined) => void)
131+
| undefined = undefined
132+
129133
public set_api_manager(api_manager: ApiManager) {
130134
this.api_manager = api_manager
131135
}
@@ -637,6 +641,10 @@ export class PanelProvider implements vscode.WebviewViewProvider {
637641
handle_get_collapsed_states(this)
638642
} else if (message.command == 'SAVE_COMPONENT_COLLAPSED_STATE') {
639643
await handle_save_component_collapsed_state(this, message)
644+
} else if (message.command == 'PREVIEW_SWITCH_CHOICE') {
645+
if (this.preview_switch_choice_resolver) {
646+
this.preview_switch_choice_resolver(message.choice)
647+
}
640648
}
641649
} catch (error: any) {
642650
Logger.error({

‎packages/vscode/src/views/panel/frontend/Panel.tsx‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useState } from 'react'
22
import { Main } from './Main'
3+
import { Button as UiButton } from '@ui/components/editor/common/Button'
34
import { Page as UiPage } from '@ui/components/editor/panel/Page'
45
import { EditPresetForm } from '@/views/panel/frontend/components/edit-preset-form/EditPresetForm'
56
import { TextButton as UiTextButton } from '@ui/components/editor/panel/TextButton'
@@ -9,6 +10,7 @@ import styles from './Panel.module.scss'
910
import cn from 'classnames'
1011
import { post_message } from './utils/post_message'
1112
import { ResponsePreview as UiResponsePreview } from '@ui/components/editor/panel/ResponsePreview'
13+
import { Modal as UiModal } from '@ui/components/editor/panel/modals/Modal'
1214
import { ProgressModal as UiProgressModal } from '@ui/components/editor/panel/modals/ProgressModal'
1315
import { ApiManagerModal as UiApiManagerModal } from '@ui/components/editor/panel/modals/ApiManagerModal'
1416
import { QRCodeModal as UiQRCodeModal } from '@ui/components/editor/panel/modals/QRCodeModal'
@@ -81,6 +83,8 @@ export const Panel = () => {
8183
can_undo,
8284
context_file_paths,
8385
presets_collapsed,
86+
is_preview_ongoing_modal_visible,
87+
set_is_preview_ongoing_modal_visible,
8488
configurations_collapsed,
8589
handle_instructions_change,
8690
edit_preset_back_click_handler,
@@ -526,6 +530,51 @@ export const Panel = () => {
526530
</div>
527531
)}
528532

533+
{is_preview_ongoing_modal_visible && (
534+
<div className={styles.slot}>
535+
<UiModal
536+
title="New response received"
537+
content_slot={
538+
<div>
539+
Would you like to switch to the new response? You can do it
540+
later by going back or rejecting.
541+
</div>
542+
}
543+
on_background_click={() => {
544+
set_is_preview_ongoing_modal_visible(false)
545+
post_message(vscode, {
546+
command: 'PREVIEW_SWITCH_CHOICE',
547+
choice: undefined
548+
})
549+
}}
550+
footer_slot={
551+
<>
552+
<UiButton
553+
is_secondary
554+
on_click={() => {
555+
set_is_preview_ongoing_modal_visible(false)
556+
post_message(vscode, { command: 'PREVIEW_SWITCH_CHOICE' })
557+
}}
558+
>
559+
Close
560+
</UiButton>
561+
<UiButton
562+
on_click={() => {
563+
set_is_preview_ongoing_modal_visible(false)
564+
post_message(vscode, {
565+
command: 'PREVIEW_SWITCH_CHOICE',
566+
choice: 'Switch'
567+
})
568+
}}
569+
>
570+
Switch
571+
</UiButton>
572+
</>
573+
}
574+
/>
575+
</div>
576+
)}
577+
529578
{progress_state && (
530579
<div className={styles.slot}>
531580
<UiProgressModal

‎packages/vscode/src/views/panel/frontend/hooks/use-panel.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ export const use_panel = (vscode: any) => {
109109
const [context_file_paths, set_context_file_paths] = useState<string[]>([])
110110
const [presets_collapsed_by_web_mode, set_presets_collapsed_by_web_mode] =
111111
useState<{ [mode in WebPromptType]?: boolean }>({})
112+
const [
113+
is_preview_ongoing_modal_visible,
114+
set_is_preview_ongoing_modal_visible
115+
] = useState(false)
112116
const [
113117
configurations_collapsed_by_api_mode,
114118
set_configurations_collapsed_by_api_mode
@@ -271,6 +275,8 @@ export const use_panel = (vscode: any) => {
271275
set_has_changes_to_commit(message.has_changes_to_commit)
272276
} else if (message.command == 'CAN_UNDO_CHANGED') {
273277
set_can_undo(message.can_undo)
278+
} else if (message.command == 'SHOW_PREVIEW_ONGOING_MODAL') {
279+
set_is_preview_ongoing_modal_visible(true)
274280
}
275281
}
276282
window.addEventListener('message', handle_message)
@@ -452,6 +458,8 @@ export const use_panel = (vscode: any) => {
452458
configurations_collapsed: api_prompt_type
453459
? (configurations_collapsed_by_api_mode[api_prompt_type] ?? false)
454460
: false,
461+
is_preview_ongoing_modal_visible,
462+
set_is_preview_ongoing_modal_visible,
455463
handle_instructions_change,
456464
edit_preset_back_click_handler,
457465
edit_preset_save_handler,

‎packages/vscode/src/views/panel/types/messages.ts‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,11 @@ export interface ClearAllCheckpointsMessage extends BaseMessage {
391391
command: 'CLEAR_ALL_CHECKPOINTS'
392392
}
393393

394+
export interface PreviewSwitchChoiceMessage extends BaseMessage {
395+
command: 'PREVIEW_SWITCH_CHOICE'
396+
choice?: 'Switch'
397+
}
398+
394399
export type FrontendMessage =
395400
| GetInstructionsMessage
396401
| SaveInstructionsMessage
@@ -463,6 +468,7 @@ export type FrontendMessage =
463468
| UpdateCheckpointDescriptionMessage
464469
| DeleteCheckpointMessage
465470
| ClearAllCheckpointsMessage
471+
| PreviewSwitchChoiceMessage
466472

467473
// === FROM BACKEND TO FRONTEND ===
468474
export interface InstructionsMessage extends BaseMessage {
@@ -697,6 +703,10 @@ export interface CurrentlyOpenFileTextMessage extends BaseMessage {
697703
text?: string
698704
}
699705

706+
export interface ShowPreviewOngoingModalMessage extends BaseMessage {
707+
command: 'SHOW_PREVIEW_ONGOING_MODAL'
708+
}
709+
700710
export type BackendMessage =
701711
| InstructionsMessage
702712
| FocusPromptFieldMessage
@@ -740,3 +750,4 @@ export type BackendMessage =
740750
| CollapsedStatesMessage
741751
| CheckpointsMessage
742752
| CurrentlyOpenFileTextMessage
753+
| ShowPreviewOngoingModalMessage

0 commit comments

Comments
 (0)