stargaze-studio/contexts/contracts.tsx

75 lines
1.6 KiB
TypeScript
Raw Normal View History

import { useMinterContract, UseMinterContractProps } from 'contracts/minter'
import { useSG721Contract, UseSG721ContractProps } from 'contracts/sg721'
import {
useWhiteListContract,
useWhiteListContractProps,
} from 'contracts/whitelist'
import { Fragment, ReactNode, useEffect, VFC } from 'react'
import create, { State } from 'zustand'
2022-07-13 13:56:36 +00:00
/**
* Contracts store type definitions
*/
export interface ContractsStore extends State {
sg721: UseSG721ContractProps | null
minter: UseMinterContractProps | null
whitelist: useWhiteListContractProps | null
2022-07-13 13:56:36 +00:00
}
/**
* Contracts store default values as a separate variable for reusability
*/
export const defaultValues: ContractsStore = {
sg721: null,
minter: null,
whitelist: null,
2022-07-13 13:56:36 +00:00
}
/**
* Entrypoint for contracts store using {@link defaultValues}
*/
export const useContracts = create<ContractsStore>(() => ({
...defaultValues,
}))
/**
* Contracts store provider to easily mount {@link ContractsSubscription}
* to listen/subscribe to contract changes
*/
export const ContractsProvider = ({ children }: { children: ReactNode }) => {
return (
<Fragment>
2022-07-13 13:56:36 +00:00
{children}
<ContractsSubscription />
</Fragment>
2022-07-13 13:56:36 +00:00
)
}
/**
* Contracts store subscriptions (side effects)
*
* @todo refactor all contract logics to zustand store
2022-07-13 13:56:36 +00:00
*/
const ContractsSubscription: VFC = () => {
const sg721 = useSG721Contract()
const minter = useMinterContract()
const whitelist = useWhiteListContract()
2022-07-13 13:56:36 +00:00
useEffect(() => {
useContracts.setState({
sg721,
minter,
whitelist,
2022-07-13 13:56:36 +00:00
})
}, [
sg721,
minter,
whitelist,
2022-07-13 13:56:36 +00:00
])
return null
}