From 761580699cb148f887b1087a47908075b232b39c Mon Sep 17 00:00:00 2001 From: klopez4212 Date: Fri, 12 Jun 2026 19:00:22 +0100 Subject: [PATCH 1/5] Add sidebar update card --- .../features/settings/SidebarUpdateCard.tsx | 57 +++++++++++++++++++ .../features/settings/hooks/use-updater.ts | 5 -- .../settings/sidebarUpdateCardVisibility.ts | 7 +++ .../src/features/sidebar/ui/AppSidebar.tsx | 29 +++++++++- desktop/src/testing/e2eBridge.ts | 50 ++++++++++++++++ desktop/src/vite-env.d.ts | 4 ++ desktop/tests/e2e/sidebar.spec.ts | 56 ++++++++++++++++++ desktop/tests/helpers/bridge.ts | 3 + desktop/tests/helpers/screenshot.mjs | 56 ++++++++++-------- 9 files changed, 236 insertions(+), 31 deletions(-) create mode 100644 desktop/src/features/settings/SidebarUpdateCard.tsx create mode 100644 desktop/src/features/settings/sidebarUpdateCardVisibility.ts diff --git a/desktop/src/features/settings/SidebarUpdateCard.tsx b/desktop/src/features/settings/SidebarUpdateCard.tsx new file mode 100644 index 000000000..158636057 --- /dev/null +++ b/desktop/src/features/settings/SidebarUpdateCard.tsx @@ -0,0 +1,57 @@ +import { CircleArrowUp, X } from "lucide-react"; + +import { Button } from "@/shared/ui/button"; + +import { useUpdaterContext } from "./hooks/UpdaterProvider"; +import { shouldShowSidebarUpdateCard } from "./sidebarUpdateCardVisibility"; + +type SidebarUpdateCardProps = { + onDismiss: () => void; +}; + +export function SidebarUpdateCard({ onDismiss }: SidebarUpdateCardProps) { + const { status, relaunch } = useUpdaterContext(); + + if (!shouldShowSidebarUpdateCard(status)) { + return null; + } + + return ( +
+
+
+ + +
+

Update ready

+

+ Restart to apply the update. +

+ +
+
+ ); +} diff --git a/desktop/src/features/settings/hooks/use-updater.ts b/desktop/src/features/settings/hooks/use-updater.ts index 21c7bd46f..3b9c5e632 100644 --- a/desktop/src/features/settings/hooks/use-updater.ts +++ b/desktop/src/features/settings/hooks/use-updater.ts @@ -1,7 +1,6 @@ import { useState, useRef, useCallback, useEffect } from "react"; import { check, type Update } from "@tauri-apps/plugin-updater"; import { relaunch } from "@tauri-apps/plugin-process"; -import { toast } from "sonner"; export type UpdateStatus = | { state: "idle" } @@ -87,10 +86,6 @@ export function useUpdater() { updateRef.current = null; setStatus({ state: "ready" }); - toast("Update ready", { - description: "Restart when you're ready to apply the update.", - duration: 8000, - }); } catch (err) { setStatus({ state: "error", message: toErrorMessage(err) }); } finally { diff --git a/desktop/src/features/settings/sidebarUpdateCardVisibility.ts b/desktop/src/features/settings/sidebarUpdateCardVisibility.ts new file mode 100644 index 000000000..72b6d991f --- /dev/null +++ b/desktop/src/features/settings/sidebarUpdateCardVisibility.ts @@ -0,0 +1,7 @@ +const SHOW_UPDATE_CARD_PREVIEW = + import.meta.env.DEV && + import.meta.env.VITE_SIDEBAR_UPDATE_CARD_PREVIEW === "1"; + +export function shouldShowSidebarUpdateCard(status: { state: string }) { + return status.state === "ready" || SHOW_UPDATE_CARD_PREVIEW; +} diff --git a/desktop/src/features/sidebar/ui/AppSidebar.tsx b/desktop/src/features/sidebar/ui/AppSidebar.tsx index 00e8af524..829892e4d 100644 --- a/desktop/src/features/sidebar/ui/AppSidebar.tsx +++ b/desktop/src/features/sidebar/ui/AppSidebar.tsx @@ -44,6 +44,9 @@ import { CreateChannelDialog } from "@/features/sidebar/ui/CreateChannelDialog"; import { NewDirectMessageDialog } from "@/features/sidebar/ui/NewDirectMessageDialog"; import { SidebarProfileCard } from "@/features/sidebar/ui/SidebarProfileCard"; import { SECTION_ACTION_VISIBILITY_CLASS } from "@/features/sidebar/ui/sidebarSectionStyles"; +import { SidebarUpdateCard } from "@/features/settings/SidebarUpdateCard"; +import { useUpdaterContext } from "@/features/settings/hooks/UpdaterProvider"; +import { shouldShowSidebarUpdateCard } from "@/features/settings/sidebarUpdateCardVisibility"; import type { Channel, ChannelVisibility, @@ -222,6 +225,12 @@ export function AppSidebar({ onStarChannel, onUnstarChannel, }: AppSidebarProps) { + const { status: updateStatus } = useUpdaterContext(); + const canShowSidebarUpdateCard = shouldShowSidebarUpdateCard(updateStatus); + const [isSidebarUpdateCardDismissed, setIsSidebarUpdateCardDismissed] = + React.useState(false); + const showSidebarUpdateCard = + canShowSidebarUpdateCard && !isSidebarUpdateCardDismissed; const skeletonRows = ["first", "second", "third", "fourth", "fifth", "sixth"]; const [isNewDmOpenInternal, setIsNewDmOpenInternal] = React.useState(false); const isNewDmOpen = isNewDmOpenProp ?? isNewDmOpenInternal; @@ -231,6 +240,12 @@ export function AppSidebar({ const [createDialogKind, setCreateDialogKind] = React.useState(null); + React.useEffect(() => { + if (!canShowSidebarUpdateCard) { + setIsSidebarUpdateCardDismissed(false); + } + }, [canShowSidebarUpdateCard]); + // Allow the create-channel dialog to be opened from outside (e.g. the // ⌘⇧N global shortcut in AppShell), mirroring the controlled new-DM lift. // When the external flag flips on, open the "stream" create dialog; the @@ -526,7 +541,10 @@ export function AppSidebar({ testId="sidebar-more-unread-above" /> ) : null} - + {isLoading ? ( Channels @@ -755,7 +773,7 @@ export function AppSidebar({ {unreadBelowCount > 0 ? ( } onClick={scrollToNextBelow} @@ -765,6 +783,13 @@ export function AppSidebar({ ) : null} + {showSidebarUpdateCard ? ( +
+ setIsSidebarUpdateCardDismissed(true)} + /> +
+ ) : null} void; +}; + +function notifyUpdaterFinished(payload: unknown) { + const channel = (payload as { onEvent?: MockUpdaterChannel } | null)?.onEvent; + channel?.onmessage?.({ event: "Finished" }); +} + +function handleUpdaterCheck(config: E2eConfig | undefined) { + if (!config?.mock?.updateAvailable) { + return null; + } + + const version = config.mock.updateVersion ?? "0.3.18"; + + return { + rid: 42, + currentVersion: "0.3.17", + version, + date: "2026-06-12T00:00:00Z", + body: `Mock update ${version}`, + rawJson: null, + }; +} + +async function handleUpdaterDownloadAndInstall( + payload: unknown, + config: E2eConfig | undefined, +) { + const delayMs = config?.mock?.updateDownloadDelayMs ?? 0; + + if (delayMs > 0) { + await new Promise((resolve) => window.setTimeout(resolve, delayMs)); + } + + notifyUpdaterFinished(payload); + return null; +} + async function handleArchiveChannel( args: { channelId: string }, config: E2eConfig | undefined, @@ -6490,6 +6533,13 @@ export function maybeInstallE2eTauriMocks() { case "plugin:window|set_badge_count": case "plugin:window|set_badge_label": return null; + case "plugin:updater|check": + return handleUpdaterCheck(activeConfig); + case "plugin:updater|download_and_install": + return handleUpdaterDownloadAndInstall(payload, activeConfig); + case "plugin:resources|close": + case "plugin:process|restart": + return null; case "get_channel_workflows": return handleGetChannelWorkflows( payload as Parameters[0], diff --git a/desktop/src/vite-env.d.ts b/desktop/src/vite-env.d.ts index 11f02fe2a..98b739534 100644 --- a/desktop/src/vite-env.d.ts +++ b/desktop/src/vite-env.d.ts @@ -1 +1,5 @@ /// + +interface ImportMetaEnv { + readonly VITE_SIDEBAR_UPDATE_CARD_PREVIEW?: string; +} diff --git a/desktop/tests/e2e/sidebar.spec.ts b/desktop/tests/e2e/sidebar.spec.ts index 18c2b1882..157f46bd9 100644 --- a/desktop/tests/e2e/sidebar.spec.ts +++ b/desktop/tests/e2e/sidebar.spec.ts @@ -66,3 +66,59 @@ test("resizes, persists, and snaps to the default sidebar width", async ({ .poll(() => storedSidebarWidth(page)) .toBe(String(DEFAULT_SIDEBAR_WIDTH)); }); + +test("shows a sidebar update card when an update is ready", async ({ + page, +}) => { + await page.goto("/"); + await expect(page.getByTestId("app-sidebar")).toBeVisible(); + + await page.evaluate(() => { + const testWindow = window as Window & { + __BUZZ_E2E__?: { mock?: { updateAvailable?: boolean } }; + }; + + testWindow.__BUZZ_E2E__ = { + ...(testWindow.__BUZZ_E2E__ ?? {}), + mock: { + ...(testWindow.__BUZZ_E2E__?.mock ?? {}), + updateAvailable: true, + }, + }; + }); + + await page.getByTestId("sidebar-profile-card").click(); + await page.getByTestId("profile-popover-settings").click(); + await page.getByTestId("settings-nav-updates").click(); + await page.getByRole("button", { name: "Check for Updates" }).click(); + await expect(page.getByTestId("settings-panel-updates")).toContainText( + "Update installed. Restart to apply.", + ); + + await page.getByTestId("settings-back-to-app").click(); + + const updateCard = page.getByTestId("sidebar-update-card"); + await expect(updateCard).toBeVisible(); + await expect(updateCard).toContainText("Update ready"); + await expect(updateCard).toContainText("Restart to apply the update."); + await expect(page.getByTestId("sidebar-update-restart")).toBeVisible(); + + await page.getByTestId("sidebar-update-restart").click(); + + await expect + .poll(() => + page.evaluate( + () => + ( + window as Window & { + __BUZZ_E2E_COMMANDS__?: string[]; + } + ).__BUZZ_E2E_COMMANDS__ ?? [], + ), + ) + .toContain("plugin:process|restart"); + + await updateCard.hover(); + await page.getByTestId("sidebar-update-dismiss").click(); + await expect(updateCard).toBeHidden(); +}); diff --git a/desktop/tests/helpers/bridge.ts b/desktop/tests/helpers/bridge.ts index 3ef71af37..99ac95aa0 100644 --- a/desktop/tests/helpers/bridge.ts +++ b/desktop/tests/helpers/bridge.ts @@ -99,7 +99,10 @@ type MockBridgeOptions = { profileReadError?: string; profileUpdateError?: string; searchProfiles?: MockSearchProfileSeed[]; + updateAvailable?: boolean; updateChannelDelayMs?: number; + updateDownloadDelayMs?: number; + updateVersion?: string; stallWebsocketSends?: boolean; userSearchDelayMs?: number; // NIP-IA gate inputs — drive the archive-button gate matrix in diff --git a/desktop/tests/helpers/screenshot.mjs b/desktop/tests/helpers/screenshot.mjs index 096a6d182..552247d81 100644 --- a/desktop/tests/helpers/screenshot.mjs +++ b/desktop/tests/helpers/screenshot.mjs @@ -21,6 +21,7 @@ // --viewport Viewport dimensions (default: 1280x720) // --outdir Output directory (default: test-results/screenshots) // --messages JSON file with messages to inject before capture +// --update-ready Mock an available update so the sidebar update card renders import { parseArgs } from "node:util"; import { existsSync, mkdirSync, readFileSync } from "node:fs"; @@ -40,6 +41,7 @@ const { values: args } = parseArgs({ viewport: { type: "string", default: "1280x720" }, outdir: { type: "string", default: "test-results/screenshots" }, messages: { type: "string" }, + "update-ready": { type: "boolean", default: false }, }, strict: true, }); @@ -107,31 +109,37 @@ await page.addInitScript( ); // Install E2E mock bridge config + MockNotification (mirrors installBridge in bridge.ts) -await page.addInitScript(() => { - class MockNotification extends EventTarget { - static permission = "granted"; - static async requestPermission() { - return "granted"; - } - body; - onclick = null; - title; - constructor(title, options) { - super(); - this.title = title; - this.body = options?.body ?? null; +await page.addInitScript( + ({ updateReady }) => { + class MockNotification extends EventTarget { + static permission = "granted"; + static async requestPermission() { + return "granted"; + } + body; + onclick = null; + title; + constructor(title, options) { + super(); + this.title = title; + this.body = options?.body ?? null; + } + close() {} } - close() {} - } - Object.defineProperty(window, "Notification", { - configurable: true, - value: MockNotification, - writable: true, - }); - - window.__BUZZ_E2E__ = { mode: "mock" }; - window.__BUZZ_E2E_APP_BADGE_COUNT__ = 0; -}); + Object.defineProperty(window, "Notification", { + configurable: true, + value: MockNotification, + writable: true, + }); + + window.__BUZZ_E2E__ = { + mode: "mock", + ...(updateReady ? { mock: { updateAvailable: true } } : {}), + }; + window.__BUZZ_E2E_APP_BADGE_COUNT__ = 0; + }, + { updateReady: args["update-ready"] }, +); try { if (args.messages) { From 6688d86f0a38dc0b028d55f778dbe2548dd6d51d Mon Sep 17 00:00:00 2001 From: klopez4212 Date: Sun, 14 Jun 2026 12:57:34 +0100 Subject: [PATCH 2/5] Polish sidebar connectivity cards --- desktop/public/pow/LICENSE.txt | 21 ++ desktop/public/pow/plop.m4a | Bin 0 -> 17264 bytes desktop/public/pow/poof1@3x.png | Bin 0 -> 21172 bytes desktop/public/pow/poof2@3x.png | Bin 0 -> 27331 bytes desktop/public/pow/poof3@3x.png | Bin 0 -> 32850 bytes desktop/public/pow/poof4@3x.png | Bin 0 -> 19500 bytes desktop/public/pow/poof5@3x.png | Bin 0 -> 9047 bytes desktop/src-tauri/src/commands/mod.rs | 2 + desktop/src-tauri/src/commands/warp.rs | 58 +++ desktop/src-tauri/src/lib.rs | 2 + desktop/src/app/AppShell.tsx | 2 - .../features/onboarding/ui/ProfileStep.tsx | 152 ++++++++ .../features/settings/SidebarUpdateCard.tsx | 123 ++++--- .../settings/sidebarUpdateCardVisibility.ts | 6 +- .../src/features/sidebar/ui/AppSidebar.tsx | 191 ++++++++-- .../sidebar/ui/SidebarRelayConnectionCard.tsx | 187 ++++++++++ desktop/src/main.tsx | 11 +- desktop/src/shared/api/tauri.ts | 8 + desktop/src/shared/api/useReconnectRelay.ts | 6 +- desktop/src/shared/styles/globals.css | 252 +++++++++++++ desktop/src/shared/ui/ConnectionBanner.tsx | 50 --- desktop/src/shared/ui/PoofBurstProvider.tsx | 194 ++++++++++ desktop/src/shared/ui/sidebar-action-card.tsx | 336 ++++++++++++++++++ desktop/src/testing/e2eBridge.ts | 19 +- desktop/src/vite-env.d.ts | 4 - .../relay-connectivity-screenshots.spec.ts | 57 ++- desktop/tests/e2e/sidebar.spec.ts | 37 +- 27 files changed, 1563 insertions(+), 155 deletions(-) create mode 100644 desktop/public/pow/LICENSE.txt create mode 100644 desktop/public/pow/plop.m4a create mode 100644 desktop/public/pow/poof1@3x.png create mode 100644 desktop/public/pow/poof2@3x.png create mode 100644 desktop/public/pow/poof3@3x.png create mode 100644 desktop/public/pow/poof4@3x.png create mode 100644 desktop/public/pow/poof5@3x.png create mode 100644 desktop/src-tauri/src/commands/warp.rs create mode 100644 desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx delete mode 100644 desktop/src/shared/ui/ConnectionBanner.tsx create mode 100644 desktop/src/shared/ui/PoofBurstProvider.tsx create mode 100644 desktop/src/shared/ui/sidebar-action-card.tsx diff --git a/desktop/public/pow/LICENSE.txt b/desktop/public/pow/LICENSE.txt new file mode 100644 index 000000000..b0d56df20 --- /dev/null +++ b/desktop/public/pow/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Emerge Tools, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/desktop/public/pow/plop.m4a b/desktop/public/pow/plop.m4a new file mode 100644 index 0000000000000000000000000000000000000000..593f4e8b7bbe536868ad502043d0d8caa851fb6d GIT binary patch literal 17264 zcmeI3eN+=y7QiP$6fKL0iRB~efFG<{Lkx%to)fSNaSsR^gHVvt$;?0^nansd2}J9H zXLYT*yIRnGC~I3mN)Xtp2Wl0qTC9a5wY65Qr(3kEvI?cBEd(mC?*&ppw!7W`-#wY! z`|f@B-TQv;CHX5DhT++wolA^}#W5gIGhBq)B(Mw|W0?0shGlKQFf%qI1wAdbNk>|0 zUjSCsatxDUn8fvhp+N!T5%SbHW<+q*U<_ETQRInS5Lqkcx@wMlQWI8#0_qMEm-DGQ z?wRgsF>b@9B{V~s2w>t2^`G~Z(%_mHVx-KxJ5^w<7Psxzk|4%p$p#}|ff-zBC^C~8 z^eZTyhH)scM{g@{#)s?{K{S|wog;{Xi|&v=6`TU>4$6~#jlq1O19ArvP79O(4UfXY z!VsW6ftJO{Fn{O-(u+xfXN;fMSfC^TEaoqWqALa1a9Jrx0t!=r@+35XK>tw8rGE=z z8(fjWH;@C9B=9K&b~$*Kfk!5YBnvbYkRJooc&C*T37|U}8fuq}016I)CpZow_*p#m zn9PC*h6;y;fY(q)5w2|56~>ua4yXWAW&pD*q`6i8Ca-8 zWMO3b@H&ZB!9?NcvQkv|*BQ@RSbzigF`RtxD1*g1mL3Q7r&p zNp2>C#%RwdAPXX6{~IDuX{IAqrw3Xwyka728``$(QxfDL%my%L^6)vyY#wk0IdW)t z2S$We$ECp)9TZ^)dc>_&tJG@XJK-Q1c(acVUvV|~Qlan_+1WHH3V1fl8_4`* z<=8@&uO#`14lk|296)t)7qEiIdGNiuRmCD@7h4*SDMb|0#=>X zSa5cW<}Ho0URzM~`cDO~zW%sr`@mB6Sgi3hc5 zof4mSOG6Le_dJ$7}v0Uc3DRItu$2ogSF|;12t36n9bohO{*et2@;(Au&rI7nj<&q-$xn)#qUQy^fwA zCru-}3GVQ*%JvWpbEw*}%RQVVQeJJ2I_DMF*Vn(!dAj!O%VPc}ZQIPZ1NMJ&R(-0} z+44=DqpY!b`RSnkH0Psx+J+Z@<5l8pnD_Ppzs=I7;MhRFiUS=VhElWYR*d~J^vHLf z55Aie5c<#jirxve>zB;9Xv>$L^!5Gt+Xq1z%*moF)g@DUv_K5 z5Br|Gws-xWPixz{^p3?PZ&XPaebu04W_tiOnD=#SfTC=h>FQu#8>2s<^ z{QI%3Eo@Z$1+M)~djrtk&m47IjVYnS*s*=}*i8+t>S++`Naa-4M z#kKjjKlqcb$55LYzyHd6i@y#zp5u8-kKM0X*jrs#zjR~Ca+AIDQj*YaeHh%Fu9w*P z&-`{)G*+mKn3efEw*7e*|J>(IFHPU)J+3eAt+mq|=9Va^c^}=La^dA3wpkyM5o$`6 z9+#YvgvhHRcKU9gk}N4d5q_moV|&Gj%?VQKw97(fPu+7UdERR^y7VtEzq37s?q&vT z+Z-pCT=qYso}E7Srvv$4>G?)kS^D0&r5?ZA+5G=W2#e^`~}oC$o!sQ>A;U>}*z4f^2_lY;5fBxqk!7S>Iv+ literal 0 HcmV?d00001 diff --git a/desktop/public/pow/poof1@3x.png b/desktop/public/pow/poof1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..48b5166c1a686b74780a3a8d81883e59cdab260c GIT binary patch literal 21172 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%0AR z#rY-g{7MIFH8DCJxechM$zRZ734>M8uLnUlx7z%6efw$xVF)0_vqZ)%cXkX>1Fu6a ztHt^<>V!$?@D`IKH3v?y?T+eXwKS;^3xVfkPHx9!Dbh zK@o{FwFW14NObH9K~@44(cq*eQ~c`R^5(RrA+uJLDK}Y4SkLnfWIyWEx27T2n?(f~ zc*)@sI4_$Z;^yRuyl*Ty*W4%tvfxN&Z8-;$F1jIGJp8*g&>OL&oLiHkV}Z zQzl=d+Ov|NTRl7JBgevV0Xx)o#5SGZ1+Vjc@A<|Yr~t@YY3CSK%wb_VsOwCV0nHoK zhc+?+fGuIINoGrxWw@_nI1Ex#5%v;GKIBOM;5}~EqGnI0-{lR@%cY`eUAL5$qm6eQ zt>v3Ye34MKFUj|5Mev0pgudJN@r>MIzwK&;QOjZ?Pd1?L;@`4v4y`MK zF)$YAydZoa^f;~@27l*0od=7AmH1XalS&rUK7$|CY4Ma9sKxJ)3)6m--HWI=lS^Ayr1^*5dVZGFRF!8h-ixqvX0IaFh{ZxSx zx!CmHbcv;&2A6&aKdU?SJ7eDP+8xnwY9mS12$jOoXM>)h)&P}ElxlP2RvSn4hpFSE zqEW{M5NrIQo8ZA=8vC8Ymt9po206-e5?;2-8}SU^M-Q=+a}V!d z#Foi~nXCvk&Gz4=i$!A*I9Tl+JLlg9ADzk3Vs0 z(mkyo#P1cybFvY>Z4$n-Ar2aJd^$yfI-+mOc<5~S&<1RJ(dus5+(w007$f+5CN>IdClN6%syiFhHH5f)7|HJz4 zPJDDbD{w)a8?gEm4$CO_vSRQ4lcT5=k>HTNa&C#`u>&YVB|B2~i)JK+Kr|?NLJdZ* z!CbWnRiSg$@cDLDQq)We39E=HT}KDd15%7bZ(UZ~y=fHXx1Elu+{dcBy6YG1T4rYL z%RSDv@}(M*{IpX2?I(!;PN^v+ARwWluhl_W%=WaBDmor@;*743|D@Dk9yY8RSPUgo za8D8mw27_);K``MWj(`WwaESCh@m%?`?FRU^CM?S0zy!+a)p}GI}U4omudBh3PTZu z)-27ICD5zQ_NIy^I(&VJMSNP3-$W%eWpK(|H5*o&g-fbTU199!_e3g)^>~^Ts7?kT zV;=`7n);spro-db=W9J3U}X0=HQQ)9w!HvYzb_|+R@ZnxDml~pGDY(13p^m5N$rm3 z_URm9zvh$-u(+RDZ;K`&?XAlODQ%`eSkwR518 z#G;QpZl;FXJ)roF!Ci~VFZ%K5>2WlE#FJUKUXQ~}LF8RDS-MBLL7V56cEQnwQ#`Fg zPZ4X!z3O*vTZZfRKxeV=1ufEc*lSey&c@=}V$(b8sw~lZ?jZTCX`Yst>-qTvpot2{ zF*suK4CdD4==qf)pIQsArN6u~<`f(mT>W%b^>4GcHZM=I9(2kZ04LZD;ZWc-+V@_f z_3!5Dd(xn+-9KrxRF?N6;*!FCW4!)I+x+wZ1#SJ|Etg}rah_+1xzBC#CiwktHd zkS}lo%p8|)Nkt`n7_1d_k{!RhKK=sjtzX}5nZ|E5igz77-lQTj zy40pyIrhGO*ZCGJzS<0`9JZV8xIK~%Adzb)Zrgvg~ms5Vv$S=gHlc96TD(nlyscJd?8?1vdx^DTjn2q{!{F{d zS!+YUpFyFuXBOKyR)e~=zP)_tk4E+Z#7 zlYAzomEup&$e2p+Cjlg(THs+AxGp*Lr7fm%S<@N-;js|vJM1_stC9QexpW`?1LfL} z(^E$b{B(L;tl)`l%XF7S$?3T&)6MfqrO~D~<9*w|k6TPrT3Naz6`plX-^d zwUH@NfP0zFDqQKpHS%ooPg))dZjxgB&EGrn3q-ZA|8e0}`2K6=oyCkarG0kEf7E*R zH^nmJ4a_F?<1hM`(Y=&NUEyJ$ZBp2qv~C_lKM#}K;0U@`01E>Vxfkj_#*Is^^;(oS zMSg%fIPm&EP!Xtu4U`#)3T*cQxZ!3fD5#)yXDdjZlozgexLP%wuv*pBd-p{lg}t|S z=k?) zbG3Xb+BL#lHb?tYC4fzIV+3zBsz`uhMjf7^G8rTrlRbHyFNW&KNZ_|ik@aQ3Z#8Y@ zOKLSgQucT(-p$|Q&l{fwVKA5s5SO1WeLxjBRTTU|lU-9}y92}M2u=vD1eXScvMLPP zRrL}En91&?>&nVb7aT^5JSJb=VR{Jmp#E;Vm_qRE7)GsWkz2u7(ZnWvCZV4De=25+=1a=&sHvy#=c z)t4zpx5#6Se&>20Ljnh#&v};Y%dQAn^yp>R%!&@g6^J->ku7h}cM;tW3v;6wv@Cwd z(PU^wsWj?yWSrI6F4hP99h*d0b>H|}J*g;Q-rjyb@gBvR%DwVEKtos~uLcUA@j6^B zyS+|WG>ccbB#Q2}Ab3akk}{5RHu&8rW7aki@8z87CXjcAZywSZ|4>v0COM<7gBv}n zOY4x!#@RvJ30aq8eJkYqc;DLf6JQT!bZi8~R(8;X0=fbXO=dT~oRh~yzuf`p3@ajG!Ur79A)^YLuFUK56W#3?kGd;S+Wmc}(igkvHhN+ePCACp#w zwEf{OsN$39zgN7Dgb>zc+_G-hBUw)q|Gb#-x%mgZTJ`mXOZ&)$n1dd#9nUC$_$uMo z$Uq=?ez>S<)B!v!y6yVU?`M$Unqd%)qZ3o3{%l$cThCX68C}*tZGar7ne+b3rJ7AQ z1D)vaSDqD|ECyo>=uG_1_`WH%X)iStyUkv!e9ga;LRc7_1q2&{CakLXm;8*TCWJl1 zz~yzaYXPhezN!x;C+H0z9IX3TB95FowhR_i>)ouc- zh;lMfrptq1W8w|T{?25_m_LsgRzjEIo-=S|JzY!_mj78hq#)BrXD#hfzQl89ocXrt zbU_v_*YGaDw-Y|OmdKaM=(RtaNro?6P&hiVJY9e5y?5onq-s7z!3{*iPW<^oKt3jw zNI~dR$3y)y5?*CE1g}cjecGF4Q!GJ3e<|2np7DZ^TxFcH_*9*YWOlsQ$3@yr{BW)+ z*L`?vRB(t7%4wa-HihQY%!^Le?0U#x*Z3gZsR1w#0TkmLS$CcmLnHu=`R>g2d`trS zCDSCpyw7{+W>9fJTXUe>JZc$ThCa7&mw+vMUoEFtdWXV1s!HK10FFMOECWqnV_!Yx zibO&`K{}ouy{d+rwlj1qhnAY0lERfrZM*F!uCg5?ejj4I`-r2$>HGM3-lk^wFOY?D zZ3Ss{>TOaQgmcOktJDrBku@70`XbhuhUhUdpEr(xl9hI&vF z0to`Qs0Z2M9qye_x|!ATKL#qEI;Gq9*vkm@IVe=Ol3 zhrKNLc)daDt&}_)UYW|uxyY~b9}0H<`3Q5qB?~SsWRaTBeQcrLwuLrcS^H9mrz_C4 z69KLCh8PG1kwAQR`TC0Axls1)s+YG;yub2%sQ=zBNqn_pjxeh$+dMi%%o8XFn*aum zHl_2wdBtCt%x*5%t|8Zgc3D0JMT?Tyua)dYIX9AptPexR#HKKT0!2dAXfy zevx?{#HJu{W&#l>-1hzj8D}ax&bxHF$X%#5Q+_8Z4uM5p?fdqJs_}QPe*+Rn$9>PN z4K)7JD^O}~JhQZ7|0jGT(r)V1exR`1#V5toGHha3*n1p+T%imb(ExqTskO(Q%Zei}BapRvmk)>lCIAW;S3xJOI zVo|;Ovc`e{!7~HU+oQn{!02_J)PO!^Bsgh!ipPO*A@?(rO755&B6KnW%%nYH>p3kO zlCuqNWT(#5LHOK>Y6?P`Aa_GvzWLT-=+#L#=mAZ%ud^4@ks%S;>@|E1hd`_d zINnJeEvaa49jDR)JL8<{Q37_R%gCv_sDc*5`6hb1a zp}{7%$YpfAyoWMz*afxVyC!EQ-a z7zlm~tDZAAP}q55yo2}+d;~U#(`%OyQXqT%C(FO6v2mZumSZbqYVKNS*KL=J)t!G5Nb1h>BLg;X@X~o*v)u zwj4=&W1KyYf-Vg@--UCJy4{9gt%NewTUdM$II!F(gGFn9q0uf zox1qVIT@>1@F~tuJKevMZ=$}5^t20&{2QPq<_4C5I6^$ZWCq2%2k$n2e_%*r4Qe6p z^aV{gQ_t(Lj<3OqY=L6drE~DX)U!+lp=S{2X43Ed5V4_Cp;hU((w52Jz7EJ%10m){ zSTmTpuo3c9XEph5YbYhY;n}uHBV1UxIj9*eULtgc;QsB896%U~XK@8Ya>Ij#}W|PICe~@C3k5A||Ju z>`;s9%xC-0`u_foFZtXd8&4ZYFmvf2CgI6aPRCuO27Q(9(ht`q8}Mq?e2o5V(_J0!r=v%R+{%D*2ZwB#f0XelsrF-$9|MAwO=V|(YcAw-yD}Xpx1hkic zYX7{&Ie*&E|dMQow-7(Gx2PzD{MZu>@W$A8hZoMG_$xx<9g ztyB~7v)tkOQR%9R$KK(4mL^F%kp5|1m4+b9y&uI@(a_MSB-t(!Ih~GfmTgWRIswWd zExgiqIRXX3s?Jv_F$M*2MMvDSJP;Z?uy8CG@Ysvi%Y10{ILq_A*jw)#HPGZwx6?N; zcx(z98VJwxy!yusfy_~_q6inRWxF0Oyq?1m{4j%p1LUS3O8^%J91}D<{bm_Jfs)*k z2!VERmS`*)(s1gX;YrEb01Sk~4~D}j9NXAcK?w@4@>aT~JPE>3N2ZOg=SxfO=GVZMsYn&s9>$004uBvc!M4+-Una-78g$5P}vkf?E<9;6h-K z^>(`3NQ-{-KM0O+!Zfp%#i-B~!S#DI;@gwGl8OjJn?d0Z{wO%$bDPFH>ZNrTY=413 zcqc)?P9Ew2zn19^pwQQrJaEsk6EQ3z0yDR$W#<~d9ZnA+k`iZI!ziwB6fz~oDb=p{SxHrsL#9VXkr}J>o znn^KHuz!YP6G6gi#7PI1!_*RmD*NC4nE%LP(CV(8?TC!ys#W_T)~0S+!(*_r0^;?z zh0US7nP>)Ob!$jM!-zPH&uI&WP8n$a%m0HFFt$f*&zYTATU6N}St=o*uGZ#4*%bv( zBoS~(0g!6$6qy&zDGr^@iSZso#DMP2lr2&v$bBV{M8)O7VFuC48Ys!U=sK_%l1$WL zumdJsTp37qPLcG~Bpt0eEAalsIEMgRfXw{~r^~X|0r`6{Fn5q(hv9i~v%hXHBXl}ZEqE8Xc1)De30q;`tP#cm5d(iqKb;x|^mAl(IC zPvqX`<9rSKMZ37dq&vH!CdX@CzgA7ph8w_}8Ojtf1cHl@KPiainFE+Iq8pO`qVvTK zqG#KLLxEyCva7wrnff+7CdovI!Gx5p`X^ms09SBs6TmBc$mO7$STi6r7-UQv>%Rs+ z2o*t52t~goB(zb6r6~!&{oalw8s_uB^;Gu*M5Yk$c%M_+SdUbeVXYq3f?*$p+muHVB2_mot42hL2emi5?ft@UXp2kBeHQSk> zRBSn2oMFJ4XyE=ZX2enD=Yk+Pn8=LcS_JgOF7{@`+&4&-qad!Ptwwdk_UU%E1G#E47Z{u!vi*oyP_QI@sfmXxZ7rQF zv|VDr$U_l5hNt8hR*zOYI?{mD8nE+9$g|dJ{OiDez9zZ`u5v_!IxsTYw zGpA4;*Hv$~jq1H$_hJ|-G1kVdb~=es-^R~@IMbiT=Y%Y35Av@GPK$u>Fo$Ina-yLT ziWWu=QtVlMk)1D6E5JN3byRKu{RMJ;^y~GfybZ@MWgU;VCM}&a-Tmz8vXL)5F4>D} z=Y0J-Fw;ZR0>>>?XNyzMIx9A`&;9*OVe+DlmjI2mF7ip^2C*TcM;(N{erpm0LGJ@0 z4wlIRAZ-Y(#wbd{y$Luf)f*&L=g2I^DGa=6%8U}?h*iPRkMqo z{PVFt1bqbfX3(%CaeT&*rXDx?HXh<|Tx|HsIshpNaEP%HJ`oHEF9Gjw0`z>bdxC{4 z$B#hB%nEXD0cR=|B` z8*>-b9DrOATb`2(3m#o^jPOc8crCxTQMreS=w3O{BLvAcyxLrl@m;L=A0QL~#n(9> zXasi zF6P^1Q#^*~1`&%g;r0CD+fJi`EO~%qkC`~`kJN=^Q=Ji%2V6e|@b02lu@W|d!imy@ zjWQ9RezGY@s(&C3%k;UmDw1si>#B^y%4rU7&TNAAr8b z3bJ;(2}g$ZT`26f3!Df*vDGh>p;w_*(*{TNh4A$n!>TXf3@Bs#E_>hHynsg`p5pTM z0J82CFJ5CYj3(3s2cgT}KB=Lu|+l~#{{ow0;fr_mHdm0#Jj? zW0<0_nUOcw2T+QAvKs8Smy*%(BStlrqlp_)0*Zcl&@aS^2Pm1| zRPoiiHpYVfG)x<{(tHUFaZxI-esenh?H8AN5gVh;@kOmfx1s!>olR@NGdc}tK8$Ao zgwS9SGG#qsnS3=)D>Mt>C;O){$`@K0%=ejNuoxn4`f=aPK3?0%mudtZ8e^_3vXYA! zhDBqh!MqI*m&`h;W}Le^Hx&_FJo@Yv6(B>_8GgJXsG%ga)<+em!ips^qx9>D@%MW{ zHg!=^=kXaKP%={p?K!nH#=s4klsc z3}!W)tg`(f@N0C4^KKCPi-cYVTwy%vTSUIk*T+LnX@Pk_5N}bOtp7MI=cfleqzpda zOCbDI5qGgoy=7}xCZ6s#o(>Sxxbz=`QP*n;+1ls`+Z_g}tJ8a${P0IYlS^wVld+=v z)m+Se$E-mb}HW{dwWaZ-^+MdXh>LsuS*!HyLj zP`EO9h$g`7t&o9@fbWNP8J0=YnfzFy1nt#uRVjnA^lwL#1<_D4FkL`r_Zdux1eo;{`@sJlh#)2*+_hzJNQTDa4)IG zQpq90IOBvHLag85Xp@Nd5?|D;*8vt19~d#UWtb@j@Ih}G zFz)){uq-UZB;XhD4Rw-Yna;25qx#gAfJ}9X5M*(OK|KA((wN~grxHYyEdQNe%OC!o zmJ*SZ;O2_zySDdwCQai$M%h64YY&@;d*d7=hWK+GVNBMOnbL1FWx1tFl}<_BmQ;+Q z8&R=oLEQ#bMhfhloaW@25Jk*=Oj)=5n&ItCUzV#C>rG_S*tcf=IB#Y~MV^LYMq?hf zMV?}TT+|!?U=IdZv{O9j&pUu#_#Tk+H(}fj68)gc92lIGVa8f__eV&mp?Z_Io&a7q zfGbTxVX)@(BI;jc4xP_rx=s?4Hl;z>x{0X(Ng1>1{NXFXegIr0F)2}y9X*NE@oDk(7$^K_6*0K`P=f|y%o;9362X5ue8nV~LH zx6z{!I!+;rNKpg@e5BNSeB`ZJ1qw5hU!DLto&fPP|0ZC;@^jEdk`p%oYlHnrF3~v0 zV?y9Yco1&uj{v_BLzO@M(uA@Scu6n&SaoW5UWQj{A>({cg^FX{{$+Nh72@Rp8v0O< z9>WAt1qlFeoSz7?j#^!AS6Cg0zn4iv;PWdnsqy@3Zoh=q{E+fq?RA&mQJWd;%m0Mu z)eIs$XR@nhc#PeOvjwoaQ@}=Ms%dRVIjtQQ$0??rFvI7?Mq$M z6*%I_$2W>WcIw3M`49B>(a(>!?xhh1S*-7qtXJC~bZUG+Op2#wO#PCV*1exqajM<`dkar$HeQg5;R(lKe@O#!aYPgk^ z=J1O+;+1xWSq$6JkoJgP~rP52%O(d!+>97PBGm}d^d{4l~r-%7=Fe tfd*A- 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

w`wIMLG4QYa_h1urIQ*t|62~$=TE@oO*e6ib<%z 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 OQ2C|0e4VU$*#853A;X>k literal 0 HcmV?d00001 diff --git a/desktop/public/pow/poof4@3x.png b/desktop/public/pow/poof4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab8dc5282f79c5a1759b93a2b4ee2f97a9a5d5c GIT binary patch literal 19500 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 T!pT40DhA-dK0k8J9(v|KxtuQz literal 0 HcmV?d00001 diff --git a/desktop/public/pow/poof5@3x.png b/desktop/public/pow/poof5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d05aff95b1521039b867510112864ca07bc1c5 GIT binary patch literal 9047 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 D=NfP7 literal 0 HcmV?d00001 diff --git a/desktop/src-tauri/src/commands/mod.rs b/desktop/src-tauri/src/commands/mod.rs index 2f7c343dc..9f61a4063 100644 --- a/desktop/src-tauri/src/commands/mod.rs +++ b/desktop/src-tauri/src/commands/mod.rs @@ -23,6 +23,7 @@ mod profile; mod relay_members; mod social; mod teams; +mod warp; mod workflows; mod workspace; @@ -49,5 +50,6 @@ pub use profile::*; pub use relay_members::*; pub use social::*; pub use teams::*; +pub use warp::*; pub use workflows::*; pub use workspace::*; diff --git a/desktop/src-tauri/src/commands/warp.rs b/desktop/src-tauri/src/commands/warp.rs new file mode 100644 index 000000000..13cac3ef6 --- /dev/null +++ b/desktop/src-tauri/src/commands/warp.rs @@ -0,0 +1,58 @@ +use std::io; +use std::process::{Command, Output}; + +type CmdResult = Result; + +const WARP_CLI_CANDIDATES: &[&str] = &[ + "warp-cli", + "/Applications/Cloudflare WARP.app/Contents/Resources/warp-cli", +]; + +fn handle_warp_cli_output(command: &str, args: &[&str], output: Output) -> CmdResult<()> { + if output.status.success() { + return Ok(()); + } + + let stderr = String::from_utf8_lossy(&output.stderr); + let stdout = String::from_utf8_lossy(&output.stdout); + let details = stderr.trim(); + let details = if details.is_empty() { + stdout.trim() + } else { + details + }; + + if details.is_empty() { + Err(format!("{command} {} failed.", args.join(" "))) + } else { + Err(format!("{command} {} failed: {details}", args.join(" "))) + } +} + +fn run_warp_cli(args: &[&str]) -> CmdResult<()> { + for command in WARP_CLI_CANDIDATES { + let output = match Command::new(command).args(args).output() { + Ok(output) => output, + Err(error) if error.kind() == io::ErrorKind::NotFound => continue, + Err(error) => return Err(format!("Failed to run {command}: {error}")), + }; + + return handle_warp_cli_output(command, args, output); + } + + Err("Cloudflare WARP CLI is not installed or is not on PATH.".to_string()) +} + +#[tauri::command] +pub async fn connect_warp_vpn() -> CmdResult<()> { + tokio::task::spawn_blocking(|| run_warp_cli(&["connect"])) + .await + .map_err(|error| format!("Failed to run WARP command: {error}"))? +} + +#[tauri::command] +pub async fn refresh_warp_access() -> CmdResult<()> { + tokio::task::spawn_blocking(|| run_warp_cli(&["debug", "access-reauth"])) + .await + .map_err(|error| format!("Failed to run WARP command: {error}"))? +} diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs index 47b0e3e6b..648ae610c 100644 --- a/desktop/src-tauri/src/lib.rs +++ b/desktop/src-tauri/src/lib.rs @@ -835,6 +835,8 @@ pub fn run() { cancel_pairing, apply_workspace, get_active_workspace, + connect_warp_vpn, + refresh_warp_access, set_prevent_sleep_active, get_agent_memory, ]) diff --git a/desktop/src/app/AppShell.tsx b/desktop/src/app/AppShell.tsx index 81cd477f5..5a15143cf 100644 --- a/desktop/src/app/AppShell.tsx +++ b/desktop/src/app/AppShell.tsx @@ -75,7 +75,6 @@ import { MainInsetProvider } from "@/shared/layout/MainInsetContext"; import { chromeCssVarDefaults } from "@/shared/layout/chromeLayout"; import { hasPrimaryShortcutModifier } from "@/shared/lib/platform"; import { useMessageDeepLinks } from "@/shared/useMessageDeepLinks"; -import { ConnectionBanner } from "@/shared/ui/ConnectionBanner"; import { SidebarInset, SidebarProvider } from "@/shared/ui/sidebar"; type AppView = @@ -941,7 +940,6 @@ export function AppShell() { className="min-h-0 min-w-0 overflow-hidden" style={chromeCssVarDefaults} > - diff --git a/desktop/src/features/onboarding/ui/ProfileStep.tsx b/desktop/src/features/onboarding/ui/ProfileStep.tsx index 9236f9e8b..88e502434 100644 --- a/desktop/src/features/onboarding/ui/ProfileStep.tsx +++ b/desktop/src/features/onboarding/ui/ProfileStep.tsx @@ -1,6 +1,17 @@ import * as React from "react"; +import { toast } from "sonner"; +import { + SidebarBlockAccessRefreshCompactCard, + SidebarBlockVpnOffCompactCard, +} from "@/features/sidebar/ui/SidebarRelayConnectionCard"; +import { connectWarpVpn, refreshWarpAccess } from "@/shared/api/tauri"; +import { useReconnectRelay } from "@/shared/api/useReconnectRelay"; import { cn } from "@/shared/lib/cn"; +import { + isRelayUnreachableError, + relayErrorDetail, +} from "@/shared/lib/relayError"; import { Button } from "@/shared/ui/button"; import { Spinner } from "@/shared/ui/spinner"; import { @@ -17,11 +28,152 @@ type ProfileStepProps = { state: ProfileStepState; }; +type OnboardingConnectivityAction = "connect-vpn" | "refresh-access"; + +const ONBOARDING_CONNECTIVITY_SUCCESS_AUTO_DISMISS_MS = 2_500; + +function shouldRefreshVpnAccess(errorMessage: string) { + const detail = relayErrorDetail(errorMessage).toLowerCase(); + return ( + detail.includes("cloudflare") || + detail.includes("access") || + detail.includes("sign-in") || + detail.includes("re-authenticate") || + detail.includes("reauth") || + detail.includes("proxy") + ); +} + +function OnboardingRelayConnectionErrorCard({ message }: { message: string }) { + const { isPending: isReconnectPending, reconnect } = useReconnectRelay(); + const [dismissedErrorMessage, setDismissedErrorMessage] = React.useState< + string | null + >(null); + const [connectivityAction, setConnectivityAction] = + React.useState(null); + const [successAction, setSuccessAction] = + React.useState(null); + const connectivityActionRef = + React.useRef(null); + const successTimeoutRef = React.useRef(null); + const isRefreshAccessCard = shouldRefreshVpnAccess(message); + const isActionPending = connectivityAction !== null || isReconnectPending; + + React.useEffect(() => { + return () => { + if (successTimeoutRef.current !== null) { + window.clearTimeout(successTimeoutRef.current); + } + }; + }, []); + + const markSuccess = React.useCallback( + (action: OnboardingConnectivityAction) => { + setSuccessAction(action); + if (successTimeoutRef.current !== null) { + window.clearTimeout(successTimeoutRef.current); + } + successTimeoutRef.current = window.setTimeout(() => { + successTimeoutRef.current = null; + setDismissedErrorMessage(message); + }, ONBOARDING_CONNECTIVITY_SUCCESS_AUTO_DISMISS_MS); + }, + [message], + ); + + const runConnectivityAction = React.useCallback( + ( + action: OnboardingConnectivityAction, + runAction: () => Promise, + ) => { + if (connectivityActionRef.current !== null) { + return; + } + + connectivityActionRef.current = action; + setConnectivityAction(action); + setSuccessAction(null); + void Promise.resolve() + .then(runAction) + .then((didReconnect) => { + if (didReconnect !== false) { + markSuccess(action); + } + }) + .catch((error) => { + const detail = error instanceof Error ? error.message : String(error); + const label = + action === "refresh-access" + ? "Could not refresh VPN access." + : "Could not turn on VPN."; + toast.error(`${label} ${detail}`); + }) + .finally(() => { + connectivityActionRef.current = null; + setConnectivityAction(null); + }); + }, + [markSuccess], + ); + + const handleConnectWarpVpn = React.useCallback(() => { + runConnectivityAction("connect-vpn", async () => { + await connectWarpVpn(); + return reconnect(); + }); + }, [reconnect, runConnectivityAction]); + + const handleRefreshWarpAccess = React.useCallback(() => { + runConnectivityAction("refresh-access", async () => { + await refreshWarpAccess(); + return reconnect(); + }); + }, [reconnect, runConnectivityAction]); + + if (dismissedErrorMessage === message) { + return null; + } + + return ( +
+ {isRefreshAccessCard ? ( + setDismissedErrorMessage(message)} + surface="secondary" + testId="onboarding-vpn-access-refresh-card" + /> + ) : ( + setDismissedErrorMessage(message)} + surface="secondary" + testId="onboarding-vpn-off-card" + /> + )} +
+ ); +} + function ErrorBanner({ message }: { message: string | null }) { if (!message) { return null; } + if (isRelayUnreachableError(message)) { + return ( + + ); + } + return (

{message} diff --git a/desktop/src/features/settings/SidebarUpdateCard.tsx b/desktop/src/features/settings/SidebarUpdateCard.tsx index 158636057..71ed7aa2f 100644 --- a/desktop/src/features/settings/SidebarUpdateCard.tsx +++ b/desktop/src/features/settings/SidebarUpdateCard.tsx @@ -1,57 +1,100 @@ -import { CircleArrowUp, X } from "lucide-react"; - -import { Button } from "@/shared/ui/button"; +import * as React from "react"; +import { CircleArrowUp, Loader2 } from "lucide-react"; import { useUpdaterContext } from "./hooks/UpdaterProvider"; import { shouldShowSidebarUpdateCard } from "./sidebarUpdateCardVisibility"; +import { SidebarCompactActionCard } from "@/shared/ui/sidebar-action-card"; type SidebarUpdateCardProps = { onDismiss: () => void; }; +type SidebarUpdateCompactCardProps = SidebarUpdateCardProps & { + actionTestId?: string; + testId?: string; +}; + +export function SidebarUpdateCompactCard({ + actionTestId, + onDismiss, + testId = "sidebar-update-card-compact", +}: SidebarUpdateCompactCardProps) { + const { relaunch } = useUpdaterContext(); + const [isRestartPending, setIsRestartPending] = React.useState(false); + const restartPendingRef = React.useRef(false); + const restartFrameRef = React.useRef(null); + const restartTimeoutRef = React.useRef(null); + + React.useEffect(() => { + return () => { + if (restartFrameRef.current !== null) { + window.cancelAnimationFrame(restartFrameRef.current); + } + if (restartTimeoutRef.current !== null) { + window.clearTimeout(restartTimeoutRef.current); + } + restartPendingRef.current = false; + }; + }, []); + + const handleRestart = React.useCallback(() => { + if (restartPendingRef.current) { + return; + } + + restartPendingRef.current = true; + setIsRestartPending(true); + restartFrameRef.current = window.requestAnimationFrame(() => { + restartFrameRef.current = null; + restartTimeoutRef.current = window.setTimeout(() => { + restartTimeoutRef.current = null; + void relaunch() + .catch((error) => { + console.error("[SidebarUpdateCard] relaunch failed:", error); + }) + .finally(() => { + restartPendingRef.current = false; + setIsRestartPending(false); + }); + }, 0); + }); + }, [relaunch]); + + return ( +

-
-
- - -
-

Update ready

-

- Restart to apply the update. -

- -
-
+ ); } diff --git a/desktop/src/features/settings/sidebarUpdateCardVisibility.ts b/desktop/src/features/settings/sidebarUpdateCardVisibility.ts index 72b6d991f..61159f7f3 100644 --- a/desktop/src/features/settings/sidebarUpdateCardVisibility.ts +++ b/desktop/src/features/settings/sidebarUpdateCardVisibility.ts @@ -1,7 +1,3 @@ -const SHOW_UPDATE_CARD_PREVIEW = - import.meta.env.DEV && - import.meta.env.VITE_SIDEBAR_UPDATE_CARD_PREVIEW === "1"; - export function shouldShowSidebarUpdateCard(status: { state: string }) { - return status.state === "ready" || SHOW_UPDATE_CARD_PREVIEW; + return status.state === "ready"; } diff --git a/desktop/src/features/sidebar/ui/AppSidebar.tsx b/desktop/src/features/sidebar/ui/AppSidebar.tsx index 829892e4d..174dd4ad3 100644 --- a/desktop/src/features/sidebar/ui/AppSidebar.tsx +++ b/desktop/src/features/sidebar/ui/AppSidebar.tsx @@ -9,11 +9,12 @@ import { PenSquare, Zap, } from "lucide-react"; -import { useReconnectRelay } from "@/shared/api/useReconnectRelay"; import { - isRelayUnreachableError, - RELAY_UNREACHABLE_SHORT, -} from "@/shared/lib/relayError"; + isRelayConnectionDegraded, + useRelayConnection, +} from "@/shared/api/useRelayConnection"; +import { useReconnectRelay } from "@/shared/api/useReconnectRelay"; +import { isRelayUnreachableError } from "@/shared/lib/relayError"; import * as React from "react"; import { FeatureGate } from "@/shared/features"; import { SidebarDndContext } from "@/features/sidebar/ui/SidebarDnd"; @@ -43,6 +44,7 @@ import { import { CreateChannelDialog } from "@/features/sidebar/ui/CreateChannelDialog"; import { NewDirectMessageDialog } from "@/features/sidebar/ui/NewDirectMessageDialog"; import { SidebarProfileCard } from "@/features/sidebar/ui/SidebarProfileCard"; +import { SidebarRelayConnectionCard } from "@/features/sidebar/ui/SidebarRelayConnectionCard"; import { SECTION_ACTION_VISIBILITY_CLASS } from "@/features/sidebar/ui/sidebarSectionStyles"; import { SidebarUpdateCard } from "@/features/settings/SidebarUpdateCard"; import { useUpdaterContext } from "@/features/settings/hooks/UpdaterProvider"; @@ -83,6 +85,7 @@ type CollapsibleSidebarGroup = // --------------------------------------------------------------------------- type CreateChannelKind = "stream" | "forum"; +const SIDEBAR_CONNECTIVITY_SUCCESS_AUTO_DISMISS_MS = 2_500; type AppSidebarProps = { activeWorkspace: Workspace | null; @@ -226,20 +229,100 @@ export function AppSidebar({ onUnstarChannel, }: AppSidebarProps) { const { status: updateStatus } = useUpdaterContext(); + const relayConnectionState = useRelayConnection(); + const hasRelayUnreachableError = errorMessage + ? isRelayUnreachableError(errorMessage) + : false; + const isRelayConnectionActuallyDegraded = + hasRelayUnreachableError || isRelayConnectionDegraded(relayConnectionState); + const isRelayConnectionConnected = relayConnectionState === "connected"; const canShowSidebarUpdateCard = shouldShowSidebarUpdateCard(updateStatus); + const [ + isSidebarRelayConnectionCardDismissed, + setIsSidebarRelayConnectionCardDismissed, + ] = React.useState(false); const [isSidebarUpdateCardDismissed, setIsSidebarUpdateCardDismissed] = React.useState(false); + const [hasRelayConnectionSuccess, setHasRelayConnectionSuccess] = + React.useState(false); + const canShowSidebarRelayConnectionCard = + isRelayConnectionActuallyDegraded || hasRelayConnectionSuccess; + const showSidebarRelayConnectionCard = + canShowSidebarRelayConnectionCard && !isSidebarRelayConnectionCardDismissed; const showSidebarUpdateCard = canShowSidebarUpdateCard && !isSidebarUpdateCardDismissed; + const isRelayConnectionCardVisible = showSidebarRelayConnectionCard; + const sidebarFooterCardCount = + (showSidebarRelayConnectionCard ? 1 : 0) + (showSidebarUpdateCard ? 1 : 0); + const sidebarContentBottomPaddingClass = + sidebarFooterCardCount >= 2 + ? "pb-[18rem]" + : sidebarFooterCardCount >= 1 + ? "pb-52" + : "pb-32"; + const unreadBelowBottomClass = + sidebarFooterCardCount >= 2 + ? "bottom-56" + : sidebarFooterCardCount >= 1 + ? "bottom-44" + : "bottom-28"; const skeletonRows = ["first", "second", "third", "fourth", "fifth", "sixth"]; const [isNewDmOpenInternal, setIsNewDmOpenInternal] = React.useState(false); const isNewDmOpen = isNewDmOpenProp ?? isNewDmOpenInternal; const setIsNewDmOpen = onNewDmOpenChange ?? setIsNewDmOpenInternal; const scrollRef = React.useRef(null); + const wasSidebarRelayProblemCardVisibleRef = React.useRef(false); useSidebarScrollLock(scrollRef); const [createDialogKind, setCreateDialogKind] = React.useState(null); + React.useEffect(() => { + if (!isRelayConnectionActuallyDegraded && !hasRelayConnectionSuccess) { + setIsSidebarRelayConnectionCardDismissed(false); + } + }, [hasRelayConnectionSuccess, isRelayConnectionActuallyDegraded]); + + React.useEffect(() => { + if (isRelayConnectionActuallyDegraded) { + setHasRelayConnectionSuccess(false); + setIsSidebarRelayConnectionCardDismissed(false); + } + }, [isRelayConnectionActuallyDegraded]); + + React.useEffect(() => { + if (isRelayConnectionActuallyDegraded) { + wasSidebarRelayProblemCardVisibleRef.current = + isRelayConnectionCardVisible && !hasRelayConnectionSuccess; + return; + } + + if ( + wasSidebarRelayProblemCardVisibleRef.current && + isRelayConnectionConnected + ) { + wasSidebarRelayProblemCardVisibleRef.current = false; + setHasRelayConnectionSuccess(true); + } + }, [ + hasRelayConnectionSuccess, + isRelayConnectionCardVisible, + isRelayConnectionActuallyDegraded, + isRelayConnectionConnected, + ]); + + React.useEffect(() => { + if (!hasRelayConnectionSuccess) { + return; + } + + const timeout = window.setTimeout(() => { + setHasRelayConnectionSuccess(false); + setIsSidebarRelayConnectionCardDismissed(true); + }, SIDEBAR_CONNECTIVITY_SUCCESS_AUTO_DISMISS_MS); + + return () => window.clearTimeout(timeout); + }, [hasRelayConnectionSuccess]); + React.useEffect(() => { if (!canShowSidebarUpdateCard) { setIsSidebarUpdateCardDismissed(false); @@ -299,6 +382,64 @@ export function AppSidebar({ } = useChannelSections(currentPubkey); const { isPending: isReconnectPending, reconnect } = useReconnectRelay(); + const [sidebarConnectivityAction, setSidebarConnectivityAction] = + React.useState<"relay-connection" | null>(null); + const sidebarConnectivityActionRef = React.useRef<"relay-connection" | null>( + null, + ); + const sidebarConnectivityFrameRef = React.useRef(null); + const sidebarConnectivityTimeoutRef = React.useRef(null); + const isRelayReconnectPending = + isReconnectPending || sidebarConnectivityAction === "relay-connection"; + + React.useEffect(() => { + return () => { + if (sidebarConnectivityFrameRef.current !== null) { + window.cancelAnimationFrame(sidebarConnectivityFrameRef.current); + } + if (sidebarConnectivityTimeoutRef.current !== null) { + window.clearTimeout(sidebarConnectivityTimeoutRef.current); + } + sidebarConnectivityActionRef.current = null; + }; + }, []); + + const startSidebarConnectivityAction = React.useCallback( + (runAction: () => Promise) => { + if (sidebarConnectivityActionRef.current !== null) { + return; + } + + sidebarConnectivityActionRef.current = "relay-connection"; + setSidebarConnectivityAction("relay-connection"); + sidebarConnectivityFrameRef.current = window.requestAnimationFrame(() => { + sidebarConnectivityFrameRef.current = null; + sidebarConnectivityTimeoutRef.current = window.setTimeout(() => { + sidebarConnectivityTimeoutRef.current = null; + void Promise.resolve() + .then(runAction) + .catch((error) => { + console.error("[AppSidebar] connectivity action failed:", error); + }) + .finally(() => { + sidebarConnectivityActionRef.current = null; + setSidebarConnectivityAction(null); + }); + }, 0); + }); + }, + [], + ); + + const handleReconnectRelay = React.useCallback(() => { + startSidebarConnectivityAction(async () => { + setHasRelayConnectionSuccess(false); + const didReconnect = await reconnect(); + if (didReconnect) { + setHasRelayConnectionSuccess(true); + } + }); + }, [reconnect, startSidebarConnectivityAction]); const [createSectionState, setCreateSectionState] = React.useState<{ open: boolean; @@ -542,7 +683,7 @@ export function AppSidebar({ /> ) : null} {isLoading ? ( @@ -744,36 +885,16 @@ export function AppSidebar({ ) : null} - {errorMessage ? ( - isRelayUnreachableError(errorMessage) ? ( -
- - {RELAY_UNREACHABLE_SHORT}{" "} - - -
- ) : ( -
- {errorMessage} -
- ) + {errorMessage && !hasRelayUnreachableError ? ( +
+ {errorMessage} +
) : null}
{unreadBelowCount > 0 ? ( } onClick={scrollToNextBelow} @@ -783,6 +904,16 @@ export function AppSidebar({ ) : null} + {showSidebarRelayConnectionCard ? ( +
+ setIsSidebarRelayConnectionCardDismissed(true)} + onReconnect={handleReconnectRelay} + /> +
+ ) : null} {showSidebarUpdateCard ? (
void; + onReconnect: () => void; + surface?: SidebarActionCardSurface; + testId?: string; +}; + +type SidebarBlockConnectivityCardProps = { + actionTestId?: string; + isActionDisabled: boolean; + isActionPending: boolean; + isActionSuccess?: boolean; + onAction: () => void; + onDismiss?: () => void; + surface?: SidebarActionCardSurface; + testId?: string; +}; + +export function SidebarRelayConnectionCard({ + actionTestId, + isActionDisabled = false, + isConnected = false, + isReconnectPending, + onDismiss, + onReconnect, + surface, +}: SidebarRelayConnectionCardProps) { + return ( + + ); +} + +export function SidebarRelayConnectionCompactCard({ + actionTestId, + isActionDisabled = false, + isConnected = false, + isReconnectPending, + onDismiss, + onReconnect, + surface, + testId = "sidebar-relay-unreachable-compact", +}: SidebarRelayConnectionCardProps) { + return ( +