mirror of
https://github.com/docmost/docmost.git
synced 2026-09-11 07:56:54 +08:00
feat(beta): public spaces (#2473)
This commit is contained in:
@@ -4,8 +4,10 @@ import { IconFileDescription } from "@tabler/icons-react";
|
||||
import { Link, useLocation, useNavigate, useParams } from "react-router-dom";
|
||||
import { usePageQuery } from "@/features/page/queries/page-query.ts";
|
||||
import { useSharePageQuery } from "@/features/share/queries/share-query.ts";
|
||||
import { usePublicSpacePageQuery } from "@/features/public-space/queries/public-space-query.ts";
|
||||
import {
|
||||
buildPageUrl,
|
||||
buildPublicSpaceUrl,
|
||||
buildSharedPageUrl,
|
||||
} from "@/features/page/page.utils.ts";
|
||||
import { extractPageSlugId } from "@/lib";
|
||||
@@ -21,17 +23,30 @@ export default function MentionView(props: NodeViewProps) {
|
||||
|
||||
const location = useLocation();
|
||||
const isShareRoute = location.pathname.startsWith("/share");
|
||||
const isPublicSpaceRoute = location.pathname.startsWith("/docs/");
|
||||
|
||||
const {
|
||||
data: page,
|
||||
isLoading,
|
||||
isError,
|
||||
} = usePageQuery({ pageId: isPageMention && !isShareRoute ? slugId : null });
|
||||
} = usePageQuery({
|
||||
pageId:
|
||||
isPageMention && !isShareRoute && !isPublicSpaceRoute ? slugId : null,
|
||||
});
|
||||
|
||||
const { data: sharedPage } = useSharePageQuery({
|
||||
pageId: isPageMention && isShareRoute ? slugId : undefined,
|
||||
});
|
||||
|
||||
// Without the slugId guard the request resolves to the space home, which
|
||||
// would render a mention pointing at the wrong page.
|
||||
const { data: publicPageData } = usePublicSpacePageQuery({
|
||||
spaceSlug:
|
||||
isPageMention && isPublicSpaceRoute && slugId ? spaceSlug : undefined,
|
||||
pageSlugId: slugId,
|
||||
contentless: true,
|
||||
});
|
||||
|
||||
const currentPageSlugId = extractPageSlugId(pageSlug);
|
||||
const isSamePage = currentPageSlugId === slugId;
|
||||
|
||||
@@ -87,7 +102,61 @@ export default function MentionView(props: NodeViewProps) {
|
||||
</Anchor>
|
||||
)}
|
||||
|
||||
{isPageMention && !isShareRoute && isError && (
|
||||
{isPageMention && isPublicSpaceRoute && publicPageData?.page && (
|
||||
<Anchor
|
||||
component={Link}
|
||||
fw={500}
|
||||
to={buildPublicSpaceUrl({
|
||||
spaceSlug: publicPageData.space?.slug ?? spaceSlug,
|
||||
pageSlugId: slugId,
|
||||
pageTitle: publicPageData.page.title || label,
|
||||
anchorId,
|
||||
})}
|
||||
onClick={handleClick}
|
||||
underline="never"
|
||||
className={classes.pageMentionLink}
|
||||
>
|
||||
<ActionIcon
|
||||
variant="transparent"
|
||||
color="gray"
|
||||
component="span"
|
||||
size={18}
|
||||
style={{ verticalAlign: "text-bottom" }}
|
||||
>
|
||||
<IconFileDescription size={18} />
|
||||
</ActionIcon>
|
||||
<span className={classes.pageMentionText}>
|
||||
{publicPageData.page.title || label}
|
||||
</span>
|
||||
</Anchor>
|
||||
)}
|
||||
|
||||
{/* No public URL: the /p/ resolver redirects members to the page and
|
||||
funnels anonymous visitors through login first. New tab, so the
|
||||
redirect chain never rewrites the docs tab's history. */}
|
||||
{isPageMention && isPublicSpaceRoute && !publicPageData?.page && (
|
||||
<Anchor
|
||||
fw={500}
|
||||
href={buildPageUrl(undefined, slugId, label, anchorId)}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
underline="never"
|
||||
className={classes.pageMentionLink}
|
||||
>
|
||||
<ActionIcon
|
||||
variant="transparent"
|
||||
color="gray"
|
||||
component="span"
|
||||
size={18}
|
||||
style={{ verticalAlign: "text-bottom" }}
|
||||
>
|
||||
<IconFileDescription size={18} />
|
||||
</ActionIcon>
|
||||
<span className={classes.pageMentionText}>{label}</span>
|
||||
</Anchor>
|
||||
)}
|
||||
|
||||
{isPageMention && !isShareRoute && !isPublicSpaceRoute && isError && (
|
||||
<Anchor
|
||||
component={Link}
|
||||
fw={500}
|
||||
@@ -111,7 +180,7 @@ export default function MentionView(props: NodeViewProps) {
|
||||
</Anchor>
|
||||
)}
|
||||
|
||||
{isPageMention && !isShareRoute && !isError && (
|
||||
{isPageMention && !isShareRoute && !isPublicSpaceRoute && !isError && (
|
||||
<Anchor
|
||||
component={Link}
|
||||
fw={500}
|
||||
|
||||
Reference in New Issue
Block a user