* feat: add mobile navigation with responsive layout and theme controls * feat: prevent workspace owners from removing themselves and update workspace dropdown styling * feat: add useClickOutside hook and event listener utilities for improved UI interactions * chore: improve mobile UI styling * refactor: improve UI layout and buttons in boards/members views feat: adjust /members layout * fix: standardize layout containers and improve mobile navigation styling * feat: update card view layout * feat: add responsive layout to board view * feat: readjust boards page layout * feat: enhance table view on mobile for members page * feat: extend mobile support with sliding side panels * fix: prevent two panels from being open at the same time * feat: close panels when clicking outside * fix: adjust font-sizing for import source --------- Co-authored-by: Henry <henry_ball@hotmail.co.uk>
82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
import { useRouter } from "next/router";
|
|
import { t } from "@lingui/core/macro";
|
|
|
|
import boardsIconDark from "~/assets/boards-dark.json";
|
|
import boardsIconLight from "~/assets/boards-light.json";
|
|
import membersIconDark from "~/assets/members-dark.json";
|
|
import membersIconLight from "~/assets/members-light.json";
|
|
import settingsIconDark from "~/assets/settings-dark.json";
|
|
import settingsIconLight from "~/assets/settings-light.json";
|
|
import ReactiveButton from "~/components/ReactiveButton";
|
|
import UserMenu from "~/components/UserMenu";
|
|
import WorkspaceMenu from "~/components/WorkspaceMenu";
|
|
import { useTheme } from "~/providers/theme";
|
|
|
|
interface SideNavigationProps {
|
|
user: UserType;
|
|
isLoading: boolean;
|
|
}
|
|
|
|
interface UserType {
|
|
email?: string | null | undefined;
|
|
image?: string | null | undefined;
|
|
}
|
|
|
|
export default function SideNavigation({
|
|
user,
|
|
isLoading,
|
|
}: SideNavigationProps) {
|
|
const router = useRouter();
|
|
|
|
const { pathname } = router;
|
|
|
|
const { activeTheme } = useTheme();
|
|
|
|
const isDarkMode = activeTheme === "dark";
|
|
|
|
const navigation = [
|
|
{
|
|
name: t`Boards`,
|
|
href: "/boards",
|
|
icon: isDarkMode ? boardsIconDark : boardsIconLight,
|
|
},
|
|
{
|
|
name: t`Members`,
|
|
href: "/members",
|
|
icon: isDarkMode ? membersIconDark : membersIconLight,
|
|
},
|
|
{
|
|
name: t`Settings`,
|
|
href: "/settings",
|
|
icon: isDarkMode ? settingsIconDark : settingsIconLight,
|
|
},
|
|
];
|
|
|
|
return (
|
|
<>
|
|
<nav className="flex h-full w-64 flex-col justify-between border-r border-light-600 bg-light-50 px-3 pb-3 pt-5 dark:border-dark-400 dark:bg-dark-50">
|
|
<div>
|
|
<WorkspaceMenu />
|
|
<ul role="list" className="space-y-1">
|
|
{navigation.map((item) => (
|
|
<li key={item.name}>
|
|
<ReactiveButton
|
|
href={item.href}
|
|
current={pathname.includes(item.href)}
|
|
name={item.name}
|
|
json={item.icon}
|
|
/>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
<UserMenu
|
|
email={user.email ?? ""}
|
|
imageUrl={user.image ?? undefined}
|
|
isLoading={isLoading}
|
|
/>
|
|
</nav>
|
|
</>
|
|
);
|
|
}
|