@weaverse/react 0.1.4

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Paul Phan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ TODO: update readme
package/dist/core.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ export interface ProjectDataItemType {
2
+ type: string;
3
+ name: string;
4
+ id: string | number;
5
+ }
6
+ export interface ProjectDataType {
7
+ items: ProjectDataItemType[];
8
+ }
9
+ export declare class Weaverse {
10
+ elementInstances: Map<string, any>;
11
+ itemInstances: Map<string | number, WeaverseItemStore>;
12
+ appUrl: string;
13
+ projectKey: string;
14
+ projectData: ProjectDataType;
15
+ listeners: Set<any>;
16
+ isEditor: boolean;
17
+ currentFrameSubscription: any;
18
+ constructor({ appUrl, projectKey, projectData }?: {
19
+ appUrl?: string;
20
+ projectKey?: string;
21
+ projectData?: ProjectDataType;
22
+ });
23
+ registerElement(name: string, element: any): void;
24
+ init(): void;
25
+ subscribe(fn: any): void;
26
+ unsubscribe(fn: any): void;
27
+ triggerUpdate(): void;
28
+ fetchProjectData(): Promise<any>;
29
+ updateProjectData(): void;
30
+ subscribeMessageEvent(): any;
31
+ triggerEditorUpdate(type?: string): void;
32
+ handleMessageEvent: (e: MessageEvent) => void;
33
+ initItemData(): void;
34
+ }
35
+ export declare class WeaverseItemStore {
36
+ data: any;
37
+ listeners: Set<any>;
38
+ Component: any;
39
+ constructor(itemData: any, weaverse: Weaverse);
40
+ setData: (data: any) => void;
41
+ subscribe: (fn: any) => void;
42
+ unsubscribe: (fn: any) => void;
43
+ triggerUpdate: () => void;
44
+ useSubscription: (fn: any) => void;
45
+ }
@@ -0,0 +1,6 @@
1
+ import { Weaverse } from './core';
2
+ declare const WeaverseRoot: ({ context, defaultData }: {
3
+ context: Weaverse;
4
+ defaultData: any;
5
+ }) => JSX.Element;
6
+ export { Weaverse, WeaverseRoot };
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+
2
+ 'use strict'
3
+
4
+ if (process.env.NODE_ENV === 'production') {
5
+ module.exports = require('./sdk-react.cjs.production.min.js')
6
+ } else {
7
+ module.exports = require('./sdk-react.cjs.development.js')
8
+ }
@@ -0,0 +1,350 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
+
7
+ var React = require('react');
8
+ var fetch = _interopDefault(require('isomorphic-unfetch'));
9
+ var Elements = _interopDefault(require('@weaverse/elements'));
10
+
11
+ function _extends() {
12
+ _extends = Object.assign || function (target) {
13
+ for (var i = 1; i < arguments.length; i++) {
14
+ var source = arguments[i];
15
+
16
+ for (var key in source) {
17
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
18
+ target[key] = source[key];
19
+ }
20
+ }
21
+ }
22
+
23
+ return target;
24
+ };
25
+
26
+ return _extends.apply(this, arguments);
27
+ }
28
+
29
+ function _objectWithoutPropertiesLoose(source, excluded) {
30
+ if (source == null) return {};
31
+ var target = {};
32
+ var sourceKeys = Object.keys(source);
33
+ var key, i;
34
+
35
+ for (i = 0; i < sourceKeys.length; i++) {
36
+ key = sourceKeys[i];
37
+ if (excluded.indexOf(key) >= 0) continue;
38
+ target[key] = source[key];
39
+ }
40
+
41
+ return target;
42
+ }
43
+
44
+ var isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative';
45
+ var isBrowser = typeof window !== 'undefined' && !isReactNative;
46
+
47
+ // TODO: Implement Weaverse SDK class
48
+ var Weaverse = /*#__PURE__*/function () {
49
+ function Weaverse(_temp) {
50
+ var _this = this;
51
+
52
+ var _ref = _temp === void 0 ? {} : _temp,
53
+ appUrl = _ref.appUrl,
54
+ projectKey = _ref.projectKey,
55
+ projectData = _ref.projectData;
56
+
57
+ this.elementInstances = new Map();
58
+ this.itemInstances = new Map();
59
+ this.appUrl = 'http://localhost:3000';
60
+ this.projectKey = '';
61
+ this.projectData = {
62
+ items: []
63
+ };
64
+ this.listeners = new Set();
65
+ this.isEditor = false;
66
+
67
+ this.handleMessageEvent = function (e) {
68
+ var _e$data, _e$data$type;
69
+
70
+ if ((_e$data = e.data) != null && (_e$data$type = _e$data.type) != null && _e$data$type.startsWith('weaverse.')) {
71
+ var type = e.data.type;
72
+
73
+ switch (type) {
74
+ case 'weaverse.editor.ready':
75
+ _this.isEditor = true;
76
+ break;
77
+
78
+ case 'weaverse.editor.update':
79
+ var payload = e.data.payload;
80
+ var itemId = payload.itemId,
81
+ background = payload.background;
82
+
83
+ var instance = _this.itemInstances.get(itemId);
84
+
85
+ if (instance) {
86
+ instance.setData({
87
+ style: {
88
+ background: background
89
+ }
90
+ });
91
+ }
92
+
93
+ }
94
+ }
95
+ };
96
+
97
+ this.appUrl = appUrl || this.appUrl;
98
+ this.projectKey = projectKey || this.projectKey;
99
+ projectData && (this.projectData = projectData);
100
+ this.init();
101
+ }
102
+
103
+ var _proto = Weaverse.prototype;
104
+
105
+ _proto.registerElement = function registerElement(name, element) {
106
+ this.elementInstances.set(name, element);
107
+ };
108
+
109
+ _proto.init = function init() {
110
+ var _this2 = this;
111
+
112
+ Object.keys(Elements).forEach(function (key) {
113
+ var _Elements$key, _Elements$key$configs;
114
+
115
+ // @ts-ignore
116
+ ((_Elements$key = Elements[key]) == null ? void 0 : (_Elements$key$configs = _Elements$key.configs) == null ? void 0 : _Elements$key$configs.type) && _this2.registerElement(Elements[key].configs.type, Elements[key]);
117
+ });
118
+ this.subscribeMessageEvent();
119
+ };
120
+
121
+ _proto.subscribe = function subscribe(fn) {
122
+ this.listeners.add(fn);
123
+ };
124
+
125
+ _proto.unsubscribe = function unsubscribe(fn) {
126
+ this.listeners["delete"](fn);
127
+ };
128
+
129
+ _proto.triggerUpdate = function triggerUpdate() {
130
+ this.listeners.forEach(function (fn) {
131
+ return fn();
132
+ });
133
+ this.triggerEditorUpdate();
134
+ };
135
+
136
+ _proto.fetchProjectData = function fetchProjectData() {
137
+ return fetch(this.appUrl + ("/api/public/" + this.projectKey)).then(function (r) {
138
+ return r.json();
139
+ });
140
+ };
141
+
142
+ _proto.updateProjectData = function updateProjectData() {
143
+ var _this3 = this;
144
+
145
+ if (this.projectKey) {
146
+ this.fetchProjectData().then(function (data) {
147
+ if (data) {
148
+ _this3.projectData = data;
149
+
150
+ _this3.initItemData();
151
+
152
+ _this3.triggerUpdate();
153
+ }
154
+ })["catch"](function (err) {
155
+ console.error(err);
156
+ });
157
+ }
158
+ };
159
+
160
+ _proto.subscribeMessageEvent = function subscribeMessageEvent() {
161
+ var _this4 = this;
162
+
163
+ if (typeof this.currentFrameSubscription === 'function') {
164
+ this.currentFrameSubscription();
165
+ }
166
+
167
+ isBrowser && window.addEventListener('message', this.handleMessageEvent);
168
+
169
+ this.currentFrameSubscription = function () {
170
+ isBrowser && window.removeEventListener('message', _this4.handleMessageEvent);
171
+ };
172
+
173
+ return this.currentFrameSubscription;
174
+ };
175
+
176
+ _proto.triggerEditorUpdate = function triggerEditorUpdate(type) {
177
+ if (type === void 0) {
178
+ type = 'weaverse.workspace.init';
179
+ }
180
+
181
+ if (this.isEditor) {
182
+ var _window$top;
183
+
184
+ (_window$top = window.top) == null ? void 0 : _window$top.postMessage({
185
+ type: type,
186
+ payload: {
187
+ projectKey: this.projectKey,
188
+ projectData: this.projectData
189
+ }
190
+ }, '*');
191
+ }
192
+ };
193
+
194
+ _proto.initItemData = function initItemData() {
195
+ var _this5 = this;
196
+
197
+ var data = this.projectData;
198
+
199
+ if (data.items) {
200
+ data.items.forEach(function (item) {
201
+ var itemStore = _this5.itemInstances.get(item.id) || new WeaverseItemStore(item, _this5);
202
+
203
+ _this5.itemInstances.set(item.id, itemStore);
204
+ });
205
+ }
206
+ };
207
+
208
+ return Weaverse;
209
+ }();
210
+ var WeaverseItemStore = function WeaverseItemStore(itemData, weaverse) {
211
+ var _this6 = this;
212
+
213
+ if (itemData === void 0) {
214
+ itemData = {};
215
+ }
216
+
217
+ this.data = {};
218
+ this.listeners = new Set();
219
+
220
+ this.setData = function (data) {
221
+ _this6.data = Object.assign(_this6.data, data);
222
+
223
+ _this6.triggerUpdate();
224
+ };
225
+
226
+ this.subscribe = function (fn) {
227
+ _this6.listeners.add(fn);
228
+ };
229
+
230
+ this.unsubscribe = function (fn) {
231
+ _this6.listeners["delete"](fn);
232
+ };
233
+
234
+ this.triggerUpdate = function () {
235
+ _this6.listeners.forEach(function (fn) {
236
+ return fn(_this6.data);
237
+ });
238
+ };
239
+
240
+ this.useSubscription = function (fn) {
241
+ React.useEffect(function () {
242
+ _this6.subscribe(fn);
243
+
244
+ return function () {
245
+ _this6.unsubscribe(fn);
246
+ };
247
+ }, []);
248
+ };
249
+
250
+ this.data = itemData;
251
+ var _itemData = itemData,
252
+ type = _itemData.type;
253
+
254
+ if (type) {
255
+ this.Component = weaverse.elementInstances.get(type);
256
+ }
257
+ };
258
+
259
+ var _excluded = ["id", "type", "childIds"];
260
+
261
+ var WeaverseRoot = function WeaverseRoot(_ref) {
262
+ var _context$projectData, _context$projectData$;
263
+
264
+ var context = _ref.context,
265
+ defaultData = _ref.defaultData;
266
+
267
+ var _React$useState = React.useState(context.projectData),
268
+ setData = _React$useState[1];
269
+
270
+ React.useEffect(function () {
271
+ var handleUpdate = function handleUpdate() {
272
+ setData(context.projectData);
273
+ };
274
+
275
+ context.subscribe(handleUpdate);
276
+ context.updateProjectData();
277
+ return function () {
278
+ context.unsubscribe(handleUpdate);
279
+ };
280
+ }, []);
281
+
282
+ if (!((_context$projectData = context.projectData) != null && (_context$projectData$ = _context$projectData.items) != null && _context$projectData$.length) && defaultData) {
283
+ context.projectData = defaultData;
284
+ context.initItemData();
285
+ }
286
+
287
+ return React.createElement(RenderItem, {
288
+ itemId: 0,
289
+ context: context
290
+ });
291
+ };
292
+
293
+ var Item = function Item(_ref2) {
294
+ var itemInstance = _ref2.itemInstance,
295
+ elementInstances = _ref2.elementInstances,
296
+ context = _ref2.context;
297
+
298
+ var _React$useState2 = React.useState(itemInstance.data),
299
+ data = _React$useState2[0],
300
+ setData = _React$useState2[1];
301
+
302
+ var id = data.id,
303
+ type = data.type,
304
+ childIds = data.childIds,
305
+ rest = _objectWithoutPropertiesLoose(data, _excluded);
306
+
307
+ var useSubscription = itemInstance.useSubscription;
308
+ useSubscription(function (update) {
309
+ console.log('update', update);
310
+ setData(_extends({}, update));
311
+ });
312
+ var Component = elementInstances.get(type);
313
+
314
+ if (Component) {
315
+ return React.createElement(Component, Object.assign({
316
+ key: id,
317
+ "data-wv-id": id
318
+ }, rest), Array.isArray(childIds) && childIds.map(function (childId) {
319
+ return React.createElement(RenderItem, {
320
+ key: childId,
321
+ itemId: childId,
322
+ context: context
323
+ });
324
+ }));
325
+ }
326
+
327
+ return null;
328
+ };
329
+
330
+ var RenderItem = function RenderItem(_ref3) {
331
+ var itemId = _ref3.itemId,
332
+ context = _ref3.context;
333
+ var itemInstances = context.itemInstances,
334
+ elementInstances = context.elementInstances;
335
+ var itemInstance = itemInstances.get(itemId);
336
+
337
+ if (itemInstance) {
338
+ return React.createElement(Item, {
339
+ itemInstance: itemInstance,
340
+ elementInstances: elementInstances,
341
+ context: context
342
+ });
343
+ }
344
+
345
+ return React.createElement(React.Fragment, null);
346
+ };
347
+
348
+ exports.Weaverse = Weaverse;
349
+ exports.WeaverseRoot = WeaverseRoot;
350
+ //# sourceMappingURL=sdk-react.cjs.development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-react.cjs.development.js","sources":["../src/utils/index.ts","../src/core.ts","../src/index.tsx"],"sourcesContent":["export const isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative'\nexport const isBrowser = typeof window !== 'undefined' && !isReactNative\nexport const isIframe = isBrowser && window.top !== window.self","// TODO: Implement Weaverse SDK class\nimport fetch from 'isomorphic-unfetch'\nimport Elements from '@weaverse/elements'\nimport {useEffect} from 'react'\nimport {isBrowser} from './utils'\n\n\nexport interface ProjectDataItemType {\n\ttype: string\n\tname: string\n\tid: string | number\n}\n\nexport interface ProjectDataType {\n\titems: ProjectDataItemType[]\n}\n\nexport class Weaverse {\n\telementInstances = new Map<string, any>()\n\titemInstances = new Map<string | number, WeaverseItemStore>()\n\tappUrl: string = 'http://localhost:3000'\n\tprojectKey: string = ''\n\tprojectData: ProjectDataType = {\n\t\titems: []\n\t}\n\tlisteners: Set<any> = new Set()\n\tisEditor = false\n\tcurrentFrameSubscription: any\n\n\tconstructor({\n\t\t\t\t\tappUrl,\n\t\t\t\t\tprojectKey,\n\t\t\t\t\tprojectData\n\t\t\t\t}: { appUrl?: string, projectKey?: string, projectData?: ProjectDataType } = {}) {\n\t\tthis.appUrl = appUrl || this.appUrl\n\t\tthis.projectKey = projectKey || this.projectKey\n\t\tprojectData && (this.projectData = projectData)\n\t\tthis.init()\n\t}\n\n\tregisterElement(name: string, element: any) {\n\t\tthis.elementInstances.set(name, element)\n\t}\n\n\tinit() {\n\t\tObject.keys(Elements).forEach(key => {\n\t\t\t// @ts-ignore\n\t\t\tElements[key]?.configs?.type && this.registerElement(Elements[key].configs.type, Elements[key])\n\t\t})\n\t\tthis.subscribeMessageEvent()\n\t}\n\n\tsubscribe(fn: any) {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe(fn: any) {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate() {\n\t\tthis.listeners.forEach(fn => fn())\n\t\tthis.triggerEditorUpdate()\n\t}\n\n\tfetchProjectData() {\n\t\treturn fetch(this.appUrl + `/api/public/${this.projectKey}`).then(r => r.json())\n\t}\n\n\tupdateProjectData() {\n\t\tif (this.projectKey) {\n\t\t\tthis.fetchProjectData().then(data => {\n\t\t\t\tif (data) {\n\t\t\t\t\tthis.projectData = data\n\t\t\t\t\tthis.initItemData()\n\t\t\t\t\tthis.triggerUpdate()\n\t\t\t\t}\n\t\t\t}).catch(err => {\n\t\t\t\tconsole.error(err)\n\t\t\t})\n\t\t}\n\t}\n\n\tsubscribeMessageEvent() {\n\t\tif (typeof this.currentFrameSubscription === 'function') {\n\t\t\tthis.currentFrameSubscription()\n\t\t}\n\t\tisBrowser && window.addEventListener('message', this.handleMessageEvent)\n\t\tthis.currentFrameSubscription = () => {\n\t\t\tisBrowser && window.removeEventListener('message', this.handleMessageEvent)\n\t\t}\n\t\treturn this.currentFrameSubscription\n\t}\n\n\ttriggerEditorUpdate(type = 'weaverse.workspace.init') {\n\t\tif (this.isEditor) {\n\t\t\twindow.top?.postMessage({\n\t\t\t\ttype, payload: {\n\t\t\t\t\tprojectKey: this.projectKey,\n\t\t\t\t\tprojectData: this.projectData\n\t\t\t\t}\n\t\t\t}, '*')\n\t\t}\n\t}\n\n\thandleMessageEvent = (e: MessageEvent) => {\n\t\tif (e.data?.type?.startsWith('weaverse.')) {\n\t\t\tlet type = e.data.type\n\t\t\tswitch (type) {\n\t\t\t\tcase 'weaverse.editor.ready':\n\t\t\t\t\tthis.isEditor = true\n\t\t\t\t\tbreak\n\t\t\t\tcase 'weaverse.editor.update':\n\t\t\t\t\tlet {payload} = e.data\n\t\t\t\t\tlet {itemId, background} = payload\n\t\t\t\t\tlet instance = this.itemInstances.get(itemId)\n\t\t\t\t\tif (instance) {\n\t\t\t\t\t\tinstance.setData({\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tbackground\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitItemData() {\n\t\tlet data = this.projectData\n\t\tif (data.items) {\n\t\t\tdata.items.forEach(item => {\n\t\t\t\tlet itemStore = this.itemInstances.get(item.id) || new WeaverseItemStore(item, this)\n\t\t\t\tthis.itemInstances.set(item.id, itemStore)\n\t\t\t})\n\t\t}\n\t}\n}\n\nexport class WeaverseItemStore {\n\tdata: any = {}\n\tlisteners: Set<any> = new Set()\n\tComponent: any\n\n\tconstructor(itemData: any = {}, weaverse: Weaverse) {\n\t\tthis.data = itemData\n\t\tlet {type} = itemData\n\t\tif (type) {\n\t\t\tthis.Component = weaverse.elementInstances.get(type)\n\t\t}\n\t}\n\n\tsetData = (data: any) => {\n\t\tthis.data = Object.assign(this.data, data)\n\t\tthis.triggerUpdate()\n\t}\n\n\tsubscribe = (fn: any) => {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe = (fn: any) => {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate = () => {\n\t\tthis.listeners.forEach(fn => {\n\t\t\treturn fn(this.data)\n\t\t})\n\t}\n\n\tuseSubscription = (fn: any) => {\n\t\tuseEffect(() => {\n\t\t\tthis.subscribe(fn)\n\t\t\treturn () => {\n\t\t\t\tthis.unsubscribe(fn)\n\t\t\t}\n\t\t}, [])\n\t}\n\n\n\t// addItem(item: any) {\n\t// \tthis.items.push(item)\n\t// \tthis.triggerUpdate()\n\t// }\n\t//\n\t// removeItem(item: any) {\n\t// \tthis.items = this.items.filter(i => i !== item)\n\t// \tthis.triggerUpdate()\n\t// }\n}","import * as React from 'react'\nimport {useEffect} from 'react'\nimport {Weaverse} from './core'\n\nconst WeaverseRoot = ({context, defaultData}: { context: Weaverse, defaultData: any }) => {\n let [, setData] = React.useState<any>(context.projectData)\n useEffect(() => {\n let handleUpdate = () => {\n setData(context.projectData)\n }\n context.subscribe(handleUpdate)\n context.updateProjectData()\n\n return () => {\n context.unsubscribe(handleUpdate)\n }\n }, [])\n if (!context.projectData?.items?.length && defaultData) {\n context.projectData = defaultData\n context.initItemData()\n }\n return <RenderItem itemId={0} context={context}/>\n\n}\n\n\nconst Item = ({itemInstance, elementInstances, context}: any) => {\n let [data, setData] = React.useState<any>(itemInstance.data)\n let {id, type, childIds, ...rest} = data\n\n let {useSubscription} = itemInstance\n useSubscription((update: any) => {\n console.log('update', update)\n setData({...update})\n })\n let Component = elementInstances.get(type)\n if (Component) {\n return <Component key={id} data-wv-id={id} {...rest}>\n {Array.isArray(childIds)\n && childIds.map(childId =>\n <RenderItem\n key={childId}\n itemId={childId}\n context={context}\n />\n )}\n </Component>\n }\n return null\n}\nconst RenderItem = ({itemId, context}: { itemId: number, context: any }): any => {\n let {itemInstances, elementInstances} = context\n let itemInstance = itemInstances.get(itemId)\n if (itemInstance) {\n return <Item itemInstance={itemInstance} elementInstances={elementInstances} context={context}/>\n }\n return <></>\n}\n\nexport {Weaverse, WeaverseRoot}\n"],"names":["isReactNative","navigator","product","isBrowser","window","Weaverse","appUrl","projectKey","projectData","Map","items","Set","e","data","type","startsWith","isEditor","payload","itemId","background","instance","itemInstances","get","setData","style","init","registerElement","name","element","elementInstances","set","Object","keys","Elements","forEach","key","configs","subscribeMessageEvent","subscribe","fn","listeners","add","unsubscribe","triggerUpdate","triggerEditorUpdate","fetchProjectData","fetch","then","r","json","updateProjectData","initItemData","err","console","error","currentFrameSubscription","addEventListener","handleMessageEvent","removeEventListener","top","postMessage","item","itemStore","id","WeaverseItemStore","itemData","weaverse","assign","useEffect","Component","WeaverseRoot","context","defaultData","React","handleUpdate","length","RenderItem","Item","itemInstance","childIds","rest","useSubscription","update","log","Array","isArray","map","childId"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),n=t(require("isomorphic-unfetch")),i=t(require("@weaverse/elements"));function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}var s="object"==typeof navigator&&"ReactNative"===navigator.product,a="undefined"!=typeof window&&!s,c=function(){function t(t){var e=this,n=void 0===t?{}:t,i=n.appUrl,r=n.projectKey,s=n.projectData;this.elementInstances=new Map,this.itemInstances=new Map,this.appUrl="http://localhost:3000",this.projectKey="",this.projectData={items:[]},this.listeners=new Set,this.isEditor=!1,this.handleMessageEvent=function(t){var n,i;if(null!=(n=t.data)&&null!=(i=n.type)&&i.startsWith("weaverse."))switch(t.data.type){case"weaverse.editor.ready":e.isEditor=!0;break;case"weaverse.editor.update":var r=t.data.payload,s=r.background,a=e.itemInstances.get(r.itemId);a&&a.setData({style:{background:s}})}},this.appUrl=i||this.appUrl,this.projectKey=r||this.projectKey,s&&(this.projectData=s),this.init()}var e=t.prototype;return e.registerElement=function(t,e){this.elementInstances.set(t,e)},e.init=function(){var t=this;Object.keys(i).forEach((function(e){var n,r;(null==(n=i[e])||null==(r=n.configs)?void 0:r.type)&&t.registerElement(i[e].configs.type,i[e])})),this.subscribeMessageEvent()},e.subscribe=function(t){this.listeners.add(t)},e.unsubscribe=function(t){this.listeners.delete(t)},e.triggerUpdate=function(){this.listeners.forEach((function(t){return t()})),this.triggerEditorUpdate()},e.fetchProjectData=function(){return n(this.appUrl+"/api/public/"+this.projectKey).then((function(t){return t.json()}))},e.updateProjectData=function(){var t=this;this.projectKey&&this.fetchProjectData().then((function(e){e&&(t.projectData=e,t.initItemData(),t.triggerUpdate())})).catch((function(t){console.error(t)}))},e.subscribeMessageEvent=function(){var t=this;return"function"==typeof this.currentFrameSubscription&&this.currentFrameSubscription(),a&&window.addEventListener("message",this.handleMessageEvent),this.currentFrameSubscription=function(){a&&window.removeEventListener("message",t.handleMessageEvent)},this.currentFrameSubscription},e.triggerEditorUpdate=function(t){var e;void 0===t&&(t="weaverse.workspace.init"),this.isEditor&&(null==(e=window.top)||e.postMessage({type:t,payload:{projectKey:this.projectKey,projectData:this.projectData}},"*"))},e.initItemData=function(){var t=this,e=this.projectData;e.items&&e.items.forEach((function(e){var n=t.itemInstances.get(e.id)||new o(e,t);t.itemInstances.set(e.id,n)}))},t}(),o=function(t,n){var i=this;void 0===t&&(t={}),this.data={},this.listeners=new Set,this.setData=function(t){i.data=Object.assign(i.data,t),i.triggerUpdate()},this.subscribe=function(t){i.listeners.add(t)},this.unsubscribe=function(t){i.listeners.delete(t)},this.triggerUpdate=function(){i.listeners.forEach((function(t){return t(i.data)}))},this.useSubscription=function(t){e.useEffect((function(){return i.subscribe(t),function(){i.unsubscribe(t)}}),[])},this.data=t;var r=t.type;r&&(this.Component=n.elementInstances.get(r))},u=["id","type","childIds"],p=function(t){var n=t.itemInstance,i=t.elementInstances,s=t.context,a=e.useState(n.data),c=a[0],o=a[1],p=c.id,d=c.type,h=c.childIds,f=function(t,e){if(null==t)return{};var n,i,r={},s=Object.keys(t);for(i=0;i<s.length;i++)e.indexOf(n=s[i])>=0||(r[n]=t[n]);return r}(c,u);(0,n.useSubscription)((function(t){console.log("update",t),o(r({},t))}));var v=i.get(d);return v?e.createElement(v,Object.assign({key:p,"data-wv-id":p},f),Array.isArray(h)&&h.map((function(t){return e.createElement(l,{key:t,itemId:t,context:s})}))):null},l=function(t){var n=t.context,i=n.elementInstances,r=n.itemInstances.get(t.itemId);return r?e.createElement(p,{itemInstance:r,elementInstances:i,context:n}):e.createElement(e.Fragment,null)};exports.Weaverse=c,exports.WeaverseRoot=function(t){var n,i,r=t.context,s=t.defaultData,a=e.useState(r.projectData)[1];return e.useEffect((function(){var t=function(){a(r.projectData)};return r.subscribe(t),r.updateProjectData(),function(){r.unsubscribe(t)}}),[]),null!=(n=r.projectData)&&null!=(i=n.items)&&i.length||!s||(r.projectData=s,r.initItemData()),e.createElement(l,{itemId:0,context:r})};
2
+ //# sourceMappingURL=sdk-react.cjs.production.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-react.cjs.production.min.js","sources":["../src/utils/index.ts","../src/core.ts","../src/index.tsx"],"sourcesContent":["export const isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative'\nexport const isBrowser = typeof window !== 'undefined' && !isReactNative\nexport const isIframe = isBrowser && window.top !== window.self","// TODO: Implement Weaverse SDK class\nimport fetch from 'isomorphic-unfetch'\nimport Elements from '@weaverse/elements'\nimport {useEffect} from 'react'\nimport {isBrowser} from './utils'\n\n\nexport interface ProjectDataItemType {\n\ttype: string\n\tname: string\n\tid: string | number\n}\n\nexport interface ProjectDataType {\n\titems: ProjectDataItemType[]\n}\n\nexport class Weaverse {\n\telementInstances = new Map<string, any>()\n\titemInstances = new Map<string | number, WeaverseItemStore>()\n\tappUrl: string = 'http://localhost:3000'\n\tprojectKey: string = ''\n\tprojectData: ProjectDataType = {\n\t\titems: []\n\t}\n\tlisteners: Set<any> = new Set()\n\tisEditor = false\n\tcurrentFrameSubscription: any\n\n\tconstructor({\n\t\t\t\t\tappUrl,\n\t\t\t\t\tprojectKey,\n\t\t\t\t\tprojectData\n\t\t\t\t}: { appUrl?: string, projectKey?: string, projectData?: ProjectDataType } = {}) {\n\t\tthis.appUrl = appUrl || this.appUrl\n\t\tthis.projectKey = projectKey || this.projectKey\n\t\tprojectData && (this.projectData = projectData)\n\t\tthis.init()\n\t}\n\n\tregisterElement(name: string, element: any) {\n\t\tthis.elementInstances.set(name, element)\n\t}\n\n\tinit() {\n\t\tObject.keys(Elements).forEach(key => {\n\t\t\t// @ts-ignore\n\t\t\tElements[key]?.configs?.type && this.registerElement(Elements[key].configs.type, Elements[key])\n\t\t})\n\t\tthis.subscribeMessageEvent()\n\t}\n\n\tsubscribe(fn: any) {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe(fn: any) {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate() {\n\t\tthis.listeners.forEach(fn => fn())\n\t\tthis.triggerEditorUpdate()\n\t}\n\n\tfetchProjectData() {\n\t\treturn fetch(this.appUrl + `/api/public/${this.projectKey}`).then(r => r.json())\n\t}\n\n\tupdateProjectData() {\n\t\tif (this.projectKey) {\n\t\t\tthis.fetchProjectData().then(data => {\n\t\t\t\tif (data) {\n\t\t\t\t\tthis.projectData = data\n\t\t\t\t\tthis.initItemData()\n\t\t\t\t\tthis.triggerUpdate()\n\t\t\t\t}\n\t\t\t}).catch(err => {\n\t\t\t\tconsole.error(err)\n\t\t\t})\n\t\t}\n\t}\n\n\tsubscribeMessageEvent() {\n\t\tif (typeof this.currentFrameSubscription === 'function') {\n\t\t\tthis.currentFrameSubscription()\n\t\t}\n\t\tisBrowser && window.addEventListener('message', this.handleMessageEvent)\n\t\tthis.currentFrameSubscription = () => {\n\t\t\tisBrowser && window.removeEventListener('message', this.handleMessageEvent)\n\t\t}\n\t\treturn this.currentFrameSubscription\n\t}\n\n\ttriggerEditorUpdate(type = 'weaverse.workspace.init') {\n\t\tif (this.isEditor) {\n\t\t\twindow.top?.postMessage({\n\t\t\t\ttype, payload: {\n\t\t\t\t\tprojectKey: this.projectKey,\n\t\t\t\t\tprojectData: this.projectData\n\t\t\t\t}\n\t\t\t}, '*')\n\t\t}\n\t}\n\n\thandleMessageEvent = (e: MessageEvent) => {\n\t\tif (e.data?.type?.startsWith('weaverse.')) {\n\t\t\tlet type = e.data.type\n\t\t\tswitch (type) {\n\t\t\t\tcase 'weaverse.editor.ready':\n\t\t\t\t\tthis.isEditor = true\n\t\t\t\t\tbreak\n\t\t\t\tcase 'weaverse.editor.update':\n\t\t\t\t\tlet {payload} = e.data\n\t\t\t\t\tlet {itemId, background} = payload\n\t\t\t\t\tlet instance = this.itemInstances.get(itemId)\n\t\t\t\t\tif (instance) {\n\t\t\t\t\t\tinstance.setData({\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tbackground\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitItemData() {\n\t\tlet data = this.projectData\n\t\tif (data.items) {\n\t\t\tdata.items.forEach(item => {\n\t\t\t\tlet itemStore = this.itemInstances.get(item.id) || new WeaverseItemStore(item, this)\n\t\t\t\tthis.itemInstances.set(item.id, itemStore)\n\t\t\t})\n\t\t}\n\t}\n}\n\nexport class WeaverseItemStore {\n\tdata: any = {}\n\tlisteners: Set<any> = new Set()\n\tComponent: any\n\n\tconstructor(itemData: any = {}, weaverse: Weaverse) {\n\t\tthis.data = itemData\n\t\tlet {type} = itemData\n\t\tif (type) {\n\t\t\tthis.Component = weaverse.elementInstances.get(type)\n\t\t}\n\t}\n\n\tsetData = (data: any) => {\n\t\tthis.data = Object.assign(this.data, data)\n\t\tthis.triggerUpdate()\n\t}\n\n\tsubscribe = (fn: any) => {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe = (fn: any) => {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate = () => {\n\t\tthis.listeners.forEach(fn => {\n\t\t\treturn fn(this.data)\n\t\t})\n\t}\n\n\tuseSubscription = (fn: any) => {\n\t\tuseEffect(() => {\n\t\t\tthis.subscribe(fn)\n\t\t\treturn () => {\n\t\t\t\tthis.unsubscribe(fn)\n\t\t\t}\n\t\t}, [])\n\t}\n\n\n\t// addItem(item: any) {\n\t// \tthis.items.push(item)\n\t// \tthis.triggerUpdate()\n\t// }\n\t//\n\t// removeItem(item: any) {\n\t// \tthis.items = this.items.filter(i => i !== item)\n\t// \tthis.triggerUpdate()\n\t// }\n}","import * as React from 'react'\nimport {useEffect} from 'react'\nimport {Weaverse} from './core'\n\nconst WeaverseRoot = ({context, defaultData}: { context: Weaverse, defaultData: any }) => {\n let [, setData] = React.useState<any>(context.projectData)\n useEffect(() => {\n let handleUpdate = () => {\n setData(context.projectData)\n }\n context.subscribe(handleUpdate)\n context.updateProjectData()\n\n return () => {\n context.unsubscribe(handleUpdate)\n }\n }, [])\n if (!context.projectData?.items?.length && defaultData) {\n context.projectData = defaultData\n context.initItemData()\n }\n return <RenderItem itemId={0} context={context}/>\n\n}\n\n\nconst Item = ({itemInstance, elementInstances, context}: any) => {\n let [data, setData] = React.useState<any>(itemInstance.data)\n let {id, type, childIds, ...rest} = data\n\n let {useSubscription} = itemInstance\n useSubscription((update: any) => {\n console.log('update', update)\n setData({...update})\n })\n let Component = elementInstances.get(type)\n if (Component) {\n return <Component key={id} data-wv-id={id} {...rest}>\n {Array.isArray(childIds)\n && childIds.map(childId =>\n <RenderItem\n key={childId}\n itemId={childId}\n context={context}\n />\n )}\n </Component>\n }\n return null\n}\nconst RenderItem = ({itemId, context}: { itemId: number, context: any }): any => {\n let {itemInstances, elementInstances} = context\n let itemInstance = itemInstances.get(itemId)\n if (itemInstance) {\n return <Item itemInstance={itemInstance} elementInstances={elementInstances} context={context}/>\n }\n return <></>\n}\n\nexport {Weaverse, WeaverseRoot}\n"],"names":["isReactNative","navigator","product","isBrowser","window","Weaverse","appUrl","projectKey","projectData","Map","items","Set","e","data","_e$data","type","_e$data$type","startsWith","_this","isEditor","payload","background","instance","itemInstances","get","itemId","setData","style","this","init","registerElement","name","element","elementInstances","set","Object","keys","Elements","forEach","key","configs","_this2","subscribeMessageEvent","subscribe","fn","listeners","add","unsubscribe","triggerUpdate","triggerEditorUpdate","fetchProjectData","fetch","then","r","json","updateProjectData","_this3","initItemData","err","console","error","currentFrameSubscription","addEventListener","handleMessageEvent","removeEventListener","_this4","top","postMessage","item","itemStore","_this5","id","WeaverseItemStore","itemData","weaverse","_this6","assign","useEffect","Component","Item","itemInstance","context","React","childIds","rest","useSubscription","update","log","Array","isArray","map","childId","RenderItem","defaultData","handleUpdate","_context$projectData","_context$projectData$","length"],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import { useEffect, useState, createElement, Fragment } from 'react';
2
+ import fetch from 'isomorphic-unfetch';
3
+ import Elements from '@weaverse/elements';
4
+
5
+ function _extends() {
6
+ _extends = Object.assign || function (target) {
7
+ for (var i = 1; i < arguments.length; i++) {
8
+ var source = arguments[i];
9
+
10
+ for (var key in source) {
11
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
12
+ target[key] = source[key];
13
+ }
14
+ }
15
+ }
16
+
17
+ return target;
18
+ };
19
+
20
+ return _extends.apply(this, arguments);
21
+ }
22
+
23
+ function _objectWithoutPropertiesLoose(source, excluded) {
24
+ if (source == null) return {};
25
+ var target = {};
26
+ var sourceKeys = Object.keys(source);
27
+ var key, i;
28
+
29
+ for (i = 0; i < sourceKeys.length; i++) {
30
+ key = sourceKeys[i];
31
+ if (excluded.indexOf(key) >= 0) continue;
32
+ target[key] = source[key];
33
+ }
34
+
35
+ return target;
36
+ }
37
+
38
+ var isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative';
39
+ var isBrowser = typeof window !== 'undefined' && !isReactNative;
40
+
41
+ // TODO: Implement Weaverse SDK class
42
+ var Weaverse = /*#__PURE__*/function () {
43
+ function Weaverse(_temp) {
44
+ var _this = this;
45
+
46
+ var _ref = _temp === void 0 ? {} : _temp,
47
+ appUrl = _ref.appUrl,
48
+ projectKey = _ref.projectKey,
49
+ projectData = _ref.projectData;
50
+
51
+ this.elementInstances = new Map();
52
+ this.itemInstances = new Map();
53
+ this.appUrl = 'http://localhost:3000';
54
+ this.projectKey = '';
55
+ this.projectData = {
56
+ items: []
57
+ };
58
+ this.listeners = new Set();
59
+ this.isEditor = false;
60
+
61
+ this.handleMessageEvent = function (e) {
62
+ var _e$data, _e$data$type;
63
+
64
+ if ((_e$data = e.data) != null && (_e$data$type = _e$data.type) != null && _e$data$type.startsWith('weaverse.')) {
65
+ var type = e.data.type;
66
+
67
+ switch (type) {
68
+ case 'weaverse.editor.ready':
69
+ _this.isEditor = true;
70
+ break;
71
+
72
+ case 'weaverse.editor.update':
73
+ var payload = e.data.payload;
74
+ var itemId = payload.itemId,
75
+ background = payload.background;
76
+
77
+ var instance = _this.itemInstances.get(itemId);
78
+
79
+ if (instance) {
80
+ instance.setData({
81
+ style: {
82
+ background: background
83
+ }
84
+ });
85
+ }
86
+
87
+ }
88
+ }
89
+ };
90
+
91
+ this.appUrl = appUrl || this.appUrl;
92
+ this.projectKey = projectKey || this.projectKey;
93
+ projectData && (this.projectData = projectData);
94
+ this.init();
95
+ }
96
+
97
+ var _proto = Weaverse.prototype;
98
+
99
+ _proto.registerElement = function registerElement(name, element) {
100
+ this.elementInstances.set(name, element);
101
+ };
102
+
103
+ _proto.init = function init() {
104
+ var _this2 = this;
105
+
106
+ Object.keys(Elements).forEach(function (key) {
107
+ var _Elements$key, _Elements$key$configs;
108
+
109
+ // @ts-ignore
110
+ ((_Elements$key = Elements[key]) == null ? void 0 : (_Elements$key$configs = _Elements$key.configs) == null ? void 0 : _Elements$key$configs.type) && _this2.registerElement(Elements[key].configs.type, Elements[key]);
111
+ });
112
+ this.subscribeMessageEvent();
113
+ };
114
+
115
+ _proto.subscribe = function subscribe(fn) {
116
+ this.listeners.add(fn);
117
+ };
118
+
119
+ _proto.unsubscribe = function unsubscribe(fn) {
120
+ this.listeners["delete"](fn);
121
+ };
122
+
123
+ _proto.triggerUpdate = function triggerUpdate() {
124
+ this.listeners.forEach(function (fn) {
125
+ return fn();
126
+ });
127
+ this.triggerEditorUpdate();
128
+ };
129
+
130
+ _proto.fetchProjectData = function fetchProjectData() {
131
+ return fetch(this.appUrl + ("/api/public/" + this.projectKey)).then(function (r) {
132
+ return r.json();
133
+ });
134
+ };
135
+
136
+ _proto.updateProjectData = function updateProjectData() {
137
+ var _this3 = this;
138
+
139
+ if (this.projectKey) {
140
+ this.fetchProjectData().then(function (data) {
141
+ if (data) {
142
+ _this3.projectData = data;
143
+
144
+ _this3.initItemData();
145
+
146
+ _this3.triggerUpdate();
147
+ }
148
+ })["catch"](function (err) {
149
+ console.error(err);
150
+ });
151
+ }
152
+ };
153
+
154
+ _proto.subscribeMessageEvent = function subscribeMessageEvent() {
155
+ var _this4 = this;
156
+
157
+ if (typeof this.currentFrameSubscription === 'function') {
158
+ this.currentFrameSubscription();
159
+ }
160
+
161
+ isBrowser && window.addEventListener('message', this.handleMessageEvent);
162
+
163
+ this.currentFrameSubscription = function () {
164
+ isBrowser && window.removeEventListener('message', _this4.handleMessageEvent);
165
+ };
166
+
167
+ return this.currentFrameSubscription;
168
+ };
169
+
170
+ _proto.triggerEditorUpdate = function triggerEditorUpdate(type) {
171
+ if (type === void 0) {
172
+ type = 'weaverse.workspace.init';
173
+ }
174
+
175
+ if (this.isEditor) {
176
+ var _window$top;
177
+
178
+ (_window$top = window.top) == null ? void 0 : _window$top.postMessage({
179
+ type: type,
180
+ payload: {
181
+ projectKey: this.projectKey,
182
+ projectData: this.projectData
183
+ }
184
+ }, '*');
185
+ }
186
+ };
187
+
188
+ _proto.initItemData = function initItemData() {
189
+ var _this5 = this;
190
+
191
+ var data = this.projectData;
192
+
193
+ if (data.items) {
194
+ data.items.forEach(function (item) {
195
+ var itemStore = _this5.itemInstances.get(item.id) || new WeaverseItemStore(item, _this5);
196
+
197
+ _this5.itemInstances.set(item.id, itemStore);
198
+ });
199
+ }
200
+ };
201
+
202
+ return Weaverse;
203
+ }();
204
+ var WeaverseItemStore = function WeaverseItemStore(itemData, weaverse) {
205
+ var _this6 = this;
206
+
207
+ if (itemData === void 0) {
208
+ itemData = {};
209
+ }
210
+
211
+ this.data = {};
212
+ this.listeners = new Set();
213
+
214
+ this.setData = function (data) {
215
+ _this6.data = Object.assign(_this6.data, data);
216
+
217
+ _this6.triggerUpdate();
218
+ };
219
+
220
+ this.subscribe = function (fn) {
221
+ _this6.listeners.add(fn);
222
+ };
223
+
224
+ this.unsubscribe = function (fn) {
225
+ _this6.listeners["delete"](fn);
226
+ };
227
+
228
+ this.triggerUpdate = function () {
229
+ _this6.listeners.forEach(function (fn) {
230
+ return fn(_this6.data);
231
+ });
232
+ };
233
+
234
+ this.useSubscription = function (fn) {
235
+ useEffect(function () {
236
+ _this6.subscribe(fn);
237
+
238
+ return function () {
239
+ _this6.unsubscribe(fn);
240
+ };
241
+ }, []);
242
+ };
243
+
244
+ this.data = itemData;
245
+ var _itemData = itemData,
246
+ type = _itemData.type;
247
+
248
+ if (type) {
249
+ this.Component = weaverse.elementInstances.get(type);
250
+ }
251
+ };
252
+
253
+ var _excluded = ["id", "type", "childIds"];
254
+
255
+ var WeaverseRoot = function WeaverseRoot(_ref) {
256
+ var _context$projectData, _context$projectData$;
257
+
258
+ var context = _ref.context,
259
+ defaultData = _ref.defaultData;
260
+
261
+ var _React$useState = useState(context.projectData),
262
+ setData = _React$useState[1];
263
+
264
+ useEffect(function () {
265
+ var handleUpdate = function handleUpdate() {
266
+ setData(context.projectData);
267
+ };
268
+
269
+ context.subscribe(handleUpdate);
270
+ context.updateProjectData();
271
+ return function () {
272
+ context.unsubscribe(handleUpdate);
273
+ };
274
+ }, []);
275
+
276
+ if (!((_context$projectData = context.projectData) != null && (_context$projectData$ = _context$projectData.items) != null && _context$projectData$.length) && defaultData) {
277
+ context.projectData = defaultData;
278
+ context.initItemData();
279
+ }
280
+
281
+ return createElement(RenderItem, {
282
+ itemId: 0,
283
+ context: context
284
+ });
285
+ };
286
+
287
+ var Item = function Item(_ref2) {
288
+ var itemInstance = _ref2.itemInstance,
289
+ elementInstances = _ref2.elementInstances,
290
+ context = _ref2.context;
291
+
292
+ var _React$useState2 = useState(itemInstance.data),
293
+ data = _React$useState2[0],
294
+ setData = _React$useState2[1];
295
+
296
+ var id = data.id,
297
+ type = data.type,
298
+ childIds = data.childIds,
299
+ rest = _objectWithoutPropertiesLoose(data, _excluded);
300
+
301
+ var useSubscription = itemInstance.useSubscription;
302
+ useSubscription(function (update) {
303
+ console.log('update', update);
304
+ setData(_extends({}, update));
305
+ });
306
+ var Component = elementInstances.get(type);
307
+
308
+ if (Component) {
309
+ return createElement(Component, Object.assign({
310
+ key: id,
311
+ "data-wv-id": id
312
+ }, rest), Array.isArray(childIds) && childIds.map(function (childId) {
313
+ return createElement(RenderItem, {
314
+ key: childId,
315
+ itemId: childId,
316
+ context: context
317
+ });
318
+ }));
319
+ }
320
+
321
+ return null;
322
+ };
323
+
324
+ var RenderItem = function RenderItem(_ref3) {
325
+ var itemId = _ref3.itemId,
326
+ context = _ref3.context;
327
+ var itemInstances = context.itemInstances,
328
+ elementInstances = context.elementInstances;
329
+ var itemInstance = itemInstances.get(itemId);
330
+
331
+ if (itemInstance) {
332
+ return createElement(Item, {
333
+ itemInstance: itemInstance,
334
+ elementInstances: elementInstances,
335
+ context: context
336
+ });
337
+ }
338
+
339
+ return createElement(Fragment, null);
340
+ };
341
+
342
+ export { Weaverse, WeaverseRoot };
343
+ //# sourceMappingURL=sdk-react.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-react.esm.js","sources":["../src/utils/index.ts","../src/core.ts","../src/index.tsx"],"sourcesContent":["export const isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative'\nexport const isBrowser = typeof window !== 'undefined' && !isReactNative\nexport const isIframe = isBrowser && window.top !== window.self","// TODO: Implement Weaverse SDK class\nimport fetch from 'isomorphic-unfetch'\nimport Elements from '@weaverse/elements'\nimport {useEffect} from 'react'\nimport {isBrowser} from './utils'\n\n\nexport interface ProjectDataItemType {\n\ttype: string\n\tname: string\n\tid: string | number\n}\n\nexport interface ProjectDataType {\n\titems: ProjectDataItemType[]\n}\n\nexport class Weaverse {\n\telementInstances = new Map<string, any>()\n\titemInstances = new Map<string | number, WeaverseItemStore>()\n\tappUrl: string = 'http://localhost:3000'\n\tprojectKey: string = ''\n\tprojectData: ProjectDataType = {\n\t\titems: []\n\t}\n\tlisteners: Set<any> = new Set()\n\tisEditor = false\n\tcurrentFrameSubscription: any\n\n\tconstructor({\n\t\t\t\t\tappUrl,\n\t\t\t\t\tprojectKey,\n\t\t\t\t\tprojectData\n\t\t\t\t}: { appUrl?: string, projectKey?: string, projectData?: ProjectDataType } = {}) {\n\t\tthis.appUrl = appUrl || this.appUrl\n\t\tthis.projectKey = projectKey || this.projectKey\n\t\tprojectData && (this.projectData = projectData)\n\t\tthis.init()\n\t}\n\n\tregisterElement(name: string, element: any) {\n\t\tthis.elementInstances.set(name, element)\n\t}\n\n\tinit() {\n\t\tObject.keys(Elements).forEach(key => {\n\t\t\t// @ts-ignore\n\t\t\tElements[key]?.configs?.type && this.registerElement(Elements[key].configs.type, Elements[key])\n\t\t})\n\t\tthis.subscribeMessageEvent()\n\t}\n\n\tsubscribe(fn: any) {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe(fn: any) {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate() {\n\t\tthis.listeners.forEach(fn => fn())\n\t\tthis.triggerEditorUpdate()\n\t}\n\n\tfetchProjectData() {\n\t\treturn fetch(this.appUrl + `/api/public/${this.projectKey}`).then(r => r.json())\n\t}\n\n\tupdateProjectData() {\n\t\tif (this.projectKey) {\n\t\t\tthis.fetchProjectData().then(data => {\n\t\t\t\tif (data) {\n\t\t\t\t\tthis.projectData = data\n\t\t\t\t\tthis.initItemData()\n\t\t\t\t\tthis.triggerUpdate()\n\t\t\t\t}\n\t\t\t}).catch(err => {\n\t\t\t\tconsole.error(err)\n\t\t\t})\n\t\t}\n\t}\n\n\tsubscribeMessageEvent() {\n\t\tif (typeof this.currentFrameSubscription === 'function') {\n\t\t\tthis.currentFrameSubscription()\n\t\t}\n\t\tisBrowser && window.addEventListener('message', this.handleMessageEvent)\n\t\tthis.currentFrameSubscription = () => {\n\t\t\tisBrowser && window.removeEventListener('message', this.handleMessageEvent)\n\t\t}\n\t\treturn this.currentFrameSubscription\n\t}\n\n\ttriggerEditorUpdate(type = 'weaverse.workspace.init') {\n\t\tif (this.isEditor) {\n\t\t\twindow.top?.postMessage({\n\t\t\t\ttype, payload: {\n\t\t\t\t\tprojectKey: this.projectKey,\n\t\t\t\t\tprojectData: this.projectData\n\t\t\t\t}\n\t\t\t}, '*')\n\t\t}\n\t}\n\n\thandleMessageEvent = (e: MessageEvent) => {\n\t\tif (e.data?.type?.startsWith('weaverse.')) {\n\t\t\tlet type = e.data.type\n\t\t\tswitch (type) {\n\t\t\t\tcase 'weaverse.editor.ready':\n\t\t\t\t\tthis.isEditor = true\n\t\t\t\t\tbreak\n\t\t\t\tcase 'weaverse.editor.update':\n\t\t\t\t\tlet {payload} = e.data\n\t\t\t\t\tlet {itemId, background} = payload\n\t\t\t\t\tlet instance = this.itemInstances.get(itemId)\n\t\t\t\t\tif (instance) {\n\t\t\t\t\t\tinstance.setData({\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tbackground\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitItemData() {\n\t\tlet data = this.projectData\n\t\tif (data.items) {\n\t\t\tdata.items.forEach(item => {\n\t\t\t\tlet itemStore = this.itemInstances.get(item.id) || new WeaverseItemStore(item, this)\n\t\t\t\tthis.itemInstances.set(item.id, itemStore)\n\t\t\t})\n\t\t}\n\t}\n}\n\nexport class WeaverseItemStore {\n\tdata: any = {}\n\tlisteners: Set<any> = new Set()\n\tComponent: any\n\n\tconstructor(itemData: any = {}, weaverse: Weaverse) {\n\t\tthis.data = itemData\n\t\tlet {type} = itemData\n\t\tif (type) {\n\t\t\tthis.Component = weaverse.elementInstances.get(type)\n\t\t}\n\t}\n\n\tsetData = (data: any) => {\n\t\tthis.data = Object.assign(this.data, data)\n\t\tthis.triggerUpdate()\n\t}\n\n\tsubscribe = (fn: any) => {\n\t\tthis.listeners.add(fn)\n\t}\n\n\tunsubscribe = (fn: any) => {\n\t\tthis.listeners.delete(fn)\n\t}\n\n\ttriggerUpdate = () => {\n\t\tthis.listeners.forEach(fn => {\n\t\t\treturn fn(this.data)\n\t\t})\n\t}\n\n\tuseSubscription = (fn: any) => {\n\t\tuseEffect(() => {\n\t\t\tthis.subscribe(fn)\n\t\t\treturn () => {\n\t\t\t\tthis.unsubscribe(fn)\n\t\t\t}\n\t\t}, [])\n\t}\n\n\n\t// addItem(item: any) {\n\t// \tthis.items.push(item)\n\t// \tthis.triggerUpdate()\n\t// }\n\t//\n\t// removeItem(item: any) {\n\t// \tthis.items = this.items.filter(i => i !== item)\n\t// \tthis.triggerUpdate()\n\t// }\n}","import * as React from 'react'\nimport {useEffect} from 'react'\nimport {Weaverse} from './core'\n\nconst WeaverseRoot = ({context, defaultData}: { context: Weaverse, defaultData: any }) => {\n let [, setData] = React.useState<any>(context.projectData)\n useEffect(() => {\n let handleUpdate = () => {\n setData(context.projectData)\n }\n context.subscribe(handleUpdate)\n context.updateProjectData()\n\n return () => {\n context.unsubscribe(handleUpdate)\n }\n }, [])\n if (!context.projectData?.items?.length && defaultData) {\n context.projectData = defaultData\n context.initItemData()\n }\n return <RenderItem itemId={0} context={context}/>\n\n}\n\n\nconst Item = ({itemInstance, elementInstances, context}: any) => {\n let [data, setData] = React.useState<any>(itemInstance.data)\n let {id, type, childIds, ...rest} = data\n\n let {useSubscription} = itemInstance\n useSubscription((update: any) => {\n console.log('update', update)\n setData({...update})\n })\n let Component = elementInstances.get(type)\n if (Component) {\n return <Component key={id} data-wv-id={id} {...rest}>\n {Array.isArray(childIds)\n && childIds.map(childId =>\n <RenderItem\n key={childId}\n itemId={childId}\n context={context}\n />\n )}\n </Component>\n }\n return null\n}\nconst RenderItem = ({itemId, context}: { itemId: number, context: any }): any => {\n let {itemInstances, elementInstances} = context\n let itemInstance = itemInstances.get(itemId)\n if (itemInstance) {\n return <Item itemInstance={itemInstance} elementInstances={elementInstances} context={context}/>\n }\n return <></>\n}\n\nexport {Weaverse, WeaverseRoot}\n"],"names":["isReactNative","navigator","product","isBrowser","window","Weaverse","appUrl","projectKey","projectData","Map","items","Set","e","data","type","startsWith","isEditor","payload","itemId","background","instance","itemInstances","get","setData","style","init","registerElement","name","element","elementInstances","set","Object","keys","Elements","forEach","key","configs","subscribeMessageEvent","subscribe","fn","listeners","add","unsubscribe","triggerUpdate","triggerEditorUpdate","fetchProjectData","fetch","then","r","json","updateProjectData","initItemData","err","console","error","currentFrameSubscription","addEventListener","handleMessageEvent","removeEventListener","top","postMessage","item","itemStore","id","WeaverseItemStore","itemData","weaverse","assign","useEffect","Component","WeaverseRoot","context","defaultData","React","handleUpdate","length","RenderItem","Item","itemInstance","childIds","rest","useSubscription","update","log","Array","isArray","map","childId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAMA,aAAa,GAAG,OAAOC,SAAP,KAAqB,QAArB,IAAiCA,SAAS,CAACC,OAAV,KAAsB,aAA7E;AACA,IAAMC,SAAS,GAAG,OAAOC,MAAP,KAAkB,WAAlB,IAAiC,CAACJ,aAApD;;ACDP;AACA,IAgBaK,QAAb;AAYC;;;kCAIgF;QAH5EC,cAAAA;QACAC,kBAAAA;QACAC,mBAAAA;;AAdJ,yBAAA,GAAmB,IAAIC,GAAJ,EAAnB;AACA,sBAAA,GAAgB,IAAIA,GAAJ,EAAhB;AACA,eAAA,GAAiB,uBAAjB;AACA,mBAAA,GAAqB,EAArB;AACA,oBAAA,GAA+B;AAC9BC,MAAAA,KAAK,EAAE;AADuB,KAA/B;AAGA,kBAAA,GAAsB,IAAIC,GAAJ,EAAtB;AACA,iBAAA,GAAW,KAAX;;AA+EA,2BAAA,GAAqB,UAACC,CAAD;;;AACpB,qBAAIA,CAAC,CAACC,IAAN,6BAAI,QAAQC,IAAZ,aAAI,aAAcC,UAAd,CAAyB,WAAzB,CAAJ,EAA2C;AAC1C,YAAID,IAAI,GAAGF,CAAC,CAACC,IAAF,CAAOC,IAAlB;;AACA,gBAAQA,IAAR;AACC,eAAK,uBAAL;AACC,YAAA,KAAI,CAACE,QAAL,GAAgB,IAAhB;AACA;;AACD,eAAK,wBAAL;AACC,gBAAKC,OAAL,GAAgBL,CAAC,CAACC,IAAlB,CAAKI,OAAL;AACA,gBAAKC,MAAL,GAA2BD,OAA3B,CAAKC,MAAL;AAAA,gBAAaC,UAAb,GAA2BF,OAA3B,CAAaE,UAAb;;AACA,gBAAIC,QAAQ,GAAG,KAAI,CAACC,aAAL,CAAmBC,GAAnB,CAAuBJ,MAAvB,CAAf;;AACA,gBAAIE,QAAJ,EAAc;AACbA,cAAAA,QAAQ,CAACG,OAAT,CAAiB;AAChBC,gBAAAA,KAAK,EAAE;AACNL,kBAAAA,UAAU,EAAVA;AADM;AADS,eAAjB;AAKA;;AAdH;AAgBA;AACD,KApBD;;AAvEC,SAAKb,MAAL,GAAcA,MAAM,IAAI,KAAKA,MAA7B;AACA,SAAKC,UAAL,GAAkBA,UAAU,IAAI,KAAKA,UAArC;AACAC,IAAAA,WAAW,KAAK,KAAKA,WAAL,GAAmBA,WAAxB,CAAX;AACA,SAAKiB,IAAL;AACA;;AArBF;;AAAA,SAuBCC,eAvBD,GAuBC,yBAAgBC,IAAhB,EAA8BC,OAA9B;AACC,SAAKC,gBAAL,CAAsBC,GAAtB,CAA0BH,IAA1B,EAAgCC,OAAhC;AACA,GAzBF;;AAAA,SA2BCH,IA3BD,GA2BC;;;AACCM,IAAAA,MAAM,CAACC,IAAP,CAAYC,QAAZ,EAAsBC,OAAtB,CAA8B,UAAAC,GAAG;;;AAChC;AACA,wBAAAF,QAAQ,CAACE,GAAD,CAAR,4DAAeC,OAAf,2CAAwBtB,IAAxB,KAAgC,MAAI,CAACY,eAAL,CAAqBO,QAAQ,CAACE,GAAD,CAAR,CAAcC,OAAd,CAAsBtB,IAA3C,EAAiDmB,QAAQ,CAACE,GAAD,CAAzD,CAAhC;AACA,KAHD;AAIA,SAAKE,qBAAL;AACA,GAjCF;;AAAA,SAmCCC,SAnCD,GAmCC,mBAAUC,EAAV;AACC,SAAKC,SAAL,CAAeC,GAAf,CAAmBF,EAAnB;AACA,GArCF;;AAAA,SAuCCG,WAvCD,GAuCC,qBAAYH,EAAZ;AACC,SAAKC,SAAL,WAAsBD,EAAtB;AACA,GAzCF;;AAAA,SA2CCI,aA3CD,GA2CC;AACC,SAAKH,SAAL,CAAeN,OAAf,CAAuB,UAAAK,EAAE;AAAA,aAAIA,EAAE,EAAN;AAAA,KAAzB;AACA,SAAKK,mBAAL;AACA,GA9CF;;AAAA,SAgDCC,gBAhDD,GAgDC;AACC,WAAOC,KAAK,CAAC,KAAKxC,MAAL,qBAA6B,KAAKC,UAAlC,CAAD,CAAL,CAAsDwC,IAAtD,CAA2D,UAAAC,CAAC;AAAA,aAAIA,CAAC,CAACC,IAAF,EAAJ;AAAA,KAA5D,CAAP;AACA,GAlDF;;AAAA,SAoDCC,iBApDD,GAoDC;;;AACC,QAAI,KAAK3C,UAAT,EAAqB;AACpB,WAAKsC,gBAAL,GAAwBE,IAAxB,CAA6B,UAAAlC,IAAI;AAChC,YAAIA,IAAJ,EAAU;AACT,UAAA,MAAI,CAACL,WAAL,GAAmBK,IAAnB;;AACA,UAAA,MAAI,CAACsC,YAAL;;AACA,UAAA,MAAI,CAACR,aAAL;AACA;AACD,OAND,WAMS,UAAAS,GAAG;AACXC,QAAAA,OAAO,CAACC,KAAR,CAAcF,GAAd;AACA,OARD;AASA;AACD,GAhEF;;AAAA,SAkECf,qBAlED,GAkEC;;;AACC,QAAI,OAAO,KAAKkB,wBAAZ,KAAyC,UAA7C,EAAyD;AACxD,WAAKA,wBAAL;AACA;;AACDpD,IAAAA,SAAS,IAAIC,MAAM,CAACoD,gBAAP,CAAwB,SAAxB,EAAmC,KAAKC,kBAAxC,CAAb;;AACA,SAAKF,wBAAL,GAAgC;AAC/BpD,MAAAA,SAAS,IAAIC,MAAM,CAACsD,mBAAP,CAA2B,SAA3B,EAAsC,MAAI,CAACD,kBAA3C,CAAb;AACA,KAFD;;AAGA,WAAO,KAAKF,wBAAZ;AACA,GA3EF;;AAAA,SA6ECX,mBA7ED,GA6EC,6BAAoB9B,IAApB;QAAoBA;AAAAA,MAAAA,OAAO;;;AAC1B,QAAI,KAAKE,QAAT,EAAmB;AAAA;;AAClB,qBAAAZ,MAAM,CAACuD,GAAP,iCAAYC,WAAZ,CAAwB;AACvB9C,QAAAA,IAAI,EAAJA,IADuB;AACjBG,QAAAA,OAAO,EAAE;AACdV,UAAAA,UAAU,EAAE,KAAKA,UADH;AAEdC,UAAAA,WAAW,EAAE,KAAKA;AAFJ;AADQ,OAAxB,EAKG,GALH;AAMA;AACD,GAtFF;;AAAA,SA8GC2C,YA9GD,GA8GC;;;AACC,QAAItC,IAAI,GAAG,KAAKL,WAAhB;;AACA,QAAIK,IAAI,CAACH,KAAT,EAAgB;AACfG,MAAAA,IAAI,CAACH,KAAL,CAAWwB,OAAX,CAAmB,UAAA2B,IAAI;AACtB,YAAIC,SAAS,GAAG,MAAI,CAACzC,aAAL,CAAmBC,GAAnB,CAAuBuC,IAAI,CAACE,EAA5B,KAAmC,IAAIC,iBAAJ,CAAsBH,IAAtB,EAA4B,MAA5B,CAAnD;;AACA,QAAA,MAAI,CAACxC,aAAL,CAAmBS,GAAnB,CAAuB+B,IAAI,CAACE,EAA5B,EAAgCD,SAAhC;AACA,OAHD;AAIA;AACD,GAtHF;;AAAA;AAAA;AAyHA,IAAaE,iBAAb,GAKC,2BAAYC,QAAZ,EAAgCC,QAAhC;;;MAAYD;AAAAA,IAAAA,WAAgB;;;AAJ5B,WAAA,GAAY,EAAZ;AACA,gBAAA,GAAsB,IAAItD,GAAJ,EAAtB;;AAWA,cAAA,GAAU,UAACE,IAAD;AACT,IAAA,MAAI,CAACA,IAAL,GAAYkB,MAAM,CAACoC,MAAP,CAAc,MAAI,CAACtD,IAAnB,EAAyBA,IAAzB,CAAZ;;AACA,IAAA,MAAI,CAAC8B,aAAL;AACA,GAHD;;AAKA,gBAAA,GAAY,UAACJ,EAAD;AACX,IAAA,MAAI,CAACC,SAAL,CAAeC,GAAf,CAAmBF,EAAnB;AACA,GAFD;;AAIA,kBAAA,GAAc,UAACA,EAAD;AACb,IAAA,MAAI,CAACC,SAAL,WAAsBD,EAAtB;AACA,GAFD;;AAIA,oBAAA,GAAgB;AACf,IAAA,MAAI,CAACC,SAAL,CAAeN,OAAf,CAAuB,UAAAK,EAAE;AACxB,aAAOA,EAAE,CAAC,MAAI,CAAC1B,IAAN,CAAT;AACA,KAFD;AAGA,GAJD;;AAMA,sBAAA,GAAkB,UAAC0B,EAAD;AACjB6B,IAAAA,SAAS,CAAC;AACT,MAAA,MAAI,CAAC9B,SAAL,CAAeC,EAAf;;AACA,aAAO;AACN,QAAA,MAAI,CAACG,WAAL,CAAiBH,EAAjB;AACA,OAFD;AAGA,KALQ,EAKN,EALM,CAAT;AAMA,GAPD;;AA1BC,OAAK1B,IAAL,GAAYoD,QAAZ;AACA,kBAAaA,QAAb;AAAA,MAAKnD,IAAL,aAAKA,IAAL;;AACA,MAAIA,IAAJ,EAAU;AACT,SAAKuD,SAAL,GAAiBH,QAAQ,CAACrC,gBAAT,CAA0BP,GAA1B,CAA8BR,IAA9B,CAAjB;AACA;AACD,CAXF;;;AC1IA;AAIA,IAAMwD,YAAY,GAAG,SAAfA,YAAe;;;MAAEC,eAAAA;MAASC,mBAAAA;;AAC9B,wBAAkBC,QAAA,CAAoBF,OAAO,CAAC/D,WAA5B,CAAlB;AAAA,MAAOe,OAAP;;AACA6C,EAAAA,SAAS,CAAC;AACR,QAAIM,YAAY,GAAG,SAAfA,YAAe;AACjBnD,MAAAA,OAAO,CAACgD,OAAO,CAAC/D,WAAT,CAAP;AACD,KAFD;;AAGA+D,IAAAA,OAAO,CAACjC,SAAR,CAAkBoC,YAAlB;AACAH,IAAAA,OAAO,CAACrB,iBAAR;AAEA,WAAO;AACLqB,MAAAA,OAAO,CAAC7B,WAAR,CAAoBgC,YAApB;AACD,KAFD;AAGD,GAVQ,EAUN,EAVM,CAAT;;AAWA,MAAI,0BAACH,OAAO,CAAC/D,WAAT,sCAAC,qBAAqBE,KAAtB,aAAC,sBAA4BiE,MAA7B,KAAuCH,WAA3C,EAAwD;AACtDD,IAAAA,OAAO,CAAC/D,WAAR,GAAsBgE,WAAtB;AACAD,IAAAA,OAAO,CAACpB,YAAR;AACD;;AACD,SAAOsB,aAAA,CAACG,UAAD;AAAY1D,IAAAA,MAAM,EAAE;AAAGqD,IAAAA,OAAO,EAAEA;GAAhC,CAAP;AAED,CAnBD;;AAsBA,IAAMM,IAAI,GAAG,SAAPA,IAAO;MAAEC,qBAAAA;MAAcjD,yBAAAA;MAAkB0C,gBAAAA;;AAC7C,yBAAsBE,QAAA,CAAoBK,YAAY,CAACjE,IAAjC,CAAtB;AAAA,MAAKA,IAAL;AAAA,MAAWU,OAAX;;AACA,MAAKwC,EAAL,GAAoClD,IAApC,CAAKkD,EAAL;AAAA,MAASjD,IAAT,GAAoCD,IAApC,CAASC,IAAT;AAAA,MAAeiE,QAAf,GAAoClE,IAApC,CAAekE,QAAf;AAAA,MAA4BC,IAA5B,iCAAoCnE,IAApC;;AAEA,MAAKoE,eAAL,GAAwBH,YAAxB,CAAKG,eAAL;AACAA,EAAAA,eAAe,CAAC,UAACC,MAAD;AACd7B,IAAAA,OAAO,CAAC8B,GAAR,CAAY,QAAZ,EAAsBD,MAAtB;AACA3D,IAAAA,OAAO,cAAK2D,MAAL,EAAP;AACD,GAHc,CAAf;AAIA,MAAIb,SAAS,GAAGxC,gBAAgB,CAACP,GAAjB,CAAqBR,IAArB,CAAhB;;AACA,MAAIuD,SAAJ,EAAe;AACb,WAAOI,aAAA,CAACJ,SAAD;AAAWlC,MAAAA,GAAG,EAAE4B;oBAAgBA;OAAQiB,KAAxC,EACJI,KAAK,CAACC,OAAN,CAAcN,QAAd,KACEA,QAAQ,CAACO,GAAT,CAAa,UAAAC,OAAO;AAAA,aACnBd,aAAA,CAACG,UAAD;AACIzC,QAAAA,GAAG,EAAEoD;AACLrE,QAAAA,MAAM,EAAEqE;AACRhB,QAAAA,OAAO,EAAEA;OAHb,CADmB;AAAA,KAApB,CAFE,CAAP;AAUD;;AACD,SAAO,IAAP;AACD,CAvBD;;AAwBA,IAAMK,UAAU,GAAG,SAAbA,UAAa;MAAE1D,eAAAA;MAAQqD,gBAAAA;AAC3B,MAAKlD,aAAL,GAAwCkD,OAAxC,CAAKlD,aAAL;AAAA,MAAoBQ,gBAApB,GAAwC0C,OAAxC,CAAoB1C,gBAApB;AACA,MAAIiD,YAAY,GAAGzD,aAAa,CAACC,GAAd,CAAkBJ,MAAlB,CAAnB;;AACA,MAAI4D,YAAJ,EAAkB;AAChB,WAAOL,aAAA,CAACI,IAAD;AAAMC,MAAAA,YAAY,EAAEA;AAAcjD,MAAAA,gBAAgB,EAAEA;AAAkB0C,MAAAA,OAAO,EAAEA;KAA/E,CAAP;AACD;;AACD,SAAOE,aAAA,SAAA,MAAA,CAAP;AACD,CAPD;;;;"}
@@ -0,0 +1,3 @@
1
+ export declare const isReactNative: boolean;
2
+ export declare const isBrowser: boolean;
3
+ export declare const isIframe: boolean;
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "version": "0.1.4",
3
+ "license": "MIT",
4
+ "main": "dist/index.js",
5
+ "typings": "dist/index.d.ts",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "src"
12
+ ],
13
+ "engines": {
14
+ "node": ">=10"
15
+ },
16
+ "scripts": {
17
+ "start": "tsdx watch --name sdk-react",
18
+ "dev": "tsdx watch --name sdk-react",
19
+ "build": "tsdx build --name sdk-react",
20
+ "test": "tsdx test --passWithNoTests",
21
+ "lint": "tsdx lint",
22
+ "prepare": "tsdx build --name sdk-react",
23
+ "size": "size-limit",
24
+ "analyze": "size-limit --why"
25
+ },
26
+ "peerDependencies": {
27
+ "@weaverse/elements": "^0.1.1",
28
+ "react": ">=16"
29
+ },
30
+ "husky": {
31
+ "hooks": {
32
+ "pre-commit": "tsdx lint"
33
+ }
34
+ },
35
+ "prettier": {
36
+ "printWidth": 80,
37
+ "semi": true,
38
+ "singleQuote": true,
39
+ "trailingComma": "es5"
40
+ },
41
+ "name": "@weaverse/react",
42
+ "author": "Paul Phan",
43
+ "module": "dist/sdk-react.esm.js",
44
+ "size-limit": [
45
+ {
46
+ "path": "dist/sdk-react.cjs.production.min.js",
47
+ "limit": "10 KB"
48
+ },
49
+ {
50
+ "path": "dist/sdk-react.esm.js",
51
+ "limit": "10 KB"
52
+ }
53
+ ],
54
+ "devDependencies": {
55
+ "@size-limit/preset-small-lib": "^7.0.4",
56
+ "@types/react": "^17.0.37",
57
+ "@types/react-dom": "^17.0.11",
58
+ "@weaverse/elements": "^0.1.4",
59
+ "husky": "^7.0.4",
60
+ "react": "^17.0.2",
61
+ "react-dom": "^17.0.2",
62
+ "size-limit": "^7.0.4",
63
+ "tsdx": "^0.14.1",
64
+ "tslib": "^2.3.1",
65
+ "typescript": "^4.5.4"
66
+ },
67
+ "dependencies": {
68
+ "isomorphic-unfetch": "^3.1.0"
69
+ }
70
+ }
package/src/core.ts ADDED
@@ -0,0 +1,190 @@
1
+ // TODO: Implement Weaverse SDK class
2
+ import fetch from 'isomorphic-unfetch'
3
+ import Elements from '@weaverse/elements'
4
+ import {useEffect} from 'react'
5
+ import {isBrowser} from './utils'
6
+
7
+
8
+ export interface ProjectDataItemType {
9
+ type: string
10
+ name: string
11
+ id: string | number
12
+ }
13
+
14
+ export interface ProjectDataType {
15
+ items: ProjectDataItemType[]
16
+ }
17
+
18
+ export class Weaverse {
19
+ elementInstances = new Map<string, any>()
20
+ itemInstances = new Map<string | number, WeaverseItemStore>()
21
+ appUrl: string = 'http://localhost:3000'
22
+ projectKey: string = ''
23
+ projectData: ProjectDataType = {
24
+ items: []
25
+ }
26
+ listeners: Set<any> = new Set()
27
+ isEditor = false
28
+ currentFrameSubscription: any
29
+
30
+ constructor({
31
+ appUrl,
32
+ projectKey,
33
+ projectData
34
+ }: { appUrl?: string, projectKey?: string, projectData?: ProjectDataType } = {}) {
35
+ this.appUrl = appUrl || this.appUrl
36
+ this.projectKey = projectKey || this.projectKey
37
+ projectData && (this.projectData = projectData)
38
+ this.init()
39
+ }
40
+
41
+ registerElement(name: string, element: any) {
42
+ this.elementInstances.set(name, element)
43
+ }
44
+
45
+ init() {
46
+ Object.keys(Elements).forEach(key => {
47
+ // @ts-ignore
48
+ Elements[key]?.configs?.type && this.registerElement(Elements[key].configs.type, Elements[key])
49
+ })
50
+ this.subscribeMessageEvent()
51
+ }
52
+
53
+ subscribe(fn: any) {
54
+ this.listeners.add(fn)
55
+ }
56
+
57
+ unsubscribe(fn: any) {
58
+ this.listeners.delete(fn)
59
+ }
60
+
61
+ triggerUpdate() {
62
+ this.listeners.forEach(fn => fn())
63
+ this.triggerEditorUpdate()
64
+ }
65
+
66
+ fetchProjectData() {
67
+ return fetch(this.appUrl + `/api/public/${this.projectKey}`).then(r => r.json())
68
+ }
69
+
70
+ updateProjectData() {
71
+ if (this.projectKey) {
72
+ this.fetchProjectData().then(data => {
73
+ if (data) {
74
+ this.projectData = data
75
+ this.initItemData()
76
+ this.triggerUpdate()
77
+ }
78
+ }).catch(err => {
79
+ console.error(err)
80
+ })
81
+ }
82
+ }
83
+
84
+ subscribeMessageEvent() {
85
+ if (typeof this.currentFrameSubscription === 'function') {
86
+ this.currentFrameSubscription()
87
+ }
88
+ isBrowser && window.addEventListener('message', this.handleMessageEvent)
89
+ this.currentFrameSubscription = () => {
90
+ isBrowser && window.removeEventListener('message', this.handleMessageEvent)
91
+ }
92
+ return this.currentFrameSubscription
93
+ }
94
+
95
+ triggerEditorUpdate(type = 'weaverse.workspace.init') {
96
+ if (this.isEditor) {
97
+ window.top?.postMessage({
98
+ type, payload: {
99
+ projectKey: this.projectKey,
100
+ projectData: this.projectData
101
+ }
102
+ }, '*')
103
+ }
104
+ }
105
+
106
+ handleMessageEvent = (e: MessageEvent) => {
107
+ if (e.data?.type?.startsWith('weaverse.')) {
108
+ let type = e.data.type
109
+ switch (type) {
110
+ case 'weaverse.editor.ready':
111
+ this.isEditor = true
112
+ break
113
+ case 'weaverse.editor.update':
114
+ let {payload} = e.data
115
+ let {itemId, background} = payload
116
+ let instance = this.itemInstances.get(itemId)
117
+ if (instance) {
118
+ instance.setData({
119
+ style: {
120
+ background
121
+ }
122
+ })
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ initItemData() {
129
+ let data = this.projectData
130
+ if (data.items) {
131
+ data.items.forEach(item => {
132
+ let itemStore = this.itemInstances.get(item.id) || new WeaverseItemStore(item, this)
133
+ this.itemInstances.set(item.id, itemStore)
134
+ })
135
+ }
136
+ }
137
+ }
138
+
139
+ export class WeaverseItemStore {
140
+ data: any = {}
141
+ listeners: Set<any> = new Set()
142
+ Component: any
143
+
144
+ constructor(itemData: any = {}, weaverse: Weaverse) {
145
+ this.data = itemData
146
+ let {type} = itemData
147
+ if (type) {
148
+ this.Component = weaverse.elementInstances.get(type)
149
+ }
150
+ }
151
+
152
+ setData = (data: any) => {
153
+ this.data = Object.assign(this.data, data)
154
+ this.triggerUpdate()
155
+ }
156
+
157
+ subscribe = (fn: any) => {
158
+ this.listeners.add(fn)
159
+ }
160
+
161
+ unsubscribe = (fn: any) => {
162
+ this.listeners.delete(fn)
163
+ }
164
+
165
+ triggerUpdate = () => {
166
+ this.listeners.forEach(fn => {
167
+ return fn(this.data)
168
+ })
169
+ }
170
+
171
+ useSubscription = (fn: any) => {
172
+ useEffect(() => {
173
+ this.subscribe(fn)
174
+ return () => {
175
+ this.unsubscribe(fn)
176
+ }
177
+ }, [])
178
+ }
179
+
180
+
181
+ // addItem(item: any) {
182
+ // this.items.push(item)
183
+ // this.triggerUpdate()
184
+ // }
185
+ //
186
+ // removeItem(item: any) {
187
+ // this.items = this.items.filter(i => i !== item)
188
+ // this.triggerUpdate()
189
+ // }
190
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,60 @@
1
+ import * as React from 'react'
2
+ import {useEffect} from 'react'
3
+ import {Weaverse} from './core'
4
+
5
+ const WeaverseRoot = ({context, defaultData}: { context: Weaverse, defaultData: any }) => {
6
+ let [, setData] = React.useState<any>(context.projectData)
7
+ useEffect(() => {
8
+ let handleUpdate = () => {
9
+ setData(context.projectData)
10
+ }
11
+ context.subscribe(handleUpdate)
12
+ context.updateProjectData()
13
+
14
+ return () => {
15
+ context.unsubscribe(handleUpdate)
16
+ }
17
+ }, [])
18
+ if (!context.projectData?.items?.length && defaultData) {
19
+ context.projectData = defaultData
20
+ context.initItemData()
21
+ }
22
+ return <RenderItem itemId={0} context={context}/>
23
+
24
+ }
25
+
26
+
27
+ const Item = ({itemInstance, elementInstances, context}: any) => {
28
+ let [data, setData] = React.useState<any>(itemInstance.data)
29
+ let {id, type, childIds, ...rest} = data
30
+
31
+ let {useSubscription} = itemInstance
32
+ useSubscription((update: any) => {
33
+ console.log('update', update)
34
+ setData({...update})
35
+ })
36
+ let Component = elementInstances.get(type)
37
+ if (Component) {
38
+ return <Component key={id} data-wv-id={id} {...rest}>
39
+ {Array.isArray(childIds)
40
+ && childIds.map(childId =>
41
+ <RenderItem
42
+ key={childId}
43
+ itemId={childId}
44
+ context={context}
45
+ />
46
+ )}
47
+ </Component>
48
+ }
49
+ return null
50
+ }
51
+ const RenderItem = ({itemId, context}: { itemId: number, context: any }): any => {
52
+ let {itemInstances, elementInstances} = context
53
+ let itemInstance = itemInstances.get(itemId)
54
+ if (itemInstance) {
55
+ return <Item itemInstance={itemInstance} elementInstances={elementInstances} context={context}/>
56
+ }
57
+ return <></>
58
+ }
59
+
60
+ export {Weaverse, WeaverseRoot}
package/src/types.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import {ReactChild} from 'react'
2
+
3
+ export interface HWSDKConfig {
4
+ initialData?: any
5
+ token?: string
6
+ projectId?: string
7
+ hydrate?: boolean
8
+ apiUrl?: string
9
+ }
10
+
11
+ export interface HWProps extends HWSDKConfig {
12
+ children?: ReactChild;
13
+ }
@@ -0,0 +1,3 @@
1
+ export const isReactNative = typeof navigator === 'object' && navigator.product === 'ReactNative'
2
+ export const isBrowser = typeof window !== 'undefined' && !isReactNative
3
+ export const isIframe = isBrowser && window.top !== window.self
@@ -0,0 +1,23 @@
1
+ const toAlphabeticChar = (/** @type {number} */ code) => String.fromCharCode(code + (code > 25 ? 39 : 97))
2
+
3
+ const toAlphabeticName = (/** @type {number} */ code) => {
4
+ let name = ''
5
+ let x
6
+
7
+ for (x = Math.abs(code); x > 52; x = (x / 52) | 0) name = toAlphabeticChar(x % 52) + name
8
+
9
+ return toAlphabeticChar(x % 52) + name
10
+ }
11
+
12
+ const toPhash = (/** @type {number} */ h, /** @type {string} */ x) => {
13
+ let i = x.length
14
+ while (i) h = (h * 33) ^ x.charCodeAt(--i)
15
+ return h
16
+ }
17
+
18
+ export const toHash = (/** @type {object} */ value) => toAlphabeticName(
19
+ toPhash(
20
+ 5381,
21
+ JSON.stringify(value)
22
+ ) >>> 0
23
+ )