From 112c9d58da9cdee538514f82c6567564d03dadbc Mon Sep 17 00:00:00 2001 From: Alois Date: Thu, 21 May 2026 21:33:34 +0200 Subject: [PATCH 1/6] (feat): improved chat ui --- packages/chat/src/components/message.tsx | 81 ++++++++++++++++++------ packages/chat/src/screen.tsx | 46 +++++++++----- packages/markdown/src/markdown.tsx | 3 +- 3 files changed, 93 insertions(+), 37 deletions(-) diff --git a/packages/chat/src/components/message.tsx b/packages/chat/src/components/message.tsx index e85d890..1bb0b43 100644 --- a/packages/chat/src/components/message.tsx +++ b/packages/chat/src/components/message.tsx @@ -3,54 +3,97 @@ import type { RawMessage } from "../values"; import Text from "@tensamin/markdown/text"; import { AlertTriangle } from "lucide-react"; -import { cn, Tooltip, TooltipContent, TooltipTrigger } from "@tensamin/ui"; -import { useIsMobile } from "@tensamin/ui"; +import { + Avatar, + AvatarFallback, + AvatarImage, + cn, + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@tensamin/ui"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@tensamin/ui"; +import Wrapper from "@tensamin/user/wrapper"; +import { useChat } from "../context"; function MessageComponent({ + grouped, message, }: { + grouped: boolean; message: RawMessage & { failed?: boolean; }; }) { - const isMobile = useIsMobile(); + const { userId } = useChat(); const actuallyFailed = message.failed && message.message_state === "awaiting"; return (
- {message.failed && message.message_state === "awaiting" && ( - - -

Failed to send message

-
- } /> -
- )} - + ( + <> + {grouped ? ( +

+ {new Date(message.send_time).toLocaleString([], { + hour: "2-digit", + minute: "2-digit", + })} +

+ ) : ( + + + + {user.display.slice(0, 2).toUpperCase()} + + + )} + {message.failed && message.message_state === "awaiting" && ( + + +

Failed to send message

+
+ } /> +
+ )} +
+ {!grouped && ( +
+

{user.display}

+

+ {new Date(message.send_time).toLocaleString([], { + hour: "2-digit", + minute: "2-digit", + })} +

+
+ )} + +
+ + )} + />
} /> diff --git a/packages/chat/src/screen.tsx b/packages/chat/src/screen.tsx index a23760d..fe69542 100644 --- a/packages/chat/src/screen.tsx +++ b/packages/chat/src/screen.tsx @@ -435,7 +435,7 @@ export default function Screen() {
-
- This is the start of your conversation with{" "} +
+ Conversation start
@@ -481,6 +481,13 @@ export default function Screen() { return null; } + const lastMessage = messages[messageIndex - 1]; + const isGrouped = + lastMessage && + lastMessage.sent_by_self === message.sent_by_self && + Math.round(lastMessage.send_time / 10000) === + Math.round(message.send_time / 10000); + return (
- +
); })} @@ -509,17 +515,25 @@ export default function Screen() { className="pointer-events-none absolute left-0 top-0 -z-10 overflow-hidden opacity-0" style={{ width: scrollWidth > 0 ? `${scrollWidth}px` : "100%" }} > - {messages.map((message) => ( -
{ - setMeasurementRef(message.send_time, element); - }} - style={{ padding: "4px 0" }} - > - -
- ))} + {messages.map((message, messageIndex) => { + const lastMessage = messages[messageIndex - 1]; + const isGrouped = + lastMessage && + lastMessage.sent_by_self === message.sent_by_self && + Math.round(lastMessage.send_time / 10000) === + Math.round(message.send_time / 10000); + + return ( +
{ + setMeasurementRef(message.send_time, element); + }} + > + +
+ ); + })}
); diff --git a/packages/markdown/src/markdown.tsx b/packages/markdown/src/markdown.tsx index 59d0a6a..46ebb92 100644 --- a/packages/markdown/src/markdown.tsx +++ b/packages/markdown/src/markdown.tsx @@ -560,7 +560,7 @@ export function renderBlocks(blocks: MarkdownBlock[]): React.ReactElement { } return ( -

+

{block.text.split("\n").map((line, lineIndex) => ( {lineIndex > 0 ?
: null} @@ -645,7 +645,6 @@ export const markdownStyles = ` .tm-md-h4 { font-size: 1.1rem; } .tm-md-h5 { font-size: 1rem; } .tm-md-h6 { font-size: 0.95rem; opacity: 0.9; } -.tm-md-p { margin: 0.25rem 0; } .tm-md-blockquote { margin: 0.45rem 0; padding-left: 0.75rem; opacity: 0.95; } .tm-md-blockquote p { margin: 0.2rem 0; } .tm-md-pre { margin: 0.45rem 0; padding: 0.65rem 0.75rem; border-radius: 0.5rem; background: hsl(var(--muted)); overflow-x: auto; } From aa811f4277b5f1df7a39ea7a90f247232cad2666 Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 22 May 2026 14:16:57 +0200 Subject: [PATCH 2/6] (fix): workflows running on pull requests --- .forgejo/workflows/deploy-dev.yml | 4 ++++ .forgejo/workflows/deploy-prod.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.forgejo/workflows/deploy-dev.yml b/.forgejo/workflows/deploy-dev.yml index ab7edf1..54d147a 100644 --- a/.forgejo/workflows/deploy-dev.yml +++ b/.forgejo/workflows/deploy-dev.yml @@ -5,6 +5,7 @@ on: jobs: build-web: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -38,6 +39,7 @@ jobs: run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-dev/ build-mobile: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -79,6 +81,7 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -112,6 +115,7 @@ jobs: path: apps/tauri/src-tauri/target/release/bundle/ release: + if: github.event_name != 'pull_request' runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml index 7cd9016..5894036 100644 --- a/.forgejo/workflows/deploy-prod.yml +++ b/.forgejo/workflows/deploy-prod.yml @@ -5,6 +5,7 @@ on: jobs: build-web: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -38,6 +39,7 @@ jobs: run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-prod/ build-mobile: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -79,6 +81,7 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: + if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -112,6 +115,7 @@ jobs: path: apps/tauri/src-tauri/target/release/bundle/ release: + if: github.event_name != 'pull_request' runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: From 370c3746f74dff9a5f67d691c112b15e6e9c7fea Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 22 May 2026 14:23:25 +0200 Subject: [PATCH 3/6] Added check workflow --- .forgejo/workflows/checks.yml | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 .forgejo/workflows/checks.yml diff --git a/.forgejo/workflows/checks.yml b/.forgejo/workflows/checks.yml new file mode 100644 index 0000000..27e9799 --- /dev/null +++ b/.forgejo/workflows/checks.yml @@ -0,0 +1,80 @@ +name: Checks + +on: + pull_request: + branches: + - main + - dev + +jobs: + build-web: + runs-on: docker + steps: + - name: Check out repo + uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build packages + run: bun run build:packages + + - name: Build web + run: bun run build:web + + build-mobile: + runs-on: docker + steps: + - name: Check out repo + uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build packages + run: bun run build:packages + + - name: Build mobile + run: bun run build:mobile + + build-desktop: + runs-on: docker + steps: + - name: Check out repo + uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build packages + run: bun run build:packages + + - name: Build desktop + run: bun run build:desktop From 6f5f88573a0a42762f1547444e7c5a8aeda777cc Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 22 May 2026 14:26:21 +0200 Subject: [PATCH 4/6] (fix): remove the if: from the workflows --- .forgejo/workflows/deploy-dev.yml | 4 ---- .forgejo/workflows/deploy-prod.yml | 4 ---- 2 files changed, 8 deletions(-) diff --git a/.forgejo/workflows/deploy-dev.yml b/.forgejo/workflows/deploy-dev.yml index 54d147a..ab7edf1 100644 --- a/.forgejo/workflows/deploy-dev.yml +++ b/.forgejo/workflows/deploy-dev.yml @@ -5,7 +5,6 @@ on: jobs: build-web: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -39,7 +38,6 @@ jobs: run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-dev/ build-mobile: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -81,7 +79,6 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -115,7 +112,6 @@ jobs: path: apps/tauri/src-tauri/target/release/bundle/ release: - if: github.event_name != 'pull_request' runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml index 5894036..7cd9016 100644 --- a/.forgejo/workflows/deploy-prod.yml +++ b/.forgejo/workflows/deploy-prod.yml @@ -5,7 +5,6 @@ on: jobs: build-web: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -39,7 +38,6 @@ jobs: run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-prod/ build-mobile: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -81,7 +79,6 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: - if: github.event_name != 'pull_request' runs-on: docker steps: - name: Check out repo @@ -115,7 +112,6 @@ jobs: path: apps/tauri/src-tauri/target/release/bundle/ release: - if: github.event_name != 'pull_request' runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: From fd18ee6079721843dc90b96daf285365bcdd298b Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 22 May 2026 14:38:22 +0200 Subject: [PATCH 5/6] (feat): remove checks workflow --- .forgejo/workflows/checks.yml | 80 ----------------------------------- 1 file changed, 80 deletions(-) delete mode 100644 .forgejo/workflows/checks.yml diff --git a/.forgejo/workflows/checks.yml b/.forgejo/workflows/checks.yml deleted file mode 100644 index 27e9799..0000000 --- a/.forgejo/workflows/checks.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Checks - -on: - pull_request: - branches: - - main - - dev - -jobs: - build-web: - runs-on: docker - steps: - - name: Check out repo - uses: https://data.forgejo.org/actions/checkout@v4 - - - name: Install Packages - run: apt-get update && apt-get install -y sudo curl jq - - - name: Install Nix - uses: https://github.com/cachix/install-nix-action@v30 - - - name: Install Bun - uses: oven-sh/setup-bun@v2 - - - name: Install dependencies - run: bun install --frozen-lockfile - - - name: Build packages - run: bun run build:packages - - - name: Build web - run: bun run build:web - - build-mobile: - runs-on: docker - steps: - - name: Check out repo - uses: https://data.forgejo.org/actions/checkout@v4 - - - name: Install Packages - run: apt-get update && apt-get install -y sudo curl jq - - - name: Install Nix - uses: https://github.com/cachix/install-nix-action@v30 - - - name: Install Bun - uses: oven-sh/setup-bun@v2 - - - name: Install dependencies - run: bun install --frozen-lockfile - - - name: Build packages - run: bun run build:packages - - - name: Build mobile - run: bun run build:mobile - - build-desktop: - runs-on: docker - steps: - - name: Check out repo - uses: https://data.forgejo.org/actions/checkout@v4 - - - name: Install Packages - run: apt-get update && apt-get install -y sudo curl jq - - - name: Install Nix - uses: https://github.com/cachix/install-nix-action@v30 - - - name: Install Bun - uses: oven-sh/setup-bun@v2 - - - name: Install dependencies - run: bun install --frozen-lockfile - - - name: Build packages - run: bun run build:packages - - - name: Build desktop - run: bun run build:desktop From 167036533c9d7ae96b3601c95f66073af1dadd93 Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 22 May 2026 20:34:05 +0200 Subject: [PATCH 6/6] (fix): ttp_url missing in qrcode --- .../web/src/components/screens/login/form.tsx | 4 +--- apps/web/src/routes/settings/security.tsx | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/web/src/components/screens/login/form.tsx b/apps/web/src/components/screens/login/form.tsx index ff76307..c66d5e6 100644 --- a/apps/web/src/components/screens/login/form.tsx +++ b/apps/web/src/components/screens/login/form.tsx @@ -190,11 +190,9 @@ export default function Form() { [save], ); - const isTauriEnv = isTauri(); - return (

- {isTauriEnv ? ( + {isTauri() ? ( <> { diff --git a/apps/web/src/routes/settings/security.tsx b/apps/web/src/routes/settings/security.tsx index 15a6155..86c580e 100644 --- a/apps/web/src/routes/settings/security.tsx +++ b/apps/web/src/routes/settings/security.tsx @@ -46,6 +46,7 @@ function QrCodeLogin() { const [qrCodeBase64, setQrCodeBase64] = useState( undefined, ); + const [connectionString, setConnectionString] = useState(null); useEffect(() => { load("private_key").then((value) => { @@ -58,15 +59,25 @@ function QrCodeLogin() { setUserId(value); } }); + load("ttp_url") + .then((value) => { + if (value) { + const url = new URL(value); + setConnectionString(`@${url.host}`); + } else { + setConnectionString(""); + } + }) + .catch(() => setConnectionString("")); }, [load]); useEffect(() => { - if (userId && privateKey) { - generateQR(`tensamin://tu::${userId}::${privateKey}`).then( - setQrCodeBase64, - ); + if (userId && privateKey && connectionString !== null) { + generateQR( + `tensamin://tu::${userId}${connectionString}::${privateKey}`, + ).then(setQrCodeBase64); } - }, [userId, privateKey]); + }, [userId, privateKey, connectionString]); const [qrCodeVisible, setQrCodeVisible] = useState(false);