diff --git a/packages/web/src/components/layout/SpaceSidebar.tsx b/packages/web/src/components/layout/SpaceSidebar.tsx index abc5b9ed..31357841 100644 --- a/packages/web/src/components/layout/SpaceSidebar.tsx +++ b/packages/web/src/components/layout/SpaceSidebar.tsx @@ -169,9 +169,11 @@ function SpaceContextMenu({ spaceId, x, y, onClose }: { spaceId: string; x: numb const space = useSpaceStore((s) => s.spaces.find(sp => sp.id === spaceId)); const currentUserId = useAuthStore((s) => s.user?.id); const leaveSpace = useSpaceStore((s) => s.leaveSpace); + const generateInvite = useSpaceStore((s) => s.generateInvite); const currentSpaceId = useSpaceStore((s) => s.currentSpaceId); const setCurrentSpace = useSpaceStore((s) => s.setCurrentSpace); const setShowDms = useUIStore((s) => s.setShowDms); + const addToast = useUIStore((s) => s.addToast); const navigate = useNavigate(); const isOwner = space?.ownerId === currentUserId; @@ -198,12 +200,25 @@ function SpaceContextMenu({ spaceId, x, y, onClose }: { spaceId: string; x: numb }; }, [onClose]); - // Don't render for owners (no menu items) - if (isOwner || !space) return null; + if (!space) return null; + + const handleInvite = async () => { + try { + const code = await generateInvite(spaceId); + const origin = (space as any)._instanceOrigin || window.location.origin; + const url = `${origin}/invite/${code}`; + await navigator.clipboard.writeText(url); + addToast('Invite link copied to clipboard', 'success', 3000); + } catch { + addToast('Failed to generate invite', 'warning', 3000); + } + onClose(); + }; // Viewport-aware clamping const menuWidth = 180; - const menuHeight = 40; + const itemCount = isOwner ? 1 : 2; + const menuHeight = itemCount * 32 + 8; const clampedX = Math.min(x, window.innerWidth - menuWidth - 8); const clampedY = Math.min(y, window.innerHeight - menuHeight - 8); @@ -214,22 +229,33 @@ function SpaceContextMenu({ spaceId, x, y, onClose }: { spaceId: string; x: numb style={{ left: clampedX, top: clampedY }} > + {!isOwner && ( + + )} , document.body, ); diff --git a/packages/web/src/stores/spaceStore.ts b/packages/web/src/stores/spaceStore.ts index f71b55f0..0caee697 100644 --- a/packages/web/src/stores/spaceStore.ts +++ b/packages/web/src/stores/spaceStore.ts @@ -239,7 +239,7 @@ export const useSpaceStore = create((set, get) => ({ const space = get().spaces.find(s => s.id === spaceId); const origin = (space as TaggedSpace)?._instanceOrigin ?? ''; const targetApi = getApiForOrigin(origin); - const userId = useAuthStore.getState().user?.id; + const userId = getMyUserIdForOrigin(origin); if (!userId) return; await targetApi.spaces.removeMember(spaceId, userId); set((state) => ({