Skip to content

Instantly share code, notes, and snippets.

@OliverJAsh
Last active October 19, 2017 17:45
Show Gist options
  • Save OliverJAsh/93e3a308d74bba48d80b84ee14f6fdac to your computer and use it in GitHub Desktop.
Save OliverJAsh/93e3a308d74bba48d80b84ee14f6fdac to your computer and use it in GitHub Desktop.
Hide likes from Twitter Lite timeline
"use strict";
// https://github.com/gcanti/fp-ts/blob/eec336fada51bf34f7e68592fe1dc348ca5ef873/src/function.ts#L127
const pipe = (...fns) => (seed) => fns.reduce((val, fn) => fn(val), seed);
const isNotUndefined = (maybeT) => maybeT !== undefined;
const mapMaybe = (f, maybeT) => isNotUndefined(maybeT) ? f(maybeT) : maybeT;
const normalizeMaybe = (nullMaybe) => nullMaybe === null ? undefined : nullMaybe;
const forEachMaybe = (f, maybeT) => {
if (isNotUndefined(maybeT))
f(maybeT);
};
const getOrElseMaybe = (fallback, maybeT) => isNotUndefined(maybeT) ? maybeT : fallback();
// End lib
const go = () => {
const maybeTimeline = normalizeMaybe(document.querySelector('[aria-label="Timeline: Your Home Timeline"]'));
const maybeTweets = mapMaybe(timeline => Array.from(timeline.querySelectorAll('[role="article"]')), maybeTimeline);
const checkIsTweetLiked = pipe((el) => el.querySelector('a'), normalizeMaybe, maybe => mapMaybe(el => el.textContent, maybe), maybe => mapMaybe(x => normalizeMaybe(x), maybe), maybe => mapMaybe(textContent => / liked$/.test(textContent), maybe), maybe => getOrElseMaybe(() => false, maybe));
const hide = (el) => {
el.style.visibility = 'hidden';
};
forEachMaybe(tweets => tweets.filter(checkIsTweetLiked).forEach(hide), maybeTweets);
};
go();
window.addEventListener('scroll', go);
// https://github.com/gcanti/fp-ts/blob/eec336fada51bf34f7e68592fe1dc348ca5ef873/src/function.ts#L127
const pipe: {
<A, B, C>(ab: (a: A) => B, bc: (b: B) => C): (a: A) => C;
<A, B, C, D>(ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): (
a: A,
) => D;
<A, B, C, D, E>(
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
): (a: A) => E;
<A, B, C, D, E, F>(
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
): (a: A) => F;
<A, B, C, D, E, F, G>(
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
): (a: A) => G;
} = (...fns: Function[]) => (seed: any) =>
fns.reduce((val, fn) => fn(val), seed);
// https://github.com/OliverJAsh/simple-maybe/blob/0aaaa0b931d44be7510f07cc5d4221de0e6befae/src/index.ts
type Maybe<T> = undefined | T;
const isNotUndefined = <T>(maybeT: Maybe<T>): maybeT is T =>
maybeT !== undefined;
const mapMaybe = <T, B>(f: (t: T) => B, maybeT: Maybe<T>): Maybe<B> =>
isNotUndefined(maybeT) ? f(maybeT) : maybeT;
const normalizeMaybe = <T>(nullMaybe: T | null): Maybe<T> =>
nullMaybe === null ? undefined : nullMaybe;
const forEachMaybe = <T>(f: (t: T) => void, maybeT: Maybe<T>): void => {
if (isNotUndefined(maybeT)) f(maybeT);
};
const getOrElseMaybe = <T>(fallback: () => T, maybeT: Maybe<T>): T =>
isNotUndefined(maybeT) ? maybeT : fallback();
// End lib
const go = () => {
const maybeTimeline = normalizeMaybe(
document.querySelector('[aria-label="Timeline: Your Home Timeline"]'),
);
const maybeTweets = mapMaybe(
timeline =>
Array.from(
timeline.querySelectorAll<HTMLElement>('[role="article"]'),
),
maybeTimeline,
);
const checkIsTweetLiked = pipe(
(el: HTMLElement) => el.querySelector('a'),
normalizeMaybe,
maybe => mapMaybe(el => el.textContent, maybe),
maybe => mapMaybe(x => normalizeMaybe(x), maybe),
maybe => mapMaybe(textContent => / liked$/.test(textContent), maybe),
maybe => getOrElseMaybe(() => false, maybe),
);
const hide = (el: HTMLElement) => {
el.style.visibility = 'hidden';
};
forEachMaybe(
tweets => tweets.filter(checkIsTweetLiked).forEach(hide),
maybeTweets,
);
};
go();
window.addEventListener('scroll', go);
@FOXARCO
Copy link

FOXARCO commented Oct 19, 2017

can you edit this to hide tweets written with specific language ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment