@xrift/world-components 0.23.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts +2 -0
  2. package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts.map +1 -0
  3. package/dist/components/EntryLogBoard/__tests__/utils.test.js +165 -0
  4. package/dist/components/EntryLogBoard/__tests__/utils.test.js.map +1 -0
  5. package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts +10 -0
  6. package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts.map +1 -0
  7. package/dist/components/EntryLogBoard/components/AvatarIcon.js +20 -0
  8. package/dist/components/EntryLogBoard/components/AvatarIcon.js.map +1 -0
  9. package/dist/components/EntryLogBoard/components/LogRow.d.ts +12 -0
  10. package/dist/components/EntryLogBoard/components/LogRow.d.ts.map +1 -0
  11. package/dist/components/EntryLogBoard/components/LogRow.js +22 -0
  12. package/dist/components/EntryLogBoard/components/LogRow.js.map +1 -0
  13. package/dist/components/EntryLogBoard/constants.d.ts +9 -0
  14. package/dist/components/EntryLogBoard/constants.d.ts.map +1 -0
  15. package/dist/components/EntryLogBoard/constants.js +16 -0
  16. package/dist/components/EntryLogBoard/constants.js.map +1 -0
  17. package/dist/components/EntryLogBoard/hooks/useEntryLog.d.ts +12 -0
  18. package/dist/components/EntryLogBoard/hooks/useEntryLog.d.ts.map +1 -0
  19. package/dist/components/EntryLogBoard/hooks/useEntryLog.js +50 -0
  20. package/dist/components/EntryLogBoard/hooks/useEntryLog.js.map +1 -0
  21. package/dist/components/EntryLogBoard/index.d.ts +4 -0
  22. package/dist/components/EntryLogBoard/index.d.ts.map +1 -0
  23. package/dist/components/EntryLogBoard/index.js +46 -0
  24. package/dist/components/EntryLogBoard/index.js.map +1 -0
  25. package/dist/components/EntryLogBoard/types.d.ts +70 -0
  26. package/dist/components/EntryLogBoard/types.d.ts.map +1 -0
  27. package/dist/components/EntryLogBoard/types.js +2 -0
  28. package/dist/components/EntryLogBoard/types.js.map +1 -0
  29. package/dist/components/EntryLogBoard/utils.d.ts +28 -0
  30. package/dist/components/EntryLogBoard/utils.d.ts.map +1 -0
  31. package/dist/components/EntryLogBoard/utils.js +45 -0
  32. package/dist/components/EntryLogBoard/utils.js.map +1 -0
  33. package/dist/contexts/WorldEventContext.d.ts +32 -0
  34. package/dist/contexts/WorldEventContext.d.ts.map +1 -0
  35. package/dist/contexts/WorldEventContext.js +54 -0
  36. package/dist/contexts/WorldEventContext.js.map +1 -0
  37. package/dist/contexts/XRiftContext.d.ts +7 -1
  38. package/dist/contexts/XRiftContext.d.ts.map +1 -1
  39. package/dist/contexts/XRiftContext.js +5 -2
  40. package/dist/contexts/XRiftContext.js.map +1 -1
  41. package/dist/hooks/useWorldEvent.d.ts +25 -0
  42. package/dist/hooks/useWorldEvent.d.ts.map +1 -0
  43. package/dist/hooks/useWorldEvent.js +45 -0
  44. package/dist/hooks/useWorldEvent.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +3 -0
  48. package/dist/index.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/__tests__/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildLogEntryId, createLogEntry, defaultFormatTimestamp, mergeLogs, } from '../utils';
3
+ describe('defaultFormatTimestamp', () => {
4
+ it('HH:MM 形式でフォーマットする', () => {
5
+ const date = new Date(2024, 0, 1, 9, 5);
6
+ expect(defaultFormatTimestamp(date)).toBe('09:05');
7
+ });
8
+ it('午後の時刻も正しくフォーマットする', () => {
9
+ const date = new Date(2024, 0, 1, 14, 30);
10
+ expect(defaultFormatTimestamp(date)).toBe('14:30');
11
+ });
12
+ it('0時0分をゼロパディングする', () => {
13
+ const date = new Date(2024, 0, 1, 0, 0);
14
+ expect(defaultFormatTimestamp(date)).toBe('00:00');
15
+ });
16
+ });
17
+ describe('buildLogEntryId', () => {
18
+ it('同じユーザーの join が無い場合は 0 から始まるIDを生成する', () => {
19
+ const id = buildLogEntryId('join', 'user-1', []);
20
+ expect(id).toBe('join-user-1-0');
21
+ });
22
+ it('同じユーザーの join が1件ある場合は 1 のIDを生成する', () => {
23
+ const existingLogs = [
24
+ {
25
+ id: 'join-user-1-0',
26
+ type: 'join',
27
+ userId: 'user-1',
28
+ displayName: 'Alice',
29
+ avatarUrl: null,
30
+ timestamp: '10:00',
31
+ },
32
+ ];
33
+ const id = buildLogEntryId('join', 'user-1', existingLogs);
34
+ expect(id).toBe('join-user-1-1');
35
+ });
36
+ it('異なるユーザーのログはカウントに含めない', () => {
37
+ const existingLogs = [
38
+ {
39
+ id: 'join-user-2-0',
40
+ type: 'join',
41
+ userId: 'user-2',
42
+ displayName: 'Bob',
43
+ avatarUrl: null,
44
+ timestamp: '10:00',
45
+ },
46
+ ];
47
+ const id = buildLogEntryId('join', 'user-1', existingLogs);
48
+ expect(id).toBe('join-user-1-0');
49
+ });
50
+ it('異なるタイプのログはカウントに含めない', () => {
51
+ const existingLogs = [
52
+ {
53
+ id: 'leave-user-1-0',
54
+ type: 'leave',
55
+ userId: 'user-1',
56
+ displayName: 'Alice',
57
+ avatarUrl: null,
58
+ timestamp: '10:00',
59
+ },
60
+ ];
61
+ const id = buildLogEntryId('join', 'user-1', existingLogs);
62
+ expect(id).toBe('join-user-1-0');
63
+ });
64
+ it('leave タイプでも正しくIDを生成する', () => {
65
+ const existingLogs = [
66
+ {
67
+ id: 'leave-user-1-0',
68
+ type: 'leave',
69
+ userId: 'user-1',
70
+ displayName: 'Alice',
71
+ avatarUrl: null,
72
+ timestamp: '10:00',
73
+ },
74
+ ];
75
+ const id = buildLogEntryId('leave', 'user-1', existingLogs);
76
+ expect(id).toBe('leave-user-1-1');
77
+ });
78
+ });
79
+ describe('createLogEntry', () => {
80
+ const mockFormatTimestamp = () => '12:34';
81
+ it('join エントリを正しく生成する', () => {
82
+ const entry = createLogEntry('join', 'user-1', 'Alice', 'https://example.com/avatar.png', [], mockFormatTimestamp);
83
+ expect(entry).toEqual({
84
+ id: 'join-user-1-0',
85
+ type: 'join',
86
+ userId: 'user-1',
87
+ displayName: 'Alice',
88
+ avatarUrl: 'https://example.com/avatar.png',
89
+ timestamp: '12:34',
90
+ });
91
+ });
92
+ it('leave エントリを正しく生成する', () => {
93
+ const entry = createLogEntry('leave', 'user-1', 'Alice', null, [], mockFormatTimestamp);
94
+ expect(entry).toEqual({
95
+ id: 'leave-user-1-0',
96
+ type: 'leave',
97
+ userId: 'user-1',
98
+ displayName: 'Alice',
99
+ avatarUrl: null,
100
+ timestamp: '12:34',
101
+ });
102
+ });
103
+ it('既存ログを考慮してIDを決定論的に生成する', () => {
104
+ const existingLogs = [
105
+ {
106
+ id: 'join-user-1-0',
107
+ type: 'join',
108
+ userId: 'user-1',
109
+ displayName: 'Alice',
110
+ avatarUrl: null,
111
+ timestamp: '10:00',
112
+ },
113
+ ];
114
+ const entry = createLogEntry('join', 'user-1', 'Alice', null, existingLogs, mockFormatTimestamp);
115
+ expect(entry.id).toBe('join-user-1-1');
116
+ });
117
+ });
118
+ describe('mergeLogs', () => {
119
+ const baseEntry = {
120
+ id: 'join-user-1-0',
121
+ type: 'join',
122
+ userId: 'user-1',
123
+ displayName: 'Alice',
124
+ avatarUrl: null,
125
+ timestamp: '10:00',
126
+ };
127
+ it('空のログに新しいエントリを追加する', () => {
128
+ const result = mergeLogs([], baseEntry, 20);
129
+ expect(result).toHaveLength(1);
130
+ expect(result[0]).toEqual(baseEntry);
131
+ });
132
+ it('重複するIDのエントリは追加しない(冪等性)', () => {
133
+ const existingLogs = [baseEntry];
134
+ const result = mergeLogs(existingLogs, baseEntry, 20);
135
+ expect(result).toHaveLength(1);
136
+ expect(result).toBe(existingLogs); // 同じ参照を返す
137
+ });
138
+ it('異なるIDのエントリは追加する', () => {
139
+ const existingLogs = [baseEntry];
140
+ const newEntry = {
141
+ ...baseEntry,
142
+ id: 'leave-user-1-0',
143
+ type: 'leave',
144
+ };
145
+ const result = mergeLogs(existingLogs, newEntry, 20);
146
+ expect(result).toHaveLength(2);
147
+ });
148
+ it('maxEntries を超えた場合は古いエントリを削除する', () => {
149
+ const existingLogs = [
150
+ { ...baseEntry, id: 'join-user-1-0' },
151
+ { ...baseEntry, id: 'join-user-2-0', userId: 'user-2' },
152
+ { ...baseEntry, id: 'join-user-3-0', userId: 'user-3' },
153
+ ];
154
+ const newEntry = {
155
+ ...baseEntry,
156
+ id: 'join-user-4-0',
157
+ userId: 'user-4',
158
+ };
159
+ const result = mergeLogs(existingLogs, newEntry, 3);
160
+ expect(result).toHaveLength(3);
161
+ expect(result[0].id).toBe('join-user-2-0'); // 最も古いエントリが削除される
162
+ expect(result[2].id).toBe('join-user-4-0'); // 新しいエントリが末尾に追加
163
+ });
164
+ });
165
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Euler, type Vector3 } from '@react-three/fiber';
2
+ interface Props {
3
+ avatarUrl: string | null;
4
+ size: number;
5
+ position?: Vector3;
6
+ rotation?: Euler;
7
+ }
8
+ export declare const AvatarIcon: ({ avatarUrl, size, position, rotation }: Props) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=AvatarIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarIcon.d.ts","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/components/AvatarIcon.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE7D,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB;AA6BD,eAAO,MAAM,UAAU,GAAI,yCAAyC,KAAK,4CAexE,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * AvatarIcon コンポーネント
4
+ *
5
+ * ログ行のアバターアイコンを表示する。
6
+ * 画像URLがある場合はテクスチャ、ない場合はプレースホルダー円を表示。
7
+ */
8
+ import { useTexture } from '@react-three/drei';
9
+ const AvatarPlaceholder = ({ size, position, rotation, }) => (_jsxs("mesh", { position: position, rotation: rotation, children: [_jsx("circleGeometry", { args: [size / 2, 32] }), _jsx("meshBasicMaterial", { color: 0x666666 })] }));
10
+ const AvatarImage = ({ avatarUrl, size, position, rotation, }) => {
11
+ const texture = useTexture(avatarUrl);
12
+ return (_jsxs("mesh", { position: position, rotation: rotation, children: [_jsx("circleGeometry", { args: [size / 2, 32] }), _jsx("meshBasicMaterial", { map: texture })] }));
13
+ };
14
+ export const AvatarIcon = ({ avatarUrl, size, position, rotation }) => {
15
+ if (!avatarUrl) {
16
+ return (_jsx(AvatarPlaceholder, { size: size, position: position, rotation: rotation }));
17
+ }
18
+ return (_jsx(AvatarImage, { avatarUrl: avatarUrl, size: size, position: position, rotation: rotation }));
19
+ };
20
+ //# sourceMappingURL=AvatarIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarIcon.js","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/components/AvatarIcon.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAU9C,MAAM,iBAAiB,GAAG,CAAC,EACzB,IAAI,EACJ,QAAQ,EACR,QAAQ,GACiB,EAAE,EAAE,CAAC,CAC9B,gBAAM,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,aAC1C,yBAAgB,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,GAAI,EACxC,4BAAmB,KAAK,EAAE,QAAQ,GAAI,IACjC,CACR,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,EACnB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,QAAQ,GACsB,EAAE,EAAE;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAErC,OAAO,CACL,gBAAM,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,aAC1C,yBAAgB,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,GAAI,EACxC,4BAAmB,GAAG,EAAE,OAAO,GAAI,IAC9B,CACR,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAC1E,CAAA;IACH,CAAC;IAED,OAAO,CACL,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { type Colors, type Labels, type LogEntry } from '../types';
2
+ interface Props {
3
+ entry: LogEntry;
4
+ labels: Labels;
5
+ colors: Colors;
6
+ y: number;
7
+ scale: number;
8
+ }
9
+ declare const ROW_HEIGHT = 0.25;
10
+ export declare const LogRow: ({ entry, labels, colors, y, scale }: Props) => import("react/jsx-runtime").JSX.Element;
11
+ export { ROW_HEIGHT };
12
+ //# sourceMappingURL=LogRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogRow.d.ts","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/components/LogRow.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGlE,UAAU,KAAK;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd;AAED,QAAA,MAAM,UAAU,OAAO,CAAA;AAIvB,eAAO,MAAM,MAAM,GAAI,qCAAqC,KAAK,4CAoDhE,CAAA;AAED,OAAO,EAAE,UAAU,EAAE,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * LogRow コンポーネント
4
+ *
5
+ * 入退室ログの1行分を3D空間にレンダリングする。
6
+ * [アバター] [時刻] [名前] [ラベル]
7
+ */
8
+ import { Text } from '@react-three/drei';
9
+ import { AvatarIcon } from './AvatarIcon';
10
+ const ROW_HEIGHT = 0.25;
11
+ const AVATAR_SIZE = 0.18;
12
+ const FONT_SIZE = 0.1;
13
+ export const LogRow = ({ entry, labels, colors, y, scale }) => {
14
+ const rowHeight = ROW_HEIGHT * scale;
15
+ const avatarSize = AVATAR_SIZE * scale;
16
+ const fontSize = FONT_SIZE * scale;
17
+ const labelColor = entry.type === 'join' ? colors.join : colors.leave;
18
+ const labelText = entry.type === 'join' ? labels.join : labels.leave;
19
+ return (_jsxs("group", { position: [0, y, 0.01], children: [_jsx(AvatarIcon, { avatarUrl: entry.avatarUrl, size: avatarSize, position: [-0.9 * scale, 0, 0] }), _jsx(Text, { position: [-0.7 * scale, 0, 0], fontSize: fontSize * 0.8, color: 0x888888, anchorX: "left", anchorY: "middle", children: entry.timestamp }), _jsx(Text, { position: [-0.3 * scale, 0, 0], fontSize: fontSize, color: colors.text, anchorX: "left", anchorY: "middle", maxWidth: 0.8 * scale, children: entry.displayName }), _jsx(Text, { position: [0.55 * scale, 0, 0], fontSize: fontSize * 0.9, color: labelColor, anchorX: "left", anchorY: "middle", fontWeight: "bold", children: labelText })] }));
20
+ };
21
+ export { ROW_HEIGHT };
22
+ //# sourceMappingURL=LogRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogRow.js","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/components/LogRow.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAUzC,MAAM,UAAU,GAAG,IAAI,CAAA;AACvB,MAAM,WAAW,GAAG,IAAI,CAAA;AACxB,MAAM,SAAS,GAAG,GAAG,CAAA;AAErB,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAS,EAAE,EAAE;IACnE,MAAM,SAAS,GAAG,UAAU,GAAG,KAAK,CAAA;IACpC,MAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAA;IACtC,MAAM,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;IAEpE,OAAO,CACL,iBAAO,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAE3B,KAAC,UAAU,IACT,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,EAGF,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,QAAQ,GAAG,GAAG,EACxB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,QAAQ,YAEf,KAAK,CAAC,SAAS,GACX,EAGP,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,CAAC,IAAI,EAClB,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,QAAQ,EAChB,QAAQ,EAAE,GAAG,GAAG,KAAK,YAEpB,KAAK,CAAC,WAAW,GACb,EAGP,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,QAAQ,GAAG,GAAG,EACxB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,QAAQ,EAChB,UAAU,EAAC,MAAM,YAEhB,SAAS,GACL,IACD,CACT,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,UAAU,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { type Colors, type Labels, type LogEntry } from './types';
2
+ export declare const DEFAULT_STATE_NAMESPACE = "entry-log";
3
+ export declare const DEFAULT_MAX_ENTRIES = 20;
4
+ export declare const DEFAULT_DISPLAY_NAME_FALLBACK = "Unknown";
5
+ export declare const DEFAULT_LABELS: Labels;
6
+ export declare const DEFAULT_COLORS: Colors;
7
+ /** useInstanceState / useState の初期値(参照同一性を保証) */
8
+ export declare const DEFAULT_LOGS: LogEntry[];
9
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEjE,eAAO,MAAM,uBAAuB,cAAc,CAAA;AAElD,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,eAAO,MAAM,6BAA6B,YAAY,CAAA;AAEtD,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,MAK5B,CAAA;AAED,iDAAiD;AACjD,eAAO,MAAM,YAAY,EAAE,QAAQ,EAAO,CAAA"}
@@ -0,0 +1,16 @@
1
+ export const DEFAULT_STATE_NAMESPACE = 'entry-log';
2
+ export const DEFAULT_MAX_ENTRIES = 20;
3
+ export const DEFAULT_DISPLAY_NAME_FALLBACK = 'Unknown';
4
+ export const DEFAULT_LABELS = {
5
+ join: '入室',
6
+ leave: '退室',
7
+ };
8
+ export const DEFAULT_COLORS = {
9
+ join: '#4CAF50',
10
+ leave: '#F44336',
11
+ background: '#1a1a2e',
12
+ text: '#ffffff',
13
+ };
14
+ /** useInstanceState / useState の初期値(参照同一性を保証) */
15
+ export const DEFAULT_LOGS = [];
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,WAAW,CAAA;AAElD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAErC,MAAM,CAAC,MAAM,6BAA6B,GAAG,SAAS,CAAA;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,YAAY,GAAe,EAAE,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { type LogEntry } from '../types';
2
+ interface UseEntryLogOptions {
3
+ stateNamespace: string;
4
+ maxEntries: number;
5
+ displayNameFallback: string;
6
+ formatTimestamp: (date: Date) => string;
7
+ onJoin?: (entry: LogEntry) => void;
8
+ onLeave?: (entry: LogEntry) => void;
9
+ }
10
+ export declare function useEntryLog(options: UseEntryLogOptions): LogEntry[];
11
+ export {};
12
+ //# sourceMappingURL=useEntryLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEntryLog.d.ts","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/hooks/useEntryLog.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,QAAQ,EAGd,MAAM,UAAU,CAAA;AAGjB,UAAU,kBAAkB;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAA;IACvC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,QAAQ,EAAE,CAmEnE"}
@@ -0,0 +1,50 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useUsers } from '../../../contexts/UsersContext';
3
+ import { useInstanceState } from '../../../hooks/useInstanceState';
4
+ import { useWorldEvent } from '../../../hooks/useWorldEvent';
5
+ import { DEFAULT_LOGS } from '../constants';
6
+ import { createLogEntry, mergeLogs } from '../utils';
7
+ export function useEntryLog(options) {
8
+ const { localUser, remoteUsers } = useUsers();
9
+ const [logs, setLogs] = useInstanceState(`${options.stateNamespace}-logs`, DEFAULT_LOGS);
10
+ // logs の最新値を ref で保持(イベントコールバック内で参照)
11
+ const logsRef = useRef(logs);
12
+ logsRef.current = logs;
13
+ // options を ref で保持(stale closure 回避)
14
+ const optionsRef = useRef(options);
15
+ optionsRef.current = options;
16
+ // ユーザー情報キャッシュ(退室時に useUsers から消えている可能性があるため)
17
+ const userCacheRef = useRef(new Map());
18
+ useEffect(() => {
19
+ if (localUser) {
20
+ userCacheRef.current.set(localUser.id, {
21
+ displayName: localUser.displayName,
22
+ avatarUrl: localUser.avatarUrl,
23
+ });
24
+ }
25
+ for (const user of remoteUsers) {
26
+ userCacheRef.current.set(user.id, {
27
+ displayName: user.displayName,
28
+ avatarUrl: user.avatarUrl,
29
+ });
30
+ }
31
+ }, [localUser, remoteUsers]);
32
+ // user-joined イベント
33
+ useWorldEvent('user-joined', (data) => {
34
+ const opts = optionsRef.current;
35
+ const cached = userCacheRef.current.get(data.userId);
36
+ const entry = createLogEntry('join', data.userId, cached?.displayName ?? opts.displayNameFallback, cached?.avatarUrl ?? null, logsRef.current, opts.formatTimestamp);
37
+ setLogs((prev) => mergeLogs(prev, entry, opts.maxEntries));
38
+ opts.onJoin?.(entry);
39
+ });
40
+ // user-left イベント
41
+ useWorldEvent('user-left', (data) => {
42
+ const opts = optionsRef.current;
43
+ const cached = userCacheRef.current.get(data.userId);
44
+ const entry = createLogEntry('leave', data.userId, cached?.displayName ?? opts.displayNameFallback, cached?.avatarUrl ?? null, logsRef.current, opts.formatTimestamp);
45
+ setLogs((prev) => mergeLogs(prev, entry, opts.maxEntries));
46
+ opts.onLeave?.(entry);
47
+ });
48
+ return logs;
49
+ }
50
+ //# sourceMappingURL=useEntryLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEntryLog.js","sourceRoot":"","sources":["../../../../src/components/EntryLogBoard/hooks/useEntryLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Props } from './types';
2
+ export type { Props as EntryLogBoardProps } from './types';
3
+ export declare const EntryLogBoard: ({ stateNamespace, maxEntries, formatTimestamp, displayNameFallback, labels: labelsOverride, colors: colorsOverride, position, rotation, scale, onJoin, onLeave, }: Props) => import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAA4B,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAG9D,YAAY,EAAE,KAAK,IAAI,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAM1D,eAAO,MAAM,aAAa,GAAI,mKAY3B,KAAK,4CAuEP,CAAA"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EntryLogBoard コンポーネント
4
+ *
5
+ * ワールドへの入退室ログを3D空間のボードに表示する。
6
+ * useWorldEvent でプラットフォームの user-joined / user-left イベントを受信し、
7
+ * useInstanceState でログを全クライアント間で同期する。
8
+ */
9
+ import { useMemo } from 'react';
10
+ import { Text } from '@react-three/drei';
11
+ import { LogRow, ROW_HEIGHT } from './components/LogRow';
12
+ import { DEFAULT_COLORS, DEFAULT_DISPLAY_NAME_FALLBACK, DEFAULT_LABELS, DEFAULT_MAX_ENTRIES, DEFAULT_STATE_NAMESPACE, } from './constants';
13
+ import { useEntryLog } from './hooks/useEntryLog';
14
+ import { defaultFormatTimestamp } from './utils';
15
+ const TITLE = '入退室ログ';
16
+ const BOARD_PADDING = 0.15;
17
+ const TITLE_HEIGHT = 0.35;
18
+ export const EntryLogBoard = ({ stateNamespace = DEFAULT_STATE_NAMESPACE, maxEntries = DEFAULT_MAX_ENTRIES, formatTimestamp = defaultFormatTimestamp, displayNameFallback = DEFAULT_DISPLAY_NAME_FALLBACK, labels: labelsOverride, colors: colorsOverride, position = [0, 0, 0], rotation = [0, 0, 0], scale = 1, onJoin, onLeave, }) => {
19
+ const labels = useMemo(() => ({ ...DEFAULT_LABELS, ...labelsOverride }), [labelsOverride]);
20
+ const colors = useMemo(() => ({ ...DEFAULT_COLORS, ...colorsOverride }), [colorsOverride]);
21
+ const logs = useEntryLog({
22
+ stateNamespace,
23
+ maxEntries,
24
+ displayNameFallback,
25
+ formatTimestamp,
26
+ onJoin,
27
+ onLeave,
28
+ });
29
+ // ボードサイズの計算
30
+ const rowHeight = ROW_HEIGHT * scale;
31
+ const boardWidth = 2.2 * scale;
32
+ const contentHeight = Math.max(maxEntries * rowHeight, rowHeight);
33
+ const boardHeight = contentHeight + TITLE_HEIGHT * scale + BOARD_PADDING * 2 * scale;
34
+ const titleY = boardHeight / 2 - TITLE_HEIGHT * scale / 2 - BOARD_PADDING * scale / 2;
35
+ // ログ行は上から新しい順に表示
36
+ const reversedLogs = useMemo(() => [...logs].reverse(), [logs]);
37
+ return (_jsxs("group", { position: position, rotation: rotation, children: [_jsxs("mesh", { position: [0, 0, -0.01], children: [_jsx("planeGeometry", { args: [boardWidth, boardHeight] }), _jsx("meshBasicMaterial", { color: colors.background, opacity: 0.9, transparent: true })] }), _jsx(Text, { position: [0, titleY, 0], fontSize: 0.16 * scale, color: colors.text, anchorX: "center", anchorY: "middle", fontWeight: "bold", children: TITLE }), reversedLogs.map((entry, index) => {
38
+ const y = titleY -
39
+ TITLE_HEIGHT * scale / 2 -
40
+ BOARD_PADDING * scale / 2 -
41
+ index * rowHeight -
42
+ rowHeight / 2;
43
+ return (_jsx(LogRow, { entry: entry, labels: labels, colors: colors, y: y, scale: scale }, entry.id));
44
+ })] }));
45
+ };
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /** ログエントリの種別 */
2
+ export type LogType = 'join' | 'leave';
3
+ /** 入退室ログの1件分 */
4
+ export interface LogEntry {
5
+ /** 決定論的に生成されるID(冪等なマージ用) */
6
+ id: string;
7
+ /** ログ種別 */
8
+ type: LogType;
9
+ /** ユーザーID */
10
+ userId: string;
11
+ /** 表示名 */
12
+ displayName: string;
13
+ /** アバターアイコンURL */
14
+ avatarUrl: string | null;
15
+ /** フォーマット済みタイムスタンプ */
16
+ timestamp: string;
17
+ }
18
+ /** ラベル文言のカスタマイズ */
19
+ export interface Labels {
20
+ /** 入室時のラベル */
21
+ join: string;
22
+ /** 退室時のラベル */
23
+ leave: string;
24
+ }
25
+ /** 色のカスタマイズ */
26
+ export interface Colors {
27
+ /** 入室ログの色 */
28
+ join: string;
29
+ /** 退室ログの色 */
30
+ leave: string;
31
+ /** ボード背景色 */
32
+ background: string;
33
+ /** テキスト色 */
34
+ text: string;
35
+ }
36
+ /** user-joined イベントのデータ型 */
37
+ export interface UserJoinedEvent {
38
+ userId: string;
39
+ isGuest: boolean;
40
+ }
41
+ /** user-left イベントのデータ型 */
42
+ export interface UserLeftEvent {
43
+ userId: string;
44
+ }
45
+ /** EntryLogBoard のプロパティ */
46
+ export interface Props {
47
+ /** インスタンス状態のキー(複数ボード設置時の識別用) */
48
+ stateNamespace?: string;
49
+ /** 最大表示件数 */
50
+ maxEntries?: number;
51
+ /** タイムスタンプのフォーマット関数 */
52
+ formatTimestamp?: (date: Date) => string;
53
+ /** 表示名が取得できない場合のフォールバック */
54
+ displayNameFallback?: string;
55
+ /** ラベル文言 */
56
+ labels?: Partial<Labels>;
57
+ /** 色設定 */
58
+ colors?: Partial<Colors>;
59
+ /** ボードの位置 */
60
+ position?: [number, number, number];
61
+ /** ボードの回転 */
62
+ rotation?: [number, number, number];
63
+ /** 全体スケール */
64
+ scale?: number;
65
+ /** 入室時のコールバック */
66
+ onJoin?: (entry: LogEntry) => void;
67
+ /** 退室時のコールバック */
68
+ onLeave?: (entry: LogEntry) => void;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/types.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;AAEtC,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW;IACX,IAAI,EAAE,OAAO,CAAA;IACb,aAAa;IACb,MAAM,EAAE,MAAM,CAAA;IACd,UAAU;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,mBAAmB;AACnB,MAAM,WAAW,MAAM;IACrB,cAAc;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAe;AACf,MAAM,WAAW,MAAM;IACrB,aAAa;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa;IACb,KAAK,EAAE,MAAM,CAAA;IACb,aAAa;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,4BAA4B;AAC5B,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,2BAA2B;AAC3B,MAAM,WAAW,KAAK;IACpB,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAA;IACxC,2BAA2B;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,UAAU;IACV,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,aAAa;IACb,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,aAAa;IACb,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IAClC,iBAAiB;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { type LogEntry, type LogType } from './types';
2
+ /**
3
+ * デフォルトのタイムスタンプフォーマット(HH:MM 形式)
4
+ */
5
+ export declare const defaultFormatTimestamp: (date: Date) => string;
6
+ /**
7
+ * 決定論的なログエントリIDを生成する
8
+ *
9
+ * 全クライアントが同じ既存ログから同じIDを計算するため、
10
+ * リーダー選出なしで冪等なマージが可能になる。
11
+ *
12
+ * @param type ログ種別(join / leave)
13
+ * @param userId ユーザーID
14
+ * @param existingLogs 既存のログエントリ一覧
15
+ * @returns 決定論的ID(例: "join-user123-2")
16
+ */
17
+ export declare const buildLogEntryId: (type: LogType, userId: string, existingLogs: LogEntry[]) => string;
18
+ /**
19
+ * ログエントリを生成する
20
+ */
21
+ export declare const createLogEntry: (type: LogType, userId: string, displayName: string, avatarUrl: string | null, existingLogs: LogEntry[], formatTimestamp: (date: Date) => string) => LogEntry;
22
+ /**
23
+ * 既存ログに新しいエントリをマージする(重複排除・件数制限)
24
+ *
25
+ * 同じIDのエントリが既に存在する場合は追加しない(冪等性)。
26
+ */
27
+ export declare const mergeLogs: (existingLogs: LogEntry[], newEntry: LogEntry, maxEntries: number) => LogEntry[];
28
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAErD;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,IAAI,KAAG,MAInD,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,OAAO,EACb,QAAQ,MAAM,EACd,cAAc,QAAQ,EAAE,KACvB,MAKF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,OAAO,EACb,QAAQ,MAAM,EACd,aAAa,MAAM,EACnB,WAAW,MAAM,GAAG,IAAI,EACxB,cAAc,QAAQ,EAAE,EACxB,iBAAiB,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,KACtC,QAOD,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACpB,cAAc,QAAQ,EAAE,EACxB,UAAU,QAAQ,EAClB,YAAY,MAAM,KACjB,QAAQ,EAGV,CAAA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * デフォルトのタイムスタンプフォーマット(HH:MM 形式)
3
+ */
4
+ export const defaultFormatTimestamp = (date) => {
5
+ const hours = date.getHours().toString().padStart(2, '0');
6
+ const minutes = date.getMinutes().toString().padStart(2, '0');
7
+ return `${hours}:${minutes}`;
8
+ };
9
+ /**
10
+ * 決定論的なログエントリIDを生成する
11
+ *
12
+ * 全クライアントが同じ既存ログから同じIDを計算するため、
13
+ * リーダー選出なしで冪等なマージが可能になる。
14
+ *
15
+ * @param type ログ種別(join / leave)
16
+ * @param userId ユーザーID
17
+ * @param existingLogs 既存のログエントリ一覧
18
+ * @returns 決定論的ID(例: "join-user123-2")
19
+ */
20
+ export const buildLogEntryId = (type, userId, existingLogs) => {
21
+ const sameTypeCount = existingLogs.filter((log) => log.type === type && log.userId === userId).length;
22
+ return `${type}-${userId}-${sameTypeCount}`;
23
+ };
24
+ /**
25
+ * ログエントリを生成する
26
+ */
27
+ export const createLogEntry = (type, userId, displayName, avatarUrl, existingLogs, formatTimestamp) => ({
28
+ id: buildLogEntryId(type, userId, existingLogs),
29
+ type,
30
+ userId,
31
+ displayName,
32
+ avatarUrl,
33
+ timestamp: formatTimestamp(new Date()),
34
+ });
35
+ /**
36
+ * 既存ログに新しいエントリをマージする(重複排除・件数制限)
37
+ *
38
+ * 同じIDのエントリが既に存在する場合は追加しない(冪等性)。
39
+ */
40
+ export const mergeLogs = (existingLogs, newEntry, maxEntries) => {
41
+ if (existingLogs.some((log) => log.id === newEntry.id))
42
+ return existingLogs;
43
+ return [...existingLogs, newEntry].slice(-maxEntries);
44
+ };
45
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/EntryLogBoard/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAU,EAAU,EAAE;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAA;AAC9B,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAa,EACb,MAAc,EACd,YAAwB,EAChB,EAAE;IACV,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CACpD,CAAC,MAAM,CAAA;IACR,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,aAAa,EAAE,CAAA;AAC7C,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAa,EACb,MAAc,EACd,WAAmB,EACnB,SAAwB,EACxB,YAAwB,EACxB,eAAuC,EAC7B,EAAE,CAAC,CAAC;IACd,EAAE,EAAE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;IAC/C,IAAI;IACJ,MAAM;IACN,WAAW;IACX,SAAS;IACT,SAAS,EAAE,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC;CACvC,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,YAAwB,EACxB,QAAkB,EAClB,UAAkB,EACN,EAAE;IACd,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,YAAY,CAAA;IAC3E,OAAO,CAAC,GAAG,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAA;AACvD,CAAC,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface WorldEventContextValue {
3
+ /** イベントを購読する。戻り値は購読解除関数 */
4
+ subscribe: (eventName: string, callback: (data: unknown) => void) => () => void;
5
+ /** ワールド独自イベントを送信する */
6
+ emit: (eventName: string, data: unknown) => void;
7
+ }
8
+ /**
9
+ * 開発環境用のデフォルト実装(ローカル EventEmitter)
10
+ * プラットフォーム側が WebSocket 実装を注入しない場合に使用される
11
+ */
12
+ export declare const createDefaultWorldEventImplementation: () => WorldEventContextValue;
13
+ /**
14
+ * ワールドイベントの送受信を提供する Context
15
+ * xrift-frontend 側で WebSocket 実装を注入し、ワールド側で利用できる
16
+ */
17
+ export declare const WorldEventContext: import("react").Context<WorldEventContextValue | null>;
18
+ interface Props {
19
+ value: WorldEventContextValue;
20
+ children: ReactNode;
21
+ }
22
+ /**
23
+ * ワールドイベントの送受信を提供する ContextProvider
24
+ */
25
+ export declare const WorldEventProvider: ({ value, children }: Props) => import("react/jsx-runtime").JSX.Element;
26
+ /**
27
+ * ワールドイベントの Context を取得する hook
28
+ * @throws {Error} WorldEventProvider の外で呼び出された場合
29
+ */
30
+ export declare const useWorldEventContext: () => WorldEventContextValue;
31
+ export {};
32
+ //# sourceMappingURL=WorldEventContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorldEventContext.d.ts","sourceRoot":"","sources":["../../src/contexts/WorldEventContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAA;AAEjE,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IAC/E,sBAAsB;IACtB,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACjD;AAED;;;GAGG;AACH,eAAO,MAAM,qCAAqC,QAAO,sBA2BxD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,wDAAqD,CAAA;AAEnF,UAAU,KAAK;IACb,KAAK,EAAE,sBAAsB,CAAA;IAC7B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,qBAAqB,KAAK,4CAE5D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAO,sBAMvC,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ /**
4
+ * 開発環境用のデフォルト実装(ローカル EventEmitter)
5
+ * プラットフォーム側が WebSocket 実装を注入しない場合に使用される
6
+ */
7
+ export const createDefaultWorldEventImplementation = () => {
8
+ const listeners = new Map();
9
+ const subscribe = (eventName, callback) => {
10
+ if (!listeners.has(eventName)) {
11
+ listeners.set(eventName, new Set());
12
+ }
13
+ const set = listeners.get(eventName);
14
+ set.add(callback);
15
+ return () => {
16
+ set.delete(callback);
17
+ if (set.size === 0) {
18
+ listeners.delete(eventName);
19
+ }
20
+ };
21
+ };
22
+ const emit = (eventName, data) => {
23
+ const set = listeners.get(eventName);
24
+ if (!set)
25
+ return;
26
+ for (const cb of set) {
27
+ cb(data);
28
+ }
29
+ };
30
+ return { subscribe, emit };
31
+ };
32
+ /**
33
+ * ワールドイベントの送受信を提供する Context
34
+ * xrift-frontend 側で WebSocket 実装を注入し、ワールド側で利用できる
35
+ */
36
+ export const WorldEventContext = createContext(null);
37
+ /**
38
+ * ワールドイベントの送受信を提供する ContextProvider
39
+ */
40
+ export const WorldEventProvider = ({ value, children }) => {
41
+ return _jsx(WorldEventContext.Provider, { value: value, children: children });
42
+ };
43
+ /**
44
+ * ワールドイベントの Context を取得する hook
45
+ * @throws {Error} WorldEventProvider の外で呼び出された場合
46
+ */
47
+ export const useWorldEventContext = () => {
48
+ const context = useContext(WorldEventContext);
49
+ if (!context) {
50
+ throw new Error('useWorldEventContext must be used within WorldEventProvider');
51
+ }
52
+ return context;
53
+ };
54
+ //# sourceMappingURL=WorldEventContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorldEventContext.js","sourceRoot":"","sources":["../../src/contexts/WorldEventContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,MAAM,OAAO,CAAA;AASjE;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAA2B,EAAE;IAChF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAA;IAEjE,MAAM,SAAS,GAAG,CAAC,SAAiB,EAAE,QAAiC,EAAgB,EAAE;QACvF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;QACrC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEjB,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACpB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC,CAAA;IACH,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAE,IAAa,EAAQ,EAAE;QACtD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACpC,IAAI,CAAC,GAAG;YAAE,OAAM;QAChB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,EAAE,CAAC,IAAI,CAAC,CAAA;QACV,CAAC;IACH,CAAC,CAAA;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAgC,IAAI,CAAC,CAAA;AAOnF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC/D,OAAO,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA8B,CAAA;AAC1F,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAA2B,EAAE;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -5,6 +5,7 @@ import { type ScreenShareContextValue } from './ScreenShareContext';
5
5
  import { type SpawnPointContextValue } from './SpawnPointContext';
6
6
  import { type TextInputContextValue } from './TextInputContext';
7
7
  import { type UsersContextValue } from './UsersContext';
8
+ import { type WorldEventContextValue } from './WorldEventContext';
8
9
  export interface XRiftContextValue {
9
10
  /**
10
11
  * ワールドのベースURL(CDNのディレクトリパス)
@@ -57,6 +58,11 @@ interface Props {
57
58
  * 指定しない場合はデフォルト実装(空の状態)が使用される
58
59
  */
59
60
  usersImplementation?: UsersContextValue;
61
+ /**
62
+ * ワールドイベントの実装(オプション)
63
+ * 指定しない場合はデフォルト実装(ローカル EventEmitter)が使用される
64
+ */
65
+ worldEventImplementation?: WorldEventContextValue;
60
66
  children: ReactNode;
61
67
  }
62
68
  /**
@@ -64,7 +70,7 @@ interface Props {
64
70
  * Module Federationで動的にロードされたワールドコンポーネントに
65
71
  * 必要な情報を注入するために使用
66
72
  */
67
- export declare const XRiftProvider: ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, children, }: Props) => import("react/jsx-runtime").JSX.Element;
73
+ export declare const XRiftProvider: ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, worldEventImplementation, children, }: Props) => import("react/jsx-runtime").JSX.Element;
68
74
  /**
69
75
  * XRift ワールドの情報を取得するhook
70
76
  * ワールドプロジェクト側でアセットの相対パスを絶対パスに変換する際に使用
@@ -1 +1 @@
1
- {"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAWtE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChD;;OAEG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAAgD,CAAA;AAEzE,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;OAGG;IACH,uBAAuB,CAAC,EAAE,qBAAqB,CAAA;IAC/C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,wJAQ3B,KAAK,4CAgDP,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
1
+ {"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAA;AAW5B,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChD;;OAEG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAAgD,CAAA;AAEzE,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;OAGG;IACH,uBAAuB,CAAC,EAAE,qBAAqB,CAAA;IAC/C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,kLAS3B,KAAK,4CAwDP,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
@@ -5,6 +5,7 @@ import { ScreenShareProvider } from './ScreenShareContext';
5
5
  import { SpawnPointProvider } from './SpawnPointContext';
6
6
  import { TextInputProvider, createDefaultTextInputImplementation, } from './TextInputContext';
7
7
  import { UsersProvider } from './UsersContext';
8
+ import { WorldEventProvider, createDefaultWorldEventImplementation, } from './WorldEventContext';
8
9
  // デフォルトの画面共有実装(開発環境用)
9
10
  const createDefaultScreenShareImplementation = () => ({
10
11
  videoElement: null,
@@ -23,13 +24,15 @@ export const XRiftContext = createContext(null);
23
24
  * Module Federationで動的にロードされたワールドコンポーネントに
24
25
  * 必要な情報を注入するために使用
25
26
  */
26
- export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, children, }) => {
27
+ export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, worldEventImplementation, children, }) => {
27
28
  // インタラクト可能なオブジェクトの管理
28
29
  const [interactableObjects] = useState(() => new Set());
29
30
  // 画面共有の実装(指定がない場合はデフォルト実装を使用)
30
31
  const screenShareImpl = useMemo(() => screenShareImplementation ?? createDefaultScreenShareImplementation(), [screenShareImplementation]);
31
32
  // テキスト入力の実装(指定がない場合はデフォルト実装を使用)
32
33
  const textInputImpl = useMemo(() => textInputImplementation ?? createDefaultTextInputImplementation(), [textInputImplementation]);
34
+ // ワールドイベントの実装(指定がない場合はデフォルト実装を使用)
35
+ const worldEventImpl = useMemo(() => worldEventImplementation ?? createDefaultWorldEventImplementation(), [worldEventImplementation]);
33
36
  // オブジェクトの登録
34
37
  const registerInteractable = useCallback((object) => {
35
38
  interactableObjects.add(object);
@@ -43,7 +46,7 @@ export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShar
43
46
  interactableObjects,
44
47
  registerInteractable,
45
48
  unregisterInteractable,
46
- }, children: _jsx(ScreenShareProvider, { value: screenShareImpl, children: _jsx(TextInputProvider, { value: textInputImpl, children: _jsx(InstanceStateProvider, { implementation: instanceStateImplementation, children: _jsx(SpawnPointProvider, { implementation: spawnPointImplementation, children: _jsx(UsersProvider, { implementation: usersImplementation, children: children }) }) }) }) }) }));
49
+ }, children: _jsx(ScreenShareProvider, { value: screenShareImpl, children: _jsx(TextInputProvider, { value: textInputImpl, children: _jsx(InstanceStateProvider, { implementation: instanceStateImplementation, children: _jsx(SpawnPointProvider, { implementation: spawnPointImplementation, children: _jsx(UsersProvider, { implementation: usersImplementation, children: _jsx(WorldEventProvider, { value: worldEventImpl, children: children }) }) }) }) }) }) }));
47
50
  };
48
51
  /**
49
52
  * XRift ワールドの情報を取得するhook
@@ -1 +1 @@
1
- {"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ワールドイベントの送受信を行う hook
3
+ *
4
+ * プラットフォームイベント(user-joined, user-left)を受信したり、
5
+ * ワールド独自のカスタムイベントを送受信できます。
6
+ *
7
+ * @param eventName イベント名
8
+ * @param callback イベント受信時のコールバック
9
+ * @returns イベント送信関数(プラットフォーム予約イベントの場合は no-op)
10
+ *
11
+ * @example
12
+ * // ユーザー入室イベントを受信
13
+ * useWorldEvent('user-joined', (data) => {
14
+ * console.log('User joined:', data)
15
+ * })
16
+ *
17
+ * @example
18
+ * // カスタムイベントの送受信
19
+ * const emitReaction = useWorldEvent('reaction', (data) => {
20
+ * console.log('Reaction received:', data)
21
+ * })
22
+ * emitReaction({ emoji: '👍', userId: 'user-1' })
23
+ */
24
+ export declare function useWorldEvent<T = unknown>(eventName: string, callback: (data: T) => void): (data: T) => void;
25
+ //# sourceMappingURL=useWorldEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorldEvent.d.ts","sourceRoot":"","sources":["../../src/hooks/useWorldEvent.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACvC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAC1B,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAqBnB"}
@@ -0,0 +1,45 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ import { useWorldEventContext } from '../contexts/WorldEventContext';
3
+ /** プラットフォームが管理する予約イベント(ワールド側から emit 不可) */
4
+ const PLATFORM_EVENTS = new Set(['user-joined', 'user-left']);
5
+ /**
6
+ * ワールドイベントの送受信を行う hook
7
+ *
8
+ * プラットフォームイベント(user-joined, user-left)を受信したり、
9
+ * ワールド独自のカスタムイベントを送受信できます。
10
+ *
11
+ * @param eventName イベント名
12
+ * @param callback イベント受信時のコールバック
13
+ * @returns イベント送信関数(プラットフォーム予約イベントの場合は no-op)
14
+ *
15
+ * @example
16
+ * // ユーザー入室イベントを受信
17
+ * useWorldEvent('user-joined', (data) => {
18
+ * console.log('User joined:', data)
19
+ * })
20
+ *
21
+ * @example
22
+ * // カスタムイベントの送受信
23
+ * const emitReaction = useWorldEvent('reaction', (data) => {
24
+ * console.log('Reaction received:', data)
25
+ * })
26
+ * emitReaction({ emoji: '👍', userId: 'user-1' })
27
+ */
28
+ export function useWorldEvent(eventName, callback) {
29
+ const { subscribe, emit } = useWorldEventContext();
30
+ const callbackRef = useRef(callback);
31
+ // コールバック参照を常に最新に保持(stale closure 回避)
32
+ callbackRef.current = callback;
33
+ useEffect(() => {
34
+ const unsubscribe = subscribe(eventName, (data) => {
35
+ callbackRef.current(data);
36
+ });
37
+ return unsubscribe;
38
+ }, [subscribe, eventName]);
39
+ return useCallback((data) => {
40
+ if (PLATFORM_EVENTS.has(eventName))
41
+ return;
42
+ emit(eventName, data);
43
+ }, [emit, eventName]);
44
+ }
45
+ //# sourceMappingURL=useWorldEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorldEvent.js","sourceRoot":"","sources":["../../src/hooks/useWorldEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAEpE,2CAA2C;AAC3C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;AAE7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,QAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAEpC,qCAAqC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAChD,WAAW,CAAC,OAAO,CAAC,IAAS,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QACF,OAAO,WAAW,CAAA;IACpB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAE1B,OAAO,WAAW,CAChB,CAAC,IAAO,EAAE,EAAE;QACV,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAC1C,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACvB,CAAC,EACD,CAAC,IAAI,EAAE,SAAS,CAAC,CAClB,CAAA;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { ScreenShareContext, ScreenShareProvider, useScreenShareContext, type Sc
4
4
  export { SpawnPointContext, SpawnPointProvider, useSpawnPointContext, type SpawnPoint as SpawnPointData, type SpawnPointContextValue, } from './contexts/SpawnPointContext';
5
5
  export { UsersContext, UsersProvider, useUsers, type User, type UsersContextValue, } from './contexts/UsersContext';
6
6
  export { TextInputContext, TextInputProvider, useTextInputContext, createDefaultTextInputImplementation, type TextInputContextValue, type TextInputRequest, } from './contexts/TextInputContext';
7
+ export { WorldEventContext, WorldEventProvider, useWorldEventContext, createDefaultWorldEventImplementation, type WorldEventContextValue, } from './contexts/WorldEventContext';
7
8
  export { Interactable, type InteractableProps, } from './components/Interactable';
8
9
  export { Mirror, type MirrorProps } from './components/Mirror';
9
10
  export { Skybox, type SkyboxProps } from './components/Skybox';
@@ -16,10 +17,12 @@ export { TextInput, type TextInputProps, } from './components/TextInput';
16
17
  export { TagBoard, type TagBoardProps, type Tag, } from './components/TagBoard';
17
18
  export { Video180Sphere, type Video180SphereProps, } from './components/Video180Sphere';
18
19
  export { DevEnvironment, type DevEnvironmentProps, } from './components/DevEnvironment';
20
+ export { EntryLogBoard, type EntryLogBoardProps, } from './components/EntryLogBoard';
19
21
  export { type PhysicsConfig } from './components/DevEnvironment/types';
20
22
  export { useInstanceState } from './hooks/useInstanceState';
21
23
  export { useSpawnPoint } from './hooks/useSpawnPoint';
22
24
  export { useWebAudioVolume } from './hooks/useWebAudioVolume';
25
+ export { useWorldEvent } from './hooks/useWorldEvent';
23
26
  export { LAYERS, type LayerName, type LayerNumber } from './constants/layers';
24
27
  export { type PlayerMovement, type Position3D, type Rotation3D, type VRTrackingData, type VRMovementDirection, } from './types/movement';
25
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qCAAqC,EACrC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ export { ScreenShareContext, ScreenShareProvider, useScreenShareContext, } from
5
5
  export { SpawnPointContext, SpawnPointProvider, useSpawnPointContext, } from './contexts/SpawnPointContext';
6
6
  export { UsersContext, UsersProvider, useUsers, } from './contexts/UsersContext';
7
7
  export { TextInputContext, TextInputProvider, useTextInputContext, createDefaultTextInputImplementation, } from './contexts/TextInputContext';
8
+ export { WorldEventContext, WorldEventProvider, useWorldEventContext, createDefaultWorldEventImplementation, } from './contexts/WorldEventContext';
8
9
  // Components
9
10
  export { Interactable, } from './components/Interactable';
10
11
  export { Mirror } from './components/Mirror';
@@ -18,10 +19,12 @@ export { TextInput, } from './components/TextInput';
18
19
  export { TagBoard, } from './components/TagBoard';
19
20
  export { Video180Sphere, } from './components/Video180Sphere';
20
21
  export { DevEnvironment, } from './components/DevEnvironment';
22
+ export { EntryLogBoard, } from './components/EntryLogBoard';
21
23
  // Hooks
22
24
  export { useInstanceState } from './hooks/useInstanceState';
23
25
  export { useSpawnPoint } from './hooks/useSpawnPoint';
24
26
  export { useWebAudioVolume } from './hooks/useWebAudioVolume';
27
+ export { useWorldEvent } from './hooks/useWorldEvent';
25
28
  // Constants
26
29
  export { LAYERS } from './constants/layers';
27
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,GAGZ,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAIpC,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,YAAY;AACZ,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qCAAqC,GAEtC,MAAM,8BAA8B,CAAA;AAErC,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,GAGZ,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,aAAa,GAEd,MAAM,4BAA4B,CAAA;AAInC,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,YAAY;AACZ,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xrift/world-components",
3
- "version": "0.23.1",
3
+ "version": "0.25.0",
4
4
  "description": "Shared components and utilities for Xrift worlds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",