aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/components/PullToRefresh.tsx
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-08-06 00:12:19 +0200
committerAriel Costas Guerrero <ariel@costas.dev>2025-08-06 00:12:19 +0200
commit5cc27f852b02446659e0ab85305916c9f5e5a5f0 (patch)
tree622636a2a7eade5442a3efb1726d822657d30295 /src/frontend/app/components/PullToRefresh.tsx
parentb04fd7d33d07f9eddea2eb53e1389d5ca5453413 (diff)
feat: Implement pull-to-refresh functionality across various components
- Added `PullToRefresh` component to enable pull-to-refresh behavior in `StopList` and `Estimates` pages. - Integrated `usePullToRefresh` hook to manage pull-to-refresh state and actions. - Created `UpdateNotification` component to inform users of available updates from the service worker. - Enhanced service worker management with `ServiceWorkerManager` class for better update handling and caching strategies. - Updated CSS styles for new components and improved layout for better user experience. - Refactored API caching logic in service worker to handle multiple endpoints and dynamic cache expiration. - Added auto-refresh functionality for estimates data to keep information up-to-date.
Diffstat (limited to 'src/frontend/app/components/PullToRefresh.tsx')
-rw-r--r--src/frontend/app/components/PullToRefresh.tsx53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/frontend/app/components/PullToRefresh.tsx b/src/frontend/app/components/PullToRefresh.tsx
new file mode 100644
index 0000000..47a6f03
--- /dev/null
+++ b/src/frontend/app/components/PullToRefresh.tsx
@@ -0,0 +1,53 @@
+import { type ReactNode } from "react";
+import { RotateCcw } from "lucide-react";
+import "./PullToRefresh.css";
+
+interface PullToRefreshIndicatorProps {
+ pullDistance: number;
+ isRefreshing: boolean;
+ canRefresh: boolean;
+ children: ReactNode;
+}
+
+export function PullToRefreshIndicator({
+ pullDistance,
+ isRefreshing,
+ canRefresh,
+ children,
+}: PullToRefreshIndicatorProps) {
+ const opacity = Math.min(pullDistance / 60, 1);
+ const rotation = isRefreshing ? 360 : pullDistance * 4;
+ const scale = Math.min(0.5 + (pullDistance / 120), 1);
+
+ return (
+ <div className="pull-to-refresh-container">
+ <div
+ className="pull-to-refresh-indicator"
+ style={{
+ transform: `translateY(${Math.min(pullDistance, 80)}px)`,
+ opacity: opacity,
+ }}
+ >
+ <div
+ className={`pull-to-refresh-icon ${isRefreshing ? 'spinning' : ''} ${canRefresh ? 'ready' : ''}`}
+ style={{
+ transform: `rotate(${rotation}deg) scale(${scale})`,
+ }}
+ >
+ <RotateCcw size={24} />
+ </div>
+ <div className="pull-to-refresh-text">
+ {isRefreshing ? "Actualizando..." : canRefresh ? "Suelta para actualizar" : "Arrastra para actualizar"}
+ </div>
+ </div>
+ <div
+ className="pull-to-refresh-content"
+ style={{
+ transform: `translateY(${Math.min(pullDistance * 0.5, 40)}px)`,
+ }}
+ >
+ {children}
+ </div>
+ </div>
+ );
+}