|
9 | 9 | import { dashboardAbi } from 'abi/dashboard-abi'; |
10 | 10 |
|
11 | 11 | import type { Address, Hash } from 'viem'; |
12 | | -import { useMemo } from 'react'; |
| 12 | +import { useCallback, useMemo } from 'react'; |
13 | 13 |
|
14 | 14 | // adds defaultAdmin and nodeOperatorManager roles to the list of roles |
15 | 15 | // if any roles are admined by them |
@@ -77,48 +77,57 @@ export const useVaultPermissions = (roles: readonly VAULTS_ALL_ROLES[]) => { |
77 | 77 | }; |
78 | 78 | }, [activeVault?.owner, address, roles]); |
79 | 79 |
|
| 80 | + // stabilized select function to avoid unnecessary re-renders |
| 81 | + const selectFn = useCallback( |
| 82 | + (queryData: boolean[]) => { |
| 83 | + const data = [...queryData]; |
| 84 | + |
| 85 | + // Remove optional first service elements from array |
| 86 | + let isAdmin = false; |
| 87 | + let isNOM = false; |
| 88 | + if (rolesOffset > 0) { |
| 89 | + isAdmin = !!data.shift(); |
| 90 | + } |
| 91 | + if (rolesOffset > 1) { |
| 92 | + isNOM = !!data.shift(); |
| 93 | + } |
| 94 | + |
| 95 | + const rolesResult = data.map((item, index) => { |
| 96 | + const saturateRole = saturatedRoles[index + rolesOffset]; |
| 97 | + isAdmin ||= saturateRole.role === 'defaultAdmin' && !!item; |
| 98 | + isNOM ||= saturateRole.role === 'nodeOperatorManager' && !!item; |
| 99 | + return { |
| 100 | + role: saturateRole.role, |
| 101 | + // user can have role if |
| 102 | + hasRole: |
| 103 | + // 1. roles is set directly |
| 104 | + !!item || |
| 105 | + // 2. user is admin over this role |
| 106 | + (saturateRole.isAdminRole && isAdmin) || |
| 107 | + (saturateRole.isNOMRole && isNOM), |
| 108 | + }; |
| 109 | + }); |
| 110 | + |
| 111 | + return { |
| 112 | + result: rolesResult, |
| 113 | + hasPermissions: rolesResult.every((item) => item.hasRole), |
| 114 | + hasDefaultAdminsPermissions: isAdmin, |
| 115 | + hasNodeOperatorPermissions: isNOM, |
| 116 | + missingRoles: rolesResult |
| 117 | + .filter((item) => !item.hasRole) |
| 118 | + .map((item) => item.role), |
| 119 | + }; |
| 120 | + }, |
| 121 | + [rolesOffset, saturatedRoles], |
| 122 | + ); |
| 123 | + |
80 | 124 | const query = useReadContracts({ |
81 | 125 | contracts, |
82 | 126 | allowFailure: false, |
83 | 127 | batchSize: 5, |
84 | 128 | query: { |
85 | | - select: (data) => { |
86 | | - // Remove optional first service elements from array |
87 | | - let isAdmin = false; |
88 | | - let isNOM = false; |
89 | | - if (rolesOffset > 0) { |
90 | | - isAdmin = !!data.shift(); |
91 | | - } |
92 | | - if (rolesOffset > 1) { |
93 | | - isNOM = !!data.shift(); |
94 | | - } |
95 | | - |
96 | | - const rolesResult = data.map((item, index) => { |
97 | | - const saturateRole = saturatedRoles[index]; |
98 | | - isAdmin ||= saturateRole.role === 'defaultAdmin' && !!item; |
99 | | - isNOM ||= saturateRole.role === 'nodeOperatorManager' && !!item; |
100 | | - return { |
101 | | - role: saturateRole.role, |
102 | | - // user can have role if |
103 | | - hasRole: |
104 | | - // 1. roles is set directly |
105 | | - !!item || |
106 | | - // 2. user is admin over this role |
107 | | - (saturateRole.isAdminRole && isAdmin) || |
108 | | - (saturateRole.isNOMRole && isNOM), |
109 | | - }; |
110 | | - }); |
111 | | - |
112 | | - return { |
113 | | - result: rolesResult, |
114 | | - hasPermissions: rolesResult.every((item) => item.hasRole), |
115 | | - hasDefaultAdminsPermissions: isAdmin, |
116 | | - hasNodeOperatorPermissions: isNOM, |
117 | | - missingRoles: rolesResult |
118 | | - .filter((item) => !item.hasRole) |
119 | | - .map((item) => item.role), |
120 | | - }; |
121 | | - }, |
| 129 | + select: selectFn, |
| 130 | + enabled: Boolean(activeVault?.owner && address && roles.length > 0), |
122 | 131 | }, |
123 | 132 | }); |
124 | 133 |
|
|
0 commit comments