# sync-basalam/1.8.5/assets/chat/widget-loader.js

ووسلام – همگام سازی ووکامرس و باسلام, version 1.8.5. 204 lines.

- Page: https://pluginprobe.com/plugins/sync-basalam/1.8.5/code/assets/chat/widget-loader.js
- Raw: https://pluginprobe.com/plugins/sync-basalam/1.8.5/raw/assets/chat/widget-loader.js
- Modified: 2026-05-10T09:39:58+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/sync-basalam/1.8.5/code/assets/chat/widget-loader.js#L10-L20`.

```javascript
(function () {
  const MIN_WIDGET_WIDTH = 1024;
  const currentScript = document.currentScript;

  const config = {
    apiBaseUrl: {
      core: "https://gateway.hamsalam.ir/core",
      conversation: "https://gateway.hamsalam.ir/conversation",
      auth: "https://gateway.hamsalam.ir/auth",
      review: "https://gateway.hamsalam.ir/review",
      story: "https://gateway.hamsalam.ir/story",
      userActivity: "https://gateway.hamsalam.ir/user-activity",
      featureFlag: "https://gateway.hamsalam.ir/feature-flag",
      orderProcessing: "https://gateway.hamsalam.ir/order-processing",
      uploadio: "https://gateway.hamsalam.ir/uploadio",
      automation: "https://gateway.hamsalam.ir/automation",
      voucher: "https://gateway.hamsalam.ir/voucher",
      notification: "https://gateway.hamsalam.ir/notification",
      appsApi: "https://gateway.hamsalam.ir/apps-api",
      chat: "https://gateway.hamsalam.ir/chat",
      orderTest2: "https://gateway.hamsalam.ir/order-test2",
    },
    forcedDeviceType: "mobile",
    buttonText: "Chat",
    buttonIcon: null,
    buttonSize: "60px",
    buttonColor: "#ff5c35",
    buttonTextColor: "#fff",
    clickOutsideClose: true,
    widgetStyle: {
      left : "20px",
      right: "auto",
      height: "630px",
    },
    ...window.dalanWidgetConfig,
  };

  for (const attr of currentScript.attributes) {
    if (attr.name === "src") continue;
    config[attr.name] = attr.value;
  }

  window.dalanWidgetConfig = config;

  const scriptSrc = currentScript.src;
  const basePath = scriptSrc.substring(0, scriptSrc.lastIndexOf("/") + 1);

  if (!config.buttonIcon) {
    config.buttonIcon = basePath + "../icons/chat.svg";
  }

  let assetsLoaded = false;
  let scriptLoaded = false;
  let widgetButton = null;

  function isDesktopViewport() {
    return window.innerWidth >= MIN_WIDGET_WIDTH;
  }

  function getMountFunction() {
    return (
      window.mountChatWidget ||
      (window.ChatWidget && window.ChatWidget.mountChatWidget)
    );
  }

  function getUnmountFunction() {
    return (
      window.unmountChatWidget ||
      (window.ChatWidget && window.ChatWidget.unmountChatWidget)
    );
  }

  function removeWidget() {
    const isOpen = !!document.querySelector("#dalan-chat-root");
    const unmount = getUnmountFunction();

    if (isOpen && unmount) {
      unmount();
    }

    if (widgetButton) {
      widgetButton.remove();
      widgetButton = null;
    }
  }

  function createWidgetButton() {
    if (!isDesktopViewport() || widgetButton || !scriptLoaded) {
      return;
    }

    const button = document.createElement("button");
    button.id = "dalan-chat-button";

    if (config.buttonIcon) {
      const icon = document.createElement("img");
      icon.src = config.buttonIcon;
      icon.alt = "Chat";
      Object.assign(icon.style, {
        width: "30px",
        height: "30px",
        display: "block",
      });
      button.appendChild(icon);
    } else {
      button.innerText = config.buttonText;
    }

    Object.assign(button.style, {
      position: "fixed",
      bottom: config.buttonBottom || "20px",
      left: config.buttonRight || "20px",
      borderRadius: "50%",
      width: config.buttonSize,
      height: config.buttonSize,
      fontSize: "24px",
      background: config.buttonColor,
      color: config.buttonTextColor,
      border: "none",
      cursor: "pointer",
      zIndex: 9999,
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
    });

    button.onclick = () => {
      const isOpen = !!document.querySelector("#dalan-chat-root");
      const unmount = getUnmountFunction();
      const mount = getMountFunction();

      if (isOpen && unmount) {
        unmount();
      } else if (mount) {
        mount(window.dalanWidgetConfig);
      } else {
        console.error("mountChatWidget function not found!");
      }
    };

    document.body.appendChild(button);
    widgetButton = button;
  }

  function initWidget() {
    if (assetsLoaded) {
      createWidgetButton();
      return;
    }

    assetsLoaded = true;

    const cssLink = document.createElement("link");
    cssLink.rel = "stylesheet";
    cssLink.href = basePath + "dalan.css";
    document.head.appendChild(cssLink);

    const script = document.createElement("script");
    script.src = basePath + "chat-app-bundle.js";

    script.onerror = (error) => {
      console.error("Failed to load chat widget bundle:", error);
      console.error("Script source:", script.src);
    };

    script.onload = () => {
      scriptLoaded = true;
      createWidgetButton();
    };

    document.body.appendChild(script);
  }

  function updateWidgetVisibility() {
    if (!isDesktopViewport()) {
      removeWidget();
      return;
    }

    initWidget();
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", updateWidgetVisibility);
  } else {
    updateWidgetVisibility();
  }

  if (window.matchMedia) {
    const desktopMediaQuery = window.matchMedia(
      `(min-width: ${MIN_WIDGET_WIDTH}px)`
    );

    if (desktopMediaQuery.addEventListener) {
      desktopMediaQuery.addEventListener("change", updateWidgetVisibility);
    } else if (desktopMediaQuery.addListener) {
      desktopMediaQuery.addListener(updateWidgetVisibility);
    }
  } else {
    window.addEventListener("resize", updateWidgetVisibility);
  }
})();

```
