@thewhateverapp/tile-sdk 0.3.9 → 0.4.1
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/bridge/TileBridge.d.ts +3 -0
- package/dist/bridge/TileBridge.d.ts.map +1 -1
- package/dist/bridge/TileBridge.js +16 -40
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/react/TileProvider.d.ts +4 -2
- package/dist/react/TileProvider.d.ts.map +1 -1
- package/dist/react/TileProvider.js +20 -13
- package/dist/state/StateClient.d.ts +37 -0
- package/dist/state/StateClient.d.ts.map +1 -0
- package/dist/state/StateClient.js +69 -0
- package/package.json +1 -1
|
@@ -104,6 +104,9 @@ export declare class TileBridge {
|
|
|
104
104
|
isReady(): boolean;
|
|
105
105
|
/**
|
|
106
106
|
* Wait for ready state
|
|
107
|
+
*
|
|
108
|
+
* Note: Config handshake has been removed. Tiles are ready immediately.
|
|
109
|
+
* We keep this method for backwards compatibility but it resolves instantly.
|
|
107
110
|
*/
|
|
108
111
|
waitForReady(): Promise<TileConfig>;
|
|
109
112
|
private emitEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;gBAEjB,cAAc,GAAE,MAAkC;IA4B9D,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,8 +48,6 @@ export class TileBridge {
|
|
|
48
48
|
window.addEventListener('message', this.handleMessage.bind(this));
|
|
49
49
|
// Send ready signal to parent
|
|
50
50
|
this.sendToParent({ type: 'tile:ready' });
|
|
51
|
-
// Request configuration from parent
|
|
52
|
-
this.sendToParent({ type: 'tile:request-config' });
|
|
53
51
|
}
|
|
54
52
|
handleMessage(event) {
|
|
55
53
|
// Validate origin (skip validation in dev and preview)
|
|
@@ -448,49 +446,27 @@ export class TileBridge {
|
|
|
448
446
|
}
|
|
449
447
|
/**
|
|
450
448
|
* Wait for ready state
|
|
449
|
+
*
|
|
450
|
+
* Note: Config handshake has been removed. Tiles are ready immediately.
|
|
451
|
+
* We keep this method for backwards compatibility but it resolves instantly.
|
|
451
452
|
*/
|
|
452
453
|
async waitForReady() {
|
|
453
454
|
if (this.ready && this.config) {
|
|
454
455
|
return this.config;
|
|
455
456
|
}
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
return defaultConfig;
|
|
470
|
-
}
|
|
471
|
-
return new Promise((resolve) => {
|
|
472
|
-
const unsubscribe = this.on('config:ready', (config) => {
|
|
473
|
-
unsubscribe();
|
|
474
|
-
resolve(config);
|
|
475
|
-
});
|
|
476
|
-
// Timeout fallback: if no config received after 2 seconds, assume standalone
|
|
477
|
-
setTimeout(() => {
|
|
478
|
-
if (!this.ready) {
|
|
479
|
-
console.warn('[TileBridge] No config received after 2s - assuming standalone mode');
|
|
480
|
-
const fallbackConfig = {
|
|
481
|
-
appId: 'standalone-timeout',
|
|
482
|
-
position: { row: 0, col: 0 },
|
|
483
|
-
tileUrl: typeof window !== 'undefined' ? window.location.href : '',
|
|
484
|
-
theme: 'light',
|
|
485
|
-
debug: true,
|
|
486
|
-
};
|
|
487
|
-
this.config = fallbackConfig;
|
|
488
|
-
this.ready = true;
|
|
489
|
-
unsubscribe();
|
|
490
|
-
resolve(fallbackConfig);
|
|
491
|
-
}
|
|
492
|
-
}, 2000);
|
|
493
|
-
});
|
|
457
|
+
// Create default config immediately - no handshake needed
|
|
458
|
+
const defaultConfig = {
|
|
459
|
+
appId: this.isInIframe() ? 'iframe-mode' : 'standalone',
|
|
460
|
+
position: { row: 0, col: 0 },
|
|
461
|
+
tileUrl: typeof window !== 'undefined' ? window.location.href : '',
|
|
462
|
+
theme: 'light',
|
|
463
|
+
debug: this.isDevelopment() || this.isPreview(),
|
|
464
|
+
};
|
|
465
|
+
console.log('[TileBridge] Ready - no config handshake required');
|
|
466
|
+
this.config = defaultConfig;
|
|
467
|
+
this.ready = true;
|
|
468
|
+
this.emitEvent('config:ready', defaultConfig);
|
|
469
|
+
return defaultConfig;
|
|
494
470
|
}
|
|
495
471
|
// Private helpers
|
|
496
472
|
emitEvent(event, data) {
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export { TileContainer } from './react/TileContainer';
|
|
|
5
5
|
export { withTile } from './react/withTile';
|
|
6
6
|
export { getTileBridge, TileBridge } from './bridge/TileBridge';
|
|
7
7
|
export type { TileMessage, TileConfig } from './bridge/TileBridge';
|
|
8
|
+
export { StateClient } from './state/StateClient';
|
|
9
|
+
export type { TileStats, ViewResponse } from './state/StateClient';
|
|
8
10
|
export * from './tools';
|
|
9
11
|
export * from './types';
|
|
10
12
|
//# 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,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGnE,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnE,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export { TileContainer } from './react/TileContainer';
|
|
|
6
6
|
export { withTile } from './react/withTile';
|
|
7
7
|
// Bridge for secure communication
|
|
8
8
|
export { getTileBridge, TileBridge } from './bridge/TileBridge';
|
|
9
|
+
// State API client
|
|
10
|
+
export { StateClient } from './state/StateClient';
|
|
9
11
|
// Domain-specific tools
|
|
10
12
|
export * from './tools';
|
|
11
13
|
// Types
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { TileBridge
|
|
2
|
+
import { TileBridge } from '../bridge/TileBridge';
|
|
3
|
+
import { StateClient } from '../state/StateClient';
|
|
3
4
|
export interface TileContextValue {
|
|
4
|
-
|
|
5
|
+
tileId: string | null;
|
|
5
6
|
bridge: TileBridge;
|
|
6
7
|
isReady: boolean;
|
|
8
|
+
stateClient: StateClient | null;
|
|
7
9
|
navigateToPage: () => void;
|
|
8
10
|
navigateToTile: () => void;
|
|
9
11
|
openUrl: (url: string, target?: '_blank' | '_self') => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBA0D3D"}
|
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
import React, { createContext, useEffect, useState } from 'react';
|
|
2
2
|
import { getTileBridge } from '../bridge/TileBridge';
|
|
3
|
+
import { StateClient } from '../state/StateClient';
|
|
3
4
|
export const TileContext = createContext(null);
|
|
4
5
|
export function TileProvider({ children }) {
|
|
5
|
-
const [config, setConfig] = useState(null);
|
|
6
6
|
const [isReady, setIsReady] = useState(false);
|
|
7
|
+
const [stateClient, setStateClient] = useState(null);
|
|
7
8
|
const bridge = getTileBridge();
|
|
9
|
+
// Get tileId from environment variable
|
|
10
|
+
const tileId = typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_TILE_ID
|
|
11
|
+
? process.env.NEXT_PUBLIC_TILE_ID
|
|
12
|
+
: null;
|
|
8
13
|
useEffect(() => {
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
// Create state client if tileId exists
|
|
15
|
+
if (tileId) {
|
|
16
|
+
const client = new StateClient(tileId);
|
|
17
|
+
setStateClient(client);
|
|
18
|
+
// Auto-track view on mount
|
|
19
|
+
client.trackView().catch((error) => {
|
|
20
|
+
console.error('[TileProvider] Failed to track view:', error);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
// Mark as ready immediately - no config handshake needed
|
|
24
|
+
setIsReady(true);
|
|
25
|
+
}, [tileId]);
|
|
20
26
|
const contextValue = {
|
|
21
|
-
|
|
27
|
+
tileId,
|
|
22
28
|
bridge,
|
|
23
29
|
isReady,
|
|
30
|
+
stateClient,
|
|
24
31
|
navigateToPage: () => bridge.navigateToPage(),
|
|
25
32
|
navigateToTile: () => bridge.navigateToTile(),
|
|
26
33
|
openUrl: (url, target) => bridge.openUrl(url, target),
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State API client for tile analytics and engagement
|
|
3
|
+
* Connects to state.thewhatever.app Durable Object
|
|
4
|
+
*/
|
|
5
|
+
export interface TileStats {
|
|
6
|
+
commentsCount: number;
|
|
7
|
+
likesCount: number;
|
|
8
|
+
favoritesCount: number;
|
|
9
|
+
sharesCount: number;
|
|
10
|
+
views: number;
|
|
11
|
+
lastViewed: number;
|
|
12
|
+
isLiked: boolean;
|
|
13
|
+
isFavorited: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ViewResponse {
|
|
16
|
+
views: number;
|
|
17
|
+
lastViewed: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class StateClient {
|
|
20
|
+
private tileId;
|
|
21
|
+
private baseUrl;
|
|
22
|
+
private authToken?;
|
|
23
|
+
constructor(tileId: string, options?: {
|
|
24
|
+
authToken?: string;
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Track a view for this tile
|
|
29
|
+
*/
|
|
30
|
+
trackView(): Promise<ViewResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all stats for this tile
|
|
33
|
+
*/
|
|
34
|
+
getStats(): Promise<TileStats>;
|
|
35
|
+
private getHeaders;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=StateClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateClient.d.ts","sourceRoot":"","sources":["../../src/state/StateClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAM9E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBxC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IA4BpC,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State API client for tile analytics and engagement
|
|
3
|
+
* Connects to state.thewhatever.app Durable Object
|
|
4
|
+
*/
|
|
5
|
+
export class StateClient {
|
|
6
|
+
constructor(tileId, options) {
|
|
7
|
+
this.tileId = tileId;
|
|
8
|
+
this.authToken = options?.authToken;
|
|
9
|
+
this.baseUrl = options?.baseUrl || 'https://state.thewhatever.app';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Track a view for this tile
|
|
13
|
+
*/
|
|
14
|
+
async trackView() {
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(`${this.baseUrl}/views?appId=${this.tileId}`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: this.getHeaders(),
|
|
19
|
+
});
|
|
20
|
+
if (!response.ok) {
|
|
21
|
+
throw new Error(`Failed to track view: ${response.statusText}`);
|
|
22
|
+
}
|
|
23
|
+
return await response.json();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error('[StateClient] Failed to track view:', error);
|
|
27
|
+
// Return default values on error
|
|
28
|
+
return { views: 0, lastViewed: 0 };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all stats for this tile
|
|
33
|
+
*/
|
|
34
|
+
async getStats() {
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(`${this.baseUrl}/stats?appId=${this.tileId}`, {
|
|
37
|
+
method: 'GET',
|
|
38
|
+
headers: this.getHeaders(),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`Failed to get stats: ${response.statusText}`);
|
|
42
|
+
}
|
|
43
|
+
return await response.json();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('[StateClient] Failed to get stats:', error);
|
|
47
|
+
// Return default values on error
|
|
48
|
+
return {
|
|
49
|
+
commentsCount: 0,
|
|
50
|
+
likesCount: 0,
|
|
51
|
+
favoritesCount: 0,
|
|
52
|
+
sharesCount: 0,
|
|
53
|
+
views: 0,
|
|
54
|
+
lastViewed: 0,
|
|
55
|
+
isLiked: false,
|
|
56
|
+
isFavorited: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
getHeaders() {
|
|
61
|
+
const headers = {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
};
|
|
64
|
+
if (this.authToken) {
|
|
65
|
+
headers['Authorization'] = `Bearer ${this.authToken}`;
|
|
66
|
+
}
|
|
67
|
+
return headers;
|
|
68
|
+
}
|
|
69
|
+
}
|