index.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import type { RefineThemedLayoutV2HeaderProps } from "@refinedev/antd";
  2. import { useGetIdentity } from "@refinedev/core";
  3. import {
  4. Layout as AntdLayout,
  5. Avatar,
  6. Space,
  7. Switch,
  8. theme,
  9. Typography,
  10. } from "antd";
  11. import React, { useContext } from "react";
  12. import { ColorModeContext } from "../../contexts/color-mode";
  13. const { Text } = Typography;
  14. const { useToken } = theme;
  15. type IUser = {
  16. id: number;
  17. name: string;
  18. avatar: string;
  19. };
  20. export const Header: React.FC<RefineThemedLayoutV2HeaderProps> = ({
  21. sticky = true,
  22. }) => {
  23. const { token } = useToken();
  24. const { data: user } = useGetIdentity<IUser>();
  25. const { mode, setMode } = useContext(ColorModeContext);
  26. const headerStyles: React.CSSProperties = {
  27. backgroundColor: token.colorBgElevated,
  28. display: "flex",
  29. justifyContent: "flex-end",
  30. alignItems: "center",
  31. padding: "0px 24px",
  32. height: "64px",
  33. };
  34. if (sticky) {
  35. headerStyles.position = "sticky";
  36. headerStyles.top = 0;
  37. headerStyles.zIndex = 1;
  38. }
  39. return (
  40. <AntdLayout.Header style={headerStyles}>
  41. <Space>
  42. <Switch
  43. checkedChildren="🌛"
  44. unCheckedChildren="🔆"
  45. onChange={() => setMode(mode === "light" ? "dark" : "light")}
  46. defaultChecked={mode === "dark"}
  47. />
  48. <Space style={{ marginLeft: "8px" }} size="middle">
  49. {user?.name && <Text strong>{user.name}</Text>}
  50. {user?.avatar && <Avatar src={user?.avatar} alt={user?.name} />}
  51. </Space>
  52. </Space>
  53. </AntdLayout.Header>
  54. );
  55. };