From bb6df783ab3a5dfc53bc71544dfc02031b3a936d Mon Sep 17 00:00:00 2001 From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com> Date: Tue, 4 Feb 2025 21:02:04 +0530 Subject: [PATCH] feat: react native sdk v2 (#4616) Co-authored-by: Piyush Gupta --- apps/demo-react-native/.env.example | 4 +- apps/demo-react-native/app.json | 1 + apps/demo-react-native/package.json | 9 +- apps/demo-react-native/src/app.tsx | 110 +++- .../app/app-surveys/framework-guides/page.mdx | 10 +- .../environment/lib/environmentState.ts | 6 +- .../[environmentId]/environment/route.ts | 10 +- .../v1/client/[environmentId]/user/route.ts | 3 + .../ee/billing/components/pricing-table.tsx | 1 - apps/web/modules/ee/contacts/actions.ts | 4 +- .../[userId]/attributes/lib/contact.ts | 2 +- .../contacts/[userId]/attributes/route.ts | 29 +- .../identify/contacts/[userId]/route.ts | 4 +- .../[environmentId]/user/lib/contact.ts | 39 ++ .../[environmentId]/user/lib/segments.ts | 82 +++ .../[environmentId]/user/lib/update-user.ts | 129 +++++ .../[environmentId]/user/lib/user-state.ts | 89 +++ .../api/client/[environmentId]/user/route.ts | 92 +++ .../attributes => }/lib/attributes.ts | 60 +- apps/web/modules/ee/contacts/lib/contacts.ts | 3 + .../edit-memberships/member-actions.tsx | 1 - packages/api/src/api/client/attribute.ts | 4 +- packages/api/src/api/client/environment.ts | 18 + packages/api/src/api/client/index.ts | 6 + packages/api/src/api/client/user.ts | 44 ++ .../react-native-library.json | 3 +- packages/js-core/src/lib/attributes.ts | 28 +- packages/js-core/src/lib/constants.ts | 1 - packages/js-core/src/lib/environment-state.ts | 7 +- packages/react-native/README.md | 12 +- packages/react-native/package.json | 19 +- .../src/{ => components}/formbricks.tsx | 23 +- .../src/{ => components}/survey-web-view.tsx | 136 ++--- packages/react-native/src/index.ts | 44 +- packages/react-native/src/lib/attributes.ts | 57 -- .../src/lib/{ => common}/command-queue.ts | 13 +- .../src/lib/{ => common}/config.ts | 24 +- .../src/lib/{ => common}/event-listeners.ts | 12 +- .../lib/{storage.ts => common/file-upload.ts} | 12 +- .../react-native/src/lib/common/initialize.ts | 281 +++++++++ .../react-native/src/lib/common/logger.ts | 50 ++ .../src/lib/common/response-queue.ts | 119 ++++ .../react-native/src/lib/common/storage.ts | 9 + .../lib/common/tests/__mocks__/config.mock.ts | 126 ++++ .../tests/__mocks__/response-queue.mock.ts | 10 + .../lib/common/tests/command-queue.test.ts | 165 ++++++ .../src/lib/common/tests/config.test.ts | 127 ++++ .../src/lib/common/tests/file-upload.test.ts | 186 ++++++ .../src/lib/common/tests/initialize.test.ts | 366 ++++++++++++ .../src/lib/common/tests/logger.test.ts | 82 +++ .../lib/common/tests/response-queue.test.ts | 224 ++++++++ .../src/lib/common/tests/utils.test.ts | 394 +++++++++++++ packages/react-native/src/lib/common/utils.ts | 170 ++++++ .../react-native/src/lib/environment-state.ts | 130 ----- .../react-native/src/lib/environment/state.ts | 118 ++++ .../src/lib/environment/tests/state.test.ts | 306 ++++++++++ packages/react-native/src/lib/index.ts | 21 - packages/react-native/src/lib/initialize.ts | 274 --------- packages/react-native/src/lib/person-state.ts | 135 ----- packages/react-native/src/lib/person.ts | 30 - .../src/lib/{actions.ts => survey/action.ts} | 51 +- packages/react-native/src/lib/survey/state.ts | 98 ++++ .../lib/{survey-store.ts => survey/store.ts} | 15 +- .../lib/survey/tests/__mocks__/state.mock.ts | 8 + .../lib/survey/tests/__mocks__/store.mock.ts | 2 + .../src/lib/survey/tests/action.test.ts | 176 ++++++ .../src/lib/survey/tests/state.test.ts | 158 +++++ .../src/lib/survey/tests/store.test.ts | 129 +++++ .../react-native/src/lib/user/attribute.ts | 12 + packages/react-native/src/lib/user/state.ts | 54 ++ .../user/tests/__mocks__/update-queue.mock.ts | 6 + .../lib/user/tests/__mocks__/update.mock.ts | 7 + .../src/lib/user/tests/attribute.test.ts | 76 +++ .../src/lib/user/tests/state.test.ts | 103 ++++ .../src/lib/user/tests/update-queue.test.ts | 161 ++++++ .../src/lib/user/tests/update.test.ts | 221 +++++++ .../src/lib/user/tests/user.test.ts | 176 ++++++ .../react-native/src/lib/user/update-queue.ts | 153 +++++ packages/react-native/src/lib/user/update.ts | 114 ++++ packages/react-native/src/lib/user/user.ts | 63 ++ packages/react-native/src/types/config.ts | 154 +++++ packages/react-native/src/types/error.ts | 65 +++ packages/react-native/src/types/response.ts | 44 ++ packages/react-native/src/types/storage.ts | 35 ++ packages/react-native/src/types/survey.ts | 35 ++ packages/react-native/tsconfig.json | 4 + packages/react-native/vite.config.ts | 25 +- packages/react-native/vitest.setup.ts | 28 + packages/types/js.ts | 10 +- pnpm-lock.yaml | 541 ++++++++++-------- turbo.json | 3 + 91 files changed, 6021 insertions(+), 1180 deletions(-) create mode 100644 apps/web/app/api/v1/client/[environmentId]/user/route.ts create mode 100644 apps/web/modules/ee/contacts/api/client/[environmentId]/user/lib/contact.ts create mode 100644 apps/web/modules/ee/contacts/api/client/[environmentId]/user/lib/segments.ts create mode 100644 apps/web/modules/ee/contacts/api/client/[environmentId]/user/lib/update-user.ts create mode 100644 apps/web/modules/ee/contacts/api/client/[environmentId]/user/lib/user-state.ts create mode 100644 apps/web/modules/ee/contacts/api/client/[environmentId]/user/route.ts rename apps/web/modules/ee/contacts/{api/client/[environmentId]/contacts/[userId]/attributes => }/lib/attributes.ts (75%) create mode 100644 packages/api/src/api/client/environment.ts create mode 100644 packages/api/src/api/client/user.ts rename packages/react-native/src/{ => components}/formbricks.tsx (60%) rename packages/react-native/src/{ => components}/survey-web-view.tsx (77%) delete mode 100644 packages/react-native/src/lib/attributes.ts rename packages/react-native/src/lib/{ => common}/command-queue.ts (82%) rename packages/react-native/src/lib/{ => common}/config.ts (73%) rename packages/react-native/src/lib/{ => common}/event-listeners.ts (71%) rename packages/react-native/src/lib/{storage.ts => common/file-upload.ts} (91%) create mode 100644 packages/react-native/src/lib/common/initialize.ts create mode 100644 packages/react-native/src/lib/common/logger.ts create mode 100644 packages/react-native/src/lib/common/response-queue.ts create mode 100644 packages/react-native/src/lib/common/storage.ts create mode 100644 packages/react-native/src/lib/common/tests/__mocks__/config.mock.ts create mode 100644 packages/react-native/src/lib/common/tests/__mocks__/response-queue.mock.ts create mode 100644 packages/react-native/src/lib/common/tests/command-queue.test.ts create mode 100644 packages/react-native/src/lib/common/tests/config.test.ts create mode 100644 packages/react-native/src/lib/common/tests/file-upload.test.ts create mode 100644 packages/react-native/src/lib/common/tests/initialize.test.ts create mode 100644 packages/react-native/src/lib/common/tests/logger.test.ts create mode 100644 packages/react-native/src/lib/common/tests/response-queue.test.ts create mode 100644 packages/react-native/src/lib/common/tests/utils.test.ts create mode 100644 packages/react-native/src/lib/common/utils.ts delete mode 100644 packages/react-native/src/lib/environment-state.ts create mode 100644 packages/react-native/src/lib/environment/state.ts create mode 100644 packages/react-native/src/lib/environment/tests/state.test.ts delete mode 100644 packages/react-native/src/lib/index.ts delete mode 100644 packages/react-native/src/lib/initialize.ts delete mode 100644 packages/react-native/src/lib/person-state.ts delete mode 100644 packages/react-native/src/lib/person.ts rename packages/react-native/src/lib/{actions.ts => survey/action.ts} (52%) create mode 100644 packages/react-native/src/lib/survey/state.ts rename packages/react-native/src/lib/{survey-store.ts => survey/store.ts} (68%) create mode 100644 packages/react-native/src/lib/survey/tests/__mocks__/state.mock.ts create mode 100644 packages/react-native/src/lib/survey/tests/__mocks__/store.mock.ts create mode 100644 packages/react-native/src/lib/survey/tests/action.test.ts create mode 100644 packages/react-native/src/lib/survey/tests/state.test.ts create mode 100644 packages/react-native/src/lib/survey/tests/store.test.ts create mode 100644 packages/react-native/src/lib/user/attribute.ts create mode 100644 packages/react-native/src/lib/user/state.ts create mode 100644 packages/react-native/src/lib/user/tests/__mocks__/update-queue.mock.ts create mode 100644 packages/react-native/src/lib/user/tests/__mocks__/update.mock.ts create mode 100644 packages/react-native/src/lib/user/tests/attribute.test.ts create mode 100644 packages/react-native/src/lib/user/tests/state.test.ts create mode 100644 packages/react-native/src/lib/user/tests/update-queue.test.ts create mode 100644 packages/react-native/src/lib/user/tests/update.test.ts create mode 100644 packages/react-native/src/lib/user/tests/user.test.ts create mode 100644 packages/react-native/src/lib/user/update-queue.ts create mode 100644 packages/react-native/src/lib/user/update.ts create mode 100644 packages/react-native/src/lib/user/user.ts create mode 100644 packages/react-native/src/types/config.ts create mode 100644 packages/react-native/src/types/error.ts create mode 100644 packages/react-native/src/types/response.ts create mode 100644 packages/react-native/src/types/storage.ts create mode 100644 packages/react-native/src/types/survey.ts create mode 100644 packages/react-native/vitest.setup.ts diff --git a/apps/demo-react-native/.env.example b/apps/demo-react-native/.env.example index 3a2d97bdc4..340aecb341 100644 --- a/apps/demo-react-native/.env.example +++ b/apps/demo-react-native/.env.example @@ -1,2 +1,2 @@ -EXPO_PUBLIC_API_HOST=http://192.168.178.20:3000 -EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=clzr04nkd000bcdl110j0ijyq +EXPO_PUBLIC_APP_URL=http://192.168.0.197:3000 +EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=cm5p0cs7r000819182b32j0a1 \ No newline at end of file diff --git a/apps/demo-react-native/app.json b/apps/demo-react-native/app.json index 66cd17cbb8..31d6cb2a53 100644 --- a/apps/demo-react-native/app.json +++ b/apps/demo-react-native/app.json @@ -18,6 +18,7 @@ }, "jsEngine": "hermes", "name": "react-native-demo", + "newArchEnabled": true, "orientation": "portrait", "slug": "react-native-demo", "splash": { diff --git a/apps/demo-react-native/package.json b/apps/demo-react-native/package.json index 4dc5955136..acd06c3451 100644 --- a/apps/demo-react-native/package.json +++ b/apps/demo-react-native/package.json @@ -13,16 +13,17 @@ "dependencies": { "@formbricks/js": "workspace:*", "@formbricks/react-native": "workspace:*", - "expo": "52.0.18", - "expo-status-bar": "2.0.0", + "@react-native-async-storage/async-storage": "2.1.0", + "expo": "52.0.28", + "expo-status-bar": "2.0.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-native": "0.76.5", + "react-native": "0.76.6", "react-native-webview": "13.12.5" }, "devDependencies": { "@babel/core": "7.26.0", - "@types/react": "19.0.1", + "@types/react": "18.3.18", "typescript": "5.7.2" }, "private": true diff --git a/apps/demo-react-native/src/app.tsx b/apps/demo-react-native/src/app.tsx index 28e0f50552..a4816481e3 100644 --- a/apps/demo-react-native/src/app.tsx +++ b/apps/demo-react-native/src/app.tsx @@ -1,7 +1,14 @@ import { StatusBar } from "expo-status-bar"; import React, { type JSX } from "react"; import { Button, LogBox, StyleSheet, Text, View } from "react-native"; -import Formbricks, { track } from "@formbricks/react-native"; +import Formbricks, { + logout, + setAttribute, + setAttributes, + setLanguage, + setUserId, + track, +} from "@formbricks/react-native"; LogBox.ignoreAllLogs(); @@ -10,35 +17,92 @@ export default function App(): JSX.Element { throw new Error("EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID is required"); } - if (!process.env.EXPO_PUBLIC_API_HOST) { - throw new Error("EXPO_PUBLIC_API_HOST is required"); + if (!process.env.EXPO_PUBLIC_APP_URL) { + throw new Error("EXPO_PUBLIC_APP_URL is required"); } - const config = { - environmentId: process.env.EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID as string, - apiHost: process.env.EXPO_PUBLIC_API_HOST as string, - userId: "random-user-id", - attributes: { - language: "en", - testAttr: "attr-test", - }, - }; - return ( Formbricks React Native SDK Demo -