Add configurable iPhone widgets

This commit is contained in:
Georg Bauer
2026-08-03 22:06:32 +02:00
parent 2534010d1d
commit c67d274a95
23 changed files with 1151 additions and 56 deletions

View File

@@ -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?;
}
}