draft new certificate dialog features

This commit is contained in:
yggverse 2024-11-19 17:04:41 +02:00
parent 82f5cdc5b4
commit 35ccbd8714
5 changed files with 71 additions and 12 deletions

View File

@ -57,9 +57,21 @@ impl Gemini {
} }
// Init events // Init events
widget.on_apply(move |response| match response { widget.on_apply({
// Apply selected identity for `auth_uri` let widget = widget.clone();
Some(profile_identity_gemini_id) => { move |response| {
let profile_identity_gemini_id = match response {
// Use selected identity
Some(id) => id,
// Create new identity, get last insert ID
None => profile
.identity
.gemini
.create(None, widget.form.name.value().as_deref())
.unwrap(), // @TODO
};
// Apply identity for given `auth_uri`
profile profile
.identity .identity
.gemini .gemini
@ -67,8 +79,6 @@ impl Gemini {
.apply(profile_identity_gemini_id, auth_uri.to_string().as_str()) .apply(profile_identity_gemini_id, auth_uri.to_string().as_str())
.unwrap(); //@TODO handle errors .unwrap(); //@TODO handle errors
} }
// Create new certificate, then apply it to the new identity for `auth_uri`
None => {}
}); });
// Return activated `Self` // Return activated `Self`

View File

@ -13,7 +13,7 @@ use std::rc::Rc;
pub struct Form { pub struct Form {
pub gobject: Box, pub gobject: Box,
pub list: Rc<List>, pub list: Rc<List>,
// pub name: Rc<Name>, pub name: Rc<Name>,
} }
impl Form { impl Form {
@ -32,13 +32,16 @@ impl Form {
gobject.append(&name.gobject); gobject.append(&name.gobject);
// Connect events // Connect events
list.on_select(move |key| name.gobject.set_visible(key.is_none())); list.on_select({
let name = name.clone();
move |key| name.gobject.set_visible(key.is_none())
});
// Return activated `Self` // Return activated `Self`
Self { Self {
gobject, gobject,
list, list,
// name, name,
} }
} }
} }

View File

@ -1,4 +1,4 @@
use gtk::Entry; use gtk::{glib::GString, prelude::EditableExt, Entry};
const PLACEHOLDER_TEXT: &str = "Identity name (optional)"; const PLACEHOLDER_TEXT: &str = "Identity name (optional)";
const MARGIN: i32 = 8; const MARGIN: i32 = 8;
@ -20,4 +20,15 @@ impl Name {
.build(), .build(),
} }
} }
// Getters
pub fn value(&self) -> Option<GString> {
let text = self.gobject.text();
if text.is_empty() {
None
} else {
Some(text)
}
}
} }

View File

@ -1,4 +1,5 @@
mod auth; mod auth;
mod certificate;
mod database; mod database;
mod error; mod error;
mod memory; mod memory;
@ -6,8 +7,10 @@ mod memory;
use auth::Auth; use auth::Auth;
use database::Database; use database::Database;
use error::Error; use error::Error;
use memory::Memory; use memory::Memory;
use gtk::glib::DateTime;
use sqlite::{Connection, Transaction}; use sqlite::{Connection, Transaction};
use std::{rc::Rc, sync::RwLock}; use std::{rc::Rc, sync::RwLock};
@ -18,7 +21,6 @@ pub struct Gemini {
pub auth: Rc<Auth>, pub auth: Rc<Auth>,
pub database: Rc<Database>, pub database: Rc<Database>,
pub memory: Rc<Memory>, pub memory: Rc<Memory>,
profile_identity_id: Rc<i64>,
} }
impl Gemini { impl Gemini {
@ -42,7 +44,6 @@ impl Gemini {
auth, auth,
database, database,
memory, memory,
profile_identity_id,
}; };
// Build initial index // Build initial index
@ -53,6 +54,38 @@ impl Gemini {
// Actions // Actions
/// Create new record
/// * return new `profile_identity_gemini_id` on success
pub fn create(
&self,
time: Option<(DateTime, DateTime)>,
name: Option<&str>,
) -> Result<i64, Error> {
// Generate new certificate
match certificate::generate(
match time {
Some(value) => value,
None => (
DateTime::now_local().unwrap(),
DateTime::from_local(9999, 12, 31, 23, 59, 59.9).unwrap(), // max @TODO
),
},
match name {
Some(value) => value, // @TODO make sure it's unique
None => "unknown", // @TODO randomize
},
) {
Ok(pem) => match self.database.add(&pem, name) {
Ok(profile_identity_gemini_id) => {
self.index()?;
Ok(profile_identity_gemini_id)
}
Err(_) => Err(Error::DatabaseRecordCreate),
},
Err(reason) => Err(Error::Certificate(reason)),
}
}
/// Create new `Memory` index from `Database` for `Self` /// Create new `Memory` index from `Database` for `Self`
pub fn index(&self) -> Result<(), Error> { pub fn index(&self) -> Result<(), Error> {
// Cleanup previous records // Cleanup previous records

View File

@ -1,6 +1,8 @@
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
AuthInit, AuthInit,
MemoryIndex,
DatabaseIndex, DatabaseIndex,
DatabaseRecordCreate,
MemoryIndex,
Certificate(Box<dyn std::error::Error>),
} }