85 lines
2.0 KiB
TypeScript
85 lines
2.0 KiB
TypeScript
import { ActionType as ExamplesActionType, ChangeSelectedAction as ChangeSelectedExampleAction } from './examples';
|
|
import { Language } from './types';
|
|
|
|
export enum ActionType {
|
|
ChangeLanguage = 'editor-change-language',
|
|
ChangeCode = 'editor-change-code',
|
|
ChangeDirty = 'editor-change-dirty',
|
|
ChangeTitle = 'editor-change-title'
|
|
}
|
|
|
|
export interface EditorState {
|
|
language: Language;
|
|
code: string;
|
|
title: string;
|
|
dirty: boolean;
|
|
}
|
|
|
|
export class ChangeLanguageAction {
|
|
public readonly type = ActionType.ChangeLanguage;
|
|
constructor(public payload: EditorState['language']) {}
|
|
}
|
|
|
|
export class ChangeCodeAction {
|
|
public readonly type = ActionType.ChangeCode;
|
|
constructor(public payload: EditorState['code']) {}
|
|
}
|
|
|
|
export class ChangeDirtyAction {
|
|
public readonly type = ActionType.ChangeDirty;
|
|
constructor(public payload: EditorState['dirty']) {}
|
|
}
|
|
|
|
export class ChangeTitleAction {
|
|
public readonly type = ActionType.ChangeTitle;
|
|
constructor(public payload: EditorState['title']) {}
|
|
}
|
|
|
|
type Action =
|
|
| ChangeCodeAction
|
|
| ChangeLanguageAction
|
|
| ChangeDirtyAction
|
|
| ChangeTitleAction
|
|
| ChangeSelectedExampleAction;
|
|
|
|
const DEFAULT_STATE: EditorState = {
|
|
language: Language.CameLigo,
|
|
code: '',
|
|
title: '',
|
|
dirty: false
|
|
};
|
|
|
|
export default (state = DEFAULT_STATE, action: Action): EditorState => {
|
|
switch (action.type) {
|
|
case ExamplesActionType.ChangeSelected:
|
|
return {
|
|
...state,
|
|
...(!action.payload
|
|
? DEFAULT_STATE
|
|
: { ...action.payload.editor, title: action.payload.name })
|
|
};
|
|
case ActionType.ChangeLanguage:
|
|
return {
|
|
...state,
|
|
language: action.payload
|
|
};
|
|
case ActionType.ChangeCode:
|
|
return {
|
|
...state,
|
|
code: action.payload
|
|
};
|
|
case ActionType.ChangeDirty:
|
|
return {
|
|
...state,
|
|
dirty: action.payload
|
|
};
|
|
case ActionType.ChangeTitle:
|
|
return {
|
|
...state,
|
|
title: action.payload
|
|
};
|
|
default:
|
|
return state;
|
|
}
|
|
};
|