PluginProbe
Extendify / 0.9.3
Extendify v0.9.3
3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 0.7.0 All 126 releases
extendify / src / Library / components / modals / settings / LoginInterface.js

LoginInterface.js in Extendify 0.9.3, at src/Library/components/modals/settings/LoginInterface.js

241 lines 9.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { Spinner, Button } from '@wordpress/components'
2 import { useState, useEffect, useRef } from '@wordpress/element'
3 import { __ } from '@wordpress/i18n'
4 import { Icon } from '@wordpress/icons'
5 import classNames from 'classnames'
6 import { General } from '@library/api/General'
7 import { User as UserApi } from '@library/api/User'
8 import { useIsDevMode } from '@library/hooks/helpers'
9 import { useUserStore } from '@library/state/User'
10 import { user } from '../../icons'
11 import { success as successIcon } from '../../icons'
12
13 export default function LoginInterface({ actionCallback, initialFocus }) {
14 const loggedIn = useUserStore((state) => state.apiKey.length)
15 const [email, setEmail] = useState('')
16 const [apiKey, setApiKey] = useState('')
17 const [feedback, setFeedback] = useState('')
18 const [feedbackType, setFeedbackType] = useState('info')
19 const [isWorking, setIsWorking] = useState(false)
20 const [success, setSuccess] = useState(false)
21 const viewPatternsButtonRef = useRef(null)
22 const licenseKeyRef = useRef(null)
23 const devMode = useIsDevMode()
24
25 useEffect(() => {
26 setEmail(useUserStore.getState().email)
27 // This will reset the default error state to info
28 return () => setFeedbackType('info')
29 }, [])
30
31 useEffect(() => {
32 success && viewPatternsButtonRef?.current?.focus()
33 }, [success])
34
35 const logout = () => {
36 setApiKey('')
37 useUserStore.setState({ apiKey: '' })
38 setTimeout(() => {
39 licenseKeyRef?.current?.focus()
40 }, 0)
41 }
42
43 const confirmKey = async (event) => {
44 event.preventDefault()
45 setIsWorking(true)
46 setFeedback('')
47 const { token, error, exception, message } = await UserApi.authenticate(
48 email,
49 apiKey,
50 )
51
52 if (typeof message !== 'undefined') {
53 setFeedbackType('error')
54 setIsWorking(false)
55 setFeedback(
56 message?.length
57 ? message
58 : 'Error: Are you interacting with the wrong server?',
59 )
60 return
61 }
62
63 if (error || exception) {
64 setFeedbackType('error')
65 setIsWorking(false)
66 setFeedback(error?.length ? error : exception)
67 return
68 }
69
70 if (!token || typeof token !== 'string') {
71 setFeedbackType('error')
72 setIsWorking(false)
73 setFeedback(__('Something went wrong', 'extendify'))
74 return
75 }
76
77 setFeedbackType('success')
78 setFeedback('Success!')
79 setSuccess(true)
80 setIsWorking(false)
81 useUserStore.setState({
82 email: email,
83 apiKey: token,
84 })
85 }
86
87 if (success) {
88 return (
89 <section className="space-y-6 p-6 text-center flex flex-col items-center">
90 <Icon icon={successIcon} size={148} />
91 <p className="text-center text-lg font-semibold m-0 text-extendify-black">
92 {__("You've signed in to Extendify", 'extendify')}
93 </p>
94 <Button
95 ref={viewPatternsButtonRef}
96 className="cursor-pointer rounded bg-extendify-main p-2 px-4 text-center text-white"
97 onClick={actionCallback}>
98 {__('View patterns', 'extendify')}
99 </Button>
100 </section>
101 )
102 }
103
104 if (loggedIn) {
105 return (
106 <section className="w-full space-y-6 p-6">
107 <p className="text-base m-0 text-extendify-black">
108 {__('Account', 'extendify')}
109 </p>
110 <div className="flex items-center justify-between">
111 <div className="-ml-2 flex items-center space-x-2">
112 <Icon icon={user} size={48} />
113 <p className="text-extendify-black">
114 {email?.length
115 ? email
116 : __('Logged In', 'extendify')}
117 </p>
118 </div>
119 {devMode && (
120 <Button
121 className="cursor-pointer rounded bg-extendify-main px-4 py-3 text-center text-white hover:bg-extendify-main-dark"
122 onClick={logout}>
123 {__('Sign out', 'extendify')}
124 </Button>
125 )}
126 </div>
127 </section>
128 )
129 }
130
131 return (
132 <section className="space-y-6 p-6 text-left">
133 <div>
134 <p className="text-center text-lg font-semibold m-0 text-extendify-black">
135 {__('Sign in to Extendify', 'extendify')}
136 </p>
137 <p className="space-x-1 text-center text-sm m-0 text-extendify-gray">
138 <span>{__("Don't have an account?", 'extendify')}</span>
139 <a
140 href={`https://extendify.com/pricing?utm_source=${
141 window.extendifyData.sdk_partner
142 }&utm_medium=library&utm_campaign=sign-in-form&utm_content=sign-up&utm_group=${useUserStore
143 .getState()
144 .activeTestGroupsUtmValue()}`}
145 target="_blank"
146 onClick={async () =>
147 await General.ping(
148 'sign-up-link-from-login-modal-click',
149 )
150 }
151 className="underline hover:no-underline text-extendify-gray"
152 rel="noreferrer">
153 {__('Sign up', 'extendify')}
154 </a>
155 </p>
156 </div>
157 <form
158 onSubmit={confirmKey}
159 className="flex flex-col items-center justify-center space-y-2">
160 <div className="flex items-center">
161 <label className="sr-only" htmlFor="extendify-login-email">
162 {__('Email address', 'extendify')}
163 </label>
164 <input
165 ref={initialFocus}
166 id="extendify-login-email"
167 name="extendify-login-email"
168 style={{ minWidth: '320px' }}
169 type="email"
170 className="w-full rounded border-2 p-2"
171 placeholder={__('Email address', 'extendify')}
172 value={email.length ? email : ''}
173 onChange={(event) => setEmail(event.target.value)}
174 />
175 </div>
176 <div className="flex items-center">
177 <label
178 className="sr-only"
179 htmlFor="extendify-login-license">
180 {__('License key', 'extendify')}
181 </label>
182 <input
183 ref={licenseKeyRef}
184 id="extendify-login-license"
185 name="extendify-login-license"
186 style={{ minWidth: '320px' }}
187 type="text"
188 className="w-full rounded border-2 p-2"
189 placeholder={__('License key', 'extendify')}
190 value={apiKey}
191 onChange={(event) => setApiKey(event.target.value)}
192 />
193 </div>
194 <div className="flex justify-center pt-2">
195 <button
196 type="submit"
197 className="relative flex w-72 max-w-full cursor-pointer justify-center rounded bg-extendify-main p-2 py-3 text-center text-base text-white hover:bg-extendify-main-dark ">
198 <span>{__('Sign In', 'extendify')}</span>
199 {isWorking && (
200 <div className="absolute right-2.5">
201 <Spinner />
202 </div>
203 )}
204 </button>
205 </div>
206 {feedback && (
207 <div
208 className={classNames({
209 'border-gray-900 text-gray-900':
210 feedbackType === 'info',
211 'border-wp-alert-red text-wp-alert-red':
212 feedbackType === 'error',
213 'border-extendify-main text-extendify-main':
214 feedbackType === 'success',
215 })}>
216 {feedback}
217 </div>
218 )}
219 <div className="pt-4 text-center">
220 <a
221 target="_blank"
222 rel="noreferrer"
223 href={`https://extendify.com/guides/sign-in?utm_source=${
224 window.extendifyData.sdk_partner
225 }&utm_medium=library&utm_campaign=sign-in-form&utm_content=need-help&utm_group=${useUserStore
226 .getState()
227 .activeTestGroupsUtmValue()}`}
228 onClick={async () =>
229 await General.ping(
230 'need-help-link-from-login-modal-click',
231 )
232 }
233 className="underline hover:no-underline text-sm text-extendify-gray">
234 {__('Need Help?', 'extendify')}
235 </a>
236 </div>
237 </form>
238 </section>
239 )
240 }
241