Skip to content

Commit 9ac8b04

Browse files
bsunderhusling1726layershifter
authored
chore(react-utilities): Deletes descendants API (#19189)
* Simplifies descendants API * Updates accordion descendants * Change files * Update API * Update packages/react-accordion/src/components/Accordion/Accordion.types.ts Co-authored-by: ling1726 <lingfangao@hotmail.com> * Update packages/react-utilities/src/descendants/descendants.ts Co-authored-by: ling1726 <lingfangao@hotmail.com> * Updates forceUpdate & comments * Updates API * Updates API * Makes support for concurrent mode * Updates API * Updates API * Deletes descendants API * Updates vr-tests * Update packages/react-utilities/src/hooks/useForceUpdate.ts Co-authored-by: Oleksandr Fediashov <alexander.mcgarret@gmail.com> * Updates Spec * Updates API Co-authored-by: ling1726 <lingfangao@hotmail.com> Co-authored-by: Oleksandr Fediashov <alexander.mcgarret@gmail.com>
1 parent 4935a7f commit 9ac8b04

28 files changed

+235
-851
lines changed

apps/vr-tests/src/stories/Accordion.stories.tsx

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ storiesOf('Accordion', module)
2929
))
3030
.addDecorator(FluentProviderDecorator)
3131
.addStory('visibility+focus', () => (
32-
<Accordion index={[0]}>
33-
<AccordionItem>
32+
<Accordion openItems={[0]}>
33+
<AccordionItem value={0}>
3434
<AccordionHeader button={{ id: 'opened-btn' }}>Opened</AccordionHeader>
3535
<AccordionPanel>Opened Panel</AccordionPanel>
3636
</AccordionItem>
37-
<AccordionItem>
37+
<AccordionItem value={1}>
3838
<AccordionHeader button={{ id: 'closed-btn' }}>Closed</AccordionHeader>
3939
<AccordionPanel>Closed Panel</AccordionPanel>
4040
</AccordionItem>
@@ -51,52 +51,52 @@ storiesOf('Accordion', module)
5151
))
5252
.addDecorator(FluentProviderDecorator)
5353
.addStory('size', () => (
54-
<Accordion index={[0, 1, 2, 3]}>
55-
<AccordionItem>
54+
<Accordion openItems={[0, 1, 2, 3]}>
55+
<AccordionItem value={0}>
5656
<AccordionHeader size="small">Small</AccordionHeader>
5757
<AccordionPanel>Small Panel</AccordionPanel>
5858
</AccordionItem>
59-
<AccordionItem>
59+
<AccordionItem value={1}>
6060
<AccordionHeader size="medium">Medium</AccordionHeader>
6161
<AccordionPanel>Medium Panel</AccordionPanel>
6262
</AccordionItem>
63-
<AccordionItem>
63+
<AccordionItem value={2}>
6464
<AccordionHeader size="large">Large</AccordionHeader>
6565
<AccordionPanel>Large Panel</AccordionPanel>
6666
</AccordionItem>
67-
<AccordionItem>
67+
<AccordionItem value={3}>
6868
<AccordionHeader size="extra-large">Extra Large</AccordionHeader>
6969
<AccordionPanel>Extra Large Panel</AccordionPanel>
7070
</AccordionItem>
7171
</Accordion>
7272
))
7373
.addStory('expandIconPosition="end"', () => (
74-
<Accordion index={[0]}>
75-
<AccordionItem>
74+
<Accordion openItems={[0]}>
75+
<AccordionItem value={0}>
7676
<AccordionHeader expandIconPosition="end">Opened</AccordionHeader>
7777
<AccordionPanel>Visible Panel</AccordionPanel>
7878
</AccordionItem>
79-
<AccordionItem>
79+
<AccordionItem value={1}>
8080
<AccordionHeader expandIconPosition="end">Closed</AccordionHeader>
8181
<AccordionPanel>Hidden Panel</AccordionPanel>
8282
</AccordionItem>
8383
</Accordion>
8484
))
8585
.addStory('expandIcon="<Icon/>"', () => (
86-
<Accordion index={[]}>
87-
<AccordionItem>
86+
<Accordion openItems={[]}>
87+
<AccordionItem value={0}>
8888
<AccordionHeader expandIcon={<CircleRingIcon />} expandIconPosition="start">
8989
Expand Icon Start
9090
</AccordionHeader>
9191
<AccordionPanel>Expand Icon Start Panel</AccordionPanel>
9292
</AccordionItem>
93-
<AccordionItem>
93+
<AccordionItem value={1}>
9494
<AccordionHeader expandIcon={<CircleRingIcon />} expandIconPosition="end">
9595
Expand Icon End
9696
</AccordionHeader>
9797
<AccordionPanel>Expand Icon End Panel</AccordionPanel>
9898
</AccordionItem>
99-
<AccordionItem>
99+
<AccordionItem value={2}>
100100
<AccordionHeader inline expandIcon={<CircleRingIcon />} expandIconPosition="end">
101101
Expand Icon Inline End
102102
</AccordionHeader>
@@ -105,20 +105,20 @@ storiesOf('Accordion', module)
105105
</Accordion>
106106
))
107107
.addStory('icon="<Icon/>"', () => (
108-
<Accordion index={[]}>
109-
<AccordionItem>
108+
<Accordion openItems={[]}>
109+
<AccordionItem value={0}>
110110
<AccordionHeader icon={<CircleRingIcon />} expandIconPosition="start">
111111
Icon Start
112112
</AccordionHeader>
113113
<AccordionPanel>Icon Start Panel</AccordionPanel>
114114
</AccordionItem>
115-
<AccordionItem>
115+
<AccordionItem value={1}>
116116
<AccordionHeader icon={<CircleRingIcon />} expandIconPosition="end">
117117
Icon End
118118
</AccordionHeader>
119119
<AccordionPanel>Icon End Panel</AccordionPanel>
120120
</AccordionItem>
121-
<AccordionItem>
121+
<AccordionItem value={2}>
122122
<AccordionHeader inline icon={<CircleRingIcon />} expandIconPosition="end">
123123
Icon Inline End
124124
</AccordionHeader>
@@ -127,16 +127,16 @@ storiesOf('Accordion', module)
127127
</Accordion>
128128
))
129129
.addStory('disabled', () => (
130-
<Accordion index={[]}>
131-
<AccordionItem disabled>
130+
<Accordion openItems={[]}>
131+
<AccordionItem value={0} disabled>
132132
<AccordionHeader>Disabled Item Opened</AccordionHeader>
133133
<AccordionPanel>Disabled Item Opened Panel</AccordionPanel>
134134
</AccordionItem>
135-
<AccordionItem disabled>
135+
<AccordionItem value={1} disabled>
136136
<AccordionHeader>Disabled Item Closed</AccordionHeader>
137137
<AccordionPanel>Disabled Item Closed Panel</AccordionPanel>
138138
</AccordionItem>
139-
<AccordionItem disabled>
139+
<AccordionItem value={2} disabled>
140140
<AccordionHeader inline>Disabled Item ClosedInline</AccordionHeader>
141141
<AccordionPanel>Disabled Item ClosedInline Panel</AccordionPanel>
142142
</AccordionItem>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Removes descendants API in favor of explicit values",
4+
"packageName": "@fluentui/react-accordion",
5+
"email": "bsunderhus@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Deletes descendants API",
4+
"packageName": "@fluentui/react-utilities",
5+
"email": "bsunderhus@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

packages/react-accordion/Spec.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ export interface AccordionProps extends ComponentProps, React.HTMLAttributes<HTM
4848
*/
4949
collapsible?: boolean;
5050
/**
51-
* Index indicating the panels that are opened
51+
* value indicating the items that are opened
5252
* If used, the component will be in controlled mode
5353
*/
54-
index?: number | number[];
54+
openItems?: AccordionItemValue | AccordionItemValue[];
5555
/**
5656
* Index indicating the panels that are opened
5757
*/
58-
defaultIndex?: number | number[];
58+
defaultOpenItems?: AccordionItemValue | AccordionItemValue[];
5959
/**
6060
* Size of spacing in the heading
6161
*/
@@ -80,7 +80,7 @@ export interface AccordionProps extends ComponentProps, React.HTMLAttributes<HTM
8080
* Indicates if the AccordionHeader should be inline-block
8181
*/
8282
inline?: boolean;
83-
onToggle?(index: number): void;
83+
onToggle?(event: AccordionToggleEvent, data: AccordionToggleData): void;
8484
}
8585
```
8686

@@ -94,6 +94,10 @@ export interface AccordionItemProps extends ComponentProps, React.HTMLAttributes
9494
* Disables opening/closing of panel inside the item
9595
*/
9696
disabled?: boolean;
97+
/**
98+
* required value that identifies this item inside an Accordion component
99+
*/
100+
value: AccordionItemValue;
97101
}
98102
```
99103

packages/react-accordion/etc/react-accordion.api.md

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import { ARIAButtonProps } from '@fluentui/react-aria';
88
import { ComponentProps } from '@fluentui/react-utilities';
99
import { ComponentState } from '@fluentui/react-utilities';
1010
import { Context } from '@fluentui/react-context-selector';
11-
import { Descendant } from '@fluentui/react-utilities';
12-
import { DescendantContextValue } from '@fluentui/react-utilities';
1311
import * as React_2 from 'react';
1412

1513
// @public
@@ -29,18 +27,10 @@ export const AccordionContext: Context<AccordionContextValue>;
2927
export interface AccordionContextValue {
3028
// (undocumented)
3129
navigable: boolean;
32-
openItems: number[];
30+
openItems: AccordionItemValue[];
3331
requestToggle: AccordionToggleEventHandler;
3432
}
3533

36-
// @public (undocumented)
37-
export interface AccordionDescendant<ElementType = HTMLElement> extends Descendant<ElementType> {
38-
disabled: boolean;
39-
}
40-
41-
// @public (undocumented)
42-
export const AccordionDescendantContext: React_2.Context<DescendantContextValue<AccordionDescendant<HTMLElement>>>;
43-
4434
// @public
4535
export const AccordionHeader: React_2.FunctionComponent<AccordionHeaderProps & React_2.RefAttributes<HTMLElement>>;
4636

@@ -95,9 +85,6 @@ export interface AccordionHeaderState extends ComponentState<AccordionHeaderSlot
9585
ref: React_2.Ref<HTMLElement>;
9686
}
9787

98-
// @public (undocumented)
99-
export type AccordionIndex = number | number[];
100-
10188
// @public
10289
export const AccordionItem: React_2.ForwardRefExoticComponent<AccordionItemProps & React_2.RefAttributes<HTMLElement>>;
10390

@@ -119,17 +106,9 @@ export interface AccordionItemContextValue {
119106
open: boolean;
120107
}
121108

122-
// @public (undocumented)
123-
export interface AccordionItemDescendant<ElementType = HTMLElement> extends Descendant<ElementType> {
124-
// (undocumented)
125-
id: string;
126-
}
127-
128-
// @public (undocumented)
129-
export const accordionItemDescendantContext: React_2.Context<DescendantContextValue<AccordionItemDescendant<HTMLElement>>>;
130-
131109
// @public (undocumented)
132110
export interface AccordionItemProps extends ComponentProps<AccordionItemSlots>, Partial<AccordionItemCommons> {
111+
value: AccordionItemValue;
133112
}
134113

135114
// @public
@@ -140,11 +119,12 @@ export type AccordionItemSlots = {};
140119

141120
// @public (undocumented)
142121
export interface AccordionItemState extends ComponentState<AccordionItemSlots>, AccordionItemCommons, AccordionItemContextValue {
143-
descendants: AccordionItemDescendant[];
144122
ref: React_2.Ref<HTMLElement>;
145-
setDescendants: React_2.Dispatch<React_2.SetStateAction<AccordionItemDescendant[]>>;
146123
}
147124

125+
// @public (undocumented)
126+
export type AccordionItemValue = unknown;
127+
148128
// @public
149129
export const AccordionPanel: React_2.ForwardRefExoticComponent<AccordionPanelProps & React_2.RefAttributes<HTMLElement>>;
150130

@@ -166,26 +146,24 @@ export interface AccordionPanelState extends ComponentState<AccordionPanelSlots>
166146

167147
// @public (undocumented)
168148
export interface AccordionProps extends ComponentProps<AccordionSlots>, Partial<AccordionCommons> {
169-
defaultIndex?: AccordionIndex;
170-
index?: AccordionIndex;
149+
defaultOpenItems?: AccordionItemValue | AccordionItemValue[];
171150
// (undocumented)
172151
onToggle?: AccordionToggleEventHandler;
152+
openItems?: AccordionItemValue | AccordionItemValue[];
173153
}
174154

175155
// @public (undocumented)
176156
export type AccordionSlots = {};
177157

178158
// @public (undocumented)
179159
export interface AccordionState extends ComponentState<AccordionSlots>, AccordionCommons, AccordionContextValue {
180-
descendants: AccordionDescendant[];
181160
ref: React_2.Ref<HTMLElement>;
182-
setDescendants: React_2.Dispatch<React_2.SetStateAction<AccordionDescendant[]>>;
183161
}
184162

185163
// @public (undocumented)
186164
export interface AccordionToggleData {
187165
// (undocumented)
188-
index: number;
166+
value: AccordionItemValue;
189167
}
190168

191169
// @public (undocumented)
@@ -194,9 +172,6 @@ export type AccordionToggleEvent<E = HTMLElement> = React_2.MouseEvent<E> | Reac
194172
// @public (undocumented)
195173
export type AccordionToggleEventHandler = (event: AccordionToggleEvent, data: AccordionToggleData) => void;
196174

197-
// @public (undocumented)
198-
export function createAccordionContextValue({ navigable, openItems, requestToggle, }: AccordionState): AccordionContextValue;
199-
200175
// @public
201176
export const renderAccordion: (state: AccordionState) => JSX.Element;
202177

@@ -210,10 +185,14 @@ export const renderAccordionItem: (state: AccordionItemState) => JSX.Element;
210185
export const renderAccordionPanel: (state: AccordionPanelState) => JSX.Element | null;
211186

212187
// @public (undocumented)
213-
export const useAccordion: ({ index, defaultIndex, multiple, collapsible, onToggle, navigable, ...rest }: AccordionProps, ref: React_2.Ref<HTMLElement>) => AccordionState;
188+
export const useAccordion: ({ openItems: controlledOpenItems, defaultOpenItems, multiple, collapsible, onToggle, navigable, ...rest }: AccordionProps, ref: React_2.Ref<HTMLElement>) => AccordionState;
214189

215-
// @public
216-
export function useAccordionDescendant(accordionDescendant: Omit<AccordionDescendant, 'index'>): number;
190+
// @public (undocumented)
191+
export function useAccordionContextValue({ navigable, openItems, requestToggle }: AccordionState): {
192+
readonly navigable: boolean;
193+
readonly openItems: unknown[];
194+
readonly requestToggle: AccordionToggleEventHandler;
195+
};
217196

218197
// @public
219198
export const useAccordionHeader: (props: AccordionHeaderProps, ref: React_2.Ref<HTMLElement>) => AccordionHeaderState;
@@ -222,24 +201,20 @@ export const useAccordionHeader: (props: AccordionHeaderProps, ref: React_2.Ref<
222201
export const useAccordionHeaderStyles: (state: AccordionHeaderState) => AccordionHeaderState;
223202

224203
// @public
225-
export const useAccordionItem: (props: AccordionItemProps, ref: React_2.Ref<HTMLElement>) => AccordionItemState;
204+
export const useAccordionItem: ({ value, ...props }: AccordionItemProps, ref: React_2.Ref<HTMLElement>) => AccordionItemState;
226205

227206
// @public (undocumented)
228207
export const useAccordionItemContext: () => AccordionItemContextValue;
229208

230209
// @public (undocumented)
231210
export const useAccordionItemContextValue: ({ disabled, onHeaderClick, open }: AccordionItemState) => AccordionItemContextValue;
232211

233-
// @public
234-
export function useAccordionItemDescendant(accordionDescendant: Omit<AccordionItemDescendant, 'index'>, index?: number): number;
235-
236212
// @public
237213
export const useAccordionPanel: (props: AccordionPanelProps, ref: React_2.Ref<HTMLElement>) => AccordionPanelState;
238214

239215
// @public
240216
export const useAccordionPanelStyles: (state: AccordionPanelState) => AccordionPanelState;
241217

242-
243218
// (No @packageDocumentation comment for this package)
244219

245220
```

0 commit comments

Comments
 (0)