Skip to content

Commit 789df2f

Browse files
committed
feat(better middleware): better way to control where your middleware will fire
1 parent 035f0e8 commit 789df2f

File tree

8 files changed

+47
-121
lines changed

8 files changed

+47
-121
lines changed

packages/components/src/index.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ declare global {
4848
setConfig?: (config: InboxProps) => void;
4949
config?: any;
5050
};
51-
preferences?: UsePreferences | {};
51+
preferences?: UsePreferences;
5252
transport?: any;
5353
brand?: Brand;
5454
renewSession?: (token: string) => void;
@@ -127,7 +127,10 @@ const initCourier = (courierConfig?: ICourierConfig) => {
127127
brandId={brandId}
128128
clientKey={clientKey}
129129
inboxApiUrl={inboxApiUrl}
130-
middleware={[middleware]}
130+
applyMiddleware={(defaultMiddleware) => [
131+
...defaultMiddleware,
132+
middleware,
133+
]}
131134
onMessage={onMessage}
132135
onRouteChange={onRouteChange}
133136
tenantId={tenantId}

packages/react-provider/src/index.tsx

+11-5
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import {
3434
} from "./transports/types";
3535
import reducer, { registerReducer as _registerReducer } from "./reducer";
3636
import defaultMiddleware, {
37-
registerMiddleware as _registerMiddleware,
3837
Middleware,
38+
registerMiddleware as _registerMiddleware,
3939
} from "./middleware";
4040
import useCourierActions from "./hooks/use-courier-actions";
4141
import { usePageVisible } from "./hooks/use-page-visible";
@@ -103,7 +103,7 @@ export const CourierProvider: React.FunctionComponent<
103103
localStorage = typeof window !== "undefined"
104104
? window?.localStorage
105105
: undefined,
106-
middleware: _middleware = [],
106+
applyMiddleware,
107107
onMessage,
108108
onRouteChange,
109109
transport: _transport,
@@ -130,10 +130,17 @@ export const CourierProvider: React.FunctionComponent<
130130
userId,
131131
});
132132

133-
const middleware = [...defaultMiddleware, ..._middleware];
133+
const middleware = useMemo(() => {
134+
if (!applyMiddleware) {
135+
return defaultMiddleware;
136+
}
137+
138+
return applyMiddleware(defaultMiddleware);
139+
}, [applyMiddleware]);
140+
134141
const useReducer = useCallback(
135142
createReducer<any, Partial<ICourierContext>>(...middleware),
136-
[_middleware]
143+
[middleware]
137144
);
138145

139146
const transport =
@@ -170,7 +177,6 @@ export const CourierProvider: React.FunctionComponent<
170177
clientSourceId,
171178
inboxApiUrl,
172179
localStorage,
173-
middleware,
174180
onRouteChange,
175181
tenantId,
176182
transport,

packages/react-provider/src/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,19 @@ export interface ProviderTheme {
8686
variables?: ThemeVariables;
8787
}
8888
export interface ICourierProviderProps {
89-
tenantId?: string;
9089
apiUrl?: string;
90+
applyMiddleware?: (defaultMiddleware: any) => any[];
9191
authorization?: string;
9292
brand?: Brand;
93-
theme?: ProviderTheme;
9493
brandId?: string;
9594
clientKey?: string;
9695
id?: string;
9796
inboxApiUrl?: string;
9897
localStorage?: Storage;
99-
middleware?: any;
10098
onMessage?: Interceptor;
10199
onRouteChange?: (route: string) => void;
100+
tenantId?: string;
101+
theme?: ProviderTheme;
102102
transport?: CourierTransport | Transport;
103103
userId?: string;
104104
userSignature?: string;

packages/storybook/stories/inbox/2.0.stories.tsx

+15-9
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import { CourierProvider } from "@trycourier/react-provider";
55
import { Inbox } from "@trycourier/react-inbox";
66

77
import mockMiddleware from "./mock-middleware";
8-
import { Authentication } from "../getting-started/index.stories";
9-
108
const API_URL = process.env.API_URL || "";
119
const INBOX_API_URL = process.env.INBOX_API_URL || "";
1210
const CLIENT_KEY = process.env.CLIENT_KEY || "";
@@ -142,7 +140,9 @@ export const Version2 = () => {
142140
}} />\n\`\`\``}</ReactMarkdown>
143141
</div>
144142
<CourierProvider
145-
middleware={[mockMiddleware]}
143+
applyMiddleware={(defaultMiddleware) => {
144+
return [mockMiddleware, ...defaultMiddleware];
145+
}}
146146
wsOptions={{
147147
url: process.env.WS_URL,
148148
}}
@@ -175,7 +175,8 @@ export const Loading = () => {
175175
}} />\n\`\`\``}</ReactMarkdown>
176176
</div>
177177
<CourierProvider
178-
middleware={[
178+
applyMiddleware={(defaultMiddleware) => [
179+
...defaultMiddleware,
179180
() => (next) => (action) => {
180181
if (action.type === "inbox/INIT") {
181182
next({
@@ -228,7 +229,8 @@ export const LoadingMore = () => {
228229
}} />\n\`\`\``}</ReactMarkdown>
229230
</div>
230231
<CourierProvider
231-
middleware={[
232+
applyMiddleware={(defaultMiddleware) => [
233+
...defaultMiddleware,
232234
() => (next) => (action) => {
233235
if (action.type === "inbox/INIT") {
234236
next({
@@ -282,7 +284,8 @@ export const PaginationEnd = () => {
282284
}} />\n\`\`\``}</ReactMarkdown>
283285
</div>
284286
<CourierProvider
285-
middleware={[
287+
applyMiddleware={(defaultMiddleware) => [
288+
...defaultMiddleware,
286289
() => (next) => (action) => {
287290
if (action.type === "inbox/INIT") {
288291
next({
@@ -336,7 +339,8 @@ export const NoCourierFooter = () => {
336339
}} />\n\`\`\``}</ReactMarkdown>
337340
</div>
338341
<CourierProvider
339-
middleware={[
342+
applyMiddleware={(defaultMiddleware) => [
343+
...defaultMiddleware,
340344
() => (next) => (action) => {
341345
if (action.type === "inbox/INIT") {
342346
next({
@@ -393,7 +397,8 @@ export const NoMessages = () => {
393397
}} />\n\`\`\``}</ReactMarkdown>
394398
</div>
395399
<CourierProvider
396-
middleware={[
400+
applyMiddleware={(defaultMiddleware) => [
401+
...defaultMiddleware,
397402
() => (next) => (action) => {
398403
if (action.type === "inbox/INIT") {
399404
next({
@@ -447,7 +452,8 @@ export const WithPreferences = () => {
447452
}} />\n\`\`\``}</ReactMarkdown>
448453
</div>
449454
<CourierProvider
450-
middleware={[
455+
applyMiddleware={(defaultMiddleware) => [
456+
...defaultMiddleware,
451457
() => (next) => (action) => {
452458
if (action.type === "inbox/FETCH_UNREAD_MESSAGE_COUNT/DONE") {
453459
next({

packages/storybook/stories/inbox/hooks.tsx

-66
This file was deleted.

packages/storybook/stories/inbox/index.stories.tsx

+8-34
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import {
2222
import customHeaderProps from "./custom-header";
2323

2424
// @ts-ignore
25-
import myCustomInboxString from "!raw-loader!./hooks.tsx";
26-
import { MyCustomInbox } from "./hooks";
2725
import mockMiddleware from "./mock-middleware";
2826

2927
const API_URL = process.env.API_URL || "";
@@ -95,7 +93,10 @@ export const ThemeExample = () => {
9593
)}\n\`\`\``}</ReactMarkdown>
9694
</div>
9795
<CourierProvider
98-
middleware={[mockMiddleware]}
96+
applyMiddleware={(defaultMiddleware) => [
97+
mockMiddleware,
98+
...defaultMiddleware,
99+
]}
99100
clientKey="Y2U3OWI3NGEtY2FhZC00NTFjLTliZDMtMGZkOTVhMmQ0ZWE4"
100101
userId="Google_108669107033656954156"
101102
>
@@ -178,36 +179,6 @@ export const RenderPropsExample2 = () => {
178179
);
179180
};
180181

181-
export const Hooks = () => {
182-
return (
183-
<>
184-
<div
185-
style={{
186-
display: "flex",
187-
alignItems: "top",
188-
justifyContent: "space-between",
189-
}}
190-
>
191-
<div>
192-
<ReactMarkdown>{`## Example`}</ReactMarkdown>
193-
<ReactMarkdown>{`\`\`\`javascript\n${myCustomInboxString}\n\`\`\``}</ReactMarkdown>
194-
</div>
195-
<CourierProvider
196-
middleware={[mockMiddleware]}
197-
wsOptions={{
198-
url: process.env.WS_URL,
199-
}}
200-
apiUrl={API_URL}
201-
clientKey={CLIENT_KEY}
202-
userId={USER_ID}
203-
>
204-
<MyCustomInbox />
205-
</CourierProvider>
206-
</div>
207-
</>
208-
);
209-
};
210-
211182
export const CustomLabels = () => {
212183
return (
213184
<>
@@ -228,7 +199,10 @@ export const CustomLabels = () => {
228199
}} />\n\`\`\``}</ReactMarkdown>
229200
</div>
230201
<CourierProvider
231-
middleware={[mockMiddleware]}
202+
applyMiddleware={(defaultMiddleware) => [
203+
mockMiddleware,
204+
...defaultMiddleware,
205+
]}
232206
wsOptions={{
233207
url: process.env.WS_URL,
234208
}}

packages/storybook/stories/inbox/mobile.stories.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import mockMiddleware from "./mock-middleware";
77
const API_URL = process.env.API_URL || "";
88
const CLIENT_KEY = process.env.CLIENT_KEY || "";
99
const USER_ID = process.env.USER_ID || "";
10-
const WS_URL = process.env.WS_URL || "";
1110

1211
export default {
1312
title: "Inbox/Mobile",
@@ -25,7 +24,10 @@ export default {
2524
export const Mobile = () => {
2625
return (
2726
<CourierProvider
28-
middleware={[mockMiddleware]}
27+
applyMiddleware={(defaultMiddleware) => [
28+
mockMiddleware,
29+
...defaultMiddleware,
30+
]}
2931
wsOptions={{
3032
url: process.env.WS_URL,
3133
}}

packages/storybook/stories/inbox/with-toast.stories.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ if (typeof window !== "undefined") {
2323
url: process.env.WS_URL,
2424
},
2525
clientKey,
26+
clientSourceId: "abc123",
2627
});
2728
}
2829

0 commit comments

Comments
 (0)