From d2c5f7eb595202fed9975962f7514610cbe47d6e Mon Sep 17 00:00:00 2001 From: Wrench <0eabe6ea5758c1e4c5b68cea4ac42b32c479072883cb28da8110b4a47c32b9a1@buzz.block.builderlab.xyz> Date: Wed, 26 Aug 2026 11:26:13 -0400 Subject: [PATCH] fix(desktop): disclose requested channel lifetime Co-authored-by: Wrench <0eabe6ea5758c1e4c5b68cea4ac42b32c479072883cb28da8110b4a47c32b9a1@buzz.block.builderlab.xyz> Signed-off-by: Wrench <0eabe6ea5758c1e4c5b68cea4ac42b32c479072883cb28da8110b4a47c32b9a1@buzz.block.builderlab.xyz> --- .../ui/ProjectChannelRequestDialog.test.mjs | 41 +++++++++ .../ui/ProjectChannelRequestDialog.tsx | 86 +++++++++++-------- 2 files changed, 91 insertions(+), 36 deletions(-) create mode 100644 desktop/src/features/projects/ui/ProjectChannelRequestDialog.test.mjs diff --git a/desktop/src/features/projects/ui/ProjectChannelRequestDialog.test.mjs b/desktop/src/features/projects/ui/ProjectChannelRequestDialog.test.mjs new file mode 100644 index 0000000000..1e4a30f210 --- /dev/null +++ b/desktop/src/features/projects/ui/ProjectChannelRequestDialog.test.mjs @@ -0,0 +1,41 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import React from "react"; +import { renderToStaticMarkup } from "react-dom/server"; + +import { ProjectChannelRequestDetails } from "./ProjectChannelRequestDialog.tsx"; + +function request(overrides = {}) { + return { + homeChannelId: "11111111-1111-4111-8111-111111111111", + name: "release-planning", + visibility: "private", + ...overrides, + }; +} + +test("owner review shows an agent-requested temporary channel lifetime and cleanup consequence", () => { + const html = renderToStaticMarkup( + React.createElement(ProjectChannelRequestDetails, { + request: request({ ttlSeconds: 90_000 }), + }), + ); + + assert.match(html, />Lifetime); + assert.match(html, /Temporary · 1d1h/); + assert.match( + html, + /Cleans up automatically after that period of inactivity\./, + ); +}); + +test("owner review omits temporary-channel lifetime when none was requested", () => { + const html = renderToStaticMarkup( + React.createElement(ProjectChannelRequestDetails, { request: request() }), + ); + + assert.doesNotMatch(html, />Lifetime); + assert.doesNotMatch(html, /Temporary/); + assert.doesNotMatch(html, /Cleans up automatically/); +}); diff --git a/desktop/src/features/projects/ui/ProjectChannelRequestDialog.tsx b/desktop/src/features/projects/ui/ProjectChannelRequestDialog.tsx index 632d65c4ae..c08c5b3f52 100644 --- a/desktop/src/features/projects/ui/ProjectChannelRequestDialog.tsx +++ b/desktop/src/features/projects/ui/ProjectChannelRequestDialog.tsx @@ -8,8 +8,57 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/shared/ui/alert-dialog"; +import { formatTtlDuration } from "@/features/channels/lib/ephemeralChannel"; +import type { ProjectChannelRequest } from "@/features/projects/projectChannelRequest"; import { useProjectChannelRequests } from "@/features/projects/useProjectChannelRequests"; +type RequestedChannel = ProjectChannelRequest["request"]; + +/** Details an owner reviews before approving an agent-requested project channel. */ +export function ProjectChannelRequestDetails({ + request, +}: { + request: RequestedChannel; +}) { + return ( +
{management.error}
) : null}