import React, { useState, useRef, useCallback, useEffect } from 'react' import { useTranslation } from '../i18n' interface PullToRefreshProps { onRefresh: () => Promise children: React.ReactNode className?: string } export default function PullToRefresh({ onRefresh, children, className = '' }: PullToRefreshProps) { const { t } = useTranslation() const [refreshing, setRefreshing] = useState(false) const [pullDistance, setPullDistance] = useState(0) const containerRef = useRef(null) const startY = useRef(0) const pulling = useRef(false) const refreshThreshold = 60 const handleTouchStart = useCallback((e: React.TouchEvent) => { if (containerRef.current && containerRef.current.scrollTop <= 0) { startY.current = e.touches[0].clientY pulling.current = true } }, []) const handleTouchMove = useCallback((e: React.TouchEvent) => { if (!pulling.current || refreshing) return const delta = e.touches[0].clientY - startY.current if (delta > 0) { setPullDistance(Math.min(delta * 0.4, 100)) } }, [refreshing]) const handleTouchEnd = useCallback(async () => { if (!pulling.current) return pulling.current = false if (pullDistance >= refreshThreshold && !refreshing) { setRefreshing(true) try { await onRefresh() } finally { setRefreshing(false) setPullDistance(0) } } else { setPullDistance(0) } }, [pullDistance, refreshing, onRefresh]) useEffect(() => { if (!refreshing && pullDistance === 0) return if (!refreshing && pullDistance < refreshThreshold) { const timer = setTimeout(() => setPullDistance(0), 300) return () => clearTimeout(timer) } }, [refreshing, pullDistance]) return (
{refreshing ? ( <> {t('components.pullToRefresh.refreshing')} ) : pullDistance >= refreshThreshold ? ( <> {t('components.pullToRefresh.release')} ) : ( <> {t('components.pullToRefresh.pullDown')} )}
{children}
) }