npm package diff
Package: @forge/react
Versions: 10.10.3 - 10.10.3-experimental-147ff14
Modified: package/out/reconciler.js
Index: package/out/reconciler.js
===================================================================
--- package/out/reconciler.js
+++ package/out/reconciler.js
@@ -217,9 +217,9 @@
};
const reconciler = (0, react_reconciler_1.default)(exports.hostConfig);
exports.ForgeReconciler = {
render: (element) => {
- const rootElement = (0, exports.createElement)({ type: 'Root', props: {}, forgeReactMajorVersion: 10 });
+ const rootElement = (0, exports.createElement)({ type: 'Root', props: {}, forgeReactMajorVersion: 11 });
const container = reconciler.createContainer(rootElement, 0, null, false, null, 'root', (err) => {
// eslint-disable-next-line no-console
console.log(err);
}, null);
@@ -232,9 +232,9 @@
throw e;
}
},
addConfig: (element) => {
- const macroConfigElement = (0, exports.createElement)({ type: 'MacroConfig', props: {}, forgeReactMajorVersion: 10 });
+ const macroConfigElement = (0, exports.createElement)({ type: 'MacroConfig', props: {}, forgeReactMajorVersion: 11 });
const container = reconciler.createContainer(macroConfigElement, 0, null, false, null, 'macroConfig', (err) => {
// eslint-disable-next-line no-console
console.log(err);
}, null);
Modified: package/out/hooks/useConfig.js
Index: package/out/hooks/useConfig.js
===================================================================
--- package/out/hooks/useConfig.js
+++ package/out/hooks/useConfig.js
@@ -1,9 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useConfig = void 0;
-const useProductContext_1 = require("./useProductContext");
+const react_1 = require("react");
+const bridge_1 = require("@forge/bridge");
+const updateConfig = (setConfig) => {
+ bridge_1.view
+ .getContext()
+ .then((context) => {
+ setConfig(context?.extension.config);
+ })
+ .catch((err) => {
+ throw err;
+ });
+};
const useConfig = () => {
- const context = (0, useProductContext_1.useProductContext)();
- return context?.extension.config;
+ const [config, setConfig] = (0, react_1.useState)(undefined);
+ (0, react_1.useEffect)(() => {
+ updateConfig(setConfig);
+ }, []);
+ (0, react_1.useEffect)(() => {
+ const sub = bridge_1.events.on('FORGE_CORE_MACRO_CONFIG_CHANGED', () => {
+ updateConfig(setConfig);
+ });
+ return () => {
+ void sub.then((subscription) => subscription.unsubscribe());
+ };
+ }, []);
+ return config;
};
exports.useConfig = useConfig;
Modified: package/out/hooks/__test__/useConfig.test.js
Index: package/out/hooks/__test__/useConfig.test.js
===================================================================
--- package/out/hooks/__test__/useConfig.test.js
+++ package/out/hooks/__test__/useConfig.test.js
@@ -1,8 +1,25 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
+const listeners = new Map();
+const simpleBridgeEvents = {
+ on: (event, callback) => {
+ if (!listeners.has(event)) {
+ listeners.set(event, []);
+ }
+ listeners.get(event)?.push(callback);
+ },
+ emit: (event, data) => {
+ if (listeners.has(event)) {
+ listeners.get(event)?.forEach((callback) => callback(data));
+ }
+ },
+ clearListeners: (event) => {
+ listeners.delete(event);
+ }
+};
// defining mock function above import so it is initialised before jest.mock runs
const mockGetContext = jest.fn(async () => null);
const react_1 = tslib_1.__importStar(require("react"));
const reconcilerTestRenderer_1 = tslib_1.__importDefault(require("../../__test__/reconcilerTestRenderer"));
@@ -10,9 +27,10 @@
const testUtils_1 = require("../../__test__/testUtils");
jest.mock('@forge/bridge', () => ({
view: {
getContext: mockGetContext
- }
+ },
+ events: simpleBridgeEvents
}));
const MOCK_CONFIG = {
value: 1
};
@@ -31,12 +49,18 @@
const config = (0, useConfig_1.useConfig)();
(0, react_1.useEffect)(() => configListener(config), [config]);
return (0, jsx_runtime_1.jsx)(react_1.default.Fragment, {});
};
- await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Test, {}));
+ const { update } = await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Test, {}));
+ return {
+ update: async () => {
+ await update((0, jsx_runtime_1.jsx)(Test, {}));
+ }
+ };
};
describe('useConfig', () => {
beforeAll(() => (0, testUtils_1.setupBridge)());
+ beforeEach(() => simpleBridgeEvents.clearListeners('FORGE_CORE_MACRO_CONFIG_CHANGED'));
afterEach(() => jest.clearAllMocks());
it('correctly outputs a given config', async () => {
mockGetContext.mockResolvedValue(MOCK_CONTEXT_WITH_CONFIG);
await renderTest();
@@ -48,5 +72,13 @@
expect(configListener.mock.calls[0][0]).toEqual(undefined); // initial rendered value
// no change to undef value after productContext call, do not re-render
expect(configListener).not.toHaveBeenNthCalledWith(2, expect.anything);
});
+ it('when config is updated, outputs new config', async () => {
+ mockGetContext.mockResolvedValue(MOCK_CONTEXT_WITH_CONFIG);
+ await renderTest();
+ expect(mockGetContext).toHaveBeenCalledTimes(1);
+ const newConfig = { value: 2 };
+ simpleBridgeEvents.emit('FORGE_CORE_MACRO_CONFIG_CHANGED', newConfig);
+ expect(mockGetContext).toHaveBeenCalledTimes(2);
+ });
});
Modified: package/package.json
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@forge/react",
- "version": "10.10.3",
+ "version": "10.10.3-experimental-147ff14",
"description": "Forge React reconciler",
"author": "Atlassian",
"license": "UNLICENSED",
"main": "out/index.js",
Modified: package/out/hooks/useConfig.d.ts.map
Index: package/out/hooks/useConfig.d.ts.map
===================================================================
--- package/out/hooks/useConfig.d.ts.map
+++ package/out/hooks/useConfig.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"useConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfig.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,WAGrB,CAAC"}
\ No newline at end of file
+{"version":3,"file":"useConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfig.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,SAAS,WAiBrB,CAAC"}
\ No newline at end of file
Modified: package/CHANGELOG.md
Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,6 +1,12 @@
# @forge/react
+## 10.10.3-experimental-147ff14
+
+### Major Changes
+
+- f9073fe: Improve useConfig hook so it reflects value properly on macro config updates
+
## 10.10.3
### Patch Changes
Modified: package/tsconfig.tsbuildinfo
Large diffs are not rendered by default.