From fc3d2e969e40338794ac42ab76ecfc231c7ccd99 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Thu, 31 Jul 2025 11:31:17 -0400 Subject: [PATCH 1/2] feat: [UIE-9001] - IAM RBAC update usePermissions hook to return consistent with other queries/hooks --- .../src/components/ActionMenu/ActionMenu.tsx | 133 ++++++++++-------- .../PaymentMethodRow.test.tsx | 10 +- .../PaymentMethodRow/PaymentMethodRow.tsx | 2 +- .../SelectFirewallPanel.test.tsx | 2 +- .../features/Account/AccountLanding.test.tsx | 4 +- .../src/features/Account/AccountLanding.tsx | 4 +- .../BillingSummary/BillingSummary.test.tsx | 4 +- .../BillingSummary/BillingSummary.tsx | 4 +- .../ContactInformation.test.tsx | 6 +- .../ContactInfoPanel/ContactInformation.tsx | 2 +- .../PaymentInformation.test.tsx | 6 +- .../PaymentInfoPanel/PaymentInformation.tsx | 2 +- .../Devices/AddLinodeDrawer.test.tsx | 6 +- .../Devices/AddLinodeDrawer.tsx | 2 +- .../Devices/FirewallDeviceLanding.test.tsx | 12 +- .../Devices/FirewallDeviceLanding.tsx | 2 +- .../Devices/RemoveDeviceDialog.tsx | 4 +- .../Rules/FirewallRulesLanding.test.tsx | 10 +- .../Firewalls/FirewallDetail/index.tsx | 2 +- .../CreateFirewallDrawer.test.tsx | 6 +- .../FirewallLanding/CreateFirewallDrawer.tsx | 2 +- .../FirewallActionMenu.test.tsx | 8 +- .../FirewallLanding/FirewallActionMenu.tsx | 3 +- .../FirewallLanding/FirewallLanding.tsx | 2 +- .../FirewallLandingEmptyState.test.tsx | 6 +- .../FirewallLandingEmptyState.tsx | 2 +- .../FirewallLanding/FirewallRow.test.tsx | 2 +- .../Users/UserDetails/UsernamePanel.test.tsx | 6 +- .../IAM/Users/UserDetails/UsernamePanel.tsx | 2 +- .../src/features/IAM/hooks/usePermissions.ts | 26 ++-- .../Linodes/LinodeCreate/Actions.test.tsx | 6 +- .../features/Linodes/LinodeCreate/Actions.tsx | 8 +- .../LinodeCreate/Addons/Backups.test.tsx | 4 +- .../Linodes/LinodeCreate/Addons/Backups.tsx | 2 +- .../LinodeCreate/Addons/PrivateIP.test.tsx | 4 +- .../Linodes/LinodeCreate/Addons/PrivateIP.tsx | 2 +- .../LinodeCreate/Details/Details.test.tsx | 4 +- .../Linodes/LinodeCreate/Details/Details.tsx | 2 +- .../Linodes/LinodeCreate/EUAgreement.test.tsx | 4 +- .../Linodes/LinodeCreate/EUAgreement.tsx | 2 +- .../Linodes/LinodeCreate/Firewall.test.tsx | 6 +- .../Linodes/LinodeCreate/Firewall.tsx | 2 +- .../LinodeCreate/Networking/Firewall.tsx | 2 +- .../Networking/InterfaceFirewall.test.tsx | 6 +- .../Networking/InterfaceFirewall.tsx | 2 +- .../Networking/LinodeInterface.test.tsx | 2 +- .../LinodeCreate/Networking/VLAN.test.tsx | 4 +- .../Linodes/LinodeCreate/Networking/VLAN.tsx | 2 +- .../features/Linodes/LinodeCreate/Plan.tsx | 2 +- .../Linodes/LinodeCreate/Region.test.tsx | 4 +- .../features/Linodes/LinodeCreate/Region.tsx | 2 +- .../Linodes/LinodeCreate/Security.test.tsx | 8 +- .../Linodes/LinodeCreate/Security.tsx | 2 +- .../Linodes/LinodeCreate/Tabs/Images.test.tsx | 4 +- .../Linodes/LinodeCreate/Tabs/Images.tsx | 2 +- .../Tabs/OperatingSystems.test.tsx | 4 +- .../LinodeCreate/Tabs/OperatingSystems.tsx | 2 +- .../LinodeCreate/UserData/UserData.tsx | 2 +- .../Linodes/LinodeCreate/VLAN/VLAN.test.tsx | 4 +- .../Linodes/LinodeCreate/VLAN/VLAN.tsx | 2 +- .../features/Linodes/LinodeCreate/index.tsx | 2 +- .../shared/LinodeSelectTable.test.tsx | 2 +- .../shared/LinodeSelectTableRow.test.tsx | 6 +- .../shared/LinodeSelectTableRow.tsx | 2 +- .../shared/SelectLinodeCard.test.tsx | 6 +- .../LinodeCreate/shared/SelectLinodeCard.tsx | 2 +- .../Linodes/LinodeEntityDetail.test.tsx | 2 +- .../features/Linodes/LinodeEntityDetail.tsx | 2 +- .../Linodes/LinodeEntityDetailFooter.test.tsx | 4 +- .../Linodes/LinodeEntityDetailFooter.tsx | 2 +- .../LinodeAlerts/LinodeAlerts.test.tsx | 4 +- .../LinodeAlerts/LinodeAlerts.tsx | 2 +- .../LinodeBackup/LinodeBackupActionMenu.tsx | 4 +- .../LinodeBackup/LinodeBackups.test.tsx | 2 +- .../LinodeBackup/LinodeBackups.tsx | 2 +- .../LinodeConfigActionMenu.test.tsx | 4 +- .../LinodeConfigs/LinodeConfigActionMenu.tsx | 2 +- .../LinodeConfigs/LinodeConfigs.test.tsx | 6 +- .../LinodeConfigs/LinodeConfigs.tsx | 2 +- .../LinodeFirewalls/LinodeFirewalls.test.tsx | 18 +-- .../LinodeFirewalls/LinodeFirewalls.tsx | 2 +- .../LinodeFirewallsActionMenu.tsx | 2 +- .../LinodeSettings/LinodeSettings.test.tsx | 4 +- .../LinodeSettings/LinodeSettings.tsx | 2 +- .../LinodeSettingsPasswordPanel.test.tsx | 12 +- .../LinodeSettingsPasswordPanel.tsx | 2 +- .../LinodeDiskActionMenu.test.tsx | 10 +- .../LinodeStorage/LinodeDiskActionMenu.tsx | 2 +- .../LinodeStorage/LinodeDisks.test.tsx | 8 +- .../LinodeStorage/LinodeDisks.tsx | 6 +- .../LinodeActionMenu.test.tsx | 8 +- .../LinodeActionMenu/LinodeActionMenu.tsx | 2 +- .../LinodeRow/LinodeRow.test.tsx | 2 +- .../LinodesLandingEmptyState.test.tsx | 4 +- .../LinodesLandingEmptyState.tsx | 2 +- .../manager/src/features/Linodes/index.tsx | 2 +- .../NodeBalancers/NodeBalancerCreate.test.tsx | 2 +- .../PlacementGroupsDetailPanel.tsx | 2 +- .../DisplaySettings/UsernameForm.test.tsx | 6 +- .../Profile/DisplaySettings/UsernameForm.tsx | 2 +- 100 files changed, 285 insertions(+), 257 deletions(-) diff --git a/packages/manager/src/components/ActionMenu/ActionMenu.tsx b/packages/manager/src/components/ActionMenu/ActionMenu.tsx index c51f734de97..c7d334871aa 100644 --- a/packages/manager/src/components/ActionMenu/ActionMenu.tsx +++ b/packages/manager/src/components/ActionMenu/ActionMenu.tsx @@ -1,4 +1,4 @@ -import { convertToKebabCase, TooltipIcon } from '@linode/ui'; +import { CircleProgress, convertToKebabCase, TooltipIcon } from '@linode/ui'; import { IconButton, ListItemText } from '@mui/material'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; @@ -23,6 +23,10 @@ export interface ActionMenuProps { * Gives the Menu Button an accessible name */ ariaLabel: string; + /** + * If true, show a loading indicator + */ + loading?: boolean; /** * A function that is called when the Menu is opened. Useful for analytics. */ @@ -40,7 +44,8 @@ export interface ActionMenuProps { * No more than 8 items should be displayed within an action menu. */ export const ActionMenu = React.memo((props: ActionMenuProps) => { - const { actionsList, ariaLabel, onOpen, stopClickPropagation } = props; + const { actionsList, ariaLabel, loading, onOpen, stopClickPropagation } = + props; const menuId = convertToKebabCase(ariaLabel); const buttonId = `${convertToKebabCase(ariaLabel)}-button`; @@ -95,6 +100,8 @@ export const ActionMenu = React.memo((props: ActionMenuProps) => { aria-label={ariaLabel} color="inherit" id={buttonId} + loading={loading} + loadingIndicator={} onClick={handleClick} onKeyDown={handleKeyPress} sx={(theme) => ({ @@ -112,66 +119,68 @@ export const ActionMenu = React.memo((props: ActionMenuProps) => { > - ({ - backgroundColor: theme.palette.primary.main, - }), - }, - }} - transformOrigin={{ - horizontal: 'right', - vertical: 'top', - }} - transitionDuration={225} - > - {actionsList.map((a, idx) => ( - { - if (!a.disabled) { - handleClose(e); - a.onClick(); - } - if (stopClickPropagation) { - e.stopPropagation(); - } - }} - onMouseEnter={handleMouseEnter} - > - - {a.title} - - {a.tooltip && ( - - )} - - ))} - + {!loading && ( + ({ + backgroundColor: theme.palette.primary.main, + }), + }, + }} + transformOrigin={{ + horizontal: 'right', + vertical: 'top', + }} + transitionDuration={225} + > + {actionsList.map((a, idx) => ( + { + if (!a.disabled) { + handleClose(e); + a.onClick(); + } + if (stopClickPropagation) { + e.stopPropagation(); + } + }} + onMouseEnter={handleMouseEnter} + > + + {a.title} + + {a.tooltip && ( + + )} + + ))} + + )} ); }); diff --git a/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.test.tsx b/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.test.tsx index a392bf0ef76..6fc3c569ed4 100644 --- a/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.test.tsx +++ b/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.test.tsx @@ -13,7 +13,7 @@ import { PaymentMethodRow } from './PaymentMethodRow'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { make_billing_payment: false, update_account: false, }, @@ -146,7 +146,7 @@ describe('Payment Method Row', () => { it('Calls `onDelete` callback when "Delete" action is clicked', async () => { const mockFunction = vi.fn(); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { make_billing_payment: false, update_account: true, }, @@ -172,7 +172,7 @@ describe('Payment Method Row', () => { it('Makes payment method default when "Make Default" action is clicked', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { make_billing_payment: true, update_account: true, }, @@ -203,7 +203,7 @@ describe('Payment Method Row', () => { it('should disable "Make a Payment" button if the user does not have make_billing_payment permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { make_billing_payment: false, update_account: false, }, @@ -229,7 +229,7 @@ describe('Payment Method Row', () => { it('should enable "Make a Payment" button if the user has make_billing_payment permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { make_billing_payment: true, update_account: false, }, diff --git a/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.tsx b/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.tsx index d3970e4c1a1..4a2f6fe98aa 100644 --- a/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.tsx +++ b/packages/manager/src/components/PaymentMethodRow/PaymentMethodRow.tsx @@ -43,7 +43,7 @@ export const PaymentMethodRow = (props: Props) => { const { mutateAsync: makePaymentMethodDefault } = useMakeDefaultPaymentMethodMutation(props.paymentMethod.id); - const { permissions } = usePermissions('account', [ + const { data: permissions } = usePermissions('account', [ 'make_billing_payment', 'update_account', ]); diff --git a/packages/manager/src/components/SelectFirewallPanel/SelectFirewallPanel.test.tsx b/packages/manager/src/components/SelectFirewallPanel/SelectFirewallPanel.test.tsx index 1d06b176d32..3af10cf7b5c 100644 --- a/packages/manager/src/components/SelectFirewallPanel/SelectFirewallPanel.test.tsx +++ b/packages/manager/src/components/SelectFirewallPanel/SelectFirewallPanel.test.tsx @@ -15,7 +15,7 @@ const testId = 'select-firewall-panel'; const queryMocks = vi.hoisted(() => ({ usePermissions: vi.fn(() => ({ - permissions: { delete_firewall: true, update_firewall: true }, + data: { delete_firewall: true, update_firewall: true }, })), useQueryWithPermissions: vi.fn().mockReturnValue({ data: [], diff --git a/packages/manager/src/features/Account/AccountLanding.test.tsx b/packages/manager/src/features/Account/AccountLanding.test.tsx index a4ace258d90..09bcc926a22 100644 --- a/packages/manager/src/features/Account/AccountLanding.test.tsx +++ b/packages/manager/src/features/Account/AccountLanding.test.tsx @@ -6,7 +6,7 @@ import { AccountLanding } from './AccountLanding'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { make_billing_payment: false }, + data: { make_billing_payment: false }, })), })); @@ -26,7 +26,7 @@ describe('AccountLanding', () => { it('should enable "Make a Payment" button if the user has make_billing_payment permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { make_billing_payment: true }, + data: { make_billing_payment: true }, }); const { getByRole } = renderWithTheme(); diff --git a/packages/manager/src/features/Account/AccountLanding.tsx b/packages/manager/src/features/Account/AccountLanding.tsx index 2e79df5616c..3c8f658fa1a 100644 --- a/packages/manager/src/features/Account/AccountLanding.tsx +++ b/packages/manager/src/features/Account/AccountLanding.tsx @@ -39,7 +39,9 @@ export const AccountLanding = () => { const { data: profile } = useProfile(); const { limitsEvolution } = useFlags(); - const { permissions } = usePermissions('account', ['make_billing_payment']); + const { data: permissions } = usePermissions('account', [ + 'make_billing_payment', + ]); const [isDrawerOpen, setIsDrawerOpen] = React.useState(false); const sessionContext = React.useContext(switchAccountSessionContext); diff --git a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx index f8ca3a44101..51ec9c4a297 100644 --- a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx @@ -14,7 +14,7 @@ const accountBalanceValue = 'account-balance-value'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_promo_code: false, }, })), @@ -192,7 +192,7 @@ describe('BillingSummary', () => { it('displays the "Add a promo code" button if user has create_promo_code permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_promo_code: true, }, }); diff --git a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.tsx b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.tsx index 70961ff5050..fcd5dcfa140 100644 --- a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.tsx @@ -30,7 +30,9 @@ export const BillingSummary = (props: BillingSummaryProps) => { const { data: notifications } = useNotificationsQuery(); const { data: account } = useAccount(); - const { permissions } = usePermissions('account', ['create_promo_code']); + const { data: permissions } = usePermissions('account', [ + 'create_promo_code', + ]); const [isPromoDialogOpen, setIsPromoDialogOpen] = React.useState(false); diff --git a/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.test.tsx b/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.test.tsx index 6ab8eb34068..3f2e3f1a2e4 100644 --- a/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.test.tsx @@ -10,7 +10,7 @@ const EDIT_BUTTON_ID = 'edit-contact-info'; const queryMocks = vi.hoisted(() => ({ useProfile: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { update_account: false }, + data: { update_account: false }, })), })); @@ -85,7 +85,7 @@ describe('Edit Contact Information', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { update_account: true }, + data: { update_account: true }, }); const { getByTestId } = renderWithTheme(); @@ -104,7 +104,7 @@ describe('Edit Contact Information', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { update_account: true }, + data: { update_account: true }, }); const { getByTestId } = renderWithTheme( diff --git a/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.tsx b/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.tsx index 971083369d9..d362e6afb8a 100644 --- a/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/ContactInfoPanel/ContactInformation.tsx @@ -76,7 +76,7 @@ export const ContactInformation = React.memo((props: Props) => { return notification.type === 'tax_id_verifying'; }); - const { permissions } = usePermissions('account', ['update_account']); + const { data: permissions } = usePermissions('account', ['update_account']); const isReadOnly = !permissions.update_account || isChildUser; diff --git a/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.test.tsx b/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.test.tsx index 5e5d0650a06..cfe11db70c6 100644 --- a/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.test.tsx @@ -22,7 +22,7 @@ vi.mock('@linode/api-v4/lib/account', async () => { const queryMocks = vi.hoisted(() => ({ useProfile: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { update_account: false, make_billing_payment: false }, + data: { update_account: false, make_billing_payment: false }, })), })); @@ -98,7 +98,7 @@ describe('Payment Info Panel', () => { it('Opens "Add Payment Method" drawer when "Add Payment Method" is clicked', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { update_account: true, make_billing_payment: true }, + data: { update_account: true, make_billing_payment: true }, }); const { getByTestId, findByTestId } = renderWithTheme( @@ -187,7 +187,7 @@ describe('Payment Info Panel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { update_account: false, make_billing_payment: false }, + data: { update_account: false, make_billing_payment: false }, }); const { getByTestId } = renderWithTheme( diff --git a/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.tsx b/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.tsx index 7a664342583..09dc656af8e 100644 --- a/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/PaymentInfoPanel/PaymentInformation.tsx @@ -48,7 +48,7 @@ const PaymentInformation = (props: Props) => { const isChildUser = profile?.user_type === 'child'; - const { permissions } = usePermissions('account', ['update_account']); + const { data: permissions } = usePermissions('account', ['update_account']); const isReadOnly = !permissions.update_account || isChildUser; diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.test.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.test.tsx index a55b44ae319..65c58a3cd2f 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.test.tsx @@ -18,7 +18,7 @@ const props = { const queryMocks = vi.hoisted(() => ({ useParams: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_firewall_device: false, }, })), @@ -63,7 +63,7 @@ describe('AddLinodeDrawer', () => { it('should disable "Add" button if the user does not have create_firewall_device permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: false, }, }); @@ -86,7 +86,7 @@ describe('AddLinodeDrawer', () => { it('should enable "Add" button if the user has create_firewall_device permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: true, }, }); diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.tsx index 0fe68254b15..ff32e4c52c8 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.tsx @@ -59,7 +59,7 @@ export const AddLinodeDrawer = (props: Props) => { const firewall = data?.find((firewall) => firewall.id === Number(id)); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'firewall', ['create_firewall_device'], firewall?.id diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx index 5f922d4b970..7ef14493bdd 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx @@ -19,7 +19,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn().mockReturnValue({}), useSearch: vi.fn().mockReturnValue({}), usePermissions: vi.fn(() => ({ - permissions: { + data: { create_firewall_device: false, }, })), @@ -97,7 +97,7 @@ services.forEach((service: FirewallDeviceEntityType) => { if (serviceName !== 'Linode') { it(`should contain a disabled Add ${serviceName} button`, () => { queryMocks.usePermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: false, }, }); @@ -121,7 +121,7 @@ services.forEach((service: FirewallDeviceEntityType) => { if (serviceName !== 'Linode') { it(`should contain an enabled Add ${serviceName} button`, () => { queryMocks.usePermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: true, }, }); @@ -135,7 +135,7 @@ services.forEach((service: FirewallDeviceEntityType) => { it(`should navigate to Add ${serviceName} To Firewall drawer when enabled`, async () => { queryMocks.usePermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: true, }, }); @@ -163,7 +163,7 @@ services.forEach((service: FirewallDeviceEntityType) => { if (serviceName === 'Linode') { it('should disable "Add Linodes to Firewall" button if the user does not have create_firewall_device permission', async () => { queryMocks.usePermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: false, }, }); @@ -180,7 +180,7 @@ services.forEach((service: FirewallDeviceEntityType) => { }); it('should enable "Add Linodes to Firewall" button if the user has create_firewall_device permission', async () => { queryMocks.usePermissions.mockReturnValue({ - permissions: { + data: { create_firewall_device: true, }, }); diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx index c545101b9e6..ba80f034d07 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx @@ -27,7 +27,7 @@ export const FirewallDeviceLanding = React.memo( const theme = useTheme(); const navigate = useNavigate(); const location = useLocation(); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'firewall', ['create_firewall_device', 'delete_firewall_device'], firewallId diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/RemoveDeviceDialog.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/RemoveDeviceDialog.tsx index 40d79c82d66..8ac0f1ad825 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/RemoveDeviceDialog.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/RemoveDeviceDialog.tsx @@ -52,13 +52,13 @@ export const RemoveDeviceDialog = React.memo((props: Props) => { const deviceDialog = formattedTypes[deviceType ?? 'linode']; - const { permissions: firewallPermissions } = usePermissions( + const { data: firewallPermissions } = usePermissions( 'firewall', ['delete_firewall_device'], firewallId ); - const { permissions: linodePermissions } = usePermissions( + const { data: linodePermissions } = usePermissions( 'linode', ['update_linode'], device?.entity.id diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.test.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.test.tsx index e05ab9304dd..b779f0c3ead 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.test.tsx @@ -7,7 +7,7 @@ import { FirewallRulesLanding } from './FirewallRulesLanding'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { update_firewall_rules: false, }, })), @@ -38,7 +38,7 @@ vi.mock('@tanstack/react-router', async () => { const firewallRules = firewallRulesFactory.build(); const getDisabledState = () => - !queryMocks.userPermissions().permissions.update_firewall_rules; + !queryMocks.userPermissions().data.update_firewall_rules; describe('FirewallRuleTable', () => { it('should disable "Add AN Inbound Rule" button if the user does not have update_firewall_rules permission', () => { @@ -117,7 +117,7 @@ describe('FirewallRuleTable', () => { it('should enable menu buttons if the user has update_firewall_rules permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_firewall_rules: true, }, }); @@ -150,7 +150,7 @@ describe('FirewallRuleTable', () => { it('should enable "Add AN Inbound Rule" button if the user has update_firewall_rules permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_firewall_rules: true, }, }); @@ -170,7 +170,7 @@ describe('FirewallRuleTable', () => { it('should enable "Add AN Outbound Rule" button if the user has update_firewall_rules permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_firewall_rules: true, }, }); diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx index ddffbaf1429..54a812b9ab7 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx @@ -73,7 +73,7 @@ export const FirewallDetail = () => { firewallSettings && getFirewallDefaultEntities(firewallId, firewallSettings); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'firewall', ['update_firewall_rules'], firewallId diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.test.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.test.tsx index fd75affb34b..e137950eab6 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.test.tsx @@ -10,7 +10,7 @@ import { CreateFirewallDrawer } from './CreateFirewallDrawer'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { create_firewall: true }, + data: { create_firewall: true }, })), useQueryWithPermissions: vi.fn().mockReturnValue({ data: [], @@ -120,7 +120,7 @@ describe('Create Firewall Drawer', () => { it('enables the submit button if the user has create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { create_firewall: true }, + data: { create_firewall: true }, }); renderWithTheme(); @@ -130,7 +130,7 @@ describe('Create Firewall Drawer', () => { it('disables the submit button if the user does not have create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { create_firewall: false }, + data: { create_firewall: false }, }); renderWithTheme(); diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.tsx index a3b827b3b4b..ecced57860c 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.tsx @@ -62,7 +62,7 @@ export const CreateFirewallDrawer = (props: CreateFirewallDrawerProps) => { const { mutateAsync: createFirewall } = useCreateFirewall(); - const { permissions } = usePermissions('account', ['create_firewall']); + const { data: permissions } = usePermissions('account', ['create_firewall']); const { enqueueSnackbar } = useSnackbar(); diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.test.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.test.tsx index 05d3d1535a2..760079ed846 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.test.tsx @@ -10,10 +10,10 @@ import type { FirewallStatus } from '@linode/api-v4'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { update_firewall: false, delete_firewall: false }, + data: { update_firewall: false, delete_firewall: false }, })), useIsLinodeInterfacesEnabled: vi.fn(() => ({ - permissions: { isLinodeInterfacesEnabled: false }, + data: { isLinodeInterfacesEnabled: false }, })), })); @@ -51,7 +51,7 @@ describe('FirewallActionMenu', () => { it('enables Enable/Disable and Delete actions if user has permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { update_firewall: true, delete_firewall: true }, + data: { update_firewall: true, delete_firewall: true }, }); renderWithTheme(); @@ -68,7 +68,7 @@ describe('FirewallActionMenu', () => { it('enables Enable/Disable and disabled Delete actions if user has permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { update_firewall: true, delete_firewall: false }, + data: { update_firewall: true, delete_firewall: false }, }); renderWithTheme(); diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.tsx index 9054760943e..35e56f1e868 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallActionMenu.tsx @@ -41,7 +41,7 @@ export const FirewallActionMenu = React.memo((props: Props) => { triggerEnableFirewall, } = props; - const { permissions } = usePermissions( + const { data: permissions, isLoading } = usePermissions( 'firewall', ['update_firewall', 'delete_firewall'], firewallID, @@ -87,6 +87,7 @@ export const FirewallActionMenu = React.memo((props: Props) => { setIsOpen(true)} /> ); diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLanding.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLanding.tsx index 89e70c000d2..08be4221aec 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLanding.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLanding.tsx @@ -72,7 +72,7 @@ const FirewallLanding = () => { (firewall) => firewall.id === selectedFirewallId ); - const { permissions } = usePermissions('account', ['create_firewall']); + const { data: permissions } = usePermissions('account', ['create_firewall']); const openModal = (mode: Mode, id: number) => { setSelectedFirewallId(id); diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.test.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.test.tsx index cb923649a88..750db31c00d 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.test.tsx @@ -7,7 +7,7 @@ import { FirewallLandingEmptyState } from './FirewallLandingEmptyState'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { create_firewall: true }, + data: { create_firewall: true }, })), })); @@ -18,7 +18,7 @@ vi.mock('src/features/IAM/hooks/usePermissions', () => ({ describe('FirewallLandingEmptyState', () => { it('enables the Create Firewall button if the user has create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { create_firewall: true }, + data: { create_firewall: true }, }); renderWithTheme( @@ -29,7 +29,7 @@ describe('FirewallLandingEmptyState', () => { it('disables the Create Firewall button if the user does not have create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { create_firewall: false }, + data: { create_firewall: false }, }); renderWithTheme( diff --git a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.tsx b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.tsx index 349adb1700a..08d650378c6 100644 --- a/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.tsx +++ b/packages/manager/src/features/Firewalls/FirewallLanding/FirewallLandingEmptyState.tsx @@ -20,7 +20,7 @@ interface Props { export const FirewallLandingEmptyState = (props: Props) => { const { openAddFirewallDrawer } = props; - const { permissions } = usePermissions('account', ['create_firewall']); + const { data: permissions } = usePermissions('account', ['create_firewall']); return ( { vi.mock('src/features/IAM/hooks/usePermissions', () => ({ usePermissions: vi.fn(() => ({ - permissions: { delete_firewall: true, update_firewall: true }, + data: { delete_firewall: true, update_firewall: true }, })), })); diff --git a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.test.tsx b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.test.tsx index 1a4d881a816..22bde07e31a 100644 --- a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.test.tsx +++ b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.test.tsx @@ -8,7 +8,7 @@ import { UsernamePanel } from './UsernamePanel'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { update_user: false, }, })), @@ -45,7 +45,7 @@ describe('UsernamePanel', () => { it("does not allow the user to update a proxy user's username", async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_user: true, }, }); @@ -78,7 +78,7 @@ describe('UsernamePanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_user: true, }, }); diff --git a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx index c52e10bd302..901f3f241e4 100644 --- a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx +++ b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx @@ -23,7 +23,7 @@ export const UsernamePanel = ({ user }: Props) => { const { mutateAsync } = useUpdateUserMutation(user.username); - const { permissions } = usePermissions('account', ['update_user']); + const { data: permissions } = usePermissions('account', ['update_user']); const { control, diff --git a/packages/manager/src/features/IAM/hooks/usePermissions.ts b/packages/manager/src/features/IAM/hooks/usePermissions.ts index bb9a5df58d2..06e43dafb6a 100644 --- a/packages/manager/src/features/IAM/hooks/usePermissions.ts +++ b/packages/manager/src/features/IAM/hooks/usePermissions.ts @@ -28,23 +28,25 @@ import type { } from '@linode/api-v4'; import type { UseQueryResult } from '@linode/queries'; +export type PermissionsResult = { + data: Record; +} & Omit, 'data'>; + export const usePermissions = ( accessType: AccessType, permissionsToCheck: PermissionType[], entityId?: number, enabled: boolean = true -): { permissions: Record } => { +): PermissionsResult => { const { isIAMEnabled } = useIsIAMEnabled(); - const { data: userAccountPermissions } = useUserAccountPermissions( - isIAMEnabled && accessType === 'account' && enabled - ); + const { data: userAccountPermissions, ...restAccountPermissions } = + useUserAccountPermissions( + isIAMEnabled && accessType === 'account' && enabled + ); - const { data: userEntityPermisssions } = useUserEntityPermissions( - accessType, - entityId!, - isIAMEnabled && enabled - ); + const { data: userEntityPermisssions, ...restEntityPermissions } = + useUserEntityPermissions(accessType, entityId!, isIAMEnabled && enabled); const usersPermissions = accessType === 'account' ? userAccountPermissions : userEntityPermisssions; @@ -66,7 +68,11 @@ export const usePermissions = ( entityId ); - return { permissions: permissionMap } as const; + return { + data: permissionMap, + ...restAccountPermissions, + ...restEntityPermissions, + } as const; }; export type EntityBase = Pick; diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Actions.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Actions.test.tsx index 0c81bd5584d..2a395aa1ec0 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Actions.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Actions.test.tsx @@ -9,7 +9,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, clone_linode: false, }, @@ -65,7 +65,7 @@ describe('Actions', () => { it('should render an enabled create button, if user has create_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, clone_linode: true, }, @@ -84,7 +84,7 @@ describe('Actions', () => { it('should render an enabled create button for cloning, if user has clone_linode permission', () => { queryMocks.useParams.mockReturnValue({ type: 'Clone Linode' }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, clone_linode: true, }, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Actions.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Actions.tsx index bceb76f7062..e9371f92ad2 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Actions.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Actions.tsx @@ -43,9 +43,13 @@ export const Actions = ({ isAlertsBetaMode }: ActionProps) => { ], }); - const { permissions } = usePermissions('linode', ['clone_linode'], linodeId); + const { data: permissions } = usePermissions( + 'linode', + ['clone_linode'], + linodeId + ); - const { permissions: accountPermissions } = usePermissions('account', [ + const { data: accountPermissions } = usePermissions('account', [ 'create_linode', ]); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx index 4a891ae67fc..500c4602dde 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx @@ -16,7 +16,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -65,7 +65,7 @@ describe('Linode Create Backups Addon', () => { it('should be enabled if the user has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.tsx index aa468a887ec..758f683f2b1 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.tsx @@ -35,7 +35,7 @@ export const Backups = () => { name: ['region', 'type', 'disk_encryption'], }); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const { data: type } = useTypeQuery(typeId, Boolean(typeId)); const { data: regions } = useRegionsQuery(); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx index 07d21530313..b7b82537cc8 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx @@ -12,7 +12,7 @@ import type { CreateLinodeRequest } from '@linode/api-v4'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -45,7 +45,7 @@ describe('Linode Create Private IP Add-on', () => { it('should be enabled if the user has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.tsx index 6b9f3608bf9..70e7e9802fc 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.tsx @@ -23,7 +23,7 @@ export const PrivateIP = () => { const { data: regions } = useRegionsQuery(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const regionId = useWatch({ name: 'region' }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx index 5569ad4ad11..b656b66041f 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx @@ -10,7 +10,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -105,7 +105,7 @@ describe('Linode Create Details', () => { it('should enable the label and tag TextFields if the user has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.tsx index 8694c0fea78..dd9febe93e8 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.tsx @@ -17,7 +17,7 @@ export const Details = () => { const createType = useGetLinodeCreateType(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); return ( diff --git a/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.test.tsx index efb06e5ebaa..05ef20a0f51 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.test.tsx @@ -12,7 +12,7 @@ import type { LinodeCreateFormValues } from './utilities'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { acknowledge_account_agreement: false, }, })), @@ -48,7 +48,7 @@ describe('EUAgreement', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { acknowledge_account_agreement: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.tsx b/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.tsx index c6f9a0b7857..2f2ad558a56 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/EUAgreement.tsx @@ -26,7 +26,7 @@ export const EUAgreement = () => { const { data: agreements } = useAccountAgreements(hasSelectedAnEURegion); - const { permissions } = usePermissions('account', [ + const { data: permissions } = usePermissions('account', [ 'acknowledge_account_agreement', ]); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Firewall.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Firewall.test.tsx index 1efdd94dc7b..94f6f00b35f 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Firewall.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Firewall.test.tsx @@ -15,7 +15,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, create_firewall: false, }, @@ -78,7 +78,7 @@ describe('Linode Create Firewall', () => { it('should enable a Firewall select if the user has create_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, create_firewall: true, }, @@ -95,7 +95,7 @@ describe('Linode Create Firewall', () => { it('should enable a "Create Firewall" button if the user has create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, create_firewall: true, }, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Firewall.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Firewall.tsx index 63afa31726b..162254cf02a 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Firewall.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Firewall.tsx @@ -36,7 +36,7 @@ export const Firewall = () => { const secureVMFirewallBanner = (secureVMNoticesEnabled && flags.secureVmCopy) ?? false; - const { permissions } = usePermissions('account', [ + const { data: permissions } = usePermissions('account', [ 'create_linode', 'create_firewall', ]); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/Firewall.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/Firewall.tsx index bb2849ba357..1d02c5f3434 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/Firewall.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/Firewall.tsx @@ -30,7 +30,7 @@ export const Firewall = () => { ] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false); - const { permissions } = usePermissions('account', [ + const { data: permissions } = usePermissions('account', [ 'create_linode', 'create_firewall', ]); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.test.tsx index 7a7b359fee2..7d5dc4c1be9 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.test.tsx @@ -6,7 +6,7 @@ import { InterfaceFirewall } from './InterfaceFirewall'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, create_firewall: false, }, @@ -42,7 +42,7 @@ describe('InterfaceFirewall', () => { it('should enable a Firewall select if the user has create_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, create_firewall: true, }, @@ -59,7 +59,7 @@ describe('InterfaceFirewall', () => { it('should enable a "Create Firewall" button if the user has create_firewall permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, create_firewall: true, }, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.tsx index a0e76685a5f..58f41dac985 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/InterfaceFirewall.tsx @@ -40,7 +40,7 @@ export const InterfaceFirewall = ({ index }: Props) => { const [isDrawerOpen, setIsDrawerOpen] = useState(false); - const { permissions } = usePermissions('account', [ + const { data: permissions } = usePermissions('account', [ 'create_linode', 'create_firewall', ]); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/LinodeInterface.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/LinodeInterface.test.tsx index b4ebe104224..74602447795 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/LinodeInterface.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/LinodeInterface.test.tsx @@ -12,7 +12,7 @@ import type { LinodeCreateFormValues } from '../utilities'; vi.mock('src/features/IAM/hooks/usePermissions', () => ({ usePermissions: vi.fn(() => ({ - permissions: { delete_firewall: true, update_firewall: true }, + data: { delete_firewall: true, update_firewall: true }, })), })); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.test.tsx index faff1615604..3031352c54c 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.test.tsx @@ -9,7 +9,7 @@ import { VLAN } from './VLAN'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -40,7 +40,7 @@ describe('VLAN', () => { const region = regionFactory.build({ capabilities: ['Vlans'] }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.tsx index 11334f13321..d64ceaf6110 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VLAN.tsx @@ -17,7 +17,7 @@ interface Props { export const VLAN = ({ index }: Props) => { const { control } = useFormContext(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const regionId = useWatch({ control, name: 'region' }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Plan.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Plan.tsx index c55ae9c1868..497c04cd73b 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Plan.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Plan.tsx @@ -26,7 +26,7 @@ export const Plan = () => { const { data: types } = useAllTypes(); const createType = useGetLinodeCreateType(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); return ( ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -77,7 +77,7 @@ describe('Region', () => { it('should enable the region select is the user has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Region.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Region.tsx index 53f436e21e3..427812f51d7 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Region.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Region.tsx @@ -70,7 +70,7 @@ export const Region = React.memo(() => { Boolean(selectedLinode?.type) ); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const { data: regions } = useRegionsQuery(); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx index 1dfd8ce4bd7..eecc3105370 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx @@ -24,7 +24,7 @@ const queryMocks = vi.hoisted(() => ({ useSearch: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -65,7 +65,7 @@ describe('Security', () => { it('should enable the root password input if the user does has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); @@ -95,7 +95,7 @@ describe('Security', () => { it('should disable an "Add An SSH Key" button if the user does not have create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: false, }, }); @@ -112,7 +112,7 @@ describe('Security', () => { it('should enable an "Add An SSH Key" button if the user has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Security.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Security.tsx index e2e598e3e9a..781fe44396a 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Security.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Security.tsx @@ -45,7 +45,7 @@ export const Security = () => { selectedRegion?.id ?? '' ); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); return ( diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.test.tsx index eb7614780a2..e3d3f068610 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.test.tsx @@ -9,7 +9,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -60,7 +60,7 @@ describe('Images', () => { it('renders an enables image select, if user has create_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.tsx index 7fbd8f25315..717cdc85696 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/Images.tsx @@ -32,7 +32,7 @@ export const Images = () => { }); const queryClient = useQueryClient(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const regionId = useWatch({ control, name: 'region' }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.test.tsx index 9c24f808bf8..23dcfaea4f9 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.test.tsx @@ -9,7 +9,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -69,7 +69,7 @@ describe('OperatingSystems', () => { it('should enable "ImageSelect" component if the user does has create_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.tsx index 61c9b5bc44d..dbfa4b981d2 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/OperatingSystems.tsx @@ -34,7 +34,7 @@ export const OperatingSystems = () => { const { data: region } = useRegionQuery(regionId); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const onChange = async (image: Image | null) => { field.onChange(image?.id ?? null); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/UserData/UserData.tsx b/packages/manager/src/features/Linodes/LinodeCreate/UserData/UserData.tsx index 7dad7bb6af1..72432706a53 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/UserData/UserData.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/UserData/UserData.tsx @@ -43,7 +43,7 @@ export const UserData = () => { [regions, regionId] ); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); if (!region?.capabilities.includes('Metadata')) { return null; diff --git a/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.test.tsx index 17ad2ddccf6..d10bbdb2be1 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.test.tsx @@ -12,7 +12,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -69,7 +69,7 @@ describe('VLAN', () => { const region = regionFactory.build({ capabilities: ['Vlans'] }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.tsx b/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.tsx index 6bb26a5a968..18860a918b3 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/VLAN/VLAN.tsx @@ -23,7 +23,7 @@ export const VLAN = () => { const createType = useGetLinodeCreateType(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const [imageId, regionId] = useWatch({ control, name: ['image', 'region'] }); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/index.tsx b/packages/manager/src/features/Linodes/LinodeCreate/index.tsx index 0e114dae0f5..993ef94c63b 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/index.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/index.tsx @@ -113,7 +113,7 @@ export const LinodeCreate = () => { const { handleLinodeCreateAnalyticsFormError } = useHandleLinodeCreateAnalyticsFormError(linodeCreateType ?? 'OS'); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const { tabs, handleTabChange, tabIndex } = useTabs([ { diff --git a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTable.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTable.test.tsx index 020dc07006f..4cf73ca9ae3 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTable.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTable.test.tsx @@ -18,7 +18,7 @@ const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), useSearch: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { clone_linode: true, }, })), diff --git a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.test.tsx index d18aa94367a..271adf308ae 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.test.tsx @@ -14,7 +14,7 @@ import { LinodeSelectTableRow } from './LinodeSelectTableRow'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { shutdown_linode: false, clone_linode: false, }, @@ -68,7 +68,7 @@ describe('LinodeSelectTableRow', () => { it('should should call onSelect when a radio is selected', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { shutdown_linode: false, clone_linode: true, }, @@ -179,7 +179,7 @@ describe('LinodeSelectTableRow', () => { it('should render an enabled power off button if the Linode is powered on, a onPowerOff function is passed, and the row is selected, if user has shutdown_linode permission', async () => { const linode = linodeFactory.build({ status: 'running' }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { shutdown_linode: true, clone_linode: true, }, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.tsx b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.tsx index db0ad68ae64..ae6b9a20440 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/shared/LinodeSelectTableRow.tsx @@ -33,7 +33,7 @@ export const LinodeSelectTableRow = (props: Props) => { const region = regions?.find((r) => r.id === linode.region); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['shutdown_linode', 'clone_linode'], linode.id diff --git a/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.test.tsx index ec085bed987..9baac9b60ad 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.test.tsx @@ -21,7 +21,7 @@ const defaultProps = { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { shutdown_linode: false, clone_linode: false, }, @@ -75,7 +75,7 @@ describe('SelectLinodeCard', () => { it('should enable the Selection Card if user has clone_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { shutdown_linode: true, clone_linode: true, }, @@ -95,7 +95,7 @@ describe('SelectLinodeCard', () => { it('displays the status and the enabled Power Off button of a linode that is selected and running when power actions should be shown, and user has shutdown_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { shutdown_linode: true, clone_linode: true, }, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.tsx b/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.tsx index e8c2c4fecfb..216069da2e6 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/shared/SelectLinodeCard.tsx @@ -45,7 +45,7 @@ export const SelectLinodeCard = ({ Boolean(linode?.image) ); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['shutdown_linode', 'clone_linode'], linode.id diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx index 3e74fa5b17e..603ce25c346 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx @@ -28,7 +28,7 @@ import type { AccountCapability } from '@linode/api-v4'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { update_linode: false, }, })), diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx index e1759161154..ccc334b48ef 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx @@ -74,7 +74,7 @@ export const LinodeEntityDetail = (props: Props) => { linodeId: linode.id, }); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['update_linode'], linode.id diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.test.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.test.tsx index ac6e5918b37..523a279660f 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.test.tsx @@ -15,7 +15,7 @@ const props = { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { update_account: false }, + data: { update_account: false }, })), })); @@ -37,7 +37,7 @@ describe('LinodeEntityDetailFooter', () => { it('should enable "Add a tag" button if the user has update_account permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { update_account: true }, + data: { update_account: true }, }); const { getByRole } = renderWithTheme( diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.tsx index d0603d0aa6b..e37e692cfb8 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetailFooter.tsx @@ -40,7 +40,7 @@ export const LinodeEntityDetailFooter = React.memo((props: FooterProps) => { linodeTags, } = props; - const { permissions } = usePermissions('account', ['update_account']); + const { data: permissions } = usePermissions('account', ['update_account']); const { mutateAsync: updateLinode } = useLinodeUpdateMutation(linodeId); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.test.tsx index 498b6855c6a..f7e43abc512 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.test.tsx @@ -10,7 +10,7 @@ import LinodeAlerts from './LinodeAlerts'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { update_linode: false, }, })), @@ -56,7 +56,7 @@ describe('LinodeAlerts', () => { it('should enable "Save" button if the user has update_linode permission', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.tsx index fa7370800ec..4dea813478d 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeAlerts/LinodeAlerts.tsx @@ -21,7 +21,7 @@ const LinodeAlerts = () => { const { aclpBetaServices } = useFlags(); const { data: linode } = useLinodeQuery(id); - const { permissions } = usePermissions('linode', ['update_linode'], id); + const { data: permissions } = usePermissions('linode', ['update_linode'], id); const isAclpAlertsSupportedRegionLinode = useIsAclpSupportedRegion({ capability: 'Linodes', diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackupActionMenu.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackupActionMenu.tsx index 179bb986da1..6e72715f1cd 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackupActionMenu.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackupActionMenu.tsx @@ -16,10 +16,10 @@ interface Props { export const LinodeBackupActionMenu = (props: Props) => { const { backup, linodeId, onDeploy, onRestore } = props; - const { permissions: accountPermissions } = usePermissions('account', [ + const { data: accountPermissions } = usePermissions('account', [ 'create_linode', ]); - const { permissions: linodePermissions } = usePermissions( + const { data: linodePermissions } = usePermissions( 'linode', ['update_linode'], linodeId diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx index ee1beb3c871..b1d843ac6ee 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx @@ -11,7 +11,7 @@ import type { LinodeBackupsResponse } from '@linode/api-v4'; const queryMocks = vi.hoisted(() => ({ useParams: vi.fn(), userPermissions: vi.fn(() => ({ - permissions: { + data: { list_linode_backups: true, create_linode_backup_snapshot: true, cancel_linode_backups: true, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.tsx index 142934fbb0d..11b92feb8a5 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.tsx @@ -43,7 +43,7 @@ export const LinodeBackups = () => { const navigate = useNavigate(); const { isBareMetalInstance } = useLinodeDetailContext(); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', [ 'cancel_linode_backups', diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.test.tsx index 19d676bcbb3..d1f42a2d01e 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.test.tsx @@ -20,7 +20,7 @@ vi.mock('@tanstack/react-router', async () => { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { reboot_linode: false, update_linode: false, clone_linode: false, @@ -90,7 +90,7 @@ describe('ConfigActionMenu', () => { it('should enable all actions menu if the user has permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { reboot_linode: true, update_linode: true, clone_linode: true, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.tsx index 4b62dab5af1..f4d5cd222ed 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigActionMenu.tsx @@ -21,7 +21,7 @@ export const ConfigActionMenu = (props: Props) => { const [isOpen, setIsOpen] = React.useState(false); const navigate = useNavigate(); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['reboot_linode', 'update_linode', 'clone_linode', 'delete_linode'], linodeId, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.test.tsx index 98dc9d2937e..2c0602ee594 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.test.tsx @@ -13,7 +13,7 @@ const queryMocks = vi.hoisted(() => ({ useLinodeQuery: vi.fn().mockReturnValue({}), useParams: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode_config_profile: false, }, })), @@ -91,8 +91,8 @@ describe('LinodeConfigs', () => { it('should enable "Add Configuration" button if the user has permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, create_linode_config_profile: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.tsx index 9e0af4f5fed..2e33f98257f 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigs.tsx @@ -54,7 +54,7 @@ const LinodeConfigs = () => { const id = Number(linodeId); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['create_linode_config_profile'], id diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx index 919164ea467..90df3971da2 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx @@ -24,7 +24,7 @@ vi.mock('@tanstack/react-router', async () => { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { apply_linode_firewalls: false, delete_firewall_device: false, }, @@ -70,8 +70,8 @@ describe('LinodeFirewalls', () => { it("should enable 'Add Firewall' button if the user has apply_linode_firewalls permission", async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, apply_linode_firewalls: true, }, }); @@ -84,8 +84,8 @@ describe('LinodeFirewalls', () => { it("should disable 'Add Firewall' button if the user doesn't have apply_linode_firewalls permission", async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, apply_linode_firewalls: false, }, }); @@ -98,8 +98,8 @@ describe('LinodeFirewalls', () => { it("should enable 'Unassign' button if the user has delete_firewall_device permission", async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, delete_firewall_device: true, }, }); @@ -122,8 +122,8 @@ describe('LinodeFirewalls', () => { it("should disable 'Unassign' button if the user doesn't have delete_firewall_device permission", async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, delete_firewall_device: false, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.tsx index 1c24a23f591..6aed322306f 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.tsx @@ -27,7 +27,7 @@ interface LinodeFirewallsProps { export const LinodeFirewalls = (props: LinodeFirewallsProps) => { const { linodeID } = props; - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['apply_linode_firewalls'], linodeID, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewallsActionMenu.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewallsActionMenu.tsx index e6343676c62..7764bf93b6a 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewallsActionMenu.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewallsActionMenu.tsx @@ -16,7 +16,7 @@ export const LinodeFirewallsActionMenu = ( ) => { const { firewallID, onUnassign } = props; - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'firewall', ['delete_firewall_device'], firewallID, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.test.tsx index 56f43decd44..38d97d07b39 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.test.tsx @@ -10,7 +10,7 @@ const queryMocks = vi.hoisted(() => ({ useFlags: vi.fn().mockReturnValue({}), useParams: vi.fn().mockReturnValue({}), userPermissions: vi.fn(() => ({ - permissions: { + data: { update_linode: false, delete_linode: false, }, @@ -91,7 +91,7 @@ describe('LinodeSettings', () => { it('should enable all buttons if the user has update_linode and delete_linode permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_linode: true, delete_linode: true, }, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.tsx index ef25ae07927..f298ce2c9fd 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettings.tsx @@ -16,7 +16,7 @@ const LinodeSettings = () => { const { isVMHostMaintenanceEnabled } = useVMHostMaintenanceEnabled(); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['update_linode', 'delete_linode'], id diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.test.tsx index b09da16342e..17747de622a 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.test.tsx @@ -16,7 +16,7 @@ const mockPoweredOffLinode = linodeFactory.build({ status: 'offline' }); const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { password_reset_linode: false, }, })), @@ -72,7 +72,7 @@ describe('LinodeSettingsPasswordPanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { password_reset_linode: true, }, }); @@ -92,7 +92,7 @@ describe('LinodeSettingsPasswordPanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { password_reset_linode: false, }, }); @@ -120,7 +120,7 @@ describe('LinodeSettingsPasswordPanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { password_reset_linode: false, }, }); @@ -148,7 +148,7 @@ describe('LinodeSettingsPasswordPanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { password_reset_linode: true, }, }); @@ -172,7 +172,7 @@ describe('LinodeSettingsPasswordPanel', () => { }); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { password_reset_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.tsx index 83fe6dc8fcf..1557363a834 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsPasswordPanel.tsx @@ -28,7 +28,7 @@ export const LinodeSettingsPasswordPanel = (props: Props) => { const { linodeId } = props; const { data: linode } = useLinodeQuery(linodeId); - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['password_reset_linode'], linodeId diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.test.tsx index ee0f1a3a54c..8516ec3137c 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.test.tsx @@ -21,7 +21,7 @@ const queryMocks = vi.hoisted(() => ({ useNavigate: vi.fn(() => navigate), useParams: vi.fn(() => ({})), userPermissions: vi.fn(() => ({ - permissions: { + data: { update_linode: false, resize_linode: false, delete_linode: false, @@ -126,8 +126,8 @@ describe('LinodeDiskActionMenu', () => { it('Clone should redirect to clone page', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, clone_linode: true, }, }); @@ -197,7 +197,7 @@ describe('LinodeDiskActionMenu', () => { it('should disable all actions menu if the user does not have permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_linode: false, resize_linode: false, delete_linode: false, @@ -230,7 +230,7 @@ describe('LinodeDiskActionMenu', () => { it('should enable all actions menu if the user has permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_linode: true, resize_linode: true, delete_linode: true, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.tsx index e328a21e796..b41cee609e6 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDiskActionMenu.tsx @@ -31,7 +31,7 @@ export const LinodeDiskActionMenu = (props: Props) => { readOnly, } = props; - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', ['update_linode', 'resize_linode', 'delete_linode', 'clone_linode'], linodeId, diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx index 0c81d16470e..07eaff8c81a 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx @@ -28,7 +28,7 @@ vi.mock('@linode/queries', async () => { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode_disk: false, }, })), @@ -93,7 +93,7 @@ describe('LinodeDisks', () => { it('should enable "add a disk" button if the user has a create_linode_disk permissions and has free disk space', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode_disk: true, }, }); @@ -106,7 +106,7 @@ describe('LinodeDisks', () => { it('should disable the "Add a Disk" button when there is no free disk space', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode_disk: true, }, }); @@ -125,7 +125,7 @@ describe('LinodeDisks', () => { it('should enable the "Add a Disk" button when there is free disk space', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode_disk: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.tsx index 22f5aadd70f..6b95b6ee4e7 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.tsx @@ -43,7 +43,11 @@ export const LinodeDisks = () => { const { data: linode } = useLinodeQuery(id); const { data: grants } = useGrants(); - const { permissions } = usePermissions('linode', ['create_linode_disk'], id); + const { data: permissions } = usePermissions( + 'linode', + ['create_linode_disk'], + id + ); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = React.useState(false); const [isCreateDrawerOpen, setIsCreateDrawerOpen] = React.useState(false); diff --git a/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.test.tsx b/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.test.tsx index 1c3b5c2b35c..3c94974d57d 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.test.tsx @@ -28,7 +28,7 @@ const props: LinodeActionMenuProps = { const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { shutdown_linode: false, reboot_linode: false, clone_linode: false, @@ -207,7 +207,7 @@ describe('LinodeActionMenu', () => { it('should disable Action menu items if the user does not have required permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { shutdown_linode: false, reboot_linode: false, clone_linode: false, @@ -253,8 +253,8 @@ describe('LinodeActionMenu', () => { it('should enable "Reboot" button if the user has reboot_linode permissions', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { - ...queryMocks.userPermissions().permissions, + data: { + ...queryMocks.userPermissions().data, reboot_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.tsx b/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.tsx index 2e84236ca8b..cf753131bb3 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/LinodeActionMenu/LinodeActionMenu.tsx @@ -57,7 +57,7 @@ export const LinodeActionMenu = (props: LinodeActionMenuProps) => { const isBareMetalInstance = linodeType?.class === 'metal'; const hasHostMaintenance = linodeStatus === 'stopped'; - const { permissions } = usePermissions( + const { data: permissions } = usePermissions( 'linode', [ 'shutdown_linode', diff --git a/packages/manager/src/features/Linodes/LinodesLanding/LinodeRow/LinodeRow.test.tsx b/packages/manager/src/features/Linodes/LinodesLanding/LinodeRow/LinodeRow.test.tsx index de95777182a..d1c9937f99b 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/LinodeRow/LinodeRow.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/LinodeRow/LinodeRow.test.tsx @@ -8,7 +8,7 @@ import { LinodeRow, RenderFlag } from './LinodeRow'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: {}, + data: {}, })), })); diff --git a/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.test.tsx b/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.test.tsx index 65e1e3a98f1..846f33ae692 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.test.tsx @@ -6,7 +6,7 @@ import { LinodesLandingEmptyState } from './LinodesLandingEmptyState'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { create_linode: false, }, })), @@ -37,7 +37,7 @@ describe('LinodesLandingEmptyState', () => { it('should enable "Create Linode" button if the user has create_linode permission', () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { create_linode: true, }, }); diff --git a/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.tsx b/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.tsx index 9018eb8c2b8..26a6302e99a 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/LinodesLandingEmptyState.tsx @@ -26,7 +26,7 @@ const APPS_MORE_LINKS_TEXT = 'See all Marketplace apps'; export const LinodesLandingEmptyState = () => { const navigate = useNavigate(); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); return ( diff --git a/packages/manager/src/features/Linodes/index.tsx b/packages/manager/src/features/Linodes/index.tsx index 1a0ad2e0d8b..e03867f4750 100644 --- a/packages/manager/src/features/Linodes/index.tsx +++ b/packages/manager/src/features/Linodes/index.tsx @@ -46,7 +46,7 @@ export const LinodesLandingWrapper = React.memo(() => { flags.gecko2?.la ); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const [regionFilter, setRegionFilter] = React.useState( storage.regionFilter.get() ?? regionFilterOptions[0].value ); diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerCreate.test.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerCreate.test.tsx index 420f591658f..fdcfcdfacfc 100644 --- a/packages/manager/src/features/NodeBalancers/NodeBalancerCreate.test.tsx +++ b/packages/manager/src/features/NodeBalancers/NodeBalancerCreate.test.tsx @@ -29,7 +29,7 @@ vi.mock('src/hooks/useFlags', () => { vi.mock('src/features/IAM/hooks/usePermissions', () => ({ usePermissions: vi.fn(() => ({ - permissions: { create_firewall: true }, + data: { create_firewall: true }, })), })); diff --git a/packages/manager/src/features/PlacementGroups/PlacementGroupsDetailPanel.tsx b/packages/manager/src/features/PlacementGroups/PlacementGroupsDetailPanel.tsx index 17335f72318..a47b70b7746 100644 --- a/packages/manager/src/features/PlacementGroups/PlacementGroupsDetailPanel.tsx +++ b/packages/manager/src/features/PlacementGroups/PlacementGroupsDetailPanel.tsx @@ -53,7 +53,7 @@ export const PlacementGroupsDetailPanel = (props: Props) => { selectedRegion?.capabilities.includes('Placement Group') ); - const { permissions } = usePermissions('account', ['create_linode']); + const { data: permissions } = usePermissions('account', ['create_linode']); const handlePlacementGroupCreated = (placementGroup: PlacementGroup) => { handlePlacementGroupChange(placementGroup); diff --git a/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.test.tsx b/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.test.tsx index 8f6a9f197f8..8c3e0d1fe90 100644 --- a/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.test.tsx +++ b/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.test.tsx @@ -10,7 +10,7 @@ import { UsernameForm } from './UsernameForm'; const queryMocks = vi.hoisted(() => ({ userPermissions: vi.fn(() => ({ - permissions: { + data: { update_user: false, }, })), @@ -52,7 +52,7 @@ describe('UsernameForm', () => { it('disables the input if the user is a proxy user', async () => { queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_user: true, }, }); @@ -79,7 +79,7 @@ describe('UsernameForm', () => { server.use(http.get('*/v4/profile', () => HttpResponse.json(profile))); queryMocks.userPermissions.mockReturnValue({ - permissions: { + data: { update_user: true, }, }); diff --git a/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.tsx b/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.tsx index 1af0b383139..6ffa7bfce80 100644 --- a/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.tsx +++ b/packages/manager/src/features/Profile/DisplaySettings/UsernameForm.tsx @@ -22,7 +22,7 @@ export const UsernameForm = () => { const values = { username: profile?.username ?? '' }; - const { permissions } = usePermissions('account', ['update_user']); + const { data: permissions } = usePermissions('account', ['update_user']); const { control, From 3fed6238fac65c7b785a715f0df9c35661e61bed Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Mon, 4 Aug 2025 11:31:50 -0400 Subject: [PATCH 2/2] Changeset --- .../.changeset/pr-12617-upcoming-features-1754321494449.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-12617-upcoming-features-1754321494449.md diff --git a/packages/manager/.changeset/pr-12617-upcoming-features-1754321494449.md b/packages/manager/.changeset/pr-12617-upcoming-features-1754321494449.md new file mode 100644 index 00000000000..99fbc54749e --- /dev/null +++ b/packages/manager/.changeset/pr-12617-upcoming-features-1754321494449.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Update the usePermissions hook to return consistent with the other queries ([#12617](https://github.com/linode/manager/pull/12617))