Skip to content

Commit

Permalink
Refactor dock component and add account connections and display setti…
Browse files Browse the repository at this point in the history
…ngs modals
  • Loading branch information
bartosz-skejcik committed Jan 5, 2024
1 parent 4f973d9 commit 263c7ad
Show file tree
Hide file tree
Showing 16 changed files with 844 additions and 220 deletions.
8 changes: 6 additions & 2 deletions components/dock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import { Button } from "@/components/ui/button";
import { Home, Newspaper, Plus } from "lucide-react";
import Settings from "@/components/dock/settings";
import { useUserPreferences } from "@/stores/user-preferences";
import { useAppStore } from "@/stores/app-store";
import useStore from "@/hooks/use-store";
import Shortcut from "@/components/shortcut";
import ShortcutSkeleton from "./shortcut/skeleton";
import { Tab } from "@/types.d";
import SettingsDropdown from "./dock/dropdown/settings";
import AccountDropdown from "./dock/dropdown/account";

type Props = {};

Expand Down Expand Up @@ -58,7 +59,10 @@ function Dock({}: Props) {
<Plus size={24} />
</Button>
</div>
<Settings />
<div className="flex items-center justify-end w-1/5 gap-3">
<SettingsDropdown />
<AccountDropdown />
</div>
</div>
);
}
Expand Down
44 changes: 44 additions & 0 deletions components/dock/dropdown/account.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { useAppStore } from "@/stores/app-store";
import { Workflow, User } from "lucide-react";

type Props = {};

function AccountDropdown({}: Props) {
const setAccountConnectionsModal = useAppStore(
(state) => state.setAccountConnectionsModal
);
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="flex items-center gap-2">
<User size={24} />
<p>Bartek Paczesny</p>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem asChild>
<button
onClick={() => setAccountConnectionsModal(true)}
className="flex items-center w-full gap-2 cursor-pointer text-start"
>
<Workflow size={24} className="h-[1rem] w-[1rem]" />
<p>Connections</p>
</button>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}

export default AccountDropdown;
168 changes: 168 additions & 0 deletions components/dock/dropdown/settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
// UI
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuPortal,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";

// Icons
import {
Filter,
Image as ImageIcon,
LayoutPanelTop,
Moon,
Search,
Settings2,
Sun,
User,
} from "lucide-react";

// Stores
import { useAppStore } from "@/stores/app-store";
import { useUserPreferences } from "@/stores/user-preferences";

// Utils
import clsx from "clsx";
import { useTheme } from "next-themes";
import Image from "next/image";
import { availableSearchEngines } from "@/db";

type Props = {};

function SettingsDropdown({}: Props) {
const { setTheme } = useTheme();

const setSearchEngine = useUserPreferences(
(state) => state.setSearchEngine
);
const searchEngine = useUserPreferences((state) => state.searchEngine);
const {
setWallpaperChangeModal,
setNewsSettingsModal,
setLayoutSettingsModal,
} = useAppStore();

return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon">
<Settings2 size={24} />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuLabel>Settings</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<Sun className="h-[1rem] w-[1rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon className="absolute h-[1rem] w-[1rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
<span className="ml-2">Change theme</span>
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<button
onClick={() => setTheme("light")}
className="w-full text-start"
>
Light
</button>
</DropdownMenuItem>
<DropdownMenuItem>
<button
onClick={() => setTheme("dark")}
className="w-full text-start"
>
Dark
</button>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<button
onClick={() => setTheme("system")}
className="w-full text-start"
>
System
</button>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuItem asChild>
<button
className="flex items-center w-full gap-2 cursor-pointer text-start"
onClick={() => setWallpaperChangeModal(true)}
>
<ImageIcon size={24} className="h-[1rem] w-[1rem]" />
<p>Change background</p>
</button>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<button
className="flex items-center w-full gap-2 cursor-pointer text-start"
onClick={() => setLayoutSettingsModal(true)}
>
<LayoutPanelTop
size={24}
className="h-[1rem] w-[1rem]"
/>
<p>Display preferences</p>
</button>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<button
className="flex items-center w-full gap-2 cursor-pointer text-start"
onClick={() => setNewsSettingsModal(true)}
>
<Filter size={24} className="h-[1rem] w-[1rem]" />
<p>News settings</p>
</button>
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<Search size={16} />
<span className="ml-2">Search engine</span>
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
{availableSearchEngines.map((engine) => (
<DropdownMenuItem
key={engine.name}
className={clsx(
searchEngine.name === engine.name
? "bg-foreground/5 font-semibold"
: ""
)}
>
<button
onClick={() => setSearchEngine(engine)}
className="flex items-center justify-start w-full gap-2 text-start"
>
<Image
alt={engine.name}
width={32}
height={32}
src={engine.icon}
className="h-[1rem] w-[1rem] rounded-full"
/>
<p>{engine.name}</p>
</button>
</DropdownMenuItem>
))}
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuContent>
</DropdownMenu>
);
}

export default SettingsDropdown;
Loading

0 comments on commit 263c7ad

Please sign in to comment.