Scope repository favorites by pane

This commit is contained in:
Georg Bauer
2026-07-31 18:19:02 +02:00
parent 9c7cef3869
commit 0a38dbe9f2
7 changed files with 187 additions and 33 deletions

View File

@@ -15,6 +15,25 @@ use storage::*;
uniffi::setup_scaffolding!();
#[derive(Clone, Copy, Debug, uniffi::Enum)]
pub enum RepositoryPane {
Issues,
Commits,
Milestones,
}
impl RepositoryPane {
const ALL: [Self; 3] = [Self::Issues, Self::Commits, Self::Milestones];
const fn key(self) -> &'static str {
match self {
Self::Issues => "issues",
Self::Commits => "commits",
Self::Milestones => "milestones",
}
}
}
#[derive(Debug, Error, uniffi::Error)]
pub enum GotchaError {
#[error("{message}")]
@@ -184,7 +203,11 @@ impl GotchaCore {
))
}
pub async fn repositories(&self, page: u32) -> Result<RepositoryListPage, GotchaError> {
pub async fn repositories(
&self,
page: u32,
pane: RepositoryPane,
) -> Result<RepositoryListPage, GotchaError> {
let server = self.server()?;
let page_number = valid_page(page)?;
let repositories = load_repositories(&server, page_number).await?;
@@ -202,7 +225,7 @@ impl GotchaCore {
}
}
Ok(RepositoryListPage {
rows: self.repository_rows(&state),
rows: self.repository_rows(&state, pane),
has_more: repositories.has_more,
})
}
@@ -211,18 +234,19 @@ impl GotchaCore {
&self,
owner: String,
repository: String,
pane: RepositoryPane,
) -> Result<Vec<RepositoryRow>, GotchaError> {
let mut state = self.state.lock().unwrap();
let server = state
.active_server
.and_then(|index| state.preferences.servers.get(index))
.ok_or("Select a server first.")?;
let key = favorite_key(&server.url, &owner, &repository);
let key = favorite_key(pane, &server.url, &owner, &repository);
if !state.preferences.favorites.remove(&key) {
state.preferences.favorites.insert(key);
}
save_preferences(&state.preferences)?;
Ok(self.repository_rows(&state))
Ok(self.repository_rows(&state, pane))
}
pub async fn issues(
@@ -755,7 +779,7 @@ impl GotchaCore {
.ok_or_else(|| "Select a server first.".to_string().into())
}
fn repository_rows(&self, state: &State) -> Vec<RepositoryRow> {
fn repository_rows(&self, state: &State, pane: RepositoryPane) -> Vec<RepositoryRow> {
let server_url = state
.active_server
.and_then(|index| state.preferences.servers.get(index))
@@ -763,6 +787,7 @@ impl GotchaCore {
.unwrap_or_default();
repository_rows(&state.repositories, |repository| {
state.preferences.favorites.contains(&favorite_key(
pane,
server_url,
&repository.owner,
&repository.name,