Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 54 additions & 38 deletions src/frontend/src/components/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,57 @@ export const Header = forwardRef<HeaderHandle, HeaderProps>(
// Determine if we should show icons only (both URLs configured)
const showIconsOnly = Boolean(calibreWebUrl && audiobookLibraryUrl);

const renderSettingsButton = (variant: 'nav' | 'menu') => {
if (!onSettingsClick) return null;
const isNav = variant === 'nav';
return (
<button
type="button"
onClick={
settingsEnabled
? () => {
if (!isNav) closeDropdown();
onSettingsClick();
}
: undefined
}
disabled={!settingsEnabled}
className={
isNav
? `hover-action relative rounded-full p-2 text-gray-900 transition-colors dark:text-gray-100 ${
settingsEnabled ? '' : 'cursor-not-allowed opacity-40'
}`
: `flex w-full items-center gap-3 px-4 py-2 text-left transition-colors ${
settingsEnabled ? 'hover-surface' : 'cursor-not-allowed opacity-40'
}`
}
aria-label="Settings"
title={isNav ? 'Settings' : undefined}
>
<svg
className="h-5 w-5"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth="1.5"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
/>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
/>
</svg>
{!isNav && <span>Settings</span>}
</button>
);
};

// Icon buttons - reused for both states
const iconButtonsNode = (
<div className="flex items-center gap-2">
Expand Down Expand Up @@ -412,6 +463,8 @@ export const Header = forwardRef<HeaderHandle, HeaderProps>(
</button>
)}

{renderSettingsButton('nav')}

{/* User Menu Dropdown */}
<div className="relative" ref={dropdownRef}>
<button
Expand Down Expand Up @@ -483,44 +536,7 @@ export const Header = forwardRef<HeaderHandle, HeaderProps>(
</a>

{/* Settings Button */}
{onSettingsClick && (
<button
type="button"
onClick={
settingsEnabled
? () => {
closeDropdown();
onSettingsClick();
}
: undefined
}
disabled={!settingsEnabled}
className={`flex w-full items-center gap-3 px-4 py-2 text-left transition-colors ${
settingsEnabled ? 'hover-surface' : 'cursor-not-allowed opacity-40'
}`}
>
<svg
className="h-5 w-5"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth="1.5"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
/>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
/>
</svg>
<span>Settings</span>
</button>
)}
{renderSettingsButton('menu')}

{/* Debug Buttons */}
{debug && (
Expand Down