ligo/tools/webide/packages/client/src/redux/editor.ts
2020-02-24 19:29:11 +00:00

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;
}
};