From 0c76f3cdf649a6bdbaf9862d0f9a6c83781b6c21 Mon Sep 17 00:00:00 2001 From: Matei Adriel Date: Mon, 22 Jul 2019 15:22:15 +0300 Subject: [PATCH] internalisation --- docs/assets/files.png | Bin 0 -> 107485 bytes src/main.tsx | 2 + src/modules/core/components/Canvas.tsx | 4 - .../components/CreateSimulationButton.tsx | 28 ++++++ src/modules/core/components/LogicGates.tsx | 93 ++++++++++++++++++ .../core/components/OpenSimulation.tsx | 77 +++++++++++---- src/modules/core/components/Sidebar.tsx | 62 +++++++----- src/modules/core/constants.ts | 18 ++++ .../components/CreateSimulation.tsx | 13 ++- .../helpers/handleCreating.ts | 3 + .../stores/CreateSimulationStore.ts | 5 +- src/modules/internalisation/constants.ts | 12 +++ .../internalisation/helpers/useLanguage.ts | 16 +++ .../internalisation/stores/currentLanguage.ts | 53 ++++++++++ .../subjects/currentLanguageSubject.ts | 7 ++ .../internalisation/translations/english.ts | 31 ++++++ .../internalisation/translations/romanian.ts | 32 ++++++ .../types/TranslationInterface.ts | 31 ++++++ .../types/supportedLanguages.ts | 4 + .../modals/styles/mixins/modal-container.scss | 2 +- src/modules/saving/helpers/cloneState.ts | 5 + src/modules/saving/helpers/dumpSimulation.ts | 16 +++ src/modules/saving/helpers/fromState.ts | 8 +- src/modules/saving/helpers/getState.ts | 4 + .../saving/helpers/initBaseTemplates.ts | 10 ++ src/modules/saving/helpers/initSimulation.ts | 13 ++- src/modules/saving/helpers/save.ts | 18 +++- src/modules/saving/helpers/switchTo.ts | 42 ++++++++ src/modules/saving/stores/currentStore.ts | 4 + src/modules/saving/stores/saveStore.ts | 3 + src/modules/saving/stores/templateStore.ts | 3 + .../classes/SimulationRenderer.ts | 4 +- .../toasts/components/ToastContent.scss | 1 + 33 files changed, 561 insertions(+), 63 deletions(-) create mode 100644 docs/assets/files.png create mode 100644 src/modules/core/components/CreateSimulationButton.tsx create mode 100644 src/modules/core/components/LogicGates.tsx create mode 100644 src/modules/internalisation/constants.ts create mode 100644 src/modules/internalisation/helpers/useLanguage.ts create mode 100644 src/modules/internalisation/stores/currentLanguage.ts create mode 100644 src/modules/internalisation/subjects/currentLanguageSubject.ts create mode 100644 src/modules/internalisation/translations/english.ts create mode 100644 src/modules/internalisation/translations/romanian.ts create mode 100644 src/modules/internalisation/types/TranslationInterface.ts create mode 100644 src/modules/internalisation/types/supportedLanguages.ts create mode 100644 src/modules/saving/helpers/dumpSimulation.ts create mode 100644 src/modules/saving/helpers/switchTo.ts diff --git a/docs/assets/files.png b/docs/assets/files.png new file mode 100644 index 0000000000000000000000000000000000000000..85b582a708d0520049c818e7b3144b405ff8865c GIT binary patch literal 107485 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 z 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 O$Ri~!#S#UZ7ykzxYGRN8 literal 0 HcmV?d00001 diff --git a/src/main.tsx b/src/main.tsx index 008d7fc..cb7e5d9 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -6,6 +6,8 @@ import { handleErrors } from './modules/errors/helpers/handleErrors' import { initKeyBindings } from './modules/keybindings/helpers/initialiseKeyBindings' import { initBaseTemplates } from './modules/saving/helpers/initBaseTemplates' +console.clear() + handleErrors() initKeyBindings() initBaseTemplates() diff --git a/src/modules/core/components/Canvas.tsx b/src/modules/core/components/Canvas.tsx index 8092163..e575fb4 100644 --- a/src/modules/core/components/Canvas.tsx +++ b/src/modules/core/components/Canvas.tsx @@ -1,11 +1,9 @@ import React, { Component, createRef, Ref, RefObject } from 'react' import FluidCanvas from './FluidCanvas' import loop from 'mainloop.js' -import { Gate } from '../../simulation/classes/Gate' import { SimulationRenderer } from '../../simulationRenderer/classes/SimulationRenderer' import { renderSimulation } from '../../simulationRenderer/helpers/renderSimulation' import { updateSimulation } from '../../simulationRenderer/helpers/updateSimulation' -import { addGate } from '../../simulation/helpers/addGate' import { rendererSubject } from '../subjects/rendererSubject' class Canvas extends Component { @@ -18,8 +16,6 @@ class Canvas extends Component { rendererSubject.next(this.renderer) - addGate(this.renderer.simulation, 'not') - loop.setDraw(() => { if (this.renderingContext) { renderSimulation(this.renderingContext, this.renderer) diff --git a/src/modules/core/components/CreateSimulationButton.tsx b/src/modules/core/components/CreateSimulationButton.tsx new file mode 100644 index 0000000..7ce8441 --- /dev/null +++ b/src/modules/core/components/CreateSimulationButton.tsx @@ -0,0 +1,28 @@ +import React from 'react' +import ListItem from '@material-ui/core/ListItem' +import ListItemIcon from '@material-ui/core/ListItemIcon' +import ListItemText from '@material-ui/core/ListItemText' +import Icon from '@material-ui/core/Icon' +import { handleCreating } from '../../create-simulation/helpers/handleCreating' +import { useTranslation } from '../../internalisation/helpers/useLanguage' + +/** + * The component for the 'Create simulation' button from the top of the sidebar. + * + * The only way i found to apply a different color to the ListItem button was + * by using !important in the scss. + */ +const CreateSimulationButton = () => { + const translation = useTranslation() + + return ( + + + note_add + + {translation.sidebar.createSimulation} + + ) +} + +export default CreateSimulationButton diff --git a/src/modules/core/components/LogicGates.tsx b/src/modules/core/components/LogicGates.tsx new file mode 100644 index 0000000..dbf5f0f --- /dev/null +++ b/src/modules/core/components/LogicGates.tsx @@ -0,0 +1,93 @@ +import React, { useState } from 'react' +import ListItem from '@material-ui/core/ListItem' +import ListItemIcon from '@material-ui/core/ListItemIcon' +import ListItemText from '@material-ui/core/ListItemText' +import Menu from '@material-ui/core/Menu' +import MenuItem from '@material-ui/core/MenuItem' +import Icon from '@material-ui/core/Icon' +import Typography from '@material-ui/core/Typography' +import { BehaviorSubject } from 'rxjs' +import { useObservable } from 'rxjs-hooks' +import { switchTo } from '../../saving/helpers/switchTo' +import { SimulationError } from '../../errors/classes/SimulationError' +import { templateStore } from '../../saving/stores/templateStore' +import { useTranslation } from '../../internalisation/helpers/useLanguage' + +/** + * Subject to make React update the dom when new gates are stored + */ +const allGatesSubject = new BehaviorSubject([]) + +/** + * Triggers a dom update by pushing a new value to the + * useObservable hook inside the React component. + * + * It also has the side effect of sorting the template names. + */ +const updateTemplateList = () => { + allGatesSubject.next(templateStore.ls().sort()) +} + +/** + * Component wich contains the sidebar 'Open simulation' button + * + * @throws SimulationError if the data about a simulation cant be found in localStorage + */ +const LogicGates = () => { + const [anchorEl, setAnchorEl] = useState(null) + const simulations = useObservable(() => allGatesSubject, []) + + const translation = useTranslation() + + const handleClose = () => { + setAnchorEl(null) + } + + return ( + <> + { + updateTemplateList() + setAnchorEl(event.currentTarget) + }} + > + + memory + + {translation.sidebar.logicGates} + + + + {simulations.map((simulationName, index) => { + const simulationData = templateStore.get(simulationName) + + if (!simulationData) { + throw new SimulationError( + `Cannot get data for simulation ${simulationName}` + ) + } + + return ( + { + switchTo(simulationName) + handleClose() + }} + > + {simulationName} + + ) + })} + + + ) +} + +export default LogicGates diff --git a/src/modules/core/components/OpenSimulation.tsx b/src/modules/core/components/OpenSimulation.tsx index 905bef7..6cbe577 100644 --- a/src/modules/core/components/OpenSimulation.tsx +++ b/src/modules/core/components/OpenSimulation.tsx @@ -5,24 +5,48 @@ import ListItemText from '@material-ui/core/ListItemText' import Menu from '@material-ui/core/Menu' import MenuItem from '@material-ui/core/MenuItem' import Icon from '@material-ui/core/Icon' +import Typography from '@material-ui/core/Typography' import { saveStore } from '../../saving/stores/saveStore' import { BehaviorSubject } from 'rxjs' import { useObservable } from 'rxjs-hooks' -import { rendererSubject } from '../subjects/rendererSubject' -import { currentStore } from '../../saving/stores/currentStore' +import { switchTo } from '../../saving/helpers/switchTo' +import { SimulationError } from '../../errors/classes/SimulationError' +import { icons } from '../constants' +import { useTranslation } from '../../internalisation/helpers/useLanguage' +/** + * Returns a list with the names of all saved simulations + */ const allSimulations = () => { return saveStore.ls() } + +/** + * Subject to make React update the dom when new simulations are stored + */ const allSimulationSubject = new BehaviorSubject([]) + +/** + * Triggers a dom update by pushing a new value to the + * useObservable hook inside the React component. + * + * It also has the side effect of sorting the simulation names. + */ const updateSimulationList = () => { - allSimulationSubject.next(allSimulations()) + allSimulationSubject.next(allSimulations().sort()) } +/** + * Component wich contains the sidebar 'Open simulation' button + * + * @throws SimulationError if the data about a simulation cant be found in localStorage + */ const OpenSimulation = () => { const [anchorEl, setAnchorEl] = useState(null) const simulations = useObservable(() => allSimulationSubject, []) + const translation = useTranslation() + const handleClose = () => { setAnchorEl(null) } @@ -39,7 +63,9 @@ const OpenSimulation = () => { folder_open - Open simulation + + {translation.sidebar.openSimulation} + { open={Boolean(anchorEl)} onClose={handleClose} > - {simulations.map((simulation, index) => ( - { - if (rendererSubject.value) { - const renderer = rendererSubject.value + {simulations.map((simulationName, index) => { + const simulationData = saveStore.get(simulationName) - currentStore.set(simulation) - renderer.reloadSave() - } + if (!simulationData) { + throw new SimulationError( + `Cannot get data for simulation ${simulationName}` + ) + } - handleClose() - }} - > - {simulation} - - ))} + return ( + { + switchTo(simulationName) + handleClose() + }} + > + + + { + icons.simulationMode[ + simulationData.simulation.mode + ] + } + + + {simulationName} + + ) + })} ) diff --git a/src/modules/core/components/Sidebar.tsx b/src/modules/core/components/Sidebar.tsx index 9f8232c..32c356c 100644 --- a/src/modules/core/components/Sidebar.tsx +++ b/src/modules/core/components/Sidebar.tsx @@ -1,35 +1,51 @@ -import React, { useState } from 'react' +import React from 'react' import Drawer from '@material-ui/core/Drawer' import List from '@material-ui/core/List' -import ListItem from '@material-ui/core/ListItem' -import ListItemIcon from '@material-ui/core/ListItemIcon' -import ListItemText from '@material-ui/core/ListItemText' -import Icon from '@material-ui/core/Icon' -import { handleCreating } from '../../create-simulation/helpers/handleCreating' -import { makeStyles, Theme, createStyles } from '@material-ui/core/styles' import OpenSimulation from './OpenSimulation' +import CreateSimulationButton from './CreateSimulationButton' +import LogicGates from './LogicGates' +import { makeStyles, createStyles } from '@material-ui/core/styles' +/** + * The width of the sidebar + */ +const sidebarWidth = 240 -const drawerWidth = 240 -const useStyles = makeStyles((theme: Theme) => +/** + * The z-index of the sidebar. + */ +const sidebarZIndex = 5 + +/** + * The styles for the sidebar component + */ +const useStyles = makeStyles( createStyles({ + // This class is applied on the sidebar container root: { display: 'flex', - zIndex: 5 + zIndex: sidebarZIndex }, + + // This is the class of the actual sidebar drawer: { - width: drawerWidth, - flexShrink: 0, - zIndex: 5 + width: sidebarWidth, + zIndex: sidebarZIndex, + flexShrink: 0 }, + + // This is the class for the surface of the sidebar drawerPaper: { - padding: '4px', - width: drawerWidth, background: `#111111`, - zIndex: 5 + padding: '4px', + width: sidebarWidth, + zIndex: sidebarZIndex } }) ) +/** + * The sidebar component + */ const Sidebar = () => { const classes = useStyles() @@ -44,18 +60,10 @@ const Sidebar = () => { paper: classes.drawerPaper }} > - - - - note_add - - Create simulation - + + + diff --git a/src/modules/core/constants.ts b/src/modules/core/constants.ts index c7c9eb1..5174c13 100644 --- a/src/modules/core/constants.ts +++ b/src/modules/core/constants.ts @@ -1,5 +1,6 @@ import { createMuiTheme } from '@material-ui/core/styles' import { red, deepPurple } from '@material-ui/core/colors' +import { simulationMode } from '../saving/types/SimulationSave' export const theme = createMuiTheme({ palette: { @@ -8,3 +9,20 @@ export const theme = createMuiTheme({ secondary: red } }) + +/** + * Used to get intellisense from visual studio code + */ +export interface IconInterface { + simulationMode: Record +} + +/** + * Stores the names of icons reuseed truogh the app + */ +export const icons: IconInterface = { + simulationMode: { + project: 'gamepad', + ic: 'memory' + } +} diff --git a/src/modules/create-simulation/components/CreateSimulation.tsx b/src/modules/create-simulation/components/CreateSimulation.tsx index 74b4e3f..72784ba 100644 --- a/src/modules/create-simulation/components/CreateSimulation.tsx +++ b/src/modules/create-simulation/components/CreateSimulation.tsx @@ -4,21 +4,19 @@ import { useObservable } from 'rxjs-hooks' import { CreateSimulationStore } from '../stores/CreateSimulationStore' import { simulationMode } from '../../saving/types/SimulationSave' import Icon from '@material-ui/core/Icon' +import { useTranslation } from '../../internalisation/helpers/useLanguage' export interface CreateSimulationOption { mode: simulationMode icon: string - name: string } export const createSimulationOptions: CreateSimulationOption[] = [ { - name: 'project', mode: 'project', icon: 'gamepad' }, { - name: 'integrated circuit', icon: 'memory', mode: 'ic' } @@ -26,6 +24,7 @@ export const createSimulationOptions: CreateSimulationOption[] = [ const CreateSimulation = () => { const open = useObservable(() => CreateSimulationStore.data.open, false) + const translation = useTranslation() const closeModal = () => { CreateSimulationStore.actions.next('quit') @@ -38,7 +37,7 @@ const CreateSimulation = () => { onClick={closeModal} >
- What kind of simulation do you want to create? + {translation.createSimulation.mode.question}
@@ -57,7 +56,11 @@ const CreateSimulation = () => { {option.icon}
- {option.name} + { + translation.createSimulation.mode.options[ + option.mode + ] + }
))} diff --git a/src/modules/create-simulation/helpers/handleCreating.ts b/src/modules/create-simulation/helpers/handleCreating.ts index 0c9cb92..7fa4a3f 100644 --- a/src/modules/create-simulation/helpers/handleCreating.ts +++ b/src/modules/create-simulation/helpers/handleCreating.ts @@ -1,5 +1,6 @@ import { CreateSimulationStore } from '../stores/CreateSimulationStore' import { initSimulation } from '../../saving/helpers/initSimulation' +import { switchTo } from '../../saving/helpers/switchTo' export const handleCreating = async () => { const options = await CreateSimulationStore.create() @@ -8,5 +9,7 @@ export const handleCreating = async () => { const simulation = initSimulation(options.name, options.mode) + switchTo(options.name) + return simulation } diff --git a/src/modules/create-simulation/stores/CreateSimulationStore.ts b/src/modules/create-simulation/stores/CreateSimulationStore.ts index c4546fe..93016a1 100644 --- a/src/modules/create-simulation/stores/CreateSimulationStore.ts +++ b/src/modules/create-simulation/stores/CreateSimulationStore.ts @@ -2,6 +2,7 @@ import { BehaviorSubject, Subject } from 'rxjs' import { take } from 'rxjs/operators' import { simulationMode } from '../../saving/types/SimulationSave' import { InputStore } from '../../input/stores/InputStore' +import { CurrentLanguage } from '../../internalisation/stores/currentLanguage' export type CreateSimulationStoreAction = 'quit' | 'submit' @@ -13,6 +14,8 @@ export const CreateSimulationStore = { .pipe(take(1)) .toPromise() + const translation = CurrentLanguage.getTranslation() + CreateSimulationStore.close() if (action === 'quit') { @@ -20,7 +23,7 @@ export const CreateSimulationStore = { } const name = await InputStore.get( - 'What do you want your simulation to be called?' + translation.createSimulation.name.question ) if (!name) { diff --git a/src/modules/internalisation/constants.ts b/src/modules/internalisation/constants.ts new file mode 100644 index 0000000..c7f743a --- /dev/null +++ b/src/modules/internalisation/constants.ts @@ -0,0 +1,12 @@ +import { supportedLanguages } from './types/supportedLanguages' +import { Translation } from './types/TranslationInterface' +import { EnglishTranslation } from './translations/english' +import { RomanianTranslation } from './translations/romanian' + +/** + * Object with all translations + */ +export const translations: Record = { + english: EnglishTranslation, + ['română']: RomanianTranslation +} diff --git a/src/modules/internalisation/helpers/useLanguage.ts b/src/modules/internalisation/helpers/useLanguage.ts new file mode 100644 index 0000000..2439bd1 --- /dev/null +++ b/src/modules/internalisation/helpers/useLanguage.ts @@ -0,0 +1,16 @@ +import { useObservable } from 'rxjs-hooks' +import currentLanguageSubject from '../subjects/currentLanguageSubject' +import { translations } from '../constants' + +/** + * Hook to get the current translation + */ +export const useTranslation = () => { + const currentLanguage = useObservable( + () => currentLanguageSubject, + 'english' + ) + const translation = translations[currentLanguage] + + return translation +} diff --git a/src/modules/internalisation/stores/currentLanguage.ts b/src/modules/internalisation/stores/currentLanguage.ts new file mode 100644 index 0000000..c2cada7 --- /dev/null +++ b/src/modules/internalisation/stores/currentLanguage.ts @@ -0,0 +1,53 @@ +import { supportedLanguages } from '../types/supportedLanguages' +import { LocalStore } from '../../storage/classes/LocalStore' +import currentLanguageSubject from './../subjects/currentLanguageSubject' +import { SimulationError } from '../../errors/classes/SimulationError' +import { translations } from '../constants' + +/** + * Local store containing the current selected language + */ +export const CurrentLanguageLocalStore = new LocalStore( + 'language' +) + +// This makes sure the language isnt undefined +if (!CurrentLanguageLocalStore.get()) { + CurrentLanguageLocalStore.set('english') +} + +currentLanguageSubject.next(CurrentLanguageLocalStore.get() || 'english') + +/** + * The preffered interface for interacting with CurrentLanguageLocalStore + */ +const CurrentLanguage = { + set(name: supportedLanguages) { + CurrentLanguageLocalStore.set(name) + currentLanguageSubject.next(name) + }, + + /** + * Used to get the current selected store + * + * @throws SimulationError if the language cannot be found + */ + get() { + const language = CurrentLanguageLocalStore.get() + + if (!language) { + throw new SimulationError(`Current language not found`) + } + + return language + }, + + /** + * Helper to get the current translation outside React components + */ + getTranslation() { + return translations[CurrentLanguage.get()] + } +} + +export { CurrentLanguage } diff --git a/src/modules/internalisation/subjects/currentLanguageSubject.ts b/src/modules/internalisation/subjects/currentLanguageSubject.ts new file mode 100644 index 0000000..219fde6 --- /dev/null +++ b/src/modules/internalisation/subjects/currentLanguageSubject.ts @@ -0,0 +1,7 @@ +import { BehaviorSubject } from 'rxjs' +import { supportedLanguages } from '../types/supportedLanguages' + +/** + * Subject with the current language + */ +export default new BehaviorSubject('english') diff --git a/src/modules/internalisation/translations/english.ts b/src/modules/internalisation/translations/english.ts new file mode 100644 index 0000000..1c784fd --- /dev/null +++ b/src/modules/internalisation/translations/english.ts @@ -0,0 +1,31 @@ +import { Translation } from '../types/TranslationInterface' + +/** + * The enaglish translation + */ +export const EnglishTranslation: Translation = { + language: 'english', + sidebar: { + createSimulation: 'Create simulation', + logicGates: 'Logic gates', + openSimulation: 'Open simulations' + }, + createSimulation: { + mode: { + question: 'What kind of simulation do you want to create?', + options: { + ic: 'Integrated circuit', + project: 'Project' + } + }, + name: { + question: 'What do you want your simulation to be called?' + } + }, + messages: { + createdSimulation: name => `Succesfully created simulation '${name}'`, + switchedToSimulation: name => + `Succesfully switched to simulation '${name}'`, + savedSimulation: name => `Succesfully saved simulation '${name}'` + } +} diff --git a/src/modules/internalisation/translations/romanian.ts b/src/modules/internalisation/translations/romanian.ts new file mode 100644 index 0000000..333eca4 --- /dev/null +++ b/src/modules/internalisation/translations/romanian.ts @@ -0,0 +1,32 @@ +import { Translation } from '../types/TranslationInterface' + +/** + * The romanian translation + */ +export const RomanianTranslation: Translation = { + language: 'română', + sidebar: { + createSimulation: 'Creează o simulație', + openSimulation: 'Deschide o simulație', + logicGates: 'Porți logice' + }, + createSimulation: { + mode: { + question: 'Ce fel de simulație vrei să creiezi?', + options: { + ic: 'Circuit integrat', + project: 'Proiect' + } + }, + name: { + question: 'Cum vrei să numești simulația?' + } + }, + messages: { + createdSimulation: name => + `Simulația '${name}' a fost creiată cu succes`, + switchedToSimulation: name => + `Simulația '${name}' a fost deschisă cu succes`, + savedSimulation: name => `Simulația '${name}' a fost salvată cu succes` + } +} diff --git a/src/modules/internalisation/types/TranslationInterface.ts b/src/modules/internalisation/types/TranslationInterface.ts new file mode 100644 index 0000000..4995db1 --- /dev/null +++ b/src/modules/internalisation/types/TranslationInterface.ts @@ -0,0 +1,31 @@ +import { supportedLanguages } from './supportedLanguages' +import { simulationMode } from '../../saving/types/SimulationSave' + +export type SentenceFactory = (...names: T) => string +export type NameSentence = SentenceFactory<[string]> + +/** + * The interface all translations need to follow + */ +export interface Translation { + language: supportedLanguages + sidebar: { + createSimulation: string + openSimulation: string + logicGates: string + } + createSimulation: { + mode: { + question: string + options: Record + } + name: { + question: string + } + } + messages: { + createdSimulation: NameSentence + switchedToSimulation: NameSentence + savedSimulation: NameSentence + } +} diff --git a/src/modules/internalisation/types/supportedLanguages.ts b/src/modules/internalisation/types/supportedLanguages.ts new file mode 100644 index 0000000..fadf838 --- /dev/null +++ b/src/modules/internalisation/types/supportedLanguages.ts @@ -0,0 +1,4 @@ +/** + * Type containing the names of all supported languages + */ +export type supportedLanguages = 'română' | 'english' diff --git a/src/modules/modals/styles/mixins/modal-container.scss b/src/modules/modals/styles/mixins/modal-container.scss index bc54c99..e2b0cb7 100644 --- a/src/modules/modals/styles/mixins/modal-container.scss +++ b/src/modules/modals/styles/mixins/modal-container.scss @@ -13,5 +13,5 @@ z-index: $modal-index; color: white; background-color: $modal-bg-color; - font-family: 'Righteous'; + font-family: 'Righteous', cursive; } diff --git a/src/modules/saving/helpers/cloneState.ts b/src/modules/saving/helpers/cloneState.ts index d4692bb..94e9de8 100644 --- a/src/modules/saving/helpers/cloneState.ts +++ b/src/modules/saving/helpers/cloneState.ts @@ -1 +1,6 @@ +/** + * Very basic JSON based object cloning + * + * @param state The object to clone + */ export const cloneState = (state: T): T => JSON.parse(JSON.stringify(state)) diff --git a/src/modules/saving/helpers/dumpSimulation.ts b/src/modules/saving/helpers/dumpSimulation.ts new file mode 100644 index 0000000..4100086 --- /dev/null +++ b/src/modules/saving/helpers/dumpSimulation.ts @@ -0,0 +1,16 @@ +import { SimulationRenderer } from '../../simulationRenderer/classes/SimulationRenderer' + +/** + * Does the cleanup for switching to another simulation + * + * @param renderer The renderer to clean up + */ +export const dumpSimulation = (renderer: SimulationRenderer) => { + renderer.simulation.dispose() + renderer.lastMousePosition = [0, 0] + renderer.selectedGate = null + renderer.selectedPins = { + end: null, + start: null + } +} diff --git a/src/modules/saving/helpers/fromState.ts b/src/modules/saving/helpers/fromState.ts index 81d1837..02bd080 100644 --- a/src/modules/saving/helpers/fromState.ts +++ b/src/modules/saving/helpers/fromState.ts @@ -1,8 +1,6 @@ -import { SimulationRenderer } from '../../simulationRenderer/classes/SimulationRenderer' import { Gate, PinWrapper } from '../../simulation/classes/Gate' import { TransformState, - RendererState, CameraState, SimulationState } from '../types/SimulationSave' @@ -12,6 +10,10 @@ import { Simulation } from '../../simulation/classes/Simulation' import { Wire } from '../../simulation/classes/Wire' import { templateStore } from '../stores/templateStore' +/** + * Contains methods for transforming saved state into the respective class instances + */ + export const fromTransformState = (state: TransformState): Transform => { return new Transform(state.position, state.scale, state.rotation) } @@ -25,7 +27,7 @@ export const fromCameraState = (state: CameraState): Camera => { } export const fromSimulationState = (state: SimulationState): Simulation => { - const simulation = new Simulation(state.mode) + const simulation = new Simulation(state.mode, state.name) for (const gateState of state.gates) { const gate = new Gate( diff --git a/src/modules/saving/helpers/getState.ts b/src/modules/saving/helpers/getState.ts index 4c516c1..1cc1892 100644 --- a/src/modules/saving/helpers/getState.ts +++ b/src/modules/saving/helpers/getState.ts @@ -14,6 +14,10 @@ import { Camera } from '../../simulationRenderer/classes/Camera' import { Simulation } from '../../simulation/classes/Simulation' import { Wire } from '../../simulation/classes/Wire' +/** + * Methods for gettings the savable state from class instances + */ + export const getTransformState = (transform: Transform): TransformState => { return { position: transform.position, diff --git a/src/modules/saving/helpers/initBaseTemplates.ts b/src/modules/saving/helpers/initBaseTemplates.ts index f961702..2a2badc 100644 --- a/src/modules/saving/helpers/initBaseTemplates.ts +++ b/src/modules/saving/helpers/initBaseTemplates.ts @@ -1,10 +1,20 @@ import { baseTemplates } from '../constants' import { templateStore } from '../stores/templateStore' +import { SimulationError } from '../../errors/classes/SimulationError' +/** + * Stores the base logic gate templates into localStorage + * + * @throws SimulationError if something is wrong with the template + */ export const initBaseTemplates = () => { for (const template of baseTemplates) { if (template.metadata && template.metadata.name) { templateStore.set(template.metadata.name, template) + } else { + throw new SimulationError( + `Template ${JSON.stringify(template)} cannot be stored.` + ) } } } diff --git a/src/modules/saving/helpers/initSimulation.ts b/src/modules/saving/helpers/initSimulation.ts index cd3c783..c423f97 100644 --- a/src/modules/saving/helpers/initSimulation.ts +++ b/src/modules/saving/helpers/initSimulation.ts @@ -4,9 +4,20 @@ import { cloneState } from './cloneState' import { saveStore } from '../stores/saveStore' import { toast } from 'react-toastify' import { createToastArguments } from '../../toasts/helpers/createToastArguments' +import { CurrentLanguage } from '../../internalisation/stores/currentLanguage' +/** + * Inits a simulation by: + * 1) first initialising the place in localstorage + * where the simulation will be saved + * 2) notifying the used about that + * + * @param name - the name of the simulation + * @param mode - the mode of the simulation + */ export const initSimulation = (name: string, mode: simulationMode) => { const state = cloneState(baseSave) + const translation = CurrentLanguage.getTranslation() state.simulation.name = name state.simulation.mode = mode @@ -15,7 +26,7 @@ export const initSimulation = (name: string, mode: simulationMode) => { toast.success( ...createToastArguments( - `Successfully created simulation ${name}`, + translation.messages.createdSimulation(name), 'check' ) ) diff --git a/src/modules/saving/helpers/save.ts b/src/modules/saving/helpers/save.ts index 90f5e78..3ba0821 100644 --- a/src/modules/saving/helpers/save.ts +++ b/src/modules/saving/helpers/save.ts @@ -5,16 +5,32 @@ import { getRendererState } from './getState' import { saveStore } from '../stores/saveStore' import { toast } from 'react-toastify' import { createToastArguments } from '../../toasts/helpers/createToastArguments' +import { CurrentLanguage } from '../../internalisation/stores/currentLanguage' +/** + * Saves the state from a renderer in localStorage, + * then notifies the user about it + * + * @throws SimulationError if the simulation name + * cannot found in the currentStore + * + * @param renderer - the renderer to saev the state of + */ export const save = (renderer: SimulationRenderer) => { const current = currentStore.get() if (current) { const state = getRendererState(renderer) + const translation = CurrentLanguage.getTranslation() saveStore.set(current, state) - toast(...createToastArguments(`Succesfully saved ${current}`, 'save')) + toast( + ...createToastArguments( + translation.messages.savedSimulation(current), + 'save' + ) + ) } else { throw new SimulationError( 'Cannot save without knowing the name of the active simulation' diff --git a/src/modules/saving/helpers/switchTo.ts b/src/modules/saving/helpers/switchTo.ts new file mode 100644 index 0000000..827de37 --- /dev/null +++ b/src/modules/saving/helpers/switchTo.ts @@ -0,0 +1,42 @@ +import { currentStore } from '../stores/currentStore' +import { rendererSubject } from '../../core/subjects/rendererSubject' +import { SimulationError } from '../../errors/classes/SimulationError' +import { toast } from 'react-toastify' +import { createToastArguments } from '../../toasts/helpers/createToastArguments' +import { dumpSimulation } from './dumpSimulation' +import { CurrentLanguage } from '../../internalisation/stores/currentLanguage' + +/** + * Used to switch to a simulation + * + * @throws SimulationError if theres no renderer stored in the rendererSubject + * + * @param simulationName The name of the simulation to switch to + * + * @example + * switchTo() + * switchTo('test') + * + */ +export const switchTo = (simulationName: string = 'default') => { + if (rendererSubject.value) { + const renderer = rendererSubject.value + const translation = CurrentLanguage.getTranslation() + + dumpSimulation(renderer) + + currentStore.set(simulationName) + renderer.reloadSave() + + toast( + ...createToastArguments( + translation.messages.switchedToSimulation(simulationName), + 'arrow_right_alt' + ) + ) + } else { + throw new SimulationError( + `Renderer not found while trying to switch to simulation '${simulationName}'` + ) + } +} diff --git a/src/modules/saving/stores/currentStore.ts b/src/modules/saving/stores/currentStore.ts index 6f7920c..745ea65 100644 --- a/src/modules/saving/stores/currentStore.ts +++ b/src/modules/saving/stores/currentStore.ts @@ -1,8 +1,12 @@ import { LocalStore } from '../../storage/classes/LocalStore' import { defaultSimulationName } from '../constants' +/** + * Stores the name of the current simulation + */ const currentStore = new LocalStore('currentSave') +// This makes sure the store isnt empty if (!currentStore.get()) { currentStore.set(defaultSimulationName) } diff --git a/src/modules/saving/stores/saveStore.ts b/src/modules/saving/stores/saveStore.ts index 1656424..dff300e 100644 --- a/src/modules/saving/stores/saveStore.ts +++ b/src/modules/saving/stores/saveStore.ts @@ -1,4 +1,7 @@ import { LocalStore } from '../../storage/classes/LocalStore' import { RendererState } from '../types/SimulationSave' +/** + * This store is used to save all simulations. + */ export const saveStore = new LocalStore('saves') diff --git a/src/modules/saving/stores/templateStore.ts b/src/modules/saving/stores/templateStore.ts index 74dcf60..5897051 100644 --- a/src/modules/saving/stores/templateStore.ts +++ b/src/modules/saving/stores/templateStore.ts @@ -1,6 +1,9 @@ import { LocalStore } from '../../storage/classes/LocalStore' import { GateTemplate } from '../../simulation/types/GateTemplate' +/** + * This store is used to save all logic gate templates + */ export const templateStore = new LocalStore>( 'templates' ) diff --git a/src/modules/simulationRenderer/classes/SimulationRenderer.ts b/src/modules/simulationRenderer/classes/SimulationRenderer.ts index 49defd5..0acadab 100644 --- a/src/modules/simulationRenderer/classes/SimulationRenderer.ts +++ b/src/modules/simulationRenderer/classes/SimulationRenderer.ts @@ -27,6 +27,7 @@ import { wireConnectedToGate } from '../helpers/wireConnectedToGate' import { updateMouse, handleScroll } from '../helpers/scaleCanvas' import { RefObject } from 'react' import { Singleton } from '@eix-js/utils' +import { dumpSimulation } from '../../saving/helpers/dumpSimulation' export class SimulationRenderer { public mouseDownOutput = new Subject() @@ -200,6 +201,8 @@ export class SimulationRenderer { this.lastMousePosition = this.camera.toWordPostition(event.position) }) + dumpSimulation(this) + this.reloadSave() this.initKeyBindings() } @@ -222,7 +225,6 @@ export class SimulationRenderer { if (!save) return if (!(save.simulation || save.camera)) return - this.simulation.dispose() this.simulation = fromSimulationState(save.simulation) this.camera = fromCameraState(save.camera) } catch (e) { diff --git a/src/modules/toasts/components/ToastContent.scss b/src/modules/toasts/components/ToastContent.scss index 2acd320..ec3bd7d 100644 --- a/src/modules/toasts/components/ToastContent.scss +++ b/src/modules/toasts/components/ToastContent.scss @@ -11,4 +11,5 @@ .toast-content-container > #toast-content-icon { font-size: 2em; + margin: 10px; }