') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - davidhsing/react-native-pull-refresh: pull-refresh is a pure javascript pull-refresh library for react-native. Support iOS、Android、Web · GitHub
Skip to content

Repository files navigation

@unikue/react-native-pull-refresh

react-native pull refresh on iOS, Android and Web

⚡Milestones

  • Bump package versions to latest
  • Fix PullRefreshonScroll event

💪🏻 Support

Platformsolved
iOS🔥 Perfect
Android😂 Bottom response is bad
Web😭 Pulling and scrolling cant switch smoothly

💥 Compatibility

react-native-pull-refreshreact-native
1.2.x0.85.x
1.3.x0.86.x

⚠️ Warning

react-native-pull-refresh Only support wrapper Animated.ScrollView and Animated.FlatList

not support nested PullRefresh!

Installation

It relies on react-native-gesture-handler and react-native-reanimated

so please install them before you use this package

yarn install react-native-gesture-hanlder react-native-reanimated
yarn install @unikue/react-native-pull-refresh

Usage

import{PullRefresh}from'@unikue/react-native-pull-refresh';// ...<PullRefreshonPulldownRefresh={downLoader}onPullupRefresh={upLoader}pulldownHeight={80}pullupHeight={100}pullupEnabled={true}><Animated.FlatListdata={[]}renderItem={()=>null}/>{/* or*/}<Animated.ScrollView>{/* children */}</Animated.ScrollView></PullRefresh>

Example

ios-exampleios-example
iOSAndroid

Props

propstypedescriptionDefault
pulldownEnabledBooleanWhether pulldown refresh is enabledtrue
pullupEnabledBooleanWhether pullup refresh is enabledtrue
pulldownHeightNumberThe height of the pulldown loading component, used to determine pulldown state120
pullupHeightNumberThe height of the pullup loading component, used to determine pullup state120
pulldownLoadingComponentCustom pulldown loading component<PulldownLoading />
pullupLoadingComponentCustom pullup loading component<PullupLoading />
containerFactorNumberThe container factor is used to adjust the height of the refresh judgment0.5
pullingFactorNumberDetermine the coefficient of pulling state length2.2
onPulldownRefreshFunctionCallback of pulldown refresh, load data with it()=>void
onPullupRefreshFunctionCallback of pullup refresh, load data with it()=>void

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT

About

pull-refresh is a pure javascript pull-refresh library for react-native. Support iOS、Android、Web

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages