Skip to content
Snippets Groups Projects
device.routine.ts 1.99 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { NetworkElementServiceGetAllFlattenedApiArg, api } from '@api/api'
    import { setDevices } from '@component/devices/reducer/device.reducer'
    import { createAsyncThunk } from '@reduxjs/toolkit'
    
    import { addRoutine } from '@shared/reducer/routine.reducer'
    
    import { setUser } from '@shared/reducer/user.reducer'
    
    import { Category, CategoryType } from '@shared/types/category.type'
    
    import { RootState } from 'src/stores'
    import { startListening } from '../../../stores/middleware/listener.middleware'
    
    
    export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices'
    
    
    // continously fetch devices
    startListening({
        actionCreator: setUser,
        effect: async (_, listenerApi) => {
    
            listenerApi.dispatch(
                addRoutine({
                    thunk: fetchDevicesThunk,
                    category: Category.DEVICE as CategoryType,
                    payload: {},
                })
            )
    
    const FETCH_DEVICES_INTERVAL = 15000 // in ms
    
    export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => {
    
        const { user } = thunkApi.getState() as RootState
    
        if (!user.user?.roles) {
    
            throw new Error('Background device fetching failed! User data is missing. Reload page or logout and login again')
    
        const payload: NetworkElementServiceGetAllFlattenedApiArg = {
    
            pid: Object.keys(user.user.roles)[0],
    
            timestamp: new Date().getTime().toString(),
        }
    
    
        const subscription = thunkApi.dispatch(
            api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, {
                subscriptionOptions: {
                    pollingInterval: FETCH_DEVICES_INTERVAL,
                    skipPollingIfUnfocused: true,
                },
            })
        )
    
        return subscription
    })
    
    
    // save fetched devices
    startListening({
    
        predicate: (action) =>
            api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action),
    
        effect: async (action, listenerApi) => {
    
            listenerApi.dispatch(setDevices(action.payload.mne))