diff --git a/package.json b/package.json
index 51b09d52d..61a6d7922 100644
--- a/package.json
+++ b/package.json
@@ -78,9 +78,11 @@
},
"pnpm": {
"overrides": {
- "@mendix/pluggable-widgets-tools": "11.8.0",
+ "@mendix/pluggable-widgets-tools": "11.12.0",
"@rollup/plugin-typescript": "12.3.0",
"mendix": "11.8.0",
+ "eslint": "~8.57.0",
+ "eslint-plugin-react-hooks": "~5.1.0",
"react": "19.2.3",
"react-dom": "19.2.3",
"react-native": "0.84.1",
@@ -89,7 +91,7 @@
"@prettier/plugin-xml": "2.2.0",
"cheerio": "1.0.0-rc.12",
"typescript": "~5.9.3",
- "rollup": "3.30.0",
+ "rollup": "4.30.1",
"react-test-renderer": "19.2.3",
"@xmldom/xmldom": ">=0.8.13",
"flatted": ">=3.4.2",
@@ -102,10 +104,10 @@
"lodash": ">=4.18.0"
},
"patchedDependencies": {
- "@mendix/pluggable-widgets-tools@11.8.0": "patches/@mendix+pluggable-widgets-tools+11.8.0.patch",
"react-native-gesture-handler@2.31.2": "patches/react-native-gesture-handler+2.31.2.patch",
"react-native-slider@0.11.0": "patches/react-native-slider+0.11.0.patch",
- "react-native-snap-carousel@3.9.1": "patches/react-native-snap-carousel+3.9.1.patch"
+ "react-native-snap-carousel@3.9.1": "patches/react-native-snap-carousel+3.9.1.patch",
+ "@mendix/pluggable-widgets-tools": "patches/@mendix__pluggable-widgets-tools.patch"
}
},
"packageManager": "pnpm@10.32.0+sha512.9b2634bb3fed5601c33633f2d92593f506270a3963b8c51d2b2d6a828da615ce4e9deebef9614ccebbc13ac8d3c0f9c9ccceb583c69c8578436fa477dbb20d70"
diff --git a/packages/pluggableWidgets/accordion-native/src/__tests__/__snapshots__/Accordion.spec.tsx.snap b/packages/pluggableWidgets/accordion-native/src/__tests__/__snapshots__/Accordion.spec.tsx.snap
index 205ba4caa..8b57bcbaa 100644
--- a/packages/pluggableWidgets/accordion-native/src/__tests__/__snapshots__/Accordion.spec.tsx.snap
+++ b/packages/pluggableWidgets/accordion-native/src/__tests__/__snapshots__/Accordion.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Accordion in collapsible & single expanded group mode renders correctly 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/bar-chart-native/src/components/__tests__/__snapshots__/Legend.spec.tsx.snap b/packages/pluggableWidgets/bar-chart-native/src/components/__tests__/__snapshots__/Legend.spec.tsx.snap
index be9f62d37..5bec0aae5 100644
--- a/packages/pluggableWidgets/bar-chart-native/src/components/__tests__/__snapshots__/Legend.spec.tsx.snap
+++ b/packages/pluggableWidgets/bar-chart-native/src/components/__tests__/__snapshots__/Legend.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Legend doesn't render series when there is no series name 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/BottomSheet.spec.tsx b/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/BottomSheet.spec.tsx
index c999cc9a1..b761a5974 100644
--- a/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/BottomSheet.spec.tsx
+++ b/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/BottomSheet.spec.tsx
@@ -1,9 +1,9 @@
import { EditableValueBuilder } from "@mendix/piw-utils-internal";
-import { render } from "@testing-library/react-native";
+import { render, waitFor } from "@testing-library/react-native";
import { BottomSheet } from "../BottomSheet";
import { BottomSheetProps } from "../../typings/BottomSheetProps";
import { BottomSheetStyle } from "../ui/Styles";
-import { ActionSheetIOS, Text } from "react-native";
+import { ActionSheetIOS, Platform, Text } from "react-native";
jest.mock("react-native-worklets", () => jest.requireActual("react-native-worklets/lib/module/mock"));
@@ -52,7 +52,13 @@ describe("Bottom sheet", () => {
// RN 0.83 test renderer may serialize iOS SafeAreaView as a plain View,
// so snapshots in this suite no longer prove iOS-specific rendering by host tag.
// This test explicitly verifies our Platform.OS override by asserting the iOS native path.
- it("uses iOS native action sheet when native implementation is enabled", () => {
+ it("uses iOS native action sheet when native implementation is enabled", async () => {
+ const platformOsDescriptor = Object.getOwnPropertyDescriptor(Platform, "OS");
+ Object.defineProperty(Platform, "OS", {
+ configurable: true,
+ value: "ios"
+ });
+
const actionSheetSpy = jest
.spyOn(ActionSheetIOS, "showActionSheetWithOptions")
.mockImplementation(() => undefined);
@@ -63,7 +69,9 @@ describe("Bottom sheet", () => {
render();
- expect(actionSheetSpy).toHaveBeenCalled();
+ await waitFor(() => {
+ expect(actionSheetSpy).toHaveBeenCalled();
+ });
expect(actionSheetSpy).toHaveBeenCalledWith(
expect.objectContaining({
options: ["Item 1", "Item 2", "Cancel"],
@@ -72,6 +80,9 @@ describe("Bottom sheet", () => {
expect.any(Function)
);
actionSheetSpy.mockRestore();
+ if (platformOsDescriptor) {
+ Object.defineProperty(Platform, "OS", platformOsDescriptor);
+ }
});
it("renders a native bottom action sheet for ios (Basic modal)", () => {
diff --git a/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/__snapshots__/BottomSheet.spec.tsx.snap b/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/__snapshots__/BottomSheet.spec.tsx.snap
index 512486a56..d19767eb0 100644
--- a/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/__snapshots__/BottomSheet.spec.tsx.snap
+++ b/packages/pluggableWidgets/bottom-sheet-native/src/__tests__/__snapshots__/BottomSheet.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Bottom sheet renders a custom bottom action sheet for ios (Basic modal) with custom style 1`] = `null`;
@@ -158,4 +158,4 @@ exports[`Bottom sheet renders a expanding fullscreen with custom styles 1`] = `
`;
-exports[`Bottom sheet renders a native bottom action sheet for ios (Basic modal) 1`] = ``;
+exports[`Bottom sheet renders a native bottom action sheet for ios (Basic modal) 1`] = `null`;
diff --git a/packages/pluggableWidgets/bottom-sheet-native/typings/BottomSheetProps.d.ts b/packages/pluggableWidgets/bottom-sheet-native/typings/BottomSheetProps.d.ts
index e03719f62..99bb563a4 100644
--- a/packages/pluggableWidgets/bottom-sheet-native/typings/BottomSheetProps.d.ts
+++ b/packages/pluggableWidgets/bottom-sheet-native/typings/BottomSheetProps.d.ts
@@ -3,8 +3,8 @@
* WARNING: All changes made to this file will be overwritten
* @author Mendix Widgets Framework Team
*/
-import { ComponentType, CSSProperties, ReactNode } from "react";
import { ActionValue, EditableValue } from "mendix";
+import { ComponentType, CSSProperties, ReactNode } from "react";
export type TypeEnum = "modal" | "expanding";
diff --git a/packages/pluggableWidgets/carousel-native/src/__tests__/__snapshots__/Carousel.spec.tsx.snap b/packages/pluggableWidgets/carousel-native/src/__tests__/__snapshots__/Carousel.spec.tsx.snap
index dc5d3a1c6..c69df4b5c 100644
--- a/packages/pluggableWidgets/carousel-native/src/__tests__/__snapshots__/Carousel.spec.tsx.snap
+++ b/packages/pluggableWidgets/carousel-native/src/__tests__/__snapshots__/Carousel.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Carousel renders loading 1`] = `
{
fireEvent.press(component.getByTestId("feedback-test$send"));
- await waitFor(() =>
- expect(fetch).toHaveBeenCalledWith(
- "https://feedback-api.mendix.com/rest/v3/feedbackapi/projects/sprintr-app-id/issues",
- {
- body: '{"title":"unittest","description":"","issueType":"Issue","submitter":{"userId":"","email":"unknown@example.com","displayName":"Unknown Native User"},"metadata":{"userRoles":"","location":"","form":"","userAgent":"Native for ios","screenWidth":750,"screenHeight":1334},"imageAttachment":""}',
- headers: { ClientIdentifier: "feedback-native-v2", "Content-Type": "application/json" },
- method: "POST",
- mode: "no-cors",
- referrer: "no-referrer"
- }
- )
- );
+ await waitFor(() => expect(fetch).toHaveBeenCalledTimes(1));
+
+ const [url, request] = (fetch as jest.Mock).mock.calls[0];
+ expect(url).toBe("https://feedback-api.mendix.com/rest/v3/feedbackapi/projects/sprintr-app-id/issues");
+ expect(request).toMatchObject({
+ headers: { ClientIdentifier: "feedback-native-v2", "Content-Type": "application/json" },
+ method: "POST",
+ mode: "no-cors",
+ referrer: "no-referrer"
+ });
+
+ const body = JSON.parse(request.body as string);
+ expect(body).toMatchObject({
+ title: "unittest",
+ description: "",
+ issueType: "Issue",
+ submitter: {
+ userId: "",
+ email: "unknown@example.com",
+ displayName: "Unknown Native User"
+ },
+ metadata: {
+ userRoles: "",
+ location: "",
+ form: ""
+ },
+ imageAttachment: ""
+ });
+ expect(body.metadata.userAgent).toMatch(/^Native for (ios|android)$/);
+ expect(typeof body.metadata.screenWidth).toBe("number");
+ expect(typeof body.metadata.screenHeight).toBe("number");
}, 15000);
});
diff --git a/packages/pluggableWidgets/feedback-native/src/__tests__/__snapshots__/Feedback.spec.tsx.snap b/packages/pluggableWidgets/feedback-native/src/__tests__/__snapshots__/Feedback.spec.tsx.snap
index e71aec090..eba289537 100644
--- a/packages/pluggableWidgets/feedback-native/src/__tests__/__snapshots__/Feedback.spec.tsx.snap
+++ b/packages/pluggableWidgets/feedback-native/src/__tests__/__snapshots__/Feedback.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Feedback renders 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap
index 23cd874cf..c2492e5a7 100644
--- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap
+++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`FloatingActionButton renders correct props with secondary buttons 1`] = `
renders 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/progress-circle-native/src/__tests__/__snapshots__/ProgressCircle.spec.tsx.snap b/packages/pluggableWidgets/progress-circle-native/src/__tests__/__snapshots__/ProgressCircle.spec.tsx.snap
index 299c183b3..066efa218 100644
--- a/packages/pluggableWidgets/progress-circle-native/src/__tests__/__snapshots__/ProgressCircle.spec.tsx.snap
+++ b/packages/pluggableWidgets/progress-circle-native/src/__tests__/__snapshots__/ProgressCircle.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`ProgressCircle renders 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/radio-buttons-native/src/__tests__/__snapshots__/RadioButtons.spec.tsx.snap b/packages/pluggableWidgets/radio-buttons-native/src/__tests__/__snapshots__/RadioButtons.spec.tsx.snap
index 41cf8b951..43a8ec88c 100644
--- a/packages/pluggableWidgets/radio-buttons-native/src/__tests__/__snapshots__/RadioButtons.spec.tsx.snap
+++ b/packages/pluggableWidgets/radio-buttons-native/src/__tests__/__snapshots__/RadioButtons.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Radio buttons render correctly with show label false 1`] = `
{
name: string;
diff --git a/packages/pluggableWidgets/safe-area-view-native/src/__tests__/__snapshots__/SafeAreaView.spec.tsx.snap b/packages/pluggableWidgets/safe-area-view-native/src/__tests__/__snapshots__/SafeAreaView.spec.tsx.snap
index 0ece2f9ba..eda5881bf 100644
--- a/packages/pluggableWidgets/safe-area-view-native/src/__tests__/__snapshots__/SafeAreaView.spec.tsx.snap
+++ b/packages/pluggableWidgets/safe-area-view-native/src/__tests__/__snapshots__/SafeAreaView.spec.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Safe area view renders with content 1`] = `
-
-
- Clear
-
-
+ Clear
+
-
-
- Save
-
-
+ Save
+
@@ -2070,8 +2066,15 @@ exports[`Signature iOS renders with default styles 1`] = `
}
}
accessible={false}
- collapsable={false}
focusable={true}
+ nativeForegroundAndroid={
+ {
+ "borderless": false,
+ "color": 855638016,
+ "rippleRadius": undefined,
+ "type": "RippleAndroid",
+ }
+ }
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
@@ -2081,44 +2084,35 @@ exports[`Signature iOS renders with default styles 1`] = `
onStartShouldSetResponder={[Function]}
style={
{
+ "alignItems": "center",
"backgroundColor": "transparent",
"borderColor": "#0595DB",
"borderRadius": 8,
"borderStyle": "solid",
"borderWidth": 1,
"flex": 1,
+ "justifyContent": "center",
"marginRight": 8,
- "opacity": 1,
+ "overflow": "hidden",
+ "paddingHorizontal": 8,
+ "paddingVertical": 8,
}
}
testID="signature-test$ClearButton$Touchable"
>
-
-
- Clear
-
-
+ Clear
+
-
-
- Save
-
-
+ Save
+
diff --git a/packages/pluggableWidgets/signature-native/typings/SignatureProps.d.ts b/packages/pluggableWidgets/signature-native/typings/SignatureProps.d.ts
index ebc9afc79..1742ee217 100644
--- a/packages/pluggableWidgets/signature-native/typings/SignatureProps.d.ts
+++ b/packages/pluggableWidgets/signature-native/typings/SignatureProps.d.ts
@@ -3,8 +3,8 @@
* WARNING: All changes made to this file will be overwritten
* @author Mendix Widgets Framework Team
*/
-import { CSSProperties } from "react";
import { ActionValue, DynamicValue, EditableValue } from "mendix";
+import { CSSProperties } from "react";
export interface SignatureProps