From d79f03dbc52de20a87aab5c5facea53ed240ce3c Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Thu, 18 May 2023 14:25:02 -0700 Subject: [PATCH 01/42] chore: bumping VERSION.json for v2023.5.1 release --- VERSION.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/VERSION.json b/VERSION.json index f09b4b5cb..a02015659 100644 --- a/VERSION.json +++ b/VERSION.json @@ -1,23 +1,23 @@ { - "version": "23.4.1", - "notes": "See full release notes here: https://github.com/spyglass-search/spyglass/releases/tag/v2023.4.1", - "pub_date": "2023-04-05T16:23:51Z", + "version": "23.5.1", + "notes": "See full release notes here: https://github.com/spyglass-search/spyglass/releases/tag/v2023.5.1", + "pub_date": "2023-05-18T20:55:01Z", "platforms": { "darwin-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYm5HSHRnVEdMNEJsYzZuVW5HM1RHL2VWZUtzTDNSbnptNkpoZXFDdGx6SElQM3hzbWhQK3ROdURFaFE2TXp3VG1EY0g2TjhqVGpsTXU3T09FRlBwSUFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjgwNjU2NTU0CWZpbGU6U3B5Z2xhc3MuYXBwLnRhci5negoyOXhpdWNNQnFDSnZGTzRoUjBPbG1jMTlDUGhOQlVESGNzRjB3Y3Y4WFBjajBPZWUvMkRHdlphbUphTUhBblp4SnVrMEhYUFBjYW5jSXcyTGRIeDNEZz09Cg==", - "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.4.1/Spyglass_universal.app.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYnEyVmdPUCsrRGlWdWJWVHJJTkdaeXhnZDBlOXp6eVlVQkJGSUJBSTU3UUxkUE9VRVViYm5uU3IzUGN4Qll1a21ZQWs0dytvV1c1RWxIV1AzTVI3ekFRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjg0NDQwMjQzCWZpbGU6U3B5Z2xhc3MuYXBwLnRhci5negp5U3BlY2VzdDlsck5MeExudUZ2c2RqekpOVWhEUmtuMk1BVTVjS1ZYZjc5YzV4aGNZazdiRjBObUxBaDNGaVErYS85VVBhbXF0MVgwUDQxRENKMnZCdz09Cg==", + "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.5.1/Spyglass_universal.app.tar.gz" }, "darwin-aarch64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYm5HSHRnVEdMNEJsYzZuVW5HM1RHL2VWZUtzTDNSbnptNkpoZXFDdGx6SElQM3hzbWhQK3ROdURFaFE2TXp3VG1EY0g2TjhqVGpsTXU3T09FRlBwSUFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjgwNjU2NTU0CWZpbGU6U3B5Z2xhc3MuYXBwLnRhci5negoyOXhpdWNNQnFDSnZGTzRoUjBPbG1jMTlDUGhOQlVESGNzRjB3Y3Y4WFBjajBPZWUvMkRHdlphbUphTUhBblp4SnVrMEhYUFBjYW5jSXcyTGRIeDNEZz09Cg==", - "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.4.1/Spyglass_universal.app.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYnEyVmdPUCsrRGlWdWJWVHJJTkdaeXhnZDBlOXp6eVlVQkJGSUJBSTU3UUxkUE9VRVViYm5uU3IzUGN4Qll1a21ZQWs0dytvV1c1RWxIV1AzTVI3ekFRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjg0NDQwMjQzCWZpbGU6U3B5Z2xhc3MuYXBwLnRhci5negp5U3BlY2VzdDlsck5MeExudUZ2c2RqekpOVWhEUmtuMk1BVTVjS1ZYZjc5YzV4aGNZazdiRjBObUxBaDNGaVErYS85VVBhbXF0MVgwUDQxRENKMnZCdz09Cg==", + "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.5.1/Spyglass_universal.app.tar.gz" }, "linux-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYnM2VDRla2k2VnBVY29zUlZ1b0k4ZkhWVGU1Q2tmMEpIQ0tFQ3RxUGEyRkFBZ3RtaUxLUGpqTThrcENaYnhEZE5OenorZHA3N2srb2QyZ0ZhTHhhZFFnPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjgwNzI1NjA3CWZpbGU6c3B5Z2xhc3NfMjMuNC4xX2FtZDY0LkFwcEltYWdlLnRhci5negp1MDZ2K3o3T2RNeUhpRHcyVXF6dnNxemo4dWZQMDNpT2R6TnhGOGdUSk5LNytWY0RSSzRNSThyVkV3VmphWGM4UlNlMm1mRnJGY1hhOGs5SW55MXlDUT09Cg==", - "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.4.1/spyglass_23.4.1_amd64.AppImage.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYnBxZ1RZd1BSZEJWcXdaRm9GNSsxdlJWSEIwTnFEVHB0d1duZnhZdUU4WFlmaVBneDJjNVpWMjd5WUYvK2xlTGtPRklscGFpeVBCMDRzcFRKUmdJS0FVPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjg0NDM3MTQ0CWZpbGU6c3B5Z2xhc3NfMjMuNS4xX2FtZDY0LkFwcEltYWdlLnRhci5negpQUS9JaDN4Sk9NZFdCa3Q0a3drc3cwRFlFaURSREhBb1dXY2lrUTlDOFRoQVkzRTJpRGI0MjByZStDT2dQRmNiRnF5ZXczZ2dtZFV5ODlmUURzQ2tBdz09Cg==", + "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.5.1/spyglass_23.5.1_amd64.AppImage.tar.gz" }, "windows-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYmpmeDNOZFFDTE0yVURPMVhGMUVkNVNVSTE1b2FtbFlEYVpUT25Gb28xRkVKRjNhdUVGdWZkSFlPMEd0dmRIT2pubFVyd2N3T0puMnlITnUyb25NcVFRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjgwNjU1NDk1CWZpbGU6U3B5Z2xhc3NfMjMuNC4xX3g2NF9lbi1VUy5tc2kuemlwCkpVNUdqcnp5WmdRYVRQWlFXdXdxcXNwaFMxcVpHRVNqck9QNENkNzNpeXZsWTNnVTNSRmxqWVZNNlV3cSttN0ZDWHVHTUkzRWtsRGdjVm80dllsZkRnPT0K", - "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.4.1/Spyglass_23.4.1_x64_en-US.msi.zip" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSRk9WYXdDUXphYnB6cyt3ejFEWE1jU1hNMjRXVWI3RXZvQW04VGhoa29ETDl6ZlE5NUUyNnltWVpTOUJpaWdpbnVHNXB2b2podVZmTnNaaEZpWnVzdXRGYlNGdWRzUUFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNjg0NDM3NzEwCWZpbGU6U3B5Z2xhc3NfMjMuNS4xX3g2NF9lbi1VUy5tc2kuemlwCkpwaDBCT3ZOM09GTnBZam9QVStVRGNyKzNocnozMTlUTGhkejU4VnpNUk5UeW5qWTZkWHZUU2VUeDlXOXVRSkV4WlpNUkNWWlZZbGFaTlhpUnJrV0F3PT0K", + "url": "https://github.com/spyglass-search/spyglass/releases/download/v2023.5.1/Spyglass_23.5.1_x64_en-US.msi.zip" } } } \ No newline at end of file From cfbfb23bba881de0fb5395a85da13f14421589f7 Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Fri, 19 May 2023 11:35:38 -0700 Subject: [PATCH 02/42] tweak: move audio processing to `spyglass-processing` crate (#457) * move audio processing into spyglass-processing crate * updating whisper to latest numbered version --- Cargo.lock | 18 ++++++++++-------- crates/spyglass-processor/Cargo.toml | 3 +++ .../src/parser}/audio.rs | 0 crates/spyglass-processor/src/parser/mod.rs | 1 + crates/spyglass/Cargo.toml | 3 --- crates/spyglass/src/crawler/mod.rs | 4 ++-- crates/spyglass/src/filesystem/mod.rs | 2 -- 7 files changed, 16 insertions(+), 15 deletions(-) rename crates/{spyglass/src/filesystem => spyglass-processor/src/parser}/audio.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index c99292210..91125afc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6973,7 +6973,6 @@ dependencies = [ "regex", "reqwest", "ron", - "rubato", "sentry 0.31.0", "sentry-tracing 0.31.0", "serde", @@ -6987,7 +6986,6 @@ dependencies = [ "spyglass-searcher", "strum 0.24.1", "strum_macros 0.24.3", - "symphonia", "tantivy 0.19.2", "tendril", "thiserror", @@ -7005,7 +7003,6 @@ dependencies = [ "warp", "wasmer", "wasmer-wasi", - "whisper-rs", ] [[package]] @@ -7165,10 +7162,13 @@ dependencies = [ "mime", "new_mime_guess", "pdf", + "rubato", "shared", "strum 0.24.1", "strum_macros 0.24.3", + "symphonia", "uuid 1.3.0", + "whisper-rs", ] [[package]] @@ -9595,19 +9595,21 @@ dependencies = [ [[package]] name = "whisper-rs" -version = "0.6.0" -source = "git+https://github.com/tazz4843/whisper-rs?rev=0859b41191dcbf176f9924eb82854262c3417b42#0859b41191dcbf176f9924eb82854262c3417b42" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c950fb18ad556b053ba615b88fd4d01ed6020be740c3371eb0fc4aec64a0639" dependencies = [ - "dashmap", "whisper-rs-sys", ] [[package]] name = "whisper-rs-sys" -version = "0.4.0" -source = "git+https://github.com/tazz4843/whisper-rs?rev=0859b41191dcbf176f9924eb82854262c3417b42#0859b41191dcbf176f9924eb82854262c3417b42" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfbbbab6c76f5d1eccc930524382f355f3e47a7eeb1daa22185fec5fb40e2a2" dependencies = [ "bindgen", + "cfg-if 1.0.0", ] [[package]] diff --git a/crates/spyglass-processor/Cargo.toml b/crates/spyglass-processor/Cargo.toml index 18c6ab84e..9e6467d78 100644 --- a/crates/spyglass-processor/Cargo.toml +++ b/crates/spyglass-processor/Cargo.toml @@ -14,9 +14,12 @@ log = "0.4" mime = "0.3.16" new_mime_guess = "4.0.1" pdf = "0.8.1" +rubato = "0.12.0" strum = "0.24" strum_macros = "0.24" +symphonia = { version = "0.5.2", features = ["aac", "isomp4", "mp3", "mpa"] } uuid = { version = "1.0.0", features = ["serde", "v4"], default-features = false } +whisper-rs = "0.8.0" # Internal spyglass libs shared = { path = "../shared" } diff --git a/crates/spyglass/src/filesystem/audio.rs b/crates/spyglass-processor/src/parser/audio.rs similarity index 100% rename from crates/spyglass/src/filesystem/audio.rs rename to crates/spyglass-processor/src/parser/audio.rs diff --git a/crates/spyglass-processor/src/parser/mod.rs b/crates/spyglass-processor/src/parser/mod.rs index e85c7ab74..c20e67efa 100644 --- a/crates/spyglass-processor/src/parser/mod.rs +++ b/crates/spyglass-processor/src/parser/mod.rs @@ -4,6 +4,7 @@ use std::{ffi::OsStr, path::Path}; use crate::utils; +pub mod audio; pub mod docx_parser; pub mod pdf_parser; pub mod xlsx_parser; diff --git a/crates/spyglass/Cargo.toml b/crates/spyglass/Cargo.toml index a1aed266a..7343a3596 100644 --- a/crates/spyglass/Cargo.toml +++ b/crates/spyglass/Cargo.toml @@ -37,7 +37,6 @@ percent-encoding = "2.2" regex = "1" reqwest = { version = "0.11", features = ["stream", "json"] } ron = "0.8" -rubato = "0.12.0" sentry = "0.31.0" sentry-tracing = "0.31.0" serde = { version = "1.0", features = ["derive"] } @@ -45,7 +44,6 @@ serde_json = "1.0" sha2 = "0.10" strum = "0.24" strum_macros = "0.24" -symphonia = { version = "0.5.2", features = ["aac", "isomp4", "mp3", "mpa"] } tantivy = "0.19" tendril = "0.4.2" thiserror = "1.0.37" @@ -62,7 +60,6 @@ warc = "0.3" warp = "0.3" wasmer = "2.3.0" wasmer-wasi = "2.3.0" -whisper-rs = { git = "https://github.com/tazz4843/whisper-rs", rev = "0859b41191dcbf176f9924eb82854262c3417b42" } # Spyglass libs auth_core = { git = "https://github.com/spyglass-search/third-party-apis", rev = "dafb599bb24f505ce96d975e922bfadba6e2d1ff" } diff --git a/crates/spyglass/src/crawler/mod.rs b/crates/spyglass/src/crawler/mod.rs index 1e6fab38c..5cd67573a 100644 --- a/crates/spyglass/src/crawler/mod.rs +++ b/crates/spyglass/src/crawler/mod.rs @@ -27,8 +27,8 @@ use url::{Host, Url}; use crate::connection::load_connection; use crate::crawler::bootstrap::create_archive_url; use crate::filesystem; -use crate::filesystem::audio; use crate::state::{AppState, FetchLimitType}; + use spyglass_processor::parser; use spyglass_processor::utils::extensions::SupportedExt; @@ -555,7 +555,7 @@ async fn _process_file( log::warn!("whisper model not installed, skipping transcription"); content = None; } else { - match audio::transcibe_audio(path.to_path_buf(), model_path, 0) { + match parser::audio::transcibe_audio(path.to_path_buf(), model_path, 0) { Ok(result) => { // Update crawl result with appropriate title/stuff if let Some(metadata) = result.metadata { diff --git a/crates/spyglass/src/filesystem/mod.rs b/crates/spyglass/src/filesystem/mod.rs index 8b1631d6f..0c15661c0 100644 --- a/crates/spyglass/src/filesystem/mod.rs +++ b/crates/spyglass/src/filesystem/mod.rs @@ -35,8 +35,6 @@ use uuid::Uuid; use notify_debouncer_mini::{DebouncedEvent, DebouncedEventKind, Debouncer}; use crate::documents; - -pub mod audio; pub mod utils; /// The lens name for indexed files From 2ae9f280f92aa67325bcdacf3e095d8341bda302 Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Fri, 19 May 2023 15:32:52 -0700 Subject: [PATCH 03/42] tweak: add a basic landing page for web client (#459) * adding spyglass logo * really basic landing page layout * add a button for waitlist & public datasets * adding favicons * fix padding * make fmt --- apps/web/index.html | 11 +++- apps/web/public/favicon.png | Bin 0 -> 10707 bytes apps/web/public/favicon.svg | 16 ++++++ apps/web/public/icons/logo@2x.png | Bin 0 -> 65366 bytes apps/web/src/components/nav.rs | 6 +-- apps/web/src/main.rs | 4 +- apps/web/src/pages/landing.rs | 80 ++++++++++++++++++++++++++++++ apps/web/src/pages/mod.rs | 1 + apps/web/tailwind.config.js | 1 + 9 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 apps/web/public/favicon.png create mode 100644 apps/web/public/favicon.svg create mode 100644 apps/web/public/icons/logo@2x.png create mode 100644 apps/web/src/pages/landing.rs diff --git a/apps/web/index.html b/apps/web/index.html index 7f3b0bf4b..d82aba228 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -4,8 +4,15 @@ Spyglass Search - - + + + + + + + + + diff --git a/apps/web/public/favicon.png b/apps/web/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..11f38b911142ca840de967bc7d0d641e8911c102 GIT binary patch literal 10707 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 WsHuNU<1vAQ323V7sFW!o1O5l(b5lwH literal 0 HcmV?d00001 diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg new file mode 100644 index 000000000..af82b1ba7 --- /dev/null +++ b/apps/web/public/favicon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/web/public/icons/logo@2x.png b/apps/web/public/icons/logo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d21d0694b2435630da6ee119e18987adf34d56da GIT binary patch literal 65366 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 DnBKOf literal 0 HcmV?d00001 diff --git a/apps/web/src/components/nav.rs b/apps/web/src/components/nav.rs index 000868fec..daee13819 100644 --- a/apps/web/src/components/nav.rs +++ b/apps/web/src/components/nav.rs @@ -131,10 +131,8 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { } else { html! {} }}
- + - + +
{"⚔️🐉 Dungeons & Dragons"}
+
+ {"Unsure about a rule? Search and ask questions about D&D 5E items, rules, monsters, and more."} +
+
+ {"source: "} + {"dndbeyond.fm"} + {"roll20.net"} +
+
+ +
{"🎙️ The Tim Ferriss Show"}
{"Ask Tim Ferriss anything! Tim Ferriss is an American entrepreneur, investor, author, podcaster, and lifestyle guru."} diff --git a/apps/web/src/pages/lens_edit.rs b/apps/web/src/pages/lens_edit.rs index 1a0799d12..6b0fb701e 100644 --- a/apps/web/src/pages/lens_edit.rs +++ b/apps/web/src/pages/lens_edit.rs @@ -542,6 +542,9 @@ fn lens_source_comp(props: &LensSourceComponentProps) -> Html { let callback = props.delete_callback.clone(); let doc_type_icon = match source.doc_type { + LensDocType::Audio => html! { + + }, LensDocType::GDrive => html! { }, LensDocType::Web => html! {
From 4b3fbec809144684c6be004f7f087d9d442034d6 Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Tue, 23 May 2023 14:16:00 -0700 Subject: [PATCH 07/42] tweak(web): cleaning up public lens landing page (#463) * Add an "already have an account blurb" on landing page * require user to be logged in to see list of lenses * add cursor-pointer to sign-in link * Frequently asked -> Example questions * center example questions on page * add a "powered by spyglass" button to the bottom of search pages * cargo fmt --- apps/web/src/client.rs | 44 +++++++++++++++++++--------------- apps/web/src/components/nav.rs | 14 ++++++++--- apps/web/src/main.rs | 9 +++---- apps/web/src/pages/landing.rs | 34 +++++++++++++++++++++++--- apps/web/src/pages/mod.rs | 2 +- apps/web/src/pages/search.rs | 22 +++++++++++++---- 6 files changed, 89 insertions(+), 36 deletions(-) diff --git a/apps/web/src/client.rs b/apps/web/src/client.rs index e031add3d..2ec6a787d 100644 --- a/apps/web/src/client.rs +++ b/apps/web/src/client.rs @@ -461,26 +461,32 @@ impl ApiClient { } pub async fn get_user_data(&self) -> Result { - let mut request = self.client.get(format!("{}/user/lenses", self.endpoint)); - if let Some(auth_token) = &self.token { - request = request.bearer_auth(auth_token); - } + match &self.token { + Some(token) => { + let request = self + .client + .get(format!("{}/user/lenses", self.endpoint)) + .bearer_auth(token) + .send() + .await? + .error_for_status()? + .json::>() + .await; + + let lenses = match request { + Ok(lenses) => lenses, + Err(err) => { + log::error!("Unable to get lenses: {}", err.to_string()); + Vec::new() + } + }; - let lenses = request - .send() - .await? - .error_for_status()? - .json::>() - .await; - - let lenses = match lenses { - Ok(lenses) => lenses, - Err(err) => { - log::error!("Unable to get lenses: {}", err.to_string()); - Vec::new() + Ok(UserData { lenses }) } - }; - - Ok(UserData { lenses }) + None => { + log::error!("User is not logged in"); + Ok(UserData { lenses: Vec::new() }) + } + } } } diff --git a/apps/web/src/components/nav.rs b/apps/web/src/components/nav.rs index e70ee89c6..71dcafa83 100644 --- a/apps/web/src/components/nav.rs +++ b/apps/web/src/components/nav.rs @@ -124,7 +124,11 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { /> } } else { - html! {} + html! { + + {"Sign In"} + + } }}
} @@ -151,7 +155,7 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { } } else { html! { - + {"Sign In"} } @@ -168,7 +172,11 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { {"Create Lens"} } - } else { html! {} }} + } else { + html! { +
{"Please login to see your lenses"}
+ } + }} {if let Some(user_data) = &user_data { html!{ html! { }, + Route::Start => { + html! { } + } Route::Edit { lens } => html! { diff --git a/apps/web/src/pages/landing.rs b/apps/web/src/pages/landing.rs index 4cdcfad65..ae9c5b040 100644 --- a/apps/web/src/pages/landing.rs +++ b/apps/web/src/pages/landing.rs @@ -1,14 +1,36 @@ use ui_components::btn::{Btn, BtnSize, BtnType}; -use yew::prelude::*; +use yew::{platform::spawn_local, prelude::*}; + +use crate::{ + auth0_login, + metrics::{Metrics, WebClientEvent}, +}; + +#[derive(Properties, PartialEq)] +pub struct LandingPageProps { + pub session_uuid: String, +} #[function_component(LandingPage)] -pub fn landing_page() -> Html { +pub fn landing_page(props: &LandingPageProps) -> Html { + let metrics = Metrics::new(false); + let uuid = props.session_uuid.clone(); + let auth_login = Callback::from(move |e: MouseEvent| { + e.prevent_default(); + let metrics = metrics.clone(); + let uuid = uuid.clone(); + spawn_local(async move { + metrics.track(WebClientEvent::Login, &uuid).await; + let _ = auth0_login().await; + }); + }); + html! { <>
diff --git a/apps/web/src/pages/mod.rs b/apps/web/src/pages/mod.rs index 11578eaf4..06d11da6b 100644 --- a/apps/web/src/pages/mod.rs +++ b/apps/web/src/pages/mod.rs @@ -13,7 +13,7 @@ pub struct AppPageProps { #[function_component] pub fn AppPage(props: &AppPageProps) -> Html { html! { -
+
{props.children.clone()}
} diff --git a/apps/web/src/pages/search.rs b/apps/web/src/pages/search.rs index a6258e2e1..bb53e6336 100644 --- a/apps/web/src/pages/search.rs +++ b/apps/web/src/pages/search.rs @@ -354,7 +354,21 @@ impl Component for SearchPage { fn view(&self, ctx: &yew::Context) -> yew::Html { let link = ctx.link(); if let Some(lens) = self.lens_data.clone() { - self.render_search(link, &lens) + html! { + <> + {self.render_search(link, &lens)} + + + } } else { html! {} } @@ -390,7 +404,7 @@ impl SearchPage { .collect::>(); html! { -
+
{lens.display_name.clone()}
{if cfg!(debug_assertions) { @@ -670,8 +684,8 @@ fn faq_component(props: &FAQComponentProps) -> Html { .collect::(); html! { -
-
{"Frequently Asked Questions"}
+
+
{"Example Questions"}
{"Not sure where to start? Try one of these questions"}
From a1d4f23019e077492f4b6c41d869c50c1194ae3b Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Thu, 25 May 2023 11:21:08 -0700 Subject: [PATCH 08/42] tweak(web): landing page tweaks + sentry web (#464) * adding atp to the mix again * create a PublicExample component so we don't repeat ourselves * some small tweaks to landing page to make it clearer * add sentry to web * cargo fmt --- apps/web/index.html | 4 ++ apps/web/src/pages/landing.rs | 111 +++++++++++++++++++--------------- 2 files changed, 67 insertions(+), 48 deletions(-) diff --git a/apps/web/index.html b/apps/web/index.html index 3e1eecc84..9f455b796 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -17,6 +17,10 @@ + diff --git a/apps/web/src/pages/landing.rs b/apps/web/src/pages/landing.rs index ae9c5b040..e58649449 100644 --- a/apps/web/src/pages/landing.rs +++ b/apps/web/src/pages/landing.rs @@ -37,10 +37,8 @@ pub fn landing_page(props: &LandingPageProps) -> Html { {"AI-powered "} {"search"} {" and "} - {"answers."} - {" Across"} - {" all "} - {"your content"} + {"chat."} + {" Across all your content"}
Html { } } + +#[derive(Properties, PartialEq)] +struct PublicExampleProps { + href: String, + name: String, + description: String, + sources: Vec, +} + +#[function_component(PublicExample)] +fn pub_example(props: &PublicExampleProps) -> Html { + let sources = props + .sources + .iter() + .map(|source| { + html! { + {source} + } + }) + .collect::(); + + html! { + +
{props.name.clone()}
+
{props.description.clone()}
+
+ {"source:"} + {sources} +
+
+ } +} From c651a84d31ba20e6975a2cd9cbde1fcd46e2acf9 Mon Sep 17 00:00:00 2001 From: Andrew Huynh Date: Fri, 26 May 2023 21:12:05 -0700 Subject: [PATCH 09/42] polish(web): lens edit UI (#465) * creating a dashboard page for signed in users and moving lenses out of navbar * adding home button to nav bar * splitting add source into it's own component * continuing to move more stuff over to add_source component * cleaning up source list & consolidate error msgs into an error bar at top * use danger button type for delete button * consolidating code for adding url * consolidating add_source * disable adding sources while we're in the middle of adding * limit the size of the paginator * show display name saving status & no need to pull entire lens data again * refresh source list if we detect something is in progress * reload lens data when a new source is successfully added * clear inputs after add source * cargo fmt + clippy --- apps/web/src/client.rs | 1 + apps/web/src/components/mod.rs | 24 +- apps/web/src/components/nav.rs | 98 +-- apps/web/src/main.rs | 24 +- apps/web/src/pages/dashboard.rs | 108 ++++ apps/web/src/pages/lens_edit.rs | 617 ------------------- apps/web/src/pages/lens_editor/add_source.rs | 404 ++++++++++++ apps/web/src/pages/lens_editor/mod.rs | 524 ++++++++++++++++ apps/web/src/pages/mod.rs | 3 +- crates/ui-components/src/btn.rs | 1 + crates/ui-components/src/icons/mod.rs | 9 + crates/ui-components/src/results.rs | 29 +- 12 files changed, 1120 insertions(+), 722 deletions(-) create mode 100644 apps/web/src/pages/dashboard.rs delete mode 100644 apps/web/src/pages/lens_edit.rs create mode 100644 apps/web/src/pages/lens_editor/add_source.rs create mode 100644 apps/web/src/pages/lens_editor/mod.rs diff --git a/apps/web/src/client.rs b/apps/web/src/client.rs index 2ec6a787d..2fbdaa3c9 100644 --- a/apps/web/src/client.rs +++ b/apps/web/src/client.rs @@ -218,6 +218,7 @@ pub enum LensAddDocType { GDrive { token: String, }, + RssFeed, /// Normal, web accessible URL. WebUrl { include_all_suburls: bool, diff --git a/apps/web/src/components/mod.rs b/apps/web/src/components/mod.rs index ee830804d..9a68f32d1 100644 --- a/apps/web/src/components/mod.rs +++ b/apps/web/src/components/mod.rs @@ -1,5 +1,5 @@ use ui_components::{ - btn::{Btn, BtnSize, BtnType}, + btn::{Btn, BtnSize}, icons, }; use yew::prelude::*; @@ -11,7 +11,6 @@ pub mod nav; #[derive(Properties, PartialEq)] pub struct LensListProps { - pub current: Option, pub lenses: Option>, #[prop_or_default] pub on_select: Callback, @@ -40,18 +39,10 @@ pub fn lens_list(props: &LensListProps) -> Html { props.class.clone(), ); - let current_lens = props.current.clone().unwrap_or_default(); let mut html = Vec::new(); let lenses = props.lenses.clone(); for lens in lenses.unwrap_or_default() { - let classes = classes!( - default_classes.clone(), - if current_lens == lens.name { - Some("bg-cyan-800") - } else { - None - } - ); + let classes = classes!(default_classes.clone(),); let onclick = { let navi = navigator.clone(); @@ -90,22 +81,23 @@ pub fn lens_list(props: &LensListProps) -> Html { html! {} } else { html! { - + + {"Edit"} } }; html.push(html! { -
  • +
  • {icon} -
    {lens.display_name.clone()}
    - {edit_icon} +
    {lens.display_name.clone()}
    + {edit_icon}
  • }); } - html! {
      {html}
    } + html! {
      {html}
    } } diff --git a/apps/web/src/components/nav.rs b/apps/web/src/components/nav.rs index 71dcafa83..b399f4732 100644 --- a/apps/web/src/components/nav.rs +++ b/apps/web/src/components/nav.rs @@ -1,30 +1,19 @@ use ui_components::btn::{Btn, BtnSize, BtnType}; use ui_components::icons; use yew::{platform::spawn_local, prelude::*}; -use yew_router::prelude::use_navigator; -use super::LensList; -use crate::client::Lens; use crate::metrics::{Metrics, WebClientEvent}; -use crate::{auth0_login, auth0_logout, AuthStatus, Route}; +use crate::{auth0_login, auth0_logout, AuthStatus}; #[derive(Properties, PartialEq)] pub struct NavBarProps { pub current_lens: Option, - #[prop_or_default] - pub on_create_lens: Callback, - #[prop_or_default] - pub on_select_lens: Callback, - #[prop_or_default] - pub on_edit_lens: Callback, pub session_uuid: String, } #[function_component(NavBar)] pub fn nav_bar_component(props: &NavBarProps) -> Html { - let navigator = use_navigator().expect("Navigator not available"); let auth_status = use_context::().expect("Ctxt not set up"); - let user_data = auth_status.user_data.clone(); let toggle_nav = use_state(|| false); let metrics = Metrics::new(false); let uuid = props.session_uuid.clone(); @@ -51,27 +40,6 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { }); }); - let auth_status_handle = auth_status.clone(); - let on_create = props.on_create_lens.clone(); - let create_lens_cb = Callback::from(move |_| { - let navigator = navigator.clone(); - let auth_status_handle: AuthStatus = auth_status_handle.clone(); - let on_create = on_create.clone(); - spawn_local(async move { - // create a new lens - let api = auth_status_handle.get_client(); - match api.lens_create().await { - Ok(new_lens) => { - on_create.emit(new_lens.clone()); - navigator.push(&Route::Edit { - lens: new_lens.name, - }) - } - Err(err) => log::error!("error creating lens: {err}"), - } - }); - }); - #[cfg(debug_assertions)] let debug_vars = html! { <> @@ -113,15 +81,14 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html { { if *toggle_nav { html! {
    - {if let Some(user_data) = &user_data { - html!{ - + {if auth_status.is_authenticated { + html! { + } } else { html! { @@ -136,7 +103,7 @@ pub fn nav_bar_component(props: &NavBarProps) -> Html {