import React, { createRef } from "react"
import ReactDOM from "react-dom"
import { Transition, animated, config } from "react-spring/renderprops"
import Bubble from "./components/Bubble"
import Popup from "components/Popup"
import { createServiceFinder } from "utils/urlMatcher"
import remoteServices from "./remoteServices"
import { ContentMessenger } from "utils/messaging"
import "../css/content.scss"
import { getSettings } from "./utils/browser"
const popupRef = createRef()
let findService
getSettings().then((settings) => {
findService = createServiceFinder(remoteServices, settings.hostOverrides)(document)
})
chrome.runtime.onConnect.addListener(function (port) {
const messenger = new ContentMessenger(port)
function clickHandler(event) {
if (event.target.closest(".moco-bx-bubble")) {
event.stopPropagation()
messenger.postMessage({ type: "togglePopup" })
}
}
port.onDisconnect.addListener(() => {
messenger.stop()
window.removeEventListener("click", clickHandler, true)
})
function updateBubble({ service, bookedSeconds, settingTimeTrackingHHMM, timedActivity } = {}) {
if (!document.getElementById("moco-bx-root")) {
const domRoot = document.createElement("div")
domRoot.setAttribute("id", "moco-bx-root")
document.body.appendChild(domRoot)
window.addEventListener("click", clickHandler, true)
}
ReactDOM.render(
{(service) =>
service &&
// eslint-disable-next-line react/display-name
((props) => (
))
}
,
document.getElementById("moco-bx-root"),
)
}
function openPopup(payload) {
if (!document.getElementById("moco-bx-popup-root")) {
const domRoot = document.createElement("div")
domRoot.setAttribute("id", "moco-bx-popup-root")
document.body.appendChild(domRoot)
}
ReactDOM.render(
,
document.getElementById("moco-bx-popup-root"),
)
}
function closePopup() {
const domRoot = document.getElementById("moco-bx-popup-root")
if (domRoot) {
ReactDOM.unmountComponentAtNode(domRoot)
domRoot.remove()
}
}
messenger.on("requestService", () => {
const service = findService(window.location.href)
messenger.postMessage({
type: "newService",
payload: { isOpen: !!popupRef.current, service },
})
})
messenger.on("showBubble", ({ payload }) => {
updateBubble(payload)
})
messenger.on("hideBubble", () => {
updateBubble()
})
messenger.on("openPopup", ({ payload }) => {
openPopup(payload)
})
messenger.on("closePopup", () => {
closePopup()
})
})