allow specifying language via client cookie
This commit is contained in:
24
src/game.rs
24
src/game.rs
@@ -10,7 +10,7 @@ use axum::{
|
||||
routing::{get, post},
|
||||
Form, Router,
|
||||
};
|
||||
use axum_extra::extract::PrivateCookieJar;
|
||||
use axum_extra::extract::{CookieJar, PrivateCookieJar};
|
||||
use maud::{html, Markup, PreEscaped};
|
||||
use serde::Deserialize;
|
||||
use std::sync::Arc;
|
||||
@@ -19,18 +19,20 @@ use uuid::Uuid;
|
||||
async fn index(
|
||||
State(backend): State<Arc<Backend>>,
|
||||
cookies: PrivateCookieJar,
|
||||
lang_cookies: CookieJar,
|
||||
headers: HeaderMap,
|
||||
) -> Response {
|
||||
retu(backend, cookies, headers, None).await
|
||||
retu(backend, cookies, lang_cookies, headers, None).await
|
||||
}
|
||||
|
||||
async fn retu(
|
||||
backend: Arc<Backend>,
|
||||
cookies: PrivateCookieJar,
|
||||
lang_cookies: CookieJar,
|
||||
headers: HeaderMap,
|
||||
message: Option<MyMessage>,
|
||||
) -> Response {
|
||||
let (cookies, req) = backend.client_full(cookies, &headers).await;
|
||||
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
|
||||
let client = req.client;
|
||||
rust_i18n::set_locale(&req.lang.to_string());
|
||||
|
||||
@@ -107,19 +109,20 @@ async fn retu(
|
||||
async fn game(
|
||||
State(backend): State<Arc<Backend>>,
|
||||
cookies: PrivateCookieJar,
|
||||
lang_cookies: CookieJar,
|
||||
headers: HeaderMap,
|
||||
Path(uuid): Path<String>,
|
||||
) -> Response {
|
||||
let (cookies, req) = backend.client_full(cookies, &headers).await;
|
||||
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
|
||||
let client = req.client;
|
||||
rust_i18n::set_locale(req.lang.to_locale());
|
||||
|
||||
let Ok(uuid) = Uuid::parse_str(&uuid) else {
|
||||
return not_found(cookies, headers).await.into_response();
|
||||
return not_found(lang_cookies, headers).await.into_response();
|
||||
};
|
||||
|
||||
let Some(camera) = backend.get_camera(&uuid).await else {
|
||||
return not_found(cookies, headers).await.into_response();
|
||||
return not_found(lang_cookies, headers).await.into_response();
|
||||
};
|
||||
|
||||
let message = if let Ok(number) = backend.client_found_camera(&client, &camera).await {
|
||||
@@ -132,10 +135,10 @@ async fn game(
|
||||
)
|
||||
};
|
||||
|
||||
retu(backend, cookies, headers, Some(message)).await
|
||||
retu(backend, cookies, lang_cookies, headers, Some(message)).await
|
||||
}
|
||||
|
||||
async fn not_found(cookies: PrivateCookieJar, headers: HeaderMap) -> Markup {
|
||||
async fn not_found(cookies: CookieJar, headers: HeaderMap) -> Markup {
|
||||
let lang = language(&cookies, &headers);
|
||||
Page::new(lang).content(html! {
|
||||
h1 { (t!("not_found_title")) }
|
||||
@@ -150,10 +153,11 @@ struct NameForm {
|
||||
async fn set_name(
|
||||
State(backend): State<Arc<Backend>>,
|
||||
cookies: PrivateCookieJar,
|
||||
lang_cookies: CookieJar,
|
||||
headers: HeaderMap,
|
||||
Form(form): Form<NameForm>,
|
||||
) -> Response {
|
||||
let (cookies, req) = backend.client_full(cookies, &headers).await;
|
||||
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
|
||||
let client = req.client;
|
||||
rust_i18n::set_locale(req.lang.to_locale());
|
||||
|
||||
@@ -176,7 +180,7 @@ async fn set_name(
|
||||
),
|
||||
};
|
||||
|
||||
retu(backend, cookies, headers, Some(message)).await
|
||||
retu(backend, cookies, lang_cookies, headers, Some(message)).await
|
||||
}
|
||||
|
||||
pub(super) fn routes() -> Router<AppState> {
|
||||
|
@@ -1,9 +1,9 @@
|
||||
use crate::{language::language, page::Page};
|
||||
use axum::http::HeaderMap;
|
||||
use axum_extra::extract::PrivateCookieJar;
|
||||
use axum_extra::extract::CookieJar;
|
||||
use maud::{html, Markup, PreEscaped};
|
||||
|
||||
pub(super) async fn index(cookies: PrivateCookieJar, headers: HeaderMap) -> Markup {
|
||||
pub(super) async fn index(cookies: CookieJar, headers: HeaderMap) -> Markup {
|
||||
let lang = language(&cookies, &headers);
|
||||
rust_i18n::set_locale(lang.to_locale());
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
use crate::Language;
|
||||
use axum::http::HeaderMap;
|
||||
use axum_extra::extract::PrivateCookieJar;
|
||||
use axum_extra::extract::CookieJar;
|
||||
|
||||
pub(crate) fn language(cookies: &PrivateCookieJar, headers: &HeaderMap) -> Language {
|
||||
pub(crate) fn language(cookies: &CookieJar, headers: &HeaderMap) -> Language {
|
||||
if let Some(lang_cookie) = cookies.clone().get("language") {
|
||||
// Return existing language cookie
|
||||
lang_cookie.value().to_string().into()
|
||||
|
@@ -2,7 +2,7 @@ use crate::model::client::Client;
|
||||
use axum::{http::HeaderMap, routing::get, Router};
|
||||
use axum_extra::extract::{
|
||||
cookie::{Cookie, Expiration, Key},
|
||||
PrivateCookieJar,
|
||||
CookieJar, PrivateCookieJar,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sqlx::{pool::PoolOptions, sqlite::SqliteConnectOptions, SqlitePool};
|
||||
@@ -172,10 +172,11 @@ impl Backend {
|
||||
async fn client_full(
|
||||
&self,
|
||||
cookies: PrivateCookieJar,
|
||||
lang_cookies: &CookieJar,
|
||||
headers: &HeaderMap,
|
||||
) -> (PrivateCookieJar, Req) {
|
||||
let (cookies, client) = self.client(cookies).await;
|
||||
let lang = language::language(&cookies, headers);
|
||||
let lang = language::language(&lang_cookies, headers);
|
||||
(cookies, Req { client, lang })
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user