diff --git a/src/app/[lang]/components/NavBar/NavBar.test.tsx b/src/app/[lang]/components/NavBar/NavBar.test.tsx
index 533492a..cb9c3de 100644
--- a/src/app/[lang]/components/NavBar/NavBar.test.tsx
+++ b/src/app/[lang]/components/NavBar/NavBar.test.tsx
@@ -1,6 +1,8 @@
import '@testing-library/jest-dom';
import { render, screen } from '@testing-library/react';
import i18nextClientMock from '@/app/lib/testing/i18nextClientMock';
+// This must be imported after the mock classes are imported
+import { JotaiProvider } from '@/app/[lang]/components';
// Mock react `use` function before modules that use it are imported
jest.mock('react', () => ({
@@ -21,33 +23,36 @@ jest.mock('next/navigation', () => ({
// Mock i18next because it is used by child components
jest.mock('react-i18next', () => i18nextClientMock);
+// Mock the wallet provider
+jest.mock('../wallet/WalletProvider.tsx', () => 'div');
+
import NavBar from './NavBar';
describe('Nav Bar Component', () => {
it('renders', async () => {
- render();
+ render();
expect(await screen.findByRole('navigation')).toBeInTheDocument();
});
it('has site name', async () => {
- render();
+ render();
expect(await screen.findByText('site_name_pt1')).toBeInTheDocument();
expect(screen.getByText('site_name_pt2')).toBeInTheDocument();
});
it('has node selector button', async () => {
- render();
+ render();
expect(await screen.findByTitle('node_selector.choose_node')).toBeInTheDocument();
});
it('has language selector button', async () => {
- render();
+ render();
expect(await screen.findByTestId('lang-btn')).toBeInTheDocument();
});
it('has settings button', async () => {
- render();
+ render();
expect(await screen.findByTitle('settings.heading')).toBeInTheDocument();
});
diff --git a/src/app/[lang]/components/NavBar/NodeSelector/CustomNodeDialogContent.tsx b/src/app/[lang]/components/NavBar/NodeSelector/CustomNodeDialogContent.tsx
index 52ed2d8..769b01b 100644
--- a/src/app/[lang]/components/NavBar/NodeSelector/CustomNodeDialogContent.tsx
+++ b/src/app/[lang]/components/NavBar/NodeSelector/CustomNodeDialogContent.tsx
@@ -12,9 +12,9 @@ import { type PrimitiveAtom, atom, useAtom, useAtomValue, useSetAtom, useStore }
import { RESET } from "jotai/utils";
import { atomWithValidate } from "jotai-form";
import * as NodeConfigLib from "@/app/lib/node-config";
+import { ToastNotification } from '@/app/[lang]/components';
import { FieldErrorMessage, FieldGroup, TextField } from "@/app/[lang]/components/form";
import { ValidationMessage, isAlgodOK, removeNonNumericalChars } from "@/app/lib/utils";
-import ToastNotification from '@/app/[lang]/components/ToastNotification';
import { UNIT_NAME_MAX_LENGTH } from "@/app/lib/txn-data/constants";
type Props = {
diff --git a/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.test.tsx b/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.test.tsx
index ad4f8fd..abc8738 100644
--- a/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.test.tsx
+++ b/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.test.tsx
@@ -9,9 +9,9 @@ import {
voiTestnetNodeConfig,
} from '@/app/lib/node-config';
import { type NodeConfig } from '@/app/lib/node-config';
-import JotaiProvider from '@/app/[lang]/components/JotaiProvider';
-import { Provider as ToastProvider, Viewport as ToastViewport } from '@radix-ui/react-toast';
import i18nextClientMock from '@/app/lib/testing/i18nextClientMock';
+// Jotai provider must be imported after the mock classes are imported
+import { JotaiProvider, ToastProvider, ToastViewport } from '@/app/[lang]/components';
// Mock i18next before modules that use it are imported
jest.mock('react-i18next', () => i18nextClientMock);
@@ -44,6 +44,9 @@ jest.mock('algosdk', () => ({
}
}));
+// Mock the wallet provider
+jest.mock('../../wallet/WalletProvider.tsx', () => 'div');
+
import NodeSelector from './NodeSelector';
describe('Node Selector', () => {
diff --git a/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.tsx b/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.tsx
index d3caabc..5832ee5 100644
--- a/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.tsx
+++ b/src/app/[lang]/components/NavBar/NodeSelector/NodeSelector.tsx
@@ -19,7 +19,7 @@ import {
} from '@tabler/icons-react';
import { useTranslation } from '@/app/i18n/client';
import * as NodeConfigLib from '@/app/lib/node-config';
-import DialogLoadingPlaceholder from '@/app/[lang]/components/DialogLoadingPlaceholder';
+import { DialogLoadingPlaceholder } from '@/app/[lang]/components';
import NodeMenuItem from './NodeMenuItem';
const ViewConfigDialogContent = dynamic(() => import('./ViewConfigDialogContent'), {
diff --git a/src/app/[lang]/components/NavBar/Settings/SettingsDialog.tsx b/src/app/[lang]/components/NavBar/Settings/SettingsDialog.tsx
index 45f780d..7023fa4 100644
--- a/src/app/[lang]/components/NavBar/Settings/SettingsDialog.tsx
+++ b/src/app/[lang]/components/NavBar/Settings/SettingsDialog.tsx
@@ -4,7 +4,7 @@ import { useTranslation } from '@/app/i18n/client';
import * as Dialog from '@radix-ui/react-dialog';
import { IconSettings, IconX } from '@tabler/icons-react';
import dynamic from 'next/dynamic';
-import DialogLoadingPlaceholder from '@/app/[lang]/components/DialogLoadingPlaceholder';
+import { DialogLoadingPlaceholder } from '@/app/[lang]/components';
const SettingsModalBox = dynamic(() => import('./SettingsForm'), {
ssr: false,
diff --git a/src/app/[lang]/components/NavBar/Settings/SettingsForm.tsx b/src/app/[lang]/components/NavBar/Settings/SettingsForm.tsx
index 32461e1..3a90fd4 100644
--- a/src/app/[lang]/components/NavBar/Settings/SettingsForm.tsx
+++ b/src/app/[lang]/components/NavBar/Settings/SettingsForm.tsx
@@ -5,6 +5,7 @@ import { useAtom, useSetAtom } from 'jotai';
import { RESET } from 'jotai/utils';
import { useTranslation } from '@/app/i18n/client';
import { Trans } from 'react-i18next';
+import { ToastNotification, WalletProvider } from '@/app/[lang]/components';
import {
NumberField,
RadioButtonGroupField,
@@ -12,10 +13,8 @@ import {
} from '@/app/[lang]/components/form';
import { useDebouncedCallback } from 'use-debounce';
import * as Settings from '@/app/lib/app-settings';
-import { WalletProvider } from '@/app/[lang]/components';
import { storedSignedTxnAtom, storedTxnDataAtom } from '@/app/lib/txn-data';
import ConnectWallet from './ConnectWallet';
-import ToastNotification from '@/app/[lang]/components/ToastNotification';
import { IconExclamationCircle } from '@tabler/icons-react';
type Props = {
diff --git a/src/app/[lang]/components/PageTitleHeading/index.ts b/src/app/[lang]/components/PageTitleHeading/index.ts
new file mode 100644
index 0000000..01103ec
--- /dev/null
+++ b/src/app/[lang]/components/PageTitleHeading/index.ts
@@ -0,0 +1,2 @@
+import PageTitleHeading from './PageTitleHeading';
+export default PageTitleHeading;
diff --git a/src/app/[lang]/components/index.ts b/src/app/[lang]/components/index.ts
index 6ad721a..f357f57 100644
--- a/src/app/[lang]/components/index.ts
+++ b/src/app/[lang]/components/index.ts
@@ -1,8 +1,10 @@
export {default as BuilderSteps} from './BuilderSteps';
+export {default as DialogLoadingPlaceholder} from './DialogLoadingPlaceholder';
export {default as Footer} from './Footer';
export {default as JotaiProvider} from './JotaiProvider';
export {default as NavBar} from './NavBar';
-export {default as PageTitleHeading} from './PageTitleHeading/PageTitleHeading';
+export {default as PageTitleHeading} from './PageTitleHeading';
+export {default as ToastNotification} from './ToastNotification';
export {default as ToastProvider} from './ToastProvider';
export {default as ToastViewport} from './ToastViewport';
export {default as WalletProvider} from './wallet/WalletProvider';