feat: setup wizard shell
This commit is contained in:
58
src/query.rs
58
src/query.rs
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user