react-os-shell 0.7.0 → 0.7.2
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/{Browser-42ZTL3DQ.js → Browser-WVSS64J6.js} +3 -3
- package/dist/{Browser-42ZTL3DQ.js.map → Browser-WVSS64J6.js.map} +1 -1
- package/dist/{Calculator-QMC43H6W.js → Calculator-37EIFRDU.js} +4 -4
- package/dist/{Calculator-QMC43H6W.js.map → Calculator-37EIFRDU.js.map} +1 -1
- package/dist/{Calendar-OSPNZXPD.js → Calendar-KCZQJ5CY.js} +3 -3
- package/dist/{Calendar-OSPNZXPD.js.map → Calendar-KCZQJ5CY.js.map} +1 -1
- package/dist/{CurrencyConverter-RQKXZ56O.js → CurrencyConverter-PWX3FKRK.js} +4 -4
- package/dist/{CurrencyConverter-RQKXZ56O.js.map → CurrencyConverter-PWX3FKRK.js.map} +1 -1
- package/dist/{Documents-SNNWYPAS.js → Documents-W2DABIOW.js} +3 -3
- package/dist/{Documents-SNNWYPAS.js.map → Documents-W2DABIOW.js.map} +1 -1
- package/dist/{Email-QIDYGDSR.js → Email-GTGL7CW5.js} +3 -3
- package/dist/{Email-QIDYGDSR.js.map → Email-GTGL7CW5.js.map} +1 -1
- package/dist/Files-XNAPEBFF.js +11 -0
- package/dist/{Files-JUWNFKSF.js.map → Files-XNAPEBFF.js.map} +1 -1
- package/dist/{Minesweeper-TZU7VTBR.js → Minesweeper-N73MSPJV.js} +3 -3
- package/dist/{Minesweeper-TZU7VTBR.js.map → Minesweeper-N73MSPJV.js.map} +1 -1
- package/dist/{Notepad-RXDODESR.js → Notepad-MXEQCIC7.js} +3 -3
- package/dist/{Notepad-RXDODESR.js.map → Notepad-MXEQCIC7.js.map} +1 -1
- package/dist/{PomodoroTimer-YYFTVAAT.js → PomodoroTimer-VEYXRZWZ.js} +4 -4
- package/dist/{PomodoroTimer-YYFTVAAT.js.map → PomodoroTimer-VEYXRZWZ.js.map} +1 -1
- package/dist/Preview-VMKMY6SY.js +8 -0
- package/dist/{Preview-HDHGK3QA.js.map → Preview-VMKMY6SY.js.map} +1 -1
- package/dist/Spreadsheet-UZMNMLZH.js +6 -0
- package/dist/{Spreadsheet-2ZWIDCBD.js.map → Spreadsheet-UZMNMLZH.js.map} +1 -1
- package/dist/{Weather-G7GAZWKB.js → Weather-R6ULA547.js} +4 -4
- package/dist/{Weather-G7GAZWKB.js.map → Weather-R6ULA547.js.map} +1 -1
- package/dist/{WorldClock-H3TAHY3V.js → WorldClock-HHIBQXUR.js} +4 -5
- package/dist/WorldClock-HHIBQXUR.js.map +1 -0
- package/dist/apps/index.js +21 -21
- package/dist/apps/index.js.map +1 -1
- package/dist/{chunk-ZIRRB5P2.js → chunk-3T6SQ4UO.js} +36 -15
- package/dist/chunk-3T6SQ4UO.js.map +1 -0
- package/dist/{chunk-EIMG6KP7.js → chunk-CDSFAXIS.js} +4 -4
- package/dist/{chunk-EIMG6KP7.js.map → chunk-CDSFAXIS.js.map} +1 -1
- package/dist/{chunk-VIUW7IPZ.js → chunk-KJ5664G7.js} +3 -3
- package/dist/{chunk-VIUW7IPZ.js.map → chunk-KJ5664G7.js.map} +1 -1
- package/dist/{chunk-U7XDTOFD.js → chunk-LWVRQWGV.js} +3 -3
- package/dist/{chunk-U7XDTOFD.js.map → chunk-LWVRQWGV.js.map} +1 -1
- package/dist/{chunk-QWQHSHAX.js → chunk-SUUADOG6.js} +4 -4
- package/dist/{chunk-QWQHSHAX.js.map → chunk-SUUADOG6.js.map} +1 -1
- package/dist/{chunk-OMCRYSXD.js → chunk-ZETQWO2W.js} +3 -3
- package/dist/{chunk-OMCRYSXD.js.map → chunk-ZETQWO2W.js.map} +1 -1
- package/dist/index.d.ts +62 -1
- package/dist/index.js +105 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/Files-JUWNFKSF.js +0 -11
- package/dist/Preview-HDHGK3QA.js +0 -8
- package/dist/Spreadsheet-2ZWIDCBD.js +0 -6
- package/dist/WorldClock-H3TAHY3V.js.map +0 -1
- package/dist/chunk-ZIRRB5P2.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Email.tsx"],"names":[],"mappings":"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","file":"Email-QIDYGDSR.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useMailAuth from '../hooks/useMailAuth';\nimport { setEmailUnreadCount } from '../hooks/useEmailUnread';\nimport { getMailClient } from '../api/mailClient';\nimport toast from '../shell/toast';\nimport Modal, { ModalActions } from '../shell/Modal';\nimport { formatDate, formatDateTime } from '../utils/date';\n\ninterface Folder {\n path: string;\n name: string;\n delimiter: string;\n specialUse: 'inbox' | 'sent' | 'drafts' | 'trash' | 'junk' | 'archive' | 'flagged' | null;\n subscribed: boolean;\n unreadCount: number;\n totalCount: number;\n}\n\ninterface Address { name: string; address: string }\n\ninterface MessageListItem {\n uid: number;\n threadId: string;\n from: Address;\n to: Address[];\n subject: string;\n snippet: string;\n date: string;\n flags: string[];\n hasAttachments: boolean;\n inReplyTo: string | null;\n references: string[];\n}\n\ninterface AttachmentInfo {\n partId: string;\n filename: string;\n contentType: string;\n size: number;\n contentId: string | null;\n}\n\ninterface MessageDetail extends Omit<MessageListItem, 'snippet' | 'hasAttachments'> {\n cc: Address[];\n text: string | null;\n html: string | null;\n attachments: AttachmentInfo[];\n}\n\nconst SMART_VIEWS: Array<{ key: string; label: string; icon: string }> = [\n { key: '__inbox__', label: 'Inbox', icon: '📥' },\n { key: '__starred__', label: 'Starred', icon: '⭐' },\n { key: '__unread__', label: 'Unread', icon: '●' },\n { key: '__drafts__', label: 'Drafts', icon: '📝' },\n { key: '__sent__', label: 'Sent', icon: '📤' },\n { key: '__trash__', label: 'Trash', icon: '🗑' },\n { key: '__junk__', label: 'Spam', icon: '⚠' },\n];\n\nfunction resolveSmartView(key: string, folders: Folder[]): string {\n if (key === '__inbox__') return folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n if (key === '__sent__') return folders.find(f => f.specialUse === 'sent')?.path || 'Sent';\n if (key === '__drafts__') return folders.find(f => f.specialUse === 'drafts')?.path || 'Drafts';\n if (key === '__trash__') return folders.find(f => f.specialUse === 'trash')?.path || 'Trash';\n if (key === '__junk__') return folders.find(f => f.specialUse === 'junk')?.path || 'Junk';\n return key; // __starred__, __unread__ → handled server-side\n}\n\nexport default function Email() {\n const { isConnected, serverReachable } = useMailAuth();\n\n const [folders, setFolders] = useState<Folder[]>([]);\n const [selectedKey, setSelectedKey] = useState<string>('__inbox__');\n const [messages, setMessages] = useState<MessageListItem[]>([]);\n const [selectedUid, setSelectedUid] = useState<number | null>(null);\n const [detail, setDetail] = useState<MessageDetail | null>(null);\n const [loadingFolders, setLoadingFolders] = useState(false);\n const [loadingList, setLoadingList] = useState(false);\n const [loadingDetail, setLoadingDetail] = useState(false);\n const [composeOpen, setComposeOpen] = useState(false);\n const [composeDraft, setComposeDraft] = useState<DraftState | null>(null);\n const [serverError, setServerError] = useState<string | null>(null);\n\n const selectedFolderPath = useMemo(() => resolveSmartView(selectedKey, folders), [selectedKey, folders]);\n\n const refreshFolders = useCallback(async () => {\n if (!isConnected) return;\n setLoadingFolders(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ folders: Folder[] }>('/api/mail/folders');\n setFolders(res.data.folders);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingFolders(false);\n }\n }, [isConnected]);\n\n const refreshList = useCallback(async () => {\n if (!isConnected) return;\n setLoadingList(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ messages: MessageListItem[] }>('/api/mail/messages', {\n params: { folder: selectedFolderPath, page: 0, pageSize: 50 },\n });\n setMessages(res.data.messages);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingList(false);\n }\n }, [isConnected, selectedFolderPath]);\n\n useEffect(() => {\n refreshFolders();\n }, [refreshFolders]);\n\n useEffect(() => {\n refreshList();\n setDetail(null);\n setSelectedUid(null);\n }, [refreshList]);\n\n // Poll unread counts every 30s and push to the badge.\n const unreadPollRef = useRef<number | null>(null);\n useEffect(() => {\n if (!isConnected) return;\n async function tick() {\n try {\n const res = await getMailClient().get<{ counts: Record<string, number> }>('/api/mail/unread-counts');\n const inboxFolder = folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n setEmailUnreadCount(res.data.counts[inboxFolder] || 0);\n setFolders(prev =>\n prev.map(f => ({ ...f, unreadCount: res.data.counts[f.path] ?? f.unreadCount }))\n );\n } catch {\n /* ignore polling errors */\n }\n }\n tick();\n unreadPollRef.current = window.setInterval(tick, 30_000) as unknown as number;\n return () => {\n if (unreadPollRef.current) window.clearInterval(unreadPollRef.current);\n };\n }, [isConnected, folders]);\n\n const openMessage = useCallback(async (item: MessageListItem) => {\n setSelectedUid(item.uid);\n setLoadingDetail(true);\n try {\n const res = await getMailClient().get<MessageDetail>(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}`\n );\n setDetail(res.data);\n if (!item.flags.includes('\\\\Seen')) {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n { add: ['\\\\Seen'] }\n );\n setMessages(prev =>\n prev.map(m => (m.uid === item.uid ? { ...m, flags: [...m.flags, '\\\\Seen'] } : m))\n );\n }\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setLoadingDetail(false);\n }\n }, [selectedFolderPath]);\n\n const toggleStar = useCallback(async (item: MessageListItem) => {\n const isFlagged = item.flags.includes('\\\\Flagged');\n try {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n isFlagged ? { remove: ['\\\\Flagged'] } : { add: ['\\\\Flagged'] }\n );\n setMessages(prev =>\n prev.map(m =>\n m.uid === item.uid\n ? {\n ...m,\n flags: isFlagged ? m.flags.filter(f => f !== '\\\\Flagged') : [...m.flags, '\\\\Flagged'],\n }\n : m\n )\n );\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath]);\n\n const trashMessage = useCallback(async (uid: number) => {\n try {\n await getMailClient().delete(`/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${uid}`);\n setMessages(prev => prev.filter(m => m.uid !== uid));\n if (selectedUid === uid) {\n setDetail(null);\n setSelectedUid(null);\n }\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath, selectedUid]);\n\n function openCompose(initial?: DraftState) {\n setComposeDraft(initial ?? { to: '', cc: '', subject: '', body: '' });\n setComposeOpen(true);\n }\n\n if (serverReachable === false) {\n return (\n <EmptyState\n title=\"Mail server unreachable\"\n body=\"The bridge server is not responding. Start it with `npm run server:dev`, then retry.\"\n action={<button onClick={() => window.location.reload()} className=\"px-4 py-2 bg-gray-900 text-white rounded text-sm\">Retry</button>}\n />\n );\n }\n\n if (!isConnected) {\n return (\n <EmptyState\n title=\"Connect your mail account\"\n body=\"Open the Mail & Calendar button in the taskbar to connect via IMAP/SMTP/CalDAV.\"\n />\n );\n }\n\n return (\n <div className=\"flex h-full text-sm\">\n {/* Sidebar */}\n <aside className=\"w-56 shrink-0 border-r border-gray-200 overflow-y-auto bg-gray-50/60\">\n <div className=\"p-3\">\n <button\n onClick={() => openCompose()}\n className=\"w-full bg-gray-900 text-white rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-800\"\n >\n Compose\n </button>\n </div>\n <div className=\"px-2\">\n {SMART_VIEWS.map(view => {\n const folder = view.key === '__inbox__'\n ? folders.find(f => f.specialUse === 'inbox')\n : view.key === '__sent__'\n ? folders.find(f => f.specialUse === 'sent')\n : view.key === '__drafts__'\n ? folders.find(f => f.specialUse === 'drafts')\n : view.key === '__trash__'\n ? folders.find(f => f.specialUse === 'trash')\n : view.key === '__junk__'\n ? folders.find(f => f.specialUse === 'junk')\n : null;\n const unread = folder?.unreadCount ?? 0;\n const active = selectedKey === view.key;\n return (\n <button\n key={view.key}\n onClick={() => setSelectedKey(view.key)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n >\n <span className=\"w-5 text-center text-base leading-none\">{view.icon}</span>\n <span className=\"flex-1 truncate\">{view.label}</span>\n {unread > 0 && <span className=\"text-[10px] bg-blue-500 text-white rounded-full px-1.5\">{unread}</span>}\n </button>\n );\n })}\n </div>\n <div className=\"px-3 mt-4 mb-1 text-[10px] uppercase tracking-wider text-gray-500\">Folders</div>\n <div className=\"px-2 pb-3\">\n {folders\n .filter(f => !f.specialUse || f.specialUse === 'archive' || f.specialUse === 'flagged')\n .filter(f => f.path.toUpperCase() !== 'INBOX')\n .map(f => {\n const active = selectedKey === f.path;\n return (\n <button\n key={f.path}\n onClick={() => setSelectedKey(f.path)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n title={f.path}\n >\n <span className=\"w-5 text-center text-base leading-none\">📁</span>\n <span className=\"flex-1 truncate\">{f.name}</span>\n {f.unreadCount > 0 && <span className=\"text-[10px] bg-gray-300 text-gray-800 rounded-full px-1.5\">{f.unreadCount}</span>}\n </button>\n );\n })}\n </div>\n </aside>\n\n {/* Message list */}\n <section className=\"w-80 shrink-0 border-r border-gray-200 flex flex-col\">\n <header className=\"px-3 py-2 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold\">\n {SMART_VIEWS.find(v => v.key === selectedKey)?.label || selectedKey}\n </h2>\n <button\n onClick={() => { refreshList(); refreshFolders(); }}\n className=\"text-xs text-gray-600 hover:text-gray-900\"\n disabled={loadingList || loadingFolders}\n >\n {loadingList || loadingFolders ? '…' : 'Refresh'}\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {loadingList && messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">Loading…</div>\n ) : messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">No messages</div>\n ) : (\n messages.map(msg => (\n <MessageRow\n key={msg.uid}\n msg={msg}\n active={selectedUid === msg.uid}\n onOpen={() => openMessage(msg)}\n onStar={() => toggleStar(msg)}\n />\n ))\n )}\n </div>\n </section>\n\n {/* Detail */}\n <section className=\"flex-1 overflow-y-auto\">\n {detail ? (\n <MessageDetailView\n detail={detail}\n folderPath={selectedFolderPath}\n loading={loadingDetail}\n onReply={() => openCompose({\n to: detail.from.address,\n cc: '',\n subject: detail.subject.startsWith('Re:') ? detail.subject : `Re: ${detail.subject}`,\n body: '',\n inReplyTo: detail.threadId,\n references: detail.references,\n })}\n onTrash={() => trashMessage(detail.uid)}\n />\n ) : (\n <div className=\"h-full grid place-items-center text-xs text-gray-400\">\n Select a message\n </div>\n )}\n </section>\n\n {composeOpen && composeDraft && (\n <ComposeModal\n open={composeOpen}\n initial={composeDraft}\n onClose={() => setComposeOpen(false)}\n onSent={() => {\n setComposeOpen(false);\n toast.success('Message sent');\n refreshList();\n }}\n />\n )}\n\n {serverError && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-red-50 border border-red-200 text-red-800 px-3 py-1 text-xs rounded\">\n {serverError}\n </div>\n )}\n </div>\n );\n}\n\nfunction MessageRow({ msg, active, onOpen, onStar }: {\n msg: MessageListItem;\n active: boolean;\n onOpen: () => void;\n onStar: () => void;\n}) {\n const unread = !msg.flags.includes('\\\\Seen');\n const starred = msg.flags.includes('\\\\Flagged');\n return (\n <div\n onClick={onOpen}\n className={`px-3 py-2 border-b border-gray-100 cursor-pointer ${active ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <button\n onClick={(e) => { e.stopPropagation(); onStar(); }}\n className={`text-xs ${starred ? 'text-yellow-500' : 'text-gray-300 hover:text-gray-500'}`}\n title={starred ? 'Unstar' : 'Star'}\n >\n ★\n </button>\n <p className={`text-xs flex-1 truncate ${unread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>\n {msg.from.name || msg.from.address}\n </p>\n <span className=\"text-[10px] text-gray-400 shrink-0\">{formatDate(msg.date)}</span>\n </div>\n <p className={`text-xs truncate ${unread ? 'font-medium text-gray-900' : 'text-gray-600'}`}>\n {msg.subject || '(no subject)'}\n </p>\n {msg.hasAttachments && <span className=\"text-[10px] text-gray-400\">📎 attachment</span>}\n </div>\n );\n}\n\nfunction MessageDetailView({\n detail,\n folderPath,\n loading,\n onReply,\n onTrash,\n}: {\n detail: MessageDetail;\n folderPath: string;\n loading: boolean;\n onReply: () => void;\n onTrash: () => void;\n}) {\n const baseUrl = `/api/mail/messages/${encodeURIComponent(folderPath)}/${detail.uid}/attachments`;\n return (\n <div>\n <header className=\"px-6 py-4 border-b border-gray-200\">\n <h1 className=\"text-lg font-semibold mb-2\">{detail.subject || '(no subject)'}</h1>\n <div className=\"flex items-center justify-between text-xs text-gray-600\">\n <div>\n <div><strong>{detail.from.name || detail.from.address}</strong> <{detail.from.address}></div>\n <div>to {detail.to.map(t => t.address).join(', ')}</div>\n {detail.cc.length > 0 && <div>cc {detail.cc.map(t => t.address).join(', ')}</div>}\n <div className=\"text-gray-400 mt-1\">{formatDateTime(detail.date)}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={onReply} className=\"px-3 py-1 text-xs border border-gray-300 rounded hover:bg-gray-50\">Reply</button>\n <button onClick={onTrash} className=\"px-3 py-1 text-xs border border-red-200 text-red-700 rounded hover:bg-red-50\">Trash</button>\n </div>\n </div>\n </header>\n <article className=\"px-6 py-4\">\n {loading ? (\n <div className=\"text-xs text-gray-500\">Loading…</div>\n ) : detail.html ? (\n <div className=\"prose prose-sm max-w-none\" dangerouslySetInnerHTML={{ __html: detail.html }} />\n ) : (\n <pre className=\"whitespace-pre-wrap text-sm font-sans\">{detail.text || '(empty)'}</pre>\n )}\n </article>\n {detail.attachments.length > 0 && (\n <section className=\"px-6 pb-6\">\n <h3 className=\"text-xs font-semibold text-gray-700 mb-2\">Attachments</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {detail.attachments.map(att => (\n <a\n key={att.partId}\n href={`${getMailClient().defaults.baseURL}${baseUrl}/${encodeURIComponent(att.partId)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-2 border border-gray-200 rounded px-3 py-2 text-xs hover:bg-gray-50\"\n >\n <span>📎</span>\n <span className=\"flex-1 truncate\">{att.filename}</span>\n <span className=\"text-gray-400\">{(att.size / 1024).toFixed(1)}KB</span>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n );\n}\n\ninterface DraftState {\n to: string;\n cc: string;\n subject: string;\n body: string;\n inReplyTo?: string;\n references?: string[];\n}\n\nfunction ComposeModal({\n open,\n initial,\n onClose,\n onSent,\n}: {\n open: boolean;\n initial: DraftState;\n onClose: () => void;\n onSent: () => void;\n}) {\n const [draft, setDraft] = useState<DraftState>(initial);\n const [sending, setSending] = useState(false);\n\n async function send() {\n setSending(true);\n try {\n const toList = draft.to.split(',').map(s => s.trim()).filter(Boolean);\n const ccList = draft.cc.split(',').map(s => s.trim()).filter(Boolean);\n if (toList.length === 0) {\n toast.error('At least one recipient required');\n return;\n }\n await getMailClient().post('/api/mail/send', {\n to: toList,\n cc: ccList.length ? ccList : undefined,\n subject: draft.subject,\n text: draft.body,\n inReplyTo: draft.inReplyTo,\n references: draft.references,\n saveToSent: true,\n });\n onSent();\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setSending(false);\n }\n }\n\n return (\n <Modal open={open} onClose={onClose} title=\"New message\" size=\"lg\">\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n placeholder=\"To\"\n value={draft.to}\n onChange={e => setDraft({ ...draft, to: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Cc (optional)\"\n value={draft.cc}\n onChange={e => setDraft({ ...draft, cc: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Subject\"\n value={draft.subject}\n onChange={e => setDraft({ ...draft, subject: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <textarea\n rows={12}\n placeholder=\"Write your message…\"\n value={draft.body}\n onChange={e => setDraft({ ...draft, body: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm font-mono\"\n />\n </div>\n <ModalActions>\n <button\n onClick={send}\n disabled={sending}\n className=\"bg-gray-900 text-white rounded-lg px-5 py-2 text-sm font-medium hover:bg-gray-800 disabled:opacity-50\"\n >\n {sending ? 'Sending…' : 'Send'}\n </button>\n </ModalActions>\n </Modal>\n );\n}\n\nfunction EmptyState({ title, body, action }: { title: string; body: string; action?: React.ReactNode }) {\n return (\n <div className=\"h-full grid place-items-center p-8 text-center\">\n <div className=\"max-w-sm\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">{title}</h2>\n <p className=\"text-sm text-gray-600\">{body}</p>\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n </div>\n );\n}\n\nfunction extractError(err: unknown): string {\n const response = (err as { response?: { data?: { error?: string } } }).response;\n if (response?.data?.error) return response.data.error;\n if (err instanceof Error) return err.message;\n return 'Unknown error';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/Email.tsx"],"names":[],"mappings":";;;;;;;;;;AAiDA,IAAM,WAAA,GAAmE;AAAA,EACvE,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,MAAM,WAAA,EAAK;AAAA,EAC/C,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,SAAA,EAAW,MAAM,QAAA,EAAI;AAAA,EAClD,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA,EAAI;AAAA,EAChD,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,MAAM,WAAA,EAAK;AAAA,EACjD,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,MAAM,WAAA,EAAK;AAAA,EAC7C,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,MAAM,WAAA,EAAK;AAAA,EAC/C,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,MAAM,QAAA;AAC1C,CAAA;AAEA,SAAS,gBAAA,CAAiB,KAAa,OAAA,EAA2B;AAChE,EAAA,IAAI,GAAA,KAAQ,WAAA,EAAa,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,OAAO,CAAA,EAAG,IAAA,IAAQ,OAAA;AACrF,EAAA,IAAI,GAAA,KAAQ,UAAA,EAAY,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,MAAM,CAAA,EAAG,IAAA,IAAQ,MAAA;AACnF,EAAA,IAAI,GAAA,KAAQ,YAAA,EAAc,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,QAAQ,CAAA,EAAG,IAAA,IAAQ,QAAA;AACvF,EAAA,IAAI,GAAA,KAAQ,WAAA,EAAa,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,OAAO,CAAA,EAAG,IAAA,IAAQ,OAAA;AACrF,EAAA,IAAI,GAAA,KAAQ,UAAA,EAAY,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,MAAM,CAAA,EAAG,IAAA,IAAQ,MAAA;AACnF,EAAA,OAAO,GAAA;AACT;AAEe,SAAR,KAAA,GAAyB;AAC9B,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAgB,GAAI,WAAA,EAAY;AAErD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAiB,WAAW,CAAA;AAClE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAA4B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAA+B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAA4B,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,MAAM,gBAAA,CAAiB,WAAA,EAAa,OAAO,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEvG,EAAA,MAAM,cAAA,GAAiB,YAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc,CAAE,IAA2B,mBAAmB,CAAA;AAChF,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc,CAAE,IAAqC,oBAAA,EAAsB;AAAA,QAC3F,QAAQ,EAAE,MAAA,EAAQ,oBAAoB,IAAA,EAAM,CAAA,EAAG,UAAU,EAAA;AAAG,OAC7D,CAAA;AACD,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,EAAY;AACZ,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,aAAA,GAAgB,OAAsB,IAAI,CAAA;AAChD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,eAAe,IAAA,GAAO;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc,CAAE,IAAwC,yBAAyB,CAAA;AACnG,QAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAA,KAAe,OAAO,GAAG,IAAA,IAAQ,OAAA;AACzE,QAAA,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,WAAW,KAAK,CAAC,CAAA;AACrD,QAAA,UAAA;AAAA,UAAW,UACT,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,CAAE,aAAY,CAAE;AAAA,SACjF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AACL,IAAA,aAAA,CAAc,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAA,EAAM,GAAM,CAAA;AACvD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,aAAA,CAAc,OAAA,EAAS,MAAA,CAAO,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAO,IAAA,KAA0B;AAC/D,IAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AACvB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc,CAAE,GAAA;AAAA,QAChC,sBAAsB,kBAAA,CAAmB,kBAAkB,CAAC,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA;AAAA,OAC1E;AACA,MAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAClB,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,QAAA,MAAM,eAAc,CAAE,IAAA;AAAA,UACpB,sBAAsB,kBAAA,CAAmB,kBAAkB,CAAC,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,UACxE,EAAE,GAAA,EAAK,CAAC,QAAQ,CAAA;AAAE,SACpB;AACA,QAAA,WAAA;AAAA,UAAY,UACV,IAAA,CAAK,GAAA,CAAI,OAAM,CAAA,CAAE,GAAA,KAAQ,KAAK,GAAA,GAAM,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAC,GAAG,CAAA,CAAE,OAAO,QAAQ,CAAA,KAAM,CAAE;AAAA,SAClF;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC/B,CAAA,SAAE;AACA,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAO,IAAA,KAA0B;AAC9D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,eAAc,CAAE,IAAA;AAAA,QACpB,sBAAsB,kBAAA,CAAmB,kBAAkB,CAAC,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,QACxE,SAAA,GAAY,EAAE,MAAA,EAAQ,CAAC,WAAW,CAAA,EAAE,GAAI,EAAE,GAAA,EAAK,CAAC,WAAW,CAAA;AAAE,OAC/D;AACA,MAAA,WAAA;AAAA,QAAY,UACV,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACP,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAA,GACX;AAAA,YACE,GAAG,CAAA;AAAA,YACH,KAAA,EAAO,SAAA,GAAY,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,WAAW,CAAA,GAAI,CAAC,GAAG,CAAA,CAAE,OAAO,WAAW;AAAA,WACtF,GACA;AAAA;AACN,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAO,GAAA,KAAgB;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,CAAA,mBAAA,EAAsB,mBAAmB,kBAAkB,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAClG,MAAA,WAAA,CAAY,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAC,CAAA;AACnD,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAEpC,EAAA,SAAS,YAAY,OAAA,EAAsB;AACzC,IAAA,eAAA,CAAgB,OAAA,IAAW,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,OAAA,EAAS,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,CAAA;AACpE,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,oBAAoB,KAAA,EAAO;AAC7B,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,yBAAA;AAAA,QACN,IAAA,EAAK,sFAAA;AAAA,QACL,MAAA,kBAAQ,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,EAAO,EAAG,SAAA,EAAU,kDAAA,EAAmD,QAAA,EAAA,OAAA,EAAK;AAAA;AAAA,KAC7H;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,2BAAA;AAAA,QACN,IAAA,EAAK;AAAA;AAAA,KACP;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,sEAAA,EACf,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,KAAA,EACb,QAAA,kBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,WAAA,EAAY;AAAA,UAC3B,SAAA,EAAU,0FAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED,EACF,CAAA;AAAA,0BACC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACZ,QAAA,EAAA,WAAA,CAAY,IAAI,CAAA,IAAA,KAAQ;AACvB,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,KAAQ,WAAA,GACxB,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,KAAe,OAAO,CAAA,GAC1C,KAAK,GAAA,KAAQ,UAAA,GACb,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,MAAM,CAAA,GACzC,IAAA,CAAK,GAAA,KAAQ,YAAA,GACb,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,QAAQ,CAAA,GAC3C,KAAK,GAAA,KAAQ,WAAA,GACb,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,OAAO,CAAA,GAC1C,IAAA,CAAK,GAAA,KAAQ,UAAA,GACb,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,KAAe,MAAM,CAAA,GACzC,IAAA;AACJ,QAAA,MAAM,MAAA,GAAS,QAAQ,WAAA,IAAe,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,gBAAgB,IAAA,CAAK,GAAA;AACpC,QAAA,uBACE,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAAA,YACtC,SAAA,EAAW,CAAA,qEAAA,EAAwE,MAAA,GAAS,yBAAA,GAA4B,mBAAmB,CAAA,CAAA;AAAA,YAE3I,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,8BACpE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,eAAK,KAAA,EAAM,CAAA;AAAA,cAC7C,SAAS,CAAA,oBAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAA0D,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA,WAAA;AAAA,UAN3F,IAAA,CAAK;AAAA,SAOZ;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EAAoE,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBAC1F,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,OAAA,CACE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAA,KAAe,SAAA,IAAa,EAAE,UAAA,KAAe,SAAS,CAAA,CACrF,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,OAAO,CAAA,CAC5C,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,QAAA,MAAM,MAAA,GAAS,gBAAgB,CAAA,CAAE,IAAA;AACjC,QAAA,uBACE,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA;AAAA,YACpC,SAAA,EAAW,CAAA,qEAAA,EAAwE,MAAA,GAAS,yBAAA,GAA4B,mBAAmB,CAAA,CAAA;AAAA,YAC3I,OAAO,CAAA,CAAE,IAAA;AAAA,YAET,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,8BAC3D,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,YAAE,IAAA,EAAK,CAAA;AAAA,cACzC,CAAA,CAAE,cAAc,CAAA,oBAAK,GAAA,CAAC,UAAK,SAAA,EAAU,2DAAA,EAA6D,YAAE,WAAA,EAAY;AAAA;AAAA,WAAA;AAAA,UAP5G,CAAA,CAAE;AAAA,SAQT;AAAA,MAEJ,CAAC,CAAA,EACL;AAAA,KAAA,EACF,CAAA;AAAA,oBAGA,IAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,sDAAA,EACjB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,sEAAA,EAChB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,KAAQ,WAAW,CAAA,EAAG,KAAA,IAAS,WAAA,EAC1D,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AAAE,cAAA,WAAA,EAAY;AAAG,cAAA,cAAA,EAAe;AAAA,YAAG,CAAA;AAAA,YAClD,SAAA,EAAU,2CAAA;AAAA,YACV,UAAU,WAAA,IAAe,cAAA;AAAA,YAExB,QAAA,EAAA,WAAA,IAAe,iBAAiB,QAAA,GAAM;AAAA;AAAA;AACzC,OAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,WAAA,IAAe,SAAS,MAAA,KAAW,CAAA,mBAClC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAwC,2BAAQ,CAAA,GAC7D,QAAA,CAAS,MAAA,KAAW,CAAA,mBACtB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,aAAA,EAAW,CAAA,GAElE,QAAA,CAAS,GAAA,CAAI,CAAA,GAAA,qBACX,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,MAAA,EAAQ,gBAAgB,GAAA,CAAI,GAAA;AAAA,UAC5B,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,UAC7B,MAAA,EAAQ,MAAM,UAAA,CAAW,GAAG;AAAA,SAAA;AAAA,QAJvB,GAAA,CAAI;AAAA,OAMZ,CAAA,EAEL;AAAA,KAAA,EACF,CAAA;AAAA,oBAGA,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,wBAAA,EAChB,QAAA,EAAA,MAAA,mBACC,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,UAAA,EAAY,kBAAA;AAAA,QACZ,OAAA,EAAS,aAAA;AAAA,QACT,OAAA,EAAS,MAAM,WAAA,CAAY;AAAA,UACzB,EAAA,EAAI,OAAO,IAAA,CAAK,OAAA;AAAA,UAChB,EAAA,EAAI,EAAA;AAAA,UACJ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,KAAK,IAAI,MAAA,CAAO,OAAA,GAAU,CAAA,IAAA,EAAO,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,UAClF,IAAA,EAAM,EAAA;AAAA,UACN,WAAW,MAAA,CAAO,QAAA;AAAA,UAClB,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAAA,QACD,OAAA,EAAS,MAAM,YAAA,CAAa,MAAA,CAAO,GAAG;AAAA;AAAA,wBAGxC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAAuD,8BAEtE,CAAA,EAEJ,CAAA;AAAA,IAEC,eAAe,YAAA,oBACd,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,QACnC,QAAQ,MAAM;AACZ,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,aAAA,CAAM,QAAQ,cAAc,CAAA;AAC5B,UAAA,WAAA,EAAY;AAAA,QACd;AAAA;AAAA,KACF;AAAA,IAGD,WAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sHACZ,QAAA,EAAA,WAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,WAAW,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,QAAO,EAK/C;AACD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,KAAA,CAAM,SAAS,QAAQ,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA;AAC9C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,CAAA,kDAAA,EAAqD,MAAA,GAAS,YAAA,GAAe,kBAAkB,CAAA,CAAA;AAAA,MAE1G,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,gBAAA,MAAA,EAAO;AAAA,cAAG,CAAA;AAAA,cACjD,SAAA,EAAW,CAAA,QAAA,EAAW,OAAA,GAAU,iBAAA,GAAoB,mCAAmC,CAAA,CAAA;AAAA,cACvF,KAAA,EAAO,UAAU,QAAA,GAAW,MAAA;AAAA,cAC7B,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,wBAAA,EAA2B,MAAA,GAAS,6BAAA,GAAgC,eAAe,CAAA,CAAA,EAC9F,QAAA,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,IAAQ,GAAA,CAAI,KAAK,OAAA,EAC7B,CAAA;AAAA,8BACC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAsC,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,SAAA,EAC7E,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,iBAAA,EAAoB,MAAA,GAAS,8BAA8B,eAAe,CAAA,CAAA,EACrF,QAAA,EAAA,GAAA,CAAI,OAAA,IAAW,cAAA,EAClB,CAAA;AAAA,QACC,IAAI,cAAA,oBAAkB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA4B,QAAA,EAAA,sBAAA,EAAa;AAAA;AAAA;AAAA,GAClF;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,UAAU,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,YAAA,CAAA;AAClF,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,oCAAA,EAChB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,MAAA,CAAO,WAAW,cAAA,EAAe,CAAA;AAAA,sBAC7E,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YAAQ,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,KAAK,OAAA,EAAQ,CAAA;AAAA,YAAS,IAAA;AAAA,YAAM,OAAO,IAAA,CAAK,OAAA;AAAA,YAAQ;AAAA,WAAA,EAAI,CAAA;AAAA,+BAC5F,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAI,MAAA,CAAO,GAAG,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,KAAK,IAAI;AAAA,WAAA,EAAE,CAAA;AAAA,UACjD,MAAA,CAAO,EAAA,CAAG,MAAA,GAAS,CAAA,yBAAM,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAI,MAAA,CAAO,GAAG,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,KAAK,IAAI;AAAA,WAAA,EAAE,CAAA;AAAA,8BAC1E,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAsB,QAAA,EAAA,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,SAAA,EACnE,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAU,qEAAoE,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,8BAC5G,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAU,gFAA+E,QAAA,EAAA,OAAA,EAAK;AAAA,SAAA,EAC1H;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EAChB,QAAA,EAAA,OAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,eAAA,EAAQ,CAAA,GAC7C,MAAA,CAAO,uBACT,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAK,EAAG,CAAA,mBAE7F,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,MAAA,CAAO,IAAA,IAAQ,WAAU,CAAA,EAErF,CAAA;AAAA,IACC,OAAO,WAAA,CAAY,MAAA,GAAS,qBAC3B,IAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,WAAA,EACjB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,0BACnE,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,GAAA,qBACtB,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAM,CAAA,EAAG,aAAA,EAAc,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAAA,UACrF,MAAA,EAAO,QAAA;AAAA,UACP,GAAA,EAAI,YAAA;AAAA,UACJ,SAAA,EAAU,2FAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,4BACR,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,cAAI,QAAA,EAAS,CAAA;AAAA,4BAChD,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAkB,QAAA,EAAA;AAAA,cAAA,CAAA,GAAA,CAAI,IAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,cAAE;AAAA,aAAA,EAAE;AAAA;AAAA,SAAA;AAAA,QAR3D,GAAA,CAAI;AAAA,OAUZ,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAWA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAqB,OAAO,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,eAAe,IAAA,GAAO;AACpB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACpE,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACpE,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,aAAA,CAAM,MAAM,iCAAiC,CAAA;AAC7C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,aAAA,EAAc,CAAE,IAAA,CAAK,gBAAA,EAAkB;AAAA,QAC3C,EAAA,EAAI,MAAA;AAAA,QACJ,EAAA,EAAI,MAAA,CAAO,MAAA,GAAS,MAAA,GAAS,KAAA,CAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,MAAA,EAAO;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC/B,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,4BACG,KAAA,EAAA,EAAM,IAAA,EAAY,SAAkB,KAAA,EAAM,aAAA,EAAc,MAAK,IAAA,EAC5D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,EAAE,GAAG,OAAO,EAAA,EAAI,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UACxD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,eAAA;AAAA,UACZ,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,EAAE,GAAG,OAAO,EAAA,EAAI,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UACxD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,SAAA;AAAA,UACZ,OAAO,KAAA,CAAM,OAAA;AAAA,UACb,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,EAAE,GAAG,OAAO,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UAC7D,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,EAAA;AAAA,UACN,WAAA,EAAY,0BAAA;AAAA,UACZ,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,EAAE,GAAG,OAAO,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UAC1D,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,wBACC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAU,uGAAA;AAAA,QAET,oBAAU,eAAA,GAAa;AAAA;AAAA,KAC1B,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,QAAO,EAA8D;AACtG,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,kDACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAChE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAC1C,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EAC3C,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,MAAM,WAAY,GAAA,CAAqD,QAAA;AACvE,EAAA,IAAI,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,OAAO,SAAS,IAAA,CAAK,KAAA;AAChD,EAAA,IAAI,GAAA,YAAe,KAAA,EAAO,OAAO,GAAA,CAAI,OAAA;AACrC,EAAA,OAAO,eAAA;AACT","file":"Email-GTGL7CW5.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useMailAuth from '../hooks/useMailAuth';\nimport { setEmailUnreadCount } from '../hooks/useEmailUnread';\nimport { getMailClient } from '../api/mailClient';\nimport toast from '../shell/toast';\nimport Modal, { ModalActions } from '../shell/Modal';\nimport { formatDate, formatDateTime } from '../utils/date';\n\ninterface Folder {\n path: string;\n name: string;\n delimiter: string;\n specialUse: 'inbox' | 'sent' | 'drafts' | 'trash' | 'junk' | 'archive' | 'flagged' | null;\n subscribed: boolean;\n unreadCount: number;\n totalCount: number;\n}\n\ninterface Address { name: string; address: string }\n\ninterface MessageListItem {\n uid: number;\n threadId: string;\n from: Address;\n to: Address[];\n subject: string;\n snippet: string;\n date: string;\n flags: string[];\n hasAttachments: boolean;\n inReplyTo: string | null;\n references: string[];\n}\n\ninterface AttachmentInfo {\n partId: string;\n filename: string;\n contentType: string;\n size: number;\n contentId: string | null;\n}\n\ninterface MessageDetail extends Omit<MessageListItem, 'snippet' | 'hasAttachments'> {\n cc: Address[];\n text: string | null;\n html: string | null;\n attachments: AttachmentInfo[];\n}\n\nconst SMART_VIEWS: Array<{ key: string; label: string; icon: string }> = [\n { key: '__inbox__', label: 'Inbox', icon: '📥' },\n { key: '__starred__', label: 'Starred', icon: '⭐' },\n { key: '__unread__', label: 'Unread', icon: '●' },\n { key: '__drafts__', label: 'Drafts', icon: '📝' },\n { key: '__sent__', label: 'Sent', icon: '📤' },\n { key: '__trash__', label: 'Trash', icon: '🗑' },\n { key: '__junk__', label: 'Spam', icon: '⚠' },\n];\n\nfunction resolveSmartView(key: string, folders: Folder[]): string {\n if (key === '__inbox__') return folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n if (key === '__sent__') return folders.find(f => f.specialUse === 'sent')?.path || 'Sent';\n if (key === '__drafts__') return folders.find(f => f.specialUse === 'drafts')?.path || 'Drafts';\n if (key === '__trash__') return folders.find(f => f.specialUse === 'trash')?.path || 'Trash';\n if (key === '__junk__') return folders.find(f => f.specialUse === 'junk')?.path || 'Junk';\n return key; // __starred__, __unread__ → handled server-side\n}\n\nexport default function Email() {\n const { isConnected, serverReachable } = useMailAuth();\n\n const [folders, setFolders] = useState<Folder[]>([]);\n const [selectedKey, setSelectedKey] = useState<string>('__inbox__');\n const [messages, setMessages] = useState<MessageListItem[]>([]);\n const [selectedUid, setSelectedUid] = useState<number | null>(null);\n const [detail, setDetail] = useState<MessageDetail | null>(null);\n const [loadingFolders, setLoadingFolders] = useState(false);\n const [loadingList, setLoadingList] = useState(false);\n const [loadingDetail, setLoadingDetail] = useState(false);\n const [composeOpen, setComposeOpen] = useState(false);\n const [composeDraft, setComposeDraft] = useState<DraftState | null>(null);\n const [serverError, setServerError] = useState<string | null>(null);\n\n const selectedFolderPath = useMemo(() => resolveSmartView(selectedKey, folders), [selectedKey, folders]);\n\n const refreshFolders = useCallback(async () => {\n if (!isConnected) return;\n setLoadingFolders(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ folders: Folder[] }>('/api/mail/folders');\n setFolders(res.data.folders);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingFolders(false);\n }\n }, [isConnected]);\n\n const refreshList = useCallback(async () => {\n if (!isConnected) return;\n setLoadingList(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ messages: MessageListItem[] }>('/api/mail/messages', {\n params: { folder: selectedFolderPath, page: 0, pageSize: 50 },\n });\n setMessages(res.data.messages);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingList(false);\n }\n }, [isConnected, selectedFolderPath]);\n\n useEffect(() => {\n refreshFolders();\n }, [refreshFolders]);\n\n useEffect(() => {\n refreshList();\n setDetail(null);\n setSelectedUid(null);\n }, [refreshList]);\n\n // Poll unread counts every 30s and push to the badge.\n const unreadPollRef = useRef<number | null>(null);\n useEffect(() => {\n if (!isConnected) return;\n async function tick() {\n try {\n const res = await getMailClient().get<{ counts: Record<string, number> }>('/api/mail/unread-counts');\n const inboxFolder = folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n setEmailUnreadCount(res.data.counts[inboxFolder] || 0);\n setFolders(prev =>\n prev.map(f => ({ ...f, unreadCount: res.data.counts[f.path] ?? f.unreadCount }))\n );\n } catch {\n /* ignore polling errors */\n }\n }\n tick();\n unreadPollRef.current = window.setInterval(tick, 30_000) as unknown as number;\n return () => {\n if (unreadPollRef.current) window.clearInterval(unreadPollRef.current);\n };\n }, [isConnected, folders]);\n\n const openMessage = useCallback(async (item: MessageListItem) => {\n setSelectedUid(item.uid);\n setLoadingDetail(true);\n try {\n const res = await getMailClient().get<MessageDetail>(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}`\n );\n setDetail(res.data);\n if (!item.flags.includes('\\\\Seen')) {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n { add: ['\\\\Seen'] }\n );\n setMessages(prev =>\n prev.map(m => (m.uid === item.uid ? { ...m, flags: [...m.flags, '\\\\Seen'] } : m))\n );\n }\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setLoadingDetail(false);\n }\n }, [selectedFolderPath]);\n\n const toggleStar = useCallback(async (item: MessageListItem) => {\n const isFlagged = item.flags.includes('\\\\Flagged');\n try {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n isFlagged ? { remove: ['\\\\Flagged'] } : { add: ['\\\\Flagged'] }\n );\n setMessages(prev =>\n prev.map(m =>\n m.uid === item.uid\n ? {\n ...m,\n flags: isFlagged ? m.flags.filter(f => f !== '\\\\Flagged') : [...m.flags, '\\\\Flagged'],\n }\n : m\n )\n );\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath]);\n\n const trashMessage = useCallback(async (uid: number) => {\n try {\n await getMailClient().delete(`/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${uid}`);\n setMessages(prev => prev.filter(m => m.uid !== uid));\n if (selectedUid === uid) {\n setDetail(null);\n setSelectedUid(null);\n }\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath, selectedUid]);\n\n function openCompose(initial?: DraftState) {\n setComposeDraft(initial ?? { to: '', cc: '', subject: '', body: '' });\n setComposeOpen(true);\n }\n\n if (serverReachable === false) {\n return (\n <EmptyState\n title=\"Mail server unreachable\"\n body=\"The bridge server is not responding. Start it with `npm run server:dev`, then retry.\"\n action={<button onClick={() => window.location.reload()} className=\"px-4 py-2 bg-gray-900 text-white rounded text-sm\">Retry</button>}\n />\n );\n }\n\n if (!isConnected) {\n return (\n <EmptyState\n title=\"Connect your mail account\"\n body=\"Open the Mail & Calendar button in the taskbar to connect via IMAP/SMTP/CalDAV.\"\n />\n );\n }\n\n return (\n <div className=\"flex h-full text-sm\">\n {/* Sidebar */}\n <aside className=\"w-56 shrink-0 border-r border-gray-200 overflow-y-auto bg-gray-50/60\">\n <div className=\"p-3\">\n <button\n onClick={() => openCompose()}\n className=\"w-full bg-gray-900 text-white rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-800\"\n >\n Compose\n </button>\n </div>\n <div className=\"px-2\">\n {SMART_VIEWS.map(view => {\n const folder = view.key === '__inbox__'\n ? folders.find(f => f.specialUse === 'inbox')\n : view.key === '__sent__'\n ? folders.find(f => f.specialUse === 'sent')\n : view.key === '__drafts__'\n ? folders.find(f => f.specialUse === 'drafts')\n : view.key === '__trash__'\n ? folders.find(f => f.specialUse === 'trash')\n : view.key === '__junk__'\n ? folders.find(f => f.specialUse === 'junk')\n : null;\n const unread = folder?.unreadCount ?? 0;\n const active = selectedKey === view.key;\n return (\n <button\n key={view.key}\n onClick={() => setSelectedKey(view.key)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n >\n <span className=\"w-5 text-center text-base leading-none\">{view.icon}</span>\n <span className=\"flex-1 truncate\">{view.label}</span>\n {unread > 0 && <span className=\"text-[10px] bg-blue-500 text-white rounded-full px-1.5\">{unread}</span>}\n </button>\n );\n })}\n </div>\n <div className=\"px-3 mt-4 mb-1 text-[10px] uppercase tracking-wider text-gray-500\">Folders</div>\n <div className=\"px-2 pb-3\">\n {folders\n .filter(f => !f.specialUse || f.specialUse === 'archive' || f.specialUse === 'flagged')\n .filter(f => f.path.toUpperCase() !== 'INBOX')\n .map(f => {\n const active = selectedKey === f.path;\n return (\n <button\n key={f.path}\n onClick={() => setSelectedKey(f.path)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n title={f.path}\n >\n <span className=\"w-5 text-center text-base leading-none\">📁</span>\n <span className=\"flex-1 truncate\">{f.name}</span>\n {f.unreadCount > 0 && <span className=\"text-[10px] bg-gray-300 text-gray-800 rounded-full px-1.5\">{f.unreadCount}</span>}\n </button>\n );\n })}\n </div>\n </aside>\n\n {/* Message list */}\n <section className=\"w-80 shrink-0 border-r border-gray-200 flex flex-col\">\n <header className=\"px-3 py-2 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold\">\n {SMART_VIEWS.find(v => v.key === selectedKey)?.label || selectedKey}\n </h2>\n <button\n onClick={() => { refreshList(); refreshFolders(); }}\n className=\"text-xs text-gray-600 hover:text-gray-900\"\n disabled={loadingList || loadingFolders}\n >\n {loadingList || loadingFolders ? '…' : 'Refresh'}\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {loadingList && messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">Loading…</div>\n ) : messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">No messages</div>\n ) : (\n messages.map(msg => (\n <MessageRow\n key={msg.uid}\n msg={msg}\n active={selectedUid === msg.uid}\n onOpen={() => openMessage(msg)}\n onStar={() => toggleStar(msg)}\n />\n ))\n )}\n </div>\n </section>\n\n {/* Detail */}\n <section className=\"flex-1 overflow-y-auto\">\n {detail ? (\n <MessageDetailView\n detail={detail}\n folderPath={selectedFolderPath}\n loading={loadingDetail}\n onReply={() => openCompose({\n to: detail.from.address,\n cc: '',\n subject: detail.subject.startsWith('Re:') ? detail.subject : `Re: ${detail.subject}`,\n body: '',\n inReplyTo: detail.threadId,\n references: detail.references,\n })}\n onTrash={() => trashMessage(detail.uid)}\n />\n ) : (\n <div className=\"h-full grid place-items-center text-xs text-gray-400\">\n Select a message\n </div>\n )}\n </section>\n\n {composeOpen && composeDraft && (\n <ComposeModal\n open={composeOpen}\n initial={composeDraft}\n onClose={() => setComposeOpen(false)}\n onSent={() => {\n setComposeOpen(false);\n toast.success('Message sent');\n refreshList();\n }}\n />\n )}\n\n {serverError && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-red-50 border border-red-200 text-red-800 px-3 py-1 text-xs rounded\">\n {serverError}\n </div>\n )}\n </div>\n );\n}\n\nfunction MessageRow({ msg, active, onOpen, onStar }: {\n msg: MessageListItem;\n active: boolean;\n onOpen: () => void;\n onStar: () => void;\n}) {\n const unread = !msg.flags.includes('\\\\Seen');\n const starred = msg.flags.includes('\\\\Flagged');\n return (\n <div\n onClick={onOpen}\n className={`px-3 py-2 border-b border-gray-100 cursor-pointer ${active ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <button\n onClick={(e) => { e.stopPropagation(); onStar(); }}\n className={`text-xs ${starred ? 'text-yellow-500' : 'text-gray-300 hover:text-gray-500'}`}\n title={starred ? 'Unstar' : 'Star'}\n >\n ★\n </button>\n <p className={`text-xs flex-1 truncate ${unread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>\n {msg.from.name || msg.from.address}\n </p>\n <span className=\"text-[10px] text-gray-400 shrink-0\">{formatDate(msg.date)}</span>\n </div>\n <p className={`text-xs truncate ${unread ? 'font-medium text-gray-900' : 'text-gray-600'}`}>\n {msg.subject || '(no subject)'}\n </p>\n {msg.hasAttachments && <span className=\"text-[10px] text-gray-400\">📎 attachment</span>}\n </div>\n );\n}\n\nfunction MessageDetailView({\n detail,\n folderPath,\n loading,\n onReply,\n onTrash,\n}: {\n detail: MessageDetail;\n folderPath: string;\n loading: boolean;\n onReply: () => void;\n onTrash: () => void;\n}) {\n const baseUrl = `/api/mail/messages/${encodeURIComponent(folderPath)}/${detail.uid}/attachments`;\n return (\n <div>\n <header className=\"px-6 py-4 border-b border-gray-200\">\n <h1 className=\"text-lg font-semibold mb-2\">{detail.subject || '(no subject)'}</h1>\n <div className=\"flex items-center justify-between text-xs text-gray-600\">\n <div>\n <div><strong>{detail.from.name || detail.from.address}</strong> <{detail.from.address}></div>\n <div>to {detail.to.map(t => t.address).join(', ')}</div>\n {detail.cc.length > 0 && <div>cc {detail.cc.map(t => t.address).join(', ')}</div>}\n <div className=\"text-gray-400 mt-1\">{formatDateTime(detail.date)}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={onReply} className=\"px-3 py-1 text-xs border border-gray-300 rounded hover:bg-gray-50\">Reply</button>\n <button onClick={onTrash} className=\"px-3 py-1 text-xs border border-red-200 text-red-700 rounded hover:bg-red-50\">Trash</button>\n </div>\n </div>\n </header>\n <article className=\"px-6 py-4\">\n {loading ? (\n <div className=\"text-xs text-gray-500\">Loading…</div>\n ) : detail.html ? (\n <div className=\"prose prose-sm max-w-none\" dangerouslySetInnerHTML={{ __html: detail.html }} />\n ) : (\n <pre className=\"whitespace-pre-wrap text-sm font-sans\">{detail.text || '(empty)'}</pre>\n )}\n </article>\n {detail.attachments.length > 0 && (\n <section className=\"px-6 pb-6\">\n <h3 className=\"text-xs font-semibold text-gray-700 mb-2\">Attachments</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {detail.attachments.map(att => (\n <a\n key={att.partId}\n href={`${getMailClient().defaults.baseURL}${baseUrl}/${encodeURIComponent(att.partId)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-2 border border-gray-200 rounded px-3 py-2 text-xs hover:bg-gray-50\"\n >\n <span>📎</span>\n <span className=\"flex-1 truncate\">{att.filename}</span>\n <span className=\"text-gray-400\">{(att.size / 1024).toFixed(1)}KB</span>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n );\n}\n\ninterface DraftState {\n to: string;\n cc: string;\n subject: string;\n body: string;\n inReplyTo?: string;\n references?: string[];\n}\n\nfunction ComposeModal({\n open,\n initial,\n onClose,\n onSent,\n}: {\n open: boolean;\n initial: DraftState;\n onClose: () => void;\n onSent: () => void;\n}) {\n const [draft, setDraft] = useState<DraftState>(initial);\n const [sending, setSending] = useState(false);\n\n async function send() {\n setSending(true);\n try {\n const toList = draft.to.split(',').map(s => s.trim()).filter(Boolean);\n const ccList = draft.cc.split(',').map(s => s.trim()).filter(Boolean);\n if (toList.length === 0) {\n toast.error('At least one recipient required');\n return;\n }\n await getMailClient().post('/api/mail/send', {\n to: toList,\n cc: ccList.length ? ccList : undefined,\n subject: draft.subject,\n text: draft.body,\n inReplyTo: draft.inReplyTo,\n references: draft.references,\n saveToSent: true,\n });\n onSent();\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setSending(false);\n }\n }\n\n return (\n <Modal open={open} onClose={onClose} title=\"New message\" size=\"lg\">\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n placeholder=\"To\"\n value={draft.to}\n onChange={e => setDraft({ ...draft, to: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Cc (optional)\"\n value={draft.cc}\n onChange={e => setDraft({ ...draft, cc: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Subject\"\n value={draft.subject}\n onChange={e => setDraft({ ...draft, subject: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <textarea\n rows={12}\n placeholder=\"Write your message…\"\n value={draft.body}\n onChange={e => setDraft({ ...draft, body: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm font-mono\"\n />\n </div>\n <ModalActions>\n <button\n onClick={send}\n disabled={sending}\n className=\"bg-gray-900 text-white rounded-lg px-5 py-2 text-sm font-medium hover:bg-gray-800 disabled:opacity-50\"\n >\n {sending ? 'Sending…' : 'Send'}\n </button>\n </ModalActions>\n </Modal>\n );\n}\n\nfunction EmptyState({ title, body, action }: { title: string; body: string; action?: React.ReactNode }) {\n return (\n <div className=\"h-full grid place-items-center p-8 text-center\">\n <div className=\"max-w-sm\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">{title}</h2>\n <p className=\"text-sm text-gray-600\">{body}</p>\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n </div>\n );\n}\n\nfunction extractError(err: unknown): string {\n const response = (err as { response?: { data?: { error?: string } } }).response;\n if (response?.data?.error) return response.data.error;\n if (err instanceof Error) return err.message;\n return 'Unknown error';\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { Files as default, openFilesInTrashMode } from './chunk-CDSFAXIS.js';
|
|
2
|
+
import './chunk-SUUADOG6.js';
|
|
3
|
+
import './chunk-KJ5664G7.js';
|
|
4
|
+
import './chunk-KUIPWCTJ.js';
|
|
5
|
+
import './chunk-WIJ45SYD.js';
|
|
6
|
+
import './chunk-ZETQWO2W.js';
|
|
7
|
+
import './chunk-3T6SQ4UO.js';
|
|
8
|
+
import './chunk-UBN4IUDE.js';
|
|
9
|
+
import './chunk-ZF6AYO4G.js';
|
|
10
|
+
//# sourceMappingURL=Files-XNAPEBFF.js.map
|
|
11
|
+
//# sourceMappingURL=Files-XNAPEBFF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Files-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Files-XNAPEBFF.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatDate } from './chunk-NSU7OHPC.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { useWindowMenuItem, Modal, client_default } from './chunk-
|
|
3
|
+
import { useWindowMenuItem, Modal, client_default } from './chunk-3T6SQ4UO.js';
|
|
4
4
|
import './chunk-UBN4IUDE.js';
|
|
5
5
|
import './chunk-ZF6AYO4G.js';
|
|
6
6
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
@@ -267,5 +267,5 @@ function Minesweeper() {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
export { Minesweeper as default };
|
|
270
|
-
//# sourceMappingURL=Minesweeper-
|
|
271
|
-
//# sourceMappingURL=Minesweeper-
|
|
270
|
+
//# sourceMappingURL=Minesweeper-N73MSPJV.js.map
|
|
271
|
+
//# sourceMappingURL=Minesweeper-N73MSPJV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/analytics.ts","../src/apps/Minesweeper.tsx"],"names":["c"],"mappings":"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","file":"Minesweeper-TZU7VTBR.js","sourcesContent":["/** Game analytics — Minesweeper leaderboard routes through the\n * consumer-supplied apiClient (see setShellApiClient). */\nimport apiClient from './client';\nexport const submitGameScore = (data: { game: string; won: boolean; time_seconds: number; clicks: number }) =>\n apiClient.post(`/analytics/games/${data.game}/scores/`, data).then((r: any) => r.data);\nexport const getGameLeaderboard = (game: string) =>\n apiClient.get(`/analytics/games/${game}/leaderboard/`).then((r: any) => r.data);\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { submitGameScore, getGameLeaderboard } from '../api/analytics';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport { formatDate } from '../utils/date';\n\nconst ROWS = 9, COLS = 9, MINES = 10;\nconst DIRS = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];\nconst NUM_COLORS: Record<number,string> = {1:'text-blue-700',2:'text-green-700',3:'text-red-600',4:'text-purple-700',5:'text-red-900',6:'text-teal-600',7:'text-black',8:'text-gray-500'};\n\ntype Cell = { mine: boolean; revealed: boolean; flagged: boolean; adjacent: number };\ntype Status = 'playing' | 'won' | 'lost';\n\nfunction createBoard(): Cell[][] {\n return Array.from({length:ROWS},()=>Array.from({length:COLS},()=>({mine:false,revealed:false,flagged:false,adjacent:0})));\n}\n\nfunction placeMines(board: Cell[][], safeR: number, safeC: number) {\n const b = board.map(r=>r.map(c=>({...c})));\n let placed = 0;\n while (placed < MINES) {\n const r = Math.floor(Math.random()*ROWS), c = Math.floor(Math.random()*COLS);\n if (b[r][c].mine || (Math.abs(r-safeR)<=1 && Math.abs(c-safeC)<=1)) continue;\n b[r][c].mine = true;\n placed++;\n }\n for (let r=0;r<ROWS;r++) for (let c=0;c<COLS;c++) {\n if (b[r][c].mine) continue;\n b[r][c].adjacent = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&b[nr][nc].mine?1:0);\n },0);\n }\n return b;\n}\n\nfunction floodFill(board: Cell[][], r: number, c: number) {\n const b = board.map(row=>row.map(cell=>({...cell})));\n const stack: [number,number][] = [[r,c]];\n while (stack.length) {\n const [cr,cc] = stack.pop()!;\n if (cr<0||cr>=ROWS||cc<0||cc>=COLS||b[cr][cc].revealed||b[cr][cc].flagged||b[cr][cc].mine) continue;\n b[cr][cc].revealed = true;\n if (b[cr][cc].adjacent === 0) DIRS.forEach(([dr,dc])=>stack.push([cr+dr,cc+dc]));\n }\n return b;\n}\n\nfunction checkWin(board: Cell[][]): boolean {\n return board.every(row=>row.every(c=>c.mine||c.revealed));\n}\n\nexport default function Minesweeper() {\n const [board, setBoard] = useState(createBoard);\n const [status, setStatus] = useState<Status>('playing');\n const [started, setStarted] = useState(false);\n const [time, setTime] = useState(0); // in centiseconds (hundredths)\n const timerRef = useRef<ReturnType<typeof setInterval>|null>(null);\n const startTimeRef = useRef(0);\n const [clicks, setClicks] = useState(0);\n const [showLeaderboard, setShowLeaderboard] = useState(false);\n const [leaderboard, setLeaderboard] = useState<{ rank: number; player_name: string; time_seconds: number; clicks: number; played_at: string }[]>([]);\n const [loadingLb, setLoadingLb] = useState(false);\n const scoreSubmitted = useRef(false);\n\n const flagCount = board.reduce((s,r)=>s+r.reduce((s2,c)=>s2+(c.flagged?1:0),0),0);\n\n const timeSeconds = time / 100; // convert centiseconds to seconds with 2 decimals\n\n useEffect(()=>{\n if (started && status==='playing') {\n startTimeRef.current = performance.now() - time * 10;\n timerRef.current = setInterval(()=>{\n const elapsed = Math.floor((performance.now() - startTimeRef.current) / 10);\n setTime(Math.min(elapsed, 99999));\n }, 10);\n } else if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return ()=>{if(timerRef.current)clearInterval(timerRef.current)};\n },[started,status]);\n\n const restart = useCallback(()=>{\n setBoard(createBoard());\n setStatus('playing');\n setStarted(false);\n setTime(0);\n startTimeRef.current = 0;\n setClicks(0);\n scoreSubmitted.current = false;\n },[]);\n\n const handleClick = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n let b = prev;\n if (!started) {\n b = placeMines(prev,r,c);\n setStarted(true);\n }\n const cell = b[r][c];\n if (cell.revealed||cell.flagged) return b;\n if (cell.mine) {\n const lost = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n lost[r][c] = {...lost[r][c], revealed:true};\n setStatus('lost');\n return lost;\n }\n const next = floodFill(b,r,c);\n if (checkWin(next)) setStatus('won');\n return next;\n });\n },[status,started]);\n\n const handleContext = useCallback((e:React.MouseEvent,r:number,c:number)=>{\n e.preventDefault();\n if (status!=='playing') return;\n setBoard(prev=>{\n if (prev[r][c].revealed) return prev;\n const b = prev.map(row=>row.map(cell=>({...cell})));\n b[r][c].flagged = !b[r][c].flagged;\n return b;\n });\n },[status]);\n\n // Chord click: both buttons on a revealed number — auto-reveal adjacent if flags match\n const handleChord = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n const cell = prev[r][c];\n if (!cell.revealed || cell.adjacent === 0) return prev;\n // Count adjacent flags\n const adjFlags = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&prev[nr][nc].flagged?1:0);\n },0);\n if (adjFlags !== cell.adjacent) return prev;\n // Reveal all unflagged adjacent cells\n let b = prev.map(row=>row.map(c=>({...c})));\n let hitMine = false;\n for (const [dr,dc] of DIRS) {\n const nr=r+dr,nc=c+dc;\n if (nr<0||nr>=ROWS||nc<0||nc>=COLS||b[nr][nc].revealed||b[nr][nc].flagged) continue;\n if (b[nr][nc].mine) { hitMine = true; b[nr][nc].revealed = true; }\n else b = floodFill(b,nr,nc);\n }\n if (hitMine) {\n b = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n setStatus('lost');\n } else if (checkWin(b)) setStatus('won');\n return b;\n });\n },[status]);\n\n const buttonsDown = useRef(0);\n\n // Capture precise time on win/loss\n const finalTimeRef = useRef(0);\n useEffect(() => {\n if (status === 'won' || status === 'lost') {\n // Capture the exact elapsed time when game ends\n if (startTimeRef.current > 0) {\n finalTimeRef.current = Math.round((performance.now() - startTimeRef.current) / 10) / 100; // seconds with 2 decimals\n } else {\n finalTimeRef.current = timeSeconds;\n }\n }\n }, [status]);\n\n // Submit score on win\n useEffect(() => {\n if (status === 'won' && !scoreSubmitted.current) {\n scoreSubmitted.current = true;\n const t = finalTimeRef.current || timeSeconds;\n const tFixed = parseFloat(t.toFixed(2));\n submitGameScore({ game: 'minesweeper', won: true, time_seconds: tFixed, clicks })\n .then(res => { toast.success(`You won! Rank #${res.rank} with ${tFixed}s and ${clicks} clicks`); })\n .catch(() => { toast.success(`You won! ${tFixed}s and ${clicks} clicks`); });\n }\n }, [status, clicks]);\n\n // Fetch leaderboard (no-op when apiClient isn't wired)\n const fetchLeaderboard = useCallback(() => {\n setLoadingLb(true);\n getGameLeaderboard('minesweeper')\n .then(res => setLeaderboard(res.results || []))\n .catch(() => setLeaderboard([]))\n .finally(() => setLoadingLb(false));\n }, []);\n\n // Register \"Leaderboard\" in the window title menu\n const openLb = useCallback(() => { fetchLeaderboard(); setShowLeaderboard(true); }, [fetchLeaderboard]);\n useWindowMenuItem('Leaderboard', openLb, <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M18.75 4.236c.982.143 1.954.317 2.916.52A6.003 6.003 0 0016.27 9.728M18.75 4.236V4.5c0 2.108-.966 3.99-2.48 5.228m0 0a6.003 6.003 0 01-2.27.853m0 0h.008v.008h-.008v-.008z\" /></svg>);\n\n const face = status==='lost'?'😵':status==='won'?'😎':'🙂';\n\n return (\n <div className=\"flex flex-col items-center select-none\" onContextMenu={e => e.preventDefault()}>\n <div className=\"bg-gray-300 border-4 border-t-white border-l-white border-r-gray-500 border-b-gray-500 p-2\">\n {/* Header */}\n <div className=\"flex items-center justify-between bg-gray-300 border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white p-1 mb-2\">\n <div className=\"bg-black text-red-500 font-mono font-bold text-xl px-1 w-14 text-center tracking-wider\">\n {String(Math.max(MINES-flagCount,0)).padStart(3,'0')}\n </div>\n <button onClick={restart} className=\"text-xl w-8 h-8 flex items-center justify-center bg-gray-300 border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 active:border-t-gray-500 active:border-l-gray-500 active:border-r-white active:border-b-white cursor-pointer\">\n {face}\n </button>\n <div className=\"bg-black text-red-500 font-mono font-bold text-base px-1 w-[70px] text-center tracking-wider\">\n {timeSeconds.toFixed(2)}\n </div>\n </div>\n {/* Grid */}\n <div className=\"border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white\">\n {board.map((row,r)=>(\n <div key={r} className=\"flex\">\n {row.map((cell,c)=>{\n const revealed = cell.revealed;\n const base = revealed\n ? 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border border-gray-400'\n : 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 cursor-pointer active:border active:border-gray-400';\n const bg = revealed && cell.mine && status==='lost' ? 'bg-red-500' : revealed ? 'bg-gray-300' : 'bg-gray-300';\n let content: React.ReactNode = null;\n let color = '';\n if (revealed && cell.mine) { content = '💣'; }\n else if (revealed && cell.adjacent > 0) { content = cell.adjacent; color = NUM_COLORS[cell.adjacent]||''; }\n else if (!revealed && cell.flagged) { content = '🚩'; }\n return (\n <div key={c} className={`${base} ${bg} ${color}`}\n onClick={()=>{setClicks(n=>n+1);handleClick(r,c);}}\n onContextMenu={e=>{setClicks(n=>n+1);handleContext(e,r,c);}}\n onMouseDown={e=>{buttonsDown.current|=(1<<e.button);if((buttonsDown.current&0b101)===0b101||(buttonsDown.current&0b011)===0b011)handleChord(r,c);}}\n onMouseUp={e=>{buttonsDown.current&=~(1<<e.button)}}\n onMouseLeave={()=>{buttonsDown.current=0}}>\n {content}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Stats + Leaderboard button */}\n <div className=\"flex items-center justify-between w-full mt-1 px-1\">\n <span className=\"text-[10px] text-gray-400 font-mono\">{clicks} clicks</span>\n <button onClick={() => { fetchLeaderboard(); setShowLeaderboard(true); }}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 font-medium\">\n Leaderboard\n </button>\n </div>\n\n {/* Leaderboard Modal */}\n {showLeaderboard && (\n <Modal open onClose={() => setShowLeaderboard(false)} title=\"Minesweeper Leaderboard\" size=\"md\">\n {loadingLb ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">Loading...</div>\n ) : leaderboard.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">No wins recorded yet. Be the first!</div>\n ) : (\n <div className=\"overflow-y-auto max-h-[60vh]\">\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 bg-white\">\n <tr className=\"border-b border-gray-200\">\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500 w-12\">#</th>\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500\">Player</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Time</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Clicks</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-24\">Date</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {leaderboard.map((s, i) => (\n <tr key={i} className={i < 3 ? 'bg-yellow-50/50' : ''}>\n <td className=\"py-1.5 px-2 font-mono text-gray-400\">\n {s.rank === 1 ? '🥇' : s.rank === 2 ? '🥈' : s.rank === 3 ? '🥉' : s.rank}\n </td>\n <td className=\"py-1.5 px-2 font-medium text-gray-900\">{s.player_name}</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-700\">{Number(s.time_seconds).toFixed(2)}s</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-500\">{s.clicks}</td>\n <td className=\"py-1.5 px-2 text-right text-xs text-gray-400\">\n {formatDate(s.played_at)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/analytics.ts","../src/apps/Minesweeper.tsx"],"names":["c"],"mappings":"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","file":"Minesweeper-N73MSPJV.js","sourcesContent":["/** Game analytics — Minesweeper leaderboard routes through the\n * consumer-supplied apiClient (see setShellApiClient). */\nimport apiClient from './client';\nexport const submitGameScore = (data: { game: string; won: boolean; time_seconds: number; clicks: number }) =>\n apiClient.post(`/analytics/games/${data.game}/scores/`, data).then((r: any) => r.data);\nexport const getGameLeaderboard = (game: string) =>\n apiClient.get(`/analytics/games/${game}/leaderboard/`).then((r: any) => r.data);\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { submitGameScore, getGameLeaderboard } from '../api/analytics';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport { formatDate } from '../utils/date';\n\nconst ROWS = 9, COLS = 9, MINES = 10;\nconst DIRS = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];\nconst NUM_COLORS: Record<number,string> = {1:'text-blue-700',2:'text-green-700',3:'text-red-600',4:'text-purple-700',5:'text-red-900',6:'text-teal-600',7:'text-black',8:'text-gray-500'};\n\ntype Cell = { mine: boolean; revealed: boolean; flagged: boolean; adjacent: number };\ntype Status = 'playing' | 'won' | 'lost';\n\nfunction createBoard(): Cell[][] {\n return Array.from({length:ROWS},()=>Array.from({length:COLS},()=>({mine:false,revealed:false,flagged:false,adjacent:0})));\n}\n\nfunction placeMines(board: Cell[][], safeR: number, safeC: number) {\n const b = board.map(r=>r.map(c=>({...c})));\n let placed = 0;\n while (placed < MINES) {\n const r = Math.floor(Math.random()*ROWS), c = Math.floor(Math.random()*COLS);\n if (b[r][c].mine || (Math.abs(r-safeR)<=1 && Math.abs(c-safeC)<=1)) continue;\n b[r][c].mine = true;\n placed++;\n }\n for (let r=0;r<ROWS;r++) for (let c=0;c<COLS;c++) {\n if (b[r][c].mine) continue;\n b[r][c].adjacent = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&b[nr][nc].mine?1:0);\n },0);\n }\n return b;\n}\n\nfunction floodFill(board: Cell[][], r: number, c: number) {\n const b = board.map(row=>row.map(cell=>({...cell})));\n const stack: [number,number][] = [[r,c]];\n while (stack.length) {\n const [cr,cc] = stack.pop()!;\n if (cr<0||cr>=ROWS||cc<0||cc>=COLS||b[cr][cc].revealed||b[cr][cc].flagged||b[cr][cc].mine) continue;\n b[cr][cc].revealed = true;\n if (b[cr][cc].adjacent === 0) DIRS.forEach(([dr,dc])=>stack.push([cr+dr,cc+dc]));\n }\n return b;\n}\n\nfunction checkWin(board: Cell[][]): boolean {\n return board.every(row=>row.every(c=>c.mine||c.revealed));\n}\n\nexport default function Minesweeper() {\n const [board, setBoard] = useState(createBoard);\n const [status, setStatus] = useState<Status>('playing');\n const [started, setStarted] = useState(false);\n const [time, setTime] = useState(0); // in centiseconds (hundredths)\n const timerRef = useRef<ReturnType<typeof setInterval>|null>(null);\n const startTimeRef = useRef(0);\n const [clicks, setClicks] = useState(0);\n const [showLeaderboard, setShowLeaderboard] = useState(false);\n const [leaderboard, setLeaderboard] = useState<{ rank: number; player_name: string; time_seconds: number; clicks: number; played_at: string }[]>([]);\n const [loadingLb, setLoadingLb] = useState(false);\n const scoreSubmitted = useRef(false);\n\n const flagCount = board.reduce((s,r)=>s+r.reduce((s2,c)=>s2+(c.flagged?1:0),0),0);\n\n const timeSeconds = time / 100; // convert centiseconds to seconds with 2 decimals\n\n useEffect(()=>{\n if (started && status==='playing') {\n startTimeRef.current = performance.now() - time * 10;\n timerRef.current = setInterval(()=>{\n const elapsed = Math.floor((performance.now() - startTimeRef.current) / 10);\n setTime(Math.min(elapsed, 99999));\n }, 10);\n } else if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return ()=>{if(timerRef.current)clearInterval(timerRef.current)};\n },[started,status]);\n\n const restart = useCallback(()=>{\n setBoard(createBoard());\n setStatus('playing');\n setStarted(false);\n setTime(0);\n startTimeRef.current = 0;\n setClicks(0);\n scoreSubmitted.current = false;\n },[]);\n\n const handleClick = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n let b = prev;\n if (!started) {\n b = placeMines(prev,r,c);\n setStarted(true);\n }\n const cell = b[r][c];\n if (cell.revealed||cell.flagged) return b;\n if (cell.mine) {\n const lost = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n lost[r][c] = {...lost[r][c], revealed:true};\n setStatus('lost');\n return lost;\n }\n const next = floodFill(b,r,c);\n if (checkWin(next)) setStatus('won');\n return next;\n });\n },[status,started]);\n\n const handleContext = useCallback((e:React.MouseEvent,r:number,c:number)=>{\n e.preventDefault();\n if (status!=='playing') return;\n setBoard(prev=>{\n if (prev[r][c].revealed) return prev;\n const b = prev.map(row=>row.map(cell=>({...cell})));\n b[r][c].flagged = !b[r][c].flagged;\n return b;\n });\n },[status]);\n\n // Chord click: both buttons on a revealed number — auto-reveal adjacent if flags match\n const handleChord = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n const cell = prev[r][c];\n if (!cell.revealed || cell.adjacent === 0) return prev;\n // Count adjacent flags\n const adjFlags = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&prev[nr][nc].flagged?1:0);\n },0);\n if (adjFlags !== cell.adjacent) return prev;\n // Reveal all unflagged adjacent cells\n let b = prev.map(row=>row.map(c=>({...c})));\n let hitMine = false;\n for (const [dr,dc] of DIRS) {\n const nr=r+dr,nc=c+dc;\n if (nr<0||nr>=ROWS||nc<0||nc>=COLS||b[nr][nc].revealed||b[nr][nc].flagged) continue;\n if (b[nr][nc].mine) { hitMine = true; b[nr][nc].revealed = true; }\n else b = floodFill(b,nr,nc);\n }\n if (hitMine) {\n b = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n setStatus('lost');\n } else if (checkWin(b)) setStatus('won');\n return b;\n });\n },[status]);\n\n const buttonsDown = useRef(0);\n\n // Capture precise time on win/loss\n const finalTimeRef = useRef(0);\n useEffect(() => {\n if (status === 'won' || status === 'lost') {\n // Capture the exact elapsed time when game ends\n if (startTimeRef.current > 0) {\n finalTimeRef.current = Math.round((performance.now() - startTimeRef.current) / 10) / 100; // seconds with 2 decimals\n } else {\n finalTimeRef.current = timeSeconds;\n }\n }\n }, [status]);\n\n // Submit score on win\n useEffect(() => {\n if (status === 'won' && !scoreSubmitted.current) {\n scoreSubmitted.current = true;\n const t = finalTimeRef.current || timeSeconds;\n const tFixed = parseFloat(t.toFixed(2));\n submitGameScore({ game: 'minesweeper', won: true, time_seconds: tFixed, clicks })\n .then(res => { toast.success(`You won! Rank #${res.rank} with ${tFixed}s and ${clicks} clicks`); })\n .catch(() => { toast.success(`You won! ${tFixed}s and ${clicks} clicks`); });\n }\n }, [status, clicks]);\n\n // Fetch leaderboard (no-op when apiClient isn't wired)\n const fetchLeaderboard = useCallback(() => {\n setLoadingLb(true);\n getGameLeaderboard('minesweeper')\n .then(res => setLeaderboard(res.results || []))\n .catch(() => setLeaderboard([]))\n .finally(() => setLoadingLb(false));\n }, []);\n\n // Register \"Leaderboard\" in the window title menu\n const openLb = useCallback(() => { fetchLeaderboard(); setShowLeaderboard(true); }, [fetchLeaderboard]);\n useWindowMenuItem('Leaderboard', openLb, <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M18.75 4.236c.982.143 1.954.317 2.916.52A6.003 6.003 0 0016.27 9.728M18.75 4.236V4.5c0 2.108-.966 3.99-2.48 5.228m0 0a6.003 6.003 0 01-2.27.853m0 0h.008v.008h-.008v-.008z\" /></svg>);\n\n const face = status==='lost'?'😵':status==='won'?'😎':'🙂';\n\n return (\n <div className=\"flex flex-col items-center select-none\" onContextMenu={e => e.preventDefault()}>\n <div className=\"bg-gray-300 border-4 border-t-white border-l-white border-r-gray-500 border-b-gray-500 p-2\">\n {/* Header */}\n <div className=\"flex items-center justify-between bg-gray-300 border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white p-1 mb-2\">\n <div className=\"bg-black text-red-500 font-mono font-bold text-xl px-1 w-14 text-center tracking-wider\">\n {String(Math.max(MINES-flagCount,0)).padStart(3,'0')}\n </div>\n <button onClick={restart} className=\"text-xl w-8 h-8 flex items-center justify-center bg-gray-300 border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 active:border-t-gray-500 active:border-l-gray-500 active:border-r-white active:border-b-white cursor-pointer\">\n {face}\n </button>\n <div className=\"bg-black text-red-500 font-mono font-bold text-base px-1 w-[70px] text-center tracking-wider\">\n {timeSeconds.toFixed(2)}\n </div>\n </div>\n {/* Grid */}\n <div className=\"border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white\">\n {board.map((row,r)=>(\n <div key={r} className=\"flex\">\n {row.map((cell,c)=>{\n const revealed = cell.revealed;\n const base = revealed\n ? 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border border-gray-400'\n : 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 cursor-pointer active:border active:border-gray-400';\n const bg = revealed && cell.mine && status==='lost' ? 'bg-red-500' : revealed ? 'bg-gray-300' : 'bg-gray-300';\n let content: React.ReactNode = null;\n let color = '';\n if (revealed && cell.mine) { content = '💣'; }\n else if (revealed && cell.adjacent > 0) { content = cell.adjacent; color = NUM_COLORS[cell.adjacent]||''; }\n else if (!revealed && cell.flagged) { content = '🚩'; }\n return (\n <div key={c} className={`${base} ${bg} ${color}`}\n onClick={()=>{setClicks(n=>n+1);handleClick(r,c);}}\n onContextMenu={e=>{setClicks(n=>n+1);handleContext(e,r,c);}}\n onMouseDown={e=>{buttonsDown.current|=(1<<e.button);if((buttonsDown.current&0b101)===0b101||(buttonsDown.current&0b011)===0b011)handleChord(r,c);}}\n onMouseUp={e=>{buttonsDown.current&=~(1<<e.button)}}\n onMouseLeave={()=>{buttonsDown.current=0}}>\n {content}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Stats + Leaderboard button */}\n <div className=\"flex items-center justify-between w-full mt-1 px-1\">\n <span className=\"text-[10px] text-gray-400 font-mono\">{clicks} clicks</span>\n <button onClick={() => { fetchLeaderboard(); setShowLeaderboard(true); }}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 font-medium\">\n Leaderboard\n </button>\n </div>\n\n {/* Leaderboard Modal */}\n {showLeaderboard && (\n <Modal open onClose={() => setShowLeaderboard(false)} title=\"Minesweeper Leaderboard\" size=\"md\">\n {loadingLb ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">Loading...</div>\n ) : leaderboard.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">No wins recorded yet. Be the first!</div>\n ) : (\n <div className=\"overflow-y-auto max-h-[60vh]\">\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 bg-white\">\n <tr className=\"border-b border-gray-200\">\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500 w-12\">#</th>\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500\">Player</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Time</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Clicks</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-24\">Date</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {leaderboard.map((s, i) => (\n <tr key={i} className={i < 3 ? 'bg-yellow-50/50' : ''}>\n <td className=\"py-1.5 px-2 font-mono text-gray-400\">\n {s.rank === 1 ? '🥇' : s.rank === 2 ? '🥈' : s.rank === 3 ? '🥉' : s.rank}\n </td>\n <td className=\"py-1.5 px-2 font-medium text-gray-900\">{s.player_name}</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-700\">{Number(s.time_seconds).toFixed(2)}s</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-500\">{s.clicks}</td>\n <td className=\"py-1.5 px-2 text-right text-xs text-gray-400\">\n {formatDate(s.played_at)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { useWindowManager, client_default } from './chunk-
|
|
3
|
+
import { useWindowManager, client_default } from './chunk-3T6SQ4UO.js';
|
|
4
4
|
import './chunk-UBN4IUDE.js';
|
|
5
5
|
import './chunk-ZF6AYO4G.js';
|
|
6
6
|
import { useRef, useEffect, useState, useCallback } from 'react';
|
|
@@ -386,5 +386,5 @@ Tips:
|
|
|
386
386
|
}
|
|
387
387
|
|
|
388
388
|
export { Notepad as default };
|
|
389
|
-
//# sourceMappingURL=Notepad-
|
|
390
|
-
//# sourceMappingURL=Notepad-
|
|
389
|
+
//# sourceMappingURL=Notepad-MXEQCIC7.js.map
|
|
390
|
+
//# sourceMappingURL=Notepad-MXEQCIC7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/auth.ts","../src/apps/Notepad.tsx"],"names":[],"mappings":"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","file":"Notepad-RXDODESR.js","sourcesContent":["/** User-profile API — calls below proxy to the consumer-supplied apiClient\n * via setShellApiClient(). Prefs reads/writes go through <ShellPrefsProvider>. */\nimport apiClient from './client';\nexport const getMe = () => apiClient.get('/auth/me/').then((r: any) => r.data);\nexport const updateMe = (patch: any) => apiClient.patch('/auth/me/', patch).then((r: any) => r.data);\nexport const getNumberingConfigs = () => apiClient.get('/auth/numbering-configs/').then((r: any) => r.data?.results ?? r.data ?? []);\n","import { useState, useEffect, useRef, useCallback, type ReactNode } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getNumberingConfigs } from '../api/auth';\nimport apiClient from '../api/client';\nimport toast from '../shell/toast';\nimport { useWindowManager } from '../shell/WindowManager';\nimport { useShellPrefs } from '../shell/ShellPrefs';\n\ninterface Note {\n id: string;\n title: string;\n content: string;\n color: string;\n sticky: boolean; // pinned to desktop\n updated_at: string;\n}\n\nconst COLORS = [\n { key: 'yellow', bg: 'bg-yellow-100', border: 'border-yellow-300', text: 'text-yellow-900', dot: 'bg-yellow-400' },\n { key: 'blue', bg: 'bg-blue-100', border: 'border-blue-300', text: 'text-blue-900', dot: 'bg-blue-400' },\n { key: 'green', bg: 'bg-green-100', border: 'border-green-300', text: 'text-green-900', dot: 'bg-green-400' },\n { key: 'pink', bg: 'bg-pink-100', border: 'border-pink-300', text: 'text-pink-900', dot: 'bg-pink-400' },\n { key: 'purple', bg: 'bg-purple-100', border: 'border-purple-300', text: 'text-purple-900', dot: 'bg-purple-400' },\n { key: 'orange', bg: 'bg-orange-100', border: 'border-orange-300', text: 'text-orange-900', dot: 'bg-orange-400' },\n { key: 'white', bg: 'bg-white', border: 'border-gray-300', text: 'text-gray-900', dot: 'bg-gray-300' },\n];\n\nfunction getColor(key: string) {\n return COLORS.find(c => c.key === key) || COLORS[0];\n}\n\nfunction newNote(): Note {\n return {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '',\n content: '',\n color: 'yellow',\n sticky: false,\n updated_at: new Date().toISOString(),\n };\n}\n\n// ── Entity reference mapping ──\n// Maps entity_type from NumberingConfig to modal registry entityType and search endpoint\nconst ENTITY_TYPE_MAP: Record<string, { entityType: string; endpoint: string }> = {\n sales_order: { entityType: 'order', endpoint: '/orders/sales-orders/' },\n purchase_order: { entityType: 'purchase_order', endpoint: '/purchase-orders/' },\n invoice: { entityType: 'invoice', endpoint: '/invoicing/invoices/' },\n vendor_invoice: { entityType: 'vendor_invoice', endpoint: '/invoicing/vendor-invoices/' },\n shipment: { entityType: 'shipment', endpoint: '/shipments/delivery-notes/' },\n receipt: { entityType: 'payment', endpoint: '/invoicing/payments/' },\n vendor_payment: { entityType: 'vendor_payment', endpoint: '/invoicing/vendor-payments/' },\n vendor_price_sheet: { entityType: 'vendor_price_sheet', endpoint: '/pricing/manufacturer-price-sheets/' },\n client_price_sheet: { entityType: 'price_sheet', endpoint: '/pricing/price-sheets/' },\n qc_report: { entityType: 'qc_report', endpoint: '/qc-reports/' },\n warranty_claim: { entityType: 'warranty_claim', endpoint: '/warranty-claims/claims/' },\n vendor_shipment: { entityType: 'vendor_shipment', endpoint: '/shipments/goods-receipts/' },\n};\n\n// Match checkboxes: [] or [x] or [X]\nconst CHECKBOX_REGEX = /\\[([ xX]?)\\]/g;\n\nexport default function Notepad() {\n const { openEntity } = useWindowManager();\n const { prefs, save } = useShellPrefs();\n\n // Fetch numbering configs to build dynamic prefix map (optional — only used\n // for entity-reference autolinking; safe to fail when no apiClient is wired).\n const { data: numberingConfigs } = useQuery({\n queryKey: ['numbering-configs'],\n queryFn: () => getNumberingConfigs(),\n retry: false,\n });\n\n // Build prefix → { entityType, endpoint } map from DB configs\n const prefixMap = useRef<Record<string, { entityType: string; endpoint: string; prefix: string }>>({});\n useEffect(() => {\n if (!numberingConfigs) return;\n const map: Record<string, { entityType: string; endpoint: string; prefix: string }> = {};\n for (const cfg of numberingConfigs) {\n const mapping = ENTITY_TYPE_MAP[cfg.entity_type];\n if (!mapping) continue;\n // prefix from DB is like \"SO#\" — strip the # to get \"SO\"\n const rawPrefix = (cfg.prefix || '').replace('#', '').toUpperCase();\n if (rawPrefix) {\n map[rawPrefix] = { ...mapping, prefix: cfg.prefix };\n }\n // Also register alt_prefix if set\n if (cfg.alt_prefix) {\n const altRaw = cfg.alt_prefix.replace('#', '').toUpperCase();\n if (altRaw) map[altRaw] = { ...mapping, prefix: cfg.alt_prefix };\n }\n }\n prefixMap.current = map;\n }, [numberingConfigs]);\n\n const notes: Note[] = prefs.notepad_notes || [];\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const [editContent, setEditContent] = useState('');\n const [editColor, setEditColor] = useState('yellow');\n const [dirty, setDirty] = useState(false);\n const [editing, setEditing] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const saveTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const selected = notes.find(n => n.id === selectedId);\n\n // Select first note on load\n useEffect(() => {\n if (!selectedId && notes.length > 0) {\n const n = notes[0];\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n }\n }, [notes.length]);\n\n const saveNotes = useCallback((updated: Note[]) => {\n save({ notepad_notes: updated });\n }, [save]);\n\n const autoSave = useCallback(() => {\n if (!selectedId || !dirty) return;\n const updated = notes.map(n =>\n n.id === selectedId ? { ...n, title: editTitle, content: editContent, color: editColor, updated_at: new Date().toISOString() } : n\n );\n saveNotes(updated);\n setDirty(false);\n }, [selectedId, dirty, editTitle, editContent, editColor, notes, saveNotes]);\n\n // Debounced auto-save\n useEffect(() => {\n if (!dirty) return;\n if (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(autoSave, 800);\n return () => { if (saveTimerRef.current) clearTimeout(saveTimerRef.current); };\n }, [dirty, autoSave]);\n\n // Save on unmount\n useEffect(() => () => { if (dirty) autoSave(); }, []);\n\n const selectNote = (n: Note) => {\n if (dirty) autoSave();\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n setDirty(false);\n setEditing(false);\n };\n\n const createNote = () => {\n if (dirty) autoSave();\n const n = newNote();\n const updated = [n, ...notes];\n saveNotes(updated);\n setSelectedId(n.id);\n setEditTitle('');\n setEditContent('');\n setEditColor('yellow');\n setDirty(false);\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const deleteNote = (id: string) => {\n const updated = notes.filter(n => n.id !== id);\n saveNotes(updated);\n if (selectedId === id) {\n const next = updated[0];\n if (next) selectNote(next);\n else { setSelectedId(null); setEditTitle(''); setEditContent(''); }\n }\n };\n\n const toggleSticky = (id: string) => {\n const updated = notes.map(n =>\n n.id === id ? { ...n, sticky: !n.sticky } : n\n );\n saveNotes(updated);\n const note = updated.find(n => n.id === id);\n toast.success(note?.sticky ? 'Pinned to desktop' : 'Removed from desktop');\n };\n\n const timeAgo = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n };\n\n // ── Toggle checkbox in content ──\n const toggleCheckbox = (charIndex: number) => {\n const before = editContent.slice(0, charIndex);\n const match = editContent.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const after = editContent.slice(charIndex + match[0].length);\n setEditContent(before + replacement + after);\n setDirty(true);\n };\n\n // ── Open entity reference ──\n const openRef = async (prefix: string, number: string) => {\n const mapping = prefixMap.current[prefix];\n if (!mapping) return;\n const refNum = `${prefix}#${number}`;\n try {\n const { data } = await apiClient.get(mapping.endpoint, { params: { search: refNum, page_size: 1 } });\n const results = data?.results ?? data ?? [];\n const entity = results[0];\n if (entity) {\n openEntity(mapping.entityType, entity.id, entity, refNum);\n } else {\n toast.error(`${refNum} not found`);\n }\n } catch {\n toast.error(`Failed to look up ${refNum}`);\n }\n };\n\n // ── Render content with links and checkboxes ──\n const renderContent = (text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n return lines.map((line, li) => {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n // Find all special tokens in the line\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — match XX#NNNNN (2+ letters + # + 4-6 digits)\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n const prefix = m[1];\n const num = m[2];\n if (prefixMap.current[prefix]) {\n const startIdx = m.index;\n const matchText = m[0];\n tokens.push({\n idx: startIdx,\n len: matchText.length,\n render: () => (\n <button key={`ref-${li}-${startIdx}`} onClick={() => openRef(prefix, num)}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium cursor-pointer\">\n {matchText}\n </button>\n ),\n });\n }\n }\n\n // Checkboxes\n CHECKBOX_REGEX.lastIndex = 0;\n // Calculate the character offset in the full content for this line\n let lineStartInContent = 0;\n for (let i = 0; i < li; i++) lineStartInContent += lines[i].length + 1;\n while ((m = CHECKBOX_REGEX.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStartInContent + startIdx;\n tokens.push({\n idx: startIdx,\n len: m[0].length,\n render: () => (\n <button key={`cb-${li}-${startIdx}`} onClick={() => toggleCheckbox(contentCharIdx)}\n className={`inline-flex items-center justify-center w-4 h-4 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-400 bg-white hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n ),\n });\n }\n\n // Sort tokens by position\n tokens.sort((a, b) => a.idx - b.idx);\n\n // Build line with tokens interspersed\n for (const token of tokens) {\n if (token.idx > lastIdx) {\n // Check if text after a checked checkbox should be struck through\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, token.idx)}</span>);\n }\n parts.push(token.render());\n lastIdx = token.idx + token.len;\n }\n if (lastIdx < line.length) {\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n }\n if (parts.length === 0) parts.push(<span key={`empty-${li}`}>{'\\u200B'}</span>); // zero-width space for empty lines\n\n // Check if line starts with a checked checkbox → strikethrough the rest\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return (\n <div key={li} className={lineHasChecked ? 'line-through text-gray-400' : ''}>\n {parts}\n </div>\n );\n });\n };\n\n const startEditing = () => {\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const stopEditing = () => {\n setEditing(false);\n if (dirty) autoSave();\n };\n\n const PLACEHOLDER_HINT = `Start writing...\n\nTips:\n [] Type [] for a checkbox, click to toggle\n SO#35001 Type XX#NNNNN to link entities (SO, PO, CI, VI, PL, etc.)`;\n\n return (\n <div className=\"flex h-full\">\n {/* Note list sidebar */}\n <div className=\"w-56 shrink-0 border-r border-gray-200 flex flex-col\">\n <div className=\"p-2 border-b border-gray-200\">\n <button onClick={createNote}\n className=\"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-1.5 text-sm font-medium hover:bg-blue-700 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n New Note\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {notes.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8 px-4\">No notes yet. Create one to get started.</p>\n ) : (\n notes.map(n => {\n const c = getColor(n.color);\n return (\n <button key={n.id} onClick={() => selectNote(n)}\n className={`w-full text-left px-3 py-2.5 border-b border-gray-100 transition-colors ${selectedId === n.id ? 'bg-blue-50' : 'hover:bg-gray-50'}`}>\n <div className=\"flex items-center gap-2\">\n <div className={`w-2.5 h-2.5 rounded-full shrink-0 ${c.dot}`} />\n <span className=\"text-sm font-medium text-gray-900 truncate flex-1\">\n {n.title || 'Untitled'}\n </span>\n {n.sticky && (\n <svg className=\"h-3 w-3 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n )}\n </div>\n <p className=\"text-xs text-gray-400 mt-0.5 truncate ml-4.5\">{n.content.replace(/\\[[ xX]?\\]/g, '').slice(0, 60) || 'Empty note'}</p>\n <p className=\"text-[10px] text-gray-300 mt-0.5 ml-4.5\">{timeAgo(n.updated_at)}</p>\n </button>\n );\n })\n )}\n </div>\n </div>\n\n {/* Editor */}\n {selectedId ? (\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Title */}\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-gray-200\">\n <input\n value={editTitle}\n onChange={e => { setEditTitle(e.target.value); setDirty(true); }}\n placeholder=\"Note title...\"\n className=\"flex-1 text-lg font-semibold text-gray-900 outline-none bg-transparent placeholder:text-gray-300\"\n />\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {COLORS.map(c => (\n <button key={c.key} onClick={() => { setEditColor(c.key); setDirty(true); }}\n className={`w-5 h-5 rounded-full border-2 transition-all ${c.dot} ${editColor === c.key ? 'border-gray-600 scale-110' : 'border-transparent hover:border-gray-400'}`}\n title={c.key} />\n ))}\n </div>\n {/* Sticky toggle */}\n <button onClick={() => toggleSticky(selectedId)} title={selected?.sticky ? 'Remove from desktop' : 'Pin to desktop'}\n className={`p-1 rounded transition-colors ${selected?.sticky ? 'text-amber-500 hover:text-amber-600' : 'text-gray-300 hover:text-amber-400'}`}>\n <svg className=\"h-4 w-4\" fill={selected?.sticky ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n </button>\n {/* Delete */}\n <button onClick={() => deleteNote(selectedId)} title=\"Delete note\"\n className=\"p-1 rounded text-gray-300 hover:text-red-500 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n </div>\n {/* Content — toggle between textarea (edit) and rendered view */}\n {editing ? (\n <textarea\n ref={textareaRef}\n value={editContent}\n onChange={e => { setEditContent(e.target.value); setDirty(true); }}\n onBlur={stopEditing}\n placeholder={PLACEHOLDER_HINT}\n className=\"flex-1 p-4 text-sm text-gray-700 outline-none resize-none bg-transparent leading-relaxed placeholder:text-gray-300 font-mono\"\n />\n ) : (\n <div\n onClick={startEditing}\n className=\"flex-1 p-4 text-sm text-gray-700 overflow-y-auto leading-relaxed cursor-text\"\n >\n {editContent ? renderContent(editContent) : (\n <p className=\"text-gray-300 whitespace-pre-line\">{PLACEHOLDER_HINT}</p>\n )}\n </div>\n )}\n {/* Bottom hint bar */}\n <div className=\"px-4 py-1.5 border-t border-gray-100 flex items-center gap-4 text-[10px] text-gray-400\">\n <span>[] checkbox</span>\n <span>SO#35001 entity link</span>\n <span className=\"ml-auto\">{editing ? 'Editing' : 'Click to edit'}</span>\n </div>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center text-gray-400\">\n <svg className=\"h-12 w-12 mx-auto mb-3 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n <p className=\"text-sm\">Select a note or create a new one</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/auth.ts","../src/apps/Notepad.tsx"],"names":[],"mappings":"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","file":"Notepad-MXEQCIC7.js","sourcesContent":["/** User-profile API — calls below proxy to the consumer-supplied apiClient\n * via setShellApiClient(). Prefs reads/writes go through <ShellPrefsProvider>. */\nimport apiClient from './client';\nexport const getMe = () => apiClient.get('/auth/me/').then((r: any) => r.data);\nexport const updateMe = (patch: any) => apiClient.patch('/auth/me/', patch).then((r: any) => r.data);\nexport const getNumberingConfigs = () => apiClient.get('/auth/numbering-configs/').then((r: any) => r.data?.results ?? r.data ?? []);\n","import { useState, useEffect, useRef, useCallback, type ReactNode } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getNumberingConfigs } from '../api/auth';\nimport apiClient from '../api/client';\nimport toast from '../shell/toast';\nimport { useWindowManager } from '../shell/WindowManager';\nimport { useShellPrefs } from '../shell/ShellPrefs';\n\ninterface Note {\n id: string;\n title: string;\n content: string;\n color: string;\n sticky: boolean; // pinned to desktop\n updated_at: string;\n}\n\nconst COLORS = [\n { key: 'yellow', bg: 'bg-yellow-100', border: 'border-yellow-300', text: 'text-yellow-900', dot: 'bg-yellow-400' },\n { key: 'blue', bg: 'bg-blue-100', border: 'border-blue-300', text: 'text-blue-900', dot: 'bg-blue-400' },\n { key: 'green', bg: 'bg-green-100', border: 'border-green-300', text: 'text-green-900', dot: 'bg-green-400' },\n { key: 'pink', bg: 'bg-pink-100', border: 'border-pink-300', text: 'text-pink-900', dot: 'bg-pink-400' },\n { key: 'purple', bg: 'bg-purple-100', border: 'border-purple-300', text: 'text-purple-900', dot: 'bg-purple-400' },\n { key: 'orange', bg: 'bg-orange-100', border: 'border-orange-300', text: 'text-orange-900', dot: 'bg-orange-400' },\n { key: 'white', bg: 'bg-white', border: 'border-gray-300', text: 'text-gray-900', dot: 'bg-gray-300' },\n];\n\nfunction getColor(key: string) {\n return COLORS.find(c => c.key === key) || COLORS[0];\n}\n\nfunction newNote(): Note {\n return {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '',\n content: '',\n color: 'yellow',\n sticky: false,\n updated_at: new Date().toISOString(),\n };\n}\n\n// ── Entity reference mapping ──\n// Maps entity_type from NumberingConfig to modal registry entityType and search endpoint\nconst ENTITY_TYPE_MAP: Record<string, { entityType: string; endpoint: string }> = {\n sales_order: { entityType: 'order', endpoint: '/orders/sales-orders/' },\n purchase_order: { entityType: 'purchase_order', endpoint: '/purchase-orders/' },\n invoice: { entityType: 'invoice', endpoint: '/invoicing/invoices/' },\n vendor_invoice: { entityType: 'vendor_invoice', endpoint: '/invoicing/vendor-invoices/' },\n shipment: { entityType: 'shipment', endpoint: '/shipments/delivery-notes/' },\n receipt: { entityType: 'payment', endpoint: '/invoicing/payments/' },\n vendor_payment: { entityType: 'vendor_payment', endpoint: '/invoicing/vendor-payments/' },\n vendor_price_sheet: { entityType: 'vendor_price_sheet', endpoint: '/pricing/manufacturer-price-sheets/' },\n client_price_sheet: { entityType: 'price_sheet', endpoint: '/pricing/price-sheets/' },\n qc_report: { entityType: 'qc_report', endpoint: '/qc-reports/' },\n warranty_claim: { entityType: 'warranty_claim', endpoint: '/warranty-claims/claims/' },\n vendor_shipment: { entityType: 'vendor_shipment', endpoint: '/shipments/goods-receipts/' },\n};\n\n// Match checkboxes: [] or [x] or [X]\nconst CHECKBOX_REGEX = /\\[([ xX]?)\\]/g;\n\nexport default function Notepad() {\n const { openEntity } = useWindowManager();\n const { prefs, save } = useShellPrefs();\n\n // Fetch numbering configs to build dynamic prefix map (optional — only used\n // for entity-reference autolinking; safe to fail when no apiClient is wired).\n const { data: numberingConfigs } = useQuery({\n queryKey: ['numbering-configs'],\n queryFn: () => getNumberingConfigs(),\n retry: false,\n });\n\n // Build prefix → { entityType, endpoint } map from DB configs\n const prefixMap = useRef<Record<string, { entityType: string; endpoint: string; prefix: string }>>({});\n useEffect(() => {\n if (!numberingConfigs) return;\n const map: Record<string, { entityType: string; endpoint: string; prefix: string }> = {};\n for (const cfg of numberingConfigs) {\n const mapping = ENTITY_TYPE_MAP[cfg.entity_type];\n if (!mapping) continue;\n // prefix from DB is like \"SO#\" — strip the # to get \"SO\"\n const rawPrefix = (cfg.prefix || '').replace('#', '').toUpperCase();\n if (rawPrefix) {\n map[rawPrefix] = { ...mapping, prefix: cfg.prefix };\n }\n // Also register alt_prefix if set\n if (cfg.alt_prefix) {\n const altRaw = cfg.alt_prefix.replace('#', '').toUpperCase();\n if (altRaw) map[altRaw] = { ...mapping, prefix: cfg.alt_prefix };\n }\n }\n prefixMap.current = map;\n }, [numberingConfigs]);\n\n const notes: Note[] = prefs.notepad_notes || [];\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const [editContent, setEditContent] = useState('');\n const [editColor, setEditColor] = useState('yellow');\n const [dirty, setDirty] = useState(false);\n const [editing, setEditing] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const saveTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const selected = notes.find(n => n.id === selectedId);\n\n // Select first note on load\n useEffect(() => {\n if (!selectedId && notes.length > 0) {\n const n = notes[0];\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n }\n }, [notes.length]);\n\n const saveNotes = useCallback((updated: Note[]) => {\n save({ notepad_notes: updated });\n }, [save]);\n\n const autoSave = useCallback(() => {\n if (!selectedId || !dirty) return;\n const updated = notes.map(n =>\n n.id === selectedId ? { ...n, title: editTitle, content: editContent, color: editColor, updated_at: new Date().toISOString() } : n\n );\n saveNotes(updated);\n setDirty(false);\n }, [selectedId, dirty, editTitle, editContent, editColor, notes, saveNotes]);\n\n // Debounced auto-save\n useEffect(() => {\n if (!dirty) return;\n if (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(autoSave, 800);\n return () => { if (saveTimerRef.current) clearTimeout(saveTimerRef.current); };\n }, [dirty, autoSave]);\n\n // Save on unmount\n useEffect(() => () => { if (dirty) autoSave(); }, []);\n\n const selectNote = (n: Note) => {\n if (dirty) autoSave();\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n setDirty(false);\n setEditing(false);\n };\n\n const createNote = () => {\n if (dirty) autoSave();\n const n = newNote();\n const updated = [n, ...notes];\n saveNotes(updated);\n setSelectedId(n.id);\n setEditTitle('');\n setEditContent('');\n setEditColor('yellow');\n setDirty(false);\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const deleteNote = (id: string) => {\n const updated = notes.filter(n => n.id !== id);\n saveNotes(updated);\n if (selectedId === id) {\n const next = updated[0];\n if (next) selectNote(next);\n else { setSelectedId(null); setEditTitle(''); setEditContent(''); }\n }\n };\n\n const toggleSticky = (id: string) => {\n const updated = notes.map(n =>\n n.id === id ? { ...n, sticky: !n.sticky } : n\n );\n saveNotes(updated);\n const note = updated.find(n => n.id === id);\n toast.success(note?.sticky ? 'Pinned to desktop' : 'Removed from desktop');\n };\n\n const timeAgo = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n };\n\n // ── Toggle checkbox in content ──\n const toggleCheckbox = (charIndex: number) => {\n const before = editContent.slice(0, charIndex);\n const match = editContent.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const after = editContent.slice(charIndex + match[0].length);\n setEditContent(before + replacement + after);\n setDirty(true);\n };\n\n // ── Open entity reference ──\n const openRef = async (prefix: string, number: string) => {\n const mapping = prefixMap.current[prefix];\n if (!mapping) return;\n const refNum = `${prefix}#${number}`;\n try {\n const { data } = await apiClient.get(mapping.endpoint, { params: { search: refNum, page_size: 1 } });\n const results = data?.results ?? data ?? [];\n const entity = results[0];\n if (entity) {\n openEntity(mapping.entityType, entity.id, entity, refNum);\n } else {\n toast.error(`${refNum} not found`);\n }\n } catch {\n toast.error(`Failed to look up ${refNum}`);\n }\n };\n\n // ── Render content with links and checkboxes ──\n const renderContent = (text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n return lines.map((line, li) => {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n // Find all special tokens in the line\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — match XX#NNNNN (2+ letters + # + 4-6 digits)\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n const prefix = m[1];\n const num = m[2];\n if (prefixMap.current[prefix]) {\n const startIdx = m.index;\n const matchText = m[0];\n tokens.push({\n idx: startIdx,\n len: matchText.length,\n render: () => (\n <button key={`ref-${li}-${startIdx}`} onClick={() => openRef(prefix, num)}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium cursor-pointer\">\n {matchText}\n </button>\n ),\n });\n }\n }\n\n // Checkboxes\n CHECKBOX_REGEX.lastIndex = 0;\n // Calculate the character offset in the full content for this line\n let lineStartInContent = 0;\n for (let i = 0; i < li; i++) lineStartInContent += lines[i].length + 1;\n while ((m = CHECKBOX_REGEX.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStartInContent + startIdx;\n tokens.push({\n idx: startIdx,\n len: m[0].length,\n render: () => (\n <button key={`cb-${li}-${startIdx}`} onClick={() => toggleCheckbox(contentCharIdx)}\n className={`inline-flex items-center justify-center w-4 h-4 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-400 bg-white hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n ),\n });\n }\n\n // Sort tokens by position\n tokens.sort((a, b) => a.idx - b.idx);\n\n // Build line with tokens interspersed\n for (const token of tokens) {\n if (token.idx > lastIdx) {\n // Check if text after a checked checkbox should be struck through\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, token.idx)}</span>);\n }\n parts.push(token.render());\n lastIdx = token.idx + token.len;\n }\n if (lastIdx < line.length) {\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n }\n if (parts.length === 0) parts.push(<span key={`empty-${li}`}>{'\\u200B'}</span>); // zero-width space for empty lines\n\n // Check if line starts with a checked checkbox → strikethrough the rest\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return (\n <div key={li} className={lineHasChecked ? 'line-through text-gray-400' : ''}>\n {parts}\n </div>\n );\n });\n };\n\n const startEditing = () => {\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const stopEditing = () => {\n setEditing(false);\n if (dirty) autoSave();\n };\n\n const PLACEHOLDER_HINT = `Start writing...\n\nTips:\n [] Type [] for a checkbox, click to toggle\n SO#35001 Type XX#NNNNN to link entities (SO, PO, CI, VI, PL, etc.)`;\n\n return (\n <div className=\"flex h-full\">\n {/* Note list sidebar */}\n <div className=\"w-56 shrink-0 border-r border-gray-200 flex flex-col\">\n <div className=\"p-2 border-b border-gray-200\">\n <button onClick={createNote}\n className=\"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-1.5 text-sm font-medium hover:bg-blue-700 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n New Note\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {notes.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8 px-4\">No notes yet. Create one to get started.</p>\n ) : (\n notes.map(n => {\n const c = getColor(n.color);\n return (\n <button key={n.id} onClick={() => selectNote(n)}\n className={`w-full text-left px-3 py-2.5 border-b border-gray-100 transition-colors ${selectedId === n.id ? 'bg-blue-50' : 'hover:bg-gray-50'}`}>\n <div className=\"flex items-center gap-2\">\n <div className={`w-2.5 h-2.5 rounded-full shrink-0 ${c.dot}`} />\n <span className=\"text-sm font-medium text-gray-900 truncate flex-1\">\n {n.title || 'Untitled'}\n </span>\n {n.sticky && (\n <svg className=\"h-3 w-3 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n )}\n </div>\n <p className=\"text-xs text-gray-400 mt-0.5 truncate ml-4.5\">{n.content.replace(/\\[[ xX]?\\]/g, '').slice(0, 60) || 'Empty note'}</p>\n <p className=\"text-[10px] text-gray-300 mt-0.5 ml-4.5\">{timeAgo(n.updated_at)}</p>\n </button>\n );\n })\n )}\n </div>\n </div>\n\n {/* Editor */}\n {selectedId ? (\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Title */}\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-gray-200\">\n <input\n value={editTitle}\n onChange={e => { setEditTitle(e.target.value); setDirty(true); }}\n placeholder=\"Note title...\"\n className=\"flex-1 text-lg font-semibold text-gray-900 outline-none bg-transparent placeholder:text-gray-300\"\n />\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {COLORS.map(c => (\n <button key={c.key} onClick={() => { setEditColor(c.key); setDirty(true); }}\n className={`w-5 h-5 rounded-full border-2 transition-all ${c.dot} ${editColor === c.key ? 'border-gray-600 scale-110' : 'border-transparent hover:border-gray-400'}`}\n title={c.key} />\n ))}\n </div>\n {/* Sticky toggle */}\n <button onClick={() => toggleSticky(selectedId)} title={selected?.sticky ? 'Remove from desktop' : 'Pin to desktop'}\n className={`p-1 rounded transition-colors ${selected?.sticky ? 'text-amber-500 hover:text-amber-600' : 'text-gray-300 hover:text-amber-400'}`}>\n <svg className=\"h-4 w-4\" fill={selected?.sticky ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n </button>\n {/* Delete */}\n <button onClick={() => deleteNote(selectedId)} title=\"Delete note\"\n className=\"p-1 rounded text-gray-300 hover:text-red-500 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n </div>\n {/* Content — toggle between textarea (edit) and rendered view */}\n {editing ? (\n <textarea\n ref={textareaRef}\n value={editContent}\n onChange={e => { setEditContent(e.target.value); setDirty(true); }}\n onBlur={stopEditing}\n placeholder={PLACEHOLDER_HINT}\n className=\"flex-1 p-4 text-sm text-gray-700 outline-none resize-none bg-transparent leading-relaxed placeholder:text-gray-300 font-mono\"\n />\n ) : (\n <div\n onClick={startEditing}\n className=\"flex-1 p-4 text-sm text-gray-700 overflow-y-auto leading-relaxed cursor-text\"\n >\n {editContent ? renderContent(editContent) : (\n <p className=\"text-gray-300 whitespace-pre-line\">{PLACEHOLDER_HINT}</p>\n )}\n </div>\n )}\n {/* Bottom hint bar */}\n <div className=\"px-4 py-1.5 border-t border-gray-100 flex items-center gap-4 text-[10px] text-gray-400\">\n <span>[] checkbox</span>\n <span>SO#35001 entity link</span>\n <span className=\"ml-auto\">{editing ? 'Editing' : 'Click to edit'}</span>\n </div>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center text-gray-400\">\n <svg className=\"h-12 w-12 mx-auto mb-3 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n <p className=\"text-sm\">Select a note or create a new one</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|