Skip to content

Commit

Permalink
chore(react-combobox): rollback export of internal hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
bsunderhus committed Feb 28, 2024
1 parent a64d8f6 commit 3bcd7da
Show file tree
Hide file tree
Showing 13 changed files with 1,103 additions and 38 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "chore: rollback export of internal hooks",
"packageName": "@fluentui/react-combobox",
"email": "bernardo.sunderhus@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@
/// <reference types="react" />

import type { ActiveDescendantContextValue } from '@fluentui/react-aria';
import { ActiveDescendantImperativeRef } from '@fluentui/react-aria';
import type { ActiveDescendantImperativeRef } from '@fluentui/react-aria';
import type { ComponentProps } from '@fluentui/react-utilities';
import type { ComponentState } from '@fluentui/react-utilities';
import { ContextSelector } from '@fluentui/react-context-selector';
import type { ExtractSlotProps } from '@fluentui/react-utilities';
import { FC } from 'react';
import type { ForwardRefComponent } from '@fluentui/react-utilities';
import { PortalProps } from '@fluentui/react-portal';
Expand All @@ -21,25 +20,10 @@ import { ProviderProps } from 'react';
import * as React_2 from 'react';
import type { Slot } from '@fluentui/react-utilities';
import { SlotClassNames } from '@fluentui/react-utilities';
import type { SlotComponentType } from '@fluentui/react-utilities';

// @public
export const Combobox: ForwardRefComponent<ComboboxProps>;

// @public
export type ComboboxBaseState = Required<Pick<ComboboxBaseProps, 'appearance' | 'open' | 'clearable' | 'inlinePopup' | 'size'>> & Pick<ComboboxBaseProps, 'mountNode' | 'placeholder' | 'value' | 'multiselect'> & OptionCollectionState & SelectionState & {
activeOption?: OptionValue;
focusVisible: boolean;
ignoreNextBlur: React_2.MutableRefObject<boolean>;
setActiveOption: React_2.Dispatch<React_2.SetStateAction<OptionValue | undefined>>;
setFocusVisible(focusVisible: boolean): void;
hasFocus: boolean;
setHasFocus(hasFocus: boolean): void;
setOpen(event: ComboboxBaseOpenEvents, newState: boolean): void;
setValue(newValue: string | undefined): void;
onOptionClick: (e: React_2.MouseEvent<HTMLElement>) => void;
};

// @public (undocumented)
export const comboboxClassNames: SlotClassNames<ComboboxSlots>;

Expand Down Expand Up @@ -229,19 +213,9 @@ export const renderOptionGroup_unstable: (state: OptionGroupState) => JSX.Elemen
// @public (undocumented)
export type SelectionEvents = React_2.ChangeEvent<HTMLElement> | React_2.KeyboardEvent<HTMLElement> | React_2.MouseEvent<HTMLElement>;

// @internal
export function useButtonTriggerSlot(triggerFromProps: NonNullable<Slot<'button'>>, ref: React_2.Ref<HTMLButtonElement>, options: UseButtonTriggerSlotOptions): SlotComponentType<ExtractSlotProps<Slot<'button'>>>;

// @public
export const useCombobox_unstable: (props: ComboboxProps, ref: React_2.Ref<HTMLInputElement>) => ComboboxState;

// @internal
export const useComboboxBaseState: (props: ComboboxBaseProps & {
children?: React_2.ReactNode;
editable?: boolean;
activeDescendantController: ActiveDescendantImperativeRef;
}) => ComboboxBaseState;

// @public (undocumented)
export function useComboboxContextValues(state: ComboboxBaseState & Pick<ComboboxState, 'activeDescendantController'>): ComboboxBaseContextValues;

Expand All @@ -260,9 +234,6 @@ export const useDropdown_unstable: (props: DropdownProps, ref: React_2.Ref<HTMLB
// @public
export const useDropdownStyles_unstable: (state: DropdownState) => DropdownState;

// @internal
export function useInputTriggerSlot(triggerFromProps: NonNullable<Slot<'input'>>, ref: React_2.Ref<HTMLInputElement>, options: UseInputTriggerSlotOptions): SlotComponentType<ExtractSlotProps<Slot<'input'>>>;

// @public
export const useListbox_unstable: (props: ListboxProps, ref: React_2.Ref<HTMLElement>) => ListboxState;

Expand All @@ -272,9 +243,6 @@ export const useListboxContext_unstable: <T>(selector: ContextSelector<ListboxCo
// @public (undocumented)
export function useListboxContextValues(state: ListboxState): ListboxContextValues;

// @internal (undocumented)
export function useListboxSlot(listboxSlotFromProp: Slot<typeof Listbox> | undefined, ref: React_2.Ref<HTMLDivElement>, options: UseListboxSlotOptions): SlotComponentType<ExtractSlotProps<Slot<typeof Listbox>>> | undefined;

// @public
export const useListboxStyles_unstable: (state: ListboxState) => ListboxState;

Expand Down
5 changes: 0 additions & 5 deletions packages/react-components/react-combobox/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,3 @@ export type { OptionGroupProps, OptionGroupSlots, OptionGroupState } from './Opt
export type { OptionOnSelectData, SelectionEvents } from './Selection';

export { useComboboxFilter } from './hooks/useComboboxFilter';
export { useComboboxBaseState } from './utils/useComboboxBaseState';
export type { ComboboxBaseState } from './utils/ComboboxBase.types';
export { useListboxSlot } from './utils/useListboxSlot';
export { useInputTriggerSlot } from './components/Combobox/useInputTriggerSlot';
export { useButtonTriggerSlot } from './components/Dropdown/useButtonTriggerSlot';
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
"@fluentui/react-shared-contexts": "^9.14.1",
"@fluentui/react-theme": "^9.1.16",
"@fluentui/react-utilities": "^9.18.2",
"@fluentui/react-portal": "^9.4.15",
"@fluentui/react-aria": "^9.9.1",
"@fluentui/react-combobox": "^9.9.0",
"@fluentui/keyboard-keys": "^9.0.7",
"@fluentui/react-tabster": "^9.19.2",
"@griffel/react": "^1.5.14",
"@swc/helpers": "^0.5.1"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
import * as React from 'react';
import type { ActiveDescendantContextValue } from '@fluentui/react-aria';
import type { PositioningShorthand } from '@fluentui/react-positioning';
import type { ComboboxContextValue, ListboxContextValue } from '@fluentui/react-combobox';
import type { OptionValue, OptionCollectionState } from './OptionCollection.types';
import { SelectionProps, SelectionState } from './Selection.types';
import { PortalProps } from '@fluentui/react-portal';

/**
* ComboboxBase Props
* Shared types between Combobox and Dropdown components
*/
export type ComboboxBaseProps = SelectionProps &
Pick<PortalProps, 'mountNode'> & {
/**
* Controls the colors and borders of the combobox trigger.
* @default 'outline'
*/
appearance?: 'filled-darker' | 'filled-lighter' | 'outline' | 'underline';

/**
* If set, the combobox will show an icon to clear the current value.
*/
clearable?: boolean;

/**
* The default open state when open is uncontrolled
*/
defaultOpen?: boolean;

/**
* The default value displayed in the trigger input or button when the combobox's value is uncontrolled
*/
defaultValue?: string;

/**
* Render the combobox's popup inline in the DOM.
* This has accessibility benefits, particularly for touch screen readers.
*/
inlinePopup?: boolean;

/**
* Callback when the open/closed state of the dropdown changes
*/
// eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback
onOpenChange?: (e: ComboboxBaseOpenEvents, data: ComboboxBaseOpenChangeData) => void;

/**
* Sets the open/closed state of the dropdown.
* Use together with onOpenChange to fully control the dropdown's visibility
*/
open?: boolean;

/**
* If set, the placeholder will show when no value is selected
*/
placeholder?: string;

/**
* Configure the positioning of the combobox dropdown
*
* @defaultvalue below
*/
positioning?: PositioningShorthand;

/**
* Controls the size of the combobox faceplate
* @default 'medium'
*/
size?: 'small' | 'medium' | 'large';

/**
* The value displayed by the Combobox.
* Use this with `onOptionSelect` to directly control the displayed value string
*/
value?: string;
};

/**
* State used in rendering Combobox
*/
export type ComboboxBaseState = Required<
Pick<ComboboxBaseProps, 'appearance' | 'open' | 'clearable' | 'inlinePopup' | 'size'>
> &
Pick<ComboboxBaseProps, 'mountNode' | 'placeholder' | 'value' | 'multiselect'> &
OptionCollectionState &
SelectionState & {
/**
* @deprecated - no longer used internally
*/
activeOption?: OptionValue;

/**
* @deprecated - no longer used internally and handled automatically be activedescendant utilities
* @see ACTIVEDESCENDANT_FOCUSVISIBLE_ATTRIBUTE for writing styles involving focusVisible
*/
focusVisible: boolean;

/**
* @deprecated - no longer used internally
* Whether the next blur event should be ignored, and the combobox/dropdown will not close.
*/
ignoreNextBlur: React.MutableRefObject<boolean>;

/**
* @deprecated - no longer used internally
*/
setActiveOption: React.Dispatch<React.SetStateAction<OptionValue | undefined>>;

/**
* @deprecated - no longer used internally and handled automatically be activedescendant utilities
* @see useSetKeyboardNavigation for imperatively setting focus visible state
*/
setFocusVisible(focusVisible: boolean): void;

/**
* whether the combobox/dropdown currently has focus
*/
hasFocus: boolean;

setHasFocus(hasFocus: boolean): void;

setOpen(event: ComboboxBaseOpenEvents, newState: boolean): void;

setValue(newValue: string | undefined): void;

onOptionClick: (e: React.MouseEvent<HTMLElement>) => void;
};

/**
* Data for the Combobox onOpenChange event.
*/
export type ComboboxBaseOpenChangeData = {
open: boolean;
};

/* Possible event types for onOpen */
export type ComboboxBaseOpenEvents =
| React.MouseEvent<HTMLElement>
| React.KeyboardEvent<HTMLElement>
| React.FocusEvent<HTMLElement>;

export type ComboboxBaseContextValues = {
combobox: ComboboxContextValue;
activeDescendant: ActiveDescendantContextValue;
listbox: ListboxContextValue;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
export type OptionValue = {
/** The disabled state of the option. */
disabled?: boolean;

/** The `id` attribute of the option. */
id: string;

/** The `text` string for the option. */
text: string;

/** The value string of the option. */
value: string;
};

export type OptionCollectionState = {
/**
* @deprecated - no longer used internally
*/
getIndexOfId(id: string): number;

/**
* @deprecated - no longer used internally
*/
getOptionAtIndex(index: number): OptionValue | undefined;

/**
* @deprecated - no longer used internally
*/
getOptionsMatchingText(matcher: (text: string) => boolean): OptionValue[];

/** The total number of options in the collection. */
getCount: () => number;

/** Returns the option data by key. */
getOptionById(id: string): OptionValue | undefined;

/** Returns an array of options filtered by a value matching function against the option's value string. */
getOptionsMatchingValue(matcher: (value: string) => boolean): OptionValue[];

/** The unordered option data. */
options: OptionValue[];

/* A function that child options call to register their values. Returns a function to unregister the option. */
registerOption: (option: OptionValue, element: HTMLElement) => () => void;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import * as React from 'react';
import { OptionValue } from './OptionCollection.types';

export type SelectionProps = {
/**
* For an uncontrolled component, sets the initial selection.
* If this is set, the `defaultValue` prop MUST also be set.
*/
defaultSelectedOptions?: string[];

/**
* Sets the selection type to multiselect.
* Set this to true for multiselect, even if fully controlling selection state.
* This enables styles and accessibility properties to be set.
* @default false
*/
multiselect?: boolean;

/* Callback when an option is selected */
// eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback
onOptionSelect?: (event: SelectionEvents, data: OptionOnSelectData) => void;

/**
* An array of selected option keys.
* Use this with `onOptionSelect` to directly control the selected option(s)
* If this is set, the `value` prop MUST also be controlled.
*/
selectedOptions?: string[];
};

/* Values returned by the useSelection hook */
export type SelectionState = {
clearSelection: (event: SelectionEvents) => void;
selectedOptions: string[];
selectOption: (event: SelectionEvents, option: OptionValue) => void;
};

/*
* Data for the onOptionSelect callback.
* `optionValue` and `optionText` will be undefined if multiple options are modified at once.
*/
export type OptionOnSelectData = {
optionValue: string | undefined;
optionText: string | undefined;
selectedOptions: string[];
};

/* Possible event types for onOptionSelect */
export type SelectionEvents =
| React.ChangeEvent<HTMLElement>
| React.KeyboardEvent<HTMLElement>
| React.MouseEvent<HTMLElement>;

0 comments on commit 3bcd7da

Please sign in to comment.