grafana/public/app/features/variables/state/transactionReducer.ts
Josh Hunt 3c6e0e8ef8
Chore: ESlint import order (#44959)
* Add and configure eslint-plugin-import

* Fix the lint:ts npm command

* Autofix + prettier all the files

* Manually fix remaining files

* Move jquery code in jest-setup to external file to safely reorder imports

* Resolve issue caused by circular dependencies within Prometheus

* Update .betterer.results

* Fix missing // @ts-ignore

* ignore iconBundle.ts

* Fix missing // @ts-ignore
2022-04-22 14:33:13 +01:00

71 lines
2.0 KiB
TypeScript

import { AnyAction, createSlice, PayloadAction } from '@reduxjs/toolkit';
import { TransactionStatus } from '../types';
import {
addVariable,
changeVariableOrder,
changeVariableProp,
changeVariableType,
duplicateVariable,
removeVariable,
} from './sharedReducer';
export interface TransactionState {
uid: string | undefined | null;
status: TransactionStatus;
isDirty: boolean;
}
export const initialTransactionState: TransactionState = {
uid: null,
status: TransactionStatus.NotStarted,
isDirty: false,
};
const transactionSlice = createSlice({
name: 'templating/transaction',
initialState: initialTransactionState,
reducers: {
variablesInitTransaction: (state, action: PayloadAction<{ uid: string | undefined | null }>) => {
state.uid = action.payload.uid;
state.status = TransactionStatus.Fetching;
},
variablesCompleteTransaction: (state, action: PayloadAction<{ uid: string | undefined | null }>) => {
if (state.uid !== action.payload.uid) {
// this might be an action from a cancelled batch
return;
}
state.status = TransactionStatus.Completed;
},
variablesClearTransaction: (state, action: PayloadAction<undefined>) => {
state.uid = null;
state.status = TransactionStatus.NotStarted;
state.isDirty = false;
},
},
extraReducers: (builder) =>
builder.addMatcher(actionAffectsDirtyState, (state, action) => {
if (state.status === TransactionStatus.Completed) {
state.isDirty = true;
}
}),
});
function actionAffectsDirtyState(action: AnyAction): boolean {
return (
removeVariable.match(action) ||
addVariable.match(action) ||
changeVariableProp.match(action) ||
changeVariableOrder.match(action) ||
duplicateVariable.match(action) ||
changeVariableType.match(action)
);
}
export const { variablesInitTransaction, variablesClearTransaction, variablesCompleteTransaction } =
transactionSlice.actions;
export const transactionReducer = transactionSlice.reducer;