friending work
This commit is contained in:
@@ -1,12 +1,113 @@
|
||||
// pub fn view(rsc: &mut Rsc, session: &Session) -> StrongWidget {
|
||||
// let mut view = WidgetSelector::new(View::Info, info(rsc));
|
||||
// view.set(View::User, users(rsc, session));
|
||||
// let view = view.add(rsc);
|
||||
// let [info, server] = tabs(rsc, view, [("info", View::Info), ("users", View::User)]);
|
||||
//
|
||||
// let side_bar = rect(Color::BLACK.alpha(150))
|
||||
// .foreground((info, server).span(Dir::DOWN))
|
||||
// .width(260);
|
||||
//
|
||||
// (side_bar, view).span(Dir::RIGHT).add_strong(rsc)
|
||||
// }
|
||||
use openworm::net::{AddFriend, AddFriendResp, GenerateToken, RequestFriends, ServerPerms};
|
||||
|
||||
use super::*;
|
||||
|
||||
pub fn view(rsc: &mut Rsc, session: &Session) -> StrongWidget {
|
||||
(
|
||||
gen_token(rsc, session),
|
||||
add_friend_area(rsc, session),
|
||||
friends_list(rsc, session),
|
||||
)
|
||||
.span(Dir::DOWN)
|
||||
.add_strong(rsc)
|
||||
}
|
||||
|
||||
fn add_friend_area(rsc: &mut Rsc, session: &Session) -> WeakWidget {
|
||||
let username_field = field("", "username").add(rsc);
|
||||
let add = Button::submit("add friend", rsc);
|
||||
let con = session.con.clone();
|
||||
rsc.events.register(add, Submit, move |ctx, rsc| {
|
||||
let con = con.clone();
|
||||
let username = username_field.edit(rsc).take();
|
||||
add.disable(rsc);
|
||||
rsc.tasks.spawn(async move |mut ctx| {
|
||||
let Ok(resp) = con.request(AddFriend { username }).await else {
|
||||
ctx.update(move |ctx, rsc| {
|
||||
ctx.error("failed to add user", rsc);
|
||||
});
|
||||
return;
|
||||
};
|
||||
ctx.update(move |ctx, rsc| {
|
||||
add.enable(rsc);
|
||||
match resp {
|
||||
AddFriendResp::Ok => {}
|
||||
AddFriendResp::UnknownUser => {
|
||||
ctx.error("unknown user", rsc);
|
||||
}
|
||||
AddFriendResp::CannotAddSelf => {
|
||||
ctx.error("cannot add self", rsc);
|
||||
}
|
||||
AddFriendResp::AlreadySent => {
|
||||
ctx.error("already sent request to user", rsc);
|
||||
}
|
||||
AddFriendResp::AlreadyFriends => {
|
||||
ctx.error("already friends with user", rsc);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
(field_box(username_field).width(300), add.width(200))
|
||||
.span(Dir::RIGHT)
|
||||
.add(rsc)
|
||||
}
|
||||
|
||||
fn gen_token(rsc: &mut Rsc, session: &Session) -> WeakWidget {
|
||||
let generate = Button::normal("generate token", rsc);
|
||||
let con = session.con.clone();
|
||||
let token = wtext("")
|
||||
.size(30)
|
||||
.editable(EditMode::SingleLine)
|
||||
.attr::<Selectable>(())
|
||||
.add(rsc);
|
||||
rsc.events.register(generate, Submit, move |_, rsc| {
|
||||
let con = con.clone();
|
||||
token.edit(rsc).set("loading...");
|
||||
rsc.spawn_task(async move |mut ctx| {
|
||||
let resp = con
|
||||
.request(GenerateToken {
|
||||
perms: ServerPerms::NONE,
|
||||
})
|
||||
.await;
|
||||
ctx.update(move |_, rsc| match resp {
|
||||
Ok(resp) => {
|
||||
token.edit(rsc).set(&resp.token);
|
||||
}
|
||||
Err(_) => {
|
||||
token.edit(rsc).set("failed to generate token");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
(generate.width(200), token).span(Dir::RIGHT).add(rsc)
|
||||
}
|
||||
|
||||
fn friends_list(rsc: &mut Rsc, session: &Session) -> WeakWidget {
|
||||
let ptr = loading_area("loading friends").add(rsc);
|
||||
let con = session.con.clone();
|
||||
rsc.events.register(ptr, Draw, move |_, rsc| {
|
||||
let con = con.clone();
|
||||
// TODO: maybe have rsc.request method that takes in &con?
|
||||
// need to also handle error tho
|
||||
rsc.spawn_task(async move |mut ctx| {
|
||||
let Ok(resp) = con.request(RequestFriends).await else {
|
||||
return;
|
||||
};
|
||||
ctx.update(move |_, rsc| {
|
||||
let mut all = Span::empty(Dir::DOWN);
|
||||
if !resp.incoming.is_empty() {
|
||||
all.push(section_label("incoming").add_strong(rsc));
|
||||
all.push(user_list(&resp.incoming, rsc).add_strong(rsc))
|
||||
}
|
||||
all.push(section_label("friends").add_strong(rsc));
|
||||
all.push(user_list(&resp.current, rsc).add_strong(rsc));
|
||||
if !resp.outgoing.is_empty() {
|
||||
all.push(section_label("outgoing").add_strong(rsc));
|
||||
all.push(user_list(&resp.outgoing, rsc).add_strong(rsc))
|
||||
}
|
||||
all.set_ptr(ptr, rsc);
|
||||
});
|
||||
});
|
||||
});
|
||||
ptr
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user