Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
650 changes: 650 additions & 0 deletions capsules/archive-manager/browser/archive-manager.js

Large diffs are not rendered by default.

653 changes: 1 addition & 652 deletions capsules/archive-manager/browser/index.html

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions capsules/chat-room/browser/chat-access.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const homeLaunchToken = new URLSearchParams(window.location.hash.replace(/^#/, "")).get("home_token") || "";
const homeOrigin = new URLSearchParams(window.location.search).get("home_origin") || "";
const accessMode = homeLaunchToken
? "shell"
: "gateway";
document.body.setAttribute("data-room-access-mode", accessMode);
143 changes: 143 additions & 0 deletions capsules/chat-room/browser/chat-chrome.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
(function () {
const launchParams = new URLSearchParams(window.location.search);
const homeToken = new URLSearchParams(window.location.hash.replace(/^#/, "")).get("home_token") || "";
const homeParentOrigin = launchParams.get("home_origin") || "";
const participantToggle = document.getElementById("participant-toggle");
const roomAccessToggle = document.getElementById("room-access-toggle");
const conversationSelector = document.getElementById("conversation-selector");
const conversationJoinSection = document.getElementById("conversation-join-section");
const composerForm = document.getElementById("composer-form");
const composerField = composerForm?.querySelector(".composer-field") || null;
const messageInput = document.getElementById("message-input");
let homeReadySent = false;
let lastMenuManifest = "";

function canUseAccessSettings() {
return !!roomAccessToggle && !roomAccessToggle.hidden && !roomAccessToggle.disabled;
}

function currentMenuManifest() {
const viewItems = [
{ label: "People", cmd: "view-people" },
];
if (canUseAccessSettings()) {
viewItems.push({ label: "Access Settings", cmd: "view-access-settings" });
}
return {
type: "home:menu-manifest",
homeToken,
menus: [
{
title: "File",
items: [
{ label: "Close Window", cmd: "__close-window" },
],
},
{
title: "View",
items: viewItems,
},
],
};
}

function announceHomeChrome() {
if (!homeToken || !homeParentOrigin || window.top === window) {
return;
}
if (!homeReadySent) {
window.top.postMessage({ type: "home:app-ready", homeToken }, homeParentOrigin);
homeReadySent = true;
}
const manifest = currentMenuManifest();
const nextMenuManifest = JSON.stringify(manifest);
if (nextMenuManifest === lastMenuManifest) {
return;
}
lastMenuManifest = nextMenuManifest;
window.top.postMessage(manifest, homeParentOrigin);
}

function syncCompactConversationRail() {
if (!conversationSelector || !conversationJoinSection) {
return;
}
const choiceCount = conversationSelector.querySelectorAll("[data-conversation-choice]").length;
const canHideCompactRail = choiceCount < 2 && conversationJoinSection.hidden;
document.body.setAttribute("data-room-compact-rail", canHideCompactRail ? "hidden" : "visible");
}

function syncComposerPresentation() {
if (!messageInput || !composerField) {
return;
}
const lineHeight = Number.parseFloat(globalThis.getComputedStyle(messageInput).lineHeight) || 0;
messageInput.style.height = "auto";
const nextHeight = Math.min(messageInput.scrollHeight || 0, 132);
if (nextHeight > 0) {
messageInput.style.height = `${nextHeight}px`;
}
composerField.dataset.multiline = (
messageInput.value.includes("\n") || nextHeight > lineHeight * 2
) ? "true" : "false";
}

function isTrustedHomeMenuEvent(event) {
return event.origin === "null" && event.source === window.parent;
}

function clickExistingControl(id) {
const node = document.getElementById(id);
if (node instanceof HTMLElement) {
node.click();
}
}

announceHomeChrome();
syncCompactConversationRail();
syncComposerPresentation();

if (messageInput) {
messageInput.addEventListener("input", syncComposerPresentation);
}

if (roomAccessToggle) {
new MutationObserver(() => {
announceHomeChrome();
}).observe(roomAccessToggle, {
attributes: true,
attributeFilter: ["hidden", "disabled"],
});
}

if (conversationSelector) {
new MutationObserver(syncCompactConversationRail).observe(conversationSelector, {
childList: true,
subtree: true,
});
}

if (conversationJoinSection) {
new MutationObserver(syncCompactConversationRail).observe(conversationJoinSection, {
attributes: true,
attributeFilter: ["hidden"],
});
}

window.addEventListener("message", (event) => {
if (!isTrustedHomeMenuEvent(event)) {
return;
}
const message = event.data;
if (message?.type !== "elastos:menu-command" || typeof message.cmd !== "string") {
return;
}
if (message.cmd === "view-people") {
clickExistingControl("participant-toggle");
return;
}
if (message.cmd === "view-access-settings" && canUseAccessSettings()) {
clickExistingControl("room-access-toggle");
}
});
})();
28 changes: 28 additions & 0 deletions capsules/chat-room/browser/chat-emoji.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
(function () {
const toggle = document.getElementById("emoji-toggle");
const popover = document.getElementById("emoji-popover");
if (!toggle || !popover) return;

function setOpen(open) {
popover.hidden = !open;
toggle.setAttribute("aria-expanded", open ? "true" : "false");
}

toggle.addEventListener("click", (event) => {
event.preventDefault();
setOpen(popover.hidden);
});
popover.addEventListener("click", (event) => {
if (event.target.closest(".emoji-chip")) setOpen(false);
});
document.addEventListener("keydown", (event) => {
if (event.key === "Escape" && !popover.hidden) {
setOpen(false);
toggle.focus();
}
});
document.addEventListener("pointerdown", (event) => {
if (popover.hidden || toggle.contains(event.target) || popover.contains(event.target)) return;
setOpen(false);
});
})();
25 changes: 25 additions & 0 deletions capsules/chat-room/browser/chat-room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { createHomeNavigationClient } from "/apps/home/home-navigation-client.js";
import {
createHomeClipboardClient,
} from "/apps/home/home-clipboard-client.js?v=home-20260726a";
import init from "./chat_room_ui.js?v=chat-room-ui-20260804a";

const chatLaunchParams = new URLSearchParams(window.location.search);
const chatHomeToken = new URLSearchParams(window.location.hash.replace(/^#/, "")).get("home_token") || "";
if (chatHomeToken) {
const homeNavigation = createHomeNavigationClient({ homeToken: chatHomeToken,
homeOrigin: chatLaunchParams.get("home_origin") || "" });
globalThis.elastosChatNavigation = (query) => homeNavigation.setQuery(query);
const homeClipboard = createHomeClipboardClient({
targetId: "chat-room",
homeOrigin: chatLaunchParams.get("home_origin") || "",
homeToken: chatHomeToken,
});
homeClipboard.start();
globalThis.elastosChatCopyInvite = (text) => homeClipboard.writeText(text, {
purpose: "conversation.invite",
});
init({
module_or_path: new URL("./chat_room_ui_bg.wasm?v=chat-room-ui-20260804a", import.meta.url),
});
}
Loading
Loading