diff options
Diffstat (limited to 'sdnr/wt/odlux/framework/src/middleware')
-rw-r--r-- | sdnr/wt/odlux/framework/src/middleware/api.ts | 55 | ||||
-rw-r--r-- | sdnr/wt/odlux/framework/src/middleware/logger.ts | 17 | ||||
-rw-r--r-- | sdnr/wt/odlux/framework/src/middleware/navigation.ts | 53 | ||||
-rw-r--r-- | sdnr/wt/odlux/framework/src/middleware/thunk.ts | 18 |
4 files changed, 143 insertions, 0 deletions
diff --git a/sdnr/wt/odlux/framework/src/middleware/api.ts b/sdnr/wt/odlux/framework/src/middleware/api.ts new file mode 100644 index 000000000..190505760 --- /dev/null +++ b/sdnr/wt/odlux/framework/src/middleware/api.ts @@ -0,0 +1,55 @@ +import { Action, IActionHandler } from '../flux/action'; +import { MiddlewareArg } from '../flux/middleware'; +import { Dispatch } from '../flux/store'; + +import { IApplicationStoreState } from '../store/applicationStore'; +import { AddErrorInfoAction, ErrorInfo } from '../actions/errorActions'; + +const baseUrl = `${ window.location.origin }${ window.location.pathname }`; + +export class ApiAction<TResult, TSuccessAction extends Action & { result: TResult }> extends Action { + constructor(public endpoint: string, public successAction: { new(result: TResult): TSuccessAction }, public authenticate: boolean = false) { + super(); + } +} + +export const apiMiddleware = (store: MiddlewareArg<IApplicationStoreState>) => (next: Dispatch) => <A extends Action>(action: A) => { + + // So the middleware doesn't get applied to every single action + if (action instanceof ApiAction) { + const user = store && store.getState().framework.authenticationState.user; + const token = user && user.token || null; + let config = { headers: {} }; + + if (action.authenticate) { + if (token) { + config = { + ...config, + headers: { + ...config.headers, + // 'Authorization': `Bearer ${ token }` + authorization: "Basic YWRtaW46YWRtaW4=" + } + } + } else { + return next(new AddErrorInfoAction({ message: 'Please login to continue.' })); + } + } + + fetch(baseUrl + action.endpoint.replace(/\/{2,}/, '/'), config) + .then(response => + response.json().then(data => ({ data, response })) + ) + .then(result => { + next(new action.successAction(result.data)); + }) + .catch((error: any) => { + next(new AddErrorInfoAction((error instanceof Error) ? { error: error } : { message: error.toString() })); + }); + } + + // let all actions pass + return next(action); +} + +export default apiMiddleware;
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/middleware/logger.ts b/sdnr/wt/odlux/framework/src/middleware/logger.ts new file mode 100644 index 000000000..e47484fbf --- /dev/null +++ b/sdnr/wt/odlux/framework/src/middleware/logger.ts @@ -0,0 +1,17 @@ +import { Dispatch } from '../flux/store'; +import { MiddlewareApi } from '../store/applicationStore'; + + +function createLoggerMiddleware() { + return function logger({ getState }: MiddlewareApi) { + return (next: Dispatch): Dispatch => action => { + console.log('will dispatch', action); + const returnValue = next(action); + console.log('state after dispatch', getState()); + return returnValue; + }; + } +} + +export const logger = createLoggerMiddleware(); +export default logger;
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/middleware/navigation.ts b/sdnr/wt/odlux/framework/src/middleware/navigation.ts new file mode 100644 index 000000000..758b51845 --- /dev/null +++ b/sdnr/wt/odlux/framework/src/middleware/navigation.ts @@ -0,0 +1,53 @@ +import { Location, History, createHashHistory } from "history"; + +import { ApplicationStore } from "../store/applicationStore"; +import { Dispatch } from '../flux/store'; + +import { LocationChanged, NavigateToApplication } from "../actions/navigationActions"; +import { PushAction, ReplaceAction, GoAction, GoBackAction, GoForwardeAction } from '../actions/navigationActions'; + +import applicationManager from "../services/applicationManager"; + +const routerMiddlewareCreator = (history: History) => () => (next: Dispatch): Dispatch => (action) => { + + if (action instanceof NavigateToApplication) { + const application = applicationManager.applications && applicationManager.applications[action.applicationName]; + if (application) { + const href = `/${ application.path || application.name }${ action.href ? '/' + action.href : '' }`.replace(/\/{2,}/i, '/'); + if (action.replace) { + history.replace(href, action.state); + } else { + history.push(href, action.state); + } + } + } else if (action instanceof PushAction) { + history.push(action.href, action.state); + } else if (action instanceof ReplaceAction) { + history.replace(action.href, action.state); + } else if (action instanceof GoAction) { + history.go(action.index); + } else if (action instanceof GoBackAction) { + history.goBack(); + } else if (action instanceof GoForwardeAction) { + history.goForward(); + } else { + return next(action); + } + return action; +}; + +function startListener(history: History, store: ApplicationStore) { + store.dispatch(new LocationChanged(history.location.pathname, history.location.search, history.location.hash)); + history.listen((location: Location) => { + store.dispatch(new LocationChanged(location.pathname, location.search, location.hash)); + }); +} + +const history = createHashHistory(); + +export function startHistoryListener(store: ApplicationStore) { + startListener(history, store); +} + +export const routerMiddleware = routerMiddlewareCreator(history); +export default routerMiddleware; diff --git a/sdnr/wt/odlux/framework/src/middleware/thunk.ts b/sdnr/wt/odlux/framework/src/middleware/thunk.ts new file mode 100644 index 000000000..3844485ec --- /dev/null +++ b/sdnr/wt/odlux/framework/src/middleware/thunk.ts @@ -0,0 +1,18 @@ + +import { Dispatch } from '../flux/store'; +import { MiddlewareApi } from '../store/applicationStore'; + +function createThunkMiddleware() { + return ({ dispatch, getState }: MiddlewareApi) => + (next : Dispatch) : Dispatch => + action => { + if (typeof action === 'function') { + return action(dispatch, getState); + } + + return next(action); + }; +} + +export const thunk = createThunkMiddleware(); +export default thunk;
\ No newline at end of file |