stargaze-studio/contexts/contracts.tsx

89 lines
2.8 KiB
TypeScript
Raw Normal View History

2023-02-02 08:34:28 +00:00
import type { UseBadgeHubContractProps } from 'contracts/badgeHub'
import { useBadgeHubContract } from 'contracts/badgeHub'
import type { UseBaseFactoryContractProps } from 'contracts/baseFactory'
import { useBaseFactoryContract } from 'contracts/baseFactory'
import type { UseBaseMinterContractProps } from 'contracts/baseMinter'
import { useBaseMinterContract } from 'contracts/baseMinter'
import type { UseSG721ContractProps } from 'contracts/sg721'
import { useSG721Contract } from 'contracts/sg721'
import type { UseVendingFactoryContractProps } from 'contracts/vendingFactory'
import { useVendingFactoryContract } from 'contracts/vendingFactory'
import type { UseVendingMinterContractProps } from 'contracts/vendingMinter'
import { useVendingMinterContract } from 'contracts/vendingMinter'
import type { UseWhiteListContractProps } from 'contracts/whitelist'
import { useWhiteListContract } from 'contracts/whitelist'
import type { ReactNode, VFC } from 'react'
import { Fragment, useEffect } from 'react'
import type { State } from 'zustand'
import create from 'zustand'
2022-07-13 13:56:36 +00:00
/**
* Contracts store type definitions
*/
export interface ContractsStore extends State {
sg721: UseSG721ContractProps | null
vendingMinter: UseVendingMinterContractProps | null
baseMinter: UseBaseMinterContractProps | null
whitelist: UseWhiteListContractProps | null
vendingFactory: UseVendingFactoryContractProps | null
baseFactory: UseBaseFactoryContractProps | null
2023-02-01 12:55:52 +00:00
badgeHub: UseBadgeHubContractProps | 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,
vendingMinter: null,
baseMinter: null,
whitelist: null,
vendingFactory: null,
baseFactory: null,
2023-02-01 12:55:52 +00:00
badgeHub: 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 (
<>
2022-07-13 13:56:36 +00:00
{children}
<ContractsSubscription />
</>
2022-07-13 13:56:36 +00:00
)
}
const ContractsSubscription: VFC = () => {
const sg721 = useSG721Contract()
const vendingMinter = useVendingMinterContract()
const baseMinter = useBaseMinterContract()
const whitelist = useWhiteListContract()
const vendingFactory = useVendingFactoryContract()
const baseFactory = useBaseFactoryContract()
2023-02-01 12:55:52 +00:00
const badgeHub = useBadgeHubContract()
2022-07-13 13:56:36 +00:00
useEffect(() => {
useContracts.setState({
sg721,
vendingMinter,
baseMinter,
whitelist,
vendingFactory,
baseFactory,
2023-02-01 12:55:52 +00:00
badgeHub,
2022-07-13 13:56:36 +00:00
})
2023-02-01 12:55:52 +00:00
}, [sg721, vendingMinter, baseMinter, whitelist, vendingFactory, baseFactory, badgeHub])
2022-07-13 13:56:36 +00:00
return null
}