Skip to content

Commit 490f627

Browse files
authored
feat(frontend): use tenant wallet address prefix in admin UI (#3570)
* feat(frontend): use tenant wallet address prefix setting in create wallet address form * feat: use proper form values when selecting tenant during WA creation * fix: fall back on configured open payments url if setting not found
1 parent 007891e commit 490f627

File tree

5 files changed

+64
-18
lines changed

5 files changed

+64
-18
lines changed

packages/frontend/app/generated/graphql.ts

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/frontend/app/lib/api/tenant.server.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ export const listTenants = async (request: Request, args: QueryTenantsArgs) => {
5959
publicName
6060
createdAt
6161
deletedAt
62+
settings {
63+
key
64+
value
65+
}
6266
}
6367
}
6468
pageInfo {
@@ -178,6 +182,10 @@ export const getTenantInfo = async (
178182
publicName
179183
createdAt
180184
deletedAt
185+
settings {
186+
key
187+
value
188+
}
181189
}
182190
}
183191
`,

packages/frontend/app/lib/validate.server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ export const createWalletAddressSchema = z.object({
120120
name: z.string().min(1),
121121
publicName: z.string().optional(),
122122
asset: z.string().uuid(),
123-
tenantId: z.string().uuid().optional()
123+
tenantId: z.string().uuid().optional(),
124+
waPrefix: z.string().url()
124125
})
125126

126127
export const updateWalletAddressSchema = z

packages/frontend/app/routes/wallet-addresses._index.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,18 @@ export default function WalletAddressesPage() {
6363
<Table.Head columns={['Wallet address', 'Public name', 'Status']} />
6464
<Table.Body>
6565
{walletAddresses.edges.length ? (
66-
walletAddresses.edges.map((pp) => (
66+
walletAddresses.edges.map((wa) => (
6767
<Table.Row
68-
key={pp.node.id}
68+
key={wa.node.id}
6969
className='cursor-pointer'
70-
onClick={() => navigate(`/wallet-addresses/${pp.node.id}`)}
70+
onClick={() => navigate(`/wallet-addresses/${wa.node.id}`)}
7171
>
72-
<Table.Cell>{pp.node.address}</Table.Cell>
72+
<Table.Cell>{wa.node.address}</Table.Cell>
7373
<Table.Cell>
7474
<div className='flex flex-col'>
75-
{pp.node.publicName ? (
75+
{wa.node.publicName ? (
7676
<span className='font-medium'>
77-
{pp.node.publicName}
77+
{wa.node.publicName}
7878
</span>
7979
) : (
8080
<span className='text-tealish/80'>No public name</span>
@@ -83,9 +83,9 @@ export default function WalletAddressesPage() {
8383
</Table.Cell>
8484
<Table.Cell>
8585
<Badge
86-
color={badgeColorByWalletAddressStatus[pp.node.status]}
86+
color={badgeColorByWalletAddressStatus[wa.node.status]}
8787
>
88-
{pp.node.status}
88+
{wa.node.status}
8989
</Badge>
9090
</Table.Cell>
9191
</Table.Row>

packages/frontend/app/routes/wallet-addresses.create.tsx

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,49 @@ import {
2020
} from '~/shared/utils'
2121
import { checkAuthAndRedirect } from '../lib/kratos_checks.server'
2222
import { type LoaderFunctionArgs } from '@remix-run/node'
23-
import { whoAmI, loadTenants } from '~/lib/api/tenant.server'
23+
import type { listTenants } from '~/lib/api/tenant.server'
24+
import { whoAmI, loadTenants, getTenantInfo } from '~/lib/api/tenant.server'
25+
26+
const WALLET_ADDRESS_URL_KEY = 'WALLET_ADDRESS_URL'
27+
28+
const findWASetting = (
29+
tenantSettings: Awaited<ReturnType<typeof getTenantInfo>>['settings']
30+
) => {
31+
return tenantSettings.find(
32+
(setting) => setting.key === WALLET_ADDRESS_URL_KEY
33+
)?.value
34+
}
35+
36+
const findTenant = (
37+
tenants: Awaited<ReturnType<typeof listTenants>>['edges'],
38+
tenantId: string
39+
) => {
40+
return tenants.find((tenant) => tenant.node.id === tenantId)
41+
}
2442

2543
export const loader = async ({ request }: LoaderFunctionArgs) => {
2644
const cookies = request.headers.get('cookie')
2745
await checkAuthAndRedirect(request.url, cookies)
2846

2947
const assets = await loadAssets(request)
30-
const { isOperator } = await whoAmI(request)
48+
const { id, isOperator } = await whoAmI(request)
3149
let tenants
50+
let tenantWAPrefix
3251
if (isOperator) {
33-
tenants = await loadTenants(request)
52+
const loadedTenants = await loadTenants(request)
53+
tenants = loadedTenants.filter(
54+
(tenant) => findWASetting(tenant.node.settings) || tenant.node.id === id
55+
)
56+
} else {
57+
const tenant = await getTenantInfo(request, { id })
58+
const waPrefixSetting = findWASetting(tenant.settings)
59+
tenantWAPrefix = waPrefixSetting ?? getOpenPaymentsUrl()
3460
}
35-
return json({ assets, tenants })
61+
return json({ assets, tenants, tenantWAPrefix })
3662
}
3763

3864
export default function CreateWalletAddressPage() {
39-
const { assets, tenants } = useLoaderData<typeof loader>()
65+
const { assets, tenants, tenantWAPrefix } = useLoaderData<typeof loader>()
4066
const response = useActionData<typeof action>()
4167
const { state } = useNavigation()
4268
const isSubmitting = state === 'submitting'
@@ -52,6 +78,12 @@ export default function CreateWalletAddressPage() {
5278
}))
5379
}
5480

81+
const currentTenant =
82+
tenants && tenantId ? findTenant(tenants, tenantId.value) : null
83+
const waPrefix = currentTenant
84+
? findWASetting(currentTenant.node.settings)
85+
: tenantWAPrefix
86+
5587
return (
5688
<div className='pt-4 flex flex-col space-y-4'>
5789
<div className='flex flex-col rounded-md bg-offwhite px-6'>
@@ -75,9 +107,14 @@ export default function CreateWalletAddressPage() {
75107
</div>
76108
<div className='md:col-span-2 bg-white rounded-md shadow-md'>
77109
<div className='w-full p-4 space-y-3'>
110+
<Input
111+
name='waPrefix'
112+
value={waPrefix ?? getOpenPaymentsUrl()}
113+
type={'hidden'}
114+
/>
78115
<Input
79116
required
80-
addOn={getOpenPaymentsUrl()}
117+
addOn={waPrefix ?? getOpenPaymentsUrl()}
81118
name='name'
82119
label='Wallet address name'
83120
placeholder='jdoe'
@@ -158,7 +195,7 @@ export async function action({ request }: ActionFunctionArgs) {
158195
return json({ errors }, { status: 400 })
159196
}
160197

161-
const baseUrl = removeTrailingAndLeadingSlash(getOpenPaymentsUrl())
198+
const baseUrl = removeTrailingAndLeadingSlash(result.data.waPrefix)
162199
const path = removeTrailingAndLeadingSlash(result.data.name)
163200

164201
const response = await createWalletAddress(request, {

0 commit comments

Comments
 (0)