mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 06:23:06 +08:00
1280f96f37
* feat: implement space and workspace icons - Create reusable AvatarUploader component supporting avatars, space icons, and workspace icons - Add Sharp package for server-side image resizing and optimization - Create reusable AvatarUploader component supporting avatars, space icons, and workspace icons - Support removing icons * add workspace logo support - add upload loader - add white background to transparent image - other fixes and enhancements * dark mode * fixes * cleanup
76 lines
1.9 KiB
TypeScript
76 lines
1.9 KiB
TypeScript
import classes from "./switch-space.module.css";
|
|
import { useNavigate } from "react-router-dom";
|
|
import { SpaceSelect } from "./space-select";
|
|
import { getSpaceUrl } from "@/lib/config";
|
|
import { Button, Popover, Text } from "@mantine/core";
|
|
import { IconChevronDown } from "@tabler/icons-react";
|
|
import { useDisclosure } from "@mantine/hooks";
|
|
import { CustomAvatar } from "@/components/ui/custom-avatar.tsx";
|
|
import { AvatarIconType } from "@/features/attachments/types/attachment.types.ts";
|
|
import React from "react";
|
|
|
|
interface SwitchSpaceProps {
|
|
spaceName: string;
|
|
spaceSlug: string;
|
|
spaceIcon?: string;
|
|
}
|
|
|
|
export function SwitchSpace({
|
|
spaceName,
|
|
spaceSlug,
|
|
spaceIcon,
|
|
}: SwitchSpaceProps) {
|
|
const navigate = useNavigate();
|
|
const [opened, { close, open, toggle }] = useDisclosure(false);
|
|
|
|
const handleSelect = (value: string) => {
|
|
if (value) {
|
|
navigate(getSpaceUrl(value));
|
|
close();
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Popover
|
|
width={300}
|
|
position="bottom"
|
|
withArrow
|
|
shadow="md"
|
|
opened={opened}
|
|
onChange={toggle}
|
|
>
|
|
<Popover.Target>
|
|
<Button
|
|
variant="subtle"
|
|
fullWidth
|
|
justify="space-between"
|
|
rightSection={<IconChevronDown size={18} />}
|
|
color="gray"
|
|
onClick={open}
|
|
>
|
|
<CustomAvatar
|
|
name={spaceName}
|
|
avatarUrl={spaceIcon}
|
|
type={AvatarIconType.SPACE_ICON}
|
|
color="initials"
|
|
variant="filled"
|
|
size={20}
|
|
/>
|
|
<Text className={classes.spaceName} size="md" fw={500} lineClamp={1}>
|
|
{spaceName}
|
|
</Text>
|
|
</Button>
|
|
</Popover.Target>
|
|
<Popover.Dropdown>
|
|
<SpaceSelect
|
|
label={spaceName}
|
|
value={spaceSlug}
|
|
onChange={(space) => handleSelect(space.slug)}
|
|
width={300}
|
|
opened={true}
|
|
/>
|
|
</Popover.Dropdown>
|
|
</Popover>
|
|
);
|
|
}
|