64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import PQueue from "p-queue";
|
|
|
|
let ports: chrome.runtime.Port[] = [];
|
|
const queue = new PQueue({ concurrency: 1 });
|
|
|
|
chrome.runtime.onConnect.addListener((port) => {
|
|
ports.push(port);
|
|
port.onDisconnect.addListener(() => {
|
|
ports = ports.filter((p) => p !== port);
|
|
});
|
|
});
|
|
|
|
(() => {
|
|
const evtSource = new EventSource(
|
|
`${import.meta.env.VITE_API_URL}/products/publist-stream`
|
|
);
|
|
|
|
evtSource.onmessage = (event) => {
|
|
const data = JSON.parse(event.data);
|
|
console.log("New event:", data);
|
|
queue.add(() => handlePublish(data));
|
|
};
|
|
|
|
evtSource.onerror = (err) => {
|
|
console.error("EventSource failed:", err);
|
|
};
|
|
})();
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
async function handlePublish(data: any) {
|
|
return new Promise<void>((resolve) => {
|
|
chrome.tabs.create(
|
|
{ url: "https://www.facebook.com/marketplace/create/item", active: true },
|
|
(tab) => {
|
|
if (!tab?.id) return resolve();
|
|
const tabId = tab.id;
|
|
|
|
const onConnectListener = (port: chrome.runtime.Port) => {
|
|
if (port.sender?.tab?.id === tabId) {
|
|
port.postMessage({ type: "publist-event", payload: data });
|
|
chrome.runtime.onConnect.removeListener(onConnectListener);
|
|
}
|
|
};
|
|
chrome.runtime.onConnect.addListener(onConnectListener);
|
|
|
|
const onTabClosed = (closedTabId: number) => {
|
|
if (closedTabId === tabId) {
|
|
chrome.tabs.onRemoved.removeListener(onTabClosed);
|
|
resolve(); // Chỉ resolve khi tab này đã đóng
|
|
}
|
|
};
|
|
chrome.tabs.onRemoved.addListener(onTabClosed);
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
chrome.runtime.onMessage.addListener((message, sender) => {
|
|
if (message.type === "close-tab") {
|
|
const tabId = sender.tab?.id;
|
|
if (tabId) chrome.tabs.remove(tabId);
|
|
}
|
|
});
|