Skip to content
Snippets Groups Projects
main.ts 3.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • Midhun Suresh's avatar
    Midhun Suresh committed
    import type { IChatterboxConfig } from "./types/IChatterboxConfig";
    
    import { Platform, createRouter, Navigation } from "hydrogen-view-sdk";
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    import { RootViewModel } from "./viewmodels/RootViewModel";
    import { RootView } from "./ui/views/RootView";
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    import downloadSandboxPath from "hydrogen-view-sdk/download-sandbox.html?url";
    import workerPath from "hydrogen-view-sdk/main.js?url";
    import olmWasmPath from "@matrix-org/olm/olm.wasm?url";
    import olmJsPath from "@matrix-org/olm/olm.js?url";
    import olmLegacyJsPath from "@matrix-org/olm/olm_legacy.js?url";
    const assetPaths = {
        downloadSandbox: downloadSandboxPath,
        worker: workerPath,
        olm: {
            wasm: olmWasmPath,
            legacyBundle: olmLegacyJsPath,
            wasmBundle: olmJsPath,
        },
    };
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    
    
    const rootDivId = "#chatterbox";
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    
    
    async function fetchConfig(): Promise<IChatterboxConfig> {
        const queryParams = new URLSearchParams(window.location.search);
        const configLink = queryParams.get("config");
    
    Midhun Suresh's avatar
    Midhun Suresh committed
        if (!configLink) {
            throw new Error("Root element does not have config specified");
        }
        const config: IChatterboxConfig = await (await fetch(configLink)).json();
        return config;
    }
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
    function shouldStartMinimized(): boolean {
        return !!new URLSearchParams(window.location.search).get("minimized");
    }
    
    
    async function main() {
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
        hideOnError();
    
        const root = document.querySelector(rootDivId) as HTMLDivElement;
        if (!root) {
            throw new Error("No element with id as 'chatterbox' found!");
    
        root.className = "hydrogen";
    
        const config = await fetchConfig();
    
        const platform = new Platform({container: root, assetPaths, config: {}, options: { development: import.meta.env.DEV }});
    
        const navigation = new Navigation(allowsChild);
    
    Midhun Suresh's avatar
    Midhun Suresh committed
        platform.setNavigation(navigation);
        const urlRouter = createRouter({ navigation, history: platform.history });
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
        const startMinimized = shouldStartMinimized();
        const rootViewModel = new RootViewModel(config, {platform, navigation, urlCreator: urlRouter, startMinimized});
    
        rootViewModel.start();
    
    Midhun Suresh's avatar
    Midhun Suresh committed
        const rootView = new RootView(rootViewModel);
        root.appendChild(rootView.mount());
    
    function allowsChild(parent, child) {
    
        const { type } = child;
        switch (parent?.type) {
            case undefined:
                return type === "start" || type === "account-setup" || type === "timeline";
            default:
                return false;
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
    function hideOnError() {
        // When an error occurs, log it and then hide everything!
        const handler = e => {
            if (e.message === "ResizeObserver loop completed with undelivered notifications." ||
                e.message === "ResizeObserver loop limit exceeded") {
                // see https://stackoverflow.com/a/64257593
                e.stopImmediatePropagation();
                return false;
            }
            console.error(e.error ?? e.reason);
            (window as any).sendError();
            return false;
        };
        window.addEventListener("error", handler, true);
        window.addEventListener("unhandledrejection", handler, true);
    }
    
    
    
    (window as any).sendViewChangeToParent = function (view: "timeline" | "account-setup") {
        window.parent?.postMessage({
            action: "resize-iframe",
            view
    
    Midhun Suresh's avatar
    Midhun Suresh committed
        }, "*");
    
    };
    
    (window as any).sendMinimizeToParent = function () {
    
    Midhun Suresh's avatar
    Midhun Suresh committed
        window.parent?.postMessage({ action: "minimize" }, "*");
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    };
    
    Midhun Suresh's avatar
    Midhun Suresh committed
    
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
    (window as any).sendNotificationCount = function (count: number) {
        window.parent?.postMessage({ action: "unread-message", count }, "*");
    };
    
    
    RMidhunSuresh's avatar
    RMidhunSuresh committed
    (window as any).sendError = function () {
        window.parent?.postMessage({ action: "error" }, "*");
    };