@ttt-productions/mobile-core 0.2.5 → 0.2.8
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.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pull-to-refresh/PullToRefreshContainer.d.ts +21 -0
- package/dist/pull-to-refresh/PullToRefreshContainer.d.ts.map +1 -0
- package/dist/pull-to-refresh/PullToRefreshContainer.js +46 -0
- package/dist/pull-to-refresh/PullToRefreshContainer.js.map +1 -0
- package/dist/pull-to-refresh/usePullToRefresh.d.ts +34 -0
- package/dist/pull-to-refresh/usePullToRefresh.d.ts.map +1 -0
- package/dist/pull-to-refresh/usePullToRefresh.js +84 -0
- package/dist/pull-to-refresh/usePullToRefresh.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export * from "./safe-area/SafeArea";
|
|
|
11
11
|
export * from "./scroll/useScrollLock";
|
|
12
12
|
export * from "./ios/useIosSafariFixes";
|
|
13
13
|
export * from "./ios/useNoRubberBand";
|
|
14
|
+
export * from "./pull-to-refresh/usePullToRefresh";
|
|
15
|
+
export * from "./pull-to-refresh/PullToRefreshContainer";
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AAEtB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AAEtB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,4 +11,6 @@ export * from "./safe-area/SafeArea";
|
|
|
11
11
|
export * from "./scroll/useScrollLock";
|
|
12
12
|
export * from "./ios/useIosSafariFixes";
|
|
13
13
|
export * from "./ios/useNoRubberBand";
|
|
14
|
+
export * from "./pull-to-refresh/usePullToRefresh";
|
|
15
|
+
export * from "./pull-to-refresh/PullToRefreshContainer";
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AAEtB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AAEtB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type Props = {
|
|
3
|
+
onRefresh: () => Promise<void>;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
className?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Drop-in wrapper that adds pull-to-refresh to its children.
|
|
10
|
+
* Desktop-safe: touch handlers never fire, indicator never shows.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <PullToRefreshContainer onRefresh={async () => { await refetch(); }}>
|
|
15
|
+
* <YourContent />
|
|
16
|
+
* </PullToRefreshContainer>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function PullToRefreshContainer({ onRefresh, disabled, className, children }: Props): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=PullToRefreshContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PullToRefreshContainer.d.ts","sourceRoot":"","sources":["../../src/pull-to-refresh/PullToRefreshContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,KAAK,KAAK,GAAG;IACX,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AA6CF;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,2CA+CzF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { usePullToRefresh } from "./usePullToRefresh";
|
|
3
|
+
const INDICATOR_SIZE = 32;
|
|
4
|
+
function SpinnerIndicator({ progress, isRefreshing }) {
|
|
5
|
+
const radius = 10;
|
|
6
|
+
const circumference = 2 * Math.PI * radius;
|
|
7
|
+
const dashOffset = circumference * (1 - progress);
|
|
8
|
+
return (_jsxs("svg", { width: INDICATOR_SIZE, height: INDICATOR_SIZE, viewBox: "0 0 24 24", style: {
|
|
9
|
+
display: "block",
|
|
10
|
+
animation: isRefreshing ? "ttt-ptr-spin 0.8s linear infinite" : "none",
|
|
11
|
+
}, children: [_jsx("circle", { cx: "12", cy: "12", r: radius, fill: "none", stroke: "currentColor", strokeWidth: "2", opacity: 0.15 }), _jsx("circle", { cx: "12", cy: "12", r: radius, fill: "none", stroke: "currentColor", strokeWidth: "2", strokeDasharray: circumference, strokeDashoffset: isRefreshing ? circumference * 0.25 : dashOffset, strokeLinecap: "round", style: { transition: isRefreshing ? "none" : "stroke-dashoffset 0.1s ease-out" }, transform: "rotate(-90 12 12)" })] }));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Drop-in wrapper that adds pull-to-refresh to its children.
|
|
15
|
+
* Desktop-safe: touch handlers never fire, indicator never shows.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <PullToRefreshContainer onRefresh={async () => { await refetch(); }}>
|
|
20
|
+
* <YourContent />
|
|
21
|
+
* </PullToRefreshContainer>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function PullToRefreshContainer({ onRefresh, disabled, className, children }) {
|
|
25
|
+
const { isRefreshing, pullProgress, pullDistance, handlers, style } = usePullToRefresh({
|
|
26
|
+
onRefresh,
|
|
27
|
+
disabled,
|
|
28
|
+
});
|
|
29
|
+
const showIndicator = pullDistance > 0 || isRefreshing;
|
|
30
|
+
const indicatorOpacity = isRefreshing ? 1 : Math.min(1, pullProgress * 1.5);
|
|
31
|
+
return (_jsxs(_Fragment, { children: [_jsx("style", { children: `@keyframes ttt-ptr-spin { to { transform: rotate(360deg); } }` }), _jsxs("div", { className: className, ...handlers, style: { position: "relative", overscrollBehaviorY: "contain" }, children: [_jsx("div", { "aria-hidden": true, style: {
|
|
32
|
+
position: "absolute",
|
|
33
|
+
top: 0,
|
|
34
|
+
left: 0,
|
|
35
|
+
right: 0,
|
|
36
|
+
display: "flex",
|
|
37
|
+
justifyContent: "center",
|
|
38
|
+
transform: `translateY(${showIndicator ? pullDistance - INDICATOR_SIZE - 8 : -INDICATOR_SIZE - 8}px)`,
|
|
39
|
+
opacity: indicatorOpacity,
|
|
40
|
+
transition: pullDistance > 0 && !isRefreshing ? "none" : "transform 0.3s ease-out, opacity 0.3s ease-out",
|
|
41
|
+
pointerEvents: "none",
|
|
42
|
+
zIndex: 10,
|
|
43
|
+
color: "var(--foreground, currentColor)",
|
|
44
|
+
}, children: _jsx(SpinnerIndicator, { progress: pullProgress, isRefreshing: isRefreshing }) }), _jsx("div", { style: style, children: children })] })] }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=PullToRefreshContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PullToRefreshContainer.js","sourceRoot":"","sources":["../../src/pull-to-refresh/PullToRefreshContainer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type CSSProperties, type RefObject, type TouchEventHandler } from "react";
|
|
2
|
+
type PullToRefreshOptions = {
|
|
3
|
+
onRefresh: () => Promise<void>;
|
|
4
|
+
/** Scroll container ref. Omit to use window scroll (document.scrollingElement). */
|
|
5
|
+
containerRef?: RefObject<HTMLElement | null>;
|
|
6
|
+
/** Pixels the user must pull before a refresh triggers (default 80). */
|
|
7
|
+
threshold?: number;
|
|
8
|
+
/** Max pixels the indicator can stretch (default 120). */
|
|
9
|
+
maxPull?: number;
|
|
10
|
+
/** Disable the gesture entirely. */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type PullToRefreshResult = {
|
|
14
|
+
isRefreshing: boolean;
|
|
15
|
+
/** 0-1 progress toward the threshold. */
|
|
16
|
+
pullProgress: number;
|
|
17
|
+
/** Current pull distance in px (for indicator positioning). */
|
|
18
|
+
pullDistance: number;
|
|
19
|
+
handlers: {
|
|
20
|
+
onTouchStart: TouchEventHandler;
|
|
21
|
+
onTouchMove: TouchEventHandler;
|
|
22
|
+
onTouchEnd: TouchEventHandler;
|
|
23
|
+
};
|
|
24
|
+
/** Apply to the content wrapper for the translateY shift. */
|
|
25
|
+
style: CSSProperties;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Pull-to-refresh gesture for mobile web.
|
|
29
|
+
*
|
|
30
|
+
* Desktop-safe: touch handlers simply never fire on non-touch devices.
|
|
31
|
+
*/
|
|
32
|
+
export declare function usePullToRefresh(opts: PullToRefreshOptions): PullToRefreshResult;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=usePullToRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePullToRefresh.d.ts","sourceRoot":"","sources":["../../src/pull-to-refresh/usePullToRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGlH,KAAK,oBAAoB,GAAG;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QACR,YAAY,EAAE,iBAAiB,CAAC;QAChC,WAAW,EAAE,iBAAiB,CAAC;QAC/B,UAAU,EAAE,iBAAiB,CAAC;KAC/B,CAAC;IACF,6DAA6D;IAC7D,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,mBAAmB,CA8FhF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from "react";
|
|
2
|
+
import { isBrowser } from "../env";
|
|
3
|
+
/**
|
|
4
|
+
* Pull-to-refresh gesture for mobile web.
|
|
5
|
+
*
|
|
6
|
+
* Desktop-safe: touch handlers simply never fire on non-touch devices.
|
|
7
|
+
*/
|
|
8
|
+
export function usePullToRefresh(opts) {
|
|
9
|
+
const { onRefresh, containerRef, threshold = 80, maxPull = 120, disabled = false, } = opts;
|
|
10
|
+
const [pullDistance, setPullDistance] = useState(0);
|
|
11
|
+
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
12
|
+
const startYRef = useRef(0);
|
|
13
|
+
const pullingRef = useRef(false);
|
|
14
|
+
const getScrollTop = useCallback(() => {
|
|
15
|
+
if (!isBrowser)
|
|
16
|
+
return 1; // pretend not at top in SSR
|
|
17
|
+
if (containerRef?.current)
|
|
18
|
+
return containerRef.current.scrollTop;
|
|
19
|
+
return document.scrollingElement?.scrollTop ?? window.scrollY;
|
|
20
|
+
}, [containerRef]);
|
|
21
|
+
const onTouchStart = useCallback((e) => {
|
|
22
|
+
if (disabled || isRefreshing)
|
|
23
|
+
return;
|
|
24
|
+
if (getScrollTop() > 0)
|
|
25
|
+
return; // not at top
|
|
26
|
+
startYRef.current = e.touches[0].clientY;
|
|
27
|
+
pullingRef.current = true;
|
|
28
|
+
}, [disabled, isRefreshing, getScrollTop]);
|
|
29
|
+
const onTouchMove = useCallback((e) => {
|
|
30
|
+
if (!pullingRef.current || disabled || isRefreshing)
|
|
31
|
+
return;
|
|
32
|
+
const currentY = e.touches[0].clientY;
|
|
33
|
+
const delta = currentY - startYRef.current;
|
|
34
|
+
if (delta <= 0) {
|
|
35
|
+
// scrolling up — cancel pull
|
|
36
|
+
setPullDistance(0);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// If the user has scrolled away from top mid-gesture, cancel
|
|
40
|
+
if (getScrollTop() > 0) {
|
|
41
|
+
pullingRef.current = false;
|
|
42
|
+
setPullDistance(0);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Apply resistance: diminishing returns past threshold
|
|
46
|
+
const clamped = Math.min(delta, maxPull);
|
|
47
|
+
const resisted = clamped < threshold
|
|
48
|
+
? clamped
|
|
49
|
+
: threshold + (clamped - threshold) * 0.4;
|
|
50
|
+
setPullDistance(resisted);
|
|
51
|
+
}, [disabled, isRefreshing, threshold, maxPull, getScrollTop]);
|
|
52
|
+
const onTouchEnd = useCallback(async () => {
|
|
53
|
+
if (!pullingRef.current)
|
|
54
|
+
return;
|
|
55
|
+
pullingRef.current = false;
|
|
56
|
+
if (pullDistance >= threshold && !isRefreshing) {
|
|
57
|
+
setIsRefreshing(true);
|
|
58
|
+
setPullDistance(threshold * 0.5); // hold at half-threshold during refresh
|
|
59
|
+
try {
|
|
60
|
+
await onRefresh();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
setIsRefreshing(false);
|
|
64
|
+
setPullDistance(0);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
setPullDistance(0);
|
|
69
|
+
}
|
|
70
|
+
}, [pullDistance, threshold, isRefreshing, onRefresh]);
|
|
71
|
+
const progress = Math.min(1, pullDistance / threshold);
|
|
72
|
+
const style = {
|
|
73
|
+
transform: pullDistance > 0 ? `translateY(${pullDistance}px)` : undefined,
|
|
74
|
+
transition: pullingRef.current ? "none" : "transform 0.3s ease-out",
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
isRefreshing,
|
|
78
|
+
pullProgress: progress,
|
|
79
|
+
pullDistance,
|
|
80
|
+
handlers: { onTouchStart, onTouchMove, onTouchEnd },
|
|
81
|
+
style,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=usePullToRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePullToRefresh.js","sourceRoot":"","sources":["../../src/pull-to-refresh/usePullToRefresh.ts"],"names":[],"mappings":"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"}
|