file uploaded page
This commit is contained in:
parent
bddd63e134
commit
a201fd579d
|
@ -1,3 +1,7 @@
|
|||
:80 {
|
||||
reverse_proxy http://filed
|
||||
handle /qr/* {
|
||||
uri * strip_prefix /qr
|
||||
reverse_proxy http://qr
|
||||
}
|
||||
}
|
|
@ -25,6 +25,10 @@ services:
|
|||
command: [ 'redis-server', '--requirepass', '$REDIS_PASS' ]
|
||||
ports:
|
||||
- 6379:6379
|
||||
qr:
|
||||
image: blekii/miniqr
|
||||
networks:
|
||||
bfile:
|
||||
|
||||
networks:
|
||||
bfile:
|
|
@ -288,6 +288,7 @@ dependencies = [
|
|||
"sha2",
|
||||
"static_dir",
|
||||
"tokio",
|
||||
"urlencoding 2.1.3",
|
||||
"warp",
|
||||
]
|
||||
|
||||
|
@ -1067,7 +1068,7 @@ dependencies = [
|
|||
"log",
|
||||
"mime_guess",
|
||||
"once_cell",
|
||||
"urlencoding",
|
||||
"urlencoding 1.3.3",
|
||||
"warp",
|
||||
]
|
||||
|
||||
|
@ -1366,6 +1367,12 @@ version = "1.3.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a1f0175e03a0973cf4afd476bef05c26e228520400eb1fd473ad417b1c00ffb"
|
||||
|
||||
[[package]]
|
||||
name = "urlencoding"
|
||||
version = "2.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
|
||||
|
||||
[[package]]
|
||||
name = "utf-8"
|
||||
version = "0.7.6"
|
||||
|
|
|
@ -22,6 +22,7 @@ serde_json = "1.0.107"
|
|||
sha2 = "0.10.8"
|
||||
static_dir = "0.2.0"
|
||||
tokio = { version = "1.32.0", features = ["rt", "macros", "rt-multi-thread"] }
|
||||
urlencoding = "2.1.3"
|
||||
warp = "0.3.6"
|
||||
|
||||
[profile.release]
|
||||
|
|
|
@ -13,7 +13,7 @@ use serde::Serialize;
|
|||
|
||||
use crate::files::{File, lookup::LookupKind};
|
||||
|
||||
use super::{state::SharedState, pages::BadActionReq, rejection::HttpReject};
|
||||
use super::{state::SharedState, pages::{BadActionReq, UploadSuccessPage}, rejection::HttpReject};
|
||||
|
||||
#[derive(Debug, Serialize)]
|
||||
struct FormElement {
|
||||
|
@ -99,7 +99,13 @@ pub async fn upload(form: FormData, state: SharedState) -> Result<Box<dyn Reply>
|
|||
}
|
||||
}).map_err(|err| warp::reject::custom(HttpReject::StringError(err.to_string())))?;
|
||||
|
||||
Ok(Box::new(warp::reply::json(¶ms)))
|
||||
let uploaded = UploadSuccessPage {
|
||||
env: state.env.clone(),
|
||||
link: "uwu".into()
|
||||
};
|
||||
|
||||
Ok(Box::new(warp::reply::html(uploaded.render().unwrap())))
|
||||
|
||||
}
|
||||
|
||||
pub fn get_routes(state: SharedState) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
|
||||
|
|
|
@ -38,6 +38,14 @@ pub struct PasswordedFilesHelpPage {
|
|||
pub env: Env
|
||||
}
|
||||
|
||||
#[derive(Template)]
|
||||
#[template( path = "upload_success.html" )]
|
||||
#[allow(dead_code)]
|
||||
pub struct UploadSuccessPage {
|
||||
pub env: Env,
|
||||
pub link: String
|
||||
}
|
||||
|
||||
|
||||
pub async fn uploaded(query: HashMap<String, String>, state: SharedState) -> Result<Html<String>, Rejection> {
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,5 @@
|
|||
@media (max-width:667px) {
|
||||
.mobile-hide {
|
||||
display: none
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block head %}
|
||||
|
||||
<link rel="stylesheet" href="/mobile-hide.css"></link>
|
||||
<style>
|
||||
.qr-code {
|
||||
display: block;
|
||||
min-height: min(160px, 35vw);
|
||||
width: min(160px, 35vw);
|
||||
object-fit: contain;
|
||||
image-rendering: pixelated;
|
||||
padding: min(40px, 8vw);
|
||||
background: white;
|
||||
margin: min(40px, 8vw) auto;
|
||||
border-radius: 12px;
|
||||
}
|
||||
.btn-fill {
|
||||
width: calc(100% - var(--margin-x));
|
||||
}
|
||||
</style>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
|
||||
<div style="max-width:75vw;width:fit-content;margin:0 auto;text-align:center">
|
||||
<h1 style="text-align:center;margin-bottom:0">File uploaded successfully!</h1>
|
||||
<p style="margin-top:4px;font-size:90%">
|
||||
It is available via the following link:
|
||||
<a href='{{ link }}'>
|
||||
{{ link }}
|
||||
</a>
|
||||
</p>
|
||||
<div style="width:100%">
|
||||
<img src="{{ env.instanceurl }}/qr/{{ urlencoding::encode(link) }}" class="qr-code">
|
||||
</div>
|
||||
<a href="/" role="button" class="btn btn-fill" style="display:block" >
|
||||
Upload another file
|
||||
</a>
|
||||
<br/>
|
||||
<div class="js-only btn btn-fill" style="cursor:pointer" id="btn-upload-done" data-clipboard-text="{{ env.instanceurl }}/qr/{{ urlencoding::encode(link) }}">
|
||||
Copy link
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
|
||||
<script>document.getElementById('btn-upload-done').style.display = 'block'</script>
|
||||
<script src="https://unpkg.com/clipboard@2/dist/clipboard.min.js"></script>
|
||||
<script>
|
||||
new ClipboardJS('#btn-upload-done');
|
||||
(()=>{
|
||||
let e = document.getElementById('btn-upload-done');
|
||||
let animating = false;
|
||||
e.onclick = () => {
|
||||
if (animating) return
|
||||
let old = e.innerText;
|
||||
e.innerText = 'Copied!'
|
||||
animating = true;
|
||||
setTimeout(() => {
|
||||
e.innerText = old;
|
||||
animating = false
|
||||
}, 1500);
|
||||
}
|
||||
})()
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
Loading…
Reference in New Issue