feat: setup wizard shell

This commit is contained in:
2026-04-22 12:41:33 +01:00
parent e8005f3fbf
commit aa28a03e3c
5 changed files with 143 additions and 22 deletions

View File

@@ -45,20 +45,29 @@ where
T: 'static,
Store<F::Context>: gpui::Global,
{
let ent = cx
.update_global::<Store<F::Context>, _>(|store, cx| store.ensure_query_data(&query_fn, cx));
let ent = cx.update_global::<Store<F::Context>, _>(|store, cx| {
let ent = store.entity_for(&query_fn, cx);
store.ensure_query_data(&query_fn, cx);
ent
});
cx.observe(&ent.raw, |_, _, cx| {
cx.observe(&ent.raw, move |_, ent, cx| {
let query = ent.read(cx);
if matches!(query.data, QueryData::Stale) {
cx.update_global::<Store<F::Context>, _>(|store, cx| {
store.ensure_query_data(&query_fn, cx);
});
}
cx.notify();
})
.detach();
let cloned_ent = ent.clone();
let query_context = cx.global::<Store<F::Context>>().query_context.clone();
cx.observe(&query_context, move |_, _, cx| {
cx.update_global::<Store<F::Context>, _>(|store, cx| {
store.invalidate_query(&query_fn, cx);
store.ensure_query_data(&query_fn, cx);
})
store.invalidate_query(&cloned_ent, cx);
});
})
.detach();
@@ -73,23 +82,41 @@ where
{
let ent = cx.update_global::<Store<F::Context>, _>(|store, cx| store.entity_for(&query_fn, cx));
cx.observe(&ent.raw, |_, ent, cx| {
cx.observe(&ent.raw, move |_, ent, cx| {
let query = ent.read(cx);
if matches!(query.data, QueryData::Stale) {
cx.update_global::<Store<F::Context>, _>(|store, cx| {
store.ensure_query_data(&query_fn, cx);
});
}
cx.notify();
})
.detach();
let cloned_ent = ent.clone();
let query_context = cx.global::<Store<F::Context>>().query_context.clone();
cx.observe(&query_context, move |_, _, cx| {
cx.update_global::<Store<F::Context>, _>(|store, cx| {
store.invalidate_query(&query_fn, cx);
store.ensure_query_data(&query_fn, cx);
})
store.invalidate_query(&cloned_ent, cx);
});
})
.detach();
ent
}
impl<F> Entity<F>
where
F: QueryFn,
Store<F::Context>: gpui::Global,
{
pub fn refetch(&self, cx: &mut gpui::Context<F::Context>) {
cx.update_global::<Store<F::Context>, _>(|store, cx| {
store.invalidate_query(self, cx);
});
}
}
pub fn read_query<'a, F, T>(
query: &Entity<F>,
cx: &'a gpui::Context<T>,
@@ -125,8 +152,8 @@ where
{
pub fn new(ctx: C, cx: &mut gpui::App) -> Self {
Self {
query_data: std::collections::HashMap::new(),
query_context: cx.new(|_| ctx),
query_data: std::collections::HashMap::new(),
}
}
@@ -205,12 +232,13 @@ where
})
}
fn invalidate_query<Q, T>(&mut self, query: &Q, cx: &mut gpui::Context<T>)
fn invalidate_query<E, F>(&self, entity: &Entity<F>, cx: &mut gpui::Context<E>)
where
Q: QueryFn<Context = C>,
T: 'static,
E: 'static,
F: QueryFn<Context = C>,
{
if let Some(entity) = self.query_data.get(query.key()) {
let entity = entity.raw.read(cx);
if let Some(entity) = self.query_data.get(entity.key) {
entity.update(cx, |query, cx| {
if !matches!(query.data, QueryData::Loading) {
query.data = QueryData::Stale;