Skip to content

Instantly share code, notes, and snippets.

View DimitryDushkin's full-sized avatar
😀
RxJS!

Dimitry DimitryDushkin

😀
RxJS!
View GitHub Profile
export function useDraggable(draggableRef: React.RefObject<HTMLElement>) {
const drag$ = useRef<Observable<DragEvent>>();
useLayoutEffect(() => {
if (!draggableRef.current) {
return () => {};
}
const down$ = fromEvent<PointerEvent>(draggableRef.current, "pointerdown");
const move$ = fromEvent<PointerEvent>(document, "pointermove");
const up$ = fromEvent<PointerEvent>(document, "pointerup");
drag$.current = createDragObservable(up$, down$, move$);
import { marbles } from "rxjs-marbles/jest";
import { createDragObservable } from "./use-draggable";
const data = {
d: new PointerEvent('mousedown'),
m: new PointerEvent('mousedown'),
u: new PointerEvent('mousedown'),
}
describe("useDraggable", () => {
return down$.pipe(
mergeMap(e => {
startPosition = startPosition || { x: e.pageX, y: e.pageY };
return move$.pipe(
takeUntil(up$),
map(e => ({
x: e.pageX - startPosition.x,
y: e.pageY - startPosition.y
}))
);
export type DragEvent = { x: number; y: number };
export function createDragObservable<T extends PointerEvent>(
up$: Observable<T>,
down$: Observable<T>,
move$: Observable<T>
): Observable<DragEvent> {
let startPosition: DragEvent;
return down$.pipe(
mergeMap(e => {
startPosition = startPosition || { x: e.pageX, y: e.pageY };
@DimitryDushkin
DimitryDushkin / use-draggable-example.ts
Created June 5, 2019 10:49
useDraggable for React based on RxJS
import React, { useRef, useLayoutEffect } from "react";
import { fromEvent, Observable } from "rxjs";
import { takeUntil, mergeMap, map } from "rxjs/operators";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
return (
<div className="App">
@DimitryDushkin
DimitryDushkin / animated-fade.tsx
Last active January 8, 2024 10:29
React Native animated fade-in and fade-out
import React from 'react';
import {StyleProp, ViewStyle} from 'react-native';
import * as Animatable from 'react-native-animatable';
type Props = {
isVisible: boolean,
children: React.ReactNode,
style?: StyleProp<ViewStyle>,
};
@DimitryDushkin
DimitryDushkin / babel.config.js
Last active April 30, 2020 03:32
RxJS + babel 7 to reduce bundle size
const rxjs = {
Observable: "internal/Observable",
ConnectableObservable: "internal/observable/ConnectableObservable",
GroupedObservable: "internal/operators/groupBy",
observable: "internal/symbol/observable",
Subject: "internal/Subject",
BehaviorSubject: "internal/BehaviorSubject",
ReplaySubject: "internal/ReplaySubject",
AsyncSubject: "internal/AsyncSubject",
asapScheduler: "internal/scheduler/asap",
@DimitryDushkin
DimitryDushkin / single-task-queue.ts
Last active March 14, 2019 07:27
Helpful wrapper to make sure that function body is working once per multiple calls
export const SINGLE_TASK_BLOCKED = Symbol('task blocked');
export type SingleTaskBlocked = typeof SINGLE_TASK_BLOCKED;
export const singleTaskQueue = <TReturn, TArgs extends Array<any>>(func: (...args: TArgs) => Promise<TReturn>) => {
let isWorking = false;
return async (...args: TArgs): Promise<TReturn | SingleTaskBlocked> => {
if (isWorking) {
return SINGLE_TASK_BLOCKED;
}
@DimitryDushkin
DimitryDushkin / babel.config.js
Created February 3, 2019 15:31
"Modern" build for react-native application for iOS 12+ as target. Native async-await, classes and much more!
const isLegacyBuild = typeof process.env.BUNDLE_FOR_IOS === 'undefined';
const iosVersion = process.env.BUNDLE_FOR_IOS || 12;
const modernBuild = {
presets: [
[
'@babel/preset-env',
{
targets: `iOS >= ${iosVersion}`,
},
],
@DimitryDushkin
DimitryDushkin / react-native-typescrpt-templates.json
Created December 11, 2018 12:26
React Native Typescript Visual Studio Code
{
"react statefull component": {
"prefix": "react-native-statefull",
"body": [
"import React from 'react';",
"import {View, StyleSheet} from 'react-native';",
"",
"type Props = {",
"",
"};",