All files / src/affix AffixManager.ts

52.17% Statements 12/23
37.5% Branches 3/8
36.36% Functions 4/11
63.16% Lines 12/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67                        1x                   1x     2x           2x 14x       14x 14x     2x                 2x   2x       2x 2x                    
import { AffixTargetType } from "./AffixProps";
 
interface AffixManager {
  target: AffixTargetType;
  changeHandlers: {
    [affixId: string]: (event: Event) => void;
  };
  eventhandlers: {
    [event: string]: (event: Event) => void;
  };
}
 
const Events = [
  "resize",
  "scroll",
  "touchstart",
  "touchmove",
  "touchend",
  "pageshow",
  "load",
];
 
let managers: AffixManager[] = [];
 
function createManager(target: AffixTargetType): AffixManager {
  const manager: AffixManager = {
    target,
    changeHandlers: {},
    eventhandlers: {},
  };
 
  Events.forEach(type => {
    const listener = (event: Event) =>
      Object.values(manager.changeHandlers).forEach(
        handler => handler && handler(event)
      );
    target.addEventListener(type, listener);
    manager.eventhandlers[type] = listener;
  });
 
  return manager;
}
 
export function addListener(
  target: AffixTargetType,
  affixId: string,
  onChange: (event: Event) => void
): void {
  const manager =
    managers.find(manager => manager.target === target) ||
    createManager(target);
  manager.changeHandlers[affixId] = onChange;
}
 
export function removeListener(target: AffixTargetType, affixId: string) {
  const manager = managers.find(manager => manager.target === target);
  Iif (manager) {
    manager.changeHandlers[affixId] = undefined;
    if (Object.values(manager.changeHandlers).filter(i => !!i).length === 0) {
      Events.forEach(type =>
        target.removeEventListener(type, manager.eventhandlers[type])
      );
      managers = managers.filter(manager => manager.target !== target);
    }
  }
}