diff --git a/package.json b/package.json index 5b0e512a..3d028d12 100644 --- a/package.json +++ b/package.json @@ -65,8 +65,8 @@ "@commitlint/cli": "^17.4.3", "@commitlint/config-conventional": "^17.4.3", "@testing-library/jest-dom": "^5.11.9", - "@testing-library/react-hooks": "^8.0.1", "@testing-library/react": "^12.1.5", + "@testing-library/react-hooks": "^8.0.1", "@types/jest": "^26.0.20", "@types/react": "^17.0.0", "@typescript-eslint/eslint-plugin": "^4.15.2", @@ -81,26 +81,26 @@ "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-inline-environment-variables": "^0.4.3", "commitizen": "^4.3.0", + "eslint": "^7.18.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-import": "^2.20.2", "eslint-plugin-jest": "^22.11.0", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-react-hooks": "^4.0.2", "eslint-plugin-react": "^7.20.0", - "eslint": "^7.18.0", + "eslint-plugin-react-hooks": "^4.0.2", "fetch-mock": "^9.11.0", "husky": "^8.0.0", "identity-obj-proxy": "^3.0.0", + "jest": "^26.6.3", "jest-styled-components": "^7.0.3", "jest-websocket-mock": "^2.3.0", - "jest": "^26.6.3", "lerna": "^5.4.0", "msw": "^0.43.0", "nx": "^14.4.2", "pretty-quick": "^3.1.0", - "react-dom": "^17.0.1", "react": "^17.0.1", + "react-dom": "^17.0.1", "rimraf": "^3.0.2", "ts-jest": "^26.4.4", "ts-loader": "^8.0.17", diff --git a/packages/client-api/README.md b/packages/client-api/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/client-api/__tests__/inbox.spec.ts b/packages/client-api/__tests__/inbox.spec.ts deleted file mode 100644 index c04a1968..00000000 --- a/packages/client-api/__tests__/inbox.spec.ts +++ /dev/null @@ -1,222 +0,0 @@ -global.fetch = jest.fn(); - -const fetchMock = global.fetch as jest.Mock; -import Inbox from "../src/inbox"; -import pkg from "../package.json"; - -describe("getMessages", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should work without params", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.getMessages(); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox?", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - }, - ]); - }); - - test("should work with params", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.getMessages({ - next: "abc123", - tags: ["foo", "bar"], - status: "read", - }); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox?next=abc123&status=read&tags=foo%2Cbar", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - }, - ]); - }); -}); - -describe("getMessageCount", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should work without params", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.getMessageCount(); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/count?", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - }, - ]); - }); - - test("should work with params", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.getMessageCount({ - tags: ["foo", "bar"], - status: "read", - }); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/count?status=read&tags=foo%2Cbar", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - }, - ]); - }); -}); - -describe("getMessage", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should work without params", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.getMessage("mockMessageId"); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/mockMessageId", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - }, - ]); - }); -}); - -describe("trackEvent", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should mark read", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.markRead("mockMessageId"); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/mockMessageId/event/read", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - method: "post", - }, - ]); - }); - - test("should mark unread", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.markUnread("mockMessageId"); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/mockMessageId/event/unread", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - method: "post", - }, - ]); - }); - - test("should mark archived", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.markArchived("mockMessageId"); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/mockMessageId/event/archive", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - method: "post", - }, - ]); - }); - - test("should mark all read", async () => { - fetchMock.mockImplementation(() => Promise.resolve([])); - const inboxApi = Inbox({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await inboxApi.markAllRead(); - expect(fetchMock.mock.calls[0]).toEqual([ - "https://inbox.courier.com/inbox/mark-all-read", - { - headers: { - "x-courier-client-key": "CLIENT_KEY", - - "x-courier-client-version": pkg.version, - "x-courier-user-id": "USER_ID", - }, - method: "post", - }, - ]); - }); -}); diff --git a/packages/client-api/babel.config.js b/packages/client-api/babel.config.js deleted file mode 100644 index 4f3c7740..00000000 --- a/packages/client-api/babel.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - sourceType: "unambiguous", - plugins: [ - "@babel/transform-runtime", - "transform-inline-environment-variables", - process.env.NODE_ENV !== "test" && [ - "babel-plugin-root-import", - { - rootPathSuffix: "./src", - rootPathPrefix: "~/", - }, - ], - ].filter(Boolean), - presets: ["@babel/preset-typescript", "@babel/preset-env"], - ignore: ["src/__tests__", "src/__mocks__"], -}; diff --git a/packages/client-api/jest.config.js b/packages/client-api/jest.config.js deleted file mode 100644 index a72cbc55..00000000 --- a/packages/client-api/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const jestConfigBase = require("../../jest.config.base"); -const babelConfig = require("./babel.config.js"); - -module.exports = jestConfigBase(babelConfig); diff --git a/packages/client-api/package.json b/packages/client-api/package.json deleted file mode 100644 index c886b1ee..00000000 --- a/packages/client-api/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "@trycourier/client-api", - "version": "5.1.2", - "description": "", - "main": "dist/index.js", - "private": true, - "types": "typings/index.d.ts", - "scripts": { - "babel": "babel src -d dist --extensions \".ts\" --ignore \"src/**/__tests__/**\"", - "build:watch": "yarn babel --watch", - "build": "rimraf dist && yarn babel", - "clean": "rimraf dist && rimraf typings", - "test": "jest -c jest.config.js --runInBand", - "type-check": "tsc --noEmit", - "types": "tsc --build" - }, - "license": "ISC", - "dependencies": { - "graphql": "^15.5.0", - "query-string": "^7.1.1", - "querystring": "^0.2.1", - "rimraf": "^3.0.2", - "urql": "^2.0.1" - }, - "files": [ - "dist/", - "typings/" - ] -} diff --git a/packages/client-api/src/inbox/index.ts b/packages/client-api/src/inbox/index.ts deleted file mode 100644 index bdfcce69..00000000 --- a/packages/client-api/src/inbox/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -import queryString from "query-string"; -import getHttpHeaders from "~/lib/get-http-headers"; -import { ICourierClientBasicParams, ICourierClientJWTParams } from "~/types"; - -interface IGetMessagesParams { - next?: string; - tags?: string[]; - status?: "read" | "unread"; -} - -interface IGetMessageCountParams { - tags?: string[]; - status?: "read" | "unread"; -} - -const prodApiUrl = "https://inbox.courier.com"; - -const Inbox = (params: ICourierClientBasicParams | ICourierClientJWTParams) => { - const headers = getHttpHeaders(params); - const apiUrl = params?.apiUrl ?? prodApiUrl; - - const getMessages = (getMessagesParams?: IGetMessagesParams) => { - const qs = queryString.stringify({ - next: getMessagesParams?.next, - tags: getMessagesParams?.tags?.join(","), - status: getMessagesParams?.status, - }); - - return fetch(`${apiUrl}/inbox?${qs}`, { - headers, - }); - }; - - const getMessageCount = (getMessageCountParams?: IGetMessageCountParams) => { - const qs = queryString.stringify({ - tags: getMessageCountParams?.tags?.join(","), - status: getMessageCountParams?.status, - }); - - return fetch(`${apiUrl}/inbox/count?${qs}`, { - headers, - }); - }; - - const getMessage = (messageId: string) => { - return fetch(`${apiUrl}/inbox/${messageId}`, { - headers, - }); - }; - - const trackEvent = - (eventType: "read" | "unread" | "archive") => (messageId: string) => { - return fetch(`${apiUrl}/inbox/${messageId}/event/${eventType}`, { - headers, - method: "post", - }); - }; - - const markAllRead = () => { - return fetch(`${apiUrl}/inbox/mark-all-read`, { - headers, - method: "post", - }); - }; - - return { - getMessage, - getMessageCount, - getMessages, - markAllRead, - markArchived: trackEvent("archive"), - markRead: trackEvent("read"), - markUnread: trackEvent("unread"), - }; -}; - -export default Inbox; diff --git a/packages/client-api/src/index.ts b/packages/client-api/src/index.ts deleted file mode 100644 index 2c69f415..00000000 --- a/packages/client-api/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as Inbox from "./inbox"; diff --git a/packages/client-api/src/lib/get-http-headers.ts b/packages/client-api/src/lib/get-http-headers.ts deleted file mode 100644 index 3e962286..00000000 --- a/packages/client-api/src/lib/get-http-headers.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ICourierClientBasicParams, ICourierClientJWTParams } from "~/types"; -import pkg from "../../package.json"; - -export default ( - params: ICourierClientBasicParams | ICourierClientJWTParams -) => { - let headers = {}; - - if ("authorization" in params) { - headers = { - authorization: `Bearer ${params.authorization}`, - }; - } else { - const { clientKey, userId, userSignature } = params; - - headers = { - "x-courier-client-key": clientKey, - "x-courier-user-id": userId, - "x-courier-client-version": pkg.version, - }; - - if (userSignature) { - headers["x-courier-user-signature"] = userSignature; - } - } - - return headers; -}; diff --git a/packages/client-api/src/types.ts b/packages/client-api/src/types.ts deleted file mode 100644 index dc76e6d9..00000000 --- a/packages/client-api/src/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type ICourierClientBasicParams = { - clientKey: string; - userId: string; - userSignature?: string; - apiUrl?: string; -}; - -export type ICourierClientJWTParams = { - authorization: string; - apiUrl?: string; -}; diff --git a/packages/client-api/tsconfig.json b/packages/client-api/tsconfig.json deleted file mode 100644 index 6fac5d8b..00000000 --- a/packages/client-api/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "../../tsconfig-base.json", - "compilerOptions": { - "rootDir": "./", - "outDir": "./dist", - "declarationDir": "./typings", - "paths": { - "~/*": ["./src/*"] - } - }, - "include": [ - "../types/@types/*/index.d.ts", - "./src/**/*.tsx", - "./src/**/*.ts", - "./package.json" - ] -} diff --git a/packages/client-api/webpack.config.js b/packages/client-api/webpack.config.js deleted file mode 100644 index d23745c3..00000000 --- a/packages/client-api/webpack.config.js +++ /dev/null @@ -1,25 +0,0 @@ -// webpack.config.js - -const pkgDir = require("pkg-dir"); -const path = require("path"); - -module.exports = { - // ... - module: { - rules: [ - { - test: /package\.json$/, - type: "javascript/auto", - use: { - loader: "json-loader", - }, - }, - ], - }, - resolve: { - alias: { - // Use an alias to make it easier to import the root package.json - "package.json": path.join(pkgDir.sync(__dirname), "package.json"), - }, - }, -}; diff --git a/packages/client-graphql/README.md b/packages/client-graphql/README.md index 77ccdcad..57fff53b 100644 --- a/packages/client-graphql/README.md +++ b/packages/client-graphql/README.md @@ -39,16 +39,16 @@ const events = Brands({ events: courierClient }) ### Messages ```js -import { Messages } from "@trycourier/client-graphql"; +import { Inbox } from "@trycourier/client-graphql"; -const messagesApi = Messages({ authorization: "abc123" }); +const inboxApi = Inbox({ authorization: "abc123" }); const getMessageCount = async (params?: { - isRead?: boolean, + status?: "read" | "unread", from?: number, tags?: string[], }) => { - const messageCount = await messagesApi.getMessageCount(params); + const messageCount = await inboxApi.getInboxMessages(params); return messageCount; }; const getMessages = async ( diff --git a/packages/client-graphql/src/__tests__/banner.spec.ts b/packages/client-graphql/src/__tests__/banner.spec.ts index 740134e6..233307cc 100644 --- a/packages/client-graphql/src/__tests__/banner.spec.ts +++ b/packages/client-graphql/src/__tests__/banner.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Banner from "../banner"; -import pkg from "../../package.json"; describe("banner", () => { afterEach(() => { @@ -45,7 +44,6 @@ describe("banner", () => { expect(thisCall.headers).toEqual({ "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": pkg.version, "x-courier-user-id": "USER_ID", }); expect(thisCall.method).toBe("POST"); @@ -93,8 +91,6 @@ describe("banner", () => { expect(thisCall.headers).toEqual({ authorization: "Bearer abc123", "content-type": "application/json", - - "x-courier-client-version": pkg.version, }); expect(thisCall.method).toBe("POST"); }); diff --git a/packages/client-graphql/src/__tests__/messages.spec.ts b/packages/client-graphql/src/__tests__/messages.spec.ts deleted file mode 100644 index 00fe79d5..00000000 --- a/packages/client-graphql/src/__tests__/messages.spec.ts +++ /dev/null @@ -1,252 +0,0 @@ -global.fetch = jest.fn(); -import pkg from "../../package.json"; -const fetchMock = global.fetch as jest.Mock; -import Messages from "../messages"; - -describe("getMessages", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should work without params", async () => { - fetchMock.mockImplementation(() => - Promise.resolve({ - json: () => ({ - data: { - messages: { - nodes: "mockMessages", - pageInfo: { - startCursor: "mockStartCursor", - }, - }, - }, - }), - }) - ); - - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await messagesApi.getMessages(); - expect(fetchMock.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "body": "{\\"query\\":\\"query GetMessages($params: FilterParamsInput, $limit: Int = 10, $after: String) {\\\\n messages(params: $params, limit: $limit, after: $after) {\\\\n totalCount\\\\n pageInfo {\\\\n startCursor\\\\n hasNextPage\\\\n __typename\\\\n }\\\\n nodes {\\\\n created\\\\n id\\\\n messageId\\\\n opened\\\\n read\\\\n tags\\\\n content {\\\\n title\\\\n body\\\\n blocks {\\\\n ... on TextBlock {\\\\n type\\\\n text\\\\n __typename\\\\n }\\\\n ... on ActionBlock {\\\\n type\\\\n text\\\\n url\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n data\\\\n trackingIds {\\\\n openTrackingId\\\\n archiveTrackingId\\\\n clickTrackingId\\\\n deliverTrackingId\\\\n readTrackingId\\\\n unreadTrackingId\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n}\\\\n\\",\\"operationName\\":\\"GetMessages\\",\\"variables\\":{\\"params\\":{}}}", - "headers": Object { - "content-type": "application/json", - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", - "x-courier-user-id": "USER_ID", - }, - "method": "POST", - "signal": AbortSignal {}, - } - `); - }); - - test("should work with params", async () => { - fetchMock.mockImplementation(() => - Promise.resolve({ - json: () => ({ - data: { - messages: { - nodes: "mockMessages", - pageInfo: { - startCursor: "mockStartCursor", - }, - }, - }, - }), - }) - ); - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - const response = await messagesApi.getMessages( - { - tags: ["MOCK_TAG"], - isRead: true, - limit: 100, - }, - "abc123" - ); - - expect(response).toEqual({ - appendMessages: true, - messages: "mockMessages", - startCursor: "mockStartCursor", - }); - - expect(fetchMock.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "body": "{\\"query\\":\\"query GetMessages($params: FilterParamsInput, $limit: Int = 10, $after: String) {\\\\n messages(params: $params, limit: $limit, after: $after) {\\\\n totalCount\\\\n pageInfo {\\\\n startCursor\\\\n hasNextPage\\\\n __typename\\\\n }\\\\n nodes {\\\\n created\\\\n id\\\\n messageId\\\\n opened\\\\n read\\\\n tags\\\\n content {\\\\n title\\\\n body\\\\n blocks {\\\\n ... on TextBlock {\\\\n type\\\\n text\\\\n __typename\\\\n }\\\\n ... on ActionBlock {\\\\n type\\\\n text\\\\n url\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n data\\\\n trackingIds {\\\\n openTrackingId\\\\n archiveTrackingId\\\\n clickTrackingId\\\\n deliverTrackingId\\\\n readTrackingId\\\\n unreadTrackingId\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n}\\\\n\\",\\"operationName\\":\\"GetMessages\\",\\"variables\\":{\\"after\\":\\"abc123\\",\\"limit\\":100,\\"params\\":{\\"tags\\":[\\"MOCK_TAG\\"],\\"isRead\\":true}}}", - "headers": Object { - "content-type": "application/json", - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", - "x-courier-user-id": "USER_ID", - }, - "method": "POST", - "signal": AbortSignal {}, - } - `); - }); -}); - -describe("getMessageLists", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should do nothing without params", async () => { - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - await messagesApi.getMessageLists(); - expect(fetchMock.mock.calls.length).toBe(0); - }); - - test("should construct a query for x tabs", async () => { - fetchMock.mockImplementation(() => - Promise.resolve({ - json: () => ({ - data: { - unread: { - nodes: "mockNodes0", - }, - tagged: { - nodes: "mockNodes1", - pageInfo: { - startCursor: "mockStartCursor", - }, - }, - }, - }), - }) - ); - - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - const response = await messagesApi.getMessageLists([ - { - id: "unread", - filters: { - isRead: false, - }, - }, - { - id: "tagged", - filters: { - tags: ["abc", "123"], - }, - }, - ]); - - expect(response).toEqual({ - unread: { - messages: "mockNodes0", - }, - tagged: { - messages: "mockNodes1", - startCursor: "mockStartCursor", - }, - }); - - expect(fetchMock.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "body": "{\\"query\\":\\"query GetMessageLists($unreadParams: FilterParamsInput, $taggedParams: FilterParamsInput, $limit: Int = 10) {\\\\n unread: messages(params: $unreadParams, limit: $limit) {\\\\n totalCount\\\\n pageInfo {\\\\n startCursor\\\\n hasNextPage\\\\n __typename\\\\n }\\\\n nodes {\\\\n created\\\\n id\\\\n messageId\\\\n opened\\\\n read\\\\n tags\\\\n content {\\\\n title\\\\n body\\\\n blocks {\\\\n ... on TextBlock {\\\\n type\\\\n text\\\\n __typename\\\\n }\\\\n ... on ActionBlock {\\\\n type\\\\n text\\\\n url\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n data\\\\n trackingIds {\\\\n openTrackingId\\\\n archiveTrackingId\\\\n clickTrackingId\\\\n deliverTrackingId\\\\n readTrackingId\\\\n unreadTrackingId\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n tagged: messages(params: $taggedParams, limit: $limit) {\\\\n totalCount\\\\n pageInfo {\\\\n startCursor\\\\n hasNextPage\\\\n __typename\\\\n }\\\\n nodes {\\\\n created\\\\n id\\\\n messageId\\\\n opened\\\\n read\\\\n tags\\\\n content {\\\\n title\\\\n body\\\\n blocks {\\\\n ... on TextBlock {\\\\n type\\\\n text\\\\n __typename\\\\n }\\\\n ... on ActionBlock {\\\\n type\\\\n text\\\\n url\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n data\\\\n trackingIds {\\\\n openTrackingId\\\\n archiveTrackingId\\\\n clickTrackingId\\\\n deliverTrackingId\\\\n readTrackingId\\\\n unreadTrackingId\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n __typename\\\\n }\\\\n}\\\\n\\",\\"operationName\\":\\"GetMessageLists\\",\\"variables\\":{\\"unreadParams\\":{\\"isRead\\":false},\\"taggedParams\\":{\\"tags\\":[\\"abc\\",\\"123\\"]},\\"limit\\":10}}", - "headers": Object { - "content-type": "application/json", - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", - "x-courier-user-id": "USER_ID", - }, - "method": "POST", - "signal": AbortSignal {}, - } - `); - }); -}); - -describe("getMessageCount", () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - test("should work without params", async () => { - fetchMock.mockImplementation(() => - Promise.resolve({ - json: () => ({ - data: { - messageCount: 100, - }, - }), - }) - ); - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - const response = await messagesApi.getMessageCount(); - expect(response).toBe(100); - expect(fetchMock.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "body": "{\\"query\\":\\"query MessageCount($params: FilterParamsInput) {\\\\n messageCount(params: $params)\\\\n}\\\\n\\",\\"operationName\\":\\"MessageCount\\",\\"variables\\":{}}", - "headers": Object { - "content-type": "application/json", - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", - "x-courier-user-id": "USER_ID", - }, - "method": "POST", - "signal": AbortSignal {}, - } - `); - }); - - test("should work with params", async () => { - fetchMock.mockImplementation(() => - Promise.resolve({ - json: () => ({ - data: { - messageCount: 50, - }, - }), - }) - ); - const messagesApi = Messages({ - clientKey: "CLIENT_KEY", - userId: "USER_ID", - }); - - const response = await messagesApi.getMessageCount({ - tags: ["MOCK_TAG"], - isRead: false, - }); - - expect(response).toBe(50); - - expect(fetchMock.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "body": "{\\"query\\":\\"query MessageCount($params: FilterParamsInput) {\\\\n messageCount(params: $params)\\\\n}\\\\n\\",\\"operationName\\":\\"MessageCount\\",\\"variables\\":{\\"params\\":{\\"tags\\":[\\"MOCK_TAG\\"],\\"isRead\\":false}}}", - "headers": Object { - "content-type": "application/json", - "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", - "x-courier-user-id": "USER_ID", - }, - "method": "POST", - "signal": AbortSignal {}, - } - `); - }); -}); diff --git a/packages/client-graphql/src/client.ts b/packages/client-graphql/src/client.ts index 9bdf6c6b..b9989931 100644 --- a/packages/client-graphql/src/client.ts +++ b/packages/client-graphql/src/client.ts @@ -1,5 +1,4 @@ require("isomorphic-fetch"); -import pkg from "../package.json"; import { Client, createClient } from "urql"; import { @@ -59,11 +58,17 @@ export const createCourierClient = ( } } - // add client version and platform + /* + riley todo - + turing this off for now because the way we made typescript happy before + broke our typings so we will need a better way to do this in the future + + add client version and platform headers = { ...headers, - "x-courier-client-version": pkg.version, + "x-courier-client-version": package.version, }; + */ return createClient({ url: diff --git a/packages/client-graphql/src/inbox/__tests__/count.spec.ts b/packages/client-graphql/src/inbox/__tests__/count.spec.ts index 95e8ea9b..f7e8139f 100644 --- a/packages/client-graphql/src/inbox/__tests__/count.spec.ts +++ b/packages/client-graphql/src/inbox/__tests__/count.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Inbox from "../index"; -import pkg from "../../../package.json"; describe("getInboxCount", () => { afterEach(() => { @@ -25,7 +24,6 @@ describe("getInboxCount", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", @@ -55,7 +53,6 @@ describe("getInboxCount", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", diff --git a/packages/client-graphql/src/inbox/__tests__/mark-all-read.spec.ts b/packages/client-graphql/src/inbox/__tests__/mark-all-read.spec.ts index 26e26592..8004617a 100644 --- a/packages/client-graphql/src/inbox/__tests__/mark-all-read.spec.ts +++ b/packages/client-graphql/src/inbox/__tests__/mark-all-read.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Inbox from "../index"; -import pkg from "../../../package.json"; describe("trackEvent", () => { afterEach(() => { @@ -26,7 +25,6 @@ describe("trackEvent", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", diff --git a/packages/client-graphql/src/inbox/__tests__/message.spec.ts b/packages/client-graphql/src/inbox/__tests__/message.spec.ts index d868619c..8bacdf1f 100644 --- a/packages/client-graphql/src/inbox/__tests__/message.spec.ts +++ b/packages/client-graphql/src/inbox/__tests__/message.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Inbox from "../index"; -import pkg from "../../../package.json"; describe("getMessage", () => { afterEach(() => { @@ -25,7 +24,6 @@ describe("getMessage", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", diff --git a/packages/client-graphql/src/inbox/__tests__/messages.spec.ts b/packages/client-graphql/src/inbox/__tests__/messages.spec.ts index 0a345144..c6583d13 100644 --- a/packages/client-graphql/src/inbox/__tests__/messages.spec.ts +++ b/packages/client-graphql/src/inbox/__tests__/messages.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Inbox from "../index"; -import pkg from "../../../package.json"; describe("getMessages", () => { afterEach(() => { @@ -25,7 +24,6 @@ describe("getMessages", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", @@ -55,7 +53,6 @@ describe("getMessages", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", diff --git a/packages/client-graphql/src/inbox/__tests__/track-event.spec.ts b/packages/client-graphql/src/inbox/__tests__/track-event.spec.ts index dc8b23c0..9a893cc2 100644 --- a/packages/client-graphql/src/inbox/__tests__/track-event.spec.ts +++ b/packages/client-graphql/src/inbox/__tests__/track-event.spec.ts @@ -2,7 +2,6 @@ global.fetch = jest.fn(); const fetchMock = global.fetch as jest.Mock; import Inbox from "../index"; -import pkg from "../../../package.json"; describe("trackEvent", () => { afterEach(() => { @@ -26,7 +25,6 @@ describe("trackEvent", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", @@ -48,7 +46,6 @@ describe("trackEvent", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", @@ -70,7 +67,6 @@ describe("trackEvent", () => { "headers": Object { "content-type": "application/json", "x-courier-client-key": "CLIENT_KEY", - "x-courier-client-version": "${pkg.version}", "x-courier-user-id": "USER_ID", }, "method": "POST", diff --git a/packages/client-graphql/src/inbox/track-event.ts b/packages/client-graphql/src/inbox/track-event.ts index 5842845c..e3f0decc 100644 --- a/packages/client-graphql/src/inbox/track-event.ts +++ b/packages/client-graphql/src/inbox/track-event.ts @@ -36,7 +36,10 @@ export const getTrackEventQueryWithTrackingId = (eventType: EventType) => ` } `; -export type TrackEvent = (messageId: string) => Promise< +export type TrackEvent = ( + messageId: string, + data?: Record +) => Promise< | { [eventType: string]: boolean; } diff --git a/packages/client-graphql/src/index.ts b/packages/client-graphql/src/index.ts index 8a06bc14..3b77bc1b 100644 --- a/packages/client-graphql/src/index.ts +++ b/packages/client-graphql/src/index.ts @@ -8,11 +8,6 @@ export { IInboxMessage, IGetInboxMessagesParams, } from "./inbox"; -export { - default as Messages, - IGetMessagesParams, - IGraphMessageResponse, -} from "./messages"; export { default as Preferences, UpdateRecipientPreferencesPayload, diff --git a/packages/client-graphql/src/messages.ts b/packages/client-graphql/src/messages.ts deleted file mode 100644 index 06599eab..00000000 --- a/packages/client-graphql/src/messages.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { Client } from "urql"; -import { ICourierClientBasicParams, ICourierClientJWTParams } from "./types"; -import { createCourierClient } from "./client"; - -export const GET_MESSAGE_COUNT = ` - query MessageCount($params: FilterParamsInput) { - messageCount(params: $params) - } -`; - -export interface IMessageCountParams { - tenantId?: string; - tags?: string[]; - from?: number; - isRead?: boolean; -} -type GetMessageCount = (params?: IMessageCountParams) => Promise; -export const getMessageCount = - (client?: Client): GetMessageCount => - async (params) => { - if (!client) { - return Promise.resolve(); - } - - const results = await client - .query(GET_MESSAGE_COUNT, { - params, - }) - .toPromise(); - return results?.data?.messageCount; - }; - -export interface IGetMessagesParams { - tenantId?: string; - from?: number; - isRead?: boolean; - limit?: number; - tags?: string[]; -} - -const messagesProps = `{ - totalCount - pageInfo { - startCursor - hasNextPage - } - nodes { - created - id - messageId - opened - read - tags - content { - title - body - blocks { - ... on TextBlock { - type - text - } - ... on ActionBlock { - type - text - url - } - } - data - trackingIds { - openTrackingId - archiveTrackingId - clickTrackingId - deliverTrackingId - readTrackingId - unreadTrackingId - } - } - } -}`; - -export const QUERY_MESSAGES = ` - query GetMessages($params: FilterParamsInput, $limit: Int = 10, $after: String){ - messages(params: $params, limit: $limit, after: $after) ${messagesProps} - } -`; - -interface ITextBlock { - type: "text"; - text: string; -} - -interface IActionBlock { - type: "action"; - text: string; - url: string; -} -export interface IGraphMessageResponse { - id: string; - messageId: string; - created: string; - opened?: string; - read?: boolean; - tags?: string[]; - content: { - title: string; - body: string; - blocks: Array; - data?: any; - trackingIds: { - archiveTrackingId: string; - clickTrackingId: string; - deliverTrackingId: string; - openTrackingId: string; - readTrackingId: string; - unreadTrackingId: string; - }; - }; -} - -type GetMessages = ( - params?: IGetMessagesParams, - after?: string -) => Promise< - | { - appendMessages: boolean; - startCursor: string; - messages: IGraphMessageResponse[]; - } - | undefined ->; - -export const getMessages = - (client?: Client): GetMessages => - async (params?: IGetMessagesParams, after?: string) => { - if (!client) { - return Promise.resolve(undefined); - } - - const { limit, tenantId, ...restParams } = params ?? {}; - const results = await client - .query(QUERY_MESSAGES, { - after, - limit, - params: { - ...restParams, - // [HACK] map tenantId to accountId in order to keep this backwards compatible - accountId: tenantId, - }, - }) - .toPromise(); - - const messages = results?.data?.messages?.nodes; - const startCursor = results?.data?.messages?.pageInfo?.startCursor; - - return { - appendMessages: Boolean(after), - messages, - startCursor, - }; - }; - -type GetMessageLists = ( - lists?: { - id: string; - filters: IGetMessagesParams; - }[], - limit?: number -) => Promise< - | { - [listName: string]: { - startCursor: string; - messages: IGraphMessageResponse[]; - }; - } - | undefined ->; - -export const getMessageLists = - (client?: Client): GetMessageLists => - async (lists, limit = 10) => { - if (!client || !lists) { - return Promise.resolve(undefined); - } - - const initialReduction: { - args: string[]; - queries: string[]; - variables: { - [key: string]: IGetMessagesParams; - }; - } = { - args: [], - queries: [], - variables: {}, - }; - - const { args, queries, variables } = lists.reduce((acc, cur) => { - acc.args.push(`$${cur.id}Params: FilterParamsInput`); - acc.queries.push( - `${cur.id}: messages(params: $${cur.id}Params, limit: $limit) ${messagesProps}` - ); - acc.variables[`${cur.id}Params`] = cur.filters; - return acc; - }, initialReduction); - - const QUERY = `query GetMessageLists(${args}, $limit: Int = 10){ - ${queries.join("")} - }`; - - const results = await client - .query(QUERY, { ...variables, limit }) - .toPromise(); - - const response = Object.keys(results.data)?.reduce((acc, listName) => { - acc[listName] = { - messages: results.data[listName].nodes, - startCursor: results.data[listName].pageInfo?.startCursor, - }; - return acc; - }, {}); - - return response; - }; - -export default ( - params: - | ICourierClientBasicParams - | ICourierClientJWTParams - | { client?: Client } -): { - getMessageCount: GetMessageCount; - getMessageLists: GetMessageLists; - getMessages: GetMessages; -} => { - const client = createCourierClient(params); - - return { - getMessageCount: getMessageCount(client), - getMessageLists: getMessageLists(client), - getMessages: getMessages(client), - }; -}; diff --git a/packages/client-graphql/src/preferences.ts b/packages/client-graphql/src/preferences.ts index 3208994c..9ccadf3c 100644 --- a/packages/client-graphql/src/preferences.ts +++ b/packages/client-graphql/src/preferences.ts @@ -138,9 +138,9 @@ const UPDATE_RECIPIENT_PREFERENCES = ` export interface UpdateRecipientPreferencesPayload { templateId: string; status: string; - hasCustomRouting: boolean; - routingPreferences: Array; - digestSchedule: string; + hasCustomRouting?: boolean; + routingPreferences?: Array; + digestSchedule?: string; tenantId?: string; } diff --git a/packages/client-graphql/tsconfig.json b/packages/client-graphql/tsconfig.json index 6fac5d8b..062df5b9 100644 --- a/packages/client-graphql/tsconfig.json +++ b/packages/client-graphql/tsconfig.json @@ -1,17 +1,12 @@ { "extends": "../../tsconfig-base.json", "compilerOptions": { - "rootDir": "./", + "rootDir": "./src", "outDir": "./dist", "declarationDir": "./typings", "paths": { "~/*": ["./src/*"] } }, - "include": [ - "../types/@types/*/index.d.ts", - "./src/**/*.tsx", - "./src/**/*.ts", - "./package.json" - ] + "include": ["../types/@types/*/index.d.ts", "./src/**/*.ts"] } diff --git a/packages/react-hooks/src/inbox/__tests__/reducer.spec.ts b/packages/react-hooks/src/inbox/__tests__/reducer.spec.ts index 3174f8f9..3fd58f7f 100644 --- a/packages/react-hooks/src/inbox/__tests__/reducer.spec.ts +++ b/packages/react-hooks/src/inbox/__tests__/reducer.spec.ts @@ -1,4 +1,4 @@ -import { IInboxMessagePreview } from "@trycourier/client-graphql"; +import { IInboxMessagePreview } from "@trycourier/react-provider"; import reducer, { initialState } from "../reducer"; import { initInbox, INBOX_INIT } from "../actions/init"; diff --git a/packages/react-hooks/src/inbox/actions/fetch-messages.ts b/packages/react-hooks/src/inbox/actions/fetch-messages.ts index a71e9bbc..ca63adaf 100644 --- a/packages/react-hooks/src/inbox/actions/fetch-messages.ts +++ b/packages/react-hooks/src/inbox/actions/fetch-messages.ts @@ -1,7 +1,5 @@ -import { - IGetMessagesParams, - IInboxMessagePreview, -} from "@trycourier/client-graphql"; +import { IGetInboxMessagesParams } from "@trycourier/client-graphql"; +import { IInbox } from "../types"; export const INBOX_FETCH_MESSAGES = "inbox/FETCH_MESSAGES"; export const INBOX_FETCH_MESSAGES_PENDING = "inbox/FETCH_MESSAGES/PENDING"; @@ -27,8 +25,8 @@ export const fetchMessagesError = (): FetchMessagesError => ({ export const INBOX_FETCH_MESSAGES_DONE = "inbox/FETCH_MESSAGES/DONE"; interface FetchMessagesDonePayload { - messages: IInboxMessagePreview[]; - pinned?: IInboxMessagePreview[]; + messages: IInbox["messages"]; + pinned?: IInbox["pinned"]; appendMessages?: boolean; startCursor?: string; } @@ -39,7 +37,7 @@ export type FetchMessagesDone = { tabId?: string; searchParams: { from?: string; - filters: IGetMessagesParams; + filters: IGetInboxMessagesParams; }; }; payload: FetchMessagesDonePayload; diff --git a/packages/react-hooks/src/inbox/elemental-inbox/__tests__/reducer.spec.ts b/packages/react-hooks/src/inbox/elemental-inbox/__tests__/reducer.spec.ts deleted file mode 100644 index e62b4a22..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/__tests__/reducer.spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { IElementalInbox, IElementalInboxMessagePreview } from "../types"; -import reducer, { initialState } from "../reducer"; -import { initInbox, INBOX_INIT } from "../../actions/init"; -import { setView, INBOX_SET_VIEW } from "../../actions/set-view"; -import { toggleInbox, INBOX_TOGGLE } from "../../actions/toggle-inbox"; -import { - fetchUnreadMessageCountDone, - INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE, -} from "../actions/fetch-unread-message-count"; -import { - fetchMessagesPending, - fetchMessagesError, - fetchMessagesDone, - INBOX_FETCH_MESSAGES, - INBOX_FETCH_MESSAGES_ERROR, - INBOX_FETCH_MESSAGES_PENDING, - INBOX_FETCH_MESSAGES_DONE, -} from "../actions/fetch-messages"; -import { - markMessageRead, - INBOX_MARK_MESSAGE_READ, -} from "../../actions/mark-message-read"; -import { - markMessageUnread, - INBOX_MARK_MESSAGE_UNREAD, -} from "../../actions/mark-message-unread"; - -import { INBOX_NEW_MESSAGE, newMessage } from "../actions/new-message"; - -import { INBOX_MARK_ALL_READ, markAllRead } from "../actions/mark-all-read"; - -const mockMessage: IElementalInboxMessagePreview = { - messageId: "mockMessageId", - created: new Date().toISOString(), - title: "mockTitle", - preview: "mockPreview", -}; -const mockMessage2: IElementalInboxMessagePreview = { - messageId: "mockMessageId2", - created: new Date().toISOString(), - title: "mockTitle2", - preview: "mockPreview2", -}; - -const mockDate = new Date().toISOString(); - -describe("inbox reducer", () => { - beforeAll(() => { - jest.useFakeTimers("modern").setSystemTime(new Date(mockDate)); - }); - - it("should set the initial state", () => { - const state = reducer(); - expect(state).toEqual(initialState); - }); - - it(`action ${INBOX_INIT}`, () => { - const state = reducer( - initialState, - initInbox({ - isOpen: true, - }) - ); - - expect(state).toEqual({ - ...initialState, - isOpen: true, - }); - }); - - it(`action ${INBOX_SET_VIEW}`, () => { - const state = reducer(initialState, setView("preferences")); - - expect(state).toEqual({ - ...initialState, - view: "preferences", - }); - }); - - it(`action ${INBOX_TOGGLE}`, () => { - const state = reducer(initialState, toggleInbox(true)); - - expect(state).toEqual({ - ...initialState, - isOpen: true, - }); - - const newState = reducer(state, toggleInbox()); - - expect(newState).toEqual({ - ...initialState, - isOpen: false, - }); - }); - - it(`action ${INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE}`, () => { - const state = reducer( - initialState, - fetchUnreadMessageCountDone({ - count: 100, - }) - ); - - expect(state).toEqual({ - ...initialState, - unreadMessageCount: 100, - }); - }); - - describe(`action ${INBOX_NEW_MESSAGE}`, () => { - it("will prepend the new message to the state", () => { - const state = reducer(initialState, newMessage(mockMessage)); - - expect(state).toEqual({ - ...initialState, - unreadMessageCount: 1, - messages: [mockMessage], - }); - }); - }); - - describe(`action ${INBOX_FETCH_MESSAGES}`, () => { - it(INBOX_FETCH_MESSAGES_PENDING, () => { - const state = reducer(initialState, fetchMessagesPending()); - - expect(state).toEqual({ - ...initialState, - isLoading: true, - }); - }); - - it(INBOX_FETCH_MESSAGES_ERROR, () => { - const state = reducer(initialState, fetchMessagesError()); - - expect(state).toEqual({ - ...initialState, - isLoading: false, - }); - }); - - describe(INBOX_FETCH_MESSAGES_DONE, () => { - it(`will not append if appendMessages === false`, () => { - const state = reducer( - initialState, - fetchMessagesDone({ messages: [mockMessage] }) - ); - - expect(state).toEqual({ - ...initialState, - messages: [mockMessage], - lastMessagesFetched: Date.now(), - startCursor: undefined, - isLoading: false, - }); - }); - - it(`will append if appendMessages === true`, () => { - const state = reducer( - { - ...initialState, - messages: [mockMessage], - isLoading: true, - }, - fetchMessagesDone({ - appendMessages: true, - messages: [mockMessage2], - }) - ); - - expect(state).toEqual({ - ...initialState, - messages: [mockMessage, mockMessage2], - lastMessagesFetched: Date.now(), - startCursor: undefined, - isLoading: false, - }); - }); - }); - }); - - describe(`action ${INBOX_MARK_MESSAGE_READ}`, () => { - it("Will update message and update unreadMessageCount", () => { - const state = reducer( - { - ...initialState, - unreadMessageCount: 1, - messages: [mockMessage], - }, - markMessageRead(mockMessage.messageId) - ); - - const readMessage: IElementalInboxMessagePreview = { - ...mockMessage, - read: mockDate, - }; - - expect(state).toEqual({ - ...initialState, - unreadMessageCount: 0, - messages: [readMessage], - }); - }); - }); - - describe(`action ${INBOX_MARK_MESSAGE_UNREAD}`, () => { - const mappedReadMessage = { - ...mockMessage, - read: mockDate, - }; - - it("Will update message and update unreadMessageCount", () => { - const state = reducer( - { - ...initialState, - unreadMessageCount: 0, - messages: [mappedReadMessage], - }, - markMessageUnread(mockMessage.messageId) - ); - - const unreadMessage = { - ...mappedReadMessage, - read: undefined, - }; - - expect(state).toEqual({ - ...initialState, - unreadMessageCount: 1, - messages: [unreadMessage], - }); - }); - }); - - describe(`action ${INBOX_MARK_ALL_READ}`, () => { - it("will mark all read", () => { - const state = reducer( - { - ...initialState, - unreadMessageCount: 2, - messages: [mockMessage, mockMessage2], - }, - markAllRead() - ); - - expect(state).toEqual({ - ...initialState, - unreadMessageCount: 0, - messages: [ - { - ...mockMessage, - read: mockDate, - }, - { - ...mockMessage2, - read: mockDate, - }, - ], - }); - }); - }); -}); diff --git a/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-messages.ts b/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-messages.ts deleted file mode 100644 index 8c4588ef..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-messages.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { IElementalInboxMessagePreview } from "../types"; - -export const INBOX_FETCH_MESSAGES = "inbox/FETCH_MESSAGES"; - -export const INBOX_FETCH_MESSAGES_PENDING = "inbox/FETCH_MESSAGES/PENDING"; - -export type FetchMessagesPending = { - type: "inbox/FETCH_MESSAGES/PENDING"; -}; - -export const fetchMessagesPending = (): FetchMessagesPending => ({ - type: INBOX_FETCH_MESSAGES_PENDING, -}); - -export const INBOX_FETCH_MESSAGES_ERROR = "inbox/FETCH_MESSAGES/ERROR"; - -export type FetchMessagesError = { - type: "inbox/FETCH_MESSAGES/ERROR"; -}; - -export const fetchMessagesError = (): FetchMessagesError => ({ - type: INBOX_FETCH_MESSAGES_ERROR, -}); - -export const INBOX_FETCH_MESSAGES_DONE = "inbox/FETCH_MESSAGES/DONE"; - -interface FetchMessagesDonePayload { - messages: IElementalInboxMessagePreview[]; - appendMessages?: boolean; - startCursor?: string; -} - -export type FetchMessagesDone = { - type: "inbox/FETCH_MESSAGES/DONE"; - payload: FetchMessagesDonePayload; -}; - -export const fetchMessagesDone = ( - payload: FetchMessagesDonePayload -): FetchMessagesDone => ({ - type: INBOX_FETCH_MESSAGES_DONE, - payload, -}); diff --git a/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-unread-message-count.ts b/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-unread-message-count.ts deleted file mode 100644 index e1540e3f..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/actions/fetch-unread-message-count.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const INBOX_FETCH_UNREAD_MESSAGE_COUNT = - "inbox/FETCH_UNREAD_MESSAGE_COUNT"; - -export const INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE = - "inbox/FETCH_UNREAD_MESSAGE_COUNT/DONE"; - -export type FetchUnreadMessageCountDone = { - type: "inbox/FETCH_UNREAD_MESSAGE_COUNT/DONE"; - payload: { - count: number; - }; -}; - -export const fetchUnreadMessageCountDone = ( - payload: FetchUnreadMessageCountDone["payload"] -): FetchUnreadMessageCountDone => ({ - type: INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE, - payload: payload, -}); diff --git a/packages/react-hooks/src/inbox/elemental-inbox/actions/mark-all-read.ts b/packages/react-hooks/src/inbox/elemental-inbox/actions/mark-all-read.ts deleted file mode 100644 index 74f57ced..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/actions/mark-all-read.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type MarkAllRead = { - type: "inbox/MARK_ALL_READ"; -}; - -export const INBOX_MARK_ALL_READ = "inbox/MARK_ALL_READ"; - -export const markAllRead = (): MarkAllRead => ({ - type: INBOX_MARK_ALL_READ, -}); diff --git a/packages/react-hooks/src/inbox/elemental-inbox/actions/new-message.ts b/packages/react-hooks/src/inbox/elemental-inbox/actions/new-message.ts deleted file mode 100644 index 3323d814..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/actions/new-message.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IElementalInboxMessagePreview } from "../types"; - -export type NewMessage = { - type: "inbox/NEW_MESSAGE"; - payload: IElementalInboxMessagePreview; -}; - -export const INBOX_NEW_MESSAGE = "inbox/NEW_MESSAGE"; - -export const newMessage = ( - message: IElementalInboxMessagePreview -): NewMessage => ({ - type: INBOX_NEW_MESSAGE, - payload: message, -}); diff --git a/packages/react-hooks/src/inbox/elemental-inbox/index.ts b/packages/react-hooks/src/inbox/elemental-inbox/index.ts deleted file mode 100644 index e89f4644..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./use-inbox"; diff --git a/packages/react-hooks/src/inbox/elemental-inbox/middleware.ts b/packages/react-hooks/src/inbox/elemental-inbox/middleware.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/react-hooks/src/inbox/elemental-inbox/reducer.ts b/packages/react-hooks/src/inbox/elemental-inbox/reducer.ts deleted file mode 100644 index bc40af9f..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/reducer.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { IElementalInbox, IElementalInboxMessagePreview } from "./types"; -import { InboxInit, INBOX_INIT } from "../actions/init"; -import { InboxSetView, INBOX_SET_VIEW } from "../actions/set-view"; -import { ToggleInbox, INBOX_TOGGLE } from "../actions/toggle-inbox"; -import { MarkAllRead, INBOX_MARK_ALL_READ } from "./actions/mark-all-read"; -import { NewMessage, INBOX_NEW_MESSAGE } from "./actions/new-message"; -import { - MarkMessageArchived, - INBOX_MARK_MESSAGE_ARCHIVED, -} from "../actions/mark-message-archived"; -import { - MarkMessageRead, - INBOX_MARK_MESSAGE_READ, -} from "../actions/mark-message-read"; -import { - MarkMessageUnread, - INBOX_MARK_MESSAGE_UNREAD, -} from "../actions/mark-message-unread"; -import { - FetchUnreadMessageCountDone, - INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE, -} from "./actions/fetch-unread-message-count"; -import { - FetchMessagesDone, - FetchMessagesError, - FetchMessagesPending, - INBOX_FETCH_MESSAGES_DONE, - INBOX_FETCH_MESSAGES_ERROR, - INBOX_FETCH_MESSAGES_PENDING, -} from "./actions/fetch-messages"; - -export const initialState: IElementalInbox = { - isOpen: false, - messages: [], - view: "messages", - unreadMessageCount: 0, -}; - -type ElementalInboxAction = - | FetchMessagesDone - | FetchMessagesError - | FetchMessagesPending - | FetchUnreadMessageCountDone - | InboxInit - | InboxSetView - | MarkAllRead - | MarkMessageArchived - | MarkMessageRead - | MarkMessageUnread - | NewMessage - | ToggleInbox; - -export default ( - state: IElementalInbox = initialState, - action?: ElementalInboxAction -): IElementalInbox => { - switch (action?.type) { - case INBOX_INIT: { - return { - ...state, - ...action.payload, - }; - } - - case INBOX_SET_VIEW: { - return { - ...state, - view: action.payload, - }; - } - - case INBOX_TOGGLE: { - return { - ...state, - isOpen: - typeof action.payload === "boolean" ? action.payload : !state.isOpen, - }; - } - - case INBOX_FETCH_UNREAD_MESSAGE_COUNT_DONE: { - return { - ...state, - unreadMessageCount: action.payload?.count ?? 0, - }; - } - - case INBOX_FETCH_MESSAGES_PENDING: { - return { - ...state, - isLoading: true, - }; - } - - case INBOX_FETCH_MESSAGES_ERROR: { - return { - ...state, - isLoading: false, - }; - } - - case INBOX_FETCH_MESSAGES_DONE: { - const messages = action.payload?.messages ?? []; - - const newMessages = action.payload?.appendMessages - ? [...(state.messages ?? []), ...messages] - : messages; - - return { - ...state, - isLoading: false, - lastMessagesFetched: new Date().getTime(), - messages: newMessages, - startCursor: action.payload?.startCursor, - }; - } - - case INBOX_MARK_MESSAGE_READ: { - const unreadMessageCount = Math.max( - (state.unreadMessageCount ?? 0) - 1, - 0 - ); - - // not on unread tab - const newMessages = state.messages?.map( - (message): IElementalInboxMessagePreview => { - if (message.messageId === action.payload.messageId) { - return { - ...message, - read: new Date().toISOString(), - }; - } - - return message; - } - ); - - return { - ...state, - messages: newMessages, - unreadMessageCount, - }; - } - - case INBOX_MARK_MESSAGE_UNREAD: { - const unreadMessageCount = (state.unreadMessageCount ?? 0) + 1; - - const newMessages = state.messages?.map((message) => { - if (message.messageId !== action.payload.messageId) { - return message; - } - - const newMessage = { - ...message, - read: undefined, - }; - - return newMessage; - }); - - return { - ...state, - messages: newMessages, - unreadMessageCount, - }; - } - - case INBOX_MARK_MESSAGE_ARCHIVED: { - let unreadMessageCount = state.unreadMessageCount ?? 0; - - const newMessages = state.messages?.filter((message) => { - const isMatching = message.messageId === action.payload.messageId; - if (isMatching && !message.read) { - unreadMessageCount = Math.max(unreadMessageCount - 1, 0); - } - - return !isMatching; - }); - - return { - ...state, - messages: newMessages, - unreadMessageCount, - }; - } - - case INBOX_NEW_MESSAGE: { - const newMessage = { - ...action.payload, - created: new Date().toISOString(), - }; - - const newMessages = [newMessage, ...(state.messages ?? [])]; - - return { - ...state, - unreadMessageCount: (state.unreadMessageCount ?? 0) + 1, - messages: newMessages, - }; - } - - case INBOX_MARK_ALL_READ: { - const unreadMessageCount = 0; - - const newMessages = state.messages?.map((message) => { - return { - ...message, - read: new Date().toISOString(), - }; - }); - - return { - ...state, - messages: newMessages, - unreadMessageCount, - }; - } - } - - return state; -}; diff --git a/packages/react-hooks/src/inbox/elemental-inbox/types.ts b/packages/react-hooks/src/inbox/elemental-inbox/types.ts deleted file mode 100644 index f7db7543..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/types.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - IInboxMessage, - IInboxMessagePreview, -} from "@trycourier/client-graphql"; -import { Brand } from "@trycourier/react-provider"; - -export interface IElementalInbox { - tenantId?: string; - brand?: Brand; - from?: number; - isLoading?: boolean; - isOpen?: boolean; - lastMessagesFetched?: number; - messages?: Array; - startCursor?: string; - unreadMessageCount?: number; - view?: string | "preferences"; -} - -export type IElementalInboxMessage = IInboxMessage; -export type IElementalInboxMessagePreview = IInboxMessagePreview; diff --git a/packages/react-hooks/src/inbox/elemental-inbox/use-inbox-actions.ts b/packages/react-hooks/src/inbox/elemental-inbox/use-inbox-actions.ts deleted file mode 100644 index 8d609763..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/use-inbox-actions.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { - CourierTransport, - IInboxMessagePreview, - useCourier, -} from "@trycourier/react-provider"; -import { IElementalInbox } from "./types"; -import { createCourierClient, Inbox } from "@trycourier/client-graphql"; -import { IGetInboxMessagesParams } from "@trycourier/client-graphql"; -import { initInbox } from "../actions/init"; -import { toggleInbox } from "../actions/toggle-inbox"; -import { setView } from "../actions/set-view"; -import { markMessageRead } from "../actions/mark-message-read"; -import { markAllRead } from "./actions/mark-all-read"; -import { markMessageUnread } from "../actions/mark-message-unread"; -import { markMessageArchived } from "../actions/mark-message-archived"; -import { IInbox } from "../types"; -import { newMessage } from "./actions/new-message"; -import { resetLastFetched } from "../actions/reset-last-fetched"; - -export interface IFetchMessagesParams { - params?: IGetInboxMessagesParams; - after?: string; -} - -interface IInboxActions { - /** Fetches messages from the server, sets inbox.messages to the received value */ - fetchMessages: (params?: IFetchMessagesParams) => void; - /** Returns a count of messages that do not have a message.read date */ - getUnreadMessageCount: (params?: IGetInboxMessagesParams) => void; - init: (inbox: IInbox) => void; - /** Marks all messages as read by setting message.read to the current ISO 8601 date */ - markAllAsRead: (fromWSEvent?: boolean) => void; - /** Archives the supplied message, archived messages are not returned by fetchMessages */ - markMessageArchived: ( - messageId: string, - fromWSEvent?: boolean - ) => Promise; - /** Sets message.read to the current ISO 8601 date */ - markMessageRead: (messageId: string, fromWSEvent?: boolean) => Promise; - /** Removes message.read, signalling that the message is no longer read */ - markMessageUnread: ( - messageId: string, - fromWSEvent?: boolean - ) => Promise; - newMessage: (transportMessage: IInboxMessagePreview) => void; - resetLastFetched: () => void; - setView: (view: string | "preferences") => void; - toggleInbox: (isOpen?: boolean) => void; - /** - * Allows for renewal of sessions authorized with short lived tokens. - * For example, if the supplied authorization token lasts 10 minutes, - * this function can be called with a new token every 5 minutes to ensure - * messages are received in real time with no interruptions. - */ - renewSession: (authorization: string) => void; -} - -const useElementalInboxActions = (): IInboxActions => { - const { - tenantId, - apiUrl, - authorization, - clientSourceId, - clientKey, - dispatch, - inbox, - transport, - userId, - userSignature, - } = - useCourier<{ - inbox: IElementalInbox; - }>(); - - const courierClient = createCourierClient({ - authorization, - apiUrl: apiUrl ?? "https://inbox.courier.com/q", - clientKey, - clientSourceId, - userId, - userSignature, - tenantId, - }); - - const inboxClient = Inbox({ client: courierClient }); - - return { - init: (payload) => { - dispatch(initInbox(payload)); - - if (payload.isOpen) { - dispatch({ - type: "inbox/FETCH_MESSAGES", - payload: () => inboxClient.getMessages(), - }); - } - }, - resetLastFetched: () => { - dispatch(resetLastFetched()); - dispatch({ - type: "inbox/FETCH_UNREAD_MESSAGE_COUNT", - payload: () => - inboxClient.getInboxCount({ - tenantId: inbox?.tenantId, - status: "unread", - }), - }); - }, - toggleInbox: (isOpen) => { - dispatch(toggleInbox(isOpen)); - }, - setView: (view: string | "preferences") => { - dispatch(setView(view)); - }, - fetchMessages: (payload) => { - const params = { - from: inbox?.from, - ...payload?.params, - }; - dispatch({ - type: "inbox/FETCH_MESSAGES", - payload: () => inboxClient.getMessages(params, payload?.after), - meta: payload, - }); - }, - getUnreadMessageCount: () => { - dispatch({ - type: "inbox/FETCH_UNREAD_MESSAGE_COUNT", - payload: () => - inboxClient.getInboxCount({ - tenantId: inbox?.tenantId, - status: "unread", - }), - }); - }, - markMessageRead: async (messageId, fromWSEvent) => { - dispatch(markMessageRead(messageId)); - if (fromWSEvent) { - return; - } - await inboxClient.markRead(messageId); - }, - markAllAsRead: async (fromWSEvent) => { - dispatch(markAllRead()); - if (fromWSEvent) { - return; - } - await inboxClient.markAllRead(); - }, - markMessageUnread: async (messageId, fromWSEvent) => { - dispatch(markMessageUnread(messageId)); - if (fromWSEvent) { - return; - } - await inboxClient.markUnread(messageId); - }, - markMessageArchived: async (messageId, fromWSEvent) => { - dispatch(markMessageArchived(messageId)); - if (fromWSEvent) { - return; - } - await inboxClient.markArchive(messageId); - }, - renewSession: async (token) => { - if (transport instanceof CourierTransport) { - transport.renewSession(token); - } - dispatch({ - type: "root/UPDATE_AUTH_TOKEN", - payload: token, - }); - }, - newMessage: (message) => { - if (!message.messageId) { - return; - } - - dispatch(newMessage(message)); - }, - }; -}; - -export default useElementalInboxActions; diff --git a/packages/react-hooks/src/inbox/elemental-inbox/use-inbox.ts b/packages/react-hooks/src/inbox/elemental-inbox/use-inbox.ts deleted file mode 100644 index 72448ad0..00000000 --- a/packages/react-hooks/src/inbox/elemental-inbox/use-inbox.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - useCourier, - registerReducer, - IInboxMessagePreview, - ICourierEventMessage, -} from "@trycourier/react-provider"; -import { useEffect } from "react"; -import reducer from "./reducer"; -import deepExtend from "deep-extend"; -import useElementalInboxActions from "./use-inbox-actions"; -import { IElementalInbox } from "./types"; - -export const useElementalInbox = () => { - const { dispatch, inbox, transport, brand } = - useCourier<{ - inbox: IElementalInbox; - }>(); - - const actions = useElementalInboxActions(); - - if (inbox) { - inbox.brand = deepExtend({}, brand ?? {}, inbox.brand ?? {}); - } - - useEffect(() => { - registerReducer("inbox", reducer); - }, []); - - useEffect(() => { - transport?.listen({ - id: "message-listener", - type: "message", - listener: (courierEvent) => { - if (!dispatch || !courierEvent?.data) { - return; - } - - actions.newMessage(courierEvent?.data as IInboxMessagePreview); - }, - }); - - transport?.listen({ - id: "event-listener", - type: "event", - listener: (courierEvent) => { - const data = courierEvent?.data as ICourierEventMessage; - if (!dispatch || !data || !data?.event) { - return; - } - - if (data.event === "mark-all-read") { - actions.markAllAsRead(true); - } - - if (!data?.messageId) { - return; - } - - switch (data.event) { - case "read": { - actions.markMessageRead(data.messageId, true); - return; - } - - case "unread": { - actions.markMessageUnread(data.messageId, true); - return; - } - - case "archive": { - actions.markMessageArchived(data.messageId, true); - return; - } - - case "mark-all-read": { - actions.markAllAsRead(true); - return; - } - } - }, - }); - }, [transport]); - - return { ...inbox, ...actions }; -}; diff --git a/packages/react-hooks/src/inbox/index.ts b/packages/react-hooks/src/inbox/index.ts index 32e2aa26..334de0a2 100644 --- a/packages/react-hooks/src/inbox/index.ts +++ b/packages/react-hooks/src/inbox/index.ts @@ -1,6 +1,5 @@ import { IInboxMessagePreview } from "@trycourier/react-provider"; import { IInbox } from "./types"; -export * from "./elemental-inbox"; export { default as useInbox } from "./use-inbox"; export { IInbox, IInboxMessagePreview }; diff --git a/packages/react-hooks/src/inbox/reducer.ts b/packages/react-hooks/src/inbox/reducer.ts index f4757814..f60ac93a 100644 --- a/packages/react-hooks/src/inbox/reducer.ts +++ b/packages/react-hooks/src/inbox/reducer.ts @@ -70,7 +70,10 @@ type InboxAction = | ToggleInbox | UnpinMessage; -const sortPinned = (pinned: IInbox["pinned"], brand: IInbox["brand"]) => { +const sortPinned = ( + pinned: IInbox["pinned"], + brand: IInbox["brand"] +): IInboxMessagePreview[] => { const configuredSlots = brand?.inapp?.slots?.map((s) => s.id); const pinnedBySlot = pinned?.reduce( @@ -169,7 +172,7 @@ export default (state: IInbox = initialState, action?: InboxAction): IInbox => { ...state, isLoading: false, lastMessagesFetched: new Date().getTime(), - messages: newMessages, + messages: newMessages as IInboxMessagePreview[], pinned: action.payload?.appendMessages ? state.pinned : sortPinned(action.payload?.pinned, state.brand), diff --git a/packages/react-hooks/src/inbox/use-inbox-actions.ts b/packages/react-hooks/src/inbox/use-inbox-actions.ts index 94aec76e..6ee68b10 100644 --- a/packages/react-hooks/src/inbox/use-inbox-actions.ts +++ b/packages/react-hooks/src/inbox/use-inbox-actions.ts @@ -9,7 +9,6 @@ import { IInbox } from "./types"; import { IGetInboxMessagesParams, Inbox } from "@trycourier/client-graphql"; -import { IGetMessagesParams } from "@trycourier/client-graphql"; import { initInbox } from "./actions/init"; import { markAllRead } from "./actions/mark-all-read"; import { markMessageArchived } from "./actions/mark-message-archived"; @@ -29,12 +28,12 @@ import createMiddleware from "./middleware"; import reducer from "./reducer"; export interface IFetchMessagesParams { - params?: IGetMessagesParams; + params?: IGetInboxMessagesParams; after?: string; } export interface IInboxActions { fetchMessages: (params?: IFetchMessagesParams) => void; - getUnreadMessageCount: (params?: IGetMessagesParams) => void; + getUnreadMessageCount: (params?: IGetInboxMessagesParams) => void; init: (inbox?: IInbox) => void; markAllAsRead: (fromWS?: boolean) => void; markMessageArchived: (messageId: string, fromWS?: boolean) => Promise; @@ -148,11 +147,7 @@ const useInboxActions = (): IInboxActions => { fetchMessages: (payload?: IFetchMessagesParams) => { const searchParams: IGetInboxMessagesParams = { ...payload?.params, - status: payload?.params?.isRead - ? "read" - : payload?.params?.isRead === false - ? "unread" - : payload?.params?.status, + status: payload?.params?.status, from: inbox?.from, }; @@ -184,7 +179,7 @@ const useInboxActions = (): IInboxActions => { } }, trackClick: async (messageId, trackingId) => { - await inboxClient.trackClick(messageId, trackingId); + await inboxClient.trackClick(messageId, { trackingId }); if (onEvent) { onEvent({ diff --git a/packages/react-hooks/tsconfig.json b/packages/react-hooks/tsconfig.json index c3df2cf0..47cb02e8 100644 --- a/packages/react-hooks/tsconfig.json +++ b/packages/react-hooks/tsconfig.json @@ -13,5 +13,12 @@ "./src/**/*.tsx", "./src/**/*.ts" ], - "references": [{ "path": "../react-provider" }] + "references": [ + { + "path": "../react-provider" + }, + { + "path": "../client-graphql" + } + ] } diff --git a/packages/react-preferences/src/components/UnsubscribePage.tsx b/packages/react-preferences/src/components/UnsubscribePage.tsx index a145b624..fd2d5118 100644 --- a/packages/react-preferences/src/components/UnsubscribePage.tsx +++ b/packages/react-preferences/src/components/UnsubscribePage.tsx @@ -164,7 +164,7 @@ export const UnsubscribePage: React.FunctionComponent<{ const handleStatusChange = async () => { const newStatus = !toggle ? "OPTED_IN" : "OPTED_OUT"; - await preferences.updateRecipientPreferences({ + preferences.updateRecipientPreferences({ templateId: topicId, status: newStatus, }); diff --git a/tsconfig.json b/tsconfig.json index 692e1946..7c0e0100 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,6 @@ "files": [], "references": [ { "path": "packages/components" }, - { "path": "packages/client-api" }, { "path": "packages/client-graphql" }, { "path": "packages/react-hooks" }, { "path": "packages/react-inbox" }, diff --git a/yarn.lock b/yarn.lock index 56b91734..bc145de8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16952,16 +16952,6 @@ query-string@^6.8.2: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" - integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -16972,7 +16962,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystring@^0.2.0, querystring@^0.2.1: +querystring@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==