Skip to content

Commit 27ebe46

Browse files
authored
fix: update to current react-overlays (jquense#2217)
Update react-overlays to resolve issues with StrictMode, and constrain popup to within Month container. jquense#2186
1 parent 41405d0 commit 27ebe46

File tree

6 files changed

+269
-140
lines changed

6 files changed

+269
-140
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
"moment": "^2.29.4",
118118
"moment-timezone": "^0.5.34",
119119
"prop-types": "^15.8.1",
120-
"react-overlays": "^4.1.1",
120+
"react-overlays": "^5.2.0",
121121
"uncontrollable": "^7.2.1"
122122
},
123123
"bugs": {

src/Month.js

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import { notify } from './utils/helpers'
99
import getPosition from 'dom-helpers/position'
1010
import * as animationFrame from 'dom-helpers/animationFrame'
1111

12-
import Popup from './Popup'
13-
import Overlay from 'react-overlays/Overlay'
12+
/* import Popup from './Popup'
13+
import Overlay from 'react-overlays/Overlay' */
14+
import PopOverlay from './PopOverlay'
1415
import DateContentRow from './DateContentRow'
1516
import Header from './Header'
1617
import DateHeader from './DateHeader'
@@ -204,11 +205,40 @@ class MonthView extends React.Component {
204205
}
205206

206207
renderOverlay() {
207-
let overlay = (this.state && this.state.overlay) || {}
208-
let { accessors, localizer, components, getters, selected, popupOffset } =
209-
this.props
208+
let overlay = this.state?.overlay ?? {}
209+
let {
210+
accessors,
211+
localizer,
212+
components,
213+
getters,
214+
selected,
215+
popupOffset,
216+
handleDragStart,
217+
} = this.props
218+
219+
const onHide = () => this.setState({ overlay: null })
210220

211221
return (
222+
<PopOverlay
223+
overlay={overlay}
224+
accessors={accessors}
225+
localizer={localizer}
226+
components={components}
227+
getters={getters}
228+
selected={selected}
229+
popupOffset={popupOffset}
230+
ref={this.containerRef}
231+
handleKeyPressEvent={this.handleKeyPressEvent}
232+
handleSelectEvent={this.handleSelectEvent}
233+
handleDoubleClickEvent={this.handleDoubleClickEvent}
234+
handleDragStart={handleDragStart}
235+
show={!!overlay.position}
236+
overlayDisplay={this.overlayDisplay}
237+
onHide={onHide}
238+
/>
239+
)
240+
241+
/* return (
212242
<Overlay
213243
rootClose
214244
placement="bottom"
@@ -237,7 +267,7 @@ class MonthView extends React.Component {
237267
/>
238268
)}
239269
</Overlay>
240-
)
270+
) */
241271
}
242272

243273
measureRowLimit() {

src/PopOverlay.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import React, { useRef } from 'react'
2+
import PropTypes from 'prop-types'
3+
import { Overlay } from 'react-overlays'
4+
import Popup from './Popup'
5+
6+
function CalOverlay({
7+
containerRef,
8+
popupOffset = 5,
9+
overlay,
10+
accessors,
11+
localizer,
12+
components,
13+
getters,
14+
selected,
15+
handleSelectEvent,
16+
handleDoubleClickEvent,
17+
handleKeyPressEvent,
18+
handleDragStart,
19+
onHide,
20+
overlayDisplay,
21+
}) {
22+
const popperRef = useRef(null)
23+
if (!overlay.position) return null
24+
25+
let offset
26+
if (!isNaN(popupOffset)) {
27+
offset = { x: popupOffset, y: popupOffset }
28+
}
29+
30+
const { position, events, date, end } = overlay
31+
return (
32+
<Overlay
33+
rootClose
34+
flip
35+
show
36+
placement="bottom"
37+
onHide={onHide}
38+
target={overlay.target}
39+
>
40+
{({ props }) => (
41+
<Popup
42+
{...props}
43+
containerRef={containerRef}
44+
ref={popperRef}
45+
target={overlay.target}
46+
offset={offset}
47+
accessors={accessors}
48+
getters={getters}
49+
selected={selected}
50+
components={components}
51+
localizer={localizer}
52+
position={position}
53+
show={overlayDisplay}
54+
events={events}
55+
slotStart={date}
56+
slotEnd={end}
57+
onSelect={handleSelectEvent}
58+
onDoubleClick={handleDoubleClickEvent}
59+
onKeyPress={handleKeyPressEvent}
60+
handleDragStart={handleDragStart}
61+
/>
62+
)}
63+
</Overlay>
64+
)
65+
}
66+
67+
const PopOverlay = React.forwardRef((props, ref) => (
68+
<CalOverlay {...props} containerRef={ref} />
69+
))
70+
71+
PopOverlay.propTypes = {
72+
popupOffset: PropTypes.oneOfType([
73+
PropTypes.number,
74+
PropTypes.shape({ x: PropTypes.number, y: PropTypes.number }),
75+
]),
76+
overlay: PropTypes.shape({
77+
position: PropTypes.object,
78+
events: PropTypes.array,
79+
date: PropTypes.instanceOf(Date),
80+
end: PropTypes.instanceOf(Date),
81+
}),
82+
accessors: PropTypes.object.isRequired,
83+
localizer: PropTypes.object.isRequired,
84+
components: PropTypes.object.isRequired,
85+
getters: PropTypes.object.isRequired,
86+
selected: PropTypes.object,
87+
handleSelectEvent: PropTypes.func,
88+
handleDoubleClickEvent: PropTypes.func,
89+
handleKeyPressEvent: PropTypes.func,
90+
handleDragStart: PropTypes.func,
91+
onHide: PropTypes.func,
92+
overlayDisplay: PropTypes.func,
93+
}
94+
95+
export default PopOverlay

0 commit comments

Comments
 (0)