location.js 4.4 KB
import {all, call, delay, fork, put, takeLatest} from 'redux-saga/effects';
import axios from 'axios';
import {
    setStartLocationSaga,
    setEndLocationSaga,
    setKickLocationsSaga,
    setKickRouteSaga,

    setStartLocationReducer,
    setEndLocationReducer,
    setKickLocationsReducer,
    setKickRouteReducer,
} from "../reducers/location";
import {
    setInfoReducer,
    resetInfoReducer,
} from '../reducers/info';
import env from '../env';

function setStartLocationAPI(data) {
    const {startTextLocation} = data;
    return axios.get(`${env.HTTP_OR_HTTPS}://${env.HOST}:${env.PORT}/api/findLocation/${encodeURIComponent(startTextLocation)}`);
}
function* setStartLocation(action) {
    try {
        const res = yield call(setStartLocationAPI, action.data);
        const {location} = res.data;
        yield put({
            type: setStartLocationReducer,
            data: {location}
        })
    } catch (e) {
        console.error(e);
        if (e.response && e.response.data.info) {
            const {info} = e.response.data;
            yield put({
                type: setInfoReducer,
                data: {info}
            });
            yield delay(3000);
            yield put({
                type: resetInfoReducer,
            })
        }
    }
}
function* watchSetStartLocation() {
    yield takeLatest(setStartLocationSaga, setStartLocation);
}

function setEndLocationAPI(data) {
    const {endTextLocation} = data;
    return axios.get(`${env.HTTP_OR_HTTPS}://${env.HOST}:${env.PORT}/api/findLocation/${encodeURIComponent(endTextLocation)}`);
}
function* setEndLocation(action) {
    try {
        const res = yield call(setEndLocationAPI, action.data);
        const {location} = res.data;
        yield put({
            type: setEndLocationReducer,
            data: {location}
        });
    } catch (e) {
        console.error(e);
        if (e.response && e.response.data.info) {
            const {info} = e.response.data;
            yield put({
                type: setInfoReducer,
                data: {info}
            });
            yield delay(3000);
            yield put({
                type: resetInfoReducer,
            })
        }
    }
}
function* watchSetEndLocation() {
    yield takeLatest(setEndLocationSaga, setEndLocation);
}

function setKickLocationsAPI(data) {
    const {startLocation, distance, serviceStates} = data;
    return axios.post(`${env.HTTP_OR_HTTPS}://${env.HOST}:${env.PORT}/api/findKicks`, {
        startLocation, distance, serviceStates
    });
}
function* setKickLocations(action) {
    try {
        const res = yield call(setKickLocationsAPI, action.data);
        const {kickLocationsArray} = res.data;
        yield put({
            type: setKickLocationsReducer,
            data: {kickLocationsArray}
        })
    } catch (e) {
        console.error(e);
        if (e.response && e.response.data.info) {
            const {info} = e.response.data;
            yield put({
                type: setInfoReducer,
                data: {info}
            });
            yield delay(3000);
            yield put({
                type: resetInfoReducer,
            })
        }
    }
}
function* watchSetKickLocations() {
    yield takeLatest(setKickLocationsSaga, setKickLocations);
}

function setKickRouteAPI(data) {
    const {startLocation, endLocation, personalVelocity} = data;
    return axios.post(`${env.HTTP_OR_HTTPS}://${env.HOST}:${env.PORT}/api/setKickRoute`, {
        startLocation,
        endLocation,
        personalVelocity,
    });
}
function* setKickRoute(action) {
    try {
        const res = yield call(setKickRouteAPI, action.data);
        const {lane, distance, time} = res.data;
        yield put({
            type: setKickRouteReducer,
            data: {lane, distance, time}
        })
    } catch (e) {
        console.error(e);
        if (e.response && e.response.data.info) {
            const {info} = e.response.data;
            yield put({
                type: setInfoReducer,
                data: {info}
            });
            yield delay(3000);
            yield put({
                type: resetInfoReducer,
            })
        }
    }
}
function* watchSetKickRoute() {
    yield takeLatest(setKickRouteSaga, setKickRoute);
}

export default function* locationSaga() {
    yield all([
        fork(watchSetStartLocation),
        fork(watchSetEndLocation),
        fork(watchSetKickLocations),
        fork(watchSetKickRoute),
    ]);
};