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