export function useSensors()

in src/hooks/common.ts [110:276]


export function useSensors(): [
  ItemProps[],
  EventManagementFN,
  EventManagementFN,
] {
  const [sensors, setSensors] = useState<ItemProps[]>(
    (
      [
        {
          id: AVAILABLE_SENSORS.ACCELEROMETER,
          name: 'Accelerometer',
          dataType: 'object',
          icon: {
            name: 'rocket-outline',
            type: Platform.select({
              android: 'material-community',
              default: 'ionicon',
            }),
          },
          enabled: true, // TODO: auto-enable based on settings,
          simulated: defaults.emulator,
        },
        {
          id: AVAILABLE_SENSORS.GYROSCOPE,
          name: 'Gyroscope',
          dataType: 'object',

          enabled: true, // TODO: auto-enable based on settings
          icon: {
            name: 'compass-outline',
            type: Platform.select({
              android: 'material-community',
              default: 'ionicon',
            }),
          },
          simulated: defaults.emulator,
        },
        {
          id: AVAILABLE_SENSORS.MAGNETOMETER,
          name: 'Magnetometer',
          dataType: 'object',
          enabled: true, // TODO: auto-enable based on settings
          icon: {
            name: 'magnet-outline',
            type: 'ionicon',
          },
          simulated: defaults.emulator,
        },
        {
          id: AVAILABLE_SENSORS.BAROMETER,
          dataType: 'number',
          name: 'Barometer',
          enabled: true, // TODO: auto-enable based on settings
          icon: {
            name: 'weather-partly-cloudy',
            type: 'material-community',
          },
          simulated: defaults.emulator,
        },
        {
          id: AVAILABLE_SENSORS.GEOLOCATION,
          name: 'Geolocation',
          dataType: 'object',
          enabled: true, // TODO: auto-enable based on settings
          icon: {
            name: 'location-outline',
            type: 'ionicon',
          },
          simulated: defaults.emulator,
        },
        {
          id: AVAILABLE_SENSORS.BATTERY,
          name: 'Battery level',
          dataType: 'number',
          enabled: true, // TODO: auto-enable based on settings,
          simulated: defaults.emulator,
          icon: {
            name: Platform.select({
              android: 'battery-medium',
              default: 'battery-half-sharp',
            }) as string,
            type: Platform.select({
              android: 'material-community',
              default: 'ionicon',
            }),
          },
        },
      ] as ItemProps[]
    ).map<ItemProps>(s => ({
      ...s,
      enable: (val?: boolean) => {
        const enabled = val !== undefined ? val : true;
        SensorMap[s.id].enable(enabled);
        setSensors(currentSensors => {
          return currentSensors.map(sensor => {
            if (sensor.id === s.id) {
              return {
                ...sensor,
                enabled,
              };
            }
            return sensor;
          });
        });
      },
      sendInterval: (value: number) => {
        SensorMap[s.id].sendInterval(value);
      },
    })),
  );

  const dataHandler = (id: string, value: any) => {
    setSensors(currentSensors => {
      return currentSensors.map(sensor => {
        if (sensor.id === id) {
          return {
            ...sensor,
            value,
          };
        }
        return sensor;
      });
    });
  };
  const availableHandler = (id: string) => {
    setSensors(currentSensors => {
      const currentIndex = currentSensors.findIndex(s => s.id === id);
      if (currentIndex > -1) {
        currentSensors.splice(currentIndex, 1);
      }
      return currentSensors;
    });
  };

  const addListener = useCallback(
    (id: string, event: string, handler: (...args: any) => void) => {
      SensorMap[id].addListener.bind(SensorMap[id])(event, handler);
    },
    [],
  );

  const removeListener = useCallback(
    (id: string, event: string, handler: (...args: any) => void) => {
      SensorMap[id].removeListener.bind(SensorMap[id])(event, handler);
    },
    [],
  );

  useEffect(() => {
    sensors.forEach(s => {
      addListener(s.id, DATA_AVAILABLE_EVENT, dataHandler);
      addListener(s.id, SENSOR_UNAVAILABLE_EVENT, availableHandler);
      SensorMap[s.id].simulate(s.simulated);
      SensorMap[s.id].enable(true);
    });
    return () => {
      sensors.forEach(s => {
        removeListener(s.id, DATA_AVAILABLE_EVENT, dataHandler);
        removeListener(s.id, SENSOR_UNAVAILABLE_EVENT, availableHandler);
        SensorMap[s.id].enable(false);
      });
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  return [sensors, addListener, removeListener];
}