2025-01-18 07:56:58 +03:00
|
|
|
import type { ConfigColorMode, MaybeConfigColorMode } from '@kobalte/core'
|
2025-01-14 06:34:42 +03:00
|
|
|
import type { DropdownMenuTriggerProps } from '@kobalte/core/dropdown-menu'
|
2025-01-18 07:56:58 +03:00
|
|
|
import { useColorMode } from '@kobalte/core'
|
|
|
|
import { LucideCheck, LucideChevronRight, LucideExternalLink, LucideLaptop, LucideLogIn, LucideMoon, LucideSun, LucideUsers } from 'lucide-solid'
|
2025-01-14 06:34:42 +03:00
|
|
|
import { SiGithub } from 'solid-icons/si'
|
2025-01-18 07:56:58 +03:00
|
|
|
import { createSignal, For, Show } from 'solid-js'
|
2025-01-14 06:34:42 +03:00
|
|
|
import { Button } from '../../lib/components/ui/button.tsx'
|
|
|
|
import {
|
|
|
|
DropdownMenu,
|
|
|
|
DropdownMenuContent,
|
|
|
|
DropdownMenuGroup,
|
|
|
|
DropdownMenuGroupLabel,
|
|
|
|
DropdownMenuItem,
|
|
|
|
DropdownMenuSeparator,
|
2025-01-18 07:56:58 +03:00
|
|
|
DropdownMenuSub,
|
|
|
|
DropdownMenuSubContent,
|
|
|
|
DropdownMenuSubTrigger,
|
2025-01-14 06:34:42 +03:00
|
|
|
DropdownMenuTrigger,
|
|
|
|
} from '../../lib/components/ui/dropdown-menu.tsx'
|
|
|
|
import { cn } from '../../lib/utils.ts'
|
|
|
|
import { $accounts, $activeAccount, $activeAccountId } from '../../store/accounts.ts'
|
|
|
|
import { useStore } from '../../store/use-store.ts'
|
|
|
|
import { AccountAvatar } from '../AccountAvatar.tsx'
|
|
|
|
|
|
|
|
export function NavbarMenu(props: {
|
|
|
|
onShowAccounts: () => void
|
|
|
|
onShowSettings: () => void
|
|
|
|
}) {
|
2025-01-18 07:56:58 +03:00
|
|
|
const { setColorMode } = useColorMode()
|
|
|
|
const [localColorMode, setLocalColorMode] = createSignal(localStorage.getItem('kb-color-mode') as MaybeConfigColorMode)
|
2025-01-14 06:34:42 +03:00
|
|
|
const activeAccount = useStore($activeAccount)
|
|
|
|
const accounts = useStore($accounts)
|
|
|
|
|
2025-01-18 07:56:58 +03:00
|
|
|
// See: https://github.com/kobaltedev/kobalte/issues/543
|
|
|
|
function updateColorMode(mode: ConfigColorMode) {
|
|
|
|
setLocalColorMode(mode)
|
|
|
|
setColorMode(mode)
|
|
|
|
}
|
|
|
|
|
2025-01-14 06:34:42 +03:00
|
|
|
return (
|
|
|
|
<Show
|
|
|
|
when={activeAccount() != null}
|
|
|
|
fallback={(
|
|
|
|
<Button
|
|
|
|
variant="ghost"
|
|
|
|
size="icon"
|
2025-01-18 07:56:58 +03:00
|
|
|
class="w-auto px-2"
|
2025-01-14 06:34:42 +03:00
|
|
|
onClick={props.onShowAccounts}
|
|
|
|
>
|
|
|
|
<LucideLogIn class="mr-2 size-4 shrink-0" />
|
|
|
|
Log in
|
|
|
|
</Button>
|
|
|
|
)}
|
|
|
|
>
|
|
|
|
<DropdownMenu>
|
|
|
|
<DropdownMenuTrigger
|
|
|
|
as={(props: DropdownMenuTriggerProps) => (
|
|
|
|
<Button
|
2025-01-18 07:56:58 +03:00
|
|
|
class="px-3"
|
2025-01-14 06:34:42 +03:00
|
|
|
variant="ghost"
|
|
|
|
{...props}
|
|
|
|
>
|
2025-01-18 07:56:58 +03:00
|
|
|
<span class="mr-3 max-w-[120px] truncate">
|
2025-01-14 06:34:42 +03:00
|
|
|
{activeAccount()!.name}
|
|
|
|
</span>
|
2025-01-18 07:56:58 +03:00
|
|
|
<AccountAvatar class="size-6" account={activeAccount()!} />
|
2025-01-14 06:34:42 +03:00
|
|
|
</Button>
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
<DropdownMenuContent class="w-[200px]">
|
|
|
|
<DropdownMenuGroup>
|
|
|
|
<DropdownMenuGroupLabel>Accounts</DropdownMenuGroupLabel>
|
|
|
|
<For each={accounts()}>
|
|
|
|
{account => (
|
|
|
|
<DropdownMenuItem onClick={() => $activeAccountId.set(account.id)}>
|
|
|
|
<AccountAvatar
|
|
|
|
class={cn(
|
|
|
|
'size-4',
|
|
|
|
account.id !== activeAccount()?.id && 'opacity-50',
|
|
|
|
)}
|
|
|
|
account={account}
|
|
|
|
/>
|
|
|
|
<span
|
|
|
|
class={cn(
|
|
|
|
'ml-2',
|
|
|
|
account.id === activeAccount()?.id ? 'font-semibold' : 'text-muted-foreground',
|
|
|
|
)}
|
|
|
|
>
|
|
|
|
{account.name}
|
|
|
|
</span>
|
|
|
|
{account.id === activeAccount()?.id && <LucideCheck class="ml-auto size-4" />}
|
|
|
|
</DropdownMenuItem>
|
|
|
|
)}
|
|
|
|
</For>
|
|
|
|
</DropdownMenuGroup>
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
<DropdownMenuGroup>
|
2025-01-15 08:00:34 +03:00
|
|
|
<DropdownMenuItem onClick={props.onShowAccounts}>
|
|
|
|
<LucideUsers class="mr-2 size-4" />
|
|
|
|
Manage accounts
|
2025-01-14 06:34:42 +03:00
|
|
|
</DropdownMenuItem>
|
2025-01-18 07:56:58 +03:00
|
|
|
<DropdownMenuSub>
|
|
|
|
<DropdownMenuSubTrigger class="flex items-center justify-between">
|
|
|
|
<div class="flex flex-row items-center">
|
|
|
|
<LucideSun class="mr-2 size-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
|
|
|
<LucideMoon class="absolute mr-2 size-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
|
|
|
Theme
|
|
|
|
</div>
|
|
|
|
<LucideChevronRight class="size-4" />
|
|
|
|
</DropdownMenuSubTrigger>
|
|
|
|
<DropdownMenuSubContent class="w-[128px]">
|
|
|
|
<DropdownMenuItem onSelect={() => updateColorMode('light')}>
|
|
|
|
<div class="flex w-full items-center justify-between">
|
|
|
|
<div class="flex flex-row items-center">
|
|
|
|
<LucideSun class="mr-2 size-4" />
|
|
|
|
<span>Light</span>
|
|
|
|
</div>
|
|
|
|
<div>
|
2025-01-18 08:29:18 +03:00
|
|
|
<LucideCheck class={cn('ml-auto size-4', localColorMode() !== 'light' && 'hidden')} />
|
2025-01-18 07:56:58 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem onSelect={() => updateColorMode('dark')}>
|
|
|
|
<div class="flex w-full items-center justify-between">
|
|
|
|
<div class="flex flex-row items-center">
|
|
|
|
<LucideMoon class="mr-2 size-4" />
|
|
|
|
<span>Dark</span>
|
|
|
|
</div>
|
|
|
|
<div>
|
2025-01-18 08:29:18 +03:00
|
|
|
<LucideCheck class={cn('ml-auto size-4', localColorMode() !== 'dark' && 'hidden')} />
|
2025-01-18 07:56:58 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem onSelect={() => updateColorMode('system')}>
|
|
|
|
<div class="flex w-full items-center justify-between">
|
|
|
|
<div class="flex flex-row items-center">
|
|
|
|
<LucideLaptop class="mr-2 size-4" />
|
|
|
|
<span>System</span>
|
|
|
|
</div>
|
|
|
|
<div>
|
2025-01-18 08:29:18 +03:00
|
|
|
<LucideCheck class={cn('ml-auto size-4', localColorMode() !== 'system' && 'hidden')} />
|
2025-01-18 07:56:58 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</DropdownMenuItem>
|
|
|
|
</DropdownMenuSubContent>
|
|
|
|
</DropdownMenuSub>
|
2025-01-14 06:34:42 +03:00
|
|
|
<DropdownMenuItem
|
|
|
|
as="a"
|
|
|
|
class="cursor-pointer"
|
|
|
|
href="https://github.com/mtcute/repl"
|
|
|
|
target="_blank"
|
|
|
|
>
|
|
|
|
<SiGithub class="mr-2 size-4" />
|
|
|
|
GitHub
|
|
|
|
<LucideExternalLink class="ml-auto size-4" />
|
|
|
|
</DropdownMenuItem>
|
|
|
|
</DropdownMenuGroup>
|
|
|
|
</DropdownMenuContent>
|
|
|
|
</DropdownMenu>
|
|
|
|
</Show>
|
|
|
|
)
|
|
|
|
}
|