// composer.ts // Copyright (C) 2020 Dwayne Harris // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . import { Action } from 'redux' import { setEntities } from '../actions/entities' import { startRequest, finishRequest } from '../actions/requests' import { apiFetch } from '../api' import { normalize } from '../utils/normalization' import { AppThunkAction, Installation, RequestKey, EntityType, Settings } from '../types' export interface SetInstallationsAction extends Action { type: 'COMPOSER_SET_INSTALLATIONS' payload: string[] } export interface SetSelectedInstallationAction extends Action { type: 'COMPOSER_SET_SELECTED_INSTALLATION' payload?: string } export interface SetHeightAction extends Action { type: 'COMPOSER_SET_HEIGHT', payload: number } export interface SetErrorAction extends Action { type: 'COMPOSER_SET_ERROR', payload?: string } export type ComposerActions = SetInstallationsAction | SetSelectedInstallationAction | SetHeightAction | SetErrorAction export const setInstallations = (installations: string[]): SetInstallationsAction => ({ type: 'COMPOSER_SET_INSTALLATIONS', payload: installations, }) export const setSelectedInstallation = (installation?: string): SetSelectedInstallationAction => ({ type: 'COMPOSER_SET_SELECTED_INSTALLATION', payload: installation, }) export const setHeight = (height: number): SetHeightAction => ({ type: 'COMPOSER_SET_HEIGHT', payload: height, }) export const setError = (error?: string): SetErrorAction => ({ type: 'COMPOSER_SET_ERROR', payload: error, }) interface FetchInstallationsResponse { installations: Installation[] } export const fetchInstallations = (): AppThunkAction => async dispatch => { dispatch(startRequest(RequestKey.FetchInstallations)) try { const response = await apiFetch({ path: '/v1/installations', }) const result = normalize(response.installations, EntityType.Installation) dispatch(setEntities(result.entities)) dispatch(setInstallations(result.keys)) dispatch(finishRequest(RequestKey.FetchInstallations, true)) } catch (err) { dispatch(finishRequest(RequestKey.FetchInstallations, false)) throw err } } export const saveInstallationSettings = (id: string, settings: Settings): AppThunkAction => async dispatch => { dispatch(startRequest(RequestKey.UpdateInstallationSettings)) try { await apiFetch({ path: `/v1/installation/${id}/settings`, method: 'put', body: { settings }, }) dispatch(finishRequest(RequestKey.UpdateInstallationSettings, true)) } catch (err) { dispatch(finishRequest(RequestKey.UpdateInstallationSettings, false)) throw err } }