Skip to content

Commit

Permalink
refactor: disabled if builder not operational
Browse files Browse the repository at this point in the history
  • Loading branch information
franciscotobar committed Nov 27, 2024
1 parent 06e3333 commit c0f0b85
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import { FC, useEffect, useState } from 'react'
import { useForm } from 'react-hook-form'
import { GoRocket } from 'react-icons/go'
import { z } from 'zod'
import { percentageToWei } from '../utils'
import { percentageToWei } from '@/app/collective-rewards/settings/utils'
import { useBuilderSettingsContext } from './context'
import { Popover } from '@/components/Popover'

const formSchema = z.object({
reward: z
Expand Down Expand Up @@ -39,9 +40,10 @@ const formSchema = z.object({
export const BuilderRewardsSettingsForm: FC = () => {
const router = useRouter()
const [backButtonName, setBackButtonName] = useState('Cancel')
const {
let {
current: { refetch, isLoading: isCurrentRewardsLoading },
update: { isSuccess, setNewReward, isPending },
isBuilderOperational,
} = useBuilderSettingsContext()

const form = useForm<z.infer<typeof formSchema>>({
Expand Down Expand Up @@ -84,22 +86,41 @@ export const BuilderRewardsSettingsForm: FC = () => {
{isCurrentRewardsLoading ? (
<LoadingSpinner />
) : (
<FormInput placeholder="0 ... 100 %" inputMode="decimal" {...field} />
<FormInput
placeholder="0 ... 100 %"
inputMode="decimal"
{...field}
disabled={!isBuilderOperational}
/>
)}
</FormControl>
<FormMessage />
</FormItem>
)}
></FormField>
<div className="flex flex-row justify-start gap-4">
<Button
startIcon={<GoRocket />}
disabled={!isDirty || !isValid}
buttonProps={{ type: 'submit' }}
loading={isPending}
<Popover
content={
<div className="text-[12px] font-bold mb-1">
<p data-testid="adjustBackerRewardPctTooltip">
You need to be operational to adjust your backer reward %
</p>
</div>
}
size="small"
position="top"
trigger="hover"
disabled={isBuilderOperational}
>
Save changes
</Button>
<Button
startIcon={<GoRocket />}
disabled={!isDirty || !isValid || !isBuilderOperational}
buttonProps={{ type: 'submit' }}
loading={isPending}
>
Save changes
</Button>
</Popover>
<Button
variant="secondary"
onClick={() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import {
import { createContext, FC, ReactNode, useContext } from 'react'
import { Address } from 'viem'
import { useAccount } from 'wagmi'
import { useGetIsBuilderOperational } from '@/app/collective-rewards/settings'

type BackerRewardsPercentageContext = {
update: SetBackerRewardsForBuilder
current: BackerRewardResponse
rewardPercentageToApply: RewardPercentageToApply
isBuilderOperational?: boolean
}

const BuilderSettingsContext = createContext<BackerRewardsPercentageContext>(
Expand All @@ -26,11 +28,13 @@ export const BuilderSettingsProvider: FC<{ children: ReactNode }> = ({ children
const current = useGetBackerRewardsForBuilder(address as Address)
const update = useSetBackerRewardsForBuilder()
const rewardPercentageToApply = useGetRewardPercentageToApply(address as Address)
const { data: isBuilderOperational } = useGetIsBuilderOperational(address as Address)

const contextValue: BackerRewardsPercentageContext = {
update,
current,
rewardPercentageToApply,
isBuilderOperational,
}

return <BuilderSettingsContext.Provider value={contextValue}>{children}</BuilderSettingsContext.Provider>
Expand Down
1 change: 1 addition & 0 deletions src/app/collective-rewards/settings/builder/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './useBuilderConfig'
export * from './useGetIsBuilderOperational'
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { AVERAGE_BLOCKTIME } from '@/lib/constants'
import { BackersManagerAddress } from '@/lib/contracts'
import { useReadContract } from 'wagmi'
import { BuilderRegistryAbi } from '@/lib/abis/v2/BuilderRegistryAbi'
import { Address } from 'viem'

export const useGetIsBuilderOperational = (builder: Address) => {
return useReadContract({
address: BackersManagerAddress,
abi: BuilderRegistryAbi,
functionName: 'isBuilderOperational',
args: [builder],
query: {
refetchInterval: AVERAGE_BLOCKTIME,
},
})
}
2 changes: 2 additions & 0 deletions src/app/collective-rewards/settings/builder/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from './BuilderRewardsSettingsMetrics'
export * from './BuilderRewardsSettingsForm'
export * from './BuilderSettings'
export * from './context'
export * from './hooks'

0 comments on commit c0f0b85

Please sign in to comment.