organify-ui 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-DW4ZGEBH.js → chunk-6ARUZUR7.js} +3 -3
- package/dist/{chunk-DW4ZGEBH.js.map → chunk-6ARUZUR7.js.map} +1 -1
- package/dist/{chunk-2Y3W6JSG.js → chunk-R6LBGT55.js} +3 -3
- package/dist/{chunk-2Y3W6JSG.js.map → chunk-R6LBGT55.js.map} +1 -1
- package/dist/{chunk-B3N3YGMA.js → chunk-XZ2OJNCX.js} +11 -8
- package/dist/chunk-XZ2OJNCX.js.map +1 -0
- package/dist/components/chat/index.js +2 -2
- package/dist/components/notifications/index.js +2 -2
- package/dist/index.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-B3N3YGMA.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cn, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql, Skeleton, Badge, Avatar, AvatarFallback, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea } from './chunk-
|
|
1
|
+
import { cn, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql, Skeleton, Badge, Avatar, AvatarFallback, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea } from './chunk-XZ2OJNCX.js';
|
|
2
2
|
import { OrgBell, OrgDoor, OrgWave, OrgFolder, OrgCheckCircle, OrgSprint, OrgMail, OrgMention, OrgComment, OrgEdit, OrgBoard, OrgClose } from './chunk-AHMA7OV3.js';
|
|
3
3
|
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
@@ -926,5 +926,5 @@ function usePresence(options) {
|
|
|
926
926
|
}
|
|
927
927
|
|
|
928
928
|
export { NotificationBell, NotificationItem, NotificationList, OrganifyNotifications, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PresenceAvatarStack, PresenceIndicator, useNotifications, usePresence };
|
|
929
|
-
//# sourceMappingURL=chunk-
|
|
930
|
-
//# sourceMappingURL=chunk-
|
|
929
|
+
//# sourceMappingURL=chunk-6ARUZUR7.js.map
|
|
930
|
+
//# sourceMappingURL=chunk-6ARUZUR7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/notifications/notification-bell.tsx","../src/components/notifications/notification-item.tsx","../src/components/notifications/notification-list.tsx","../src/components/notifications/use-notifications.ts","../src/components/notifications/organify-notifications.tsx","../src/components/notifications/presence-indicator.tsx","../src/components/primitives/popover.tsx","../src/components/notifications/presence-avatar-stack.tsx","../src/components/notifications/use-presence.ts"],"names":["jsxs","jsx","useState","useRef","useEffect","useCallback"],"mappings":"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","file":"chunk-DW4ZGEBH.js","sourcesContent":["'use client';\n\n// ─────────────────────────────────────────────\n// NotificationBell — Bell icon with unread badge\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { NotificationBellProps } from './types';\nimport { OrgBell as BellIcon } from '../../icons/system'\n\nexport const NotificationBell: React.FC<NotificationBellProps> = ({\n count,\n isOpen,\n onToggle,\n className,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className={cn(\n 'relative inline-flex items-center justify-center',\n 'w-10 h-10 rounded-sm',\n 'bg-surface-glass/50 backdrop-blur-sm',\n 'border border-border-subtle/30',\n 'text-text-secondary hover:text-text-primary',\n 'hover:bg-surface-glass/70 hover:border-brand-primary/30',\n 'transition-all duration-[400ms]',\n 'focus:outline-none focus:ring-2 focus:ring-brand-primary/40',\n isOpen && 'bg-surface-glass/70 border-brand-primary/40 text-text-primary',\n className,\n )}\n aria-label={`Notifications${count > 0 ? ` (${count} unread)` : ''}`}\n aria-expanded={isOpen}\n >\n <BellIcon className={cn('w-5 h-5', count > 0 && 'animate-[bell_0.5s_ease-in-out]')} />\n\n {count > 0 && (\n <span\n className={cn(\n 'absolute -top-1 -right-1',\n 'flex items-center justify-center',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'bg-status-error text-white',\n 'text-[10px] font-bold leading-none',\n 'border-2 border-surface-base',\n 'animate-in zoom-in-50 duration-[400ms]',\n )}\n >\n {count > 99 ? '99+' : count}\n </span>\n )}\n </button>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// NotificationItem — Single notification entry\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { NotificationItemProps, NotificationType } from './types';\nimport {\n OrgBoard, OrgEdit, OrgComment, OrgMention,\n OrgMail, OrgSprint, OrgCheckCircle, OrgFolder,\n OrgWave, OrgDoor, OrgBell, OrgClose,\n} from '../../icons';\n\n// ─── Type → Icon mapping ───────────────────\n\nconst typeIcons: Record<NotificationType, React.FC<{ className?: string }>> = {\n TASK_ASSIGNED: OrgBoard,\n TASK_UPDATED: OrgEdit,\n COMMENT_ADDED: OrgComment,\n CHAT_MESSAGE: OrgComment,\n MENTION: OrgMention,\n INVITATION: OrgMail,\n SPRINT_STARTED: OrgSprint,\n SPRINT_COMPLETED: OrgCheckCircle,\n PROJECT_UPDATED: OrgFolder,\n MEMBER_JOINED: OrgWave,\n MEMBER_LEFT: OrgDoor,\n OTHER: OrgBell,\n};\n\nconst typeColors: Record<NotificationType, string> = {\n TASK_ASSIGNED: 'bg-brand-primary/10 text-brand-primary',\n TASK_UPDATED: 'bg-status-warning/10 text-status-warning',\n COMMENT_ADDED: 'bg-accent-secondary/10 text-accent-secondary',\n CHAT_MESSAGE: 'bg-accent-tertiary/10 text-accent-tertiary',\n MENTION: 'bg-brand-primary/10 text-brand-primary',\n INVITATION: 'bg-status-success/10 text-status-success',\n SPRINT_STARTED: 'bg-status-info/10 text-status-info',\n SPRINT_COMPLETED: 'bg-status-success/10 text-status-success',\n PROJECT_UPDATED: 'bg-accent-secondary/10 text-accent-secondary',\n MEMBER_JOINED: 'bg-status-success/10 text-status-success',\n MEMBER_LEFT: 'bg-status-error/10 text-status-error',\n OTHER: 'bg-surface-elevated text-text-secondary',\n};\n\nfunction formatTimeAgo(dateStr: string): string {\n const now = Date.now();\n const date = new Date(dateStr).getTime();\n const diffMs = now - date;\n const diffMin = Math.floor(diffMs / 60000);\n\n if (diffMin < 1) return 'agora';\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 7) return `${diffDay}d`;\n return new Date(dateStr).toLocaleDateString('pt-BR', { day: '2-digit', month: 'short' });\n}\n\nexport const NotificationItem: React.FC<NotificationItemProps> = ({\n notification,\n onMarkRead,\n onDelete,\n onClick,\n}) => {\n const IconComponent = typeIcons[notification.type] || OrgBell;\n const colorClass = typeColors[notification.type] || typeColors.OTHER;\n\n const handleClick = () => {\n if (!notification.read) onMarkRead(notification.id);\n onClick?.(notification);\n };\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={(e) => e.key === 'Enter' && handleClick()}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-sm cursor-pointer',\n 'transition-all duration-[400ms]',\n 'hover:bg-surface-glass/50',\n !notification.read && 'bg-brand-primary/5 border-l-2 border-brand-primary',\n notification.read && 'opacity-70',\n )}\n >\n {/* Icon */}\n <div\n className={cn(\n 'flex-shrink-0 w-9 h-9 rounded-sm',\n 'flex items-center justify-center',\n 'text-sm',\n colorClass,\n )}\n >\n {notification.metadata?.avatarUrl ? (\n <img\n src={notification.metadata.avatarUrl}\n alt=\"\"\n className=\"w-9 h-9 rounded-sm object-cover\"\n />\n ) : (\n <IconComponent className=\"w-4 h-4\" />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <p\n className={cn(\n 'text-sm leading-snug truncate',\n !notification.read ? 'font-semibold text-text-primary' : 'text-text-secondary',\n )}\n >\n {notification.title}\n </p>\n <span className=\"text-[10px] text-text-muted flex-shrink-0 mt-0.5\">\n {formatTimeAgo(notification.createdAt)}\n </span>\n </div>\n\n <p className=\"text-xs text-text-muted mt-0.5 line-clamp-2\">\n {notification.message}\n </p>\n\n {notification.metadata?.actorName && (\n <p className=\"text-[10px] text-text-muted mt-1\">\n por {notification.metadata.actorName}\n </p>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-1 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n {!notification.read && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onMarkRead(notification.id);\n }}\n className=\"w-2 h-2 rounded-full bg-brand-primary flex-shrink-0 mt-1.5\"\n aria-label=\"Mark as read\"\n />\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete(notification.id);\n }}\n className={cn(\n 'text-[10px] text-text-muted hover:text-status-error',\n 'transition-colors',\n )}\n aria-label=\"Delete notification\"\n >\n <OrgClose className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// NotificationList — Scrollable notification panel\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport { NotificationItem } from './notification-item';\nimport { OrgBell } from '../../icons';\nimport type { NotificationListProps } from './types';\n\nexport const NotificationList: React.FC<NotificationListProps> = ({\n notifications,\n loading,\n onMarkRead,\n onMarkAllRead,\n onDelete,\n onNotificationClick,\n className,\n}) => {\n const unreadCount = notifications.filter((n) => !n.read).length;\n\n return (\n <div\n className={cn(\n 'flex flex-col',\n 'w-[380px] max-h-[520px]',\n 'rounded-sm',\n 'bg-surface-base/95 backdrop-blur-xl',\n 'border border-border-subtle/40',\n 'shadow-2xl shadow-black/20',\n 'overflow-hidden',\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border-subtle/30\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Notificações</h3>\n {unreadCount > 0 && (\n <span\n className={cn(\n 'inline-flex items-center justify-center',\n 'min-w-[20px] h-5 px-1.5',\n 'rounded-full',\n 'bg-brand-primary/10 text-brand-primary',\n 'text-[10px] font-bold',\n )}\n >\n {unreadCount}\n </span>\n )}\n </div>\n\n {unreadCount > 0 && (\n <button\n type=\"button\"\n onClick={onMarkAllRead}\n className={cn(\n 'text-xs text-brand-primary hover:text-brand-primary/80',\n 'transition-colors',\n )}\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto overscroll-contain\">\n {loading && notifications.length === 0 ? (\n <div className=\"flex flex-col gap-3 p-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-start gap-3 animate-pulse\">\n <div className=\"w-9 h-9 rounded-sm bg-surface-elevated\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-3 bg-surface-elevated rounded w-3/4\" />\n <div className=\"h-2 bg-surface-elevated rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 px-4\">\n <OrgBell className=\"w-8 h-8 text-text-muted mb-3\" />\n <p className=\"text-sm text-text-secondary font-medium\">Tudo em dia!</p>\n <p className=\"text-xs text-text-muted mt-1\">Nenhuma notificação por enquanto.</p>\n </div>\n ) : (\n <div className=\"p-2 space-y-0.5 group\">\n {notifications.map((notification) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n onMarkRead={onMarkRead}\n onDelete={onDelete}\n onClick={onNotificationClick}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n {notifications.length > 0 && (\n <div className=\"px-4 py-2.5 border-t border-border-subtle/30 text-center\">\n <button\n type=\"button\"\n className={cn(\n 'text-xs text-text-muted hover:text-text-secondary',\n 'transition-colors',\n )}\n >\n Ver todas as notificações\n </button>\n </div>\n )}\n </div>\n );\n};\n","// ─────────────────────────────────────────────\n// useNotifications — React hook for notification state\n// ─────────────────────────────────────────────\n// Pulls gatewayUrl, authToken, userId, workspaceId\n// from OrganifyProvider — no props needed.\n//\n// Uses graphql-ws subscription for real-time updates\n// instead of polling. Falls back to polling if\n// subscription fails or service URL not configured.\n// ─────────────────────────────────────────────\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from '../../providers/organify-provider';\nimport type { Notification } from './types';\n\ninterface UseNotificationsOptions {\n /** Auto-fetch on mount (default true) */\n autoFetch?: boolean;\n /** Polling interval in ms as fallback (0 = no polling, default 0 since we use subscriptions) */\n pollingInterval?: number;\n}\n\ninterface UseNotificationsReturn {\n notifications: Notification[];\n unreadCount: number;\n loading: boolean;\n error: string | null;\n connected: boolean;\n fetchNotifications: (limit?: number, offset?: number) => Promise<void>;\n markAsRead: (id: string) => Promise<void>;\n markAllAsRead: () => Promise<void>;\n deleteNotification: (id: string) => Promise<void>;\n refetch: () => Promise<void>;\n}\n\nexport function useNotifications(options: UseNotificationsOptions = {}): UseNotificationsReturn {\n const { autoFetch = true, pollingInterval = 0 } = options;\n\n // ─── Pull from OrganifyProvider ───────\n const api = useOrganifyApi();\n const { gatewayUrl, authToken } = api;\n const notificationsServiceUrl = api.services?.notifications;\n const user = useOrganifyUser();\n const { workspace } = useOrganifyWorkspace();\n const userId = user?.id ?? '';\n const workspaceId = workspace?.id ?? '';\n\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const [unreadCount, setUnreadCount] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [connected, setConnected] = useState(false);\n\n const pollingRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectCountRef = useRef(0);\n const reconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastSeenRef = useRef<string | null>(null);\n\n // Notifications GraphQL uses centralized useOrganifyGql with 'notifications' endpoint.\n // Routes through gateway proxy (/graphql/notifications) which injects x-user-id from JWT cookie.\n const centralGql = useOrganifyGql();\n\n const gqlFetch = useCallback(\n async (query: string, variables?: Record<string, any>) => {\n return centralGql('notifications', query, variables);\n },\n [centralGql],\n );\n\n const fetchNotifications = useCallback(\n async (limit = 20, offset = 0) => {\n if (!workspaceId) return;\n setLoading(true);\n setError(null);\n try {\n const data = await gqlFetch(\n `query GetNotifications($filter: NotificationFilterInput) {\n notifications(filter: $filter) {\n items {\n id userId workspaceId type priority title message\n read readAt archived createdAt updatedAt\n metadata { actionUrl avatarUrl actorId actorName }\n }\n total hasMore\n }\n unreadNotificationCount(workspaceId: \"${workspaceId}\") { count }\n }`,\n { filter: { workspaceId, limit, offset } },\n );\n\n const items = data?.notifications?.items ?? [];\n setNotifications(items);\n setUnreadCount(data?.unreadNotificationCount?.count ?? 0);\n\n // Track last seen for subscription replay on reconnect\n if (items.length > 0) {\n lastSeenRef.current = items[0].createdAt;\n }\n } catch (err: any) {\n setError(err.message || 'Failed to fetch notifications');\n } finally {\n setLoading(false);\n }\n },\n [gqlFetch, workspaceId],\n );\n\n const markAsRead = useCallback(\n async (id: string) => {\n try {\n await gqlFetch(\n `mutation MarkRead($id: ID!) {\n markNotificationAsRead(id: $id) { id read readAt }\n }`,\n { id },\n );\n\n setNotifications((prev) =>\n prev.map((n) => (n.id === id ? { ...n, read: true, readAt: new Date().toISOString() } : n)),\n );\n setUnreadCount((prev) => Math.max(0, prev - 1));\n } catch (err: any) {\n setError(err.message);\n }\n },\n [gqlFetch],\n );\n\n const markAllAsRead = useCallback(async () => {\n try {\n await gqlFetch(\n `mutation MarkAllRead($workspaceId: String) {\n markAllNotificationsAsRead(workspaceId: $workspaceId)\n }`,\n { workspaceId },\n );\n\n setNotifications((prev) =>\n prev.map((n) => ({ ...n, read: true, readAt: new Date().toISOString() })),\n );\n setUnreadCount(0);\n } catch (err: any) {\n setError(err.message);\n }\n }, [gqlFetch, workspaceId]);\n\n const deleteNotification = useCallback(\n async (id: string) => {\n try {\n await gqlFetch(\n `mutation DeleteNotification($id: ID!) {\n deleteNotification(id: $id)\n }`,\n { id },\n );\n\n setNotifications((prev) => {\n const removed = prev.find((n) => n.id === id);\n if (removed && !removed.read) {\n setUnreadCount((c) => Math.max(0, c - 1));\n }\n return prev.filter((n) => n.id !== id);\n });\n } catch (err: any) {\n setError(err.message);\n }\n },\n [gqlFetch],\n );\n\n const refetch = useCallback(() => fetchNotifications(), [fetchNotifications]);\n\n // Auto-fetch on mount\n useEffect(() => {\n if (autoFetch && userId?.trim() && workspaceId) {\n fetchNotifications();\n }\n }, [autoFetch, userId, workspaceId, fetchNotifications]);\n\n // ─── GraphQL-WS Subscription ──────────\n useEffect(() => {\n // Skip if user is not authenticated or service URL not configured\n if (!userId?.trim() || !notificationsServiceUrl) return;\n\n const MAX_RECONNECTS = 5;\n\n function connectSubscription() {\n // Build WebSocket URL from service URL\n // NestJS notifications service exposes subscriptions at /graphql/notifications\n const wsUrl = notificationsServiceUrl!\n .replace(/^http/, 'ws')\n .replace(/\\/$/, '') + '/graphql/notifications';\n\n const ws = new WebSocket(wsUrl, 'graphql-transport-ws');\n wsRef.current = ws;\n\n ws.onopen = () => {\n // graphql-ws connection_init\n ws.send(JSON.stringify({\n type: 'connection_init',\n payload: authToken ? { Authorization: `Bearer ${authToken}` } : {},\n }));\n };\n\n ws.onmessage = (event) => {\n let msg: any;\n try { msg = JSON.parse(event.data); } catch { return; }\n\n switch (msg.type) {\n case 'connection_ack':\n setConnected(true);\n reconnectCountRef.current = 0;\n\n // Subscribe to notificationCreated\n ws.send(JSON.stringify({\n id: 'notif-created',\n type: 'subscribe',\n payload: {\n query: `subscription NotificationCreated($lastSeenAt: DateTime) {\n notificationCreated(lastSeenAt: $lastSeenAt) {\n id userId type title message data read isRead readAt createdAt updatedAt\n }\n }`,\n variables: lastSeenRef.current ? { lastSeenAt: lastSeenRef.current } : {},\n },\n }));\n\n // Subscribe to notificationRead\n ws.send(JSON.stringify({\n id: 'notif-read',\n type: 'subscribe',\n payload: {\n query: `subscription NotificationRead($lastSeenAt: DateTime) {\n notificationRead(lastSeenAt: $lastSeenAt) {\n id userId type title message read isRead readAt createdAt updatedAt\n }\n }`,\n variables: {},\n },\n }));\n break;\n\n case 'next':\n if (msg.id === 'notif-created' && msg.payload?.data?.notificationCreated) {\n const notif = msg.payload.data.notificationCreated;\n // Deduplicate\n setNotifications((prev) => {\n if (prev.some((n) => n.id === notif.id)) return prev;\n return [notif, ...prev];\n });\n setUnreadCount((c) => c + 1);\n lastSeenRef.current = notif.createdAt;\n }\n if (msg.id === 'notif-read' && msg.payload?.data?.notificationRead) {\n const notif = msg.payload.data.notificationRead;\n setNotifications((prev) =>\n prev.map((n) => (n.id === notif.id ? { ...n, read: true, readAt: notif.readAt } : n)),\n );\n }\n break;\n\n case 'error':\n console.error('[useNotifications] Subscription error:', msg.payload);\n break;\n\n case 'ping':\n ws.send(JSON.stringify({ type: 'pong' }));\n break;\n }\n };\n\n ws.onclose = () => {\n setConnected(false);\n wsRef.current = null;\n\n // Reconnect with exponential backoff, capped\n if (reconnectCountRef.current < MAX_RECONNECTS) {\n const delay = Math.min(1000 * 2 ** reconnectCountRef.current, 30000);\n reconnectCountRef.current++;\n reconnectTimerRef.current = setTimeout(connectSubscription, delay);\n }\n };\n\n ws.onerror = () => {\n // onclose will fire after onerror\n };\n }\n\n connectSubscription();\n\n return () => {\n if (reconnectTimerRef.current) clearTimeout(reconnectTimerRef.current);\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n setConnected(false);\n };\n }, [userId, notificationsServiceUrl, authToken]);\n\n // ─── Fallback Polling (only if no subscription service configured) ──\n useEffect(() => {\n if (notificationsServiceUrl) return; // subscriptions active, no polling\n if (pollingInterval > 0 && userId?.trim() && workspaceId) {\n pollingRef.current = setInterval(() => fetchNotifications(), pollingInterval);\n return () => {\n if (pollingRef.current) clearInterval(pollingRef.current);\n };\n }\n }, [pollingInterval, userId, workspaceId, fetchNotifications, notificationsServiceUrl]);\n\n return {\n notifications,\n unreadCount,\n loading,\n error,\n connected,\n fetchNotifications,\n markAsRead,\n markAllAsRead,\n deleteNotification,\n refetch,\n };\n}","'use client';\n\n// ─────────────────────────────────────────────\n// OrganifyNotifications — Composed notification widget\n// ─────────────────────────────────────────────\n// Pulls all data from OrganifyProvider — no props\n// needed for gatewayUrl, userId, workspaceId.\n// ─────────────────────────────────────────────\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { NotificationBell } from './notification-bell';\nimport { NotificationList } from './notification-list';\nimport { useNotifications } from './use-notifications';\nimport type { OrganifyNotificationsProps } from './types';\n\nexport const OrganifyNotifications: React.FC<OrganifyNotificationsProps> = ({\n onNotificationClick,\n className,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n notifications,\n unreadCount,\n loading,\n markAsRead,\n markAllAsRead,\n deleteNotification,\n } = useNotifications();\n\n // Close panel when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close panel on Escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false);\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <NotificationBell\n count={unreadCount}\n isOpen={isOpen}\n onToggle={() => setIsOpen((prev) => !prev)}\n />\n\n {isOpen && (\n <div\n className={cn(\n 'absolute right-0 top-full mt-2 z-50',\n 'animate-in slide-in-from-top-2 fade-in-0 duration-[400ms]',\n )}\n >\n <NotificationList\n notifications={notifications}\n loading={loading}\n onMarkRead={markAsRead}\n onMarkAllRead={markAllAsRead}\n onDelete={deleteNotification}\n onNotificationClick={onNotificationClick}\n />\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// PresenceIndicator — User online status dot\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { PresenceIndicatorProps, PresenceStatus } from './types';\n\nconst statusColors: Record<PresenceStatus, string> = {\n ONLINE: 'bg-status-success',\n AWAY: 'bg-status-warning',\n BUSY: 'bg-status-error',\n OFFLINE: 'bg-text-muted/40',\n};\n\nconst statusLabels: Record<PresenceStatus, string> = {\n ONLINE: 'Online',\n AWAY: 'Ausente',\n BUSY: 'Ocupado',\n OFFLINE: 'Offline',\n};\n\nconst sizeClasses = {\n sm: 'w-2 h-2',\n md: 'w-2.5 h-2.5',\n lg: 'w-3 h-3',\n};\n\nexport const PresenceIndicator: React.FC<PresenceIndicatorProps> = ({\n status,\n size = 'md',\n showLabel = false,\n className,\n}) => {\n return (\n <span\n className={cn('inline-flex items-center gap-1.5', className)}\n title={statusLabels[status]}\n >\n <span\n className={cn(\n 'rounded-full flex-shrink-0',\n 'border-2 border-surface-base',\n sizeClasses[size],\n statusColors[status],\n status === 'ONLINE' && 'animate-pulse',\n )}\n aria-label={statusLabels[status]}\n />\n {showLabel && (\n <span className=\"text-xs text-text-muted\">{statusLabels[status]}</span>\n )}\n </span>\n );\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { cn } from '../../lib/utils';\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nfunction PopoverContent({\n className,\n align = 'center',\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-72 rounded-sm border border-glass-border bg-theme-glass-heavy backdrop-blur-[40px] saturate-[180%] p-4 text-theme shadow-glass outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","// ─────────────────────────────────────────────\n// PresenceAvatarStack — Shows online users\n// in a context (workspace, project, board)\n// Compact stacked avatars + expandable list\n// ─────────────────────────────────────────────\n\n'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\nimport { Avatar, AvatarFallback } from '../primitives/avatar';\nimport { Badge } from '../primitives/badge';\nimport { ScrollArea } from '../primitives/scroll-area';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from '../primitives/tooltip';\nimport { Popover, PopoverContent, PopoverTrigger } from '../primitives/popover';\nimport { PresenceIndicator } from './presence-indicator';\nimport type { PresenceStatus } from './types';\n\n// ─── Types ──────────────────────────────────\n\nexport interface PresenceUser {\n id: string;\n displayName: string;\n avatarUrl: string | null;\n status: PresenceStatus;\n lastSeen?: string;\n}\n\nexport interface PresenceAvatarStackProps {\n /** List of users with presence status */\n users: PresenceUser[];\n /** Max avatars to show before \"+N\" */\n maxVisible?: number;\n /** Size of avatars */\n size?: 'sm' | 'md' | 'lg';\n /** Show only online users in the stack */\n onlineOnly?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Show the expandable popover list */\n expandable?: boolean;\n /** CSS class */\n className?: string;\n}\n\n// ─── Helpers ────────────────────────────────\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((w) => w[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n}\n\nconst sizeConfig = {\n sm: { avatar: 'h-6 w-6', text: 'text-[9px]', stack: '-space-x-1.5', dot: 'sm' as const },\n md: { avatar: 'h-8 w-8', text: 'text-[10px]', stack: '-space-x-2', dot: 'md' as const },\n lg: { avatar: 'h-10 w-10', text: 'text-xs', stack: '-space-x-2.5', dot: 'lg' as const },\n};\n\nconst statusOrder: Record<PresenceStatus, number> = {\n ONLINE: 0,\n BUSY: 1,\n AWAY: 2,\n OFFLINE: 3,\n};\n\nfunction formatLastSeen(iso?: string): string {\n if (!iso) return '';\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'agora';\n if (mins < 60) return `${mins}m atrás`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h atrás`;\n return `${Math.floor(hours / 24)}d atrás`;\n}\n\n// ─── Single Avatar with Status ──────────────\n\nfunction PresenceAvatar({\n user,\n size = 'md',\n showTooltip = true,\n}: {\n user: PresenceUser;\n size?: 'sm' | 'md' | 'lg';\n showTooltip?: boolean;\n}) {\n const cfg = sizeConfig[size];\n\n const avatar = (\n <div className=\"relative\">\n <Avatar shape=\"circle\" size=\"sm\" className={cn(cfg.avatar, 'border-2 border-surface')}>\n <AvatarFallback className=\"bg-primary/20 text-primary-light font-semibold\" style={{ fontSize: 'inherit' }}>\n <span className={cfg.text}>{getInitials(user.displayName)}</span>\n </AvatarFallback>\n </Avatar>\n <span className=\"absolute -bottom-0.5 -right-0.5\">\n <PresenceIndicator status={user.status} size={cfg.dot} />\n </span>\n </div>\n );\n\n if (!showTooltip) return avatar;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{avatar}</TooltipTrigger>\n <TooltipContent className=\"text-xs\">\n <p className=\"font-medium\">{user.displayName}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Presence List (Expandable) ─────────────\n\nfunction PresenceList({\n users,\n size = 'md',\n}: {\n users: PresenceUser[];\n size?: 'sm' | 'md' | 'lg';\n}) {\n const sorted = [...users].sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n const online = sorted.filter((u) => u.status !== 'OFFLINE');\n const offline = sorted.filter((u) => u.status === 'OFFLINE');\n\n const renderUser = (user: PresenceUser) => (\n <div\n key={user.id}\n className=\"flex items-center gap-2.5 px-3 py-1.5 rounded-sm hover:bg-theme-subtle transition-colors\"\n >\n <PresenceAvatar user={user} size=\"sm\" showTooltip={false} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-theme truncate\">{user.displayName}</p>\n {user.status === 'OFFLINE' && user.lastSeen && (\n <p className=\"text-[10px] text-theme-muted\">{formatLastSeen(user.lastSeen)}</p>\n )}\n </div>\n <PresenceIndicator status={user.status} size=\"sm\" showLabel />\n </div>\n );\n\n return (\n <div className=\"w-[240px]\">\n <div className=\"px-3 py-2 border-b border-theme-subtle\">\n <h4 className=\"text-xs font-semibold text-theme\">\n Membros\n <span className=\"text-theme-muted font-normal ml-1\">({users.length})</span>\n </h4>\n </div>\n <ScrollArea className=\"max-h-[300px]\">\n <div className=\"py-1\">\n {online.length > 0 && (\n <>\n <p className=\"px-3 py-1 text-[10px] text-emerald-400/70 uppercase tracking-wider font-semibold\">\n Online — {online.length}\n </p>\n {online.map(renderUser)}\n </>\n )}\n {offline.length > 0 && (\n <>\n <p className=\"px-3 py-1 mt-1 text-[10px] text-theme-muted uppercase tracking-wider font-semibold\">\n Offline — {offline.length}\n </p>\n {offline.map(renderUser)}\n </>\n )}\n {users.length === 0 && (\n <p className=\"px-3 py-4 text-xs text-theme-muted text-center\">Sem membros</p>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ─── Main Component ─────────────────────────\n\nexport function PresenceAvatarStack({\n users,\n maxVisible = 4,\n size = 'md',\n onlineOnly = false,\n loading = false,\n expandable = true,\n className,\n}: PresenceAvatarStackProps) {\n const cfg = sizeConfig[size];\n\n const displayUsers = onlineOnly\n ? users.filter((u) => u.status !== 'OFFLINE')\n : [...users].sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n const visible = displayUsers.slice(0, maxVisible);\n const overflow = displayUsers.length - maxVisible;\n const onlineCount = users.filter((u) => u.status === 'ONLINE').length;\n\n if (loading) {\n return (\n <div className={cn('flex items-center', cfg.stack, className)}>\n {Array.from({ length: Math.min(3, maxVisible) }).map((_, i) => (\n <Skeleton\n key={i}\n variant=\"circular\"\n className={cn(cfg.avatar, 'border-2 border-surface')}\n />\n ))}\n </div>\n );\n }\n\n if (displayUsers.length === 0) {\n return null;\n }\n\n const stack = (\n <div className={cn('flex items-center', className)}>\n <div className={cn('flex items-center', cfg.stack)}>\n {visible.map((user) => (\n <PresenceAvatar\n key={user.id}\n user={user}\n size={size}\n showTooltip={!expandable}\n />\n ))}\n\n {overflow > 0 && (\n <div\n className={cn(\n cfg.avatar,\n 'flex items-center justify-center rounded-full border-2 border-surface bg-theme-subtle',\n cfg.text,\n 'font-medium text-theme-muted',\n )}\n >\n +{overflow}\n </div>\n )}\n </div>\n\n {/* Online count badge */}\n <Badge\n variant=\"default\"\n className=\"ml-2 text-[10px] px-1.5 py-0 h-4 border-emerald-500/20 text-emerald-400/70 bg-emerald-500/5\"\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 mr-1 animate-pulse\" />\n {onlineCount}\n </Badge>\n </div>\n );\n\n if (!expandable) return stack;\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button className=\"cursor-pointer hover:opacity-80 transition-opacity\">\n {stack}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"p-0 bg-theme-glass-heavy backdrop-blur-xl border-theme-subtle shadow-lg\"\n align=\"end\"\n >\n <PresenceList users={users} size={size} />\n </PopoverContent>\n </Popover>\n );\n}\n","// ─────────────────────────────────────────────\n// usePresence — React hook for presence tracking\n// ─────────────────────────────────────────────\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { UserPresence, PresenceStatus } from './types';\n\ninterface UsePresenceOptions {\n gatewayUrl: string;\n userId: string;\n authToken?: string;\n /** Direct service URLs (bypasses gateway) */\n services?: { notifications?: string };\n /** Heartbeat interval in ms (default: 30s) */\n heartbeatInterval?: number;\n /** Auto-connect on mount */\n autoConnect?: boolean;\n}\n\ninterface UsePresenceReturn {\n onlineUsers: UserPresence[];\n myStatus: PresenceStatus;\n isConnected: boolean;\n setStatus: (status: PresenceStatus) => void;\n getUserStatus: (userId: string) => PresenceStatus;\n fetchOnlineUsers: () => Promise<void>;\n}\n\nexport function usePresence(options: UsePresenceOptions): UsePresenceReturn {\n const {\n gatewayUrl,\n userId,\n authToken,\n heartbeatInterval = 30000,\n autoConnect = true,\n } = options;\n\n const [onlineUsers, setOnlineUsers] = useState<UserPresence[]>([]);\n const [myStatus, setMyStatus] = useState<PresenceStatus>('ONLINE');\n const [isConnected, setIsConnected] = useState(false);\n const heartbeatRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Presence GraphQL goes through gateway proxy (/graphql/notifications)\n // which injects x-user-id from the JWT cookie.\n const graphqlUrl = `${gatewayUrl}/graphql/notifications`;\n\n const gqlFetch = useCallback(\n async (query: string, variables?: Record<string, any>) => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers,\n credentials: 'include',\n body: JSON.stringify({ query, variables }),\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = await res.json();\n if (json.errors?.length) throw new Error(json.errors[0].message);\n return json.data;\n },\n [graphqlUrl, userId, authToken],\n );\n\n const fetchOnlineUsers = useCallback(async () => {\n try {\n const data = await gqlFetch(`\n query GetOnlineUsers {\n onlineUsers {\n users { userId status connectedAt lastActivityAt sessionCount }\n count\n }\n }\n `);\n setOnlineUsers(data.onlineUsers.users);\n setIsConnected(true);\n } catch {\n setIsConnected(false);\n }\n }, [gqlFetch]);\n\n const setStatus = useCallback(\n (status: PresenceStatus) => {\n setMyStatus(status);\n // Fire-and-forget status update\n gqlFetch('').catch(() => {});\n },\n [gqlFetch],\n );\n\n const getUserStatus = useCallback(\n (targetUserId: string): PresenceStatus => {\n const user = onlineUsers.find((u) => u.userId === targetUserId);\n return user?.status || 'OFFLINE';\n },\n [onlineUsers],\n );\n\n // Auto-connect: fetch online users on mount\n useEffect(() => {\n if (autoConnect && userId) {\n fetchOnlineUsers();\n }\n }, [autoConnect, userId, fetchOnlineUsers]);\n\n // Heartbeat polling\n useEffect(() => {\n if (heartbeatInterval > 0 && userId) {\n heartbeatRef.current = setInterval(() => {\n fetchOnlineUsers();\n }, heartbeatInterval);\n\n return () => {\n if (heartbeatRef.current) clearInterval(heartbeatRef.current);\n };\n }\n }, [heartbeatInterval, userId, fetchOnlineUsers]);\n\n // Visibility change → away/online\n useEffect(() => {\n const handleVisibility = () => {\n if (document.hidden) {\n setMyStatus('AWAY');\n } else {\n setMyStatus('ONLINE');\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibility);\n return () => document.removeEventListener('visibilitychange', handleVisibility);\n }, []);\n\n return {\n onlineUsers,\n myStatus,\n isConnected,\n setStatus,\n getUserStatus,\n fetchOnlineUsers,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/notifications/notification-bell.tsx","../src/components/notifications/notification-item.tsx","../src/components/notifications/notification-list.tsx","../src/components/notifications/use-notifications.ts","../src/components/notifications/organify-notifications.tsx","../src/components/notifications/presence-indicator.tsx","../src/components/primitives/popover.tsx","../src/components/notifications/presence-avatar-stack.tsx","../src/components/notifications/use-presence.ts"],"names":["jsxs","jsx","useState","useRef","useEffect","useCallback"],"mappings":"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","file":"chunk-6ARUZUR7.js","sourcesContent":["'use client';\n\n// ─────────────────────────────────────────────\n// NotificationBell — Bell icon with unread badge\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { NotificationBellProps } from './types';\nimport { OrgBell as BellIcon } from '../../icons/system'\n\nexport const NotificationBell: React.FC<NotificationBellProps> = ({\n count,\n isOpen,\n onToggle,\n className,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className={cn(\n 'relative inline-flex items-center justify-center',\n 'w-10 h-10 rounded-sm',\n 'bg-surface-glass/50 backdrop-blur-sm',\n 'border border-border-subtle/30',\n 'text-text-secondary hover:text-text-primary',\n 'hover:bg-surface-glass/70 hover:border-brand-primary/30',\n 'transition-all duration-[400ms]',\n 'focus:outline-none focus:ring-2 focus:ring-brand-primary/40',\n isOpen && 'bg-surface-glass/70 border-brand-primary/40 text-text-primary',\n className,\n )}\n aria-label={`Notifications${count > 0 ? ` (${count} unread)` : ''}`}\n aria-expanded={isOpen}\n >\n <BellIcon className={cn('w-5 h-5', count > 0 && 'animate-[bell_0.5s_ease-in-out]')} />\n\n {count > 0 && (\n <span\n className={cn(\n 'absolute -top-1 -right-1',\n 'flex items-center justify-center',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'bg-status-error text-white',\n 'text-[10px] font-bold leading-none',\n 'border-2 border-surface-base',\n 'animate-in zoom-in-50 duration-[400ms]',\n )}\n >\n {count > 99 ? '99+' : count}\n </span>\n )}\n </button>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// NotificationItem — Single notification entry\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { NotificationItemProps, NotificationType } from './types';\nimport {\n OrgBoard, OrgEdit, OrgComment, OrgMention,\n OrgMail, OrgSprint, OrgCheckCircle, OrgFolder,\n OrgWave, OrgDoor, OrgBell, OrgClose,\n} from '../../icons';\n\n// ─── Type → Icon mapping ───────────────────\n\nconst typeIcons: Record<NotificationType, React.FC<{ className?: string }>> = {\n TASK_ASSIGNED: OrgBoard,\n TASK_UPDATED: OrgEdit,\n COMMENT_ADDED: OrgComment,\n CHAT_MESSAGE: OrgComment,\n MENTION: OrgMention,\n INVITATION: OrgMail,\n SPRINT_STARTED: OrgSprint,\n SPRINT_COMPLETED: OrgCheckCircle,\n PROJECT_UPDATED: OrgFolder,\n MEMBER_JOINED: OrgWave,\n MEMBER_LEFT: OrgDoor,\n OTHER: OrgBell,\n};\n\nconst typeColors: Record<NotificationType, string> = {\n TASK_ASSIGNED: 'bg-brand-primary/10 text-brand-primary',\n TASK_UPDATED: 'bg-status-warning/10 text-status-warning',\n COMMENT_ADDED: 'bg-accent-secondary/10 text-accent-secondary',\n CHAT_MESSAGE: 'bg-accent-tertiary/10 text-accent-tertiary',\n MENTION: 'bg-brand-primary/10 text-brand-primary',\n INVITATION: 'bg-status-success/10 text-status-success',\n SPRINT_STARTED: 'bg-status-info/10 text-status-info',\n SPRINT_COMPLETED: 'bg-status-success/10 text-status-success',\n PROJECT_UPDATED: 'bg-accent-secondary/10 text-accent-secondary',\n MEMBER_JOINED: 'bg-status-success/10 text-status-success',\n MEMBER_LEFT: 'bg-status-error/10 text-status-error',\n OTHER: 'bg-surface-elevated text-text-secondary',\n};\n\nfunction formatTimeAgo(dateStr: string): string {\n const now = Date.now();\n const date = new Date(dateStr).getTime();\n const diffMs = now - date;\n const diffMin = Math.floor(diffMs / 60000);\n\n if (diffMin < 1) return 'agora';\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 7) return `${diffDay}d`;\n return new Date(dateStr).toLocaleDateString('pt-BR', { day: '2-digit', month: 'short' });\n}\n\nexport const NotificationItem: React.FC<NotificationItemProps> = ({\n notification,\n onMarkRead,\n onDelete,\n onClick,\n}) => {\n const IconComponent = typeIcons[notification.type] || OrgBell;\n const colorClass = typeColors[notification.type] || typeColors.OTHER;\n\n const handleClick = () => {\n if (!notification.read) onMarkRead(notification.id);\n onClick?.(notification);\n };\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={(e) => e.key === 'Enter' && handleClick()}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-sm cursor-pointer',\n 'transition-all duration-[400ms]',\n 'hover:bg-surface-glass/50',\n !notification.read && 'bg-brand-primary/5 border-l-2 border-brand-primary',\n notification.read && 'opacity-70',\n )}\n >\n {/* Icon */}\n <div\n className={cn(\n 'flex-shrink-0 w-9 h-9 rounded-sm',\n 'flex items-center justify-center',\n 'text-sm',\n colorClass,\n )}\n >\n {notification.metadata?.avatarUrl ? (\n <img\n src={notification.metadata.avatarUrl}\n alt=\"\"\n className=\"w-9 h-9 rounded-sm object-cover\"\n />\n ) : (\n <IconComponent className=\"w-4 h-4\" />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <p\n className={cn(\n 'text-sm leading-snug truncate',\n !notification.read ? 'font-semibold text-text-primary' : 'text-text-secondary',\n )}\n >\n {notification.title}\n </p>\n <span className=\"text-[10px] text-text-muted flex-shrink-0 mt-0.5\">\n {formatTimeAgo(notification.createdAt)}\n </span>\n </div>\n\n <p className=\"text-xs text-text-muted mt-0.5 line-clamp-2\">\n {notification.message}\n </p>\n\n {notification.metadata?.actorName && (\n <p className=\"text-[10px] text-text-muted mt-1\">\n por {notification.metadata.actorName}\n </p>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-1 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n {!notification.read && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onMarkRead(notification.id);\n }}\n className=\"w-2 h-2 rounded-full bg-brand-primary flex-shrink-0 mt-1.5\"\n aria-label=\"Mark as read\"\n />\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete(notification.id);\n }}\n className={cn(\n 'text-[10px] text-text-muted hover:text-status-error',\n 'transition-colors',\n )}\n aria-label=\"Delete notification\"\n >\n <OrgClose className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// NotificationList — Scrollable notification panel\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport { NotificationItem } from './notification-item';\nimport { OrgBell } from '../../icons';\nimport type { NotificationListProps } from './types';\n\nexport const NotificationList: React.FC<NotificationListProps> = ({\n notifications,\n loading,\n onMarkRead,\n onMarkAllRead,\n onDelete,\n onNotificationClick,\n className,\n}) => {\n const unreadCount = notifications.filter((n) => !n.read).length;\n\n return (\n <div\n className={cn(\n 'flex flex-col',\n 'w-[380px] max-h-[520px]',\n 'rounded-sm',\n 'bg-surface-base/95 backdrop-blur-xl',\n 'border border-border-subtle/40',\n 'shadow-2xl shadow-black/20',\n 'overflow-hidden',\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border-subtle/30\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Notificações</h3>\n {unreadCount > 0 && (\n <span\n className={cn(\n 'inline-flex items-center justify-center',\n 'min-w-[20px] h-5 px-1.5',\n 'rounded-full',\n 'bg-brand-primary/10 text-brand-primary',\n 'text-[10px] font-bold',\n )}\n >\n {unreadCount}\n </span>\n )}\n </div>\n\n {unreadCount > 0 && (\n <button\n type=\"button\"\n onClick={onMarkAllRead}\n className={cn(\n 'text-xs text-brand-primary hover:text-brand-primary/80',\n 'transition-colors',\n )}\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto overscroll-contain\">\n {loading && notifications.length === 0 ? (\n <div className=\"flex flex-col gap-3 p-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-start gap-3 animate-pulse\">\n <div className=\"w-9 h-9 rounded-sm bg-surface-elevated\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-3 bg-surface-elevated rounded w-3/4\" />\n <div className=\"h-2 bg-surface-elevated rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 px-4\">\n <OrgBell className=\"w-8 h-8 text-text-muted mb-3\" />\n <p className=\"text-sm text-text-secondary font-medium\">Tudo em dia!</p>\n <p className=\"text-xs text-text-muted mt-1\">Nenhuma notificação por enquanto.</p>\n </div>\n ) : (\n <div className=\"p-2 space-y-0.5 group\">\n {notifications.map((notification) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n onMarkRead={onMarkRead}\n onDelete={onDelete}\n onClick={onNotificationClick}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n {notifications.length > 0 && (\n <div className=\"px-4 py-2.5 border-t border-border-subtle/30 text-center\">\n <button\n type=\"button\"\n className={cn(\n 'text-xs text-text-muted hover:text-text-secondary',\n 'transition-colors',\n )}\n >\n Ver todas as notificações\n </button>\n </div>\n )}\n </div>\n );\n};\n","// ─────────────────────────────────────────────\n// useNotifications — React hook for notification state\n// ─────────────────────────────────────────────\n// Pulls gatewayUrl, authToken, userId, workspaceId\n// from OrganifyProvider — no props needed.\n//\n// Uses graphql-ws subscription for real-time updates\n// instead of polling. Falls back to polling if\n// subscription fails or service URL not configured.\n// ─────────────────────────────────────────────\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from '../../providers/organify-provider';\nimport type { Notification } from './types';\n\ninterface UseNotificationsOptions {\n /** Auto-fetch on mount (default true) */\n autoFetch?: boolean;\n /** Polling interval in ms as fallback (0 = no polling, default 0 since we use subscriptions) */\n pollingInterval?: number;\n}\n\ninterface UseNotificationsReturn {\n notifications: Notification[];\n unreadCount: number;\n loading: boolean;\n error: string | null;\n connected: boolean;\n fetchNotifications: (limit?: number, offset?: number) => Promise<void>;\n markAsRead: (id: string) => Promise<void>;\n markAllAsRead: () => Promise<void>;\n deleteNotification: (id: string) => Promise<void>;\n refetch: () => Promise<void>;\n}\n\nexport function useNotifications(options: UseNotificationsOptions = {}): UseNotificationsReturn {\n const { autoFetch = true, pollingInterval = 0 } = options;\n\n // ─── Pull from OrganifyProvider ───────\n const api = useOrganifyApi();\n const { gatewayUrl, authToken } = api;\n const notificationsServiceUrl = api.services?.notifications;\n const user = useOrganifyUser();\n const { workspace } = useOrganifyWorkspace();\n const userId = user?.id ?? '';\n const workspaceId = workspace?.id ?? '';\n\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const [unreadCount, setUnreadCount] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [connected, setConnected] = useState(false);\n\n const pollingRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectCountRef = useRef(0);\n const reconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastSeenRef = useRef<string | null>(null);\n\n // Notifications GraphQL uses centralized useOrganifyGql with 'notifications' endpoint.\n // Routes through gateway proxy (/graphql/notifications) which injects x-user-id from JWT cookie.\n const centralGql = useOrganifyGql();\n\n const gqlFetch = useCallback(\n async (query: string, variables?: Record<string, any>) => {\n return centralGql('notifications', query, variables);\n },\n [centralGql],\n );\n\n const fetchNotifications = useCallback(\n async (limit = 20, offset = 0) => {\n if (!workspaceId) return;\n setLoading(true);\n setError(null);\n try {\n const data = await gqlFetch(\n `query GetNotifications($filter: NotificationFilterInput) {\n notifications(filter: $filter) {\n items {\n id userId workspaceId type priority title message\n read readAt archived createdAt updatedAt\n metadata { actionUrl avatarUrl actorId actorName }\n }\n total hasMore\n }\n unreadNotificationCount(workspaceId: \"${workspaceId}\") { count }\n }`,\n { filter: { workspaceId, limit, offset } },\n );\n\n const items = data?.notifications?.items ?? [];\n setNotifications(items);\n setUnreadCount(data?.unreadNotificationCount?.count ?? 0);\n\n // Track last seen for subscription replay on reconnect\n if (items.length > 0) {\n lastSeenRef.current = items[0].createdAt;\n }\n } catch (err: any) {\n setError(err.message || 'Failed to fetch notifications');\n } finally {\n setLoading(false);\n }\n },\n [gqlFetch, workspaceId],\n );\n\n const markAsRead = useCallback(\n async (id: string) => {\n try {\n await gqlFetch(\n `mutation MarkRead($id: ID!) {\n markNotificationAsRead(id: $id) { id read readAt }\n }`,\n { id },\n );\n\n setNotifications((prev) =>\n prev.map((n) => (n.id === id ? { ...n, read: true, readAt: new Date().toISOString() } : n)),\n );\n setUnreadCount((prev) => Math.max(0, prev - 1));\n } catch (err: any) {\n setError(err.message);\n }\n },\n [gqlFetch],\n );\n\n const markAllAsRead = useCallback(async () => {\n try {\n await gqlFetch(\n `mutation MarkAllRead($workspaceId: String) {\n markAllNotificationsAsRead(workspaceId: $workspaceId)\n }`,\n { workspaceId },\n );\n\n setNotifications((prev) =>\n prev.map((n) => ({ ...n, read: true, readAt: new Date().toISOString() })),\n );\n setUnreadCount(0);\n } catch (err: any) {\n setError(err.message);\n }\n }, [gqlFetch, workspaceId]);\n\n const deleteNotification = useCallback(\n async (id: string) => {\n try {\n await gqlFetch(\n `mutation DeleteNotification($id: ID!) {\n deleteNotification(id: $id)\n }`,\n { id },\n );\n\n setNotifications((prev) => {\n const removed = prev.find((n) => n.id === id);\n if (removed && !removed.read) {\n setUnreadCount((c) => Math.max(0, c - 1));\n }\n return prev.filter((n) => n.id !== id);\n });\n } catch (err: any) {\n setError(err.message);\n }\n },\n [gqlFetch],\n );\n\n const refetch = useCallback(() => fetchNotifications(), [fetchNotifications]);\n\n // Auto-fetch on mount\n useEffect(() => {\n if (autoFetch && userId?.trim() && workspaceId) {\n fetchNotifications();\n }\n }, [autoFetch, userId, workspaceId, fetchNotifications]);\n\n // ─── GraphQL-WS Subscription ──────────\n useEffect(() => {\n // Skip if user is not authenticated or service URL not configured\n if (!userId?.trim() || !notificationsServiceUrl) return;\n\n const MAX_RECONNECTS = 5;\n\n function connectSubscription() {\n // Build WebSocket URL from service URL\n // NestJS notifications service exposes subscriptions at /graphql/notifications\n const wsUrl = notificationsServiceUrl!\n .replace(/^http/, 'ws')\n .replace(/\\/$/, '') + '/graphql/notifications';\n\n const ws = new WebSocket(wsUrl, 'graphql-transport-ws');\n wsRef.current = ws;\n\n ws.onopen = () => {\n // graphql-ws connection_init\n ws.send(JSON.stringify({\n type: 'connection_init',\n payload: authToken ? { Authorization: `Bearer ${authToken}` } : {},\n }));\n };\n\n ws.onmessage = (event) => {\n let msg: any;\n try { msg = JSON.parse(event.data); } catch { return; }\n\n switch (msg.type) {\n case 'connection_ack':\n setConnected(true);\n reconnectCountRef.current = 0;\n\n // Subscribe to notificationCreated\n ws.send(JSON.stringify({\n id: 'notif-created',\n type: 'subscribe',\n payload: {\n query: `subscription NotificationCreated($lastSeenAt: DateTime) {\n notificationCreated(lastSeenAt: $lastSeenAt) {\n id userId type title message data read isRead readAt createdAt updatedAt\n }\n }`,\n variables: lastSeenRef.current ? { lastSeenAt: lastSeenRef.current } : {},\n },\n }));\n\n // Subscribe to notificationRead\n ws.send(JSON.stringify({\n id: 'notif-read',\n type: 'subscribe',\n payload: {\n query: `subscription NotificationRead($lastSeenAt: DateTime) {\n notificationRead(lastSeenAt: $lastSeenAt) {\n id userId type title message read isRead readAt createdAt updatedAt\n }\n }`,\n variables: {},\n },\n }));\n break;\n\n case 'next':\n if (msg.id === 'notif-created' && msg.payload?.data?.notificationCreated) {\n const notif = msg.payload.data.notificationCreated;\n // Deduplicate\n setNotifications((prev) => {\n if (prev.some((n) => n.id === notif.id)) return prev;\n return [notif, ...prev];\n });\n setUnreadCount((c) => c + 1);\n lastSeenRef.current = notif.createdAt;\n }\n if (msg.id === 'notif-read' && msg.payload?.data?.notificationRead) {\n const notif = msg.payload.data.notificationRead;\n setNotifications((prev) =>\n prev.map((n) => (n.id === notif.id ? { ...n, read: true, readAt: notif.readAt } : n)),\n );\n }\n break;\n\n case 'error':\n console.error('[useNotifications] Subscription error:', msg.payload);\n break;\n\n case 'ping':\n ws.send(JSON.stringify({ type: 'pong' }));\n break;\n }\n };\n\n ws.onclose = () => {\n setConnected(false);\n wsRef.current = null;\n\n // Reconnect with exponential backoff, capped\n if (reconnectCountRef.current < MAX_RECONNECTS) {\n const delay = Math.min(1000 * 2 ** reconnectCountRef.current, 30000);\n reconnectCountRef.current++;\n reconnectTimerRef.current = setTimeout(connectSubscription, delay);\n }\n };\n\n ws.onerror = () => {\n // onclose will fire after onerror\n };\n }\n\n connectSubscription();\n\n return () => {\n if (reconnectTimerRef.current) clearTimeout(reconnectTimerRef.current);\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n setConnected(false);\n };\n }, [userId, notificationsServiceUrl, authToken]);\n\n // ─── Fallback Polling (only if no subscription service configured) ──\n useEffect(() => {\n if (notificationsServiceUrl) return; // subscriptions active, no polling\n if (pollingInterval > 0 && userId?.trim() && workspaceId) {\n pollingRef.current = setInterval(() => fetchNotifications(), pollingInterval);\n return () => {\n if (pollingRef.current) clearInterval(pollingRef.current);\n };\n }\n }, [pollingInterval, userId, workspaceId, fetchNotifications, notificationsServiceUrl]);\n\n return {\n notifications,\n unreadCount,\n loading,\n error,\n connected,\n fetchNotifications,\n markAsRead,\n markAllAsRead,\n deleteNotification,\n refetch,\n };\n}","'use client';\n\n// ─────────────────────────────────────────────\n// OrganifyNotifications — Composed notification widget\n// ─────────────────────────────────────────────\n// Pulls all data from OrganifyProvider — no props\n// needed for gatewayUrl, userId, workspaceId.\n// ─────────────────────────────────────────────\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { NotificationBell } from './notification-bell';\nimport { NotificationList } from './notification-list';\nimport { useNotifications } from './use-notifications';\nimport type { OrganifyNotificationsProps } from './types';\n\nexport const OrganifyNotifications: React.FC<OrganifyNotificationsProps> = ({\n onNotificationClick,\n className,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n notifications,\n unreadCount,\n loading,\n markAsRead,\n markAllAsRead,\n deleteNotification,\n } = useNotifications();\n\n // Close panel when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close panel on Escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false);\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <NotificationBell\n count={unreadCount}\n isOpen={isOpen}\n onToggle={() => setIsOpen((prev) => !prev)}\n />\n\n {isOpen && (\n <div\n className={cn(\n 'absolute right-0 top-full mt-2 z-50',\n 'animate-in slide-in-from-top-2 fade-in-0 duration-[400ms]',\n )}\n >\n <NotificationList\n notifications={notifications}\n loading={loading}\n onMarkRead={markAsRead}\n onMarkAllRead={markAllAsRead}\n onDelete={deleteNotification}\n onNotificationClick={onNotificationClick}\n />\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\n// ─────────────────────────────────────────────\n// PresenceIndicator — User online status dot\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { cn } from '../../lib/utils';\nimport type { PresenceIndicatorProps, PresenceStatus } from './types';\n\nconst statusColors: Record<PresenceStatus, string> = {\n ONLINE: 'bg-status-success',\n AWAY: 'bg-status-warning',\n BUSY: 'bg-status-error',\n OFFLINE: 'bg-text-muted/40',\n};\n\nconst statusLabels: Record<PresenceStatus, string> = {\n ONLINE: 'Online',\n AWAY: 'Ausente',\n BUSY: 'Ocupado',\n OFFLINE: 'Offline',\n};\n\nconst sizeClasses = {\n sm: 'w-2 h-2',\n md: 'w-2.5 h-2.5',\n lg: 'w-3 h-3',\n};\n\nexport const PresenceIndicator: React.FC<PresenceIndicatorProps> = ({\n status,\n size = 'md',\n showLabel = false,\n className,\n}) => {\n return (\n <span\n className={cn('inline-flex items-center gap-1.5', className)}\n title={statusLabels[status]}\n >\n <span\n className={cn(\n 'rounded-full flex-shrink-0',\n 'border-2 border-surface-base',\n sizeClasses[size],\n statusColors[status],\n status === 'ONLINE' && 'animate-pulse',\n )}\n aria-label={statusLabels[status]}\n />\n {showLabel && (\n <span className=\"text-xs text-text-muted\">{statusLabels[status]}</span>\n )}\n </span>\n );\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { cn } from '../../lib/utils';\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nfunction PopoverContent({\n className,\n align = 'center',\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-72 rounded-sm border border-glass-border bg-theme-glass-heavy backdrop-blur-[40px] saturate-[180%] p-4 text-theme shadow-glass outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","// ─────────────────────────────────────────────\n// PresenceAvatarStack — Shows online users\n// in a context (workspace, project, board)\n// Compact stacked avatars + expandable list\n// ─────────────────────────────────────────────\n\n'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\nimport { Avatar, AvatarFallback } from '../primitives/avatar';\nimport { Badge } from '../primitives/badge';\nimport { ScrollArea } from '../primitives/scroll-area';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from '../primitives/tooltip';\nimport { Popover, PopoverContent, PopoverTrigger } from '../primitives/popover';\nimport { PresenceIndicator } from './presence-indicator';\nimport type { PresenceStatus } from './types';\n\n// ─── Types ──────────────────────────────────\n\nexport interface PresenceUser {\n id: string;\n displayName: string;\n avatarUrl: string | null;\n status: PresenceStatus;\n lastSeen?: string;\n}\n\nexport interface PresenceAvatarStackProps {\n /** List of users with presence status */\n users: PresenceUser[];\n /** Max avatars to show before \"+N\" */\n maxVisible?: number;\n /** Size of avatars */\n size?: 'sm' | 'md' | 'lg';\n /** Show only online users in the stack */\n onlineOnly?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Show the expandable popover list */\n expandable?: boolean;\n /** CSS class */\n className?: string;\n}\n\n// ─── Helpers ────────────────────────────────\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((w) => w[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n}\n\nconst sizeConfig = {\n sm: { avatar: 'h-6 w-6', text: 'text-[9px]', stack: '-space-x-1.5', dot: 'sm' as const },\n md: { avatar: 'h-8 w-8', text: 'text-[10px]', stack: '-space-x-2', dot: 'md' as const },\n lg: { avatar: 'h-10 w-10', text: 'text-xs', stack: '-space-x-2.5', dot: 'lg' as const },\n};\n\nconst statusOrder: Record<PresenceStatus, number> = {\n ONLINE: 0,\n BUSY: 1,\n AWAY: 2,\n OFFLINE: 3,\n};\n\nfunction formatLastSeen(iso?: string): string {\n if (!iso) return '';\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'agora';\n if (mins < 60) return `${mins}m atrás`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h atrás`;\n return `${Math.floor(hours / 24)}d atrás`;\n}\n\n// ─── Single Avatar with Status ──────────────\n\nfunction PresenceAvatar({\n user,\n size = 'md',\n showTooltip = true,\n}: {\n user: PresenceUser;\n size?: 'sm' | 'md' | 'lg';\n showTooltip?: boolean;\n}) {\n const cfg = sizeConfig[size];\n\n const avatar = (\n <div className=\"relative\">\n <Avatar shape=\"circle\" size=\"sm\" className={cn(cfg.avatar, 'border-2 border-surface')}>\n <AvatarFallback className=\"bg-primary/20 text-primary-light font-semibold\" style={{ fontSize: 'inherit' }}>\n <span className={cfg.text}>{getInitials(user.displayName)}</span>\n </AvatarFallback>\n </Avatar>\n <span className=\"absolute -bottom-0.5 -right-0.5\">\n <PresenceIndicator status={user.status} size={cfg.dot} />\n </span>\n </div>\n );\n\n if (!showTooltip) return avatar;\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{avatar}</TooltipTrigger>\n <TooltipContent className=\"text-xs\">\n <p className=\"font-medium\">{user.displayName}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Presence List (Expandable) ─────────────\n\nfunction PresenceList({\n users,\n size = 'md',\n}: {\n users: PresenceUser[];\n size?: 'sm' | 'md' | 'lg';\n}) {\n const sorted = [...users].sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n const online = sorted.filter((u) => u.status !== 'OFFLINE');\n const offline = sorted.filter((u) => u.status === 'OFFLINE');\n\n const renderUser = (user: PresenceUser) => (\n <div\n key={user.id}\n className=\"flex items-center gap-2.5 px-3 py-1.5 rounded-sm hover:bg-theme-subtle transition-colors\"\n >\n <PresenceAvatar user={user} size=\"sm\" showTooltip={false} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-theme truncate\">{user.displayName}</p>\n {user.status === 'OFFLINE' && user.lastSeen && (\n <p className=\"text-[10px] text-theme-muted\">{formatLastSeen(user.lastSeen)}</p>\n )}\n </div>\n <PresenceIndicator status={user.status} size=\"sm\" showLabel />\n </div>\n );\n\n return (\n <div className=\"w-[240px]\">\n <div className=\"px-3 py-2 border-b border-theme-subtle\">\n <h4 className=\"text-xs font-semibold text-theme\">\n Membros\n <span className=\"text-theme-muted font-normal ml-1\">({users.length})</span>\n </h4>\n </div>\n <ScrollArea className=\"max-h-[300px]\">\n <div className=\"py-1\">\n {online.length > 0 && (\n <>\n <p className=\"px-3 py-1 text-[10px] text-emerald-400/70 uppercase tracking-wider font-semibold\">\n Online — {online.length}\n </p>\n {online.map(renderUser)}\n </>\n )}\n {offline.length > 0 && (\n <>\n <p className=\"px-3 py-1 mt-1 text-[10px] text-theme-muted uppercase tracking-wider font-semibold\">\n Offline — {offline.length}\n </p>\n {offline.map(renderUser)}\n </>\n )}\n {users.length === 0 && (\n <p className=\"px-3 py-4 text-xs text-theme-muted text-center\">Sem membros</p>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ─── Main Component ─────────────────────────\n\nexport function PresenceAvatarStack({\n users,\n maxVisible = 4,\n size = 'md',\n onlineOnly = false,\n loading = false,\n expandable = true,\n className,\n}: PresenceAvatarStackProps) {\n const cfg = sizeConfig[size];\n\n const displayUsers = onlineOnly\n ? users.filter((u) => u.status !== 'OFFLINE')\n : [...users].sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n const visible = displayUsers.slice(0, maxVisible);\n const overflow = displayUsers.length - maxVisible;\n const onlineCount = users.filter((u) => u.status === 'ONLINE').length;\n\n if (loading) {\n return (\n <div className={cn('flex items-center', cfg.stack, className)}>\n {Array.from({ length: Math.min(3, maxVisible) }).map((_, i) => (\n <Skeleton\n key={i}\n variant=\"circular\"\n className={cn(cfg.avatar, 'border-2 border-surface')}\n />\n ))}\n </div>\n );\n }\n\n if (displayUsers.length === 0) {\n return null;\n }\n\n const stack = (\n <div className={cn('flex items-center', className)}>\n <div className={cn('flex items-center', cfg.stack)}>\n {visible.map((user) => (\n <PresenceAvatar\n key={user.id}\n user={user}\n size={size}\n showTooltip={!expandable}\n />\n ))}\n\n {overflow > 0 && (\n <div\n className={cn(\n cfg.avatar,\n 'flex items-center justify-center rounded-full border-2 border-surface bg-theme-subtle',\n cfg.text,\n 'font-medium text-theme-muted',\n )}\n >\n +{overflow}\n </div>\n )}\n </div>\n\n {/* Online count badge */}\n <Badge\n variant=\"default\"\n className=\"ml-2 text-[10px] px-1.5 py-0 h-4 border-emerald-500/20 text-emerald-400/70 bg-emerald-500/5\"\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 mr-1 animate-pulse\" />\n {onlineCount}\n </Badge>\n </div>\n );\n\n if (!expandable) return stack;\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button className=\"cursor-pointer hover:opacity-80 transition-opacity\">\n {stack}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"p-0 bg-theme-glass-heavy backdrop-blur-xl border-theme-subtle shadow-lg\"\n align=\"end\"\n >\n <PresenceList users={users} size={size} />\n </PopoverContent>\n </Popover>\n );\n}\n","// ─────────────────────────────────────────────\n// usePresence — React hook for presence tracking\n// ─────────────────────────────────────────────\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { UserPresence, PresenceStatus } from './types';\n\ninterface UsePresenceOptions {\n gatewayUrl: string;\n userId: string;\n authToken?: string;\n /** Direct service URLs (bypasses gateway) */\n services?: { notifications?: string };\n /** Heartbeat interval in ms (default: 30s) */\n heartbeatInterval?: number;\n /** Auto-connect on mount */\n autoConnect?: boolean;\n}\n\ninterface UsePresenceReturn {\n onlineUsers: UserPresence[];\n myStatus: PresenceStatus;\n isConnected: boolean;\n setStatus: (status: PresenceStatus) => void;\n getUserStatus: (userId: string) => PresenceStatus;\n fetchOnlineUsers: () => Promise<void>;\n}\n\nexport function usePresence(options: UsePresenceOptions): UsePresenceReturn {\n const {\n gatewayUrl,\n userId,\n authToken,\n heartbeatInterval = 30000,\n autoConnect = true,\n } = options;\n\n const [onlineUsers, setOnlineUsers] = useState<UserPresence[]>([]);\n const [myStatus, setMyStatus] = useState<PresenceStatus>('ONLINE');\n const [isConnected, setIsConnected] = useState(false);\n const heartbeatRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Presence GraphQL goes through gateway proxy (/graphql/notifications)\n // which injects x-user-id from the JWT cookie.\n const graphqlUrl = `${gatewayUrl}/graphql/notifications`;\n\n const gqlFetch = useCallback(\n async (query: string, variables?: Record<string, any>) => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers,\n credentials: 'include',\n body: JSON.stringify({ query, variables }),\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = await res.json();\n if (json.errors?.length) throw new Error(json.errors[0].message);\n return json.data;\n },\n [graphqlUrl, userId, authToken],\n );\n\n const fetchOnlineUsers = useCallback(async () => {\n try {\n const data = await gqlFetch(`\n query GetOnlineUsers {\n onlineUsers {\n users { userId status connectedAt lastActivityAt sessionCount }\n count\n }\n }\n `);\n setOnlineUsers(data.onlineUsers.users);\n setIsConnected(true);\n } catch {\n setIsConnected(false);\n }\n }, [gqlFetch]);\n\n const setStatus = useCallback(\n (status: PresenceStatus) => {\n setMyStatus(status);\n // Fire-and-forget status update\n gqlFetch('').catch(() => {});\n },\n [gqlFetch],\n );\n\n const getUserStatus = useCallback(\n (targetUserId: string): PresenceStatus => {\n const user = onlineUsers.find((u) => u.userId === targetUserId);\n return user?.status || 'OFFLINE';\n },\n [onlineUsers],\n );\n\n // Auto-connect: fetch online users on mount\n useEffect(() => {\n if (autoConnect && userId) {\n fetchOnlineUsers();\n }\n }, [autoConnect, userId, fetchOnlineUsers]);\n\n // Heartbeat polling\n useEffect(() => {\n if (heartbeatInterval > 0 && userId) {\n heartbeatRef.current = setInterval(() => {\n fetchOnlineUsers();\n }, heartbeatInterval);\n\n return () => {\n if (heartbeatRef.current) clearInterval(heartbeatRef.current);\n };\n }\n }, [heartbeatInterval, userId, fetchOnlineUsers]);\n\n // Visibility change → away/online\n useEffect(() => {\n const handleVisibility = () => {\n if (document.hidden) {\n setMyStatus('AWAY');\n } else {\n setMyStatus('ONLINE');\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibility);\n return () => document.removeEventListener('visibilitychange', handleVisibility);\n }, []);\n\n return {\n onlineUsers,\n myStatus,\n isConnected,\n setStatus,\n getUserStatus,\n fetchOnlineUsers,\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cn, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea, Skeleton, Avatar, AvatarFallback, Badge, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from './chunk-
|
|
1
|
+
import { cn, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea, Skeleton, Avatar, AvatarFallback, Badge, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from './chunk-XZ2OJNCX.js';
|
|
2
2
|
import { OrgPlus, OrgSearch, OrgComment, OrgClose, OrgEdit, OrgTeam, OrgGlobe, OrgLock, OrgCheckCircle, OrgError, OrgWarning, OrgInfo, OrgChevronDown, OrgChevronRight, OrgDoor, OrgTrash, OrgCheck, OrgFolder, OrgChevronLeft } from './chunk-AHMA7OV3.js';
|
|
3
3
|
import * as React7 from 'react';
|
|
4
4
|
import React7__default, { useState, useCallback, useEffect } from 'react';
|
|
@@ -4139,5 +4139,5 @@ function OrganifyChat({
|
|
|
4139
4139
|
}
|
|
4140
4140
|
|
|
4141
4141
|
export { Alert, Button, ChatMessages, ChatSidebar, CreateRoomDialog, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, Input, Label, MOCK_PROJECTS, MOCK_USERS, MentionPopover, MessageBubble, MessageInput, OrgLoader, OrgLoaderInline, OrganifyChat, ResponsiveDialog, RoomManagementPanel, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, TypingIndicatorMock, alertVariants, buttonVariants, generateAutoReplies, getMockMentionOptions, getRoomPermissions, inputVariants, orgLoaderVariants, typingIndicator, useChat };
|
|
4142
|
-
//# sourceMappingURL=chunk-
|
|
4143
|
-
//# sourceMappingURL=chunk-
|
|
4142
|
+
//# sourceMappingURL=chunk-R6LBGT55.js.map
|
|
4143
|
+
//# sourceMappingURL=chunk-R6LBGT55.js.map
|