mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-06 00:47:47 +00:00
insert link in mail
This commit is contained in:
@@ -1,6 +1,24 @@
|
||||
import { buildMeetingMessage } from "./lib/meeting-message.js";
|
||||
|
||||
console.log("[meeting-link] background loaded at", new Date().toISOString());
|
||||
|
||||
browser.runtime.onMessage.addListener((msg, sender) => {
|
||||
console.log("[meeting-link] background received bite:", msg);
|
||||
return Promise.resolve({ ok: true });
|
||||
});
|
||||
// Hardcoded for Spike 1. Spike 2 replaces this with a fetch() to your API.
|
||||
const STUB_MEETING_DATA = {
|
||||
url: "https://meet.example.com/m/abc-123-xyz",
|
||||
telephony: {
|
||||
phone_number: "+33123456789",
|
||||
pin_code: "1234567890",
|
||||
},
|
||||
};
|
||||
|
||||
browser.runtime.onMessage.addListener(async (msg) => {
|
||||
if (msg?.type === "GET_MEETING_MESSAGE") {
|
||||
try {
|
||||
const built = buildMeetingMessage(STUB_MEETING_DATA);
|
||||
return { ok: true, ...built };
|
||||
} catch (err) {
|
||||
console.error("[meeting-link] build failed", err);
|
||||
return { ok: false, error: String(err.message || err) };
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -10,7 +10,8 @@
|
||||
}
|
||||
},
|
||||
"background": {
|
||||
"scripts": ["background.js"]
|
||||
"scripts": ["background.js"],
|
||||
"type": "module"
|
||||
},
|
||||
"compose_action": {
|
||||
"default_title": "Insert meeting link",
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Meeting link</title>
|
||||
</head>
|
||||
<body style="font: 13px system-ui; padding: 12px; min-width: 220px;">
|
||||
<button id="go">Hello from popup</button>
|
||||
<div id="status" style="margin-top: 8px; color: #555;"></div>
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Meeting link</title>
|
||||
<style>
|
||||
body { font: 13px system-ui; padding: 12px; min-width: 240px; margin: 0; }
|
||||
button { font: inherit; padding: 6px 12px; cursor: pointer; }
|
||||
#status { margin-top: 8px; color: #555; min-height: 1.2em; white-space: pre-wrap; }
|
||||
#status.error { color: #b00020; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<button id="insert">Insert meeting link</button>
|
||||
<div id="status"></div>
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,6 +1,65 @@
|
||||
document.getElementById("go").addEventListener("click", async () => {
|
||||
console.log("[meeting-link] popup button clicked");
|
||||
const reply = await browser.runtime.sendMessage({ type: "PING" });
|
||||
document.getElementById("status").textContent =
|
||||
"background replied: " + JSON.stringify(reply);
|
||||
const insertBtn = document.getElementById("insert");
|
||||
const statusEl = document.getElementById("status");
|
||||
|
||||
function setStatus(text, isError = false) {
|
||||
statusEl.textContent = text;
|
||||
statusEl.classList.toggle("error", isError);
|
||||
}
|
||||
|
||||
insertBtn.addEventListener("click", async () => {
|
||||
insertBtn.disabled = true;
|
||||
setStatus("Generating link…");
|
||||
|
||||
try {
|
||||
// 1. Find the compose tab this popup belongs to.
|
||||
// A compose_action popup is anchored to a compose window, so the
|
||||
// "active tab in the current window" is the compose tab itself.
|
||||
const [composeTab] = await browser.tabs.query({
|
||||
active: true,
|
||||
currentWindow: true,
|
||||
});
|
||||
if (!composeTab) throw new Error("No compose tab found");
|
||||
|
||||
// 2. Read the current compose state — we need to know if we're
|
||||
// in HTML mode or plain-text mode, and we need the existing body
|
||||
// so we can append rather than overwrite.
|
||||
const details = await browser.compose.getComposeDetails(composeTab.id);
|
||||
|
||||
// 3. Ask the background to produce the meeting message.
|
||||
const reply = await browser.runtime.sendMessage({
|
||||
type: "GET_MEETING_MESSAGE",
|
||||
});
|
||||
if (!reply?.ok) throw new Error(reply?.error || "Background error");
|
||||
|
||||
// 4. Append to the existing body in the right format.
|
||||
if (details.isPlainText) {
|
||||
const newBody = (details.plainTextBody || "") + "\n\n" + reply.text;
|
||||
await browser.compose.setComposeDetails(composeTab.id, {
|
||||
plainTextBody: newBody,
|
||||
});
|
||||
} else {
|
||||
const newBody = appendHtmlBeforeBodyEnd(details.body || "", reply.html);
|
||||
await browser.compose.setComposeDetails(composeTab.id, {
|
||||
body: newBody,
|
||||
});
|
||||
}
|
||||
|
||||
setStatus("Inserted ✓");
|
||||
setTimeout(() => window.close(), 600);
|
||||
} catch (err) {
|
||||
console.error("[meeting-link] popup insert failed", err);
|
||||
setStatus("Failed: " + (err.message || err), true);
|
||||
insertBtn.disabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Append HTML right before </body>, or fall back to concatenation if no
|
||||
* </body> tag is present (Thunderbird's compose body is usually a full
|
||||
* HTML document, but be defensive).
|
||||
*/
|
||||
function appendHtmlBeforeBodyEnd(currentHtml, fragment) {
|
||||
const idx = currentHtml.toLowerCase().lastIndexOf("</body>");
|
||||
if (idx === -1) return currentHtml + fragment;
|
||||
return currentHtml.slice(0, idx) + fragment + currentHtml.slice(idx);
|
||||
}
|
||||
Reference in New Issue
Block a user