PluginProbe
Extendify / 0.5.0
Extendify v0.5.0
3.2.1 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 All 127 releases
extendify / src / components / ImportCounter.js

ImportCounter.js in Extendify 0.5.0, at src/components/ImportCounter.js

121 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { safeHTML } from '@wordpress/dom'
2 import { useEffect, memo, useRef } from '@wordpress/element'
3 import { __, _n, sprintf } from '@wordpress/i18n'
4 import { Icon } from '@wordpress/icons'
5 import classnames from 'classnames'
6 import { General } from '@extendify/api/General'
7 import { User as UserApi } from '@extendify/api/User'
8 import { useTestGroup } from '@extendify/hooks/useTestGroup'
9 import { useUserStore } from '@extendify/state/User'
10 import { growthArrow } from './icons'
11 import { alert, download } from './icons/'
12
13 export const ImportCounter = memo(function ImportCounter() {
14 const remainingImports = useUserStore((state) => state.remainingImports)
15 const allowedImports = useUserStore((state) => state.allowedImports)
16 const count = remainingImports()
17 const status = count > 0 ? 'has-imports' : 'no-imports'
18 const buttonRef = useRef()
19 const buttonColorGroup = useTestGroup('import-counter-color', ['A', 'B'])
20 const backgroundColor = () => {
21 switch (buttonColorGroup) {
22 // case 'A' is the default
23 case 'B':
24 return 'bg-wp-theme-500 hover:bg-wp-theme-600'
25 default:
26 return 'bg-extendify-main hover:bg-extendify-main-dark'
27 }
28 }
29
30 useEffect(() => {
31 if (allowedImports < 1 || !allowedImports) {
32 const fallback = 5
33 UserApi.allowedImports()
34 .then((allowedImports) => {
35 allowedImports = /^[1-9]\d*$/.test(allowedImports)
36 ? allowedImports
37 : fallback
38 useUserStore.setState({ allowedImports })
39 })
40 .catch(() =>
41 useUserStore.setState({ allowedImports: fallback }),
42 )
43 }
44 }, [allowedImports])
45
46 if (!allowedImports) {
47 return null
48 }
49
50 return (
51 // tabIndex for group focus animations
52 <div tabIndex="0" className="group relative">
53 <a
54 target="_blank"
55 ref={buttonRef}
56 rel="noreferrer"
57 className={classnames(
58 'button-focus hidden w-full justify-between rounded py-3 px-4 text-sm text-white no-underline sm:flex',
59 {
60 [backgroundColor()]: count > 0,
61 'bg-extendify-alert': !count,
62 },
63 )}
64 onClick={async () => await General.ping('import-counter-click')}
65 href={`https://www.extendify.com/pricing/?utm_source=${encodeURIComponent(
66 window.extendifyData.sdk_partner,
67 )}&utm_medium=library&utm_campaign=import-counter&utm_content=get-more&utm_term=${status}&utm_group=${useUserStore
68 .getState()
69 .activeTestGroupsUtmValue()}`}>
70 <span className="flex items-center space-x-2 text-xs no-underline">
71 <Icon icon={count > 0 ? download : alert} size={14} />
72 <span>
73 {sprintf(
74 _n('%s Import', '%s Imports', count, 'extendify'),
75 count,
76 )}
77 </span>
78 </span>
79 <span className="outline-none flex items-center text-sm font-medium text-white no-underline">
80 {__('Get more', 'extendify')}
81 <Icon icon={growthArrow} size={24} className="-mr-1.5" />
82 </span>
83 </a>
84 <div
85 className="extendify-bottom-arrow invisible absolute top-0 w-full -translate-y-full transform opacity-0 shadow-md transition-all delay-200 duration-300 ease-in-out group-hover:visible group-hover:-top-2.5 group-hover:opacity-100 group-focus:visible group-focus:-top-2.5 group-focus:opacity-100"
86 tabIndex="-1">
87 <a
88 href={`https://www.extendify.com/pricing/?utm_source=${encodeURIComponent(
89 window.extendifyData.sdk_partner,
90 )}&utm_medium=library&utm_campaign=import-counter-tooltip&utm_content=get-50-off&utm_term=${status}&utm_group=${useUserStore
91 .getState()
92 .activeTestGroupsUtmValue()}`}
93 className="block bg-gray-900 text-white p-4 no-underline rounded bg-cover"
94 onClick={async () =>
95 await General.ping('import-counter-tooltip-click')
96 }
97 style={{
98 backgroundImage: `url(${window.extendifyData.asset_path}/logo-tips.png)`,
99 backgroundSize: '100% 100%',
100 }}>
101 <span
102 dangerouslySetInnerHTML={{
103 __html: safeHTML(
104 sprintf(
105 __(
106 '%1$sGet %2$s off%3$s Extendify Pro when you upgrade today!',
107 'extendify',
108 ),
109 '<strong>',
110 '50%',
111 '</strong>',
112 ),
113 ),
114 }}
115 />
116 </a>
117 </div>
118 </div>
119 )
120 })
121