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 / 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 / singleton.ts
Created November 16, 2018 09:25
TypeScript singleton (swift style)
export default class SomeSingleton {
private static privateShared: Api;
public static get shared(): Api {
if (!SomeSingleton.privateShared) {
SomeSingleton.privateShared = new SomeSingleton();
}
return SomeSingleton.privateShared;
}
@DimitryDushkin
DimitryDushkin / configs.js
Created October 2, 2018 14:19
React Native 0.57 + Babel 7 + Typescript + Jest
// babel.config.js
module.exports = {
"presets": [
"module:metro-react-native-babel-preset",
],
"plugins": [
["module-resolver", {
"root": ["./src"],
"extensions": [".js", ".ts", ".tsx", ".ios.js", ".android.js"]
}],