Add configurable iPhone widgets
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
Client, Error, Result,
|
||||
domain::{DEFAULT_PAGE_SIZE, HomeData},
|
||||
domain::{DEFAULT_PAGE_SIZE, HomeData, Page},
|
||||
models,
|
||||
};
|
||||
use gitea_openapi::apis;
|
||||
@@ -71,6 +71,23 @@ pub enum Target {
|
||||
}
|
||||
|
||||
impl Client {
|
||||
pub async fn activities(
|
||||
&self,
|
||||
page: i32,
|
||||
filter: ActivityFilter,
|
||||
) -> Result<Page<models::Activity>> {
|
||||
if page < 1 {
|
||||
return Err(Error::InvalidInput("page must be positive".into()));
|
||||
}
|
||||
let configuration = self.configuration();
|
||||
let login = self
|
||||
.current_user()
|
||||
.await?
|
||||
.login
|
||||
.ok_or_else(|| Error::Generated("The server account has no username.".into()))?;
|
||||
filtered_activity_page(&configuration, &login, page, filter).await
|
||||
}
|
||||
|
||||
pub async fn home(&self, page: i32, filter: ActivityFilter) -> Result<HomeData> {
|
||||
if page < 1 {
|
||||
return Err(Error::InvalidInput("page must be positive".into()));
|
||||
@@ -81,31 +98,41 @@ impl Client {
|
||||
.await?
|
||||
.login
|
||||
.ok_or_else(|| Error::Generated("The server account has no username.".into()))?;
|
||||
let activities = activity_page(&configuration, &login, page);
|
||||
let (activities, heatmap) = tokio::join!(
|
||||
activities,
|
||||
filtered_activity_page(&configuration, &login, page, filter),
|
||||
apis::user_api::user_get_heatmap_data(&configuration, &login),
|
||||
);
|
||||
let mut activities = activities?;
|
||||
let heatmap = heatmap.map_err(Error::generated)?;
|
||||
let mut page = page;
|
||||
let activities = activities?;
|
||||
Ok(HomeData {
|
||||
activities: activities.items,
|
||||
heatmap: heatmap.map_err(Error::generated)?,
|
||||
next_page: activities.has_more.then_some(page + 1),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
loop {
|
||||
let has_more = activities.len() == DEFAULT_PAGE_SIZE as usize;
|
||||
let filtered: Vec<_> = activities
|
||||
.into_iter()
|
||||
.filter(|activity| filter.matches(activity))
|
||||
.collect();
|
||||
if filter == ActivityFilter::All || !filtered.is_empty() || !has_more {
|
||||
return Ok(HomeData {
|
||||
activities: filtered,
|
||||
heatmap,
|
||||
next_page: has_more.then_some(page + 1),
|
||||
});
|
||||
}
|
||||
page += 1;
|
||||
activities = activity_page(&configuration, &login, page).await?;
|
||||
async fn filtered_activity_page(
|
||||
configuration: &apis::configuration::Configuration,
|
||||
login: &str,
|
||||
mut page: i32,
|
||||
filter: ActivityFilter,
|
||||
) -> Result<Page<models::Activity>> {
|
||||
let mut activities = activity_page(configuration, login, page).await?;
|
||||
|
||||
loop {
|
||||
let has_more = activities.len() == DEFAULT_PAGE_SIZE as usize;
|
||||
let filtered: Vec<_> = activities
|
||||
.into_iter()
|
||||
.filter(|activity| filter.matches(activity))
|
||||
.collect();
|
||||
if filter == ActivityFilter::All || !filtered.is_empty() || !has_more {
|
||||
return Ok(Page {
|
||||
items: filtered,
|
||||
has_more,
|
||||
});
|
||||
}
|
||||
page += 1;
|
||||
activities = activity_page(configuration, login, page).await?;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user