Skip to content

Commit 02b59e6

Browse files
committed
fix use_router in conditional issue and refactor dev.sh
1 parent 8c815e0 commit 02b59e6

File tree

4 files changed

+58
-42
lines changed

4 files changed

+58
-42
lines changed

backend/src/main.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use log::info;
1212
use path_absolutize::Absolutize;
1313
use path_dedot::*;
1414
use serde::Deserialize;
15-
use std::net::{IpAddr, Ipv6Addr, SocketAddr};
15+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
1616
use std::path::PathBuf;
1717
use std::process::Command;
1818
use std::str::FromStr;
@@ -34,16 +34,16 @@ struct Opt {
3434
log_level: String,
3535

3636
/// set the listen addr
37-
#[clap(short = 'a', long = "addr", default_value = "::1")]
37+
#[clap(short = 'a', long = "addr", default_value = "0.0.0.0")]
3838
addr: String,
3939

4040
/// set the listen port
4141
#[clap(short = 'p', long = "port", default_value = "8080")]
4242
port: u16,
4343

4444
/// set the directory where static files are to be found
45-
#[clap(long = "static-dir", default_value = "../dist")]
46-
static_dir: String,
45+
#[clap(long = "assets-dir", default_value = "../assets")]
46+
assets_dir: String,
4747

4848
/// the directory to serve, default to the current directory if not specified
4949
#[clap(long = "serve-dir", default_value = ".")]
@@ -74,6 +74,17 @@ async fn main() {
7474
}
7575
}
7676

77+
let assets_dir = match PathBuf::from(&opt.assets_dir).parse_dot() {
78+
Ok(assets_dir) if assets_dir.is_dir() => {
79+
info!("assets_dir: {:?}", assets_dir);
80+
log::info!("assets_dir directory: {:?}", assets_dir);
81+
assets_dir.to_path_buf()
82+
}
83+
_ => {
84+
panic!("assets-dir must be a valid directory");
85+
}
86+
};
87+
7788
let app = Router::new()
7889
.route("/api/listing", get(serve_root).post(serve_root))
7990
.route("/api/listing/*path", get(list_files).post(create_dir))
@@ -87,11 +98,11 @@ async fn main() {
8798
}))
8899
.handle_error(|_| async move { AppError("Static file not found".to_string()) }),
89100
)
90-
.merge(SpaRouter::new("/assets", "./frontend/dist").index_file("index.html"))
101+
.merge(SpaRouter::new("/assets", assets_dir).index_file("index.html"))
91102
.layer(ServiceBuilder::new().layer(TraceLayer::new_for_http()));
92103

93104
let sock_addr = SocketAddr::from((
94-
IpAddr::from_str(opt.addr.as_str()).unwrap_or(IpAddr::V6(Ipv6Addr::LOCALHOST)),
105+
IpAddr::from_str(opt.addr.as_str()).unwrap_or(IpAddr::V4(Ipv4Addr::LOCALHOST)),
95106
opt.port,
96107
));
97108

dev.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ IFS=$'\n\t'
77
# bash -c 'cd backend; cargo watch -- cargo run -- --port 8081')
88

99
bash -c 'cd frontend; trunk serve --address 0.0.0.0 --port 8082 --proxy-backend=http://[::1]:8081/api' & \
10-
bash -c 'cargo watch -- cargo run --bin backend -- --port 8081 --serve-dir ./testdir')
10+
bash -c 'cargo watch -w backend/src -- cargo run --bin backend -- --port 8081 --serve-dir ./testdir --assets-dir ./frontend/dist')

frontend/src/main.rs

+39-34
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,15 @@ fn Listing(cx: Scope) -> Element {
5050
fut.restart();
5151
}
5252

53+
let router_state = use_router(&cx);
5354
let create_dir_state = use_state(&cx, || None as Option<String>);
5455
if let Some(dir_path) = create_dir_state.get() {
5556
create_dir_state.set(None);
5657
fut.restart();
57-
use_router(&cx).replace_route(dir_path.as_str(), None, None);
58+
router_state.replace_route(dir_path.as_str(), None, None);
5859

5960
return cx.render(rsx! {
60-
Router {
61-
Route { to: "", Listing {} }
62-
}
61+
Listing {}
6362
});
6463
}
6564

@@ -101,7 +100,7 @@ fn CreateDirectory(
101100
}
102101

103102
let parent_dir = parent_dir.clone();
104-
let create_dir_state = create_dir_state.clone();
103+
let create_dir_state = create_dir_state.to_owned();
105104
cx.spawn(async move {
106105
let json_req = JsonRequest::CreateDirectory {
107106
dir_name: dir_name.clone(),
@@ -116,7 +115,11 @@ fn CreateDirectory(
116115
match resp {
117116
Ok(resp) => {
118117
info!("created directory: {:?}", resp);
119-
create_dir_state.set(Some(format!("{}/{}", parent_dir, dir_name)));
118+
create_dir_state.set(Some(if parent_dir == "/" {
119+
dir_name
120+
} else {
121+
format!("{}/{}", parent_dir, dir_name)
122+
}));
120123
}
121124
Err(err) => {
122125
info!("failed to create directory: {}", err);
@@ -293,36 +296,38 @@ fn TableRow<'a>(cx: Scope<'a, DirEntryProps<'a>>) -> Element {
293296
img { src:"data:image/x-icon;base64,AAABAAEAEBACAAAAAACwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAQAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAA////AAKnAAB6MgAASlIAAEtCAAB7AAAAAnkAAP/YAACDBQAAUGMAAPy/AAACQAAAel4AAEpSAABK0gAAel4AAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", alt:"QRCode" }
294297
}
295298

296-
a {
297-
href: "#",
298-
prevent_default: "onclick",
299-
onclick: move |_| {
300-
let path = format!("/api/ffprobe{}/{}", cx.props.cur_path, entry.file_name);
301-
let info_state = cx.props.info_state.clone();
302-
cx.spawn(async move {
303-
let resp = Request::get(path.as_str())
304-
.send()
305-
.await;
306-
307-
match resp {
308-
Ok(resp) => {
309-
let text = resp.text().await.unwrap_or("".to_string());
310-
if text.is_empty() || text == "\"{\\n\\n}\\n\"" {
311-
info_state.set(Some("Not Available!".to_string()));
312-
} else {
313-
let json_resp: serde_json::Value = serde_json::from_str(text.as_str()).unwrap_or(serde_json::Value::default());
314-
let json_str = json_resp.to_string().replace("\\n", "\n").replace("\\", "");
315-
info_state.set(Some(json_str));
299+
(entry.file_type == common::FileType::File).then(|| rsx!(
300+
a {
301+
href: "#",
302+
prevent_default: "onclick",
303+
onclick: move |_| {
304+
let path = format!("/api/ffprobe{}/{}", cx.props.cur_path, entry.file_name);
305+
let info_state = cx.props.info_state.clone();
306+
cx.spawn(async move {
307+
let resp = Request::get(path.as_str())
308+
.send()
309+
.await;
310+
311+
match resp {
312+
Ok(resp) => {
313+
let text = resp.text().await.unwrap_or("".to_string());
314+
if text.is_empty() || text == "\"{\\n\\n}\\n\"" {
315+
info_state.set(Some("Not Available!".to_string()));
316+
} else {
317+
let json_resp: serde_json::Value = serde_json::from_str(text.as_str()).unwrap_or(serde_json::Value::default());
318+
let json_str = json_resp.to_string().replace("\\n", "\n").replace("\\", "");
319+
info_state.set(Some(json_str));
320+
}
321+
}
322+
Err(err) => {
323+
error!("failed: {}", err);
316324
}
317325
}
318-
Err(err) => {
319-
error!("failed: {}", err);
320-
}
321-
}
322-
});
323-
},
324-
"ℹ️ ",
325-
}
326+
});
327+
},
328+
"ℹ️ ",
329+
}
330+
)),
326331

327332
a {
328333
href: "{api_link}",

prod.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ IFS=$'\n\t'
1111
popd
1212

1313
mkdir -p testdir
14-
cargo run --bin backend -- --port 8082 --serve-dir ./testdir
14+
cargo run --bin backend -- --port 8082 --serve-dir ./testdir --assets-dir ./frontend/dist

0 commit comments

Comments
 (0)