@yakad/ui 1.3.137 → 1.3.139

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.
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ export interface RenderByVisibilityProps {
3
+ extraRender?: number;
4
+ jumpToIndex?: number;
5
+ stopNewRenders?: boolean;
6
+ newChildRendered?: (index: number) => void;
7
+ children?: React.ReactNode;
8
+ }
9
+ export declare const RenderByVisibility: React.ForwardRefExoticComponent<RenderByVisibilityProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import React, { forwardRef, useEffect, useRef, useState } from "react";
15
+ import { Card, LoadingIcon, Stack, WithInteractions } from "..";
16
+ const data = Array.from({ length: 78 });
17
+ export const RenderByVisibility = forwardRef(function RenderByVisibility(_a, ref) {
18
+ var { extraRender = 5, jumpToIndex = 0, stopNewRenders, newChildRendered, children } = _a, restProps = __rest(_a, ["extraRender", "jumpToIndex", "stopNewRenders", "newChildRendered", "children"]);
19
+ const childRefs = useRef({});
20
+ const scrollTo = (i) => {
21
+ var _a;
22
+ return (_a = childRefs.current[i]) === null || _a === void 0 ? void 0 : _a.scrollIntoView({
23
+ behavior: "smooth",
24
+ });
25
+ };
26
+ const childrenArray = React.Children.toArray(children);
27
+ // Collect Visibility Status
28
+ const [visibled, setVisibled] = useState({ lowest: jumpToIndex, highest: jumpToIndex });
29
+ const handleOnVisible = (i) => {
30
+ if (i < visibled.lowest)
31
+ setVisibled(Object.assign(Object.assign({}, visibled), { lowest: i }));
32
+ if (i > visibled.highest)
33
+ setVisibled(Object.assign(Object.assign({}, visibled), { highest: i }));
34
+ };
35
+ // Collect Rendered Childs Status
36
+ const [rendered, setRendered] = useState({ lowest: jumpToIndex, highest: jumpToIndex });
37
+ // Calculate Over Screen Renders
38
+ const overRenderedOnLowSide = visibled.lowest - rendered.lowest;
39
+ const overRenderedOnHighSide = rendered.highest - visibled.highest;
40
+ // Render new Childs if needed
41
+ useEffect(() => {
42
+ if (!stopNewRenders) {
43
+ if (overRenderedOnHighSide <= overRenderedOnLowSide) {
44
+ if (rendered.highest < data.length &&
45
+ overRenderedOnHighSide < extraRender) {
46
+ setRendered(Object.assign(Object.assign({}, rendered), { highest: rendered.highest + 1 }));
47
+ newChildRendered === null || newChildRendered === void 0 ? void 0 : newChildRendered(rendered.highest + 1);
48
+ }
49
+ }
50
+ else {
51
+ if (rendered.lowest > 0 &&
52
+ overRenderedOnLowSide < extraRender) {
53
+ setRendered(Object.assign(Object.assign({}, rendered), { lowest: rendered.lowest - 1 }));
54
+ newChildRendered === null || newChildRendered === void 0 ? void 0 : newChildRendered(rendered.lowest - 1);
55
+ if (overRenderedOnLowSide === 0)
56
+ scrollTo(visibled.lowest);
57
+ }
58
+ }
59
+ }
60
+ }, [visibled, rendered, stopNewRenders]);
61
+ // Scroll to jumpToIndex
62
+ useEffect(() => {
63
+ var _a;
64
+ (_a = childRefs.current[jumpToIndex]) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
65
+ console.log("SCROLL TO JUMPToIndex:", jumpToIndex);
66
+ }, [jumpToIndex]);
67
+ // console.log("visibled", visibled);
68
+ // console.log("rendered", rendered);
69
+ // console.log("stopNewRenders", stopNewRenders);
70
+ return (_jsxs(Stack, Object.assign({ ref: ref }, restProps, { style: { minHeight: "100vh" }, children: [rendered.lowest > 0 && _jsx(LoadingBox, {}), childrenArray.map((child, i) => i >= rendered.lowest &&
71
+ i <= rendered.highest && (_jsx(WithInteractions, { ref: (el) => {
72
+ childRefs.current[i] = el;
73
+ }, onVisible: () => handleOnVisible(i), children: child }, i))), rendered.highest < data.length && _jsx(LoadingBox, {})] })));
74
+ });
75
+ const LoadingBox = () => (_jsx(Card, { style: { height: "15rem" }, children: _jsx(LoadingIcon, { variant: "dots", size: "extraLarge" }) }));
@@ -19,6 +19,6 @@ export interface WithInteractionsProps {
19
19
  onHidden?: () => void;
20
20
  onMouseHoverStart?: (e: MouseEvent) => void;
21
21
  onMouseHoverLeave?: (e: MouseEvent) => void;
22
- children?: React.ReactElement;
22
+ children?: React.ReactNode;
23
23
  }
24
24
  export declare const WithInteractions: import("react").ForwardRefExoticComponent<WithInteractionsProps & import("react").RefAttributes<HTMLElement>>;
@@ -10,6 +10,7 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  }
11
11
  return t;
12
12
  };
13
+ import { jsx as _jsx } from "react/jsx-runtime";
13
14
  import { mergeRefs } from "@yakad/lib";
14
15
  import { cloneElement, forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, } from "react";
15
16
  export const WithInteractions = forwardRef(function WithInteractions(_a, forwardedRef) {
@@ -216,6 +217,7 @@ export const WithInteractions = forwardRef(function WithInteractions(_a, forward
216
217
  ]);
217
218
  if (!isValidElement(children))
218
219
  return null;
220
+ return _jsx("div", { ref: localRef, children: children });
219
221
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
220
222
  return cloneElement(children, Object.assign(Object.assign({}, restProps), { ref: mergeRefs(localRef, forwardedRef,
221
223
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
package/dist/index.d.ts CHANGED
@@ -32,7 +32,6 @@ export * from "./WithInteractions/WithInteractions";
32
32
  export * from "./WithOverlay/WithOverlay";
33
33
  export * from "./Dropdown/Dropdown";
34
34
  export * from "./Popup/Popup";
35
- export * from "./LoadingControl/LoadingControl";
36
- export * from "./LoadingControlV3/LoadingControlV3";
35
+ export * from "./RenderByVisibility/RenderByVisibility";
37
36
  export * from "./DisplayOnVisible/DisplayOnVisible";
38
37
  export * from "./RenderOnVisible/RenderOnVisible";
package/dist/index.js CHANGED
@@ -39,7 +39,6 @@ export * from "./WithOverlay/WithOverlay";
39
39
  export * from "./Dropdown/Dropdown";
40
40
  export * from "./Popup/Popup";
41
41
  // Loading Control
42
- export * from "./LoadingControl/LoadingControl";
43
- export * from "./LoadingControlV3/LoadingControlV3";
42
+ export * from "./RenderByVisibility/RenderByVisibility";
44
43
  export * from "./DisplayOnVisible/DisplayOnVisible";
45
44
  export * from "./RenderOnVisible/RenderOnVisible";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yakad/ui",
3
- "version": "1.3.137",
3
+ "version": "1.3.139",
4
4
  "private": false,
5
5
  "author": "Natiq",
6
6
  "description": "UI components for NextJS/React",
@@ -28,8 +28,7 @@
28
28
  "typecheck": "tsc --noEmit",
29
29
  "lint": "eslint src/**/*.{ts,tsx}",
30
30
  "test": "echo \"No tests specified\" && exit 0",
31
- "prepublishOnly": "npm run lint && npm run test && npm run build && npm run typecheck",
32
- "newPublish": "npm version patch && npm publish"
31
+ "prepublishOnly": "npm run lint && npm run test && npm run build && npm run typecheck"
33
32
  },
34
33
  "dependencies": {
35
34
  "@yakad/lib": "1.0.22",
@@ -1,12 +0,0 @@
1
- import React from "react";
2
- type LoadingControlChildren = React.ReactElement<{
3
- index?: number;
4
- }>;
5
- export interface LoadingControlProps extends React.HTMLAttributes<HTMLDivElement> {
6
- align?: "start" | "space" | "center" | "end";
7
- fullWidth?: boolean;
8
- loadingLimit?: number;
9
- children: LoadingControlChildren;
10
- }
11
- export declare const LoadingControl: React.ForwardRefExoticComponent<LoadingControlProps & React.RefAttributes<HTMLDivElement>>;
12
- export {};
@@ -1,95 +0,0 @@
1
- "use client";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
- import React, { forwardRef, useEffect, useState } from "react";
15
- import classNames from "classnames";
16
- import boxingStyles from "../boxing.module.css";
17
- import { DisplayOnVisible } from "..";
18
- export const LoadingControl = forwardRef(function LoadingControl(_a, ref) {
19
- var { align, fullWidth = true, loadingLimit = 200, className, children } = _a, restProps = __rest(_a, ["align", "fullWidth", "loadingLimit", "className", "children"]);
20
- const [maxTotalVisibledItems, setMaxTotalVisibledItems] = useState(3); // Min: default
21
- const extraLoading = maxTotalVisibledItems * 2;
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- const [loadedItems, setLoadedItems] = useState([
24
- React.cloneElement(children, {
25
- index: 0,
26
- }),
27
- ]);
28
- const [visibilityStatus, setVisibilityStatus] = useState({});
29
- const handleOnVisibilityChange = (visible, i) => {
30
- if (i !== undefined)
31
- if (visibilityStatus[i] !== visible)
32
- setVisibilityStatus((prev) => (Object.assign(Object.assign({}, prev), { [i]: visible })));
33
- };
34
- const visibleIndexes = Object.entries(visibilityStatus)
35
- // eslint-disable-next-line
36
- .filter(([_, isVisible]) => isVisible)
37
- .map(([index]) => parseInt(index));
38
- const visibleCount = Object.values(visibilityStatus).filter(Boolean).length;
39
- const lowestVisibleItemIndex = visibleIndexes.length
40
- ? Math.min(...visibleIndexes)
41
- : 0;
42
- const highestVisibleItemIndex = visibleIndexes.length
43
- ? Math.max(...visibleIndexes)
44
- : 0;
45
- const lowestLoadedItemIndex = loadedItems[0].props.index;
46
- const highestLoadedItemIndex = loadedItems[loadedItems.length - 1].props.index;
47
- useEffect(() => {
48
- if (highestLoadedItemIndex < loadingLimit &&
49
- highestLoadedItemIndex < highestVisibleItemIndex + extraLoading) {
50
- setLoadedItems([
51
- ...loadedItems,
52
- React.cloneElement(children, {
53
- index: highestLoadedItemIndex + 1,
54
- }),
55
- ].slice(
56
- // Slice from start
57
- lowestVisibleItemIndex - lowestLoadedItemIndex >
58
- extraLoading
59
- ? 1
60
- : 0));
61
- console.log(">>>>>>>>>>>>>>>>>>>>>>>> ++++ Item ", highestLoadedItemIndex + 1, " Added to end");
62
- }
63
- if (lowestLoadedItemIndex > 0 &&
64
- lowestLoadedItemIndex > lowestVisibleItemIndex - extraLoading) {
65
- setLoadedItems([
66
- React.cloneElement(children, {
67
- index: lowestLoadedItemIndex - 1,
68
- }),
69
- ...loadedItems,
70
- ].slice(
71
- // Slice from end
72
- 0, highestLoadedItemIndex - highestVisibleItemIndex >
73
- extraLoading
74
- ? -1
75
- : undefined));
76
- console.log(">>>>>>>>>>>> ---- Item ", lowestLoadedItemIndex - 1, " Added to start");
77
- }
78
- if (visibleCount > maxTotalVisibledItems) {
79
- setMaxTotalVisibledItems(visibleCount);
80
- }
81
- // eslint-disable-next-line
82
- }, [visibilityStatus]);
83
- console.log("###### ", "Total Loaded:", loadedItems.length, "extraLoading:", extraLoading, " ##### ", "L:", lowestLoadedItemIndex, "V:", lowestVisibleItemIndex, "D:", -(lowestLoadedItemIndex - lowestVisibleItemIndex), "|", "V:", visibleCount, "|", "D:", highestLoadedItemIndex - highestVisibleItemIndex, "V:", highestVisibleItemIndex, "L:", highestLoadedItemIndex);
84
- // console.log("visibilityStatus", visibilityStatus);
85
- // console.log(
86
- // "loadedItems",
87
- // loadedItems.map((item) => item.props.index)
88
- // );
89
- // console.log(
90
- // "visibilityStatus.length",
91
- // Object.keys(visibilityStatus).length
92
- // );
93
- const joinedClassNames = classNames(boxingStyles.flexColumnBox, { [boxingStyles[align]]: align }, { fullWidth: fullWidth }, className);
94
- return (_jsx("div", Object.assign({ ref: ref, className: joinedClassNames }, restProps, { children: loadedItems.map((item) => (_jsx(DisplayOnVisible, { onVisibilityChange: (visible) => handleOnVisibilityChange(visible, item.props.index), children: item }, item.props.index))) })));
95
- });
@@ -1,12 +0,0 @@
1
- import React from "react";
2
- type LoadingControlV3Children = React.ReactElement<{
3
- index?: number;
4
- }>;
5
- export interface LoadingControlV3Props extends React.HTMLAttributes<HTMLDivElement> {
6
- align?: "start" | "space" | "center" | "end";
7
- fullWidth?: boolean;
8
- loadingLimit?: number;
9
- children: LoadingControlV3Children;
10
- }
11
- export declare const LoadingControlV3: React.ForwardRefExoticComponent<LoadingControlV3Props & React.RefAttributes<HTMLDivElement>>;
12
- export {};
@@ -1,94 +0,0 @@
1
- "use client";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
- import React, { forwardRef, useEffect, useState } from "react";
15
- import classNames from "classnames";
16
- import boxingStyles from "../boxing.module.css";
17
- import { DisplayOnVisible } from "..";
18
- export const LoadingControlV3 = forwardRef(function LoadingControlV3(_a, ref) {
19
- var { align, fullWidth = true, loadingLimit = 200, className, children } = _a, restProps = __rest(_a, ["align", "fullWidth", "loadingLimit", "className", "children"]);
20
- const [maxTotalVisibledItems, setMaxTotalVisibledItems] = useState(3); // Min: default
21
- const extraLoading = maxTotalVisibledItems * 2;
22
- const [loadedItems, setLoadedItems] = useState({
23
- 0: React.cloneElement(children, {
24
- index: 0,
25
- }),
26
- });
27
- const [visibilityStatus, setVisibilityStatus] = useState({});
28
- const handleOnVisibilityChange = (visible, i) => {
29
- if (i !== undefined)
30
- if (visibilityStatus[i] !== visible)
31
- setVisibilityStatus((prev) => (Object.assign(Object.assign({}, prev), { [i]: visible })));
32
- };
33
- const visibleIndexes = Object.entries(visibilityStatus)
34
- // eslint-disable-next-line
35
- .filter(([_, isVisible]) => isVisible)
36
- .map(([index]) => parseInt(index));
37
- const visibleCount = Object.values(visibilityStatus).filter(Boolean).length;
38
- const lowestVisibleItemIndex = visibleIndexes.length
39
- ? Math.min(...visibleIndexes)
40
- : 0;
41
- const highestVisibleItemIndex = visibleIndexes.length
42
- ? Math.max(...visibleIndexes)
43
- : 0;
44
- const loadedItemsLength = Object.values(loadedItems).length;
45
- const lowestLoadedItemIndex = Number(Object.keys(loadedItems)[0]);
46
- const highestLoadedItemIndex = Number(Object.keys(loadedItems)[loadedItemsLength - 1]);
47
- useEffect(() => {
48
- if (highestLoadedItemIndex < loadingLimit &&
49
- highestLoadedItemIndex - highestVisibleItemIndex < extraLoading) {
50
- setLoadedItems(Object.assign(Object.assign({}, loadedItems), { [highestLoadedItemIndex + 1]: React.cloneElement(children, {
51
- index: highestLoadedItemIndex + 1,
52
- }) }));
53
- console.log(">>>>>>>>>>>>>>>>>>>>>>>> ++++ Item ", highestLoadedItemIndex + 1, " Added to end");
54
- }
55
- if (lowestLoadedItemIndex > 0 &&
56
- lowestVisibleItemIndex - lowestLoadedItemIndex < extraLoading) {
57
- setLoadedItems(Object.assign({ [lowestLoadedItemIndex - 1]: React.cloneElement(children, {
58
- index: lowestLoadedItemIndex - 1,
59
- }) }, loadedItems));
60
- console.log(">>>>>>>>>>>> ---- Item ", lowestLoadedItemIndex - 1, " Added to start");
61
- }
62
- if (visibleCount > maxTotalVisibledItems) {
63
- setMaxTotalVisibledItems(visibleCount);
64
- }
65
- // eslint-disable-next-line
66
- }, [visibilityStatus]);
67
- useEffect(() => {
68
- const loadLimit = extraLoading + 2;
69
- if (lowestVisibleItemIndex - lowestLoadedItemIndex > loadLimit) {
70
- setLoadedItems(removeFromStart(loadedItems, lowestVisibleItemIndex - loadLimit));
71
- console.log("$$$$$$$$$$$ Sliced $$$$$$$$$$$$$$$$$$$$$ from start smaller than:", lowestVisibleItemIndex - loadLimit);
72
- }
73
- if (highestLoadedItemIndex - highestVisibleItemIndex > loadLimit) {
74
- setLoadedItems(removeFromEnd(loadedItems, highestVisibleItemIndex + loadLimit));
75
- console.log("$$$$$$$$$$$ Sliced $$$$$$$$$$$$$$$$$$$$$ from end bigger than:", highestVisibleItemIndex + loadLimit);
76
- }
77
- // eslint-disable-next-line
78
- }, [loadedItems, visibilityStatus]);
79
- console.log("###### ", "Total Loaded:", loadedItemsLength, "extraLoading:", extraLoading, " ##### ", "L:", lowestLoadedItemIndex, "V:", lowestVisibleItemIndex, "D:", -(lowestLoadedItemIndex - lowestVisibleItemIndex), "|", "TV:", visibleCount, "|", "D:", highestLoadedItemIndex - highestVisibleItemIndex, "V:", highestVisibleItemIndex, "L:", highestLoadedItemIndex);
80
- // console.log("visibilityStatus", visibilityStatus);
81
- // console.log("loadedItems", loadedItems);
82
- // console.log(
83
- // "visibilityStatus.length",
84
- // Object.keys(visibilityStatus).length
85
- // );
86
- const joinedClassNames = classNames(boxingStyles.flexColumnBox, { [boxingStyles[align]]: align }, { fullWidth: fullWidth }, className);
87
- return (_jsx("div", Object.assign({ ref: ref, className: joinedClassNames }, restProps, { children: Object.entries(loadedItems).map(([key, value]) => (_jsx(DisplayOnVisible, { onVisibilityChange: (visible) => handleOnVisibilityChange(visible, Number(key)), children: value }, key))) })));
88
- });
89
- function removeFromStart(obj, start) {
90
- return Object.fromEntries(Object.entries(obj).filter(([key]) => Number(key) >= start));
91
- }
92
- function removeFromEnd(obj, end) {
93
- return Object.fromEntries(Object.entries(obj).filter(([key]) => Number(key) <= end));
94
- }