fix sidebar settings

This commit is contained in:
Andrew 2024-10-17 01:20:59 -07:00
parent 0a6f7b8ebc
commit 84ff9784ca
4 changed files with 11 additions and 39 deletions

View file

@ -19,7 +19,7 @@ export class SidebarWebviewProvider implements vscode.WebviewViewProvider {
private readonly _extensionUri: vscode.Uri
private _webviewView?: vscode.WebviewView; // only used inside onDidChangeConfiguration
// private _webviewView?: vscode.WebviewView;
private _webviewDeps: string[] = [];
constructor(context: vscode.ExtensionContext) {
@ -28,35 +28,14 @@ export class SidebarWebviewProvider implements vscode.WebviewViewProvider {
let temp_res: typeof this._res | undefined = undefined
this.webview = new Promise((res, rej) => { temp_res = res })
if (!temp_res) throw new Error("sidebar provider: resolver was undefined")
if (!temp_res) throw new Error("Void sidebar provider: resolver was undefined")
this._res = temp_res
// if it affects one of the config items webview depends on, update the webview
// TODO should be able to move this entirely to React - make updateWebviewHTML mount once, and then send updates via postMessage from then on
vscode.workspace.onDidChangeConfiguration(event => {
if (this._webviewDeps.map(dep => event.affectsConfiguration(dep)).some(v => !!v)) {
if (this._webviewView) {
this.updateWebviewHTML(this._webviewView.webview);
}
}
});
}
// this is updated
private updateWebviewHTML(webview: vscode.Webview) {
const allowed_urls = ['https://api.anthropic.com', 'https://api.openai.com', 'https://api.greptile.com'];
// called by us
updateWebviewHTML(webview: vscode.Webview) {
this._webviewDeps = []
const ollamaEndpoint: string | undefined = vscode.workspace.getConfiguration('void.ollama').get('endpoint');
this._webviewDeps.push('void.ollama.endpoint');
if (ollamaEndpoint)
allowed_urls.push(ollamaEndpoint);
const openAICompatibleEndpoint: string | undefined = vscode.workspace.getConfiguration('void.openAICompatible').get('endpoint');
this._webviewDeps.push('void.openAICompatible.endpoint');
if (openAICompatibleEndpoint)
allowed_urls.push(openAICompatibleEndpoint+'/chat/completions');
const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'dist/sidebar/index.js'));
const stylesUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'dist/sidebar/styles.css'));
const rootUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri));
@ -68,7 +47,7 @@ export class SidebarWebviewProvider implements vscode.WebviewViewProvider {
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Custom View</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src ${allowed_urls.join(' ')}; img-src vscode-resource: https:; script-src 'nonce-${nonce}'; style-src vscode-resource: 'unsafe-inline' http: https: data:;">
<meta http-equiv="Content-Security-Policy" content="img-src vscode-resource: https:; script-src 'nonce-${nonce}'; style-src vscode-resource: 'unsafe-inline' http: https: data:;">
<base href="${rootUri}/">
<link href="${stylesUri}" rel="stylesheet">
</head>
@ -100,6 +79,6 @@ export class SidebarWebviewProvider implements vscode.WebviewViewProvider {
// resolve webview and _webviewView
this._res(webview);
this._webviewView = webviewView;
// this._webviewView = webviewView;
}
}

View file

@ -121,7 +121,7 @@ export function activate(context: vscode.ExtensionContext) {
}
else if (m.type === 'persistPartialVoidConfig') {
const partialVoidConfig = m.partialVoidConfig
context.workspaceState.update('partialVoidConfig', partialVoidConfig)
context.globalState.update('partialVoidConfig', partialVoidConfig)
}
else if (m.type === 'getAllThreads') {
const threads: ChatThreads = context.workspaceState.get('allThreads') ?? {}

View file

@ -4,18 +4,10 @@ import { configFields, useVoidConfig, VoidConfigField } from "./contextForConfig
const SettingOfFieldAndParam = ({ field, param }: { field: VoidConfigField, param: string }) => {
const { voidConfig, partialVoidConfig, voidConfigInfo, setConfigParam } = useVoidConfig()
const { enumArr, defaultVal, description } = voidConfigInfo[field][param]
const val = partialVoidConfig[field]?.[param] ?? defaultVal // current value of this item
const { defaultVal, description } = voidConfigInfo[field][param]
const [val, setVal] = useState<string | undefined>(partialVoidConfig[field]?.[param] ?? defaultVal)
const { enumArr } = voidConfigInfo[field][param]
const updateState = (newValue: string | undefined) => {
setVal(newValue)
if (newValue)
setConfigParam(field, param, newValue)
}
const updateState = (newValue: string) => { setConfigParam(field, param, newValue) }
const resetButton = <button className='btn btn-sm' onClick={() => updateState(defaultVal)}>
<svg

View file

@ -341,6 +341,7 @@ export function ConfigProvider({ children }: { children: ReactNode }) {
setPartialVoidConfig(newPartialConfig)
const newFullConfig = getVoidConfig(newPartialConfig)
setVoidConfig(newFullConfig)
getVSCodeAPI().postMessage({ type: 'persistPartialVoidConfig', partialVoidConfig: newPartialConfig })
}
}}
>