50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
|
import { Dispatch, useState, useEffect } from "react";
|
||
|
import { JSONObject } from "superjson/dist/types";
|
||
|
|
||
|
import RainbowGate from "@calcom/app-store/rainbow/components/RainbowKit";
|
||
|
|
||
|
export type Gate = undefined | "rainbow"; // Add more like ` | "geolocation" | "payment"`
|
||
|
|
||
|
export type GateState = {
|
||
|
rainbowToken?: string;
|
||
|
};
|
||
|
|
||
|
type GateProps = {
|
||
|
children: React.ReactNode;
|
||
|
gates: Gate[];
|
||
|
metadata: JSONObject;
|
||
|
dispatch: Dispatch<Partial<GateState>>;
|
||
|
};
|
||
|
|
||
|
// To add a new Gate just add the gate logic to the switch statement
|
||
|
const Gates: React.FC<GateProps> = ({ children, gates, metadata, dispatch }) => {
|
||
|
const [rainbowToken, setRainbowToken] = useState<string>();
|
||
|
|
||
|
useEffect(() => {
|
||
|
dispatch({ rainbowToken });
|
||
|
}, [rainbowToken, dispatch]);
|
||
|
|
||
|
let gateWrappers = <>{children}</>;
|
||
|
|
||
|
// Recursively wraps the `gateWrappers` with new gates allowing for multiple gates
|
||
|
for (const gate of gates) {
|
||
|
switch (gate) {
|
||
|
case "rainbow":
|
||
|
if (metadata.blockchainId && metadata.smartContractAddress && !rainbowToken) {
|
||
|
gateWrappers = (
|
||
|
<RainbowGate
|
||
|
setToken={setRainbowToken}
|
||
|
chainId={metadata.blockchainId as number}
|
||
|
tokenAddress={metadata.smartContractAddress as string}>
|
||
|
{gateWrappers}
|
||
|
</RainbowGate>
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return gateWrappers;
|
||
|
};
|
||
|
|
||
|
export default Gates;
|