Scope repository favorites by pane
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user