From 9dc3873981ba89490e87a0be2bb4966c34b81530 Mon Sep 17 00:00:00 2001 From: samuel_bryan Date: Mon, 25 May 2020 11:32:16 +0100 Subject: [PATCH 1/2] 207 - Set up state ready for sockets --- src/App.vue | 102 +++++----- src/components/TheCanvas.vue | 44 ++-- src/components/TheEntityPanel.vue | 19 +- src/components/TheToolPanel.vue | 10 +- src/components/canvas-tools/RedoContainer.vue | 23 ++- src/components/canvas-tools/ToolContainer.vue | 57 +++--- src/components/canvas-tools/UndoContainer.vue | 61 +++--- .../canvas-tools/templates/Circle.vue | 18 +- .../canvas-tools/templates/FreeDraw.vue | 11 +- .../canvas-tools/templates/Line.vue | 17 +- .../canvas-tools/templates/Ruler.vue | 13 +- .../canvas-tools/templates/Text.vue | 11 +- .../templates/template-tools/ColourPicker.vue | 1 + .../games/{Wot.vue => TheWot.vue} | 4 +- .../games/{Wows.vue => TheWows.vue} | 30 +-- src/components/entity-panel/index.ts | 4 +- .../entity-panel/sections/TheCreateEntity.vue | 8 +- src/components/navigation/LoginCard.vue | 50 ----- src/components/navigation/TheCanvasTools.vue | 37 ++-- src/components/navigation/TheLoginCard.vue | 54 +++++ src/components/navigation/TheNavLarge.vue | 14 +- src/components/navigation/TheNavSmall.vue | 14 +- src/components/navigation/TheUserMenu.vue | 86 ++++---- .../navigation/buttons/TheManageRoom.vue | 9 +- .../buttons/ThePresentationMode.vue | 9 +- .../navigation/buttons/TheRoomSave.vue | 9 +- .../overlays/TheCreateNewTacticOverlay.vue | 71 ++++--- .../overlays/TheUpdateTacticOverlay.vue | 26 ++- .../tactic-selector/TheTacticSelector.vue | 24 ++- src/games/wows/api.ts | 14 +- src/main.ts | 12 +- src/mixins/CanvasSockets.ts | 32 +-- src/mixins/RoomSockets.ts | 22 +- src/mixins/StageWatcher.ts | 29 +-- src/mixins/TacticWatcher.ts | 42 ++-- src/router/index.ts | 8 +- src/store/index.ts | 60 +++--- src/store/modules/app/authentication.ts | 137 +++++++++++++ src/store/modules/app/canvasEntity.ts | 95 +++++++++ src/store/modules/app/layer.ts | 84 ++++++++ src/store/modules/app/room.ts | 100 +++++++++ src/store/modules/app/stage.ts | 106 ++++++++++ src/store/modules/{ => app}/tools.ts | 100 ++++----- src/store/modules/authentication.ts | 145 ------------- src/store/modules/canvasEntity.ts | 94 --------- src/store/modules/layer.ts | 84 -------- src/store/modules/room.ts | 171 ---------------- src/store/modules/{ => socket}/canvas.ts | 60 +++--- .../modules/{socket.ts => socket/index.ts} | 0 src/store/modules/socket/room.ts | 102 ++++++++++ src/store/modules/socket/stage.ts | 116 +++++++++++ src/store/modules/socket/tactic.ts | 118 +++++++++++ src/store/modules/socket/user.ts | 70 +++++++ src/store/modules/stage.ts | 192 ------------------ src/store/modules/tactic.ts | 118 ----------- src/store/modules/user.ts | 70 ------- src/store/{modules => }/types.ts | 10 +- src/tools/Tool.ts | 62 +++--- src/tools/shapes/CircleCreator.ts | 1 + src/tools/shapes/EntityCreator.ts | 1 + src/tools/shapes/FreeDrawCreator.ts | 1 + src/tools/shapes/LineCreator.ts | 3 + src/tools/shapes/PingCreator.ts | 1 + src/tools/shapes/RulerCreator.ts | 6 +- src/tools/shapes/Shape.ts | 13 +- src/tools/shapes/TextCreator.ts | 1 + src/tools/util/CenterCanvas.ts | 8 +- src/tools/util/MapCanvas.ts | 9 +- src/types/Games/Index.ts | 6 +- src/types/Games/Wows/Maps.ts | 2 +- src/util/HandleRenderShapes.ts | 23 ++- src/util/HandleUndoRedo.ts | 35 ++-- src/util/PointerEventMapper.ts | 10 +- src/views/{Index.vue => TheIndex.vue} | 13 +- src/views/{Room.vue => TheRoom.vue} | 86 ++++---- 75 files changed, 1748 insertions(+), 1560 deletions(-) rename src/components/entity-panel/games/{Wot.vue => TheWot.vue} (79%) rename src/components/entity-panel/games/{Wows.vue => TheWows.vue} (84%) delete mode 100644 src/components/navigation/LoginCard.vue create mode 100644 src/components/navigation/TheLoginCard.vue create mode 100644 src/store/modules/app/authentication.ts create mode 100644 src/store/modules/app/canvasEntity.ts create mode 100644 src/store/modules/app/layer.ts create mode 100644 src/store/modules/app/room.ts create mode 100644 src/store/modules/app/stage.ts rename src/store/modules/{ => app}/tools.ts (50%) delete mode 100644 src/store/modules/authentication.ts delete mode 100644 src/store/modules/canvasEntity.ts delete mode 100644 src/store/modules/layer.ts delete mode 100644 src/store/modules/room.ts rename src/store/modules/{ => socket}/canvas.ts (51%) rename src/store/modules/{socket.ts => socket/index.ts} (100%) create mode 100644 src/store/modules/socket/room.ts create mode 100644 src/store/modules/socket/stage.ts create mode 100644 src/store/modules/socket/tactic.ts create mode 100644 src/store/modules/socket/user.ts delete mode 100644 src/store/modules/stage.ts delete mode 100644 src/store/modules/tactic.ts delete mode 100644 src/store/modules/user.ts rename src/store/{modules => }/types.ts (91%) rename src/views/{Index.vue => TheIndex.vue} (50%) rename src/views/{Room.vue => TheRoom.vue} (57%) diff --git a/src/App.vue b/src/App.vue index 8a37dfb..71d0411 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,69 +8,67 @@ import Component from 'vue-class-component' import Vue from 'vue' import { namespace } from 'vuex-class' -import { Namespaces } from '@/store' -import { Api } from './store/modules/types' +import { AppRoomAction, Locale } from '@/store/modules/app/room' +import { SocketRoomAction, Game, SocketRoomGetters } from '@/store/modules/socket/room' +import { AppAuthenticationActions, AppAuthenticationGetters, ExtendedJWT, JWT_KEY } from '@/store/modules/app/authentication' +import { Api } from './store/types' import { getWowsApiData } from '@/games/wows/api' -import { GameName, Locale, RoomAction, RoomGetters } from '@/store/modules/room' -import { AuthenticationActions, AuthenticationGetters, ExtendedJWT, JWT_KEY } from '@/store/modules/authentication' +import { Namespaces } from '@/store' -const authNamespace = namespace(Namespaces.AUTH) -const roomNamespace = namespace(Namespaces.ROOM) +const AppAuthentication = namespace(Namespaces.APP_AUTHENTICATION) +const AppRoom = namespace(Namespaces.APP_ROOM) +const SocketRoom = namespace(Namespaces.SOCKET_ROOM) - @Component({ - name: 'TheApp' - }) +@Component({ + name: 'TheApp' +}) export default class TheApp extends Vue { - @roomNamespace.Action(RoomAction.SET_GAME_NAME) setGameName!: (name: string) => void - @roomNamespace.Action(RoomAction.SET_GAME_API) setGameApi!: (api: Api) => void - @roomNamespace.Action(RoomAction.SET_LOCALE) setLocale!: (locale: Locale) => void - @roomNamespace.Getter(RoomGetters.GAME_NAME) game!: GameName - @authNamespace.Action(AuthenticationActions.AUTHENTICATE) authenticate!: (token: string) => Promise - @authNamespace.Action(AuthenticationActions.STORE_TOKEN) storeToken!: (token: string) => void - @authNamespace.Action(AuthenticationActions.CHECK_TOKEN_EXPIRY) checkTokenExpiry!: () => Promise - @authNamespace.Action(AuthenticationActions.LOAD_PROVIDERS) loadProviders!: () => void - @authNamespace.Getter(AuthenticationGetters.JWT) jwt!: ExtendedJWT + @SocketRoom.Action(SocketRoomAction.SET_GAME) setGame!: (name: string) => void + @AppRoom.Action(AppRoomAction.ADD_API) addApi!: (api: Api) => void + @AppRoom.Action(AppRoomAction.SET_LOCALE) setLocale!: (locale: Locale) => void + @SocketRoom.Getter(SocketRoomGetters.GAME) game!: Game + @AppAuthentication.Action(AppAuthenticationActions.AUTHENTICATE) authenticate!: (token: string) => Promise + @AppAuthentication.Action(AppAuthenticationActions.CHECK_TOKEN_EXPIRY) checkTokenExpiry!: () => Promise + @AppAuthentication.Action(AppAuthenticationActions.STORE_TOKEN) storeToken!: (token: string) => void + @AppAuthentication.Getter(AppAuthenticationGetters.JWT) jwt!: ExtendedJWT - async created () { - this.setGameName(GameName['WOWS']) - this.setLocale(Locale['EN']) - this.initAuthentication() - } + async created () { + this.setGame(Game['WOWS']) + this.setLocale(Locale['EN']) + this.initAuthentication() + } - async initAuthentication () { - this.loadProviders() - const localToken = localStorage.getItem(JWT_KEY) + async initAuthentication () { + const localToken = localStorage.getItem(JWT_KEY) - if (this.checkTokenExpiry()) { - if (this.$route?.query?.code) { - this.authenticate(this.$route.query.code as string).then(jwt => this.storeToken(jwt.encoded)) - } else if (localToken !== null) { - this.authenticate(localToken) - } - if (localToken) { - switch (this.game) { - case GameName['WOWS']: - await getWowsApiData(localToken, this.setGameApi) - break - default: - break - } + if (this.checkTokenExpiry()) { + if (this.$route?.query?.code) { + this.authenticate(this.$route.query.code as string).then(jwt => this.storeToken(jwt.encoded)) + } else if (localToken !== null) { + this.authenticate(localToken) + } + if (localToken) { + switch (this.game) { + case Game['WOWS']: + await getWowsApiData(localToken, this.addApi) + break + default: break } } } + } } diff --git a/src/components/TheCanvas.vue b/src/components/TheCanvas.vue index 757015e..934f616 100644 --- a/src/components/TheCanvas.vue +++ b/src/components/TheCanvas.vue @@ -19,36 +19,46 @@ import Component, { mixins } from 'vue-class-component' import { Tool } from '@/tools/Tool' import { CanvasElement, VueKonvaLayer, VueKonvaStage } from '@/types/Canvas' -import { Action, Getter } from 'vuex-class' -import { ToolGetters } from '@/store/modules/tools' -import { CanvasAction, CanvasGetters } from '@/store/modules/canvas' +import { namespace } from 'vuex-class' +import { AppToolGetters } from '@/store/modules/app/tools' +import { SocketCanvasAction, SocketCanvasGetters } from '@/store/modules/socket/canvas' import Konva from 'konva' import { EventBus } from '@/event-bus' import PointerEventMapper, { CustomStageConfig } from '@/util/PointerEventMapper' import { KonvaPointerEvent } from 'konva/types/PointerEvents' import HandleRenderShapes from '@/util/HandleRenderShapes' -import { StageActions, StageGetters } from '@/store/modules/stage' -import { LayerActions, LayerGetters } from '@/store/modules/layer' -import { CanvasEntityGetters, CanvasEntityState } from '@/store/modules/canvasEntity' +import { AppStageActions, AppStageGetters } from '@/store/modules/app/stage' +import { SocketStageActions, SocketStageGetters } from '@/store/modules/socket/stage' +import { AppLayerActions, AppLayerGetters } from '@/store/modules/app/layer' +import { AppCanvasEntityGetters, AppCanvasEntityState } from '@/store/modules/app/canvasEntity' import CanvasSockets from '@/mixins/CanvasSockets' import StageWatcher from '@/mixins/StageWatcher' +import { Namespaces } from '@/store' + +const AppCanvasEntity = namespace(Namespaces.APP_CANVAS_ENTITY) +const AppLayer = namespace(Namespaces.APP_LAYER) +const AppStage = namespace(Namespaces.APP_STAGE) +const AppTools = namespace(Namespaces.APP_TOOLS) +const SocketCanvas = namespace(Namespaces.SOCKET_CANVAS) +const SocketStage = namespace(Namespaces.SOCKET_STAGE) + @Component({ name: 'TheCanvas', mixins: [CanvasSockets, StageWatcher] }) export default class TheCanvas extends mixins(CanvasSockets, StageWatcher) { - @Getter(`tools/${ToolGetters.ENABLED_TOOL}`) enabledTool!: Tool - @Getter(`tools/${ToolGetters.TOOLS}`) tools!: Tool[] - @Action(`canvas/${CanvasAction.ADD_CANVAS_ELEMENT}`) addCanvasElement!: (canvasElement: CanvasElement) => void - @Getter(`canvas/${CanvasGetters.CANVAS_ELEMENTS}`) canvasElements!: CanvasElement[] - @Getter(`stage/${StageGetters.STAGE_ZOOM}`) stageZoom!: number - @Getter(`stage/${StageGetters.STAGE_CONFIG}`) stageConfig!: CustomStageConfig - @Action(`layer/${LayerActions.LAYER_SET}`) setLayer!: (layer: Konva.Layer) => void - @Getter(`layer/${LayerGetters.LAYER}`) layerNode!: Konva.Layer - @Action(`stage/${StageActions.SET_STAGE}`) setStage!: (stage: Konva.Stage) => void - @Getter(`stage/${StageGetters.STAGE}`) stage!: Konva.Stage - @Getter(`canvasEntity/${CanvasEntityGetters.CANVAS_ENTITY}`) canvasEntity!: CanvasEntityState + @AppCanvasEntity.Getter(AppCanvasEntityGetters.CANVAS_ENTITY) canvasEntity!: AppCanvasEntityState + @AppTools.Getter(AppToolGetters.ENABLED_TOOL) enabledTool!: Tool + @AppTools.Getter(AppToolGetters.TOOLS) tools!: Tool[] + @AppLayer.Getter(AppLayerGetters.LAYER) layerNode!: Konva.Layer + @AppStage.Getter(AppStageGetters.STAGE) stage!: Konva.Stage + @AppStage.Getter(AppStageGetters.STAGE_ZOOM) stageZoom!: number + @SocketCanvas.Getter(SocketCanvasGetters.CANVAS_ELEMENTS) canvasElements!: CanvasElement[] + @SocketStage.Getter(SocketStageGetters.STAGE_CONFIG) stageConfig!: CustomStageConfig + @AppLayer.Action(AppLayerActions.LAYER_SET) setLayer!: (layer: Konva.Layer) => void + @AppStage.Action(AppStageActions.SET_STAGE) setStage!: (stage: Konva.Stage) => void + @SocketCanvas.Action(SocketCanvasAction.ADD_CANVAS_ELEMENT) addCanvasElement!: (canvasElement: CanvasElement) => void $refs!: { layer: VueKonvaLayer; diff --git a/src/components/TheEntityPanel.vue b/src/components/TheEntityPanel.vue index de4a5dd..1189a97 100644 --- a/src/components/TheEntityPanel.vue +++ b/src/components/TheEntityPanel.vue @@ -9,8 +9,8 @@ tile class="custom-entity-panel" > - - + + @@ -23,7 +23,7 @@
- + @@ -83,9 +83,14 @@ diff --git a/src/components/entity-panel/index.ts b/src/components/entity-panel/index.ts index 2bb2542..da5a9fb 100644 --- a/src/components/entity-panel/index.ts +++ b/src/components/entity-panel/index.ts @@ -1,2 +1,2 @@ -export { default as WowsPanel } from './games/Wows.vue' -export { default as WotPanel } from './games/Wot.vue' +export { default as WowsPanel } from './games/TheWows.vue' +export { default as WotPanel } from './games/TheWot.vue' diff --git a/src/components/entity-panel/sections/TheCreateEntity.vue b/src/components/entity-panel/sections/TheCreateEntity.vue index 57161fd..17e08de 100644 --- a/src/components/entity-panel/sections/TheCreateEntity.vue +++ b/src/components/entity-panel/sections/TheCreateEntity.vue @@ -222,15 +222,13 @@ import Component from 'vue-class-component' import { Item, Field } from '@/types/Games/Index' import { MenuItem } from '@/components/TheEntityPanel.vue' import Games from '@/mixins/Games' -import { GameName } from '@/store/modules/room' +import { Game } from '@/store/modules/socket/room' import EntityCard from '../EntityCard.vue' @Component({ name: 'TheCreateEntity', mixins: [Games], - components: { - EntityCard - } + components: { EntityCard } }) export default class TheCreateEntity extends Games { @Prop() private clickedItemKey!: number; @@ -238,7 +236,7 @@ export default class TheCreateEntity extends Games { @Prop() private entityData!: Item[]; @Prop() private entities!: Item[]; @Prop() private fields!: Field[]; - @Prop() private game!: GameName; + @Prop() private game!: Game; @Prop() private autoCompleteOnChangeHandler!: (shipItem: Item) => void chipColour = 'green' diff --git a/src/components/navigation/LoginCard.vue b/src/components/navigation/LoginCard.vue deleted file mode 100644 index 2d2d874..0000000 --- a/src/components/navigation/LoginCard.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/src/components/navigation/TheCanvasTools.vue b/src/components/navigation/TheCanvasTools.vue index 4ed047e..038ea11 100644 --- a/src/components/navigation/TheCanvasTools.vue +++ b/src/components/navigation/TheCanvasTools.vue @@ -21,7 +21,7 @@
- {{ this.zoomPercentage }}% + {{ this.stageZoom }}%
- - Logout - - - Login - - - + + {{ $t('navigation.login.logout') }} + + {{ $t('navigation.login.title') }} + + + + - User Profile - - Logout + + + {{ $t('navigation.login.logout') }} - - Login - - + + {{ $t('navigation.login.title') }} + + - {{ item.text }} + @@ -79,24 +93,26 @@ interface UserMenuItem { @Component({ name: 'TheUserMenu', - components: { - TheLoginCard - } + components: { TheLoginCard } }) export default class TheUserMenu extends Vue { @Prop() private isMobile!: boolean; @AppAuthentication.Getter(AppAuthenticationGetters.IS_AUTH) isAuth!: boolean @AppAuthentication.Action(AppAuthenticationActions.LOGIN_WG) authenticate!: (region: string) => void; - @AppAuthentication.Action(AppAuthenticationActions.LOGOUT) logout!: () => void + @AppAuthentication.Action(AppAuthenticationActions.LOGOUT) onClickLogout!: () => void - dialogOpen = false - doOpen () { - setTimeout(() => { this.dialogOpen = true }) - } + isDialogOpen = false userMenuItems: UserMenuItem[] = [] + onClickOpenLoginDialog () { + this.isDialogOpen = true + } + + onClickCloseLoginDialog () { + this.isDialogOpen = false + } // eslint-disable-next-line - userMenuItemsClickHandler (item: UserMenuItem) { + userMenuItemsClickHandler(item: UserMenuItem) { // do stuff } } diff --git a/src/components/navigation/buttons/TheManageRoom.vue b/src/components/navigation/buttons/TheManageRoom.vue index 57572b4..4ae62f4 100644 --- a/src/components/navigation/buttons/TheManageRoom.vue +++ b/src/components/navigation/buttons/TheManageRoom.vue @@ -7,7 +7,7 @@ >