From 84dd40de5d455a9a4d2715b56c79e8417fa25444 Mon Sep 17 00:00:00 2001 From: Dennis Schoepf Date: Tue, 20 Jul 2021 18:18:05 +0200 Subject: [PATCH] Companion message state handling --- src/scenes/OverviewScene.ts | 6 ++++++ src/store.ts | 18 +++++++++++++----- src/ui/companion.ts | 25 ++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/scenes/OverviewScene.ts b/src/scenes/OverviewScene.ts index fea6373..80ef7ff 100644 --- a/src/scenes/OverviewScene.ts +++ b/src/scenes/OverviewScene.ts @@ -35,6 +35,12 @@ export class OverviewScene { store.setState({ currentScene: edge.scene }); } }); + + store.getState().addUserMessage({ + text: `Test Message ${Math.random()}`, + inputWanted: false, + timestamp: Date.now(), + }); } private drawLocations() { diff --git a/src/store.ts b/src/store.ts index 7d1de96..a5369ee 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,15 +1,23 @@ import create from 'zustand/vanilla'; +import { devtools } from 'zustand/middleware'; import { Scenes } from './scenes/scenes'; -import { CompanionState } from './ui/companion'; +import { CompanionMessage, CompanionState } from './ui/companion'; export interface State { currentScene: Scenes; companionState: CompanionState; + userMessages: CompanionMessage[]; + addUserMessage: (newMessage: CompanionMessage) => void; } -const store = create(() => ({ - currentScene: Scenes.OVERVIEW, - companionState: CompanionState.IDLE, -})); +const store = create( + devtools((set) => ({ + currentScene: Scenes.OVERVIEW, + companionState: CompanionState.IDLE, + userMessages: [], + addUserMessage: (newMessage) => + set((state) => ({ userMessages: [...state.userMessages, newMessage] })), + })) +); export default store; diff --git a/src/ui/companion.ts b/src/ui/companion.ts index 4bd46ee..c8010fd 100644 --- a/src/ui/companion.ts +++ b/src/ui/companion.ts @@ -1,5 +1,4 @@ import anime from 'animejs/lib/anime.es'; -import { reject } from 'core-js/fn/promise'; import store from '../store'; export enum CompanionState { @@ -9,9 +8,16 @@ export enum CompanionState { SUCCESS = 'SUCCESS', } +export interface CompanionMessage { + text: string; + inputWanted: boolean; + timestamp: number; +} + export class Companion { ref: HTMLElement; hoverAnimation: any; + message: CompanionMessage; constructor() { this.ref = document.getElementById('companion'); @@ -19,12 +25,13 @@ export class Companion { this.ref.addEventListener('mouseover', () => this.handleMouseEnter()); this.ref.addEventListener('mouseleave', () => this.handleMouseLeave()); + this.pupilFollowCursor(); + store.subscribe( (companionState) => { if (companionState === CompanionState.ACTIVE) { this.showActiveShape(); this.scaleUpCompanion(); - this.pupilFollowCursor(); } else if (companionState === CompanionState.IDLE) { this.scaleDownCompanion(); this.showIdleShape(); @@ -38,8 +45,20 @@ export class Companion { }, (state) => state.companionState ); + + store.subscribe( + (messages: CompanionMessage[], prevMessages: CompanionMessage[]) => { + if (prevMessages.length !== messages.length) { + const newMessage = messages[messages.length - 1]; + console.log(newMessage); + } + }, + (state) => state.userMessages + ); } + showMessage() {} + showActiveShape() { const mouth = document.getElementById('companion-mouth'); mouth.style.opacity = '100%'; @@ -99,7 +118,7 @@ export class Companion { pupil.style.transform = `translate(${-((pupDim.x - e.pageX) * 0.005)}px, ${-( (pupDim.y - e.pageY) * - 0.015 + 0.012 )}px)`; }); }