{"ast":null,"code":"var _jsxFileName = \"/home/gnx/Desktop/gnx-mail/frontend/src/pages/Contacts.js\",\n _s = $RefreshSig$();\nimport React, { useState } from 'react';\nimport { useQuery } from 'react-query';\nimport { Users, Plus, Search, Filter, MoreVertical, Star, Mail, Phone, MapPin, Building, User } from 'lucide-react';\nimport { api, endpoints } from '../services/api';\nimport LoadingSpinner from '../components/LoadingSpinner';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst Contacts = () => {\n _s();\n var _contacts$results;\n const [searchQuery, setSearchQuery] = useState('');\n const [filter, setFilter] = useState('all');\n const {\n data: contacts,\n isLoading\n } = useQuery(['contacts', searchQuery, filter], () => {\n const params = new URLSearchParams();\n if (searchQuery) params.append('search', searchQuery);\n if (filter !== 'all') params.append('is_favorite', filter === 'favorites' ? 'true' : 'false');\n return api.get(`${endpoints.contacts}?${params}`).then(res => res.data);\n });\n const formatContactName = contact => {\n return `${contact.first_name} ${contact.last_name}`.trim() || contact.email;\n };\n if (isLoading) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center justify-center h-64\",\n children: /*#__PURE__*/_jsxDEV(LoadingSpinner, {\n size: \"lg\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 40,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 39,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"md:flex md:items-center md:justify-between\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [/*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:truncate\",\n children: \"Contacts\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 50,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-gray-500\",\n children: [(contacts === null || contacts === void 0 ? void 0 : contacts.count) || 0, \" contacts\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 53,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 49,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-4 flex md:mt-0 md:ml-4\",\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"btn-primary\",\n children: [/*#__PURE__*/_jsxDEV(Plus, {\n className: \"h-4 w-4 mr-2\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 59,\n columnNumber: 13\n }, this), \"Add Contact\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 58,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 57,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 48,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-body\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex flex-col sm:flex-row gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex-1\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"relative\",\n children: [/*#__PURE__*/_jsxDEV(Search, {\n className: \"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 71,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n placeholder: \"Search contacts...\",\n value: searchQuery,\n onChange: e => setSearchQuery(e.target.value),\n className: \"input pl-10\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 72,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 70,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 69,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex gap-2\",\n children: /*#__PURE__*/_jsxDEV(\"select\", {\n value: filter,\n onChange: e => setFilter(e.target.value),\n className: \"input\",\n children: [/*#__PURE__*/_jsxDEV(\"option\", {\n value: \"all\",\n children: \"All contacts\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 87,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"option\", {\n value: \"favorites\",\n children: \"Favorites\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 88,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"option\", {\n value: \"blocked\",\n children: \"Blocked\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 89,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 82,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 81,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 68,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 67,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 66,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divide-y divide-gray-200\",\n children: (contacts === null || contacts === void 0 ? void 0 : (_contacts$results = contacts.results) === null || _contacts$results === void 0 ? void 0 : _contacts$results.length) > 0 ? contacts.results.map(contact => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 hover:bg-gray-50\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center space-x-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex-shrink-0\",\n children: contact.avatar ? /*#__PURE__*/_jsxDEV(\"img\", {\n className: \"h-12 w-12 rounded-full\",\n src: contact.avatar,\n alt: formatContactName(contact)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 105,\n columnNumber: 23\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"h-12 w-12 rounded-full bg-gray-300 flex items-center justify-center\",\n children: /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"text-lg font-medium text-gray-700\",\n children: formatContactName(contact).charAt(0).toUpperCase()\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 112,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 111,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 103,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center justify-between\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-lg font-medium text-gray-900\",\n children: formatContactName(contact)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 122,\n columnNumber: 25\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center space-x-4 mt-1\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center text-sm text-gray-500\",\n children: [/*#__PURE__*/_jsxDEV(Mail, {\n className: \"h-4 w-4 mr-1\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 127,\n columnNumber: 29\n }, this), contact.email]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 126,\n columnNumber: 27\n }, this), contact.phone && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center text-sm text-gray-500\",\n children: [/*#__PURE__*/_jsxDEV(Phone, {\n className: \"h-4 w-4 mr-1\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 132,\n columnNumber: 31\n }, this), contact.phone]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 131,\n columnNumber: 29\n }, this), contact.company && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center text-sm text-gray-500\",\n children: [/*#__PURE__*/_jsxDEV(Building, {\n className: \"h-4 w-4 mr-1\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 138,\n columnNumber: 31\n }, this), contact.company]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 137,\n columnNumber: 29\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 125,\n columnNumber: 25\n }, this), contact.address_line1 && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center text-sm text-gray-500 mt-1\",\n children: [/*#__PURE__*/_jsxDEV(MapPin, {\n className: \"h-4 w-4 mr-1\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 145,\n columnNumber: 29\n }, this), contact.address_line1, \", \", contact.city]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 144,\n columnNumber: 27\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 121,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center space-x-2\",\n children: [contact.is_favorite && /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"text-yellow-500\",\n children: /*#__PURE__*/_jsxDEV(Star, {\n className: \"h-5 w-5 fill-current\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 154,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 153,\n columnNumber: 27\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"text-gray-400 hover:text-gray-600\",\n children: /*#__PURE__*/_jsxDEV(MoreVertical, {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 158,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 157,\n columnNumber: 25\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 151,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 120,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 119,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 102,\n columnNumber: 17\n }, this)\n }, contact.id, false, {\n fileName: _jsxFileName,\n lineNumber: 101,\n columnNumber: 15\n }, this)) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-center py-12\",\n children: [/*#__PURE__*/_jsxDEV(Users, {\n className: \"mx-auto h-12 w-12 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 168,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"mt-2 text-sm font-medium text-gray-900\",\n children: \"No contacts\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 169,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-gray-500\",\n children: searchQuery ? 'No contacts match your search.' : 'You don\\'t have any contacts yet.'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 170,\n columnNumber: 15\n }, this), !searchQuery && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-6\",\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"btn-primary\",\n children: [/*#__PURE__*/_jsxDEV(Plus, {\n className: \"h-4 w-4 mr-2\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 176,\n columnNumber: 21\n }, this), \"Add your first contact\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 175,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 174,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 167,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 98,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 97,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 46,\n columnNumber: 5\n }, this);\n};\n_s(Contacts, \"2km6IPHufRHPQvzEZOvNOV623fo=\", false, function () {\n return [useQuery];\n});\n_c = Contacts;\nexport default Contacts;\nvar _c;\n$RefreshReg$(_c, \"Contacts\");","map":{"version":3,"names":["React","useState","useQuery","Users","Plus","Search","Filter","MoreVertical","Star","Mail","Phone","MapPin","Building","User","api","endpoints","LoadingSpinner","jsxDEV","_jsxDEV","Contacts","_s","_contacts$results","searchQuery","setSearchQuery","filter","setFilter","data","contacts","isLoading","params","URLSearchParams","append","get","then","res","formatContactName","contact","first_name","last_name","trim","email","className","children","size","fileName","_jsxFileName","lineNumber","columnNumber","count","type","placeholder","value","onChange","e","target","results","length","map","avatar","src","alt","charAt","toUpperCase","phone","company","address_line1","city","is_favorite","id","_c","$RefreshReg$"],"sources":["/home/gnx/Desktop/gnx-mail/frontend/src/pages/Contacts.js"],"sourcesContent":["import React, { useState } from 'react';\nimport { useQuery } from 'react-query';\nimport { \n Users, \n Plus, \n Search, \n Filter, \n MoreVertical,\n Star,\n Mail,\n Phone,\n MapPin,\n Building,\n User\n} from 'lucide-react';\nimport { api, endpoints } from '../services/api';\nimport LoadingSpinner from '../components/LoadingSpinner';\n\nconst Contacts = () => {\n const [searchQuery, setSearchQuery] = useState('');\n const [filter, setFilter] = useState('all');\n\n const { data: contacts, isLoading } = useQuery(\n ['contacts', searchQuery, filter],\n () => {\n const params = new URLSearchParams();\n if (searchQuery) params.append('search', searchQuery);\n if (filter !== 'all') params.append('is_favorite', filter === 'favorites' ? 'true' : 'false');\n return api.get(`${endpoints.contacts}?${params}`).then(res => res.data);\n }\n );\n\n const formatContactName = (contact) => {\n return `${contact.first_name} ${contact.last_name}`.trim() || contact.email;\n };\n\n if (isLoading) {\n return (\n
\n {contacts?.count || 0} contacts\n
\n\n {searchQuery ? 'No contacts match your search.' : 'You don\\'t have any contacts yet.'}\n
\n {!searchQuery && (\n