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.
Files changed (133) hide show
  1. package/README.md +305 -0
  2. package/dist/collections/OptInChannels.d.ts +3 -0
  3. package/dist/collections/OptInChannels.js +44 -0
  4. package/dist/collections/OptInChannels.js.map +1 -0
  5. package/dist/collections/Subscribers.d.ts +8 -0
  6. package/dist/collections/Subscribers.js +88 -0
  7. package/dist/collections/Subscribers.js.map +1 -0
  8. package/dist/collections/fields/OptedInChannels.d.ts +2 -0
  9. package/dist/collections/fields/OptedInChannels.js +12 -0
  10. package/dist/collections/fields/OptedInChannels.js.map +1 -0
  11. package/dist/components/BeforeDashboardClient.d.ts +1 -0
  12. package/dist/components/BeforeDashboardClient.js +40 -0
  13. package/dist/components/BeforeDashboardClient.js.map +1 -0
  14. package/dist/components/BeforeDashboardServer.d.ts +2 -0
  15. package/dist/components/BeforeDashboardServer.js +22 -0
  16. package/dist/components/BeforeDashboardServer.js.map +1 -0
  17. package/dist/components/BeforeDashboardServer.module.css +5 -0
  18. package/dist/components/app/RequestMagicLink.d.ts +16 -0
  19. package/dist/components/app/RequestMagicLink.js +114 -0
  20. package/dist/components/app/RequestMagicLink.js.map +1 -0
  21. package/dist/components/app/RequestMagicLink.module.css +5 -0
  22. package/dist/components/app/RequestOrSubscribe.d.ts +17 -0
  23. package/dist/components/app/RequestOrSubscribe.js +28 -0
  24. package/dist/components/app/RequestOrSubscribe.js.map +1 -0
  25. package/dist/components/app/SelectOptInChannels.d.ts +20 -0
  26. package/dist/components/app/SelectOptInChannels.js +120 -0
  27. package/dist/components/app/SelectOptInChannels.js.map +1 -0
  28. package/dist/components/app/SelectOptInChannels.module.css +5 -0
  29. package/dist/components/app/Subscribe.d.ts +18 -0
  30. package/dist/components/app/Subscribe.js +169 -0
  31. package/dist/components/app/Subscribe.js.map +1 -0
  32. package/dist/components/app/Subscribe.module.css +5 -0
  33. package/dist/components/app/SubscriberMenu.d.ts +7 -0
  34. package/dist/components/app/SubscriberMenu.js +44 -0
  35. package/dist/components/app/SubscriberMenu.js.map +1 -0
  36. package/dist/components/app/VerifyMagicLink.d.ts +23 -0
  37. package/dist/components/app/VerifyMagicLink.js +169 -0
  38. package/dist/components/app/VerifyMagicLink.js.map +1 -0
  39. package/dist/components/app/VerifyMagicLink.module.css +5 -0
  40. package/dist/components/app/helpers.d.ts +1 -0
  41. package/dist/components/app/helpers.js +5 -0
  42. package/dist/components/app/helpers.js.map +1 -0
  43. package/dist/components/app/shared.module.css +14 -0
  44. package/dist/contexts/SubscriberProvider.d.ts +15 -0
  45. package/dist/contexts/SubscriberProvider.js +105 -0
  46. package/dist/contexts/SubscriberProvider.js.map +1 -0
  47. package/dist/copied/payload-types.d.ts +395 -0
  48. package/dist/copied/payload-types.js +15 -0
  49. package/dist/copied/payload-types.js.map +1 -0
  50. package/dist/copied/payload.config.d.ts +2 -0
  51. package/dist/endpoints/customEndpointHandler.d.ts +2 -0
  52. package/dist/endpoints/customEndpointHandler.js +7 -0
  53. package/dist/endpoints/customEndpointHandler.js.map +1 -0
  54. package/dist/endpoints/getOptInChannels.d.ts +19 -0
  55. package/dist/endpoints/getOptInChannels.js +42 -0
  56. package/dist/endpoints/getOptInChannels.js.map +1 -0
  57. package/dist/endpoints/logout.d.ts +20 -0
  58. package/dist/endpoints/logout.js +60 -0
  59. package/dist/endpoints/logout.js.map +1 -0
  60. package/dist/endpoints/requestMagicLink.d.ts +20 -0
  61. package/dist/endpoints/requestMagicLink.js +122 -0
  62. package/dist/endpoints/requestMagicLink.js.map +1 -0
  63. package/dist/endpoints/subscribe.d.ts +24 -0
  64. package/dist/endpoints/subscribe.js +343 -0
  65. package/dist/endpoints/subscribe.js.map +1 -0
  66. package/dist/endpoints/subscriberAuth.d.ts +22 -0
  67. package/dist/endpoints/subscriberAuth.js +69 -0
  68. package/dist/endpoints/subscriberAuth.js.map +1 -0
  69. package/dist/endpoints/verifyMagicLink.d.ts +20 -0
  70. package/dist/endpoints/verifyMagicLink.js +142 -0
  71. package/dist/endpoints/verifyMagicLink.js.map +1 -0
  72. package/dist/exports/client.d.ts +1 -0
  73. package/dist/exports/client.js +3 -0
  74. package/dist/exports/client.js.map +1 -0
  75. package/dist/exports/index.d.ts +1 -0
  76. package/dist/exports/index.js +3 -0
  77. package/dist/exports/index.js.map +1 -0
  78. package/dist/exports/rsc.d.ts +1 -0
  79. package/dist/exports/rsc.js +3 -0
  80. package/dist/exports/rsc.js.map +1 -0
  81. package/dist/exports/ui.d.ts +11 -0
  82. package/dist/exports/ui.js +9 -0
  83. package/dist/exports/ui.js.map +1 -0
  84. package/dist/helpers/serverConfig.d.ts +4 -0
  85. package/dist/helpers/serverConfig.js +22 -0
  86. package/dist/helpers/serverConfig.js.map +1 -0
  87. package/dist/helpers/testData.d.ts +2 -0
  88. package/dist/helpers/testData.js +4 -0
  89. package/dist/helpers/testData.js.map +1 -0
  90. package/dist/helpers/token.d.ts +9 -0
  91. package/dist/helpers/token.js +20 -0
  92. package/dist/helpers/token.js.map +1 -0
  93. package/dist/helpers/verifyOptIns.d.ts +5 -0
  94. package/dist/helpers/verifyOptIns.js +33 -0
  95. package/dist/helpers/verifyOptIns.js.map +1 -0
  96. package/dist/index.d.ts +26 -0
  97. package/dist/index.js +147 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/react-hooks/useServerUrl.d.ts +3 -0
  100. package/dist/react-hooks/useServerUrl.js +19 -0
  101. package/dist/react-hooks/useServerUrl.js.map +1 -0
  102. package/dist/server-functions/serverUrl.d.ts +3 -0
  103. package/dist/server-functions/serverUrl.js +31 -0
  104. package/dist/server-functions/serverUrl.js.map +1 -0
  105. package/dist/server-functions/subscriberAuth.d.ts +11 -0
  106. package/package.json +94 -0
  107. package/src/collections/OptInChannels.ts +45 -0
  108. package/src/collections/Subscribers.ts +99 -0
  109. package/src/collections/fields/OptedInChannels.ts +12 -0
  110. package/src/components/app/RequestMagicLink.tsx +129 -0
  111. package/src/components/app/RequestOrSubscribe.tsx +58 -0
  112. package/src/components/app/SelectOptInChannels.tsx +147 -0
  113. package/src/components/app/Subscribe.tsx +190 -0
  114. package/src/components/app/SubscriberMenu.tsx +46 -0
  115. package/src/components/app/VerifyMagicLink.tsx +197 -0
  116. package/src/components/app/helpers.ts +6 -0
  117. package/src/components/app/shared.module.css +14 -0
  118. package/src/contexts/SubscriberProvider.tsx +122 -0
  119. package/src/copied/payload-types.ts +478 -0
  120. package/src/endpoints/getOptInChannels.ts +56 -0
  121. package/src/endpoints/logout.ts +104 -0
  122. package/src/endpoints/requestMagicLink.ts +139 -0
  123. package/src/endpoints/subscribe.ts +435 -0
  124. package/src/endpoints/subscriberAuth.ts +100 -0
  125. package/src/endpoints/verifyMagicLink.ts +164 -0
  126. package/src/exports/index.ts +1 -0
  127. package/src/exports/ui.ts +17 -0
  128. package/src/helpers/testData.ts +2 -0
  129. package/src/helpers/token.ts +14 -0
  130. package/src/helpers/verifyOptIns.ts +39 -0
  131. package/src/index.ts +207 -0
  132. package/src/react-hooks/useServerUrl.tsx +18 -0
  133. 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,5 @@
1
+ .wrapper {
2
+ display: flex;
3
+ gap: 5px;
4
+ flex-direction: column;
5
+ }
@@ -0,0 +1 @@
1
+ export declare const mergeClassNames: (classNames: ((string | undefined)[] | string | undefined)[]) => string;
@@ -0,0 +1,5 @@
1
+ export const mergeClassNames = (classNames)=>{
2
+ return classNames.flat(Infinity).filter((className)=>!!className).join(' ');
3
+ };
4
+
5
+ //# sourceMappingURL=helpers.js.map
@@ -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,14 @@
1
+ .container {
2
+ display: flex;
3
+ gap: 5px;
4
+ flex-direction: column;
5
+ }
6
+
7
+ .section {
8
+ margin-bottom: 14px;
9
+ margin-top: 14px;
10
+ }
11
+
12
+ .error {
13
+ color: red;
14
+ }
@@ -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"}