Skip to main content

ShareModal

The ShareModal component provides an interface for managing sharing permissions for folders and files, allowing users to control access through user and team assignments.

Implementation

The component uses several hooks for managing users and teams:

import { ShareModal } from '../components/modals/ShareModal'
import { usePeople } from '@hooks/people/usePeople'
import { useTeam } from '@hooks/team/useTeam'

Props

NameTypeRequiredDescription
docFileItemYesThe file or folder to share
effectivePermissionsEffectivePermissionsNoCurrent effective permissions
inheritPermissionsbooleanNoWhether to inherit permissions from parent (default: false)
onSave(permissions: SharePermissions) => Promise<void>YesCallback when permissions are saved
onClose() => voidNoCallback when modal is closed

Where SharePermissions is:

{
users: { user: string; role: FolderRole }[]
teams: { team: string; role: FolderRole }[]
inheritPermissions: boolean
}

Features

Permission Management

  • Toggle between people and team sharing views
  • Assign user-level permissions with roles (editor, viewer)
  • Assign team-level permissions
  • Inherit permissions from parent folder
  • Filter out document owner from available people
  • Prevent duplicate assignments

Data Management

  • Uses usePeople hook for user data
  • Uses useTeam hook for team data
  • Memoized filtering of available people and teams
  • Loading states for async operations

User Interface

  • Toggle switch between people and teams view
  • DataTable for displaying assigned permissions
  • Role selection via dropdown (editor, viewer, remove access)
  • Permission inheritance toggle
  • Loading states feedback

Internal Types

interface PersonWithRole {
_id: string
firstName: string
lastName: string
role: FolderRole
email: string
isEffective: boolean
}

interface TeamWithRole {
_id: string
name: string
role: FolderRole
members: JSX.Element
isEffective: boolean
}

Usage Example

import { ShareModal } from '../components/modals/ShareModal'

function ShareButton({ fileItem }: { fileItem: FileItem }) {
const handleSave = async (permissions: {
users: { user: string; role: FolderRole }[]
teams: { team: string; role: FolderRole }[]
inheritPermissions: boolean
}) => {
try {
await updatePermissions(fileItem._id, permissions)
} catch (error) {
showError({
title: 'Error updating permissions',
message: 'Failed to update permissions. Please try again.'
})
}
}

return (
<ShareModal
doc={fileItem}
effectivePermissions={currentPermissions}
inheritPermissions={fileItem.inheritPermissions}
onSave={handleSave}
onClose={() => {
// Handle modal close
}}
/>
)
}