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
23 changes: 18 additions & 5 deletions apps/web/src/components/preview/PreviewView.browser.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ const mocks = vi.hoisted(() => ({
pickElement: vi.fn(),
addPreviewAnnotation: vi.fn(),
addImage: vi.fn(),
toast: vi.fn(),
pictureInPicture: false,
showEmptyState: false,
loading: false,
Expand Down Expand Up @@ -136,10 +135,6 @@ vi.mock(import("~/browser/browserRecording"), async (original) => ({
findActiveBrowserRecordingRuntimeTabId: () => mocks.recordingRuntimeTabId,
useActiveBrowserRecordingTabIds: () => mocks.recordingTabIds,
}));
vi.mock(import("~/components/ui/toast"), async (original) => {
const actual = await original();
return { ...actual, toastManager: { ...actual.toastManager, add: mocks.toast } };
});
vi.mock(import("./useDiscoveredLocalServers"), async (original) => ({
...(await original()),
useDiscoveredLocalServers: () => mocks.servers,
Expand All @@ -161,6 +156,7 @@ import { useBrowserPointerStore } from "~/browser/browserPointerStore";
import { previewRuntimeTabId } from "~/browser/previewRuntimeTabId";
import { usePreviewMiniPlayerStore } from "~/previewMiniPlayerStore";
import { PreviewView } from "./PreviewView";
import { ToastProvider } from "~/components/ui/toast";

const TEST_THREAD_REF = {
environmentId: EnvironmentId.make("environment-1"),
Expand Down Expand Up @@ -218,6 +214,23 @@ function setup() {
}

describe("PreviewView", () => {
it.each(["mailto:alice@example.com", "http://"])(
"reports rejected address %s without navigating or recording it",
async (address) => {
setup();
await using _screen = await render(<ToastProvider timeout={0}>{view()}</ToastProvider>);
const input = page.getByPlaceholder("Search or enter URL");
await input.fill(address);
await userEvent.keyboard("{Enter}");

await expect.element(page.getByText("Could not open this address")).toBeVisible();
await expect.element(page.getByText("Enter an http or https URL.")).toBeVisible();
expect(mocks.navigate).not.toHaveBeenCalled();
expect(mocks.recordVisitForThread).not.toHaveBeenCalled();
await userEvent.click(page.getByRole("button", { name: "Dismiss notification" }));
},
);

it("retains the annotation locally when its own environment loses access during capture", async () => {
setup();
const picked = annotation("annotation-revoked");
Expand Down
25 changes: 23 additions & 2 deletions apps/web/src/components/preview/PreviewView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
} from "@t3tools/contracts";
import {
normalizePreviewUrl,
isPreviewUrlNormalizationError,
resolveAddressBarInput,
previewPdfAssetUrl,
resolveSearchUrlTemplate,
Expand Down Expand Up @@ -289,7 +290,17 @@ export function PreviewView({
if (await navigateToResolvedUrl(resolved)) {
recordVisitForThread(threadRef, resolved);
}
} catch {}
} catch (error) {
toastManager.add({
type: "error",
title: "Could not open this address",
description: isPreviewUrlNormalizationError(error)
? "Enter an http or https URL."
: error instanceof Error
? error.message
: "An error occurred.",
});
}
};

const handleOpenServerUrl = async (next: string) => {
Expand All @@ -301,7 +312,17 @@ export function PreviewView({
if (await navigateToResolvedUrl(resolved)) {
recordVisitForThread(threadRef, next);
}
} catch {}
} catch (error) {
toastManager.add({
type: "error",
title: "Could not open this address",
description: isPreviewUrlNormalizationError(error)
? "Enter an http or https URL."
: error instanceof Error
? error.message
: "An error occurred.",
});
}
};

const handleRefresh = () => {
Expand Down
Loading