()
| 422 | } |
| 423 | |
| 424 | async function mountShareCopilot() { |
| 425 | if (!token || !shareAiEnabled) return; |
| 426 | const publicAiConfig = await loadPublicAiConfig(); |
| 427 | if (!publicAiConfig.enabled) return; |
| 428 | |
| 429 | const card = createShareCopilotCard(); |
| 430 | const launcherSubtitleEl = card.querySelector('.fr-share-ai-launcher-subtitle'); |
| 431 | const openBtn = card.querySelector('.fr-share-ai-open'); |
| 432 | const backdropEl = card.querySelector('.fr-share-ai-backdrop'); |
| 433 | const closeBtn = card.querySelector('.fr-share-ai-close'); |
| 434 | const subtitleEl = card.querySelector('.fr-share-copilot-subtitle'); |
| 435 | const suggestionsEl = card.querySelector('.fr-share-copilot-suggestions'); |
| 436 | const logEl = card.querySelector('.fr-share-copilot-log'); |
| 437 | const formEl = card.querySelector('.fr-share-copilot-form'); |
| 438 | const inputEl = card.querySelector('.fr-share-copilot-input'); |
| 439 | const submitBtn = formEl ? formEl.querySelector('button[type="submit"]') : null; |
| 440 | const metaEl = card.querySelector('.fr-share-copilot-meta'); |
| 441 | |
| 442 | const mountTarget = uploadForm && uploadForm.closest('.fr-share-card') |
| 443 | ? uploadForm.closest('.fr-share-card') |
| 444 | : document.querySelector('.fr-share-toolbar') || document.querySelector('.fr-share-card-wide'); |
| 445 | if (mountTarget && mountTarget.parentNode) { |
| 446 | if (mountTarget.nextSibling) { |
| 447 | mountTarget.parentNode.insertBefore(card, mountTarget.nextSibling); |
| 448 | } else { |
| 449 | mountTarget.parentNode.appendChild(card); |
| 450 | } |
| 451 | } |
| 452 | |
| 453 | const defaultSubtitle = hideListing || shareMode === 'drop' |
| 454 | ? 'Ask about uploads, access, or what this share is for.' |
| 455 | : 'Ask AI to explain this share, search visible text files, summarize them, or compare two files.'; |
| 456 | const launcherSubtitle = hideListing || shareMode === 'drop' |
| 457 | ? 'Upload-only and hidden-listing shares work best for access and upload questions.' |
| 458 | : 'Useful for quick lookups, “which file mentions X?” questions, and summaries without manual clicking.'; |
| 459 | if (launcherSubtitleEl) launcherSubtitleEl.textContent = launcherSubtitle; |
| 460 | if (subtitleEl) subtitleEl.textContent = defaultSubtitle; |
| 461 | |
| 462 | const defaultSuggestions = hideListing || shareMode === 'drop' |
| 463 | ? ['What is this share for?', 'How do I upload files here?'] |
| 464 | : ['Summarize the visible files here', 'Which file mentions backup?', 'Compare test.md and notes.md']; |
| 465 | |
| 466 | function openModal() { |
| 467 | if (!backdropEl) return; |
| 468 | backdropEl.hidden = false; |
| 469 | document.body.classList.add('fr-share-ai-modal-open'); |
| 470 | if (inputEl) { |
| 471 | window.setTimeout(function () { |
| 472 | inputEl.focus(); |
| 473 | }, 0); |
| 474 | } |
| 475 | } |
| 476 | |
| 477 | function closeModal() { |
| 478 | if (!backdropEl) return; |
| 479 | backdropEl.hidden = true; |
| 480 | document.body.classList.remove('fr-share-ai-modal-open'); |
| 481 | } |
no test coverage detected