-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Popover lifecycle callbacks [LG-3734] (#2067)
* LG-3699, LG-3723: DP keyboard interactions [WIP] (#2052) * WIP * comments * update comments * WIP test * bump lib * WIP test * passing test * comments * remove param * clean up * creates utilities * Adds popover Transition lifecycle hooks * Create quiet-eggs-carry.md * mv Popover content * mv PopoverContext content * set isPopoverOpen in onEntered & onExited CBs * Update PopoverContext.spec.tsx * Update Popover.spec.tsx * Update Popover.spec.tsx * use transitionDuration in Popover timeout * extends div props in Popover * user renderHook from RTL/react-hooks * adds type specs * use PopoverComponentProps * Update package.json * Update Popover.spec.tsx * Update Popover.tsx --------- Co-authored-by: Shaneeza <[email protected]>
- Loading branch information
1 parent
5064d20
commit 99848a0
Showing
25 changed files
with
484 additions
and
227 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@leafygreen-ui/lib': minor | ||
--- | ||
|
||
Adds `pickAndOnit` helper function |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@leafygreen-ui/popover': patch | ||
--- | ||
|
||
Toggles `isPopoverOpen` in `PopoverContext` in the `onEntered` and `onExited` lifecycle callbacks, to better reflect the true state of the popover state |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@leafygreen-ui/popover': minor | ||
--- | ||
|
||
Adds `onEnter*` and `onExit*` callbacks to Popover. These callbacks are provided to the internal React Transition element. See [ReactTransitionGroup docs](https://reactcommunity.org/react-transition-group/transition#Transition-prop-onEnter) for more details. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
99 changes: 99 additions & 0 deletions
99
packages/leafygreen-provider/src/PopoverContext/PopoverContext.spec.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
import React, { PropsWithChildren } from 'react'; | ||
import { act, fireEvent, render, waitFor } from '@testing-library/react'; | ||
import { renderHook } from '@testing-library/react-hooks'; | ||
|
||
import { PopoverProvider, type PopoverState, usePopoverContext } from '.'; | ||
|
||
const childTestID = 'popover-provider'; | ||
const buttonTestId = 'test-button'; | ||
|
||
function TestContextComponent() { | ||
const { isPopoverOpen, setIsPopoverOpen } = usePopoverContext(); | ||
|
||
return ( | ||
<> | ||
<div data-testid={childTestID}> | ||
{isPopoverOpen !== undefined ? isPopoverOpen.toString() : ''} | ||
</div> | ||
<button | ||
onClick={() => setIsPopoverOpen(true)} | ||
data-testid={buttonTestId} | ||
/> | ||
</> | ||
); | ||
} | ||
|
||
function renderProvider() { | ||
const utils = render( | ||
<PopoverProvider> | ||
<TestContextComponent /> | ||
</PopoverProvider>, | ||
); | ||
const testChild = utils.getByTestId(childTestID); | ||
return { ...utils, testChild }; | ||
} | ||
|
||
describe('packages/leafygreen-provider/PopoverContext', () => { | ||
test('only renders children in the DOM', () => { | ||
const { container, testChild } = renderProvider(); | ||
expect(container.firstChild).toBe(testChild); | ||
}); | ||
|
||
test('isPopoverOpen is initialized as false', () => { | ||
const { testChild } = renderProvider(); | ||
expect(testChild.textContent).toBe('false'); | ||
}); | ||
|
||
test('when passed true, setIsPopoverOpen sets isPopoverOpen to true', () => { | ||
const { testChild, getByTestId } = renderProvider(); | ||
|
||
// The button's click handler fires setIsPopoverOpen(true) | ||
fireEvent.click(getByTestId(buttonTestId)); | ||
|
||
expect(testChild.textContent).toBe('true'); | ||
}); | ||
}); | ||
|
||
describe('usePopoverContext', () => { | ||
test('is `false` by default', () => { | ||
const { result } = renderHook(usePopoverContext); | ||
expect(result.current.isPopoverOpen).toBeFalsy(); | ||
}); | ||
|
||
test('setter updates the value', async () => { | ||
const { result, rerender } = renderHook< | ||
PropsWithChildren<{}>, | ||
PopoverState | ||
>(usePopoverContext, { | ||
wrapper: ({ children }) => <PopoverProvider>{children}</PopoverProvider>, | ||
}); | ||
|
||
act(() => result.current.setIsPopoverOpen(true)); | ||
rerender(); | ||
await waitFor(() => { | ||
expect(result.current.isPopoverOpen).toBe(true); | ||
}); | ||
}); | ||
|
||
describe('with test component', () => { | ||
function renderTestComponent() { | ||
const utils = render(<TestContextComponent />); | ||
const testChild = utils.getByTestId(childTestID); | ||
return { ...utils, testChild }; | ||
} | ||
|
||
test('when child is not a descendent of PopoverProvider, isPopoverOpen is false', () => { | ||
const { testChild } = renderTestComponent(); | ||
expect(testChild.textContent).toBe('false'); | ||
}); | ||
|
||
test('when child is not a descendent of PopoverProvider, isPopoverOpen is false when setIsPopoverOpen sets isPopoverOpen to true', () => { | ||
const { testChild, getByTestId } = renderTestComponent(); | ||
|
||
// The button's click handler fires setIsPopoverOpen(true) | ||
fireEvent.click(getByTestId(buttonTestId)); | ||
|
||
expect(testChild.textContent).toBe('false'); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
export { | ||
PopoverContext, | ||
PopoverProvider, | ||
type PopoverState, | ||
usePopoverContext, | ||
} from './PopoverContext'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export { pickAndOmit } from './pickAndOmit'; | ||
export { consoleOnce } from './consoleOnce'; | ||
export { allEqual } from './allEqual'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import omit from 'lodash/omit'; | ||
import pick from 'lodash/pick'; | ||
|
||
/** | ||
* Returns an array of 2 objects, | ||
* first, the result of calling `_.pick`, | ||
* second, the result of calling `_.omit` | ||
* | ||
* e.g. | ||
* ```js | ||
* const obj = { a: 'A', b: 'B', c: 'C', d: 'D' } | ||
* pickAndOmit(obj, ['a', 'b']) // [{a: "A", b: "B"}, {c: "C", d: "D"}] | ||
* ``` | ||
*/ | ||
export const pickAndOmit = <T extends object, K extends keyof T>( | ||
object: T, | ||
keys: Array<K>, | ||
): [Pick<T, K>, Omit<T, K>] => { | ||
const picked = pick(object, keys); | ||
const omitted = omit(object, keys); | ||
|
||
return [picked, omitted]; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.