Skip to content

Commit 9c4ac3e

Browse files
refactor(react): flatten sso-provider-table view props
1 parent ed1450d commit 9c4ac3e

4 files changed

Lines changed: 64 additions & 157 deletions

File tree

packages/react/src/components/auth0/my-organization/__tests__/sso-provider-table.test.tsx

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { SsoProviderTableView } from '@/components/auth0/my-organization/sso-pro
99
import * as useConfigModule from '@/hooks/my-organization/use-config';
1010
import * as useIdpConfigModule from '@/hooks/my-organization/use-idp-config';
1111
import * as useCoreClientModule from '@/hooks/shared/use-core-client';
12-
import { createMockSsoProviderTableHandler, createMockSsoProviderTableLogic } from '@/tests/utils';
12+
import { createMockSsoProviderTableViewProps } from '@/tests/utils';
1313
import { createMockUseConfig } from '@/tests/utils/__mocks__/my-organization/config/config.mocks';
1414
import { createMockIdentityProvider } from '@/tests/utils/__mocks__/my-organization/domain-management/domain.mocks';
1515
import { createMockUseIdpConfig } from '@/tests/utils/__mocks__/my-organization/idp-management/idp-config.mocks';
@@ -864,49 +864,41 @@ describe('SsoProviderTable', () => {
864864
});
865865

866866
describe('SsoProviderTableView', () => {
867-
const logic = createMockSsoProviderTableLogic();
868-
const handlers = createMockSsoProviderTableHandler();
867+
const viewProps = createMockSsoProviderTableViewProps();
869868

870869
it('renders the table and header', () => {
871-
renderWithProviders(<SsoProviderTableView logic={logic} handlers={handlers} />);
870+
renderWithProviders(<SsoProviderTableView {...viewProps} />);
872871
expect(screen.getByRole('table')).toBeInTheDocument();
873872
expect(screen.getByRole('banner')).toBeInTheDocument();
874873
});
875874

876875
it('renders empty state when data is empty', () => {
877-
renderWithProviders(
878-
<SsoProviderTableView logic={{ ...logic, data: [] }} handlers={handlers} />,
879-
);
876+
renderWithProviders(<SsoProviderTableView {...viewProps} providers={[]} />);
880877
expect(screen.getByText(/empty/i)).toBeInTheDocument();
881878
});
882879

883880
it('disables create button when readOnly is true', () => {
884-
renderWithProviders(
885-
<SsoProviderTableView logic={{ ...logic, readOnly: true }} handlers={handlers} />,
886-
);
881+
renderWithProviders(<SsoProviderTableView {...viewProps} readOnly={true} />);
887882
const createButton = screen.getByRole('button', { name: /create/i });
888883
expect(createButton).toBeDisabled();
889884
});
890885

891-
it('renders loading state when isLoading is true', () => {
892-
renderWithProviders(
893-
<SsoProviderTableView logic={{ ...logic, isLoading: true }} handlers={handlers} />,
894-
);
895-
expect(screen.getByRole('table')).toBeInTheDocument();
896-
// Optionally check for a loading indicator if present in your DataTable
886+
it('renders loading state when isViewLoading is true', () => {
887+
renderWithProviders(<SsoProviderTableView {...viewProps} isViewLoading={true} />);
888+
expect(screen.getByText(/loading/i)).toBeInTheDocument();
897889
});
898890

899891
it('renders custom header class if provided', () => {
900892
renderWithProviders(
901893
<SsoProviderTableView
902-
logic={{
903-
...logic,
904-
styling: {
905-
...logic.styling,
906-
classes: { ...logic?.styling?.classes, 'SsoProviderTable-header': 'custom-header' },
894+
{...viewProps}
895+
styling={{
896+
...viewProps.styling,
897+
classes: {
898+
...viewProps?.styling?.classes,
899+
'SsoProviderTable-header': 'custom-header',
907900
},
908901
}}
909-
handlers={handlers}
910902
/>,
911903
);
912904
expect(document.querySelector('.custom-header')).toBeInTheDocument();
@@ -915,14 +907,11 @@ describe('SsoProviderTableView', () => {
915907
it('renders custom table class if provided', () => {
916908
renderWithProviders(
917909
<SsoProviderTableView
918-
logic={{
919-
...logic,
920-
styling: {
921-
...logic.styling,
922-
classes: { ...logic?.styling?.classes, 'SsoProviderTable-table': 'custom-table' },
923-
},
910+
{...viewProps}
911+
styling={{
912+
...viewProps.styling,
913+
classes: { ...viewProps?.styling?.classes, 'SsoProviderTable-table': 'custom-table' },
924914
}}
925-
handlers={handlers}
926915
/>,
927916
);
928917
expect(document.querySelector('.custom-table')).toBeInTheDocument();

packages/react/src/components/auth0/my-organization/sso-provider-table.tsx

Lines changed: 37 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import { useTheme } from '@/hooks/shared/use-theme';
2020
import { useTranslator } from '@/hooks/shared/use-translator';
2121
import type {
2222
SsoProviderTableProps,
23-
SsoProviderTableLogicProps,
24-
SsoProviderTableHandlerProps,
2523
SsoProviderTableViewProps,
2624
} from '@/types/my-organization/idp-management/sso-provider/sso-provider-table-types';
2725

@@ -51,7 +49,7 @@ function SsoProviderTable(props: SsoProviderTableProps) {
5149
enableProviderAction,
5250
} = props;
5351

54-
const table = useSsoProviderTable({
52+
const providerTable = useSsoProviderTable({
5553
readOnly,
5654
customMessages,
5755
createAction,
@@ -61,46 +59,15 @@ function SsoProviderTable(props: SsoProviderTableProps) {
6159
enableProviderAction,
6260
});
6361

64-
const ssoProviderCreateLogicProps: SsoProviderTableLogicProps = {
65-
data: table.providers,
66-
styling,
67-
customMessages,
68-
readOnly,
69-
createAction,
70-
editAction,
71-
organization: table.organization,
72-
isUpdating: table.isUpdating,
73-
isUpdatingId: table.isUpdatingId,
74-
isDeleting: table.isDeleting,
75-
isRemoving: table.isRemoving,
76-
hideHeader: false,
77-
isLoading: table.isViewLoading,
78-
shouldHideCreate: table.shouldHideCreate,
79-
isViewLoading: table.isViewLoading,
80-
selectedIdp: table.selectedIdp,
81-
showDeleteModal: table.showDeleteModal,
82-
showRemoveModal: table.showRemoveModal,
83-
shouldAllowDeletion: table.shouldAllowDeletion,
84-
};
85-
86-
const ssoProviderCreateHandlerProps: SsoProviderTableHandlerProps = {
87-
handleCreate: table.handleCreate,
88-
handleEdit: table.handleEdit,
89-
handleDelete: table.handleDelete,
90-
handleDeleteFromOrganization: table.handleDeleteFromOrganization,
91-
handleToggleEnabled: table.handleToggleEnabled,
92-
handleDeleteConfirm: table.handleDeleteConfirm,
93-
handleRemoveConfirm: table.handleRemoveConfirm,
94-
setShowDeleteModal: table.setShowDeleteModal,
95-
setShowRemoveModal: table.setShowRemoveModal,
96-
setSelectedIdp: table.setSelectedIdp,
97-
};
98-
9962
return (
100-
<GateKeeper isLoading={table.isLoading} styling={styling}>
63+
<GateKeeper isLoading={providerTable.isLoading} styling={styling}>
10164
<SsoProviderTableView
102-
logic={ssoProviderCreateLogicProps}
103-
handlers={ssoProviderCreateHandlerProps}
65+
{...providerTable}
66+
styling={styling}
67+
customMessages={customMessages}
68+
readOnly={readOnly}
69+
createAction={createAction}
70+
editAction={editAction}
10471
/>
10572
</GateKeeper>
10673
);
@@ -109,44 +76,37 @@ function SsoProviderTable(props: SsoProviderTableProps) {
10976
/**
11077
* Internal SSO provider table view component
11178
* @param props - Component props
112-
* @param props.logic - Component logic props
113-
* @param props.handlers - Component handler props
11479
* @internal
11580
* @returns JSX element
11681
*/
117-
function SsoProviderTableView({ logic, handlers }: SsoProviderTableViewProps) {
118-
const {
119-
styling,
120-
customMessages,
121-
readOnly,
122-
data,
123-
shouldHideCreate,
124-
isViewLoading,
125-
createAction,
126-
editAction,
127-
selectedIdp,
128-
showDeleteModal,
129-
showRemoveModal,
130-
shouldAllowDeletion,
131-
organization,
132-
isUpdating,
133-
isUpdatingId,
134-
isDeleting,
135-
isRemoving,
136-
} = logic;
137-
138-
const {
139-
handleCreate,
140-
handleEdit,
141-
handleDelete,
142-
handleDeleteFromOrganization,
143-
handleToggleEnabled,
144-
handleDeleteConfirm,
145-
handleRemoveConfirm,
146-
setShowDeleteModal,
147-
setShowRemoveModal,
148-
} = handlers;
149-
82+
function SsoProviderTableView({
83+
styling,
84+
customMessages,
85+
readOnly,
86+
providers,
87+
shouldHideCreate,
88+
isViewLoading,
89+
createAction,
90+
editAction,
91+
selectedIdp,
92+
showDeleteModal,
93+
showRemoveModal,
94+
shouldAllowDeletion,
95+
organization,
96+
isUpdating,
97+
isUpdatingId,
98+
isDeleting,
99+
isRemoving,
100+
handleCreate,
101+
handleEdit,
102+
handleDelete,
103+
handleDeleteFromOrganization,
104+
handleToggleEnabled,
105+
handleDeleteConfirm,
106+
handleRemoveConfirm,
107+
setShowDeleteModal,
108+
setShowRemoveModal,
109+
}: SsoProviderTableViewProps) {
150110
const { isDarkMode } = useTheme();
151111
const { t } = useTranslator('idp_management.sso_provider_table', customMessages);
152112
const currentStyles = React.useMemo(
@@ -234,7 +194,7 @@ function SsoProviderTableView({ logic, handlers }: SsoProviderTableViewProps) {
234194
<DataTable
235195
loading={isViewLoading}
236196
columns={columns}
237-
data={data}
197+
data={providers}
238198
emptyState={{ title: t('table.empty_message') }}
239199
className={currentStyles.classes?.['SsoProviderTable-table']}
240200
/>
Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
import { vi } from 'vitest';
22

3-
import type {
4-
SsoProviderTableHandlerProps,
5-
SsoProviderTableLogicProps,
6-
} from '@/types/my-organization/idp-management/sso-provider/sso-provider-table-types';
3+
import type { SsoProviderTableViewProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-table-types';
74

8-
export function createMockSsoProviderTableLogic(
9-
overrides: Partial<SsoProviderTableLogicProps> = {},
10-
): SsoProviderTableLogicProps {
5+
export function createMockSsoProviderTableViewProps(
6+
overrides: Partial<SsoProviderTableViewProps> = {},
7+
): SsoProviderTableViewProps {
118
return {
12-
data: [],
13-
isLoading: false,
9+
providers: [],
1410
styling: { variables: { common: {}, light: {}, dark: {} }, classes: {} },
1511
customMessages: {},
16-
hideHeader: false,
1712
readOnly: false,
13+
isLoading: false,
1814
shouldHideCreate: false,
1915
isViewLoading: false,
2016
selectedIdp: null,
@@ -36,14 +32,6 @@ export function createMockSsoProviderTableLogic(
3632
onAfter: vi.fn(),
3733
onBefore: vi.fn(),
3834
},
39-
...overrides,
40-
};
41-
}
42-
43-
export function createMockSsoProviderTableHandler(
44-
overrides: Partial<SsoProviderTableHandlerProps> = {},
45-
): SsoProviderTableHandlerProps {
46-
return {
4735
handleCreate: vi.fn(),
4836
handleEdit: vi.fn(),
4937
handleDelete: vi.fn(),
@@ -54,6 +42,8 @@ export function createMockSsoProviderTableHandler(
5442
setShowDeleteModal: vi.fn(),
5543
setShowRemoveModal: vi.fn(),
5644
setSelectedIdp: vi.fn(),
45+
fetchProviders: vi.fn(async () => undefined),
46+
fetchOrganizationDetails: vi.fn(async () => null),
5747
...overrides,
5848
};
5949
}

packages/react/src/types/my-organization/idp-management/sso-provider/sso-provider-table-types.ts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -130,42 +130,10 @@ export interface SsoProviderTableActionsColumnProps
130130
onDelete: (provider: IdentityProvider) => void;
131131
onRemoveFromOrganization: (provider: IdentityProvider) => void;
132132
}
133-
export interface SsoProviderTableLogicProps {
134-
data: IdentityProvider[];
135-
isLoading: boolean;
133+
export interface SsoProviderTableViewProps extends UseSsoProviderTableReturn {
136134
styling: SsoProviderTableProps['styling'];
137135
customMessages: SsoProviderTableProps['customMessages'];
138-
hideHeader: boolean;
139136
readOnly: boolean;
140-
shouldHideCreate: boolean;
141-
isViewLoading: boolean;
142137
createAction: SsoProviderTableProps['createAction'];
143138
editAction: SsoProviderTableProps['editAction'];
144-
selectedIdp: IdentityProvider | null;
145-
showDeleteModal: boolean;
146-
showRemoveModal: boolean;
147-
organization: OrganizationPrivate | null;
148-
isUpdating: boolean;
149-
isUpdatingId: string | null;
150-
isDeleting: boolean;
151-
isRemoving: boolean;
152-
shouldAllowDeletion: boolean;
153139
}
154-
155-
export interface SsoProviderTableHandlerProps {
156-
handleCreate: () => void;
157-
handleEdit: (idp: IdentityProvider) => void;
158-
handleDelete: (idp: IdentityProvider) => void;
159-
handleDeleteFromOrganization: (idp: IdentityProvider) => void;
160-
handleToggleEnabled: (idp: IdentityProvider, enabled: boolean) => void;
161-
handleDeleteConfirm: (provider: IdentityProvider) => Promise<void>;
162-
handleRemoveConfirm: (provider: IdentityProvider) => Promise<void>;
163-
setShowDeleteModal: React.Dispatch<React.SetStateAction<boolean>>;
164-
setShowRemoveModal: React.Dispatch<React.SetStateAction<boolean>>;
165-
setSelectedIdp: React.Dispatch<React.SetStateAction<IdentityProvider | null>>;
166-
}
167-
168-
export type SsoProviderTableViewProps = {
169-
logic: SsoProviderTableLogicProps;
170-
handlers: SsoProviderTableHandlerProps;
171-
};

0 commit comments

Comments
 (0)