payload-subscribers-plugin 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +305 -0
- package/dist/collections/OptInChannels.d.ts +3 -0
- package/dist/collections/OptInChannels.js +44 -0
- package/dist/collections/OptInChannels.js.map +1 -0
- package/dist/collections/Subscribers.d.ts +8 -0
- package/dist/collections/Subscribers.js +88 -0
- package/dist/collections/Subscribers.js.map +1 -0
- package/dist/collections/fields/OptedInChannels.d.ts +2 -0
- package/dist/collections/fields/OptedInChannels.js +12 -0
- package/dist/collections/fields/OptedInChannels.js.map +1 -0
- package/dist/components/BeforeDashboardClient.d.ts +1 -0
- package/dist/components/BeforeDashboardClient.js +40 -0
- package/dist/components/BeforeDashboardClient.js.map +1 -0
- package/dist/components/BeforeDashboardServer.d.ts +2 -0
- package/dist/components/BeforeDashboardServer.js +22 -0
- package/dist/components/BeforeDashboardServer.js.map +1 -0
- package/dist/components/BeforeDashboardServer.module.css +5 -0
- package/dist/components/app/RequestMagicLink.d.ts +16 -0
- package/dist/components/app/RequestMagicLink.js +114 -0
- package/dist/components/app/RequestMagicLink.js.map +1 -0
- package/dist/components/app/RequestMagicLink.module.css +5 -0
- package/dist/components/app/RequestOrSubscribe.d.ts +17 -0
- package/dist/components/app/RequestOrSubscribe.js +28 -0
- package/dist/components/app/RequestOrSubscribe.js.map +1 -0
- package/dist/components/app/SelectOptInChannels.d.ts +20 -0
- package/dist/components/app/SelectOptInChannels.js +120 -0
- package/dist/components/app/SelectOptInChannels.js.map +1 -0
- package/dist/components/app/SelectOptInChannels.module.css +5 -0
- package/dist/components/app/Subscribe.d.ts +18 -0
- package/dist/components/app/Subscribe.js +169 -0
- package/dist/components/app/Subscribe.js.map +1 -0
- package/dist/components/app/Subscribe.module.css +5 -0
- package/dist/components/app/SubscriberMenu.d.ts +7 -0
- package/dist/components/app/SubscriberMenu.js +44 -0
- package/dist/components/app/SubscriberMenu.js.map +1 -0
- package/dist/components/app/VerifyMagicLink.d.ts +23 -0
- package/dist/components/app/VerifyMagicLink.js +169 -0
- package/dist/components/app/VerifyMagicLink.js.map +1 -0
- package/dist/components/app/VerifyMagicLink.module.css +5 -0
- package/dist/components/app/helpers.d.ts +1 -0
- package/dist/components/app/helpers.js +5 -0
- package/dist/components/app/helpers.js.map +1 -0
- package/dist/components/app/shared.module.css +14 -0
- package/dist/contexts/SubscriberProvider.d.ts +15 -0
- package/dist/contexts/SubscriberProvider.js +105 -0
- package/dist/contexts/SubscriberProvider.js.map +1 -0
- package/dist/copied/payload-types.d.ts +395 -0
- package/dist/copied/payload-types.js +15 -0
- package/dist/copied/payload-types.js.map +1 -0
- package/dist/copied/payload.config.d.ts +2 -0
- package/dist/endpoints/customEndpointHandler.d.ts +2 -0
- package/dist/endpoints/customEndpointHandler.js +7 -0
- package/dist/endpoints/customEndpointHandler.js.map +1 -0
- package/dist/endpoints/getOptInChannels.d.ts +19 -0
- package/dist/endpoints/getOptInChannels.js +42 -0
- package/dist/endpoints/getOptInChannels.js.map +1 -0
- package/dist/endpoints/logout.d.ts +20 -0
- package/dist/endpoints/logout.js +60 -0
- package/dist/endpoints/logout.js.map +1 -0
- package/dist/endpoints/requestMagicLink.d.ts +20 -0
- package/dist/endpoints/requestMagicLink.js +122 -0
- package/dist/endpoints/requestMagicLink.js.map +1 -0
- package/dist/endpoints/subscribe.d.ts +24 -0
- package/dist/endpoints/subscribe.js +343 -0
- package/dist/endpoints/subscribe.js.map +1 -0
- package/dist/endpoints/subscriberAuth.d.ts +22 -0
- package/dist/endpoints/subscriberAuth.js +69 -0
- package/dist/endpoints/subscriberAuth.js.map +1 -0
- package/dist/endpoints/verifyMagicLink.d.ts +20 -0
- package/dist/endpoints/verifyMagicLink.js +142 -0
- package/dist/endpoints/verifyMagicLink.js.map +1 -0
- package/dist/exports/client.d.ts +1 -0
- package/dist/exports/client.js +3 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/index.d.ts +1 -0
- package/dist/exports/index.js +3 -0
- package/dist/exports/index.js.map +1 -0
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.js +3 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/ui.d.ts +11 -0
- package/dist/exports/ui.js +9 -0
- package/dist/exports/ui.js.map +1 -0
- package/dist/helpers/serverConfig.d.ts +4 -0
- package/dist/helpers/serverConfig.js +22 -0
- package/dist/helpers/serverConfig.js.map +1 -0
- package/dist/helpers/testData.d.ts +2 -0
- package/dist/helpers/testData.js +4 -0
- package/dist/helpers/testData.js.map +1 -0
- package/dist/helpers/token.d.ts +9 -0
- package/dist/helpers/token.js +20 -0
- package/dist/helpers/token.js.map +1 -0
- package/dist/helpers/verifyOptIns.d.ts +5 -0
- package/dist/helpers/verifyOptIns.js +33 -0
- package/dist/helpers/verifyOptIns.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +147 -0
- package/dist/index.js.map +1 -0
- package/dist/react-hooks/useServerUrl.d.ts +3 -0
- package/dist/react-hooks/useServerUrl.js +19 -0
- package/dist/react-hooks/useServerUrl.js.map +1 -0
- package/dist/server-functions/serverUrl.d.ts +3 -0
- package/dist/server-functions/serverUrl.js +31 -0
- package/dist/server-functions/serverUrl.js.map +1 -0
- package/dist/server-functions/subscriberAuth.d.ts +11 -0
- package/package.json +94 -0
- package/src/collections/OptInChannels.ts +45 -0
- package/src/collections/Subscribers.ts +99 -0
- package/src/collections/fields/OptedInChannels.ts +12 -0
- package/src/components/app/RequestMagicLink.tsx +129 -0
- package/src/components/app/RequestOrSubscribe.tsx +58 -0
- package/src/components/app/SelectOptInChannels.tsx +147 -0
- package/src/components/app/Subscribe.tsx +190 -0
- package/src/components/app/SubscriberMenu.tsx +46 -0
- package/src/components/app/VerifyMagicLink.tsx +197 -0
- package/src/components/app/helpers.ts +6 -0
- package/src/components/app/shared.module.css +14 -0
- package/src/contexts/SubscriberProvider.tsx +122 -0
- package/src/copied/payload-types.ts +478 -0
- package/src/endpoints/getOptInChannels.ts +56 -0
- package/src/endpoints/logout.ts +104 -0
- package/src/endpoints/requestMagicLink.ts +139 -0
- package/src/endpoints/subscribe.ts +435 -0
- package/src/endpoints/subscriberAuth.ts +100 -0
- package/src/endpoints/verifyMagicLink.ts +164 -0
- package/src/exports/index.ts +1 -0
- package/src/exports/ui.ts +17 -0
- package/src/helpers/testData.ts +2 -0
- package/src/helpers/token.ts +14 -0
- package/src/helpers/verifyOptIns.ts +39 -0
- package/src/index.ts +207 -0
- package/src/react-hooks/useServerUrl.tsx +18 -0
- package/src/server-functions/serverUrl.ts +38 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RequestMagicLinkResponse } from '../..//endpoints/requestMagicLink.js';
|
|
2
|
+
import type { VerifyMagicLinkResponse } from '../../endpoints/verifyMagicLink.js';
|
|
3
|
+
export { VerifyMagicLinkResponse };
|
|
4
|
+
export interface IVerifyMagicLink {
|
|
5
|
+
classNames?: VerifyMagicLinkClasses;
|
|
6
|
+
handleMagicLinkRequested?: (result: RequestMagicLinkResponse) => void;
|
|
7
|
+
handleMagicLinkVerified?: (result: VerifyMagicLinkResponse) => void;
|
|
8
|
+
renderButton?: (props: {
|
|
9
|
+
forwardUrl?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
onClick?: () => any;
|
|
12
|
+
text?: string;
|
|
13
|
+
}) => React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
export type VerifyMagicLinkClasses = {
|
|
16
|
+
button?: string;
|
|
17
|
+
container?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
form?: string;
|
|
20
|
+
loading?: string;
|
|
21
|
+
message?: string;
|
|
22
|
+
};
|
|
23
|
+
export declare const VerifyMagicLink: ({ classNames, handleMagicLinkRequested, handleMagicLinkVerified, renderButton, }: IVerifyMagicLink) => import("react").JSX.Element;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { PayloadSDK } from '@payloadcms/sdk';
|
|
4
|
+
import { useSearchParams } from 'next/navigation.js';
|
|
5
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
6
|
+
import { useSubscriber } from '../../exports/ui.js';
|
|
7
|
+
import { useServerUrl } from '../../react-hooks/useServerUrl.js';
|
|
8
|
+
import { mergeClassNames } from './helpers.js';
|
|
9
|
+
import styles from './shared.module.css';
|
|
10
|
+
export const VerifyMagicLink = ({ classNames = {
|
|
11
|
+
button: '',
|
|
12
|
+
container: '',
|
|
13
|
+
error: '',
|
|
14
|
+
form: '',
|
|
15
|
+
loading: '',
|
|
16
|
+
message: ''
|
|
17
|
+
}, handleMagicLinkRequested, handleMagicLinkVerified, renderButton = ({ name, forwardUrl, onClick, text })=>forwardUrl ? /*#__PURE__*/ _jsx("a", {
|
|
18
|
+
href: forwardUrl,
|
|
19
|
+
children: /*#__PURE__*/ _jsx("button", {
|
|
20
|
+
className: mergeClassNames([
|
|
21
|
+
styles.button,
|
|
22
|
+
classNames.button
|
|
23
|
+
]),
|
|
24
|
+
name: name,
|
|
25
|
+
type: "button",
|
|
26
|
+
children: text
|
|
27
|
+
})
|
|
28
|
+
}) : /*#__PURE__*/ _jsx("button", {
|
|
29
|
+
className: mergeClassNames([
|
|
30
|
+
styles.button,
|
|
31
|
+
classNames.button
|
|
32
|
+
]),
|
|
33
|
+
name: name,
|
|
34
|
+
onClick: onClick,
|
|
35
|
+
type: "button",
|
|
36
|
+
children: text
|
|
37
|
+
}) })=>{
|
|
38
|
+
const { serverURL } = useServerUrl();
|
|
39
|
+
const { // refreshSubscriber,
|
|
40
|
+
subscriber } = useSubscriber();
|
|
41
|
+
const searchParams = useSearchParams();
|
|
42
|
+
const email = searchParams.get('email');
|
|
43
|
+
const forwardUrl = searchParams.get('forwardUrl');
|
|
44
|
+
const token = searchParams.get('token');
|
|
45
|
+
const [result, setResult] = useState();
|
|
46
|
+
const [isError, setIsError] = useState(false);
|
|
47
|
+
// const [email, setEmail] = useState('')
|
|
48
|
+
const { refreshSubscriber } = useSubscriber();
|
|
49
|
+
const callVerify = useCallback(async ()=>{
|
|
50
|
+
const sdk = new PayloadSDK({
|
|
51
|
+
baseURL: serverURL || ''
|
|
52
|
+
});
|
|
53
|
+
const verifyResult = await sdk.request({
|
|
54
|
+
json: {
|
|
55
|
+
email,
|
|
56
|
+
token
|
|
57
|
+
},
|
|
58
|
+
method: 'POST',
|
|
59
|
+
path: '/api/verifyToken'
|
|
60
|
+
});
|
|
61
|
+
return verifyResult;
|
|
62
|
+
}, [
|
|
63
|
+
email,
|
|
64
|
+
serverURL,
|
|
65
|
+
token
|
|
66
|
+
]);
|
|
67
|
+
useEffect(()=>{
|
|
68
|
+
async function verify() {
|
|
69
|
+
const verifyResult = await callVerify();
|
|
70
|
+
if (verifyResult.ok) {
|
|
71
|
+
const resultJson = await verifyResult.json();
|
|
72
|
+
setResult(resultJson.message || resultJson.error);
|
|
73
|
+
setIsError(resultJson.error && !resultJson.message);
|
|
74
|
+
// // This is causing out of control rendering. Not totally sure why, or of another way to do it.
|
|
75
|
+
// refreshSubscriber()
|
|
76
|
+
// // This is also causing out of control rendering. Not totally sure why, or of another way to do it.
|
|
77
|
+
// if (handleMagicLinkVerified) {
|
|
78
|
+
// handleMagicLinkVerified(resultJson)
|
|
79
|
+
// }
|
|
80
|
+
} else {
|
|
81
|
+
// const resultText = await verifyResult.text()
|
|
82
|
+
setResult('An error occured. Please try again');
|
|
83
|
+
setIsError(true);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!subscriber) {
|
|
87
|
+
void verify();
|
|
88
|
+
}
|
|
89
|
+
}, [
|
|
90
|
+
callVerify,
|
|
91
|
+
serverURL,
|
|
92
|
+
email,
|
|
93
|
+
handleMagicLinkVerified,
|
|
94
|
+
refreshSubscriber,
|
|
95
|
+
subscriber,
|
|
96
|
+
token
|
|
97
|
+
]);
|
|
98
|
+
const handleRequestMagicLink = async ()=>{
|
|
99
|
+
const sdk = new PayloadSDK({
|
|
100
|
+
baseURL: serverURL || ''
|
|
101
|
+
});
|
|
102
|
+
const emailResult = await sdk.request({
|
|
103
|
+
json: {
|
|
104
|
+
email,
|
|
105
|
+
forwardUrl
|
|
106
|
+
},
|
|
107
|
+
method: 'POST',
|
|
108
|
+
path: '/api/emailToken'
|
|
109
|
+
});
|
|
110
|
+
if (emailResult.ok) {
|
|
111
|
+
const resultJson = await emailResult.json();
|
|
112
|
+
setResult('An email has been sent containing your magic link.');
|
|
113
|
+
setIsError(false);
|
|
114
|
+
if (handleMagicLinkRequested) {
|
|
115
|
+
handleMagicLinkRequested(resultJson);
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
// const resultText = await emailResult.text()
|
|
119
|
+
setResult('An error occured. Please try again.');
|
|
120
|
+
setIsError(true);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
124
|
+
className: mergeClassNames([
|
|
125
|
+
styles.container,
|
|
126
|
+
classNames.container
|
|
127
|
+
]),
|
|
128
|
+
children: [
|
|
129
|
+
!result && /*#__PURE__*/ _jsx("p", {
|
|
130
|
+
className: mergeClassNames([
|
|
131
|
+
styles.loading,
|
|
132
|
+
classNames.loading
|
|
133
|
+
]),
|
|
134
|
+
children: "verifying..."
|
|
135
|
+
}),
|
|
136
|
+
result && /*#__PURE__*/ _jsx("p", {
|
|
137
|
+
className: mergeClassNames([
|
|
138
|
+
styles.message,
|
|
139
|
+
classNames.message,
|
|
140
|
+
isError ? [
|
|
141
|
+
styles.error,
|
|
142
|
+
classNames.error
|
|
143
|
+
] : []
|
|
144
|
+
]),
|
|
145
|
+
children: result
|
|
146
|
+
}),
|
|
147
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
148
|
+
className: mergeClassNames([
|
|
149
|
+
styles.form,
|
|
150
|
+
classNames.form
|
|
151
|
+
]),
|
|
152
|
+
children: [
|
|
153
|
+
result && isError && renderButton({
|
|
154
|
+
name: 'request',
|
|
155
|
+
onClick: handleRequestMagicLink,
|
|
156
|
+
text: 'Request another magic link'
|
|
157
|
+
}),
|
|
158
|
+
result && forwardUrl && renderButton({
|
|
159
|
+
name: 'continue',
|
|
160
|
+
forwardUrl,
|
|
161
|
+
text: 'Continue'
|
|
162
|
+
})
|
|
163
|
+
]
|
|
164
|
+
})
|
|
165
|
+
]
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
//# sourceMappingURL=VerifyMagicLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/app/VerifyMagicLink.tsx"],"sourcesContent":["'use client'\n\nimport { PayloadSDK } from '@payloadcms/sdk'\nimport { useSearchParams } from 'next/navigation.js'\nimport { useCallback, useEffect, useState } from 'react'\n\nimport type { RequestMagicLinkResponse } from '../..//endpoints/requestMagicLink.js'\nimport type { Config } from '../../copied/payload-types.js'\nimport type { VerifyMagicLinkResponse } from '../../endpoints/verifyMagicLink.js'\n\nexport { VerifyMagicLinkResponse }\nimport { useSubscriber } from '../../exports/ui.js'\nimport { useServerUrl } from '../../react-hooks/useServerUrl.js'\nimport { mergeClassNames } from './helpers.js'\nimport styles from './shared.module.css'\n\n// const payload = await getPayload({\n// config: configPromise,\n// })\n\n// Pass your config from generated types as generic\n\nexport interface IVerifyMagicLink {\n classNames?: VerifyMagicLinkClasses\n handleMagicLinkRequested?: (result: RequestMagicLinkResponse) => void\n handleMagicLinkVerified?: (result: VerifyMagicLinkResponse) => void\n renderButton?: (props: {\n forwardUrl?: string\n name?: string\n onClick?: () => any\n text?: string\n }) => React.ReactNode\n}\n\nexport type VerifyMagicLinkClasses = {\n button?: string\n container?: string\n error?: string\n form?: string\n loading?: string\n message?: string\n}\n\nexport const VerifyMagicLink = ({\n classNames = {\n button: '',\n container: '',\n error: '',\n form: '',\n loading: '',\n message: '',\n },\n handleMagicLinkRequested,\n handleMagicLinkVerified,\n renderButton = ({ name, forwardUrl, onClick, text }) =>\n forwardUrl ? (\n <a href={forwardUrl}>\n <button\n className={mergeClassNames([styles.button, classNames.button])}\n name={name}\n type=\"button\"\n >\n {text}\n </button>\n </a>\n ) : (\n <button\n className={mergeClassNames([styles.button, classNames.button])}\n name={name}\n onClick={onClick}\n type=\"button\"\n >\n {text}\n </button>\n ),\n}: IVerifyMagicLink) => {\n const { serverURL } = useServerUrl()\n const {\n // refreshSubscriber,\n subscriber,\n } = useSubscriber()\n\n const searchParams = useSearchParams()\n const email = searchParams.get('email')\n const forwardUrl = searchParams.get('forwardUrl')\n const token = searchParams.get('token')\n\n const [result, setResult] = useState<string>()\n const [isError, setIsError] = useState<boolean>(false)\n // const [email, setEmail] = useState('')\n\n const { refreshSubscriber } = useSubscriber()\n\n const callVerify = useCallback(async () => {\n const sdk = new PayloadSDK<Config>({\n baseURL: serverURL || '',\n })\n\n const verifyResult = await sdk.request({\n json: {\n email,\n token,\n },\n method: 'POST',\n path: '/api/verifyToken',\n })\n\n return verifyResult\n }, [email, serverURL, token])\n\n useEffect(() => {\n async function verify() {\n const verifyResult = await callVerify()\n if (verifyResult.ok) {\n const resultJson = await verifyResult.json()\n setResult(resultJson.message || resultJson.error)\n setIsError(resultJson.error && !resultJson.message)\n\n // // This is causing out of control rendering. Not totally sure why, or of another way to do it.\n // refreshSubscriber()\n\n // // This is also causing out of control rendering. Not totally sure why, or of another way to do it.\n // if (handleMagicLinkVerified) {\n // handleMagicLinkVerified(resultJson)\n // }\n } else {\n // const resultText = await verifyResult.text()\n setResult('An error occured. Please try again')\n setIsError(true)\n }\n }\n if (!subscriber) {\n void verify()\n }\n }, [callVerify, serverURL, email, handleMagicLinkVerified, refreshSubscriber, subscriber, token])\n\n const handleRequestMagicLink = async () => {\n const sdk = new PayloadSDK<Config>({\n baseURL: serverURL || '',\n })\n\n const emailResult = await sdk.request({\n json: {\n email,\n forwardUrl,\n },\n method: 'POST',\n path: '/api/emailToken',\n })\n if (emailResult.ok) {\n const resultJson = await emailResult.json()\n setResult('An email has been sent containing your magic link.')\n setIsError(false)\n if (handleMagicLinkRequested) {\n handleMagicLinkRequested(resultJson)\n }\n } else {\n // const resultText = await emailResult.text()\n setResult('An error occured. Please try again.')\n setIsError(true)\n }\n }\n return (\n <div className={mergeClassNames([styles.container, classNames.container])}>\n {!result && (\n <p className={mergeClassNames([styles.loading, classNames.loading])}>verifying...</p>\n )}\n {result && (\n <p\n className={mergeClassNames([\n styles.message,\n classNames.message,\n isError ? [styles.error, classNames.error] : [],\n ])}\n >\n {result}\n </p>\n )}\n <div className={mergeClassNames([styles.form, classNames.form])}>\n {result &&\n isError &&\n renderButton({\n name: 'request',\n onClick: handleRequestMagicLink,\n text: 'Request another magic link',\n })}\n {result &&\n forwardUrl &&\n renderButton({\n name: 'continue',\n forwardUrl,\n text: 'Continue',\n })}\n </div>\n </div>\n )\n}\n"],"names":["PayloadSDK","useSearchParams","useCallback","useEffect","useState","useSubscriber","useServerUrl","mergeClassNames","styles","VerifyMagicLink","classNames","button","container","error","form","loading","message","handleMagicLinkRequested","handleMagicLinkVerified","renderButton","name","forwardUrl","onClick","text","a","href","className","type","serverURL","subscriber","searchParams","email","get","token","result","setResult","isError","setIsError","refreshSubscriber","callVerify","sdk","baseURL","verifyResult","request","json","method","path","verify","ok","resultJson","handleRequestMagicLink","emailResult","div","p"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const mergeClassNames: (classNames: ((string | undefined)[] | string | undefined)[]) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/app/helpers.ts"],"sourcesContent":["export const mergeClassNames = (classNames: ((string | undefined)[] | string | undefined)[]) => {\n return classNames\n .flat(Infinity)\n .filter((className) => !!className)\n .join(' ')\n}\n"],"names":["mergeClassNames","classNames","flat","Infinity","filter","className","join"],"mappings":"AAAA,OAAO,MAAMA,kBAAkB,CAACC;IAC9B,OAAOA,WACJC,IAAI,CAACC,UACLC,MAAM,CAAC,CAACC,YAAc,CAAC,CAACA,WACxBC,IAAI,CAAC;AACV,EAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Subscriber } from '../copied/payload-types.js';
|
|
3
|
+
export type SubscriberContextType = {
|
|
4
|
+
isLoaded: boolean;
|
|
5
|
+
logOut: () => void;
|
|
6
|
+
permissions: any;
|
|
7
|
+
refreshSubscriber: () => void;
|
|
8
|
+
subscriber: null | Subscriber;
|
|
9
|
+
};
|
|
10
|
+
interface ProviderProps {
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function SubscriberProvider({ children }: ProviderProps): import("react").JSX.Element;
|
|
14
|
+
export declare function useSubscriber(): SubscriberContextType;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { PayloadSDK } from '@payloadcms/sdk';
|
|
4
|
+
import { useCallback, useEffect } from 'react';
|
|
5
|
+
import { createContext, useContext, useMemo, useState } from 'react';
|
|
6
|
+
import { useServerUrl } from '../react-hooks/useServerUrl.js';
|
|
7
|
+
const SubscriberContext = /*#__PURE__*/ createContext(undefined);
|
|
8
|
+
export function SubscriberProvider({ children }) {
|
|
9
|
+
// eslint-disable-next-line
|
|
10
|
+
const [subscriber, setSubscriber] = useState(null);
|
|
11
|
+
const { serverURL } = useServerUrl();
|
|
12
|
+
// Keep track of if the selection content is loaded yet
|
|
13
|
+
const [isLoaded, setIsLoaded] = useState(false);
|
|
14
|
+
const [permissions, setPermissions] = useState();
|
|
15
|
+
const refreshSubscriber = useCallback(async ()=>{
|
|
16
|
+
const initSubscriber = async ()=>{
|
|
17
|
+
setIsLoaded(false);
|
|
18
|
+
try {
|
|
19
|
+
const sdk = new PayloadSDK({
|
|
20
|
+
baseURL: serverURL || ''
|
|
21
|
+
});
|
|
22
|
+
const authResponse = await sdk.request({
|
|
23
|
+
json: {},
|
|
24
|
+
method: 'POST',
|
|
25
|
+
path: '/api/subscriberAuth'
|
|
26
|
+
});
|
|
27
|
+
if (authResponse.ok) {
|
|
28
|
+
// Call the server function to get the user data
|
|
29
|
+
const { permissions, subscriber } = await authResponse.json();
|
|
30
|
+
// console.log(`subscriber = `, subscriber)
|
|
31
|
+
// console.log(`permissions = `, permissions)
|
|
32
|
+
setPermissions(permissions);
|
|
33
|
+
setSubscriber(subscriber);
|
|
34
|
+
} else {
|
|
35
|
+
setPermissions(null);
|
|
36
|
+
setSubscriber(null);
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.log(`authResponse error`, error);
|
|
40
|
+
}
|
|
41
|
+
setIsLoaded(true);
|
|
42
|
+
};
|
|
43
|
+
await initSubscriber();
|
|
44
|
+
}, [
|
|
45
|
+
serverURL
|
|
46
|
+
]);
|
|
47
|
+
const logOut = useCallback(async ()=>{
|
|
48
|
+
setIsLoaded(false);
|
|
49
|
+
try {
|
|
50
|
+
// const sdk = new PayloadSDK<Config>({
|
|
51
|
+
// baseURL: serverURL || '',
|
|
52
|
+
// })
|
|
53
|
+
// const logoutResponse = await sdk.request({
|
|
54
|
+
// json: {},
|
|
55
|
+
// method: 'POST',
|
|
56
|
+
// path: '/api/logout',
|
|
57
|
+
// })
|
|
58
|
+
// Unsure why sdk isn't working here
|
|
59
|
+
const logoutResponse = await fetch('/api/logout', {
|
|
60
|
+
method: 'POST'
|
|
61
|
+
});
|
|
62
|
+
// console.log(`logoutResponse`, logoutResponse)
|
|
63
|
+
if (logoutResponse.ok) {
|
|
64
|
+
setSubscriber(null);
|
|
65
|
+
setPermissions(null);
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.log(`logoutResponse error`, error);
|
|
69
|
+
}
|
|
70
|
+
setIsLoaded(true);
|
|
71
|
+
}, []);
|
|
72
|
+
useEffect(()=>{
|
|
73
|
+
void refreshSubscriber();
|
|
74
|
+
}, [
|
|
75
|
+
refreshSubscriber
|
|
76
|
+
]); // Empty dependency array for mount/unmount
|
|
77
|
+
// Memoize the value to prevent unnecessary re-renders in consumers
|
|
78
|
+
const contextValue = useMemo(()=>({
|
|
79
|
+
isLoaded,
|
|
80
|
+
logOut,
|
|
81
|
+
permissions,
|
|
82
|
+
refreshSubscriber,
|
|
83
|
+
subscriber
|
|
84
|
+
}), [
|
|
85
|
+
isLoaded,
|
|
86
|
+
logOut,
|
|
87
|
+
permissions,
|
|
88
|
+
refreshSubscriber,
|
|
89
|
+
subscriber
|
|
90
|
+
]);
|
|
91
|
+
return /*#__PURE__*/ _jsx(SubscriberContext.Provider, {
|
|
92
|
+
value: contextValue,
|
|
93
|
+
children: children
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Custom hook to easily consume the context and add error handling
|
|
97
|
+
export function useSubscriber() {
|
|
98
|
+
const context = useContext(SubscriberContext);
|
|
99
|
+
if (context === undefined) {
|
|
100
|
+
throw new Error('useSubscriber must be used within a SubscriberProvider');
|
|
101
|
+
}
|
|
102
|
+
return context;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=SubscriberProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/contexts/SubscriberProvider.tsx"],"sourcesContent":["'use client'\n\nimport { PayloadSDK } from '@payloadcms/sdk'\nimport { type ReactNode, useCallback, useEffect } from 'react'\nimport { createContext, useContext, useMemo, useState } from 'react'\n\nimport type { Config, Subscriber } from '../copied/payload-types.js'\n\nimport { useServerUrl } from '../react-hooks/useServerUrl.js'\n\nexport type SubscriberContextType = {\n isLoaded: boolean\n logOut: () => void\n permissions: any\n refreshSubscriber: () => void\n subscriber: null | Subscriber\n}\n\nconst SubscriberContext = createContext<SubscriberContextType | undefined>(undefined)\n\ninterface ProviderProps {\n children?: ReactNode // Recommended type for children\n}\n\nexport function SubscriberProvider({ children }: ProviderProps) {\n // eslint-disable-next-line\n const [subscriber, setSubscriber] = useState<null | (Subscriber & { optIns: string[] })>(null)\n\n const { serverURL } = useServerUrl()\n\n // Keep track of if the selection content is loaded yet\n const [isLoaded, setIsLoaded] = useState(false)\n\n const [permissions, setPermissions] = useState<any>()\n\n const refreshSubscriber = useCallback(async () => {\n const initSubscriber = async () => {\n setIsLoaded(false)\n try {\n const sdk = new PayloadSDK<Config>({\n baseURL: serverURL || '',\n })\n const authResponse = await sdk.request({\n json: {},\n method: 'POST',\n path: '/api/subscriberAuth',\n })\n\n if (authResponse.ok) {\n // Call the server function to get the user data\n const { permissions, subscriber } = await authResponse.json()\n // console.log(`subscriber = `, subscriber)\n // console.log(`permissions = `, permissions)\n setPermissions(permissions)\n setSubscriber(subscriber)\n } else {\n setPermissions(null)\n setSubscriber(null)\n }\n } catch (error: unknown) {\n console.log(`authResponse error`, error)\n }\n setIsLoaded(true)\n }\n await initSubscriber()\n }, [serverURL])\n\n const logOut = useCallback(async () => {\n setIsLoaded(false)\n try {\n // const sdk = new PayloadSDK<Config>({\n // baseURL: serverURL || '',\n // })\n // const logoutResponse = await sdk.request({\n // json: {},\n // method: 'POST',\n // path: '/api/logout',\n // })\n // Unsure why sdk isn't working here\n const logoutResponse = await fetch('/api/logout', {\n method: 'POST',\n })\n\n // console.log(`logoutResponse`, logoutResponse)\n\n if (logoutResponse.ok) {\n setSubscriber(null)\n setPermissions(null)\n }\n } catch (error: unknown) {\n console.log(`logoutResponse error`, error)\n }\n setIsLoaded(true)\n }, [])\n\n useEffect(() => {\n void refreshSubscriber()\n }, [refreshSubscriber]) // Empty dependency array for mount/unmount\n\n // Memoize the value to prevent unnecessary re-renders in consumers\n const contextValue: SubscriberContextType = useMemo(\n () => ({\n isLoaded,\n logOut,\n permissions,\n refreshSubscriber,\n subscriber,\n }),\n [isLoaded, logOut, permissions, refreshSubscriber, subscriber],\n )\n\n return <SubscriberContext.Provider value={contextValue}>{children}</SubscriberContext.Provider>\n}\n\n// Custom hook to easily consume the context and add error handling\nexport function useSubscriber() {\n const context = useContext(SubscriberContext)\n if (context === undefined) {\n throw new Error('useSubscriber must be used within a SubscriberProvider')\n }\n return context\n}\n"],"names":["PayloadSDK","useCallback","useEffect","createContext","useContext","useMemo","useState","useServerUrl","SubscriberContext","undefined","SubscriberProvider","children","subscriber","setSubscriber","serverURL","isLoaded","setIsLoaded","permissions","setPermissions","refreshSubscriber","initSubscriber","sdk","baseURL","authResponse","request","json","method","path","ok","error","console","log","logOut","logoutResponse","fetch","contextValue","Provider","value","useSubscriber","context","Error"],"mappings":"AAAA;;AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAAyBC,WAAW,EAAEC,SAAS,QAAQ,QAAO;AAC9D,SAASC,aAAa,EAAEC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAIpE,SAASC,YAAY,QAAQ,iCAAgC;AAU7D,MAAMC,kCAAoBL,cAAiDM;AAM3E,OAAO,SAASC,mBAAmB,EAAEC,QAAQ,EAAiB;IAC5D,2BAA2B;IAC3B,MAAM,CAACC,YAAYC,cAAc,GAAGP,SAAqD;IAEzF,MAAM,EAAEQ,SAAS,EAAE,GAAGP;IAEtB,uDAAuD;IACvD,MAAM,CAACQ,UAAUC,YAAY,GAAGV,SAAS;IAEzC,MAAM,CAACW,aAAaC,eAAe,GAAGZ;IAEtC,MAAMa,oBAAoBlB,YAAY;QACpC,MAAMmB,iBAAiB;YACrBJ,YAAY;YACZ,IAAI;gBACF,MAAMK,MAAM,IAAIrB,WAAmB;oBACjCsB,SAASR,aAAa;gBACxB;gBACA,MAAMS,eAAe,MAAMF,IAAIG,OAAO,CAAC;oBACrCC,MAAM,CAAC;oBACPC,QAAQ;oBACRC,MAAM;gBACR;gBAEA,IAAIJ,aAAaK,EAAE,EAAE;oBACnB,gDAAgD;oBAChD,MAAM,EAAEX,WAAW,EAAEL,UAAU,EAAE,GAAG,MAAMW,aAAaE,IAAI;oBAC3D,2CAA2C;oBAC3C,6CAA6C;oBAC7CP,eAAeD;oBACfJ,cAAcD;gBAChB,OAAO;oBACLM,eAAe;oBACfL,cAAc;gBAChB;YACF,EAAE,OAAOgB,OAAgB;gBACvBC,QAAQC,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAAEF;YACpC;YACAb,YAAY;QACd;QACA,MAAMI;IACR,GAAG;QAACN;KAAU;IAEd,MAAMkB,SAAS/B,YAAY;QACzBe,YAAY;QACZ,IAAI;YACF,uCAAuC;YACvC,8BAA8B;YAC9B,KAAK;YACL,6CAA6C;YAC7C,cAAc;YACd,oBAAoB;YACpB,yBAAyB;YACzB,KAAK;YACL,oCAAoC;YACpC,MAAMiB,iBAAiB,MAAMC,MAAM,eAAe;gBAChDR,QAAQ;YACV;YAEA,gDAAgD;YAEhD,IAAIO,eAAeL,EAAE,EAAE;gBACrBf,cAAc;gBACdK,eAAe;YACjB;QACF,EAAE,OAAOW,OAAgB;YACvBC,QAAQC,GAAG,CAAC,CAAC,oBAAoB,CAAC,EAAEF;QACtC;QACAb,YAAY;IACd,GAAG,EAAE;IAELd,UAAU;QACR,KAAKiB;IACP,GAAG;QAACA;KAAkB,GAAE,2CAA2C;IAEnE,mEAAmE;IACnE,MAAMgB,eAAsC9B,QAC1C,IAAO,CAAA;YACLU;YACAiB;YACAf;YACAE;YACAP;QACF,CAAA,GACA;QAACG;QAAUiB;QAAQf;QAAaE;QAAmBP;KAAW;IAGhE,qBAAO,KAACJ,kBAAkB4B,QAAQ;QAACC,OAAOF;kBAAexB;;AAC3D;AAEA,mEAAmE;AACnE,OAAO,SAAS2B;IACd,MAAMC,UAAUnC,WAAWI;IAC3B,IAAI+B,YAAY9B,WAAW;QACzB,MAAM,IAAI+B,MAAM;IAClB;IACA,OAAOD;AACT"}
|