some basic viewer

This commit is contained in:
Robin Appelman 2023-04-29 14:54:53 +02:00
commit 5910b2f35a
45 changed files with 1089 additions and 1436 deletions

View file

@ -21,6 +21,7 @@ use crate::pages::index::{DemoListScript, Index};
use crate::pages::profile::Profile;
use crate::pages::upload::{UploadPage, UploadScript};
use crate::pages::uploads::Uploads;
use crate::pages::viewer::{ParseWorkerScript, ParserWasm, ViewerPage, ViewerScript, ViewerStyle};
use crate::pages::{render, GlobalStyle};
use crate::session::{SessionData, COOKIE_NAME};
use async_session::{MemoryStore, Session, SessionStore};
@ -97,6 +98,13 @@ async fn main() -> Result<()> {
)
.route(UploadScript::route(), get(serve_asset::<UploadScript>))
.route(DemoListScript::route(), get(serve_asset::<DemoListScript>))
.route(ViewerScript::route(), get(serve_asset::<ViewerScript>))
.route(ViewerStyle::route(), get(serve_asset::<ViewerStyle>))
.route(
ParseWorkerScript::route(),
get(serve_asset::<ParseWorkerScript>),
)
.route(ParserWasm::route(), get(serve_asset::<ParserWasm>))
.route(LogoPng::route(), get(serve_asset::<LogoPng>))
.route(LogoSvg::route(), get(serve_asset::<LogoSvg>))
.route("/fragments/demo-list", get(demo_list))
@ -106,6 +114,8 @@ async fn main() -> Result<()> {
.route("/login", get(login))
.route("/logout", get(logout))
.route("/upload", get(upload))
.route("/viewer", get(viewer))
.route("/viewer/:id", get(viewer))
.route("/:id", get(demo))
.layer(
TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {
@ -346,6 +356,24 @@ async fn profiles(
))
}
async fn viewer(
State(app): State<Arc<App>>,
id: Option<Path<String>>,
session: SessionData,
) -> Result<Markup> {
let demo = if let Some(Path(id)) = id {
let id = id.parse().map_err(|_| Error::NotFound)?;
Some(
Demo::by_id(&app.connection, id)
.await?
.ok_or(Error::NotFound)?,
)
} else {
None
};
Ok(render(ViewerPage { demo }, session))
}
async fn handler_404() -> impl IntoResponse {
Error::NotFound
}

View file

@ -117,7 +117,7 @@ impl Page for DemoPage {
}
}
}
link rel="stylesheet" type="text/css" href=(style_url);
link rel="stylesheet" type="text/css" href=(style_url);
}
}
}

View file

@ -6,6 +6,7 @@ mod plugin_section;
pub mod profile;
pub mod upload;
pub mod uploads;
pub mod viewer;
use crate::session::SessionData;
use demostf_build::Asset;

68
src/pages/viewer.rs Normal file
View file

@ -0,0 +1,68 @@
use crate::data::demo::Demo;
use crate::pages::Page;
use demostf_build::Asset;
use maud::{html, Markup};
use std::borrow::Cow;
pub struct ViewerPage {
pub demo: Option<Demo>,
}
#[derive(Asset)]
#[asset(source = "script/viewer.tsx", url = "/viewer.js")]
pub struct ViewerScript;
#[derive(Asset)]
#[asset(
source = "script/viewer/Analyse/Data/ParseWorker.ts",
url = "/parse-worker.js"
)]
pub struct ParseWorkerScript;
#[derive(Asset)]
#[asset(source = "style/pages/viewer.css", url = "/viewer.css")]
pub struct ViewerStyle;
#[derive(Asset)]
#[asset(
source = "node_modules/@demostf/tf-demos-viewer/tf_demos_viewer_bg.wasm",
url = "/tf-demo-viewer.wasm"
)]
pub struct ParserWasm;
impl Page for ViewerPage {
fn title(&self) -> Cow<'static, str> {
format!(
"{} - demos.tf",
self.demo
.as_ref()
.map(|demo| demo.server.as_str())
.unwrap_or("Viewer")
)
.into()
}
fn render(&self) -> Markup {
let script = ViewerScript::url();
let style_url = ViewerStyle::url();
html! {
.viewer-page {
@if let Some(demo) = self.demo.as_ref() {
input type = "hidden" name = "url" value = (demo.url) {}
progress.download min = "0" max = "100" value = "0" {}
} @else {
.dropzone role = "button" {
noscript {
"Javascript is required to view a demo."
}
span.text { "Drop files or click to view" }
input type = "file" {}
}
}
progress.parse min = "0" max = "100" value = "0" {}
}
script module src = (script) type = "text/javascript" {}
link rel="stylesheet" type="text/css" href=(style_url);
}
}
}