From d084511c6beb59332f904f181477f4c97086bf8e Mon Sep 17 00:00:00 2001 From: Dennis Schoepf Date: Sat, 31 Jul 2021 16:27:07 +0200 Subject: [PATCH] Refactor detail scene elements to single class --- metadata/project.json | 39 ++++++--- src/area.ts | 11 +-- src/helpers.ts | 31 +++++-- src/scenes/DetailScene.ts | 30 +++---- src/scenes/OverviewScene.ts | 2 +- src/sketchObjects/Contributor.ts | 100 --------------------- src/sketchObjects/Legacy.ts | 21 ----- src/sketchObjects/Package.ts | 146 ------------------------------- src/sketchObjects/Revealable.ts | 63 +++++++++++++ src/store.ts | 27 +++--- src/types.ts | 27 ++++-- 11 files changed, 162 insertions(+), 335 deletions(-) delete mode 100644 src/sketchObjects/Contributor.ts delete mode 100644 src/sketchObjects/Legacy.ts delete mode 100644 src/sketchObjects/Package.ts create mode 100644 src/sketchObjects/Revealable.ts diff --git a/metadata/project.json b/metadata/project.json index dbaa514..13aab40 100644 --- a/metadata/project.json +++ b/metadata/project.json @@ -4,19 +4,32 @@ "name": "block", "path": "packages/block", "size": 2450, - "contents": { - "contributors": [ - { - "name": "Peter Dunne" - } - ], - "legacy": [], - "packages": [ - { - "name": "react" - } - ] - } + "revealables": [ + { + "type": "LEGACY", + "name": "trieNode", + "path": "src/trieNode.ts", + "contents": "This file is a bit long, you might want to take a clear look and refactor it. The contributors of this subpackage could help here. Try to reveal them to see their contact info.", + "url": "https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trieNode.ts", + "imageUrl": null + }, + { + "type": "CONTRIBUTOR", + "name": "Holger Drewes (holgerd77)", + "path": null, + "contents": "This contributor has a lot of commits in this sub package, below you can find the contact information and a few commits from this repo.", + "url": "https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trieNode.ts", + "imageUrl": "https://avatars.githubusercontent.com/u/931137?v=4" + }, + { + "type": "PACKAGE", + "name": "chalk", + "path": "https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/package.json", + "contents": "This package is used in this part of the project. Take a look at the documentation in order to make yourself familiar with it", + "url": "https://github.com/chalk/chalk", + "imageUrl": null + } + ] } ] } diff --git a/src/area.ts b/src/area.ts index fef4798..28f9a86 100644 --- a/src/area.ts +++ b/src/area.ts @@ -1,19 +1,16 @@ import { BehaviorSubject, Subject } from 'rxjs'; import { mp5 } from '../main'; +import { Area } from './types'; -export const playerHead$ = new Subject<{ x: number; y: number; w: number }>(); +export const playerHead$ = new Subject(); -export const revealedArea$ = new BehaviorSubject<{ x: number; y: number; w: number }>({ +export const revealedArea$ = new BehaviorSubject({ x: 0, y: 0, w: 0, }); -export function areasColliding( - areaOne: { x: number; y: number; w: number }, - areaTwo: { x: number; y: number; w: number }, - log?: boolean -): boolean { +export function areasColliding(areaOne: Area, areaTwo: Area): boolean { const distanceBetweenPoints = mp5.dist(areaOne.x, areaOne.y, areaTwo.x, areaTwo.y); const shapeArea = areaTwo.w / 2 + areaOne.w / 2; diff --git a/src/helpers.ts b/src/helpers.ts index 63986c1..35ca90a 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,9 +1,10 @@ import { mp5 } from '../main'; import { SCREEN_HEIGHT, SCREEN_WIDTH } from './constants/screen'; import { Edge } from './sketchObjects/Edge'; -import { Coordinates, SubProject } from './types'; +import { RevealableInterface, RevealableTypes } from './sketchObjects/Revealable'; +import { Coordinates, JSONSubproject, SubProject } from './types'; -export function getEdgeDimensions({ size }: SubProject): number { +export function getEdgeDimensions({ size }: JSONSubproject): number { const radius = size * 0.05; return radius > 150 ? 150 : radius; } @@ -41,7 +42,7 @@ export function generateEdgeCoords(existingEdges: Edge[]): Coordinates { return newCoords; } -export function generateEdges(subprojects: SubProject[]): Edge[] { +export function generateEdges(subprojects: JSONSubproject[]): Edge[] { let edges = []; subprojects.forEach((subproject) => { @@ -65,6 +66,26 @@ export function generateEdges(subprojects: SubProject[]): Edge[] { ); } -export function getSubproject(name: string, projects: SubProject[]): SubProject { - return projects.filter((project) => project.name === name)[0]; +export function getTypedSubproject(name: string, projects: JSONSubproject[]): SubProject { + return projects + .filter((project) => project.name === name) + .map((project) => ({ + ...project, + revealables: project.revealables.map((revealable) => ({ + ...revealable, + type: RevealableTypes[revealable.type], + })), + }))[0]; +} + +export function getRevealablesforSubproject( + subProjectName: string, + subProjects: JSONSubproject[] +): RevealableInterface[] { + return subProjects + .filter((subproject) => subproject.name === subProjectName)[0] + .revealables.map((revealable) => ({ + ...revealable, + type: RevealableTypes[revealable.type], + })); } diff --git a/src/scenes/DetailScene.ts b/src/scenes/DetailScene.ts index 8b5f462..0b36403 100644 --- a/src/scenes/DetailScene.ts +++ b/src/scenes/DetailScene.ts @@ -4,25 +4,22 @@ import { Contributor } from '../sketchObjects/Contributor'; import { Legacy } from '../sketchObjects/Legacy'; import { Package } from '../sketchObjects/Package'; import { Player } from '../sketchObjects/Player'; +import { Revealable, RevealableInterface } from '../sketchObjects/Revealable'; import store from '../store'; import { Scenes } from './scenes'; export class DetailScene { player: Player; - contributors: any[]; - legacy: any[]; - packages: any[]; + revealables: RevealableInterface[]; + revealableObjects: Revealable[]; constructor() { this.player = new Player(); store.subscribe((state) => { - this.contributors = state.currContributors.map( - (contributor) => new Contributor(100, 200, 50) - ); - this.legacy = state.currLegacy.map((legacy) => new Legacy(200, 300, 100)); - this.packages = state.currPackages.map( - (currPackage) => new Package(400, 300, 50, 'react', '

Test

') + this.revealables = state.revealables; + this.revealableObjects = this.revealables.map( + (revealable) => new Revealable(revealable, { x: 100, y: 200, w: 100 }) ); }); } @@ -33,25 +30,18 @@ export class DetailScene { this.player.drawOnReveal(); this.player.follow(); - this.contributors.forEach((contributor) => { - contributor.draw(); - }); - this.legacy.forEach((legacyObj) => { - legacyObj.place(); - }); - this.packages.forEach((packageObj) => { - packageObj.draw(); + this.revealableObjects.forEach((revObj) => { + revObj.draw(); }); this.player.move(); } onSceneClick() { - // store.setState({ currentScene: Scenes.OVERVIEW }); this.player.reveal(); - this.packages.forEach((packageObj) => { - packageObj.onClick(); + this.revealableObjects.forEach((revObj) => { + revObj.onClick(); }); } } diff --git a/src/scenes/OverviewScene.ts b/src/scenes/OverviewScene.ts index 8d02e43..5fde1e7 100644 --- a/src/scenes/OverviewScene.ts +++ b/src/scenes/OverviewScene.ts @@ -28,7 +28,7 @@ export class OverviewScene { this.edges.forEach((edge, i) => { const dist = mp5.dist(mp5.mouseX, mp5.mouseY, edge.x, edge.y); if (dist < edge.r) { - store.getState().setDetailScene(edge.name); + store.getState().setProjectMetadata(edge.name); store.setState({ currentScene: Scenes.DETAIL }); } }); diff --git a/src/sketchObjects/Contributor.ts b/src/sketchObjects/Contributor.ts deleted file mode 100644 index 7300e66..0000000 --- a/src/sketchObjects/Contributor.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { combineLatest, map } from 'rxjs'; -import { mp5 } from '../../main'; -import { playerHead$, areasColliding, revealedArea$ } from '../area'; -import { colors } from '../constants/colors'; -import store from '../store'; - -enum ContribStates { - HIDDEN = 'HIDDEN', - REVEALED = 'REVEALED', - ACTIVE = 'ACTIVE', - INACTIVE = 'INACTIVE', -} - -export class Contributor { - x: number; - y: number; - size: number; - currentSize: number; - startSize: number = 5; - name: string; - url: string; - messageContents: string; - wasTouched: boolean = false; - wasInteractedWith: boolean = false; - hover: boolean = false; - contribState: ContribStates = ContribStates.HIDDEN; - - constructor( - x: number, - y: number, - size: number, - name?: string, - messageContents?: string, - packageURL?: string - ) { - this.x = x; - this.y = y; - this.size = size; - this.name = name; - this.url = packageURL; - this.currentSize = this.startSize; - this.messageContents = messageContents; - - combineLatest([revealedArea$, playerHead$]).subscribe(([revealedArea, playerHead]) => { - const isRevealed = areasColliding( - { x: this.x, y: this.y, w: this.currentSize }, - revealedArea - ); - - if (isRevealed) { - this.contribState = ContribStates.REVEALED; - } else { - this.contribState = ContribStates.HIDDEN; - } - - // console.log(this.packageState); - }); - } - - public draw() { - mp5.noStroke(); - mp5.rectMode('center'); - mp5.ellipseMode('center'); - mp5.angleMode('degrees'); - - if (this.contribState === ContribStates.HIDDEN) { - } else if (this.contribState === ContribStates.REVEALED) { - mp5.arc(this.x, this.y, this.size, this.size, 10, 170, mp5.CHORD); - mp5.fill(mp5.color(colors.redDark)); - mp5.arc(this.x, this.y, this.size, this.size, 170, 370, mp5.CHORD); - mp5.fill(mp5.color(colors.greyDark)); - mp5.ellipse(this.x - this.size / 5, this.y + this.size / 4, this.size / 5); - mp5.ellipse(this.x + this.size / 5, this.y + this.size / 4, this.size / 5); - mp5.arc(this.x, this.y + this.size / 3, this.size / 3, this.size / 5, 0, 180, mp5.CHORD); - } else if (this.contribState === ContribStates.ACTIVE) { - // Check if mouse is over the squares, if so animate and enable click - const mouseOverShape = areasColliding( - { x: mp5.mouseX, y: mp5.mouseY, w: 70 }, - { x: this.x, y: this.y, w: this.currentSize } - ); - - if (mouseOverShape) { - this.hover = true; - } else { - this.hover = false; - } - } else if (this.contribState === ContribStates.INACTIVE) { - } - } - - public onClick() { - if (this.hover && !this.wasInteractedWith) { - this.wasInteractedWith = true; - store.getState().addInfoMessage({ - headline: this.name, - innerHTML: this.messageContents, - }); - } - } -} diff --git a/src/sketchObjects/Legacy.ts b/src/sketchObjects/Legacy.ts deleted file mode 100644 index fc4fb74..0000000 --- a/src/sketchObjects/Legacy.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { mp5 } from '../../main'; -import { colors } from '../constants/colors'; - -export class Legacy { - x: number; - y: number; - size: number; - name: string; - revealed: boolean; - - constructor(x: number, y: number, size: number, name?: string, profileURL?: string) { - this.x = x; - this.y = y; - this.size = size; - } - - private place() { - mp5.fill(mp5.color(colors.red)); - mp5.ellipse(this.x, this.y, this.size); - } -} diff --git a/src/sketchObjects/Package.ts b/src/sketchObjects/Package.ts deleted file mode 100644 index 0a10828..0000000 --- a/src/sketchObjects/Package.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { combineLatest, map } from 'rxjs'; -import { mp5 } from '../../main'; -import { playerHead$, areasColliding, revealedArea$ } from '../area'; -import { colors } from '../constants/colors'; -import store from '../store'; - -enum PackageStates { - HIDDEN = 'HIDDEN', - REVEALED = 'REVEALED', - ACTIVE = 'ACTIVE', - INACTIVE = 'INACTIVE', -} - -export class Package { - x: number; - y: number; - size: number; - name: string; - url: string; - messageContents: string; - corners: number = 10; - startSize: number = 5; - currentSize: number; - wasTouched: boolean = false; - wasInteractedWith: boolean = false; - hover: boolean = false; - packageState: PackageStates = PackageStates.HIDDEN; - - constructor( - x: number, - y: number, - size: number, - name?: string, - messageContents?: string, - packageURL?: string - ) { - this.x = x; - this.y = y; - this.size = size; - this.name = name; - this.url = packageURL; - this.currentSize = this.startSize; - this.messageContents = messageContents; - - combineLatest([revealedArea$, playerHead$]).subscribe(([revealedArea, playerHead]) => { - const isRevealed = areasColliding( - { x: this.x, y: this.y, w: this.currentSize }, - revealedArea - ); - const isTouched = areasColliding({ x: this.x, y: this.y, w: this.size }, playerHead, true); - - if (isRevealed) { - if (this.packageState !== PackageStates.ACTIVE) { - this.packageState = PackageStates.REVEALED; - } - if (this.wasInteractedWith) { - this.packageState = PackageStates.INACTIVE; - } - - if (isTouched && !this.wasTouched) { - this.packageState = PackageStates.ACTIVE; - this.wasTouched = true; - } - } else { - if (this.wasInteractedWith) { - this.packageState = PackageStates.INACTIVE; - } else if (this.wasTouched && !this.wasInteractedWith) { - this.packageState = PackageStates.ACTIVE; - } else { - this.packageState = PackageStates.HIDDEN; - } - } - - // console.log(this.packageState); - }); - } - - public draw() { - mp5.noStroke(); - mp5.rectMode('center'); - mp5.ellipseMode('center'); - - if (this.packageState === PackageStates.HIDDEN) { - // Scale down after it was revealed or active - if (this.currentSize > this.startSize) { - this.currentSize--; - } - - /*mp5.square(this.x, this.y, this.currentSize, this.corners);*/ - } else if (this.packageState === PackageStates.REVEALED) { - // Scale up if not large enough - if (this.currentSize < this.size) { - this.currentSize++; - } - - mp5.square(this.x, this.y, this.currentSize, this.corners); - mp5.square(this.x - this.size - 10, this.y, this.currentSize, this.corners); - mp5.square(this.x, this.y - this.size - 10, this.currentSize, this.corners); - } else if (this.packageState === PackageStates.ACTIVE) { - mp5.fill(mp5.color(colors.redLight)); - mp5.square(this.x, this.y, this.currentSize, this.corners); - mp5.square(this.x - this.size - 10, this.y, this.currentSize, this.corners); - mp5.square(this.x, this.y - this.size - 10, this.currentSize, this.corners); - - // Check if mouse is over the squares, if so animate and enable click - const mouseOverShape = areasColliding( - { x: mp5.mouseX, y: mp5.mouseY, w: 70 }, - { x: this.x, y: this.y, w: this.currentSize } - ); - - if (mouseOverShape) { - this.hover = true; - mp5.square(this.x, this.y, this.currentSize + mp5.random(-5, 5), this.corners); - mp5.square( - this.x - this.size - 10, - this.y, - this.currentSize + mp5.random(-5, 5), - this.corners - ); - mp5.square( - this.x, - this.y - this.size - 10, - this.currentSize + mp5.random(-5, 5), - this.corners - ); - } else { - this.hover = false; - } - } else if (this.packageState === PackageStates.INACTIVE) { - mp5.fill(mp5.color(colors.greyLight)); - mp5.square(this.x, this.y, this.currentSize, this.corners); - mp5.square(this.x - this.size - 10, this.y, this.currentSize, this.corners); - mp5.square(this.x, this.y - this.size - 10, this.currentSize, this.corners); - } - } - - public onClick() { - if (this.hover && !this.wasInteractedWith) { - this.wasInteractedWith = true; - store.getState().addInfoMessage({ - headline: this.name, - innerHTML: this.messageContents, - }); - } - } -} diff --git a/src/sketchObjects/Revealable.ts b/src/sketchObjects/Revealable.ts new file mode 100644 index 0000000..def7fde --- /dev/null +++ b/src/sketchObjects/Revealable.ts @@ -0,0 +1,63 @@ +import { combineLatest } from 'rxjs'; +import { mp5 } from '../../main'; +import { areasColliding, playerHead$, revealedArea$ } from '../area'; +import { colors } from '../constants/colors'; +import { Area } from '../types'; + +export enum RevealableTypes { + LEGACY = 'LEGACY', + CONTRIBUTOR = 'CONTRIBUTOR', + PACKAGE = 'PACKAGE', +} + +export interface RevealableInterface { + type: RevealableTypes; + name: string; + contents: string; + url: string; + path?: string; + imageUrl?: string; +} + +enum RevealableStates { + HIDDEN = 'HIDDEN', + REVEALED = 'REVEALED', + FOUND = 'FOUND', +} + +export class Revealable { + state: RevealableStates = RevealableStates.HIDDEN; + area: Area; + hover: boolean; + + constructor({ type, name, path, contents, url, imageUrl }: RevealableInterface, area: Area) { + this.area = area; + + combineLatest([revealedArea$, playerHead$]).subscribe(([revealedArea, playerHead]) => { + const isRevealed = areasColliding(revealedArea, this.area); + const isHovered = areasColliding(playerHead, this.area); + + if (isRevealed && isHovered) { + this.state = RevealableStates.FOUND; + } else if (isRevealed && !isHovered) { + this.state = RevealableStates.REVEALED; + } else { + this.state = RevealableStates.HIDDEN; + } + }); + } + + public draw() { + if (this.state === RevealableStates.HIDDEN) { + mp5.fill(mp5.color(colors.greyLight)); + } else if (this.state === RevealableStates.REVEALED) { + mp5.fill(mp5.color(colors.red)); + } else if (this.state === RevealableStates.FOUND) { + mp5.fill(mp5.color(colors.redDark)); + } + + mp5.ellipse(this.area.x, this.area.y, this.area.w); + } + + public onClick() {} +} diff --git a/src/store.ts b/src/store.ts index 88da043..3c20ebf 100644 --- a/src/store.ts +++ b/src/store.ts @@ -3,9 +3,10 @@ import { devtools } from 'zustand/middleware'; import { Scenes } from './scenes/scenes'; import { CompanionMessage, CompanionState } from './ui/companion'; import project from '../metadata/project.json'; -import { getSubproject } from './helpers'; -import { SubProject } from './types'; import { InfoMessageType } from './ui/info'; +import { RevealableInterface, RevealableTypes } from './sketchObjects/Revealable'; +import { SubProject } from './types'; +import { getRevealablesforSubproject } from './helpers'; export interface State { currentScene: Scenes; @@ -15,10 +16,8 @@ export interface State { addInfoMessage: (newMessage: InfoMessageType) => void; userMessages: CompanionMessage[]; addUserMessage: (newMessage: CompanionMessage) => void; - currContributors: any; - currLegacy: any; - currPackages: any; - setDetailScene: (packageName: string) => void; + revealables: RevealableInterface[]; + setProjectMetadata: (projectName: string) => void; } const store = create( @@ -32,17 +31,11 @@ const store = create( userMessages: [], addUserMessage: (newMessage) => set((state) => ({ userMessages: [...state.userMessages, newMessage] })), - currContributors: [], - currLegacy: [], - currPackages: [], - setDetailScene: (packageName) => - set(() => ({ - currContributors: getSubproject(packageName, project.subprojects as SubProject[]).contents - .contributors, - currLegacy: getSubproject(packageName, project.subprojects as SubProject[]).contents.legacy, - currPackages: getSubproject(packageName, project.subprojects as SubProject[]).contents - .packages, - })), + revealables: [], + setProjectMetadata: (projectName) => + set({ + revealables: getRevealablesforSubproject(projectName, project.subprojects), + }), })) ); diff --git a/src/types.ts b/src/types.ts index 280428e..5af1963 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,15 +1,32 @@ +import { RevealableInterface } from './sketchObjects/Revealable'; + export interface SubProject { name: string; path: string; size: number; - contents: { - contributors: any[]; - legacy: any[]; - packages: any[]; - }; + revealables: RevealableInterface[]; } +export interface JSONSubproject { + name: string; + path: string; + size: number; + revealables: Array<{ + type: string; + name: string; + contents: string; + url: string; + path?: string; + imageUrl?: string; + }>; +} export interface Coordinates { x: number; y: number; } + +export interface Area { + x: number; + y: number; + w: number; +}