🎉 async feed updating (needs UI for it)

This commit is contained in:
Gabriel 2025-07-04 22:14:24 -04:00
parent 2604306d67
commit d428b253d6
3 changed files with 51 additions and 32 deletions

View file

@ -56,6 +56,8 @@ const ITEMS_TABLE_CREATE: &str = "CREATE TABLE IF NOT EXISTS 'items' (
);"; );";
const ITEMS_INDEX_CREATE: &str = "CREATE INDEX IF NOT EXISTS 'items_idx' on 'items'('itemID' ASC);"; const ITEMS_INDEX_CREATE: &str = "CREATE INDEX IF NOT EXISTS 'items_idx' on 'items'('itemID' ASC);";
const ITEMS_FEED_INDEX_CREATE: &str = "CREATE INDEX IF NOT EXISTS 'item_feed_idx' on 'items'('feedID' ASC);";
const DB_RESET: &str = " const DB_RESET: &str = "
drop table items; drop table items;
drop table feeds; drop table feeds;
@ -82,6 +84,7 @@ pub fn initialize() {
conn.execute(FEEDS_INDEX_CREATE, []).unwrap(); conn.execute(FEEDS_INDEX_CREATE, []).unwrap();
conn.execute(ITEMS_TABLE_CREATE, []).unwrap(); conn.execute(ITEMS_TABLE_CREATE, []).unwrap();
conn.execute(ITEMS_INDEX_CREATE, []).unwrap(); conn.execute(ITEMS_INDEX_CREATE, []).unwrap();
conn.execute(ITEMS_FEED_INDEX_CREATE,[]).unwrap();
conn.close().unwrap(); conn.close().unwrap();
println!("Database Initialized.") println!("Database Initialized.")
} }

View file

@ -1,9 +1,9 @@
mod net; pub mod net;
mod ui; pub mod ui;
mod html; pub mod html;
mod db; pub mod db;
mod files; pub mod files;
mod widgets; pub mod widgets;
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
db::initialize(); db::initialize();

View file

@ -1,10 +1,9 @@
use crate::db::add_feed;
use super::db; use super::db;
use super::widgets; use super::widgets;
use iced::widget::row; use iced::widget::row;
use iced::widget::scrollable; use iced::widget::scrollable;
use iced::widget::text_input; use iced::widget::text_input;
use iced::Task;
use iced::{ use iced::{
widget::{button, column, container, text}, widget::{button, column, container, text},
Element, Element,
@ -15,12 +14,12 @@ pub fn user_interface() -> iced::Result {
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
enum Page { pub enum Page {
home, Home,
feed_view, FeedView,
all_items, AllItems,
item_view, ItemView,
testing, Testing,
} }
struct State { struct State {
@ -31,7 +30,7 @@ struct State {
impl Default for State { impl Default for State {
fn default() -> Self { fn default() -> Self {
State { State {
page: Page::home, page: Page::Home,
current_feed: 0, current_feed: 0,
feed_input: String::from("") feed_input: String::from("")
} }
@ -44,34 +43,51 @@ pub enum Message {
LoadFeed(usize), LoadFeed(usize),
AddFeed(String), AddFeed(String),
FieldUpdated(AppField,String), FieldUpdated(AppField,String),
Done(String),
ResetDB ResetDB
} }
#[derive(Debug,Clone)] #[derive(Debug,Clone)]
enum AppField { pub enum AppField {
FeedInput FeedInput
} }
fn update(state: &mut State, mes: Message) { async fn add_feed_background(url: String) -> String {
println!("Adding feed!");
db::add_feed(&url);
"Done adding feed".to_string()
}
fn update(state: &mut State, mes: Message) -> Task<Message>{
match mes { match mes {
Message::ChangePage(p) => state.page=p, Message::ChangePage(p) => {
state.page=p;
Task::none()
},
Message::LoadFeed(feed_id) => { Message::LoadFeed(feed_id) => {
state.current_feed = feed_id; state.current_feed = feed_id;
state.page=Page::feed_view; state.page=Page::FeedView;
Task::none()
}, },
Message::AddFeed(f) => { Message::AddFeed(f) => {
db::add_feed(&f); state.feed_input = "".to_string();
Task::perform(
add_feed_background(f),
Message::Done
)
}, },
Message::Done(_) => {Task::none()},
Message::FieldUpdated(field, value) => { Message::FieldUpdated(field, value) => {
match field { match field {
AppField::FeedInput => { AppField::FeedInput => {
state.feed_input=value; state.feed_input=value;
} }
} }
Task::none()
}, },
Message::ResetDB => { Message::ResetDB => {
db::reset(); db::reset();
Task::none()
} }
} }
@ -82,18 +98,18 @@ fn update(state: &mut State, mes: Message) {
fn view(state: &State) -> Element<'_, Message> { fn view(state: &State) -> Element<'_, Message> {
match state.page { match state.page {
Page::home => home(&state), Page::Home => home(&state),
Page::feed_view => feed_layout(&state), Page::FeedView => feed_layout(&state),
Page::all_items => item_list(&state), Page::AllItems => item_list(&state),
Page::item_view => item_view(&state), Page::ItemView => item_view(&state),
Page::testing => testing(&state), Page::Testing => testing(&state),
} }
} }
fn home(state: &State) -> Element<'_, Message> { fn home(_state: &State) -> Element<'_, Message> {
container(column!( container(column!(
scrollable(widgets::list_feeds()).width(iced::Fill).height(iced::Fill), scrollable(widgets::list_feeds()).width(iced::Fill).height(iced::Fill),
button("Go to test!").on_press(Message::ChangePage(Page::testing)) button("Go to test!").on_press(Message::ChangePage(Page::Testing))
)) ))
.padding(15) .padding(15)
.height(Fill) .height(Fill)
@ -105,7 +121,7 @@ fn home(state: &State) -> Element<'_, Message> {
fn feed_layout(state: &State) -> Element<'_, Message> { fn feed_layout(state: &State) -> Element<'_, Message> {
container( container(
column!( column!(
button(text("Go Home")).on_press(Message::ChangePage(Page::home)), button(text("Go Home")).on_press(Message::ChangePage(Page::Home)),
scrollable(widgets::list_items(state.current_feed)).width(iced::Fill).height(iced::Fill), scrollable(widgets::list_items(state.current_feed)).width(iced::Fill).height(iced::Fill),
) )
) )
@ -127,11 +143,11 @@ fn testing(state: &State) -> Element<'_, Message> {
button("Add gabe.rocks").on_press(Message::AddFeed(String::from("https://gabe.rocks/rss"))), button("Add gabe.rocks").on_press(Message::AddFeed(String::from("https://gabe.rocks/rss"))),
button("Add LSN").on_press(Message::AddFeed(String::from("https://libresolutions.network/rss"))), button("Add LSN").on_press(Message::AddFeed(String::from("https://libresolutions.network/rss"))),
row!( row!(
text_input("Add a feed",&state.feed_input).on_input(|val| Message::FieldUpdated(AppField::FeedInput,val)), text_input("Add a feed",&state.feed_input).on_input(|val| Message::FieldUpdated(AppField::FeedInput,val)).width(300),
button("Add feed!").on_press(Message::AddFeed(state.feed_input.clone())) button("Add feed!").on_press(Message::AddFeed(state.feed_input.clone()))
), ).spacing(5).padding(10),
button("Wipe DB").on_press(Message::ResetDB), button("Wipe DB").on_press(Message::ResetDB),
button("go back!").on_press(Message::ChangePage(Page::home)) button("go back!").on_press(Message::ChangePage(Page::Home))
) )
.spacing(5) .spacing(5)
.into() .into()