diff --git a/web/public/config.js b/web/public/config.js
index 63bc97bd..2f21dcdd 100644
--- a/web/public/config.js
+++ b/web/public/config.js
@@ -6,9 +6,10 @@
// During web development, you may change values here for rapid testing.
var config = {
- base_url: window.location.origin, // Change to test against a different server
+ base_url: "http://localhost:8080", // window.location.origin, // Change to test against a different server
app_root: "/",
enable_login: true,
+ require_login: true,
enable_signup: true,
enable_payments: false,
enable_reservations: true,
diff --git a/web/src/app/utils.js b/web/src/app/utils.js
index b798589c..c9ad8887 100644
--- a/web/src/app/utils.js
+++ b/web/src/app/utils.js
@@ -79,7 +79,7 @@ export const maybeWithBearerAuth = (headers, token) => {
export const withBasicAuth = (headers, username, password) => ({
...headers,
- Authorization: basicAuth(username, password)
+ Authorization: basicAuth(username, password),
});
export const maybeWithAuth = (headers, user) => {
@@ -142,7 +142,7 @@ export const getKebabCaseLangStr = (language) => language.replace(/_/g, "-");
export const formatShortDateTime = (timestamp, language) =>
new Intl.DateTimeFormat(getKebabCaseLangStr(language), {
dateStyle: "short",
- timeStyle: "short"
+ timeStyle: "short",
}).format(new Date(timestamp * 1000));
export const formatShortDate = (timestamp, language) =>
@@ -181,32 +181,32 @@ export const openUrl = (url) => {
export const sounds = {
ding: {
file: ding,
- label: "Ding"
+ label: "Ding",
},
juntos: {
file: juntos,
- label: "Juntos"
+ label: "Juntos",
},
pristine: {
file: pristine,
- label: "Pristine"
+ label: "Pristine",
},
dadum: {
file: dadum,
- label: "Dadum"
+ label: "Dadum",
},
pop: {
file: pop,
- label: "Pop"
+ label: "Pop",
},
"pop-swoosh": {
file: popSwoosh,
- label: "Pop swoosh"
+ label: "Pop swoosh",
},
beep: {
file: beep,
- label: "Beep"
- }
+ label: "Beep",
+ },
};
export const playSound = async (id) => {
@@ -219,7 +219,7 @@ export const playSound = async (id) => {
export async function* fetchLinesIterator(fileURL, headers) {
const utf8Decoder = new TextDecoder("utf-8");
const response = await fetch(fileURL, {
- headers
+ headers,
});
const reader = response.body.getReader();
let { value: chunk, done: readerDone } = await reader.read();
@@ -228,7 +228,7 @@ export async function* fetchLinesIterator(fileURL, headers) {
const re = /\n|\r|\r\n/gm;
let startIndex = 0;
- for (; ;) {
+ for (;;) {
const result = re.exec(chunk);
if (!result) {
if (readerDone) {
diff --git a/web/src/components/App.jsx b/web/src/components/App.jsx
index 7f84b7de..9a2c3e66 100644
--- a/web/src/components/App.jsx
+++ b/web/src/components/App.jsx
@@ -23,6 +23,7 @@ import Account from "./Account";
import initI18n from "../app/i18n"; // Translations!
import prefs, { THEME } from "../app/Prefs";
import RTLCacheProvider from "./RTLCacheProvider";
+import session from "../app/Session";
initI18n();
@@ -45,7 +46,6 @@ const darkModeEnabled = (prefersDarkMode, themePreference) => {
const App = () => {
const { i18n } = useTranslation();
const languageDir = i18n.dir();
-
const [account, setAccount] = useState(null);
const accountMemo = useMemo(() => ({ account, setAccount }), [account, setAccount]);
const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
@@ -60,6 +60,12 @@ const App = () => {
document.dir = languageDir;
}, [i18n.language, languageDir]);
+ useEffect(() => {
+ if (!session.exists() && config.require_login && window.location.pathname !== routes.login) {
+ window.location.href = routes.login;
+ }
+ }, []);
+
return (
}>
diff --git a/web/src/components/Notifications.jsx b/web/src/components/Notifications.jsx
index 9f984431..449b238b 100644
--- a/web/src/components/Notifications.jsx
+++ b/web/src/components/Notifications.jsx
@@ -28,7 +28,13 @@ import { useRemark } from "react-remark";
import styled from "@emotion/styled";
import {
copyToClipboard,
- formatBytes, formatShortDateTime, maybeActionErrors, openUrl, shortUrl, topicShortUrl, unmatchedTags
+ formatBytes,
+ formatShortDateTime,
+ maybeActionErrors,
+ openUrl,
+ shortUrl,
+ topicShortUrl,
+ unmatchedTags,
} from "../app/utils";
import { formatMessage, formatTitle, isImage } from "../app/notificationUtils";
import { LightboxBackdrop, Paragraph, VerticallyCenteredContainer } from "./styles";