Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Session summary updates #1111

Merged
merged 17 commits into from
Dec 9, 2024
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
2 changes: 1 addition & 1 deletion packages/controller/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export type ControllerError = {
export type ConnectReply = {
code: ResponseCodes.SUCCESS;
address: string;
policies: SessionPolicies;
policies?: SessionPolicies;
};

export type ExecuteReply =
Expand Down
2 changes: 1 addition & 1 deletion packages/keychain/.env.development
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ NEXT_PUBLIC_ADMIN_URL="http://localhost:3002"
NEXT_PUBLIC_CARTRIDGE_API_URL="http://localhost:8000"
# NEXT_PUBLIC_ETH_RPC_MAINNET="https://eth-mainnet.g.alchemy.com/v2/OGPRMquXP3K7oTkLrmVZpjCd1DswtYz3"
# NEXT_PUBLIC_ETH_RPC_SEPOLIA="https://eth-sepolia.g.alchemy.com/v2/mURnclB5pn5elDfyzgTN4W2GR-rOYevI"
# NEXT_PUBLIC_RPC_MAINNET="http://localhost:8001/x/starknet/mainnet"
NEXT_PUBLIC_RPC_MAINNET="http://localhost:8001/x/starknet/mainnet"
NEXT_PUBLIC_RPC_SEPOLIA="http://localhost:8001/x/starknet/sepolia"
NEXT_PUBLIC_STRIPE_PAYMENT="http://localhost:8000/stripe/payment-intent"
NEXT_PUBLIC_POSTHOG_KEY=phc_UWaJajNQ00PjHhveZ81SJ2zVtBicKrzewdZHGiyavQQ
Expand Down
2 changes: 1 addition & 1 deletion packages/keychain/.env.production
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ NEXT_PUBLIC_ADMIN_URL="https://cartridge.gg"
NEXT_PUBLIC_CARTRIDGE_API_URL="https://api.cartridge.gg"
# NEXT_PUBLIC_ETH_RPC_MAINNET="https://eth-mainnet.g.alchemy.com/v2/OGPRMquXP3K7oTkLrmVZpjCd1DswtYz3"
# NEXT_PUBLIC_ETH_RPC_SEPOLIA="https://eth-sepolia.g.alchemy.com/v2/mURnclB5pn5elDfyzgTN4W2GR-rOYevI"
# NEXT_PUBLIC_RPC_MAINNET="https://api.cartridge.gg/x/starknet/mainnet"
NEXT_PUBLIC_RPC_MAINNET="https://api.cartridge.gg/x/starknet/mainnet"
NEXT_PUBLIC_RPC_SEPOLIA="https://api.cartridge.gg/x/starknet/sepolia"
NEXT_PUBLIC_STRIPE_PAYMENT="https://api.cartridge.gg/stripe/payment-intent"
NEXT_PUBLIC_POSTHOG_KEY=phc_UWaJajNQ00PjHhveZ81SJ2zVtBicKrzewdZHGiyavQQ
Expand Down
97 changes: 35 additions & 62 deletions packages/keychain/.storybook/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,16 @@ import {
import { constants } from "starknet";
import { getChainName } from "@cartridge/utils";
import Script from "next/script";
import { ETH_CONTRACT_ADDRESS } from "../src/utils/token";
import { ConnectCtx, ConnectionCtx } from "../src/utils/connection/types";
import { UpgradeInterface } from "../src/hooks/upgrade";
import { defaultTheme, controllerConfigs } from "@cartridge/presets";
import {
defaultTheme,
controllerConfigs,
SessionPolicies,
ControllerTheme,
} from "@cartridge/presets";
import { mainnet } from "@starknet-react/chains";
import { StarknetConfig, publicProvider, voyager } from "@starknet-react/core";

const inter = Inter({ subsets: ["latin"] });
const ibmPlexMono = IBM_Plex_Mono({
Expand Down Expand Up @@ -77,16 +83,27 @@ function Provider({
parameters,
}: { parameters: StoryParameters } & PropsWithChildren) {
const connection = useMockedConnection(parameters.connection);
const theme = parameters.preset || "cartridge";

if (parameters.preset) {
const config = controllerConfigs[parameters.preset];
connection.theme = config.theme || connection.theme;
connection.policies = config.policies || connection.policies;
}

return (
<QueryClientProvider client={queryClient}>
<ConnectionContext.Provider value={connection}>
<ControllerThemeProvider theme={theme}>
{children}
</ControllerThemeProvider>
</ConnectionContext.Provider>
</QueryClientProvider>
<StarknetConfig
chains={[mainnet]}
explorer={voyager}
provider={publicProvider()}
>
<QueryClientProvider client={queryClient}>
<ConnectionContext.Provider value={connection}>
<ControllerThemeProvider theme={connection.theme}>
{children}
</ControllerThemeProvider>
</ConnectionContext.Provider>
</QueryClientProvider>
</StarknetConfig>
);
}

Expand All @@ -98,6 +115,7 @@ interface StoryParameters extends Parameters {
upgrade?: UpgradeInterface;
};
preset?: string;
policies?: SessionPolicies;
}

export function useMockedConnection({
Expand All @@ -119,36 +137,8 @@ export function useMockedConnection({
rpcUrl: "http://api.cartridge.gg/x/sepolia",
chainId,
chainName,
policies: {
contracts: {
[ETH_CONTRACT_ADDRESS]: {
methods: [
{
name: "Approve",
entrypoint: "approve",
description:
"Lorem Ipsum is simply dummy text of the printing and typesetting industry.",
},
{
name: "Transfer",
entrypoint: "transfer",
},
{
name: "Mint",
entrypoint: "mint",
},
{
name: "Burn",
entrypoint: "burn",
},
{
name: "Allowance",
entrypoint: "allowance",
},
],
},
},
},
policies: {},
theme: defaultTheme,
prefunds: [],
hasPrefundRequest: false,
error: undefined,
Expand All @@ -170,30 +160,13 @@ export default preview;

export function ControllerThemeProvider({
children,
theme,
}: PropsWithChildren<{ theme?: string }>) {
const preset = useMemo(() => {
if (!theme) return defaultTheme;
if (theme in controllerConfigs && controllerConfigs[theme].theme) {
return controllerConfigs[theme].theme;
}
return defaultTheme;
}, [theme]);

const controllerTheme = useMemo(
() => ({
name: preset.name,
icon: preset.icon,
cover: preset.cover,
}),
[preset],
);

useThemeEffect({ theme: preset, assetUrl: "" });
const chakraTheme = useChakraTheme(preset);
theme = defaultTheme,
}: PropsWithChildren<{ theme?: ControllerTheme }>) {
useThemeEffect({ theme, assetUrl: "" });
const chakraTheme = useChakraTheme(theme);

return (
<ControllerThemeContext.Provider value={controllerTheme}>
<ControllerThemeContext.Provider value={theme}>
<ChakraProvider theme={chakraTheme}>{children}</ChakraProvider>
</ControllerThemeContext.Provider>
);
Expand Down
10 changes: 7 additions & 3 deletions packages/keychain/src/components/ConfirmTransaction.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function ConfirmTransaction() {

const entries = Object.entries(callPolicies.contracts || {});
const txnsApproved = entries.every(([target, policy]) => {
const contract = policies.contracts?.[target];
const contract = policies?.contracts?.[target];
if (!contract) return false;
return policy.methods.every((method) =>
contract.methods.some((m) => m.entrypoint === method.entrypoint),
Expand All @@ -63,9 +63,13 @@ export function ConfirmTransaction() {
return txnsApproved && !account?.session(callPolicies);
}, [callPolicies, policiesUpdated, policies, account]);

if (updateSession) {
if (updateSession && policies) {
return (
<CreateSession isUpdate onConnect={() => setIsPoliciesUpdated(true)} />
<CreateSession
policies={policies}
isUpdate
onConnect={() => setIsPoliciesUpdated(true)}
/>
);
}

Expand Down
6 changes: 4 additions & 2 deletions packages/keychain/src/components/Provider/connection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import Controller from "utils/controller";
import { ConnectionCtx } from "utils/connection";
import { Prefund } from "@cartridge/controller";
import { UpgradeInterface } from "hooks/upgrade";
import { SessionPolicies } from "@cartridge/presets";
import { ControllerTheme } from "@cartridge/presets";
import { ParsedSessionPolicies } from "hooks/session";

export const ConnectionContext = createContext<
ConnectionContextValue | undefined
Expand All @@ -16,7 +17,8 @@ export type ConnectionContextValue = {
rpcUrl?: string;
chainId?: string;
chainName?: string;
policies: SessionPolicies;
policies?: ParsedSessionPolicies;
theme: ControllerTheme;
prefunds: Prefund[];
hasPrefundRequest: boolean;
error?: Error;
Expand Down
31 changes: 29 additions & 2 deletions packages/keychain/src/components/Provider/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PropsWithChildren } from "react";
import { PropsWithChildren, useCallback } from "react";
import { QueryClient, QueryClientProvider } from "react-query";
import { useConnectionValue } from "hooks/connection";
import { CartridgeAPIProvider } from "@cartridge/utils/api/cartridge";
Expand All @@ -7,16 +7,43 @@ import { PostHogProvider } from "posthog-js/react";
import posthog from "posthog-js";
import { ConnectionContext } from "./connection";
import { ControllerThemeProvider } from "./theme";
import { jsonRpcProvider, StarknetConfig, voyager } from "@starknet-react/core";
import { sepolia, mainnet, Chain } from "@starknet-react/chains";
import { constants, num } from "starknet";

export function Provider({ children }: PropsWithChildren) {
const connection = useConnectionValue();
const rpc = useCallback(
(chain: Chain) => {
let nodeUrl;
switch (num.toHex(chain.id)) {
case constants.StarknetChainId.SN_MAIN:
nodeUrl = process.env.NEXT_PUBLIC_RPC_MAINNET;
break;
case constants.StarknetChainId.SN_SEPOLIA:
nodeUrl = process.env.NEXT_PUBLIC_RPC_SEPOLIA;
break;
default:
nodeUrl = connection.rpcUrl;
}

return { nodeUrl };
},
[connection.rpcUrl],
);

return (
<CartridgeAPIProvider url={ENDPOINT}>
<QueryClientProvider client={queryClient}>
<ConnectionContext.Provider value={connection}>
<ControllerThemeProvider>
<PostHogProvider client={posthog}>{children}</PostHogProvider>
<StarknetConfig
explorer={voyager}
chains={[sepolia, mainnet]}
provider={jsonRpcProvider({ rpc })}
>
<PostHogProvider client={posthog}>{children}</PostHogProvider>
</StarknetConfig>
</ControllerThemeProvider>
</ConnectionContext.Provider>
</QueryClientProvider>
Expand Down
55 changes: 6 additions & 49 deletions packages/keychain/src/components/Provider/theme.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
defaultTheme,
controllerConfigs,
ColorMode,
ControllerTheme,
} from "@cartridge/presets";
import { ColorMode } from "@cartridge/presets";
import { useThemeEffect } from "@cartridge/ui-next";
import { ChakraProvider, useColorMode } from "@chakra-ui/react";
import { useConnection } from "hooks/connection";
Expand All @@ -12,21 +7,13 @@ import { useRouter } from "next/router";
import { PropsWithChildren, useEffect, useMemo } from "react";

export function ControllerThemeProvider({ children }: PropsWithChildren) {
const preset = useControllerThemePreset();
const controllerTheme = useMemo(
() => ({
name: preset.name,
icon: preset.icon,
cover: preset.cover,
}),
[preset],
);
const { theme } = useConnection();

useThemeEffect({ theme: preset, assetUrl: "" });
const chakraTheme = useChakraTheme(preset);
useThemeEffect({ theme, assetUrl: "" });
const chakraTheme = useChakraTheme(theme);

return (
<ControllerThemeContext.Provider value={controllerTheme}>
<ControllerThemeContext.Provider value={theme}>
<ChakraProvider theme={chakraTheme}>
<ChakraTheme>{children}</ChakraTheme>
</ChakraProvider>
Expand All @@ -45,36 +32,6 @@ function ChakraTheme({ children }: PropsWithChildren) {
useEffect(() => {
setColorMode(colorMode);
}, [setColorMode, colorMode]);
return children;
}

export function useControllerThemePreset() {
const router = useRouter();
const { origin } = useConnection();

return useMemo(() => {
const themeParam = router.query.theme;
if (typeof themeParam === "undefined") {
return defaultTheme;
}
const val = decodeURIComponent(
Array.isArray(themeParam)
? themeParam[themeParam.length - 1]
: themeParam,
);

if (
typeof val === "string" &&
val in controllerConfigs &&
controllerConfigs[val].theme
) {
return controllerConfigs[val].theme;
}

try {
return JSON.parse(val) as ControllerTheme;
} catch {
return defaultTheme;
}
}, [router.query.theme, origin]);
return children;
}
Loading
Loading