{intent.type === 'directory' ? (
diff --git a/src/ui/Desktop/Apps/File Manager/components/FileViewer.tsx b/src/ui/Desktop/Apps/File Manager/components/FileViewer.tsx
index 3c632c50..7b30b364 100644
--- a/src/ui/Desktop/Apps/File Manager/components/FileViewer.tsx
+++ b/src/ui/Desktop/Apps/File Manager/components/FileViewer.tsx
@@ -472,7 +472,7 @@ export function FileViewer({
}
}}
className="flex items-center gap-2"
- title="Search in file (Ctrl+F)"
+ title={t("fileManager.searchInFile")}
>
@@ -484,7 +484,7 @@ export function FileViewer({
size="sm"
onClick={() => setShowKeyboardShortcuts(!showKeyboardShortcuts)}
className="flex items-center gap-2"
- title="Show keyboard shortcuts"
+ title={t("fileManager.showKeyboardShortcuts")}
>
@@ -928,7 +928,7 @@ export function FileViewer({
onContentChange?.(e.target.value);
}}
className="w-full h-full resize-none border-0 bg-transparent text-foreground font-mono text-sm leading-relaxed focus:outline-none focus:ring-0"
- placeholder="Start writing your markdown content..."
+ placeholder={t("fileManager.startWritingMarkdown")}
/>
diff --git a/src/ui/Desktop/Homepage/HomepageAuth.tsx b/src/ui/Desktop/Homepage/HomepageAuth.tsx
index 93628fee..3f8189b6 100644
--- a/src/ui/Desktop/Homepage/HomepageAuth.tsx
+++ b/src/ui/Desktop/Homepage/HomepageAuth.tsx
@@ -845,7 +845,6 @@ export function HomepageAuth({
{resetStep === "verify" && (
<>
- o
{t("auth.enterResetCode")}{" "}
diff --git a/src/ui/Mobile/Homepage/HomepageAuth.tsx b/src/ui/Mobile/Homepage/HomepageAuth.tsx
index ae91956c..98081237 100644
--- a/src/ui/Mobile/Homepage/HomepageAuth.tsx
+++ b/src/ui/Mobile/Homepage/HomepageAuth.tsx
@@ -6,6 +6,7 @@ import { Label } from "@/components/ui/label.tsx";
import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert.tsx";
import { useTranslation } from "react-i18next";
import { LanguageSwitcher } from "@/ui/Desktop/User/LanguageSwitcher.tsx";
+import { toast } from "sonner";
import {
registerUser,
loginUser,
@@ -92,6 +93,12 @@ export function HomepageAuth({
});
}, []);
+ useEffect(() => {
+ if (!registrationAllowed && !internalLoggedIn) {
+ toast.warning(t("messages.registrationDisabled"));
+ }
+ }, [registrationAllowed, internalLoggedIn, t]);
+
useEffect(() => {
getOIDCConfig()
.then((response) => {
@@ -116,6 +123,7 @@ export function HomepageAuth({
if (res.setup_required) {
setFirstUser(true);
setTab("signup");
+ toast.info(t("auth.firstUserMessage"));
} else {
setFirstUser(false);
}
@@ -124,7 +132,7 @@ export function HomepageAuth({
.catch(() => {
setDbError(t("errors.databaseConnection"));
});
- }, [setDbError]);
+ }, [setDbError, t]);
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
@@ -132,7 +140,7 @@ export function HomepageAuth({
setLoading(true);
if (!localUsername.trim()) {
- setError(t("errors.requiredField"));
+ toast.error(t("errors.requiredField"));
setLoading(false);
return;
}
@@ -143,12 +151,12 @@ export function HomepageAuth({
res = await loginUser(localUsername, password);
} else {
if (password !== signupConfirmPassword) {
- setError(t("errors.passwordMismatch"));
+ toast.error(t("errors.passwordMismatch"));
setLoading(false);
return;
}
if (password.length < 6) {
- setError(t("errors.minLength", { min: 6 }));
+ toast.error(t("errors.minLength", { min: 6 }));
setLoading(false);
return;
}
@@ -185,12 +193,15 @@ export function HomepageAuth({
setInternalLoggedIn(true);
if (tab === "signup") {
setSignupConfirmPassword("");
+ toast.success(t("messages.registrationSuccess"));
+ } else {
+ toast.success(t("messages.loginSuccess"));
}
setTotpRequired(false);
setTotpCode("");
setTotpTempToken("");
} catch (err: any) {
- setError(
+ toast.error(
err?.response?.data?.error || err?.message || t("errors.unknownError"),
);
setInternalLoggedIn(false);
@@ -215,9 +226,9 @@ export function HomepageAuth({
try {
const result = await initiatePasswordReset(localUsername);
setResetStep("verify");
- setError(null);
+ toast.success(t("messages.resetCodeSent"));
} catch (err: any) {
- setError(
+ toast.error(
err?.response?.data?.error ||
err?.message ||
t("errors.failedPasswordReset"),
@@ -234,9 +245,9 @@ export function HomepageAuth({
const response = await verifyPasswordResetCode(localUsername, resetCode);
setTempToken(response.tempToken);
setResetStep("newPassword");
- setError(null);
+ toast.success(t("messages.codeVerified"));
} catch (err: any) {
- setError(err?.response?.data?.error || t("errors.failedVerifyCode"));
+ toast.error(err?.response?.data?.error || t("errors.failedVerifyCode"));
} finally {
setResetLoading(false);
}
@@ -247,13 +258,13 @@ export function HomepageAuth({
setResetLoading(true);
if (newPassword !== confirmPassword) {
- setError(t("errors.passwordMismatch"));
+ toast.error(t("errors.passwordMismatch"));
setResetLoading(false);
return;
}
if (newPassword.length < 6) {
- setError(t("errors.minLength", { min: 6 }));
+ toast.error(t("errors.minLength", { min: 6 }));
setResetLoading(false);
return;
}
@@ -269,8 +280,9 @@ export function HomepageAuth({
setError(null);
setResetSuccess(true);
+ toast.success(t("messages.passwordResetSuccess"));
} catch (err: any) {
- setError(err?.response?.data?.error || t("errors.failedCompleteReset"));
+ toast.error(err?.response?.data?.error || t("errors.failedCompleteReset"));
} finally {
setResetLoading(false);
}
@@ -295,7 +307,7 @@ export function HomepageAuth({
async function handleTOTPVerification() {
if (totpCode.length !== 6) {
- setError(t("auth.enterCode"));
+ toast.error(t("auth.enterCode"));
return;
}
@@ -327,8 +339,9 @@ export function HomepageAuth({
setTotpRequired(false);
setTotpCode("");
setTotpTempToken("");
+ toast.success(t("messages.loginSuccess"));
} catch (err: any) {
- setError(
+ toast.error(
err?.response?.data?.error ||
err?.message ||
t("errors.invalidTotpCode"),
@@ -351,7 +364,7 @@ export function HomepageAuth({
window.location.replace(authUrl);
} catch (err: any) {
- setError(
+ toast.error(
err?.response?.data?.error ||
err?.message ||
t("errors.failedOidcLogin"),
@@ -367,7 +380,7 @@ export function HomepageAuth({
const error = urlParams.get("error");
if (error) {
- setError(`${t("errors.oidcAuthFailed")}: ${error}`);
+ toast.error(`${t("errors.oidcAuthFailed")}: ${error}`);
setOidcLoading(false);
window.history.replaceState({}, document.title, window.location.pathname);
return;
@@ -399,7 +412,7 @@ export function HomepageAuth({
);
})
.catch((err) => {
- setError(t("errors.failedUserInfo"));
+ toast.error(t("errors.failedUserInfo"));
setInternalLoggedIn(false);
setLoggedIn(false);
setIsAdmin(false);
@@ -451,31 +464,6 @@ export function HomepageAuth({
{dbError}
)}
- {firstUser && !dbError && !internalLoggedIn && (
-
- {t("auth.firstUser")}
-
- {t("auth.firstUserMessage")}{" "}
-
- GitHub Issue
-
- .
-
-
- )}
- {!registrationAllowed && !internalLoggedIn && (
-
- {t("auth.registerTitle")}
-
- {t("messages.registrationDisabled")}
-
-
- )}
{totpRequired && (
@@ -709,14 +697,11 @@ export function HomepageAuth({
{resetSuccess && (
<>
-
-
- {t("auth.passwordResetSuccess")}
-
-
+
+
{t("auth.passwordResetSuccessDesc")}
-
-
+
+
);
}
diff --git a/src/ui/Mobile/MobileApp.tsx b/src/ui/Mobile/MobileApp.tsx
index aadba28a..689873c7 100644
--- a/src/ui/Mobile/MobileApp.tsx
+++ b/src/ui/Mobile/MobileApp.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, type FC } from "react";
import { Terminal } from "@/ui/Mobile/Apps/Terminal/Terminal.tsx";
import { TerminalKeyboard } from "@/ui/Mobile/Apps/Terminal/TerminalKeyboard.tsx";
import { BottomNavbar } from "@/ui/Mobile/Navigation/BottomNavbar.tsx";
@@ -10,6 +10,7 @@ import {
import { getUserInfo, getCookie } from "@/ui/main-axios.ts";
import { HomepageAuth } from "@/ui/Mobile/Homepage/HomepageAuth.tsx";
import { useTranslation } from "react-i18next";
+import { Toaster } from "@/components/ui/sonner.tsx";
const AppContent: FC = () => {
const { t } = useTranslation();
@@ -159,7 +160,6 @@ const AppContent: FC = () => {
ref={tab.terminalRef}
hostConfig={tab.hostConfig}
isVisible={tab.id === currentTab}
- onClose={() => removeTab(tab.id)}
/>
))}
@@ -207,6 +207,13 @@ const AppContent: FC = () => {
/>