Skip to content

Commit

Permalink
feat: renterd contract set filter
Browse files Browse the repository at this point in the history
  • Loading branch information
alexfreska committed Jan 5, 2024
1 parent 7635e79 commit cc7b150
Show file tree
Hide file tree
Showing 15 changed files with 218 additions and 11 deletions.
5 changes: 5 additions & 0 deletions .changeset/wise-shoes-ring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'renterd': minor
---

Contracts can now be filtered by contract set.
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import {
CommandGroup,
CommandItemNav,
CommandItemSearch,
} from '../../../../CmdRoot/Item'
import { Page } from '../../../../CmdRoot/types'
import { useDialog } from '../../../../../contexts/dialog'
import { contractSetsIncludeFilter } from '../../../ContractsFilterContractSetDialog'

export const contractsFilterContractSetPage = {
namespace: 'contracts/filterContractSet',
label: 'Contracts filter by contract set',
}

export function ContractSetCmdGroup({
select,
currentPage,
}: {
currentPage: Page
select: () => void
}) {
const filter = contractSetsIncludeFilter('')
const { openDialog } = useDialog()
return (
<CommandGroup
currentPage={currentPage}
commandPage={contractsFilterContractSetPage}
>
<CommandItemSearch
currentPage={currentPage}
commandPage={contractsFilterContractSetPage}
onSelect={() => {
select()
openDialog('contractsFilterContractSet')
}}
>
{filter.label}
</CommandItemSearch>
</CommandGroup>
)
}

export function ContractSetCmdNav({
select,
currentPage,
parentPage,
commandPage,
}: {
currentPage: Page
parentPage: Page
commandPage: Page
select: () => void
}) {
const { openDialog } = useDialog()
return (
<CommandItemNav
currentPage={currentPage}
parentPage={parentPage}
commandPage={commandPage}
onSelect={() => {
select()
openDialog('contractsFilterContractSet')
}}
>
{contractsFilterContractSetPage.label}
</CommandItemNav>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Page } from '../../../../CmdRoot/types'
import { ClientFilterItem } from '@siafoundation/design-system'
import { AddressCmdGroup } from './Address'
import { PublicKeyCmdGroup } from './PublicKey'
import { ContractSetCmdGroup } from './ContractSet'

type Props = {
currentPage: Page
Expand All @@ -17,6 +18,7 @@ export function ContractFilterCmdGroups({ currentPage, select }: Props) {
<>
<AddressCmdGroup currentPage={currentPage} select={select} />
<PublicKeyCmdGroup currentPage={currentPage} select={select} />
<ContractSetCmdGroup currentPage={currentPage} select={select} />
<ExpiryCmdGroup currentPage={currentPage} select={select} />
<FormationCmdGroup currentPage={currentPage} select={select} />
<RenewCmdGroup currentPage={currentPage} select={select} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { contractFilterRenewPage } from '../ContractFilterCmdGroups/Renew'
import { Page } from '../../../../CmdRoot/types'
import { AddressCmdNav } from '../ContractFilterCmdGroups/Address'
import { PublicKeyCmdNav } from '../ContractFilterCmdGroups/PublicKey'
import { ContractSetCmdNav } from '../ContractFilterCmdGroups/ContractSet'

export const commandPage = {
namespace: 'contracts',
Expand Down Expand Up @@ -38,6 +39,12 @@ export function ContractFilterNav({
commandPage={commandPage}
select={select}
/>
<ContractSetCmdNav
currentPage={currentPage}
parentPage={parentPage}
commandPage={commandPage}
select={select}
/>
<CommandItemNav
currentPage={currentPage}
parentPage={parentPage}
Expand Down
112 changes: 112 additions & 0 deletions apps/renterd/components/Contracts/ContractsFilterContractSetDialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import {
ConfigFields,
Dialog,
FieldSelect,
FormSubmitButton,
useDialogFormHelpers,
useOnInvalid,
} from '@siafoundation/design-system'
import { useContracts } from '../../contexts/contracts'
import { ContractData } from '../../contexts/contracts/types'
import { useForm } from 'react-hook-form'
import { useCallback } from 'react'

export function contractSetsIncludeFilter(contractSet: string) {
return {
id: 'contractSetsInclude',
value: contractSet,
label: `contract in set ${contractSet}`,
fn: (d: ContractData) => {
return d.contractSets?.includes(contractSet)
},
}
}

function getDefaultValues(defaultContractSet?: string) {
return {
contractSet: defaultContractSet,
}
}

type Values = ReturnType<typeof getDefaultValues>

function getFields({
contractSets,
}: {
contractSets: string[]
}): ConfigFields<Values, never> {
return {
contractSet: {
type: 'select',
title: 'Contract set',
options: contractSets.map((contractSet) => ({
label: contractSet,
value: contractSet,
})),
placeholder: 'autopilot',
validation: {
required: 'required',
},
},
}
}

type Props = {
trigger?: React.ReactNode
open: boolean
onOpenChange: (val: boolean) => void
}

export function ContractsFilterContractSetDialog({
trigger,
open,
onOpenChange,
}: Props) {
const { setFilter, contractSets } = useContracts()

const defaultValues = getDefaultValues(contractSets.data?.[0])
const form = useForm({
mode: 'all',
defaultValues,
})

const { handleOpenChange, closeAndReset } = useDialogFormHelpers({
form,
onOpenChange,
defaultValues,
})

const fields = getFields({ contractSets: contractSets.data || [] })

const onValid = useCallback(
(values: Values) => {
setFilter(contractSetsIncludeFilter(values.contractSet))
closeAndReset()
},
[setFilter, closeAndReset]
)

const onInvalid = useOnInvalid(fields)

return (
<Dialog
trigger={trigger}
title="Filter by contract set"
open={open}
onOpenChange={handleOpenChange}
contentVariants={{
className: 'w-[400px]',
}}
onSubmit={form.handleSubmit(onValid, onInvalid)}
>
<div className="flex flex-col gap-4">
<div className="flex flex-col gap-4">
<FieldSelect form={form} fields={fields} name="contractSet" />
<FormSubmitButton form={form} size="medium">
Filter
</FormSubmitButton>
</div>
</div>
</Dialog>
)
}
8 changes: 7 additions & 1 deletion apps/renterd/contexts/contracts/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import {
daysInMilliseconds,
} from '@siafoundation/design-system'
import { useRouter } from 'next/router'
import { useContracts as useContractsData } from '@siafoundation/react-renterd'
import {
useContracts as useContractsData,
useContractSets,
} from '@siafoundation/react-renterd'
import {
createContext,
useCallback,
Expand Down Expand Up @@ -205,6 +208,8 @@ function useContractsMain() {
const { contractSetMetrics: contractSetCountMetrics } =
useContractSetMetrics()

const contractSets = useContractSets()

return {
dataState,
limit,
Expand Down Expand Up @@ -244,6 +249,7 @@ function useContractsMain() {
allContractsSpendingMetrics,
selectedContractSpendingMetrics,
contractSetCountMetrics,
contractSets,
}
}

Expand Down
6 changes: 6 additions & 0 deletions apps/renterd/contexts/dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { HostsAllowBlockDialog } from '../components/Hosts/HostsAllowBlockDialog
import { HostsFilterAddressDialog } from '../components/Hosts/HostsFilterAddressDialog'
import { ContractsFilterAddressDialog } from '../components/Contracts/ContractsFilterAddressDialog'
import { ContractsFilterPublicKeyDialog } from '../components/Contracts/ContractsFilterPublicKeyDialog'
import { ContractsFilterContractSetDialog } from '../components/Contracts/ContractsFilterContractSetDialog'
import { FilesSearchDialog } from '../components/Files/FilesSearchDialog'
import { useSyncerConnect, useWallet } from '@siafoundation/react-renterd'
import { RenterdSendSiacoinDialog } from '../dialogs/RenterdSendSiacoinDialog'
Expand All @@ -36,6 +37,7 @@ export type DialogType =
| 'hostsFilterPublicKey'
| 'contractsFilterAddress'
| 'contractsFilterPublicKey'
| 'contractsFilterContractSet'
| 'filesCreateBucket'
| 'filesDeleteBucket'
| 'filesCreateDirectory'
Expand Down Expand Up @@ -192,6 +194,10 @@ export function Dialogs() {
open={dialog === 'contractsFilterAddress'}
onOpenChange={(val) => (val ? openDialog(dialog) : closeDialog())}
/>
<ContractsFilterContractSetDialog
open={dialog === 'contractsFilterContractSet'}
onOpenChange={(val) => (val ? openDialog(dialog) : closeDialog())}
/>
<ContractsFilterPublicKeyDialog
open={dialog === 'contractsFilterPublicKey'}
onOpenChange={(val) => (val ? openDialog(dialog) : closeDialog())}
Expand Down
2 changes: 1 addition & 1 deletion apps/walletd/dialogs/WalletAddressesAddDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import {
Paragraph,
triggerErrorToast,
triggerSuccessToast,
useDialogFormHelpers,
} from '@siafoundation/design-system'
import { useWalletAddressAdd } from '@siafoundation/react-walletd'
import { useCallback } from 'react'
import { useForm } from 'react-hook-form'
import { useDialogFormHelpers } from '../hooks/useDialogFormHelpers'
import { useWallets } from '../contexts/wallets'
import { isValidAddress } from '@siafoundation/units'
import { uniq } from '@technically/lodash'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import {
Text,
triggerErrorToast,
triggerSuccessToast,
useDialogFormHelpers,
} from '@siafoundation/design-system'
import { useWalletAddressAdd } from '@siafoundation/react-walletd'
import { useCallback, useEffect, useMemo, useState } from 'react'
import { useForm } from 'react-hook-form'
import { useDialogFormHelpers } from '../../hooks/useDialogFormHelpers'
import { useWallets } from '../../contexts/wallets'
import BigNumber from 'bignumber.js'
import { DeviceConnectForm } from '../DeviceConnectForm'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import {
FormSubmitButton,
triggerErrorToast,
triggerSuccessToast,
useDialogFormHelpers,
} from '@siafoundation/design-system'
import { useWalletAddressAdd } from '@siafoundation/react-walletd'
import { useCallback, useEffect, useState } from 'react'
import { useForm } from 'react-hook-form'
import { useDialogFormHelpers } from '../../hooks/useDialogFormHelpers'
import { getWalletWasm } from '../../lib/wasm'
import { useWallets } from '../../contexts/wallets'
import BigNumber from 'bignumber.js'
Expand Down
2 changes: 1 addition & 1 deletion apps/walletd/dialogs/WalletUnlockDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import {
ConfigFields,
Dialog,
FormSubmitButton,
useDialogFormHelpers,
useOnInvalid,
} from '@siafoundation/design-system'
import { useCallback, useState } from 'react'
import { useForm } from 'react-hook-form'
import { useDialogFormHelpers } from '../hooks/useDialogFormHelpers'
import { getWalletWasm } from '../lib/wasm'
import { useWallets } from '../contexts/wallets'
import { getFieldMnemonic, MnemonicFieldType } from '../lib/fieldMnemonic'
Expand Down
2 changes: 1 addition & 1 deletion apps/walletd/dialogs/WalletUpdateDialog/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import {
FieldText,
Badge,
Label,
useDialogFormHelpers,
} from '@siafoundation/design-system'
import { useCallback, useEffect, useMemo } from 'react'
import { useForm } from 'react-hook-form'
import { useWalletAdd } from '@siafoundation/react-walletd'
import { useWallets } from '../../contexts/wallets'
import { useDialogFormHelpers } from '../../hooks/useDialogFormHelpers'

const defaultValues = {
name: '',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { useCallback } from 'react'
import { UseFormReturn } from 'react-hook-form'
import { FieldValues, UseFormReturn } from 'react-hook-form'

type Props<Values> = {
type Props<Values extends FieldValues> = {
form: UseFormReturn<Values>
onOpenChange: (open: boolean) => void
defaultValues: Values
}

export function useDialogFormHelpers<Values>({
export function useDialogFormHelpers<Values extends FieldValues>({
form,
onOpenChange,
defaultValues,
Expand Down
1 change: 1 addition & 0 deletions libs/design-system/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ export * from './form/FieldSelect'
export * from './form/useFormServerSynced'
export * from './form/useFormChangeCount'
export * from './form/useFormInit'
export * from './form/useDialogFormHelpers'

// site
export * from './site/SiteHeading'
Expand Down
4 changes: 2 additions & 2 deletions libs/react-renterd/src/bus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,11 +479,11 @@ export function useContractDelete(
)
}

export function useContractsets(args?: HookArgsSwr<void, string[][]>) {
export function useContractSets(args?: HookArgsSwr<void, string[]>) {
return useGetSwr({ ...args, route: '/bus/contracts/sets' })
}

export function useContractsetUpdate(
export function useContractSetUpdate(
args: HookArgsCallback<{ name: string }, string[], never>
) {
return usePutFunc({ ...args, route: '/bus/contracts/sets/:set' })
Expand Down

0 comments on commit cc7b150

Please sign in to comment.