refactor(plugins): move rescan button to page header, remove redundant title
Use usePageHeader().setEnd to place the rescan button in the shared header bar. Remove the inline H2 title (already shown by the header) and the wrapper div.
This commit is contained in:
@@ -10,7 +10,6 @@ import { Select, SelectOption } from "@nous-research/ui/ui/components/select";
|
|||||||
import { Switch } from "@nous-research/ui/ui/components/switch";
|
import { Switch } from "@nous-research/ui/ui/components/switch";
|
||||||
import { Spinner } from "@nous-research/ui/ui/components/spinner";
|
import { Spinner } from "@nous-research/ui/ui/components/spinner";
|
||||||
import { CommandBlock } from "@nous-research/ui/ui/components/command-block";
|
import { CommandBlock } from "@nous-research/ui/ui/components/command-block";
|
||||||
import { H2 } from "@/components/NouiTypography";
|
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
@@ -19,6 +18,7 @@ import { Toast } from "@/components/Toast";
|
|||||||
import { useI18n } from "@/i18n";
|
import { useI18n } from "@/i18n";
|
||||||
import { PluginSlot } from "@/plugins";
|
import { PluginSlot } from "@/plugins";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
|
import { usePageHeader } from "@/contexts/usePageHeader";
|
||||||
|
|
||||||
/** Select value for built-in memory (`config` uses empty string). Never use `""` — UI Select maps empty value to an empty label. */
|
/** Select value for built-in memory (`config` uses empty string). Never use `""` — UI Select maps empty value to an empty label. */
|
||||||
const MEMORY_PROVIDER_BUILTIN = "__hermes_memory_builtin__";
|
const MEMORY_PROVIDER_BUILTIN = "__hermes_memory_builtin__";
|
||||||
@@ -38,6 +38,7 @@ export default function PluginsPage() {
|
|||||||
|
|
||||||
const { toast, showToast } = useToast();
|
const { toast, showToast } = useToast();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
const { setEnd } = usePageHeader();
|
||||||
|
|
||||||
const loadHub = useCallback(() => {
|
const loadHub = useCallback(() => {
|
||||||
return api
|
return api
|
||||||
@@ -56,6 +57,22 @@ export default function PluginsPage() {
|
|||||||
void loadHub().finally(() => setLoading(false));
|
void loadHub().finally(() => setLoading(false));
|
||||||
}, [loadHub]);
|
}, [loadHub]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setEnd(
|
||||||
|
<Button
|
||||||
|
ghost
|
||||||
|
size="sm"
|
||||||
|
className="shrink-0 gap-2"
|
||||||
|
disabled={loading || rescanBusy}
|
||||||
|
onClick={() => void onRescan()}
|
||||||
|
>
|
||||||
|
{rescanBusy ? <Spinner /> : <RefreshCw className="h-3.5 w-3.5" />}
|
||||||
|
{t.pluginsPage.refreshDashboard}
|
||||||
|
</Button>,
|
||||||
|
);
|
||||||
|
return () => setEnd(null);
|
||||||
|
}, [loading, rescanBusy, setEnd, t.pluginsPage.refreshDashboard]);
|
||||||
|
|
||||||
const onInstall = async () => {
|
const onInstall = async () => {
|
||||||
const id = installId.trim();
|
const id = installId.trim();
|
||||||
if (!id) {
|
if (!id) {
|
||||||
@@ -136,32 +153,6 @@ export default function PluginsPage() {
|
|||||||
|
|
||||||
<div className={cn("flex w-full flex-col gap-8")}>
|
<div className={cn("flex w-full flex-col gap-8")}>
|
||||||
|
|
||||||
|
|
||||||
<div className="flex flex-wrap items-start justify-between gap-4">
|
|
||||||
|
|
||||||
<div>
|
|
||||||
|
|
||||||
|
|
||||||
<H2>{t.app.nav.plugins}</H2>
|
|
||||||
|
|
||||||
|
|
||||||
<p className="mt-1 max-w-xl text-[0.75rem] tracking-[0.06em] text-midground/55 normal-case">
|
|
||||||
{t.pluginsPage.headline}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
ghost
|
|
||||||
size="sm"
|
|
||||||
className="shrink-0 gap-2"
|
|
||||||
disabled={loading || rescanBusy}
|
|
||||||
onClick={() => void onRescan()}
|
|
||||||
>
|
|
||||||
{rescanBusy ? <Spinner /> : <RefreshCw className="h-3.5 w-3.5" />}
|
|
||||||
{t.pluginsPage.refreshDashboard}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{providers && (
|
{providers && (
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
|
|||||||
Reference in New Issue
Block a user