import { Tooltip } from "@mui/joy"; import classNames from "classnames"; import copy from "copy-to-clipboard"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; import { showCommonDialog } from "@/components/Alert"; import AnalyticsView from "@/components/AnalyticsView"; import CreateShortcutDrawer from "@/components/CreateShortcutDrawer"; import GenerateQRCodeDialog from "@/components/GenerateQRCodeDialog"; import Icon from "@/components/Icon"; import LinkFavicon from "@/components/LinkFavicon"; import VisibilityIcon from "@/components/VisibilityIcon"; import Dropdown from "@/components/common/Dropdown"; import { absolutifyLink } from "@/helpers/utils"; import useLoading from "@/hooks/useLoading"; import useNavigateTo from "@/hooks/useNavigateTo"; import { useUserStore, useShortcutStore } from "@/stores"; import { Shortcut } from "@/types/proto/api/v1/shortcut_service"; import { Role } from "@/types/proto/api/v1/user_service"; import { convertVisibilityFromPb } from "@/utils/visibility"; interface State { showEditDrawer: boolean; } const ShortcutDetail = () => { const { t } = useTranslation(); const params = useParams(); const shortcutId = Number(params["shortcutId"]); const navigateTo = useNavigateTo(); const shortcutStore = useShortcutStore(); const userStore = useUserStore(); const shortcut = shortcutStore.getShortcutById(shortcutId); const currentUser = useUserStore().getCurrentUser(); const [state, setState] = useState({ showEditDrawer: false, }); const [showQRCodeDialog, setShowQRCodeDialog] = useState(false); const loadingState = useLoading(true); const creator = userStore.getUserById(shortcut.creatorId); const havePermission = currentUser.role === Role.ADMIN || shortcut.creatorId === currentUser.id; const shortcutLink = absolutifyLink(`/s/${shortcut.name}`); useEffect(() => { (async () => { const shortcut = await shortcutStore.getOrFetchShortcutById(shortcutId); await userStore.getOrFetchUserById(shortcut.creatorId); loadingState.setFinish(); })(); }, [shortcutId]); if (loadingState.isLoading) { return null; } const handleCopyButtonClick = () => { copy(shortcutLink); toast.success("Shortcut link copied to clipboard."); }; const handleDeleteShortcutButtonClick = (shortcut: Shortcut) => { showCommonDialog({ title: "Delete Shortcut", content: `Are you sure to delete shortcut \`${shortcut.name}\`? You cannot undo this action.`, style: "danger", onConfirm: async () => { await shortcutStore.deleteShortcut(shortcut.id); navigateTo("/", { replace: true, }); }, }); }; return ( <>
{shortcut.title ? ( <> {shortcut.title} (s/{shortcut.name}) ) : ( <> s/ {shortcut.name} )}
{havePermission && ( } > )}
{shortcut.description &&

{shortcut.description}

}
{shortcut.tags.map((tag) => { return ( #{tag} ); })} {shortcut.tags.length === 0 && No tags}
{creator.nickname}
{t(`shortcut.visibility.${convertVisibilityFromPb(shortcut.visibility).toLowerCase()}.self`)}
{shortcut.viewCount} visits

{t("analytics.self")}

{showQRCodeDialog && setShowQRCodeDialog(false)} />} {state.showEditDrawer && ( setState({ ...state, showEditDrawer: false, }) } /> )} ); }; export default ShortcutDetail;