assistant panel: Fix panel not reloading after entering credentials (#15531)

This is the revised version of #15527.

We also added new events to notify subscribers when new providers are
added or removed.

Co-Authored-by: Thorsten <thorsten@zed.dev>

Release Notes:

- N/A

---------

Co-authored-by: Thorsten <thorsten@zed.dev>
Co-authored-by: Thorsten Ball <mrnugget@gmail.com>
This commit is contained in:
Bennet Bo Fenner 2024-07-31 14:12:17 +02:00 committed by GitHub
parent a31dba9fc1
commit 821ce2fc7c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 119 additions and 68 deletions

View file

@ -8,7 +8,7 @@ use anyhow::{anyhow, Context as _, Result};
use client::Client;
use collections::BTreeMap;
use futures::{future::BoxFuture, stream::BoxStream, FutureExt, StreamExt};
use gpui::{AnyView, AppContext, AsyncAppContext, Subscription, Task};
use gpui::{AnyView, AppContext, AsyncAppContext, ModelContext, Subscription, Task};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use settings::{Settings, SettingsStore};
@ -50,16 +50,19 @@ pub struct CloudLanguageModelProvider {
_maintain_client_status: Task<()>,
}
struct State {
pub struct State {
client: Arc<Client>,
status: client::Status,
_subscription: Subscription,
}
impl State {
fn authenticate(&self, cx: &mut AppContext) -> Task<Result<()>> {
fn authenticate(&self, cx: &mut ModelContext<Self>) -> Task<Result<()>> {
let client = self.client.clone();
cx.spawn(move |cx| async move { client.authenticate_and_connect(true, &cx).await })
cx.spawn(move |this, mut cx| async move {
client.authenticate_and_connect(true, &cx).await?;
this.update(&mut cx, |_, cx| cx.notify())
})
}
}
@ -99,10 +102,10 @@ impl CloudLanguageModelProvider {
}
impl LanguageModelProviderState for CloudLanguageModelProvider {
fn subscribe<T: 'static>(&self, cx: &mut gpui::ModelContext<T>) -> Option<gpui::Subscription> {
Some(cx.observe(&self.state, |_, _, cx| {
cx.notify();
}))
type ObservableEntity = State;
fn observable_entity(&self) -> Option<gpui::Model<Self::ObservableEntity>> {
Some(self.state.clone())
}
}