diff --git a/commafeed-tweaks.js b/commafeed-tweaks.js new file mode 100644 index 0000000..ccb6628 --- /dev/null +++ b/commafeed-tweaks.js @@ -0,0 +1,59 @@ +/** + * commafeed-tweaks.js + * + * Client-side behavior tweaks for CommaFeed (Athou/commafeed), applied from + * outside the app bundle. + * + * Install (either): + * 1. Paste this file's contents into Settings -> Custom code -> Custom JS. + * CommaFeed serves it as `custom_js.js` and loads it after the app starts. + * 2. Serve this file alongside the app and add + * + * to index.html. + * + * All listeners attach to `window`, so load timing relative to React doesn't matter. + */ +(function () { + 'use strict' + + if (window.__commafeedTweaksInstalled) return + window.__commafeedTweaksInstalled = true + + const log = (...args) => console.debug('[commafeed-tweaks]', ...args) + + /** + * Disable swipe-right-to-open the mobile sidebar. + * + * Upstream (pages/app/Layout.tsx) wraps the AppShell in a react-swipeable Box + * whose touch listeners live on that element and open the menu on a rightward + * swipe. We catch touchmove on window in the capture phase and stop propagation + * of rightward-horizontal moves so they never reach that element. No + * preventDefault, so native scrolling is untouched; leftward swipes still pass + * through, so swipe-left-to-close keeps working. + */ + function disableSwipeToOpenMenu() { + let startX = 0 + let startY = 0 + + window.addEventListener('touchstart', e => { + const t = e.touches[0] + if (!t) return + startX = t.clientX + startY = t.clientY + }, { capture: true, passive: true }) + + window.addEventListener('touchmove', e => { + const t = e.touches[0] + if (!t) return + const dx = t.clientX - startX + const dy = t.clientY - startY + if (dx > 0 && Math.abs(dx) > Math.abs(dy)) { + e.stopPropagation() + } + }, { capture: true, passive: true }) + + log('swipe-to-open menu disabled') + } + + disableSwipeToOpenMenu() +})()