2021-02-04 23:05:46 -08:00
|
|
|
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
2021-02-03 14:27:32 -08:00
|
|
|
import Client from '../client';
|
2021-02-01 22:15:32 -08:00
|
|
|
import MockClient from '../client/mock-client';
|
2021-02-03 14:27:32 -08:00
|
|
|
import RestClient from '../client/rest-client';
|
2020-12-25 21:39:54 -08:00
|
|
|
|
2021-02-03 14:27:32 -08:00
|
|
|
interface ConfigInfo {
|
|
|
|
apiBaseUrl: string
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
|
|
|
|
2021-02-03 14:27:32 -08:00
|
|
|
class RutimeConfig {
|
|
|
|
private config: ConfigInfo;
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
load() {
|
|
|
|
|
|
|
|
// Config can be inserted in the html page to define the global properties ...
|
|
|
|
this.config = (window as any).serverconfig;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
buildClient(): Client {
|
|
|
|
let result: Client;
|
|
|
|
if (this.config) {
|
2021-02-04 23:05:46 -08:00
|
|
|
result = new RestClient(this.config.apiBaseUrl, () => { sessionExpired() });
|
2021-02-03 14:27:32 -08:00
|
|
|
console.log("Service using rest client. " + JSON.stringify(this.config))
|
|
|
|
|
|
|
|
} else {
|
|
|
|
console.log("Warning:Service using mockservice client")
|
|
|
|
result = new MockClient();
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
2021-02-03 14:27:32 -08:00
|
|
|
return result;
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-04 23:05:46 -08:00
|
|
|
export interface ClientStatus {
|
|
|
|
state: 'healthy' | 'session-expired';
|
|
|
|
msg?: string
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface ClientState {
|
2021-02-01 22:15:32 -08:00
|
|
|
instance: Client;
|
2021-02-04 23:05:46 -08:00
|
|
|
status: ClientStatus;
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
|
|
|
|
2021-02-04 23:05:46 -08:00
|
|
|
const initialState: ClientState = {
|
|
|
|
instance: new RutimeConfig().load().buildClient(),
|
|
|
|
status: { state: 'healthy' }
|
2020-12-25 21:39:54 -08:00
|
|
|
};
|
|
|
|
|
2021-02-04 23:05:46 -08:00
|
|
|
export const clientSlice = createSlice({
|
|
|
|
name: "client",
|
2020-12-25 21:39:54 -08:00
|
|
|
initialState: initialState,
|
|
|
|
reducers: {
|
2021-02-04 23:05:46 -08:00
|
|
|
sessionExpired(state, action: PayloadAction<void>) {
|
|
|
|
state.status = { state: 'session-expired', msg: 'Sessions has expired. You need to login again.' }
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2021-02-01 22:15:32 -08:00
|
|
|
export const activeInstance = (state: any): Client => {
|
2021-02-04 23:05:46 -08:00
|
|
|
return state.client.instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const activeInstanceStatus = (state: any): ClientStatus => {
|
|
|
|
return state.client.status;
|
2020-12-25 21:39:54 -08:00
|
|
|
}
|
2021-02-03 14:27:32 -08:00
|
|
|
|
2021-02-04 23:05:46 -08:00
|
|
|
export const { sessionExpired } = clientSlice.actions;
|
|
|
|
export default clientSlice.reducer;
|
2020-12-25 21:39:54 -08:00
|
|
|
|