feat: update components for multi-user support
- Add sharing indicator to ListCard showing collaborator count - Add permission badge and share button to ListDetailView - Disable editing in ItemForm for viewers with visual feedback - Add permission checks to item detail and edit pages - Hide edit/delete buttons for viewers on item detail page - Pass permission and collaborator data through component hierarchy - Update navigation to include profile and invitations links (already done in previous tasks) Implements task 15 from user-auth-and-sharing spec
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
import { getListWithItems } from '@/lib/actions'
|
||||
import { getPermission } from '@/lib/permissions'
|
||||
import { auth } from '@/auth'
|
||||
import { notFound } from 'next/navigation'
|
||||
import Link from 'next/link'
|
||||
import { ArrowLeft } from 'lucide-react'
|
||||
@@ -8,12 +10,25 @@ import ListDetailView from '@/components/ListDetailView'
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
export default async function ListDetailPage({ params }: { params: { id: string } }) {
|
||||
const session = await auth()
|
||||
if (!session?.user?.id) {
|
||||
notFound()
|
||||
}
|
||||
|
||||
const list = await getListWithItems(params.id)
|
||||
|
||||
if (!list) {
|
||||
notFound()
|
||||
}
|
||||
|
||||
// Get user's permission for this list
|
||||
const permission = await getPermission(session.user.id, params.id)
|
||||
if (!permission) {
|
||||
notFound()
|
||||
}
|
||||
|
||||
const canShare = permission === 'owner'
|
||||
const canEdit = permission === 'owner' || permission === 'editor'
|
||||
const completedItems = list.items.filter(item => item.completed)
|
||||
|
||||
return (
|
||||
@@ -41,13 +56,28 @@ export default async function ListDetailPage({ params }: { params: { id: string
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Inline Item Creation */}
|
||||
<div className="mb-6 sm:mb-8">
|
||||
<InlineItemCreate listId={list.id} />
|
||||
</div>
|
||||
{/* Inline Item Creation - only show if user can edit */}
|
||||
{canEdit && (
|
||||
<div className="mb-6 sm:mb-8">
|
||||
<InlineItemCreate listId={list.id} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Search, Filter, and Items List */}
|
||||
<ListDetailView listId={list.id} initialItems={list.items} />
|
||||
<ListDetailView
|
||||
listId={list.id}
|
||||
initialItems={list.items}
|
||||
permission={permission}
|
||||
canShare={canShare}
|
||||
listTitle={list.title}
|
||||
ownerId={list.ownerId}
|
||||
ownerName={list.owner?.name}
|
||||
ownerEmail={list.owner?.email || ''}
|
||||
collaborators={list.collaborators.map(c => ({
|
||||
...c,
|
||||
permission: c.permission as 'editor' | 'viewer'
|
||||
}))}
|
||||
/>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user