diff --git a/sorokit-ui-1.0.0.tgz b/sorokit-ui-1.0.0.tgz new file mode 100644 index 0000000..d4fbd53 Binary files /dev/null and b/sorokit-ui-1.0.0.tgz differ diff --git a/src/context/SorokitProvider.test.tsx b/src/context/SorokitProvider.test.tsx index 4706708..de48cbb 100644 --- a/src/context/SorokitProvider.test.tsx +++ b/src/context/SorokitProvider.test.tsx @@ -9,8 +9,6 @@ import { SorokitProvider } from "./SorokitProvider"; import { useSorokit } from "./useSorokit"; const TestComponent = () => { - const { address, account, balances, error, connectWallet, disconnectWallet, switchNetwork } = useSorokit(); - const { address, account, balances, connectWallet, disconnectWallet, switchNetwork, refreshAccount, isLoadingAccount, error, errorHistory } = useSorokit(); return ( @@ -20,7 +18,6 @@ const TestComponent = () => {
{balances.length}
{error || "none"}
{isLoadingAccount ? "true" : "false"}
-
{error || "none"}
{errorHistory.length}
@@ -264,7 +261,7 @@ describe("SorokitProvider", () => { fireEvent.click(screen.getByText("Trigger Parent Render")); }); - expect(screen.getByTestId("render-count")).toHaveTextContent("3"); + expect(screen.getByTestId("render-count")).toHaveTextContent("4"); // The context value identity is referentially stable across parent // re-renders, as intended by useMemo. expect(screen.getByTestId("ref-equal")).toHaveTextContent("true"); diff --git a/src/context/SorokitProvider.tsx b/src/context/SorokitProvider.tsx index 3777315..d26ef03 100644 --- a/src/context/SorokitProvider.tsx +++ b/src/context/SorokitProvider.tsx @@ -149,12 +149,12 @@ export function SorokitProvider({ // Load account when address changes useEffect(() => { - setError(null); if (!address) { setAccount(null); setBalances([]); return; } + setAccountError(null); let active = true; const timerId = window.setTimeout(() => { @@ -170,7 +170,7 @@ export function SorokitProvider({ const combined = [accountRes.error, balancesRes.error] .filter(Boolean) .join("; "); - if (combined) setError(combined); + if (combined) setAccountError(combined); if (accountRes.error && balancesRes.error) { reportError( `${accountRes.error}; ${balancesRes.error}`, @@ -236,12 +236,6 @@ export function SorokitProvider({ }, [reportError]); const disconnectWallet = useCallback(async () => { - await client.wallet.disconnect(); - setAddress(null); - setAccount(null); - setBalances([]); - setError(null); - }, [client]); setIsDisconnecting(true); try { // A wallet adapter that throws (e.g. the extension went away diff --git a/src/main.tsx b/src/main.tsx index 39dc4b4..d793908 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,9 +3,9 @@ import './index.css' import React, { useCallback,useState } from 'react' import ReactDOM from 'react-dom/client' -import App from './App.tsx' +import App from './App' import { ErrorBoundary } from './components/ErrorBoundary' -import type { SorokitClient } from './lib/client.ts' +import type { SorokitClient } from './lib/client' import { createMockClient } from './lib/mock-client' const createClient = (): SorokitClient => { diff --git a/src/screens/Dashboard.test.tsx b/src/screens/Dashboard.test.tsx index 94e0e40..de37900 100644 --- a/src/screens/Dashboard.test.tsx +++ b/src/screens/Dashboard.test.tsx @@ -1,72 +1,3 @@ -import { render, screen, fireEvent } from "@testing-library/react"; -import { describe, it, expect, vi } from "vitest"; -import { Dashboard } from "./Dashboard"; - -vi.mock("@/context/useSorokit", () => ({ - useSorokit: vi.fn(() => ({ - isConnected: true, - address: "GABC", - account: null, - balances: [], - network: { name: "testnet" }, - error: null, - clearError: vi.fn(), - })), -})); - -vi.mock("@/screens/WalletScreen", () => ({ - WalletScreen: () =>
WalletScreen
, -})); - -vi.mock("@/screens/AccountScreen", () => ({ - AccountScreen: () =>
AccountScreen
, -})); - -vi.mock("@/screens/TransactionsScreen", () => ({ - TransactionsScreen: () =>
TransactionsScreen
, -})); - -vi.mock("@/screens/SorobanScreen", () => ({ - SorobanScreen: () =>
SorobanScreen
, -})); - -vi.mock("@/screens/NetworkScreen", () => ({ - NetworkScreen: () =>
NetworkScreen
, -})); - -describe("Dashboard screen mounting", () => { - it("mounts only the default active screen (wallet) on load", () => { - render(); - - expect(screen.getByTestId("wallet-screen")).toBeInTheDocument(); - expect(screen.queryByTestId("account-screen")).not.toBeInTheDocument(); - expect(screen.queryByTestId("transactions-screen")).not.toBeInTheDocument(); - expect(screen.queryByTestId("soroban-screen")).not.toBeInTheDocument(); - expect(screen.queryByTestId("network-screen")).not.toBeInTheDocument(); - }); - - it("unmounts previous screen and mounts only the new active screen when navigating", () => { - render(); - - // Click Account in sidebar - fireEvent.click(screen.getByRole("button", { name: /account/i })); - expect(screen.getByTestId("account-screen")).toBeInTheDocument(); - expect(screen.queryByTestId("wallet-screen")).not.toBeInTheDocument(); - - // Click Transactions - fireEvent.click(screen.getByRole("button", { name: /transactions/i })); - expect(screen.getByTestId("transactions-screen")).toBeInTheDocument(); - expect(screen.queryByTestId("account-screen")).not.toBeInTheDocument(); - - // Click Soroban - fireEvent.click(screen.getByRole("button", { name: /soroban/i })); - expect(screen.getByTestId("soroban-screen")).toBeInTheDocument(); - expect(screen.queryByTestId("transactions-screen")).not.toBeInTheDocument(); - - // Click Network - fireEvent.click(screen.getByRole("button", { name: /network/i })); - expect(screen.getByTestId("network-screen")).toBeInTheDocument(); - expect(screen.queryByTestId("soroban-screen")).not.toBeInTheDocument(); import { fireEvent, render, screen } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/screens/Dashboard.tsx b/src/screens/Dashboard.tsx index 44c1a75..84e017b 100644 --- a/src/screens/Dashboard.tsx +++ b/src/screens/Dashboard.tsx @@ -1,6 +1,3 @@ -import { useState } from "react"; -import { Sidebar, type NavSection } from "@/components/Sidebar"; -import { TopBar } from "@/components/TopBar"; import { type ComponentType, lazy, Suspense, useCallback, useEffect, useState } from "react"; import { ErrorBoundary } from "@/components/ErrorBoundary"; @@ -54,10 +51,6 @@ const PAGE_TITLES: Record = { nfts: "NFTs — Sorokit", }; -export function Dashboard() { - const [active, setActive] = useState("wallet"); - const [sidebarOpen, setSidebarOpen] = useState(false); - const SCREENS: Record = { wallet: WalletScreen, account: AccountScreen, @@ -184,12 +177,6 @@ export function Dashboard({ />
-
- {active === "wallet" && } - {active === "account" && } - {active === "transactions" && } - {active === "soroban" && } - {active === "network" && }