1import { Animated } from 'react-native';
2
3import { ImageTestProps, ImageTestEventHandler } from './types';
4
5type LogCallback = (message: string) => void;
6
7function round(num: number): number {
8  return Math.round(num * 1000) / 1000;
9}
10
11function range(
12  start: number,
13  end: number,
14  animValue?: Animated.Value,
15  flatten?: boolean
16): number | Animated.AnimatedInterpolation<number> | string {
17  if (animValue) {
18    if (flatten) {
19      // @ts-ignore
20      if (animValue.__isNative) {
21        //return `(native: ${start}..${end})`;
22        return '(native)';
23      } else {
24        // @ts-ignore
25        const val = animValue.__getValue();
26        return round((end - start) * val + start);
27      }
28    } else {
29      return animValue.interpolate({
30        inputRange: [0, 1],
31        outputRange: [start, end],
32      });
33    }
34  } else {
35    return round((end - start) * 0.5 + start);
36  }
37}
38
39let firstTimeStamp: number = 0;
40
41function event(name: string, logCallback?: LogCallback): ImageTestEventHandler {
42  return (...args) => {
43    try {
44      const event = args[0];
45      const { timeStamp, nativeEvent } = event;
46      firstTimeStamp = firstTimeStamp || timeStamp;
47      const msec = (timeStamp - firstTimeStamp) % 60000;
48      const message = `${msec} ${name}: ${JSON.stringify(nativeEvent)}`;
49      if (logCallback) logCallback(message);
50    } catch (err) {
51      const message = `${name}: ${err.message}`;
52      if (logCallback) logCallback(message);
53    }
54  };
55}
56
57export function resolveProps(
58  props: ImageTestProps,
59  animValue?: Animated.Value,
60  flatten?: boolean,
61  logCallback?: LogCallback
62): ImageTestProps {
63  if (typeof props === 'function') {
64    return props({
65      range: (start: number, end: number) => range(start, end, animValue, flatten),
66      event: (name: string) => event(name, logCallback),
67    });
68  } else {
69    return props;
70  }
71}
72