@@ -16,14 +16,17 @@ import { useState } from 'react';
16
16
import { RiDeleteBinLine , RiMailLine } from 'react-icons/ri' ;
17
17
import { SubscriberDrawerButton } from '../subscribers/subscriber-drawer' ;
18
18
import { useRemoveTopicSubscriber } from './hooks/use-topic-subscribers' ;
19
+ import { TimeDisplayHoverCard } from '../time-display-hover-card' ;
20
+ import { format } from 'date-fns' ;
21
+ import { TopicSubscription } from '@/api/topics' ;
19
22
20
23
interface TopicSubscriberItemProps {
21
- subscriber : ISubscriber ;
22
24
topicKey : string ;
23
25
readOnly ?: boolean ;
26
+ subscription : TopicSubscription ;
24
27
}
25
28
26
- export function TopicSubscriberItem ( { subscriber , topicKey , readOnly = false } : TopicSubscriberItemProps ) {
29
+ export function TopicSubscriberItem ( { topicKey , subscription , readOnly = false } : TopicSubscriberItemProps ) {
27
30
const [ confirmDialogOpen , setConfirmDialogOpen ] = useState ( false ) ;
28
31
const { mutate : removeSubscriber , isPending } = useRemoveTopicSubscriber ( ) ;
29
32
@@ -38,55 +41,63 @@ export function TopicSubscriberItem({ subscriber, topicKey, readOnly = false }:
38
41
39
42
removeSubscriber ( {
40
43
topicKey,
41
- subscriberId : subscriber . subscriberId ,
44
+ subscriberId : subscription . subscriber . subscriberId ,
42
45
} ) ;
43
46
44
47
setConfirmDialogOpen ( false ) ;
45
48
} ;
46
49
47
50
const getDisplayName = ( ) => {
48
- if ( subscriber . firstName || subscriber . lastName ) {
49
- return `${ subscriber . firstName || '' } ${ subscriber . lastName || '' } ` . trim ( ) ;
51
+ if ( subscription . subscriber . firstName || subscription . subscriber . lastName ) {
52
+ return `${ subscription . subscriber . firstName || '' } ${ subscription . subscriber . lastName || '' } ` . trim ( ) ;
50
53
}
51
54
52
55
return null ;
53
56
} ;
54
57
55
58
const displayName = getDisplayName ( ) ;
56
- const subscriberTitle = displayName || subscriber . subscriberId ;
59
+ const subscriberTitle = displayName || subscription . subscriber . subscriberId ;
57
60
58
61
return (
59
62
< >
60
- < SubscriberDrawerButton subscriberId = { subscriber . subscriberId } readOnly >
63
+ < SubscriberDrawerButton subscriberId = { subscription . subscriber . subscriberId } readOnly >
61
64
< motion . div
62
65
variants = { itemVariants }
63
66
className = "border-b-stroke-soft group flex w-full cursor-pointer border-b last:border-b-0 hover:bg-neutral-50"
64
67
>
65
- < div className = "grid w-full grid-cols-[150px_1fr_auto ] items-center px-3 py-2" >
68
+ < div className = "grid w-full grid-cols-[150px_1fr_120px_auto ] items-center px-3 py-2" >
66
69
< div className = "flex max-w-[150px] items-center gap-3 overflow-hidden" >
67
70
< Avatar className = "size-8" >
68
- < AvatarImage src = { subscriber . avatar || undefined } />
71
+ < AvatarImage src = { subscription . subscriber . avatar || undefined } />
69
72
< AvatarFallback > { subscriberTitle [ 0 ] } </ AvatarFallback >
70
73
</ Avatar >
71
74
< div className = "flex flex-col overflow-hidden" >
72
75
< span className = "text-label-xs text-foreground-950 truncate font-medium" >
73
- { displayName || subscriber . subscriberId }
76
+ { displayName || subscription . subscriber . subscriberId }
74
77
</ span >
75
- { subscriber . email && (
78
+ { subscription . subscriber . email && (
76
79
< div className = "flex items-center" >
77
80
< RiMailLine className = "mr-1.5 size-3 min-w-3 text-neutral-400" />
78
- < span className = "text-label-xs truncate text-neutral-500" > { subscriber . email } </ span >
81
+ < span className = "text-label-xs truncate text-neutral-500" > { subscription . subscriber . email } </ span >
79
82
</ div >
80
83
) }
81
84
</ div >
82
85
</ div >
83
86
84
87
< div className = "overflow-hidden px-4 text-left" >
85
- < span className = "text-label-xs truncate text-neutral-500" > { subscriber . subscriberId } </ span >
88
+ < span className = "text-label-xs truncate text-neutral-500" > { subscription . subscriber . subscriberId } </ span >
89
+ </ div >
90
+
91
+ < div className = "text-label-xs text-foreground-600 justify-self-end px-2" >
92
+ { subscription . createdAt && (
93
+ < TimeDisplayHoverCard date = { subscription . createdAt } >
94
+ { format ( new Date ( subscription . createdAt ) , 'MMM d, yyyy' ) }
95
+ </ TimeDisplayHoverCard >
96
+ ) }
86
97
</ div >
87
98
88
99
{ ! readOnly && (
89
- < div className = "opacity-0 transition-opacity duration-200 group-hover:opacity-100" >
100
+ < div className = "justify-self-end opacity-0 transition-opacity duration-200 group-hover:opacity-100" >
90
101
< Tooltip >
91
102
< TooltipTrigger asChild >
92
103
< Button
@@ -114,8 +125,8 @@ export function TopicSubscriberItem({ subscriber, topicKey, readOnly = false }:
114
125
< DialogTitle > Remove Subscriber</ DialogTitle >
115
126
< DialogDescription >
116
127
Are you sure you want to remove{ ' ' }
117
- < span className = "font-medium" > { displayName || subscriber . subscriberId } </ span > from this topic? This action
118
- cannot be undone.
128
+ < span className = "font-medium" > { displayName || subscription . subscriber . subscriberId } </ span > from this
129
+ topic? This action cannot be undone.
119
130
</ DialogDescription >
120
131
</ DialogHeader >
121
132
< DialogFooter >
0 commit comments