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.