import React, { useReducer, useCallback, useState, useEffect } from "react"; import { Modal, ModalBody, ModalContent, ModalHeader, ModalOverlay, HStack, VStack, Text, Box, Button, } from "@chakra-ui/react"; import { useWallet } from "@solana/wallet-adapter-react"; import { useWalletModal } from "@solana/wallet-adapter-react-ui"; import { useStrataSdks } from "@strata-foundation/react"; import { useChatSdk } from "../../contexts/chatSdk"; import { useDelegateWallet } from "../../hooks/useDelegateWallet"; import { ProgressStep } from "./ProgressStep"; import { BasicInfo } from "./BasicInfo"; import { PermissionType as PermissionTypeSelect } from "./PermissionType"; import { Permission } from "./Permission"; import { Summary } from "./Summary"; import { ITokenFormValues } from "./TokenForm"; import { INFTFormValues } from "./NFTForm"; import { wizardSubmit } from "./wizardSubmit"; import { useRouter } from "next/router"; import { route, routes } from "../../routes"; interface ICreateChatModalProps { isOpen: boolean; onClose: () => void; } export enum CreateChatStep { BasicInfo, ReadPermissionsType, ReadPermissions, PostPermissionsType, PostPermissions, Summary, } export namespace CreateChatStep { export const prev = (value: CreateChatStep): CreateChatStep => value + -1; export const next = (value: CreateChatStep): CreateChatStep => value + 1; } export enum ReadPostType { Token = "Token", NFT = "NFT", } export interface ICreateChatModalState { step: CreateChatStep; lastStep: CreateChatStep; status: null | "submitting" | "success" | string; subStatus: null | string; error: null | Error; wizardData: { name: string; identifier: string; description: string; image: undefined | File; imageUrl: undefined | string; imageUploaded: boolean; readType: undefined | ReadPostType; postType: undefined | ReadPostType; postIsSameAsRead: boolean; readForm: Partial | Partial; postForm: Partial | Partial; }; } export const initialState: ICreateChatModalState = { step: CreateChatStep.BasicInfo, lastStep: CreateChatStep.BasicInfo, status: null, subStatus: null, error: null, wizardData: { name: "", identifier: "", description: "", image: undefined, imageUrl: undefined, imageUploaded: false, readType: undefined, postType: undefined, postIsSameAsRead: false, readForm: { isExisting: false }, postForm: { isExisting: false }, }, }; export const CreateChatModal: React.FC = ({ isOpen, onClose, }) => { const { connected } = useWallet(); const { setVisible } = useWalletModal(); const { chatSdk } = useChatSdk(); const router = useRouter(); const { tokenBondingSdk } = useStrataSdks(); const { keypair: delegateWallet } = useDelegateWallet(); const [state, setState] = useReducer( ( state: ICreateChatModalState, newState: Partial ) => ({ ...state, ...newState, }), initialState ); const handleClose = () => { setState(initialState); onClose(); }; const handleNext = useCallback(async () => { const isOnSummary = state.step === CreateChatStep.Summary; if ( (!isOnSummary && CreateChatStep.next(state.lastStep)) == CreateChatStep.Summary ) { setState({ step: CreateChatStep.Summary }); } else { if (isOnSummary) { await wizardSubmit({ sdks: { chatSdk, tokenBondingSdk, }, data: state, delegateWallet, setState, }); } else if ( state.step === CreateChatStep.PostPermissionsType && state.wizardData.postIsSameAsRead ) { setState({ step: CreateChatStep.Summary, lastStep: state.step }); } else { setState({ step: CreateChatStep.next(state.step), lastStep: state.step, }); } } }, [state, setState]); const handleBack = useCallback( (stepOverride?: CreateChatStep) => { if (stepOverride && stepOverride in CreateChatStep) { setState({ step: stepOverride }); } else { if (state.step === CreateChatStep.BasicInfo) { setState(initialState); onClose(); } else if ( state.step === CreateChatStep.Summary && state.wizardData.postIsSameAsRead ) { setState({ step: CreateChatStep.PostPermissionsType }); } else { setState({ step: CreateChatStep.prev(state.step) }); } } }, [state, setState, onClose] ); useEffect(() => { if (state.status === "success") { router.push( route(routes.chat, { id: state.wizardData.identifier, }), undefined, { shallow: true } ); handleClose(); } }, [state.status]); return ( Create a Chat This information will help us create your chat... CreateChatStep.BasicInfo} /> CreateChatStep.ReadPermissions} /> CreateChatStep.PostPermissions} isLast /> {!connected ? ( No wallet was detected Please connect a wallet to continue. ) : ( <> {state.step === CreateChatStep.BasicInfo && ( )} {[ CreateChatStep.ReadPermissionsType, CreateChatStep.PostPermissionsType, ].includes(state.step) && ( )} {[ CreateChatStep.ReadPermissions, CreateChatStep.PostPermissions, ].includes(state.step) && ( )} {state.step === CreateChatStep.Summary && ( )} )} ); };