-
-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add new usePreview hook in react-dnd-multi-backend
- Loading branch information
1 parent
95a7652
commit 100602a
Showing
11 changed files
with
288 additions
and
43 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
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
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
161 changes: 161 additions & 0 deletions
161
packages/react-dnd-multi-backend/src/__tests__/usePreview_spec.js
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,161 @@ | ||
import React from 'react'; | ||
import { act } from 'react-dom/test-utils'; | ||
import { mount } from 'enzyme'; | ||
|
||
import { Preview, PreviewContext } from '../Preview'; | ||
import { PreviewManager, PreviewList } from 'dnd-multi-backend'; | ||
import { wrapInTestContext } from 'react-dnd-test-utils'; | ||
import { PreviewPortalContext, PreviewsContext } from '../DndProvider'; | ||
|
||
const setupTest = (create, lazyList) => { | ||
let list; | ||
|
||
beforeEach(() => { | ||
list = lazyList(); | ||
}); | ||
|
||
const getLastRegister = () => { | ||
return list.register.mock.calls[list.register.mock.calls.length - 1][0]; | ||
}; | ||
|
||
test('registers with the backend', () => { | ||
expect(list.register).not.toBeCalled(); | ||
const component = create(); | ||
const matcher = expect.objectContaining({backendChanged: expect.any(Function)}); | ||
expect(list.register).toBeCalledWith(matcher); | ||
expect(list.unregister).not.toBeCalled(); | ||
component.unmount(); | ||
expect(list.unregister).toBeCalledWith(matcher); | ||
}); | ||
|
||
test('is empty (no preview)', () => { | ||
const component = create(); | ||
expect(component.find(Preview).html()).toBeNull(); | ||
}); | ||
|
||
test('is not empty (preview)', () => { | ||
const component = create({ | ||
generator: () => { // eslint-disable-line react/display-name | ||
return <div>abc</div>; | ||
}, | ||
}); | ||
expect(component.find(Preview).html()).toBeNull(); | ||
|
||
act(() => { | ||
getLastRegister().backendChanged({ | ||
previewEnabled: () => true, | ||
}); | ||
}); | ||
component.update(); | ||
expect(component.find(Preview).html()).not.toBeNull(); | ||
|
||
act(() => { | ||
getLastRegister().backendChanged({ | ||
previewEnabled: () => false, | ||
}); | ||
}); | ||
component.update(); | ||
expect(component.find(Preview).html()).toBeNull(); | ||
}); | ||
|
||
return getLastRegister; | ||
}; | ||
|
||
describe('Preview component', () => { | ||
test('exports a context', () => { | ||
expect(Preview.Context).toBe(PreviewContext); | ||
}); | ||
|
||
describe('using global context', () => { | ||
beforeEach(() => { | ||
jest.spyOn(PreviewManager, 'register'); | ||
jest.spyOn(PreviewManager, 'unregister'); | ||
}); | ||
|
||
afterEach(() => { | ||
PreviewManager.register.mockRestore(); | ||
PreviewManager.unregister.mockRestore(); | ||
}); | ||
|
||
const createComponent = ({generator = jest.fn()} = {}) => { | ||
const Wrapped = wrapInTestContext(Preview); | ||
return mount(<Wrapped generator={generator} />); | ||
}; | ||
|
||
setupTest(createComponent, () => PreviewManager); | ||
}); | ||
|
||
describe('using previews context', () => { | ||
let list; | ||
|
||
beforeEach(() => { | ||
list = new PreviewList(); | ||
jest.spyOn(list, 'register'); | ||
jest.spyOn(list, 'unregister'); | ||
}); | ||
|
||
const createComponent = ({generator = jest.fn()} = {}) => { | ||
const Wrapped = wrapInTestContext(Preview); | ||
return mount( | ||
<PreviewsContext.Provider value={list}> | ||
<Wrapped generator={generator} /> | ||
</PreviewsContext.Provider> | ||
); | ||
}; | ||
|
||
setupTest(createComponent, () => list); | ||
}); | ||
|
||
describe('using previews and portal context', () => { | ||
let list; | ||
|
||
beforeEach(() => { | ||
list = new PreviewList(); | ||
jest.spyOn(list, 'register'); | ||
jest.spyOn(list, 'unregister'); | ||
}); | ||
|
||
const createComponent = ({generator = jest.fn()} = {}) => { | ||
const Wrapped = wrapInTestContext(Preview); | ||
const Component = class Root extends React.Component { | ||
constructor(props) { | ||
super(props); | ||
this.ref = React.createRef(); | ||
} | ||
|
||
render() { | ||
return ( | ||
<> | ||
<PreviewPortalContext.Provider value={this.ref.current}> | ||
<PreviewsContext.Provider value={list}> | ||
<Wrapped generator={generator} /> | ||
</PreviewsContext.Provider> | ||
</PreviewPortalContext.Provider> | ||
<div ref={this.ref} /> | ||
</> | ||
); | ||
} | ||
}; | ||
const component = mount(<Component />); | ||
component.instance().forceUpdate(); | ||
return component; | ||
}; | ||
|
||
const getLastRegister = setupTest(createComponent, () => list); | ||
|
||
test('portal is in detached div', () => { | ||
const component = createComponent({ | ||
generator: () => { // eslint-disable-line react/display-name | ||
return <span>123</span>; | ||
}, | ||
}); | ||
act(() => { | ||
getLastRegister().backendChanged({ | ||
previewEnabled: () => true, | ||
}); | ||
}); | ||
component.update(); | ||
expect(component.find(Preview).find('Portal').html()).not.toBeNull(); | ||
}); | ||
}); | ||
}); |
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,25 @@ | ||
import { useState, useEffect, useContext } from 'react'; | ||
|
||
import { PreviewsContext } from './DndProvider'; | ||
|
||
const useObservePreviews = () => { | ||
const [enabled, setEnabled] = useState(false); | ||
const previews = useContext(PreviewsContext); | ||
|
||
useEffect(() => { | ||
const observer = { | ||
backendChanged: (backend) => { | ||
setEnabled(backend.previewEnabled()); | ||
}, | ||
}; | ||
|
||
previews.register(observer); | ||
return () => { | ||
previews.unregister(observer); | ||
}; | ||
}, [previews, setEnabled]); | ||
|
||
return enabled; | ||
}; | ||
|
||
export { useObservePreviews }; |
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 |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export { default, HTML5DragTransition, TouchTransition, MouseTransition, createTransition } from 'dnd-multi-backend'; | ||
export { DndProvider } from './DndProvider'; | ||
export { Preview, PreviewContext } from './Preview'; | ||
export { usePreview } from './usePreview'; |
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,15 @@ | ||
import { usePreview as usePreviewDnd } from 'react-dnd-preview'; | ||
|
||
import { useObservePreviews } from './commonPreview'; | ||
|
||
const usePreview = () => { | ||
const enabled = useObservePreviews(); | ||
const result = usePreviewDnd(); | ||
if (!enabled) { | ||
return {display: false}; | ||
} | ||
|
||
return result; | ||
}; | ||
|
||
export { usePreview }; |
Oops, something went wrong.