{"version":3,"file":"index-jSF4FAFZ.cjs","sources":["../src/app/pages/NotificationsPage/index.jsx"],"sourcesContent":["import { useContext, useEffect, useState } from 'react';\nimport DJClientContext from '../../providers/djclient';\nimport LoadingIcon from '../../icons/LoadingIcon';\nimport { formatRelativeTime, groupByDate } from '../../utils/date';\n\n// Enrich history entries with node info from GraphQL\nconst enrichWithNodeInfo = (entries, nodes) => {\n  const nodeMap = new Map(nodes.map(n => [n.name, n]));\n  return entries.map(entry => {\n    const node = nodeMap.get(entry.entity_name);\n    return {\n      ...entry,\n      node_type: node?.type,\n      display_name: node?.current?.displayName,\n    };\n  });\n};\n\nexport function NotificationsPage() {\n  const djClient = useContext(DJClientContext).DataJunctionAPI;\n  const [notifications, setNotifications] = useState([]);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    async function fetchNotifications() {\n      try {\n        const history = (await djClient.getSubscribedHistory(50)) || [];\n\n        // Get unique entity names and fetch their info via GraphQL\n        const nodeNames = Array.from(new Set(history.map(h => h.entity_name)));\n        const nodes = nodeNames.length\n          ? await djClient.getNodesByNames(nodeNames)\n          : [];\n\n        const enriched = enrichWithNodeInfo(history, nodes);\n        setNotifications(enriched);\n      } catch (error) {\n        console.error('Error fetching notifications:', error);\n      } finally {\n        setLoading(false);\n      }\n    }\n    fetchNotifications();\n  }, [djClient]);\n\n  const groupedNotifications = groupByDate(notifications);\n\n  return (\n    <div className=\"mid\">\n      <div className=\"card\">\n        <div className=\"card-header\">\n          <h2>Notifications</h2>\n        </div>\n        <div className=\"card-body\">\n          <div className=\"notifications-list\">\n            {loading ? (\n              <div style={{ padding: '2rem', textAlign: 'center' }}>\n                <LoadingIcon />\n              </div>\n            ) : notifications.length === 0 ? (\n              <div\n                style={{\n                  padding: '2rem 1rem',\n                  color: '#666',\n                  textAlign: 'center',\n                }}\n              >\n                No notifications yet. Watch nodes to receive updates when they\n                change.\n              </div>\n            ) : (\n              groupedNotifications.map(group => (\n                <div key={group.label} className=\"notification-group\">\n                  <div\n                    style={{\n                      padding: '0.5rem 0.75rem',\n                      backgroundColor: '#f8f9fa',\n                      borderBottom: '1px solid #eee',\n                      fontSize: '12px',\n                      fontWeight: 600,\n                      color: '#666',\n                      textTransform: 'uppercase',\n                      letterSpacing: '0.5px',\n                    }}\n                  >\n                    {group.label}\n                  </div>\n                  {group.items.map(entry => {\n                    const version = entry.details?.version;\n                    const href = version\n                      ? `/nodes/${entry.entity_name}/revisions/${version}`\n                      : `/nodes/${entry.entity_name}/history`;\n\n                    return (\n                      <a\n                        key={entry.id}\n                        className=\"notification-item\"\n                        href={href}\n                      >\n                        <span className=\"notification-node\">\n                          <span className=\"notification-title\">\n                            {entry.display_name || entry.entity_name}\n                            {version && (\n                              <span className=\"badge version\">{version}</span>\n                            )}\n                          </span>\n                          {entry.display_name && (\n                            <span className=\"notification-entity\">\n                              {entry.entity_name}\n                            </span>\n                          )}\n                        </span>\n                        <span className=\"notification-meta\">\n                          {entry.node_type && (\n                            <span\n                              className={`node_type__${entry.node_type} badge node_type`}\n                            >\n                              {entry.node_type.toUpperCase()}\n                            </span>\n                          )}\n                          {entry.activity_type}d by{' '}\n                          <span style={{ color: '#333' }}>{entry.user}</span> ·{' '}\n                          {formatRelativeTime(entry.created_at)}\n                        </span>\n                      </a>\n                    );\n                  })}\n                </div>\n              ))\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n"],"names":["enrichWithNodeInfo","entries","nodes","nodeMap","entry","node","_a","NotificationsPage","djClient","useContext","DJClientContext","notifications","setNotifications","useState","loading","setLoading","useEffect","fetchNotifications","history","nodeNames","h","enriched","error","groupedNotifications","groupByDate","jsxs","jsx","LoadingIcon","group","version","href","formatRelativeTime"],"mappings":"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"}