refun
Version:
A collection of React Hook-enabled functions that compose harmoniously with each other. Similar to `recompose`, but:
1 lines • 3.93 kB
Source Map (JSON)
{"version":3,"sources":["map-safe-request-animation-frame.ts"],"names":["useRef","useEffect","requestAnimationFrame","cancelAnimationFrame","UNDEFINED","EMPTY_ARRAY","EMPTY_OBJECT","NOOP","mapSafeRequestAnimationFrameFactory","requestAnimationFrameFn","cancelAnimationFrameFn","propName","props","timerIdsRef","setSafeRafRef","useEffectFnRef","current","Set","cb","timerId","delete","add","forEach","id","clear","mapSafeRequestAnimationFrame"],"mappings":";AAAA,SAASA,MAAT,EAAiBC,SAAjB,QAAkC,OAAlC;AACA,SAASC,qBAAT,EAAgCC,oBAAhC,EAAsDC,SAAtD,EAAiEC,WAAjE,EAA8EC,YAA9E,EAA4FC,IAA5F,QAAwG,MAAxG;AAKA,OAAO,IAAMC,mCAAmC,GAAG,SAAtCA,mCAAsC,CAACC,uBAAD,EAAoCC,sBAApC;AAAA,SACjD,UAAiCC,QAAjC;AAAA,WACE,UAACC,KAAD,EAAoE;AAClE,UAAMC,WAAW,GAAGb,MAAM,CAAWM,YAAX,CAA1B;AACA,UAAMQ,aAAa,GAAGd,MAAM,EAA5B;AACA,UAAMe,cAAc,GAAGf,MAAM,EAA7B;;AAEA,UAAIc,aAAa,CAACE,OAAd,KAA0BZ,SAA9B,EAAyC;AACvCS,QAAAA,WAAW,CAACG,OAAZ,GAAsB,IAAIC,GAAJ,EAAtB;;AAEAH,QAAAA,aAAa,CAACE,OAAd,GAAyB,UAACE,EAAD,EAAQ;AAC/B;AACA,cAAIL,WAAW,CAACG,OAAZ,KAAwBV,YAA5B,EAA0C;AACxC,mBAAOC,IAAP;AACD;;AAED,cAAMY,OAAO,GAAGV,uBAAuB,CAAC,YAAM;AAC5CI,YAAAA,WAAW,CAACG,OAAZ,CAAoBI,MAApB,CAA2BD,OAA3B;AACAD,YAAAA,EAAE;AACH,WAHsC,CAAvC;AAKAL,UAAAA,WAAW,CAACG,OAAZ,CAAoBK,GAApB,CAAwBF,OAAxB;AAEA,iBAAO,YAAM;AACXT,YAAAA,sBAAsB,CAACS,OAAD,CAAtB;AACAN,YAAAA,WAAW,CAACG,OAAZ,CAAoBI,MAApB,CAA2BD,OAA3B;AACD,WAHD;AAID,SAjBD;;AAmBAJ,QAAAA,cAAc,CAACC,OAAf,GAAyB;AAAA,iBAAM,YAAM;AACnCH,YAAAA,WAAW,CAACG,OAAZ,CAAoBM,OAApB,CAA4B,UAACC,EAAD;AAAA,qBAAQb,sBAAsB,CAACa,EAAD,CAA9B;AAAA,aAA5B;AACAV,YAAAA,WAAW,CAACG,OAAZ,CAAoBQ,KAApB,GAFmC,CAGnC;;AACAX,YAAAA,WAAW,CAACG,OAAZ,GAAsBV,YAAtB;AACD,WALwB;AAAA,SAAzB;AAMD;;AAEDL,MAAAA,SAAS,CAACc,cAAc,CAACC,OAAhB,EAA0BX,WAA1B,CAAT,CAnCkE,CAqClE;;AACA,+BACKO,KADL,sBAEGD,QAFH,EAEcG,aAAa,CAACE,OAF5B;AAID,KA3CH;AAAA,GADiD;AAAA,CAA5C;AA8CP,OAAO,IAAMS,4BAA4B,GAAGjB,mCAAmC,CAACN,qBAAD,EAAwBC,oBAAxB,CAAxE","sourcesContent":["import { useRef, useEffect } from 'react'\nimport { requestAnimationFrame, cancelAnimationFrame, UNDEFINED, EMPTY_ARRAY, EMPTY_OBJECT, NOOP } from 'tsfn'\nimport type { TExtend } from 'tsfn'\n\nexport type TSafeRequestAnimationFrame = (cb: () => void) => () => void\n\nexport const mapSafeRequestAnimationFrameFactory = (requestAnimationFrameFn: Function, cancelAnimationFrameFn: Function) =>\n <P extends {}, K extends string>(propName: K) =>\n (props: P): TExtend<P, { [k in K]: TSafeRequestAnimationFrame }> => {\n const timerIdsRef = useRef<Set<any>>(EMPTY_OBJECT)\n const setSafeRafRef = useRef<TSafeRequestAnimationFrame>()\n const useEffectFnRef = useRef<() => () => void>()\n\n if (setSafeRafRef.current === UNDEFINED) {\n timerIdsRef.current = new Set()\n\n setSafeRafRef.current = ((cb) => {\n // check if component has been unmounted\n if (timerIdsRef.current === EMPTY_OBJECT) {\n return NOOP\n }\n\n const timerId = requestAnimationFrameFn(() => {\n timerIdsRef.current.delete(timerId)\n cb()\n })\n\n timerIdsRef.current.add(timerId)\n\n return () => {\n cancelAnimationFrameFn(timerId)\n timerIdsRef.current.delete(timerId)\n }\n }) as TSafeRequestAnimationFrame\n\n useEffectFnRef.current = () => () => {\n timerIdsRef.current.forEach((id) => cancelAnimationFrameFn(id))\n timerIdsRef.current.clear()\n // indicates that component has been unmounted\n timerIdsRef.current = EMPTY_OBJECT\n }\n }\n\n useEffect(useEffectFnRef.current!, EMPTY_ARRAY)\n\n // FIXME https://github.com/microsoft/TypeScript/issues/13948\n return {\n ...props,\n [propName]: setSafeRafRef.current,\n } as any\n }\n\nexport const mapSafeRequestAnimationFrame = mapSafeRequestAnimationFrameFactory(requestAnimationFrame, cancelAnimationFrame)\n"],"file":"map-safe-request-animation-frame.js"}