@rc-component/portal 1.0.0-2 → 1.0.0-5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { updateCSS, removeCSS } from "rc-util/es/Dom/dynamicCSS";
3
+ import useLayoutEffect, { useLayoutUpdateEffect } from "rc-util/es/hooks/useLayoutEffect";
3
4
  import getScrollBarSize from "rc-util/es/getScrollBarSize";
5
+ import { isBodyOverflowing } from "./util";
4
6
  var lockCount = 0;
5
7
  var locked = false;
6
8
  var UNIQUE_ID = "rc-util-locker-".concat(Date.now());
@@ -13,7 +15,8 @@ function syncLocker() {
13
15
 
14
16
  if (locked) {
15
17
  var scrollbarSize = getScrollBarSize();
16
- updateCSS("\nhtml body {\n overflow-y: hidden;\n width: calc(100% - ".concat(scrollbarSize, "px);\n}"), UNIQUE_ID);
18
+ var isOverflow = isBodyOverflowing();
19
+ updateCSS("\nhtml body {\n overflow-y: hidden;\n ".concat(isOverflow ? "width: calc(100% - ".concat(scrollbarSize, "px);") : '', "\n}"), UNIQUE_ID);
17
20
  } else {
18
21
  removeCSS(UNIQUE_ID);
19
22
  }
@@ -21,18 +24,27 @@ function syncLocker() {
21
24
  }
22
25
 
23
26
  export default function useScrollLocker(lock) {
24
- React.useLayoutEffect(function () {
25
- if (lock) {
27
+ var mergedLock = !!lock; // Init only check lock
28
+
29
+ useLayoutEffect(function () {
30
+ if (mergedLock) {
31
+ lockCount += 1;
32
+ syncLocker();
33
+ }
34
+ }, []); // Update will both check the lock state
35
+
36
+ useLayoutUpdateEffect(function () {
37
+ if (mergedLock) {
26
38
  lockCount += 1;
27
39
  syncLocker();
28
40
  } else {
29
41
  lockCount -= 1;
30
42
  syncLocker();
31
43
  }
32
- }, [lock]);
33
- var lockRef = React.useRef(lock);
34
- lockRef.current = lock;
35
- React.useLayoutEffect(function () {
44
+ }, [mergedLock]);
45
+ var lockRef = React.useRef(mergedLock);
46
+ lockRef.current = mergedLock;
47
+ useLayoutEffect(function () {
36
48
  return function () {
37
49
  if (lockRef.current) {
38
50
  lockCount -= 1;
package/es/util.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Test usage export. Do not use in your production
3
+ */
4
+ export declare function isBodyOverflowing(): boolean;
package/es/util.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Test usage export. Do not use in your production
3
+ */
4
+ export function isBodyOverflowing() {
5
+ return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth;
6
+ }
@@ -13,8 +13,12 @@ var React = _interopRequireWildcard(require("react"));
13
13
 
14
14
  var _dynamicCSS = require("rc-util/lib/Dom/dynamicCSS");
15
15
 
16
+ var _useLayoutEffect = _interopRequireWildcard(require("rc-util/lib/hooks/useLayoutEffect"));
17
+
16
18
  var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize"));
17
19
 
20
+ var _util = require("./util");
21
+
18
22
  var lockCount = 0;
19
23
  var locked = false;
20
24
  var UNIQUE_ID = "rc-util-locker-".concat(Date.now());
@@ -27,7 +31,8 @@ function syncLocker() {
27
31
 
28
32
  if (locked) {
29
33
  var scrollbarSize = (0, _getScrollBarSize.default)();
30
- (0, _dynamicCSS.updateCSS)("\nhtml body {\n overflow-y: hidden;\n width: calc(100% - ".concat(scrollbarSize, "px);\n}"), UNIQUE_ID);
34
+ var isOverflow = (0, _util.isBodyOverflowing)();
35
+ (0, _dynamicCSS.updateCSS)("\nhtml body {\n overflow-y: hidden;\n ".concat(isOverflow ? "width: calc(100% - ".concat(scrollbarSize, "px);") : '', "\n}"), UNIQUE_ID);
31
36
  } else {
32
37
  (0, _dynamicCSS.removeCSS)(UNIQUE_ID);
33
38
  }
@@ -35,18 +40,27 @@ function syncLocker() {
35
40
  }
36
41
 
37
42
  function useScrollLocker(lock) {
38
- React.useLayoutEffect(function () {
39
- if (lock) {
43
+ var mergedLock = !!lock; // Init only check lock
44
+
45
+ (0, _useLayoutEffect.default)(function () {
46
+ if (mergedLock) {
47
+ lockCount += 1;
48
+ syncLocker();
49
+ }
50
+ }, []); // Update will both check the lock state
51
+
52
+ (0, _useLayoutEffect.useLayoutUpdateEffect)(function () {
53
+ if (mergedLock) {
40
54
  lockCount += 1;
41
55
  syncLocker();
42
56
  } else {
43
57
  lockCount -= 1;
44
58
  syncLocker();
45
59
  }
46
- }, [lock]);
47
- var lockRef = React.useRef(lock);
48
- lockRef.current = lock;
49
- React.useLayoutEffect(function () {
60
+ }, [mergedLock]);
61
+ var lockRef = React.useRef(mergedLock);
62
+ lockRef.current = mergedLock;
63
+ (0, _useLayoutEffect.default)(function () {
50
64
  return function () {
51
65
  if (lockRef.current) {
52
66
  lockCount -= 1;
package/lib/util.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Test usage export. Do not use in your production
3
+ */
4
+ export declare function isBodyOverflowing(): boolean;
package/lib/util.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isBodyOverflowing = isBodyOverflowing;
7
+
8
+ /**
9
+ * Test usage export. Do not use in your production
10
+ */
11
+ function isBodyOverflowing() {
12
+ return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth;
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/portal",
3
- "version": "1.0.0-2",
3
+ "version": "1.0.0-5",
4
4
  "description": "React Portal Component",
5
5
  "keywords": [
6
6
  "react",