@xrift/world-components 0.23.1 → 0.24.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.
- package/dist/contexts/WorldEventContext.d.ts +32 -0
- package/dist/contexts/WorldEventContext.d.ts.map +1 -0
- package/dist/contexts/WorldEventContext.js +54 -0
- package/dist/contexts/WorldEventContext.js.map +1 -0
- package/dist/contexts/XRiftContext.d.ts +7 -1
- package/dist/contexts/XRiftContext.d.ts.map +1 -1
- package/dist/contexts/XRiftContext.js +5 -2
- package/dist/contexts/XRiftContext.js.map +1 -1
- package/dist/hooks/useWorldEvent.d.ts +25 -0
- package/dist/hooks/useWorldEvent.d.ts.map +1 -0
- package/dist/hooks/useWorldEvent.js +45 -0
- package/dist/hooks/useWorldEvent.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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;
|
|
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":";AAAA,OAAO,EAAE,aAAa,EAAkB,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEjG,OAAO,EAAE,qBAAqB,EAAkC,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAgC,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAA;AACrF,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAA;
|
|
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';
|
|
@@ -20,6 +21,7 @@ export { type PhysicsConfig } from './components/DevEnvironment/types';
|
|
|
20
21
|
export { useInstanceState } from './hooks/useInstanceState';
|
|
21
22
|
export { useSpawnPoint } from './hooks/useSpawnPoint';
|
|
22
23
|
export { useWebAudioVolume } from './hooks/useWebAudioVolume';
|
|
24
|
+
export { useWorldEvent } from './hooks/useWorldEvent';
|
|
23
25
|
export { LAYERS, type LayerName, type LayerNumber } from './constants/layers';
|
|
24
26
|
export { type PlayerMovement, type Position3D, type Rotation3D, type VRTrackingData, type VRMovementDirection, } from './types/movement';
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,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';
|
|
@@ -22,6 +23,7 @@ export { DevEnvironment, } from './components/DevEnvironment';
|
|
|
22
23
|
export { useInstanceState } from './hooks/useInstanceState';
|
|
23
24
|
export { useSpawnPoint } from './hooks/useSpawnPoint';
|
|
24
25
|
export { useWebAudioVolume } from './hooks/useWebAudioVolume';
|
|
26
|
+
export { useWorldEvent } from './hooks/useWorldEvent';
|
|
25
27
|
// Constants
|
|
26
28
|
export { LAYERS } from './constants/layers';
|
|
27
29
|
//# 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;
|
|
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;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;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,YAAY;AACZ,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAA"}
|