Skip to content

Commit 440fcf4

Browse files
committed
[feat] Implement AtomicRelay and AtomicStore
1 parent 2d3b03f commit 440fcf4

File tree

12 files changed

+54
-46
lines changed

12 files changed

+54
-46
lines changed

src/components/atoms/Game.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
11
import { CFG, css } from '~/css';
22
import { GameCanvas } from './GameCanvas';
3-
import { type RelayEvents, Script } from '~/script';
3+
import { Script } from '~/script';
44
import { GameCountdown } from './GameCountdown';
55

66
type GameOptions = {
7-
sound: RelayEvents['audio:register'];
7+
sound: AtomicRelay['audio:register'];
88
columns: number;
99
rows: number;
1010
children: any;
11-
evtStart: keyof RelayEvents;
12-
evtPause: keyof RelayEvents;
13-
evtOver: keyof RelayEvents;
11+
evtStart: keyof AtomicRelay;
12+
evtPause: keyof AtomicRelay;
13+
evtOver: keyof AtomicRelay;
1414
};
1515

16-
export type GameStore = {
16+
type GameStore = {
1717
gameConfig: {
1818
music: 'on' | 'off';
1919
difficulty: 'beginner' | 'intermediate' | 'expert';
2020
};
2121
};
2222

23-
export type GameEvents = {
23+
type GameEvents = {
2424
'game:evt:boot': void;
2525
'game:evt:countdown': void;
2626
};
2727

28+
declare global {
29+
interface AtomicRelay extends GameEvents {}
30+
interface AtomicStore extends GameStore {}
31+
}
32+
2833
export function Game({
2934
sound,
3035
columns,

src/components/atoms/GameCanvas.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ export type CanvasEvents = {
55
'canvas:draw': { fn?: (ctx: CanvasRenderingContext2D) => void };
66
};
77

8+
declare global {
9+
interface AtomicRelay extends CanvasEvents {}
10+
}
11+
812
type CanvasOptions = {
913
columns: number;
1014
rows: number;

src/components/atoms/GameCountdown.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { css } from '~/css';
2-
import {type RelayEvents, Script} from '~/script';
2+
import {Script} from '~/script';
33

44
type GameCountdownProps = {
5-
evtStart:keyof RelayEvents;
5+
evtStart:keyof AtomicRelay;
66
};
77

88
export function GameCountdown ({evtStart}:GameCountdownProps) {

src/components/atoms/GameSidebar.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { css } from '~/css';
2-
import { type RelayEvents } from '~/script';
32
import { GameStartButton } from './GameStartButton';
43

54
type GameSidebarOptions = {
65
width?: number;
76
children: any;
8-
evtStart: keyof RelayEvents;
9-
evtEnd: keyof RelayEvents;
7+
evtStart: keyof AtomicRelay;
8+
evtEnd: keyof AtomicRelay;
109
};
1110

1211
export function GameSidebar({

src/components/atoms/GameStartButton.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { css } from '~/css';
2-
import { Script, type RelayEvents } from '~/script';
2+
import { Script } from '~/script';
33

44
type GameStartButtonOptions = {
55
timer: number;
6-
eventStart: keyof RelayEvents;
7-
eventOver: keyof RelayEvents;
6+
eventStart: keyof AtomicRelay;
7+
eventOver: keyof AtomicRelay;
88
style?: Record<string, unknown>;
99
};
1010

src/components/modules/AudioPlayer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Module } from '~/script';
22

3-
export type AudioPlayerEvents = {
3+
type AudioPlayerEvents = {
44
'audio:register': { track: string[]; fx: Record<string, string> };
55
'audio:enable': void;
66
'audio:disable': void;
@@ -11,6 +11,10 @@ export type AudioPlayerEvents = {
1111
'audio:stop': void;
1212
};
1313

14+
declare global {
15+
interface AtomicRelay extends AudioPlayerEvents {}
16+
}
17+
1418
export function AudioPlayer() {
1519
return (
1620
<Module name="audio">

src/components/modules/Modal.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import {css} from "~/css";
22
import {Module, Script} from "~/script";
33

4-
export type ModalEvents = {
4+
type ModalEvents = {
55
'modal:open': {frag:string};
66
'modal:replace': {frag:string};
77
'modal:close': void;
88
};
99

10+
declare global {
11+
interface AtomicRelay extends ModalEvents {}
12+
}
13+
1014
export function Modal () {
1115
const cls = css.use('f', 'fv', 'fa_c', 'fj_c', {
1216
position: 'absolute',

src/routes/breakout/Game.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { GameSidebar } from '~/components/atoms/GameSidebar';
1616
import { KeyArrowsHorizontal } from '~/components/atoms/Keys';
1717

1818
/* Defines all event types the Breakout game will use. */
19-
export type BreakoutGameEvents = {
19+
type BreakoutGameEvents = {
2020
'breakout:start': void;
2121
'breakout:pause': void;
2222
'breakout:gameover': void;
@@ -39,6 +39,10 @@ export type BreakoutGameEvents = {
3939
'breakout:cleared': void;
4040
};
4141

42+
declare global {
43+
interface AtomicRelay extends BreakoutGameEvents {}
44+
}
45+
4246
export function BreakoutGame() {
4347
const gameBoardId = css.cid();
4448

src/routes/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ import { AudioPlayer } from '~/components/modules/AudioPlayer';
1414

1515
const PREVIEWS = [BreakoutPreview, TetrisPreview, SnakePreview];
1616

17-
export type SystemEvents = {
17+
type SystemEvents = {
1818
'sys:randomgame': number;
1919
};
2020

21+
declare global {
22+
interface AtomicRelay extends SystemEvents {}
23+
}
24+
2125
export async function routes<State extends Record<string, unknown>>(
2226
r: Router<State>
2327
) {

src/routes/snake/Game.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { GameModal } from '~/components/atoms/GameModal';
1414
type Dir = 'up' | 'down' | 'left' | 'right';
1515

1616
/* Defines all event types the Snake game will use. */
17-
export type SnakeGameEvents = {
17+
type SnakeGameEvents = {
1818
'snake:start': void;
1919
'snake:pause': void;
2020
'snake:gameover': void;
@@ -26,6 +26,10 @@ export type SnakeGameEvents = {
2626
};
2727
};
2828

29+
declare global {
30+
interface AtomicRelay extends SnakeGameEvents {}
31+
}
32+
2933
export function SnakeGame() {
3034
return (
3135
<GameModal columns={SNAKE_CFG.COLS}>

0 commit comments

Comments
 (0)