@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.
@@ -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":"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"}
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
- // If not in an iframe (standalone mode), auto-resolve with default config
457
- if (typeof window !== 'undefined' && !this.isInIframe()) {
458
- const defaultConfig = {
459
- appId: 'standalone',
460
- position: { row: 0, col: 0 },
461
- tileUrl: window.location.href,
462
- theme: 'light',
463
- debug: true,
464
- };
465
- console.log('[TileBridge] Standalone mode detected - auto-resolving with default config');
466
- this.config = defaultConfig;
467
- this.ready = true;
468
- this.emitEvent('config:ready', defaultConfig);
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
@@ -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, TileConfig } from '../bridge/TileBridge';
2
+ import { TileBridge } from '../bridge/TileBridge';
3
+ import { StateClient } from '../state/StateClient';
3
4
  export interface TileContextValue {
4
- config: TileConfig | null;
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,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,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,qBAmD3D"}
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
- // Wait for bridge to be ready and config to be received
10
- bridge.waitForReady().then((receivedConfig) => {
11
- setConfig(receivedConfig);
12
- setIsReady(true);
13
- });
14
- // Listen for config updates
15
- const unsubscribe = bridge.on('config:update', (updatedConfig) => {
16
- setConfig(updatedConfig);
17
- });
18
- return unsubscribe;
19
- }, [bridge]);
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
- config,
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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thewhateverapp/tile-sdk",
3
- "version": "0.3.9",
3
+ "version": "0.4.1",
4
4
  "description": "SDK for building interactive tiles on The Whatever App platform",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",