@redzone/taunt-logins-ui-react 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 (101) hide show
  1. package/.history/index_20251002141038.html +13 -0
  2. package/.history/index_20251002141344.html +13 -0
  3. package/.history/package_20251002154235.json +32 -0
  4. package/.history/package_20251002160110.json +33 -0
  5. package/.history/package_20251002161109.json +33 -0
  6. package/.history/package_20251002161124.json +32 -0
  7. package/.history/src/App_20251002141038.tsx +35 -0
  8. package/.history/src/App_20251002142848.tsx +15 -0
  9. package/.history/src/App_20251002152540.tsx +15 -0
  10. package/.history/src/App_20251002152831.tsx +17 -0
  11. package/.history/src/App_20251002153145.tsx +18 -0
  12. package/.history/src/App_20251002153323.tsx +25 -0
  13. package/.history/src/App_20251002153420.tsx +32 -0
  14. package/.history/src/App_20251002153429.tsx +33 -0
  15. package/.history/src/App_20251002153457.tsx +39 -0
  16. package/.history/src/App_20251002153516.tsx +39 -0
  17. package/.history/src/App_20251002153520.tsx +39 -0
  18. package/.history/src/App_20251002153546.tsx +41 -0
  19. package/.history/src/App_20251002154625.tsx +41 -0
  20. package/.history/src/App_20251002154740.tsx +47 -0
  21. package/.history/src/App_20251002154812.tsx +47 -0
  22. package/.history/src/App_20251002154841.tsx +47 -0
  23. package/.history/src/App_20251002154915.tsx +54 -0
  24. package/.history/src/App_20251002160347.tsx +54 -0
  25. package/.history/src/lib/exports_20251002160004.ts +0 -0
  26. package/.history/src/lib/exports_20251002160045.ts +3 -0
  27. package/.history/src/lib/magic_20251002142829.tsx +0 -0
  28. package/.history/src/lib/magic_20251002142848.tsx +44 -0
  29. package/.history/src/lib/magic_20251002152540.tsx +28 -0
  30. package/.history/src/lib/magic_20251002152543.tsx +28 -0
  31. package/.history/src/lib/magic_20251002152546.tsx +28 -0
  32. package/.history/src/lib/magic_20251002152802.tsx +47 -0
  33. package/.history/src/lib/magic_20251002154740.tsx +47 -0
  34. package/.history/src/lib/magic_20251002155035.tsx +47 -0
  35. package/.history/src/lib/magic_20251002160411.tsx +49 -0
  36. package/.history/src/lib/magic_20251002160428.tsx +49 -0
  37. package/.history/src/lib/magic_20251002161028.tsx +50 -0
  38. package/.history/src/lib/metamask_20251002141612.tsx +0 -0
  39. package/.history/src/lib/metamask_20251002142622.tsx +38 -0
  40. package/.history/src/lib/metamask_20251002142654.tsx +41 -0
  41. package/.history/src/lib/metamask_20251002142726.tsx +44 -0
  42. package/.history/src/lib/metamask_20251002142848.tsx +0 -0
  43. package/.history/src/lib/metamask_20251002152802.tsx +28 -0
  44. package/.history/src/lib/metamask_20251002153516.tsx +27 -0
  45. package/.history/src/lib/metamask_20251002154228.tsx +27 -0
  46. package/.history/src/lib/metamask_20251002154523.tsx +27 -0
  47. package/.history/src/lib/styling_20251002154448.css +0 -0
  48. package/.history/src/lib/styling_20251002154523.css +19 -0
  49. package/.history/src/lib/styling_20251002154531.css +19 -0
  50. package/.history/src/lib/styling_20251002154544.css +20 -0
  51. package/.history/src/lib/styling_20251002154548.css +19 -0
  52. package/.history/src/lib/styling_20251002160446.css +20 -0
  53. package/.history/src/lib/styling_20251002160511.css +23 -0
  54. package/.history/src/lib/styling_20251002160515.css +24 -0
  55. package/.history/src/lib/styling_20251002160815.css +24 -0
  56. package/.history/src/lib/styling_20251002160910.css +24 -0
  57. package/.history/src/lib/styling_20251002160915.css +24 -0
  58. package/.history/src/lib/styling_20251002160952.css +24 -0
  59. package/.history/src/lib/styling_20251002161001.css +24 -0
  60. package/.history/src/lib/styling_20251002161011.css +24 -0
  61. package/.history/src/lib/styling_20251002161016.css +24 -0
  62. package/.history/src/lib/styling_20251002161036.css +25 -0
  63. package/.history/src/lib/tauntContext_20251002142359.ts +0 -0
  64. package/.history/src/lib/tauntContext_20251002142622.ts +17 -0
  65. package/.history/src/lib/tauntContext_20251002152540.ts +22 -0
  66. package/.history/src/lib/tauntContext_20251002152802.ts +22 -0
  67. package/.history/src/lib/tauntProvider_20251002142503.tsx +0 -0
  68. package/.history/src/lib/tauntProvider_20251002142622.tsx +15 -0
  69. package/.history/src/lib/tauntProvider_20251002143158.tsx +19 -0
  70. package/.history/src/lib/tauntProvider_20251002144018.tsx +19 -0
  71. package/.history/src/lib/tauntProvider_20251002152234.tsx +40 -0
  72. package/.history/src/lib/tauntProvider_20251002152802.tsx +40 -0
  73. package/.history/src/lib/tauntProvider_20251002153101.tsx +49 -0
  74. package/.history/src/lib/taunt_20251002160026.ts +0 -0
  75. package/.history/src/lib/taunt_20251002160045.ts +2 -0
  76. package/.history/src/main_20251002141038.tsx +10 -0
  77. package/.history/src/main_20251002141444.tsx +12 -0
  78. package/.history/src/main_20251002160347.tsx +12 -0
  79. package/.history/vite.config_20251002141038.ts +7 -0
  80. package/.history/vite.config_20251002141323.ts +10 -0
  81. package/.prettierrc.mjs +22 -0
  82. package/README.md +73 -0
  83. package/eslint.config.js +23 -0
  84. package/index.html +13 -0
  85. package/package.json +32 -0
  86. package/public/vite.svg +1 -0
  87. package/src/App.css +42 -0
  88. package/src/App.tsx +54 -0
  89. package/src/index.css +68 -0
  90. package/src/lib/exports.ts +3 -0
  91. package/src/lib/magic.tsx +50 -0
  92. package/src/lib/metamask.tsx +27 -0
  93. package/src/lib/styling.css +25 -0
  94. package/src/lib/taunt.ts +2 -0
  95. package/src/lib/tauntContext.ts +22 -0
  96. package/src/lib/tauntProvider.tsx +49 -0
  97. package/src/main.tsx +12 -0
  98. package/tsconfig.app.json +28 -0
  99. package/tsconfig.json +7 -0
  100. package/tsconfig.node.json +26 -0
  101. package/vite.config.ts +10 -0
@@ -0,0 +1,44 @@
1
+ import { tauntMagicDidLogin } from "@redzone/taunt-logins"
2
+ import { useCallback, useMemo, useState } from "react"
3
+
4
+ import { useTaunt } from "./tauntContext"
5
+
6
+ export const Emailer = ({ onEmail }: { onEmail?: (email: string) => void }) => {
7
+ const { tauntServiceEndpoint } = useTaunt()
8
+ const [email, setEmail] = useState<string>()
9
+
10
+ const initialised = useMemo(() => email !== undefined, [email])
11
+
12
+ const validEmail = useMemo(() => {
13
+ const validRegex =
14
+ /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
15
+ return email?.match(validRegex) ? email : undefined
16
+ }, [email])
17
+
18
+ const runMagic = useCallback(() => {
19
+ if (!validEmail) return
20
+
21
+ if (onEmail) {
22
+ onEmail(email!)
23
+ } else {
24
+ tauntMagicDidLogin(tauntServiceEndpoint, email!)
25
+ }
26
+ }, [validEmail, onEmail])
27
+
28
+ return (
29
+ <div>
30
+ {initialised && !validEmail && (
31
+ <div style={{ color: "red" }}>Please enter a valid email</div>
32
+ )}
33
+ <input
34
+ onChange={(e) => setEmail(e.target.value)}
35
+ placeholder="Enter your email"
36
+ type="email"
37
+ value={email}
38
+ />
39
+ <button onClick={runMagic} type="button">
40
+ Send Magic Link
41
+ </button>
42
+ </div>
43
+ )
44
+ }
File without changes
@@ -0,0 +1,28 @@
1
+ import { useCallback } from "react"
2
+
3
+ import { useTaunt } from "./tauntContext"
4
+
5
+ export const MetaMaskButton = ({
6
+ openMetamask
7
+ }: {
8
+ openMetamask?: () => void
9
+ }) => {
10
+ const { metamaskLogin } = useTaunt()
11
+
12
+ const runMetamask = useCallback(() => {
13
+ if (openMetamask) {
14
+ openMetamask()
15
+ } else {
16
+ metamaskLogin()
17
+ }
18
+ }, [metamaskLogin, openMetamask])
19
+
20
+ return (
21
+ <button
22
+ className="ml-2 p-2 bg-blue-500 text-white rounded-md"
23
+ onClick={runMetamask}
24
+ type="button">
25
+ Login with Metamask
26
+ </button>
27
+ )
28
+ }
@@ -0,0 +1,27 @@
1
+ import { useCallback } from "react"
2
+
3
+ import { useTaunt } from "./tauntContext"
4
+
5
+ export const MetaMaskButton = ({
6
+ openMetamask
7
+ }: {
8
+ openMetamask?: () => void
9
+ }) => {
10
+ const { metamaskLogin } = useTaunt()
11
+
12
+ const runMetamask = useCallback(() => {
13
+ if (openMetamask) {
14
+ openMetamask()
15
+ } else {
16
+ metamaskLogin()
17
+ }
18
+ }, [metamaskLogin, openMetamask])
19
+
20
+ return (
21
+ <button
22
+ className="ml-2 p-2 bg-blue-500 text-white rounded-md"
23
+ onClick={runMetamask}>
24
+ Login with Metamask
25
+ </button>
26
+ )
27
+ }
@@ -0,0 +1,27 @@
1
+ import { useCallback } from "react"
2
+
3
+ import { useTaunt } from "./tauntContext"
4
+
5
+ export const MetaMaskButton = ({
6
+ openMetamask
7
+ }: {
8
+ openMetamask?: () => void
9
+ }) => {
10
+ const { metamaskLogin } = useTaunt()
11
+
12
+ const runMetamask = useCallback(() => {
13
+ if (openMetamask) {
14
+ openMetamask()
15
+ } else {
16
+ metamaskLogin()
17
+ }
18
+ }, [metamaskLogin, openMetamask])
19
+
20
+ return (
21
+ <button
22
+ className="ml-2 p-2 bg-blue-500 text-white rounded-md"
23
+ onClick={runMetamask}>
24
+ Login with Metamask
25
+ </button>
26
+ )
27
+ }
@@ -0,0 +1,27 @@
1
+ import { useCallback } from "react"
2
+
3
+ import "./styling.css"
4
+
5
+ import { useTaunt } from "./tauntContext"
6
+
7
+ export const MetaMaskButton = ({
8
+ openMetamask
9
+ }: {
10
+ openMetamask?: () => void
11
+ }) => {
12
+ const { metamaskLogin } = useTaunt()
13
+
14
+ const runMetamask = useCallback(() => {
15
+ if (openMetamask) {
16
+ openMetamask()
17
+ } else {
18
+ metamaskLogin()
19
+ }
20
+ }, [metamaskLogin, openMetamask])
21
+
22
+ return (
23
+ <button className="rdz-button" onClick={runMetamask}>
24
+ Login with Metamask
25
+ </button>
26
+ )
27
+ }
File without changes
@@ -0,0 +1,19 @@
1
+ button.rdz-button {
2
+ border-radius: 8px;
3
+ border: 1px solid transparent;
4
+ padding: 0.6em 1.2em;
5
+ font-size: 1em;
6
+ font-weight: 500;
7
+ font-family: inherit;
8
+ background-color: #1a1a1a;
9
+ cursor: pointer;
10
+ transition: border-color 0.25s;
11
+
12
+ &:hover {
13
+ border-color: #646cff;
14
+ }
15
+ &:focus,
16
+ &:focus-visible {
17
+ outline: 4px auto -webkit-focus-ring-color;
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ button.rdz-button {
2
+ border-radius: 80px;
3
+ border: 1px solid transparent;
4
+ padding: 0.6em 1.2em;
5
+ font-size: 1em;
6
+ font-weight: 500;
7
+ font-family: inherit;
8
+ background-color: #1a1a1a;
9
+ cursor: pointer;
10
+ transition: border-color 0.25s;
11
+
12
+ &:hover {
13
+ border-color: #646cff;
14
+ }
15
+ &:focus,
16
+ &:focus-visible {
17
+ outline: 4px auto -webkit-focus-ring-color;
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ button.rdz-button {
2
+ border-radius: 8px;
3
+ border: 1px solid transparent;
4
+ padding: 0.6em 1.2em;
5
+ font-size: 1em;
6
+ font-weight: 500;
7
+ font-family: inherit;
8
+ background-color: #1a1a1a;
9
+ cursor: pointer;
10
+ transition: border-color 0.25s;
11
+ color: red;
12
+
13
+ &:hover {
14
+ border-color: #646cff;
15
+ }
16
+ &:focus,
17
+ &:focus-visible {
18
+ outline: 4px auto -webkit-focus-ring-color;
19
+ }
20
+ }
@@ -0,0 +1,19 @@
1
+ button.rdz-button {
2
+ border-radius: 8px;
3
+ border: 1px solid transparent;
4
+ padding: 0.6em 1.2em;
5
+ font-size: 1em;
6
+ font-weight: 500;
7
+ font-family: inherit;
8
+ background-color: #1a1a1a;
9
+ cursor: pointer;
10
+ transition: border-color 0.25s;
11
+
12
+ &:hover {
13
+ border-color: #646cff;
14
+ }
15
+ &:focus,
16
+ &:focus-visible {
17
+ outline: 4px auto -webkit-focus-ring-color;
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ button.rdz-button {
2
+ color: lightgray;
3
+ border-radius: 8px;
4
+ border: 1px solid transparent;
5
+ padding: 0.6em 1.2em;
6
+ font-size: 1em;
7
+ font-weight: 500;
8
+ font-family: inherit;
9
+ background-color: #1a1a1a;
10
+ cursor: pointer;
11
+ transition: border-color 0.25s;
12
+
13
+ &:hover {
14
+ border-color: #646cff;
15
+ }
16
+ &:focus,
17
+ &:focus-visible {
18
+ outline: 4px auto -webkit-focus-ring-color;
19
+ }
20
+ }
@@ -0,0 +1,23 @@
1
+ button.rdz-button {
2
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+ color: lightgray;
6
+ border-radius: 8px;
7
+ border: 1px solid transparent;
8
+ padding: 0.6em 1.2em;
9
+ font-size: 1em;
10
+ font-weight: 500;
11
+ font-family: inherit;
12
+ background-color: #1a1a1a;
13
+ cursor: pointer;
14
+ transition: border-color 0.25s;
15
+
16
+ &:hover {
17
+ border-color: #646cff;
18
+ }
19
+ &:focus,
20
+ &:focus-visible {
21
+ outline: 4px auto -webkit-focus-ring-color;
22
+ }
23
+ }
@@ -0,0 +1,24 @@
1
+ button.rdz-button {
2
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ button.rdz-button {
2
+ font-family: Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ button.rdz-button {
2
+ font-family: Roboto;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ button.rdz-button {
2
+ font-family: Arial, Helvetica, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ .rdz-button {
2
+ font-family: Arial, Helvetica, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ .rdz-button {
2
+ font-family: Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ .rdz-button {
2
+ font-family: Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400 !important;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ .rdz-button {
2
+ font-family: Avenir, Helvetica, Arial, sans-serif !important;
3
+ line-height: 1.5;
4
+ font-weight: 400 !important;
5
+
6
+ color: lightgray;
7
+ border-radius: 8px;
8
+ border: 1px solid transparent;
9
+ padding: 0.6em 1.2em;
10
+ font-size: 1em;
11
+ font-weight: 500;
12
+ font-family: inherit;
13
+ background-color: #1a1a1a;
14
+ cursor: pointer;
15
+ transition: border-color 0.25s;
16
+
17
+ &:hover {
18
+ border-color: #646cff;
19
+ }
20
+ &:focus,
21
+ &:focus-visible {
22
+ outline: 4px auto -webkit-focus-ring-color;
23
+ }
24
+ }
@@ -0,0 +1,25 @@
1
+ .rdz-button,
2
+ .rdz-input {
3
+ font-family: Avenir, Helvetica, Arial, sans-serif !important;
4
+ line-height: 1.5;
5
+ font-weight: 400 !important;
6
+
7
+ color: lightgray;
8
+ border-radius: 8px;
9
+ border: 1px solid transparent;
10
+ padding: 0.6em 1.2em;
11
+ font-size: 1em;
12
+ font-weight: 500;
13
+ font-family: inherit;
14
+ background-color: #1a1a1a;
15
+ cursor: pointer;
16
+ transition: border-color 0.25s;
17
+
18
+ &:hover {
19
+ border-color: #646cff;
20
+ }
21
+ &:focus,
22
+ &:focus-visible {
23
+ outline: 4px auto -webkit-focus-ring-color;
24
+ }
25
+ }
@@ -0,0 +1,17 @@
1
+ import { createContext, useContext } from "react"
2
+
3
+ type ContextProps = {
4
+ tauntServiceEndpoint: string
5
+ }
6
+
7
+ export const TauntContext = createContext<ContextProps>({
8
+ tauntServiceEndpoint: ""
9
+ })
10
+
11
+ export function useTaunt() {
12
+ const ctx = useContext(TauntContext)
13
+ if (!ctx) {
14
+ throw new Error("useTaunt must be used within a TauntProvider")
15
+ }
16
+ return ctx
17
+ }
@@ -0,0 +1,22 @@
1
+ import { createContext, useContext } from "react"
2
+
3
+ type ContextProps = {
4
+ tauntServiceEndpoint: string
5
+ deets?: { accessToken: string; refreshToken: string }
6
+ metamaskLogin: () => void
7
+ otpLogin: (email: string) => void
8
+ }
9
+
10
+ export const TauntContext = createContext<ContextProps>({
11
+ tauntServiceEndpoint: "",
12
+ metamaskLogin: () => {},
13
+ otpLogin: () => {}
14
+ })
15
+
16
+ export function useTaunt() {
17
+ const ctx = useContext(TauntContext)
18
+ if (!ctx) {
19
+ throw new Error("useTaunt must be used within a TauntProvider")
20
+ }
21
+ return ctx
22
+ }
@@ -0,0 +1,22 @@
1
+ import { createContext, useContext } from "react"
2
+
3
+ type ContextProps = {
4
+ tauntServiceEndpoint: string
5
+ deets?: { accessToken: string; refreshToken: string }
6
+ metamaskLogin: () => void
7
+ otpMagicLogin: (email: string) => void
8
+ }
9
+
10
+ export const TauntContext = createContext<ContextProps>({
11
+ tauntServiceEndpoint: "",
12
+ metamaskLogin: () => {},
13
+ otpMagicLogin: () => {}
14
+ })
15
+
16
+ export function useTaunt() {
17
+ const ctx = useContext(TauntContext)
18
+ if (!ctx) {
19
+ throw new Error("useTaunt must be used within a TauntProvider")
20
+ }
21
+ return ctx
22
+ }
@@ -0,0 +1,15 @@
1
+ import { TauntContext } from "./tauntContext"
2
+
3
+ export const TauntProvider = ({
4
+ children,
5
+ tauntServiceEndpoint
6
+ }: {
7
+ children: React.ReactNode
8
+ tauntServiceEndpoint: string
9
+ }) => {
10
+ return (
11
+ <TauntContext.Provider value={{ tauntServiceEndpoint }}>
12
+ {children}
13
+ </TauntContext.Provider>
14
+ )
15
+ }
@@ -0,0 +1,19 @@
1
+ import { TauntContext } from "./tauntContext"
2
+
3
+ export const TauntProvider = ({
4
+ children,
5
+ tauntServiceEndpoint
6
+ }: {
7
+ children: React.ReactNode
8
+ tauntServiceEndpoint?: string
9
+ }) => {
10
+ if (!tauntServiceEndpoint) {
11
+ throw new Error("tauntServiceEndpoint is required")
12
+ }
13
+
14
+ return (
15
+ <TauntContext.Provider value={{ tauntServiceEndpoint }}>
16
+ {children}
17
+ </TauntContext.Provider>
18
+ )
19
+ }
@@ -0,0 +1,19 @@
1
+ import { TauntContext } from "./tauntContext"
2
+
3
+ export const TauntProvider = ({
4
+ children,
5
+ tauntServiceEndpoint
6
+ }: {
7
+ children: React.ReactNode
8
+ tauntServiceEndpoint?: string
9
+ }) => {
10
+ if (!tauntServiceEndpoint) {
11
+ return <div>tauntServiceEndpoint is required</div>
12
+ }
13
+
14
+ return (
15
+ <TauntContext.Provider value={{ tauntServiceEndpoint }}>
16
+ {children}
17
+ </TauntContext.Provider>
18
+ )
19
+ }
@@ -0,0 +1,40 @@
1
+ import { tauntMagicDidLogin, tauntMetamaskLogin } from "@redzone/taunt-logins"
2
+ import { useCallback, useState } from "react"
3
+
4
+ import { TauntContext } from "./tauntContext"
5
+
6
+ export const TauntProvider = ({
7
+ children,
8
+ tauntServiceEndpoint
9
+ }: {
10
+ children: React.ReactNode
11
+ tauntServiceEndpoint?: string
12
+ }) => {
13
+ const [deets, setDeets] = useState<{
14
+ accessToken: string
15
+ refreshToken: string
16
+ }>()
17
+
18
+ const otpLogin = useCallback(
19
+ (email: string) => {
20
+ tauntMagicDidLogin(tauntServiceEndpoint!, email!).then(setDeets)
21
+ },
22
+ [tauntServiceEndpoint]
23
+ )
24
+
25
+ const metamaskLogin = useCallback(
26
+ () => tauntMetamaskLogin(tauntServiceEndpoint!).then(setDeets),
27
+ [tauntServiceEndpoint]
28
+ )
29
+
30
+ if (!tauntServiceEndpoint) {
31
+ return <div>tauntServiceEndpoint is required</div>
32
+ }
33
+
34
+ return (
35
+ <TauntContext.Provider
36
+ value={{ tauntServiceEndpoint, deets, otpLogin, metamaskLogin }}>
37
+ {children}
38
+ </TauntContext.Provider>
39
+ )
40
+ }