merlyn/frontend/src/components/Footer/index.jsx
Adam Setch d63438fa61
chore: rename Github to GitHub (#3199)
* chore: rename Github to GitHub

Signed-off-by: Adam Setch <adam.setch@outlook.com>

* chore: rename Github to GitHub

Signed-off-by: Adam Setch <adam.setch@outlook.com>

* Undo some code changes for references

---------

Signed-off-by: Adam Setch <adam.setch@outlook.com>
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2025-02-13 10:45:43 -08:00

147 lines
4.4 KiB
JavaScript

import System from "@/models/system";
import paths from "@/utils/paths";
import {
BookOpen,
DiscordLogo,
GithubLogo,
Briefcase,
Envelope,
Globe,
HouseLine,
Info,
LinkSimple,
} from "@phosphor-icons/react";
import React, { useEffect, useState } from "react";
import SettingsButton from "../SettingsButton";
import { isMobile } from "react-device-detect";
import { Tooltip } from "react-tooltip";
import { Link } from "react-router-dom";
export const MAX_ICONS = 3;
export const ICON_COMPONENTS = {
BookOpen: BookOpen,
DiscordLogo: DiscordLogo,
GithubLogo: GithubLogo,
Envelope: Envelope,
LinkSimple: LinkSimple,
HouseLine: HouseLine,
Globe: Globe,
Briefcase: Briefcase,
Info: Info,
};
export default function Footer() {
const [footerData, setFooterData] = useState(false);
useEffect(() => {
async function fetchFooterData() {
const { footerData } = await System.fetchCustomFooterIcons();
setFooterData(footerData);
}
fetchFooterData();
}, []);
// wait for some kind of non-false response from footer data first
// to prevent pop-in.
if (footerData === false) return null;
if (!Array.isArray(footerData) || footerData.length === 0) {
return (
<div className="flex justify-center mb-2">
<div className="flex space-x-4">
<div className="flex w-fit">
<Link
to={paths.github()}
target="_blank"
rel="noreferrer"
className="transition-all duration-300 p-2 rounded-full bg-theme-sidebar-footer-icon hover:bg-theme-sidebar-footer-icon-hover"
aria-label="Find us on GitHub"
data-tooltip-id="footer-item"
data-tooltip-content="View source code on GitHub"
>
<GithubLogo
weight="fill"
className="h-5 w-5"
color="var(--theme-sidebar-footer-icon-fill)"
/>
</Link>
</div>
<div className="flex w-fit">
<Link
to={paths.docs()}
target="_blank"
rel="noreferrer"
className="transition-all duration-300 p-2 rounded-full bg-theme-sidebar-footer-icon hover:bg-theme-sidebar-footer-icon-hover"
aria-label="Docs"
data-tooltip-id="footer-item"
data-tooltip-content="Open AnythingLLM help docs"
>
<BookOpen
weight="fill"
className="h-5 w-5"
color="var(--theme-sidebar-footer-icon-fill)"
/>
</Link>
</div>
<div className="flex w-fit">
<Link
to={paths.discord()}
target="_blank"
rel="noreferrer"
className="transition-all duration-300 p-2 rounded-full bg-theme-sidebar-footer-icon hover:bg-theme-sidebar-footer-icon-hover"
aria-label="Join our Discord server"
data-tooltip-id="footer-item"
data-tooltip-content="Join the AnythingLLM Discord"
>
<DiscordLogo
weight="fill"
className="h-5 w-5"
color="var(--theme-sidebar-footer-icon-fill)"
/>
</Link>
</div>
{!isMobile && <SettingsButton />}
</div>
<Tooltip
id="footer-item"
place="top"
delayShow={300}
className="tooltip !text-xs z-99"
/>
</div>
);
}
return (
<div className="flex justify-center mb-2">
<div className="flex space-x-4">
{footerData.map((item, index) => (
<a
key={index}
href={item.url}
target="_blank"
rel="noreferrer"
className="transition-all duration-300 flex w-fit h-fit p-2 p-2 rounded-full bg-theme-sidebar-footer-icon hover:bg-theme-sidebar-footer-icon-hover hover:border-slate-100"
>
{React.createElement(
ICON_COMPONENTS?.[item.icon] ?? ICON_COMPONENTS.Info,
{
weight: "fill",
className: "h-5 w-5",
color: "var(--theme-sidebar-footer-icon-fill)",
}
)}
</a>
))}
{!isMobile && <SettingsButton />}
</div>
<Tooltip
id="footer-item"
place="top"
delayShow={300}
className="tooltip !text-xs z-99"
/>
</div>
);
}