Handy/src/components/settings/debug/LogDirectory.tsx
Jackson ba3f8a8a50
Prevent highlight and selection cursor hover on UI text items (#541)
* Add `select-none` and `cursor-default` to root to prevent selection and
hover on most items

* Lint

* refactor paths a bit

* format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-01-10 11:00:01 +08:00

74 lines
2.1 KiB
TypeScript

import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { commands } from "@/bindings";
import { SettingContainer } from "../../ui/SettingContainer";
import { PathDisplay } from "../../ui/PathDisplay";
interface LogDirectoryProps {
descriptionMode?: "tooltip" | "inline";
grouped?: boolean;
}
export const LogDirectory: React.FC<LogDirectoryProps> = ({
descriptionMode = "tooltip",
grouped = false,
}) => {
const { t } = useTranslation();
const [logDir, setLogDir] = useState<string>("");
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const loadLogDirectory = async () => {
try {
const result = await commands.getLogDirPath();
if (result.status === "ok") {
setLogDir(result.data);
} else {
setError(result.error);
}
} catch (err) {
const errorMessage =
err && typeof err === "object" && "message" in err
? String(err.message)
: "Failed to load log directory";
setError(errorMessage);
} finally {
setLoading(false);
}
};
loadLogDirectory();
}, []);
const handleOpen = async () => {
if (!logDir) return;
try {
await commands.openLogDir();
} catch (openError) {
console.error("Failed to open log directory:", openError);
}
};
return (
<SettingContainer
title={t("settings.debug.logDirectory.title")}
description={t("settings.debug.logDirectory.description")}
descriptionMode={descriptionMode}
grouped={grouped}
layout="stacked"
>
{loading ? (
<div className="animate-pulse">
<div className="h-8 bg-gray-100 rounded" />
</div>
) : error ? (
<div className="p-3 bg-red-50 border border-red-200 rounded text-xs text-red-600">
{t("errors.loadDirectory", { error })}
</div>
) : (
<PathDisplay path={logDir} onOpen={handleOpen} disabled={!logDir} />
)}
</SettingContainer>
);
};