Skip to content

Commit aa49e14

Browse files
committed
fix(gpt-runner-vscode): fix insert codes and diff codes sometime not working when focus on webview
1 parent 194d67e commit aa49e14

File tree

6 files changed

+37
-10
lines changed

6 files changed

+37
-10
lines changed

packages/gpt-runner-vscode/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { getExtConfiguration } from './utils'
77
import { Commands, EXT_DISPLAY_NAME } from './constant'
88
import { registerWebview } from './register/webview'
99
import { registerServer } from './register/server'
10-
import { registerInsertCodes } from './register/inser-codes'
10+
import { registerInsertCodes } from './register/insert-codes'
1111
import { registerDiffCodes } from './register/diff-codes'
1212
import { registerOpenInBrowser } from './register/open-in-browser'
1313
import { registerStatusBar } from './register/status-bar'

packages/gpt-runner-vscode/src/register/diff-codes.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,15 @@ export async function registerDiffCodes(
8686

8787
diffCodesProviderDisposable = DiffCodesProvider.getInstance().registerTextDocumentContentProvider()
8888

89-
commandDisposable = vscode.commands.registerTextEditorCommand(Commands.DiffCodes, async (editor) => {
89+
commandDisposable = vscode.commands.registerCommand(Commands.DiffCodes, async () => {
90+
if (vscode.window.activeTextEditor)
91+
state.activeEditor = vscode.window.activeTextEditor
92+
93+
const editor = state.activeEditor
94+
95+
if (!editor)
96+
return
97+
9098
const title = 'Your codes ↔ GPT Runner codes'
9199
const selectionText = editor.document.getText(editor.selection)
92100

packages/gpt-runner-vscode/src/register/inser-codes.ts renamed to packages/gpt-runner-vscode/src/register/insert-codes.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,20 @@ export async function registerInsertCodes(
1818
const registerProvider = () => {
1919
dispose()
2020

21-
disposable = vscode.commands.registerTextEditorCommand(Commands.InsertCodes, (editor, edit) => {
22-
editor.selections.forEach((selection) => {
23-
const text = state.insertCodes
24-
edit.replace(selection, text) // insert at current cursor
25-
})
21+
disposable = vscode.commands.registerCommand(Commands.InsertCodes, () => {
22+
if (vscode.window.activeTextEditor)
23+
state.activeEditor = vscode.window.activeTextEditor
24+
25+
const editor = state.activeEditor
26+
27+
if (editor) {
28+
editor.selections.forEach((selection) => {
29+
const text = state.insertCodes
30+
editor.edit((edit) => {
31+
edit.replace(selection, text) // insert at current cursor
32+
})
33+
})
34+
}
2635
})
2736

2837
return disposable

packages/gpt-runner-vscode/src/register/webview.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class ChatViewProvider implements vscode.WebviewViewProvider {
4242
EXT_DISPLAY_NAME,
4343
{
4444
viewColumn: vscode.ViewColumn.Two,
45+
preserveFocus: true,
4546
},
4647
{ retainContextWhenHidden: true },
4748
)
@@ -142,6 +143,9 @@ export async function registerWebview(
142143

143144
sidebarWebviewDisposer = vscode.window.registerWebviewViewProvider(ChatViewProvider.viewType, provider)
144145
webviewPanelDisposer = vscode.commands.registerCommand(Commands.OpenChat, () => {
146+
if (vscode.window.activeTextEditor)
147+
state.activeEditor = vscode.window.activeTextEditor
148+
145149
ChatViewProvider.createWebviewPanel(ext, cwd)
146150
})
147151

packages/gpt-runner-vscode/src/state.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface State {
55
statusBarItem: vscode.StatusBarItem | null
66
sidebarWebviewView: vscode.WebviewView | null
77
webviewPanel: vscode.WebviewPanel | null
8+
activeEditor: vscode.TextEditor | null
89
insertCodes: string
910
diffCodes: string
1011
}
@@ -14,6 +15,7 @@ export const state: State = {
1415
statusBarItem: null,
1516
sidebarWebviewView: null,
1617
webviewPanel: null,
18+
activeEditor: null,
1719
insertCodes: '',
1820
diffCodes: 'aaa',
1921
}

packages/gpt-runner-web/client/src/hooks/use-size.hook.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useRef, useState } from 'react'
1+
import { useLayoutEffect, useRef, useState } from 'react'
22

33
interface Size {
44
width: number
@@ -17,13 +17,12 @@ export function useSize(props?: UseSizeProps): [ref: React.RefObject<HTMLElement
1717
const ref = props?.ref ?? useRef<HTMLElement>(null)
1818
const [size, setSize] = useState<Size>({ width, height })
1919

20-
useEffect(() => {
20+
useLayoutEffect(() => {
2121
if (!ref.current)
2222
return
2323

2424
const updateSize = () => {
2525
if (ref.current) {
26-
console.log('updateSize', ref.current.offsetWidth, ref.current.offsetHeight)
2726
setSize({
2827
width: ref.current.offsetWidth,
2928
height: ref.current.offsetHeight,
@@ -35,8 +34,13 @@ export function useSize(props?: UseSizeProps): [ref: React.RefObject<HTMLElement
3534

3635
ref.current.addEventListener('resize', updateSize)
3736

37+
// ResizeObserver
38+
const resizeObserver = new ResizeObserver(updateSize)
39+
resizeObserver.observe(ref.current)
40+
3841
return () => {
3942
ref.current?.removeEventListener('resize', updateSize)
43+
resizeObserver.disconnect()
4044
}
4145
}, [ref.current])
4246

0 commit comments

Comments
 (0)