import { useState, useCallback } from "react"; import { useLocation, useNavigate } from "@tanstack/react-router"; import { Share2, FileText, AlertCircle, ArrowLeft } from "lucide-react"; import { Skeleton } from "@/client/components/ui/skeleton"; import { Button } from "@/client/components/ui/button"; import { EmojiIcon } from "@/client/components/ui/emoji-icon"; import { useDocumentTitle } from "@/client/hooks/use-document-title"; import { useSharedInbox } from "@/client/hooks/use-shared-inbox"; import { useSharedInboxNavigation } from "@/client/hooks/use-shared-inbox-navigation"; import { getSharedInboxReturnTo } from "@/client/lib/shared-inbox-navigation"; import { formatRelativeDate } from "@/client/lib/format-date"; import { DEFAULT_PAGE_TITLE } from "@/shared/constants"; import type { SharedWithMeItem } from "@/shared/types"; function groupByWorkspace(items: SharedWithMeItem[]) { const groups: Map = new Map(); for (const item of items) { let group = groups.get(item.workspace.id); if (!group) { group = { workspace: item.workspace, pages: [] }; groups.set(item.workspace.id, group); } group.pages.push(item); } return [...groups.values()]; } export function SharedWithMeView() { useDocumentTitle("Shared with me"); const navigate = useNavigate(); const location = useLocation(); const { items: sharedInbox, workspaceSummaries, status } = useSharedInbox(); const [entryReturnTo] = useState(() => getSharedInboxReturnTo(location.state)); const { backLabel, canLeaveSharedInbox, leaveSharedInbox } = useSharedInboxNavigation({ returnTo: entryReturnTo }); const hasAny = sharedInbox.length > 0 || workspaceSummaries.length > 0; const showLoading = status === "loading" && !hasAny; const showError = !hasAny && status === "error"; const handlePageClick = useCallback( (item: SharedWithMeItem) => { // Just navigate -- the page route resolver will bootstrap workspace context navigate({ to: "/$workspaceSlug/$pageId", params: { workspaceSlug: item.workspace.slug, pageId: item.page_id }, }); }, [navigate], ); if (showLoading) { return (
{[0, 1].map((g) => (
{[0, 1].map((r) => (
))}
))}
); } if (showError) { return (

Couldn't load shared pages

Check your connection and try again.

); } if (!hasAny) { return (

Nothing shared with you yet

Shared pages show up here automatically.

{canLeaveSharedInbox && backLabel && ( )}
); } const groups = groupByWorkspace(sharedInbox); const handleWorkspaceClick = (slug: string) => { navigate({ to: "/$workspaceSlug", params: { workspaceSlug: slug } }); }; return (
{canLeaveSharedInbox && backLabel && ( )}

Shared with me

{groups.map(({ workspace, pages }) => (
{workspace.icon ? ( ) : ( {workspace.name.charAt(0).toUpperCase()} )} {workspace.name}
{pages.map((item) => ( ))}
))}
{workspaceSummaries.length > 0 && (

From workspaces you belong to

{workspaceSummaries.map(({ workspace, count }) => ( ))}
)}
); }