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" &&
}