Skip to content

Commit 4077975

Browse files
Remove duplicated theme context from keychain (#1424)
1 parent 7a4886e commit 4077975

15 files changed

+71
-144
lines changed

packages/keychain/.storybook/mock.ts

+27-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { constants, RpcProvider } from "starknet";
22
import Controller from "@cartridge/controller";
3-
import { SessionPolicies } from "@cartridge/presets";
3+
import { controllerConfigs, SessionPolicies } from "@cartridge/presets";
44
import { Parameters } from "@storybook/react";
55
import { ConnectionContextValue } from "../src/components/provider/connection";
66
import { UpgradeInterface } from "../src/hooks/upgrade";
77
import { ConnectCtx, ConnectionCtx } from "../src/utils/connection/types";
88
import { defaultTheme } from "@cartridge/presets";
9+
import { useThemeEffect } from "@cartridge/ui-next";
910

1011
export interface StoryParameters extends Parameters {
1112
connection?: {
@@ -18,18 +19,30 @@ export interface StoryParameters extends Parameters {
1819
policies?: SessionPolicies;
1920
}
2021

21-
export function useMockedConnection({
22-
chainId = constants.StarknetChainId.SN_MAIN,
23-
context = {
24-
type: "connect",
25-
origin: "http://localhost:3002",
26-
policies: [],
27-
resolve: () => {},
28-
reject: () => {},
29-
} as ConnectCtx,
30-
controller,
31-
...rest
32-
}: StoryParameters["connection"] = {}): ConnectionContextValue {
22+
export function useMockedConnection(
23+
parameters: StoryParameters = {},
24+
): ConnectionContextValue {
25+
const {
26+
chainId = constants.StarknetChainId.SN_MAIN,
27+
context = {
28+
type: "connect",
29+
origin: "http://localhost:3002",
30+
policies: [],
31+
resolve: () => {},
32+
reject: () => {},
33+
} as ConnectCtx,
34+
controller,
35+
...rest
36+
} = parameters.connection ?? {};
37+
const theme = parameters.preset
38+
? (controllerConfigs[parameters.preset].theme ?? defaultTheme)
39+
: defaultTheme;
40+
41+
useThemeEffect({
42+
theme,
43+
assetUrl: "",
44+
});
45+
3346
return {
3447
context,
3548
controller: {
@@ -45,7 +58,7 @@ export function useMockedConnection({
4558
origin: "http://localhost:3002",
4659
rpcUrl: "http://api.cartridge.gg/x/starknet/mainnet",
4760
policies: {},
48-
theme: { defaultTheme, verified: true },
61+
theme: { ...theme, verified: true },
4962
hasPrefundRequest: false,
5063
setContext: () => {},
5164
setController: () => {},
+2-34
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
11
import React, { PropsWithChildren } from "react";
22
import { QueryClient, QueryClientProvider } from "react-query";
3-
import { controllerConfigs } from "@cartridge/presets";
43
import { mainnet } from "@starknet-react/chains";
54
import { StarknetConfig, publicProvider, voyager } from "@starknet-react/core";
6-
import { useThemeEffect } from "@cartridge/ui-next";
75
import { BrowserRouter } from "react-router-dom";
86
import { ConnectionContext } from "../src/components/provider/connection";
97
import { UIProvider } from "../src/components/provider/ui";
108
import { StoryParameters, useMockedConnection } from "./mock";
11-
import {
12-
ControllerThemeContext,
13-
VerifiableControllerTheme,
14-
} from "../src/context/theme";
159
import { TokensProvider } from "../src/components/provider/tokens";
1610

1711
export function Provider({
1812
children,
1913
parameters,
2014
}: { parameters: StoryParameters } & PropsWithChildren) {
21-
const connection = useMockedConnection(parameters.connection);
22-
23-
if (parameters.preset) {
24-
const config = controllerConfigs[parameters.preset];
25-
26-
if (parameters.preset === "cartridge" && config.theme) {
27-
(config.theme as VerifiableControllerTheme).verified = true;
28-
}
29-
30-
connection.theme = config.theme || connection.theme;
31-
connection.policies = config.policies || connection.policies;
32-
}
15+
const connection = useMockedConnection(parameters);
3316

3417
return (
3518
<StarknetConfig
@@ -41,9 +24,7 @@ export function Provider({
4124
<ConnectionContext.Provider value={connection}>
4225
<UIProvider>
4326
<TokensProvider>
44-
<ControllerThemeProvider theme={connection.theme}>
45-
<BrowserRouter>{children}</BrowserRouter>
46-
</ControllerThemeProvider>
27+
<BrowserRouter>{children}</BrowserRouter>
4728
</TokensProvider>
4829
</UIProvider>
4930
</ConnectionContext.Provider>
@@ -53,16 +34,3 @@ export function Provider({
5334
}
5435

5536
const queryClient = new QueryClient();
56-
57-
function ControllerThemeProvider({
58-
children,
59-
theme,
60-
}: PropsWithChildren<{ theme: VerifiableControllerTheme }>) {
61-
useThemeEffect({ theme, assetUrl: "" });
62-
63-
return (
64-
<ControllerThemeContext.Provider value={{ ...theme }}>
65-
{children}
66-
</ControllerThemeContext.Provider>
67-
);
68-
}

packages/keychain/src/components/connect/create/CreateController.stories.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { CreateControllerView } from "./CreateController";
3-
import { VerifiableControllerTheme } from "@/context/theme";
3+
import { VerifiableControllerTheme } from "@/components/provider/connection";
44

55
const meta: Meta<typeof CreateControllerView> = {
66
component: CreateControllerView,

packages/keychain/src/components/connect/create/CreateController.test.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ vi.mock("@/hooks/posthog", () => ({
1717
}),
1818
}));
1919

20-
vi.mock("@/hooks/theme", () => ({
20+
vi.mock("@/hooks/connection", () => ({
2121
useControllerTheme: () => mockUseControllerTheme(),
2222
}));
2323

packages/keychain/src/components/connect/create/CreateController.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useRef, useState, useEffect } from "react";
1+
import { useRef, useState, useEffect, useCallback } from "react";
22
import {
33
LayoutContainer,
44
LayoutFooter,
@@ -7,16 +7,16 @@ import {
77
LayoutHeader,
88
CreateAccount,
99
} from "@cartridge/ui-next";
10-
import { useControllerTheme } from "@/hooks/theme";
1110
import { useDebounce } from "@/hooks/debounce";
1211
import { useUsernameValidation } from "./useUsernameValidation";
1312
import { LoginMode } from "../types";
1413
import { Legal } from "./Legal";
1514
import { useCreateController } from "./useCreateController";
1615
import { ErrorAlert } from "@/components/ErrorAlert";
17-
import { VerifiableControllerTheme } from "@/context/theme";
1816
import InAppSpy from "inapp-spy";
1917
import { usePostHog } from "@cartridge/utils";
18+
import { useControllerTheme } from "@/hooks/connection";
19+
import { VerifiableControllerTheme } from "@/components/provider/connection";
2020

2121
interface CreateControllerViewProps {
2222
theme: VerifiableControllerTheme;
@@ -174,7 +174,7 @@ export function CreateController({
174174
loginMode,
175175
});
176176

177-
const handleFormSubmit = () => {
177+
const handleFormSubmit = useCallback(() => {
178178
if (!usernameField.value) {
179179
return;
180180
}
@@ -187,7 +187,7 @@ export function CreateController({
187187
if (validation.status === "valid") {
188188
handleSubmit(usernameField.value, !!validation.exists);
189189
}
190-
};
190+
}, [handleSubmit, usernameField.value, validation.exists, validation.status]);
191191

192192
useEffect(() => {
193193
if (pendingSubmitRef.current && debouncedValidation.status === "valid") {

packages/keychain/src/components/provider/connection.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Controller from "@/utils/controller";
33
import { ConnectionCtx } from "@/utils/connection";
44
import { UpgradeInterface } from "@/hooks/upgrade";
55
import { ParsedSessionPolicies } from "@/hooks/session";
6-
import { VerifiableControllerTheme } from "@/context/theme";
6+
import { ControllerTheme } from "@cartridge/ui-next";
77

88
export const ConnectionContext = createContext<
99
ConnectionContextValue | undefined
@@ -25,3 +25,7 @@ export type ConnectionContextValue = {
2525
logout: () => void;
2626
openSettings: () => void;
2727
};
28+
29+
export type VerifiableControllerTheme = ControllerTheme & {
30+
verified: boolean;
31+
};

packages/keychain/src/components/provider/index.tsx

+10-13
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useConnectionValue } from "@/hooks/connection";
44
import { CartridgeAPIProvider } from "@cartridge/utils/api/cartridge";
55
import { ENDPOINT } from "@/utils/graphql";
66
import { PostHogProvider } from "./posthog";
7-
import { ControllerThemeProvider } from "./theme";
87
import { UIProvider } from "./ui";
98
import { jsonRpcProvider, StarknetConfig, voyager } from "@starknet-react/core";
109
import { sepolia, mainnet } from "@starknet-react/chains";
@@ -40,18 +39,16 @@ export function Provider({ children }: PropsWithChildren) {
4039
<ConnectionContext.Provider value={connection}>
4140
<UIProvider>
4241
<BrowserRouter>
43-
<ControllerThemeProvider>
44-
<StarknetConfig
45-
explorer={voyager}
46-
chains={[sepolia, mainnet]}
47-
defaultChainId={defaultChainId}
48-
provider={jsonRpcProvider({ rpc })}
49-
>
50-
<TokensProvider>
51-
<PostHogProvider>{children}</PostHogProvider>
52-
</TokensProvider>
53-
</StarknetConfig>
54-
</ControllerThemeProvider>
42+
<StarknetConfig
43+
explorer={voyager}
44+
chains={[sepolia, mainnet]}
45+
defaultChainId={defaultChainId}
46+
provider={jsonRpcProvider({ rpc })}
47+
>
48+
<TokensProvider>
49+
<PostHogProvider>{children}</PostHogProvider>
50+
</TokensProvider>
51+
</StarknetConfig>
5552
</BrowserRouter>
5653
</UIProvider>
5754
</ConnectionContext.Provider>

packages/keychain/src/components/provider/theme.tsx

-16
This file was deleted.

packages/keychain/src/components/transaction/ConfirmTransaction.stories.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
22

33
import { ConfirmTransaction } from "./ConfirmTransaction";
44
import { ETH_CONTRACT_ADDRESS } from "@cartridge/utils";
5-
import { VerifiableControllerTheme } from "@/context/theme";
5+
import { VerifiableControllerTheme } from "@/components/provider/connection";
66

77
const meta = {
88
component: ConfirmTransaction,

packages/keychain/src/context/theme.tsx

-10
This file was deleted.

packages/keychain/src/hooks/connection.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ import {
1414
import {
1515
ConnectionContext,
1616
ConnectionContextValue,
17+
VerifiableControllerTheme,
1718
} from "@/components/provider/connection";
1819
import { UpgradeInterface, useUpgrade } from "./upgrade";
1920
import { Policies } from "@cartridge/presets";
2021
import { defaultTheme, controllerConfigs } from "@cartridge/presets";
2122
import { ParsedSessionPolicies, parseSessionPolicies } from "./session";
22-
import { VerifiableControllerTheme } from "@/context/theme";
23+
import { useThemeEffect } from "@cartridge/ui-next";
2324

2425
type ParentMethods = AsyncMethodReturns<{ close: () => Promise<void> }>;
2526

@@ -97,15 +98,15 @@ export function useConnectionValue() {
9798
if (presetParam && presetParam in controllerConfigs) {
9899
const allowedOrigins = toArray(controllerConfigs[presetParam].origin);
99100
const verified =
100-
origin &&
101+
!!origin &&
101102
allowedOrigins.some((allowedOrigin) => {
102103
const originUrl = new URL(origin);
103104
return originUrl.hostname === allowedOrigin;
104105
});
105106

106107
if (controllerConfigs[presetParam].theme) {
107108
setTheme({
108-
verified: !!verified,
109+
verified,
109110
...controllerConfigs[presetParam].theme,
110111
});
111112
}
@@ -114,7 +115,7 @@ export function useConnectionValue() {
114115
if (!policiesParam && controllerConfigs[presetParam].policies) {
115116
setPolicies(
116117
parseSessionPolicies({
117-
verified: !!verified,
118+
verified,
118119
policies: controllerConfigs[presetParam].policies,
119120
}),
120121
);
@@ -129,6 +130,8 @@ export function useConnectionValue() {
129130
setController,
130131
]);
131132

133+
useThemeEffect({ theme, assetUrl: "" });
134+
132135
useEffect(() => {
133136
const connection = connectToController<ParentMethods>({
134137
setRpcUrl,
@@ -225,3 +228,7 @@ export function useConnection() {
225228

226229
return ctx;
227230
}
231+
232+
export function useControllerTheme() {
233+
return useConnection().theme;
234+
}

packages/keychain/src/hooks/theme.tsx

-16
This file was deleted.

packages/keychain/src/test/mocks/connection.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ export const defaultMockConnection: ConnectionContextValue = {
3434
rpcUrl: "https://test.rpc.com",
3535
theme: {
3636
verified: true,
37-
name: "name",
38-
cover: "cover",
39-
icon: "icon",
37+
name: "test",
38+
icon: "test-icon",
39+
cover: "test-cover",
4040
},
4141
hasPrefundRequest: false,
4242
setController: vi.fn(),

packages/keychain/src/test/mocks/providers.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { ReactNode } from "react";
22
import { render, RenderResult } from "@testing-library/react";
33
import { BrowserRouter } from "react-router-dom";
4-
import { withTheme } from "./theme";
5-
import { ConnectionContextValue } from "@/components/provider/connection";
6-
import type { VerifiableControllerTheme } from "@/context/theme";
4+
import {
5+
ConnectionContextValue,
6+
VerifiableControllerTheme,
7+
} from "@/components/provider/connection";
78
import { withConnection } from "./connection";
89
import { withPostHog } from "./posthog";
910
import { withStarknet } from "./starknet";
@@ -23,7 +24,7 @@ export function renderWithProviders(
2324
): RenderResult {
2425
const wrapped = withConnection(
2526
<BrowserRouter>
26-
{withStarknet(withPostHog(withTheme(ui, config.theme)), config.starknet)}
27+
{withStarknet(withPostHog(ui), config.starknet)}
2728
</BrowserRouter>,
2829
config.connection,
2930
);

0 commit comments

Comments
 (0)