use crate::browser::Url;
use std::{
cell::{Cell, RefCell},
rc::Rc,
};
use web_sys::Event;
pub type PreventDefault = bool;
#[derive(Debug, Clone)]
pub struct UrlRequested(pub Url, pub UrlRequest);
impl UrlRequested {
pub fn new(url: Url) -> Self {
Self(url, UrlRequest::default())
}
}
#[derive(Debug, Copy, Clone)]
pub enum UrlRequestStatus {
Unhandled,
Handled(PreventDefault),
}
impl Default for UrlRequestStatus {
fn default() -> Self {
Self::Unhandled
}
}
#[derive(Debug, Clone)]
pub struct UrlRequest {
pub(crate) status: Rc<Cell<UrlRequestStatus>>,
pub(crate) event: Rc<RefCell<Option<Event>>>,
}
impl UrlRequest {
pub(crate) fn new(status: UrlRequestStatus, event: Option<Event>) -> Self {
Self {
status: Rc::new(Cell::new(status)),
event: Rc::new(RefCell::new(event)),
}
}
}
impl Default for UrlRequest {
fn default() -> Self {
Self {
status: Rc::new(Cell::new(UrlRequestStatus::default())),
event: Rc::new(RefCell::new(None)),
}
}
}
impl UrlRequest {
pub fn unhandled(self) {
self.status.set(UrlRequestStatus::Unhandled);
}
pub fn handled(self) {
self.status.set(UrlRequestStatus::Handled(false));
}
pub fn handled_and_prevent_refresh(self) {
self.status.set(UrlRequestStatus::Handled(true));
}
pub fn status(&self) -> UrlRequestStatus {
self.status.get()
}
}