@thewhateverapp/tile-sdk 0.4.0 → 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/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.4.0",
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",