@eeacms/volto-marine-policy 1.0.0
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/.coverage.babel.config.js +9 -0
- package/.eslintrc.js +65 -0
- package/.husky/pre-commit +2 -0
- package/.release-it.json +17 -0
- package/CHANGELOG.md +5 -0
- package/DEVELOP.md +53 -0
- package/DEVELOP.md.tpl +106 -0
- package/Jenkinsfile.tpl +416 -0
- package/LICENSE.md +9 -0
- package/Makefile.tpl +165 -0
- package/README.md +172 -0
- package/README.md.tpl +93 -0
- package/RELEASE.md +74 -0
- package/babel.config.js +17 -0
- package/bootstrap +41 -0
- package/cypress.config.js +24 -0
- package/docker-compose.yml +32 -0
- package/jest-addon.config.js +35 -0
- package/jest-addon.config.js.tpl +51 -0
- package/jest.setup.js +65 -0
- package/locales/de/LC_MESSAGES/volto.po +14 -0
- package/locales/en/LC_MESSAGES/volto.po +14 -0
- package/locales/it/LC_MESSAGES/volto.po +14 -0
- package/locales/ro/LC_MESSAGES/volto.po +14 -0
- package/locales/volto.pot +16 -0
- package/package.json +68 -0
- package/package.json.tpl +70 -0
- package/razzle.extend.js +29 -0
- package/src/components/Blocks/CustomBlockTemplates/customBlockTemplates.js +25 -0
- package/src/components/Blocks/MsfdDataExplorerBlock/Edit.jsx +29 -0
- package/src/components/Blocks/MsfdDataExplorerBlock/View.jsx +105 -0
- package/src/components/Blocks/MsfdDataExplorerBlock/index.js +23 -0
- package/src/components/Blocks/MsfdDataExplorerBlock/schema.jsx +30 -0
- package/src/components/Result/MarineMeasureItem.jsx +83 -0
- package/src/components/Widgets/MeasureViewWidget.jsx +233 -0
- package/src/components/Widgets/String.jsx +15 -0
- package/src/components/Widgets/TextAlign.jsx +41 -0
- package/src/components/Widgets/measure.css +101 -0
- package/src/components/index.js +15 -0
- package/src/components/theme/AppExtras/PrintPage/PrintPage.jsx +61 -0
- package/src/components/theme/AppExtras/PrintPage/css/printpage.less +29 -0
- package/src/components/theme/AppExtras/PrintPage/index.js +3 -0
- package/src/components/theme/AppExtras/ScrollToTop/ScrollToTop.jsx +61 -0
- package/src/components/theme/AppExtras/ScrollToTop/css/scrolltop.less +19 -0
- package/src/components/theme/AppExtras/ScrollToTop/index.js +3 -0
- package/src/components/theme/AppExtras/index.js +18 -0
- package/src/components/theme/DatabaseItemView/DatabaseItemView.jsx +39 -0
- package/src/components/theme/DatabaseItemView/style.less +87 -0
- package/src/components/theme/Header/HeroSection.jsx +45 -0
- package/src/components/theme/Header/StickyHeader.jsx +51 -0
- package/src/components/theme/Header/less/globals.less +18 -0
- package/src/components/theme/Header/less/herosection.less +64 -0
- package/src/components/theme/Header/less/herosection.variables +18 -0
- package/src/components/theme/ItemMetadata/ItemMetadata.jsx +217 -0
- package/src/components/theme/ItemMetadata/ItemMetadataSnippet.jsx +69 -0
- package/src/components/theme/ItemMetadata/ItemTitle.jsx +29 -0
- package/src/components/theme/MetadataListingView/MapPreview.jsx +105 -0
- package/src/components/theme/MetadataListingView/MetadataHeader.jsx +66 -0
- package/src/components/theme/MetadataListingView/MetadataListingView.jsx +36 -0
- package/src/components/theme/MetadataListingView/style.less +219 -0
- package/src/components/theme/SimpleListingView/SimpleListingView.jsx +97 -0
- package/src/components/theme/SimpleListingView/style.less +33 -0
- package/src/components/theme/Tableau/TableauDownload.jsx +86 -0
- package/src/components/theme/Tableau/TableauFullscreen.jsx +78 -0
- package/src/components/theme/Tableau/TableauShare.jsx +128 -0
- package/src/components/theme/View/FullwidthView.jsx +102 -0
- package/src/components/theme/View/HeroSectionView.jsx +125 -0
- package/src/constants/ActionTypes.js +12 -0
- package/src/constants/measureFields.js +56 -0
- package/src/customizations/@eeacms/volto-block-style/StyleWrapper/schema.js +217 -0
- package/src/customizations/@eeacms/volto-eea-design-system/ui/Header/Header.jsx +358 -0
- package/src/customizations/@eeacms/volto-eea-design-system/ui/Header/HeaderMenuPopUp.js +403 -0
- package/src/customizations/@eeacms/volto-eea-design-system/ui/Header/HeaderSearchPopUp.js +131 -0
- package/src/customizations/@eeacms/volto-eea-design-system/ui/Logo/Logo.jsx +32 -0
- package/src/customizations/@eeacms/volto-eea-design-system/ui/Logo/marine_logo.svg +63 -0
- package/src/customizations/volto/components/manage/Contents/ContentsBreadcrumbs.jsx +81 -0
- package/src/customizations/volto/components/manage/Contents/README.md +1 -0
- package/src/customizations/volto/components/manage/Toolbar/PersonalTools.jsx +205 -0
- package/src/customizations/volto/components/manage/Toolbar/Toolbar.jsx +624 -0
- package/src/customizations/volto/components/theme/Breadcrumbs/Breadcrumbs.jsx +49 -0
- package/src/customizations/volto/components/theme/Breadcrumbs/README.md +1 -0
- package/src/customizations/volto/components/theme/Header/Header.jsx +272 -0
- package/src/helpers/index.js +2 -0
- package/src/helpers/useCopyToClipboard.js +25 -0
- package/src/helpers/useOutsideClick.js +20 -0
- package/src/icons/arrow.svg +3 -0
- package/src/icons/basket.svg +3 -0
- package/src/icons/newspaper.svg +3 -0
- package/src/icons/popup.svg +3 -0
- package/src/icons/search.svg +3 -0
- package/src/icons/star-full.svg +3 -0
- package/src/icons/user.svg +3 -0
- package/src/index.js +466 -0
- package/src/reducers/breadcrumb/breadcrumb.js +59 -0
- package/src/reducers/index.js +2 -0
- package/src/reducers/localnavigation/localnavigation.js +69 -0
- package/src/search/config.js +98 -0
- package/src/search/facets.js +85 -0
- package/src/search/index.js +48 -0
- package/src/search/views.js +15 -0
- package/src/slate-styles.less +43 -0
- package/src/static/bise_logo.svg +1 -0
- package/src/static/cca_logo.svg +20 -0
- package/src/static/ec_logo.svg +343 -0
- package/src/static/ec_logo_white.svg +10 -0
- package/src/static/eea_logo.svg +14 -0
- package/src/static/footer-fishes.svg +21 -0
- package/src/static/forest_logo.svg +30 -0
- package/src/static/freshwater_logo.svg +12 -0
- package/src/static/marine_logo.svg +63 -0
- package/src/static/marine_logo_white.svg +44 -0
- package/src/utils.js +38 -0
- package/theme/assets/fonts/Poppins/Poppins-Bold.ttf +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Bold.woff +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Bold.woff2 +0 -0
- package/theme/assets/fonts/Poppins/Poppins-ExtraBold.ttf +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Light.ttf +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Light.woff +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Light.woff2 +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Regular.ttf +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Regular.woff +0 -0
- package/theme/assets/fonts/Poppins/Poppins-Regular.woff2 +0 -0
- package/theme/assets/fonts/Poppins/Poppins-SemiBold.ttf +0 -0
- package/theme/assets/fonts/Poppins/Poppins-SemiBold.woff +0 -0
- package/theme/assets/fonts/Poppins/Poppins-SemiBold.woff2 +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Light.ttf +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Light.woff +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Light.woff2 +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Medium.ttf +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Medium.woff +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Medium.woff2 +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Regular.ttf +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Regular.woff +0 -0
- package/theme/assets/fonts/Roboto/Roboto-Regular.woff2 +0 -0
- package/theme/assets/images/Footer/ec_logo.svg +10 -0
- package/theme/assets/images/Header/climate-adapt-logo-1.svg +20 -0
- package/theme/assets/images/Header/climate-adapt-logo.svg +22 -0
- package/theme/assets/images/spinner.svg +1 -0
- package/theme/collections/table.variables +17 -0
- package/theme/elements/button.overrides +22 -0
- package/theme/extras/banner.variables +5 -0
- package/theme/extras/contextNavigation.overrides +60 -0
- package/theme/extras/contextNavigation.variables +32 -0
- package/theme/extras/footer.variables +6 -0
- package/theme/extras/header.overrides +20 -0
- package/theme/extras/header.variables +7 -0
- package/theme/extras/hero.overrides +4 -0
- package/theme/extras/inpageNavigation.variables +5 -0
- package/theme/extras/mixins.less +8 -0
- package/theme/globals/site.overrides +349 -0
- package/theme/globals/site.variables +997 -0
- package/theme/theme.config +136 -0
- package/theme/tokens/colors.less +9 -0
- package/theme/tokens/tokens.less +1 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header component.
|
|
3
|
+
* @module components/theme/Header/Header
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { Dropdown, Image } from 'semantic-ui-react';
|
|
8
|
+
import { connect, useDispatch, useSelector } from 'react-redux';
|
|
9
|
+
|
|
10
|
+
import { withRouter } from 'react-router-dom';
|
|
11
|
+
import { UniversalLink } from '@plone/volto/components';
|
|
12
|
+
import {
|
|
13
|
+
getBaseUrl,
|
|
14
|
+
hasApiExpander,
|
|
15
|
+
flattenToAppURL,
|
|
16
|
+
} from '@plone/volto/helpers';
|
|
17
|
+
import { getNavigation } from '@plone/volto/actions';
|
|
18
|
+
import { Header, Logo } from '@eeacms/volto-eea-design-system/ui';
|
|
19
|
+
import { usePrevious } from '@eeacms/volto-eea-design-system/helpers';
|
|
20
|
+
import { find } from 'lodash';
|
|
21
|
+
import globeIcon from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/global-line.svg';
|
|
22
|
+
import eeaFlag from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/eea.png';
|
|
23
|
+
|
|
24
|
+
import config from '@plone/volto/registry';
|
|
25
|
+
import { compose } from 'recompose';
|
|
26
|
+
import { BodyClass } from '@plone/volto/helpers';
|
|
27
|
+
|
|
28
|
+
import cx from 'classnames';
|
|
29
|
+
|
|
30
|
+
function removeTrailingSlash(path) {
|
|
31
|
+
return path.replace(/\/+$/, '');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* EEA Specific Header component.
|
|
36
|
+
*/
|
|
37
|
+
const EEAHeader = ({ pathname, token, items, history, subsite }) => {
|
|
38
|
+
const currentLang = useSelector((state) => state.intl.locale);
|
|
39
|
+
const translations = useSelector(
|
|
40
|
+
(state) => state.content.data?.['@components']?.translations?.items,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const router_pathname = useSelector((state) => {
|
|
44
|
+
return removeTrailingSlash(state.router?.location?.pathname) || '';
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const isSubsite = subsite?.['@type'] === 'Subsite';
|
|
48
|
+
|
|
49
|
+
const isHomePageInverse = useSelector((state) => {
|
|
50
|
+
const layout = state.content?.data?.layout;
|
|
51
|
+
const has_home_layout =
|
|
52
|
+
layout === 'homepage_inverse_view' ||
|
|
53
|
+
(__CLIENT__ && document.body.classList.contains('homepage-inverse'));
|
|
54
|
+
return (
|
|
55
|
+
router_pathname.endsWith('/marine') ||
|
|
56
|
+
(has_home_layout &&
|
|
57
|
+
(removeTrailingSlash(pathname) === router_pathname ||
|
|
58
|
+
router_pathname.endsWith('/edit')))
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const { eea } = config.settings;
|
|
63
|
+
const headerOpts = eea.headerOpts || {};
|
|
64
|
+
const headerSearchBox = eea.headerSearchBox || [];
|
|
65
|
+
const { logo, logoWhite } = headerOpts || {};
|
|
66
|
+
const width = useSelector((state) => state.screen?.width);
|
|
67
|
+
const dispatch = useDispatch();
|
|
68
|
+
const previousToken = usePrevious(token);
|
|
69
|
+
const [language, setLanguage] = React.useState(
|
|
70
|
+
currentLang || eea.defaultLanguage,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
React.useEffect(() => {
|
|
74
|
+
const { settings } = config;
|
|
75
|
+
const base_url = getBaseUrl(pathname);
|
|
76
|
+
if (!hasApiExpander('navigation', base_url)) {
|
|
77
|
+
dispatch(getNavigation(base_url, settings.navDepth));
|
|
78
|
+
}
|
|
79
|
+
}, [pathname, dispatch]);
|
|
80
|
+
|
|
81
|
+
React.useEffect(() => {
|
|
82
|
+
if (token !== previousToken) {
|
|
83
|
+
const { settings } = config;
|
|
84
|
+
const base = getBaseUrl(pathname);
|
|
85
|
+
if (!hasApiExpander('navigation', base)) {
|
|
86
|
+
dispatch(getNavigation(base, settings.navDepth));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}, [token, dispatch, pathname, previousToken]);
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<Header menuItems={items}>
|
|
93
|
+
{isHomePageInverse && <BodyClass className="homepage" />}
|
|
94
|
+
<Header.TopHeader>
|
|
95
|
+
<Header.TopItem className="official-union">
|
|
96
|
+
<Image src={eeaFlag} alt="eea flag"></Image>
|
|
97
|
+
<Header.TopDropdownMenu
|
|
98
|
+
text="An official website of the European Union | How do you know?"
|
|
99
|
+
tabletText="EEA information systems"
|
|
100
|
+
mobileText=" "
|
|
101
|
+
icon="chevron down"
|
|
102
|
+
aria-label="dropdown"
|
|
103
|
+
className=""
|
|
104
|
+
viewportWidth={width}
|
|
105
|
+
>
|
|
106
|
+
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}
|
|
107
|
+
<div
|
|
108
|
+
className="content"
|
|
109
|
+
onClick={(evt) => evt.stopPropagation()}
|
|
110
|
+
onKeyDown={(evt) => evt.stopPropagation()}
|
|
111
|
+
>
|
|
112
|
+
<p>
|
|
113
|
+
All official European Union website addresses are in the{' '}
|
|
114
|
+
<b>europa.eu</b> domain.
|
|
115
|
+
</p>
|
|
116
|
+
<a
|
|
117
|
+
href="https://europa.eu/european-union/contact/institutions-bodies_en"
|
|
118
|
+
target="_blank"
|
|
119
|
+
rel="noopener"
|
|
120
|
+
onKeyDown={(evt) => evt.stopPropagation()}
|
|
121
|
+
>
|
|
122
|
+
See all EU institutions and bodies
|
|
123
|
+
</a>
|
|
124
|
+
</div>
|
|
125
|
+
</Header.TopDropdownMenu>
|
|
126
|
+
</Header.TopItem>
|
|
127
|
+
|
|
128
|
+
{!!headerOpts.partnerLinks && (
|
|
129
|
+
<Header.TopItem>
|
|
130
|
+
<Header.TopDropdownMenu
|
|
131
|
+
id="theme-sites"
|
|
132
|
+
text={headerOpts.partnerLinks.title}
|
|
133
|
+
viewportWidth={width}
|
|
134
|
+
>
|
|
135
|
+
<div className="wrapper">
|
|
136
|
+
{headerOpts.partnerLinks.links.map((item, index) => (
|
|
137
|
+
<Dropdown.Item key={index}>
|
|
138
|
+
<a
|
|
139
|
+
href={item.href}
|
|
140
|
+
className="site"
|
|
141
|
+
target="_blank"
|
|
142
|
+
rel="noopener"
|
|
143
|
+
onKeyDown={(evt) => evt.stopPropagation()}
|
|
144
|
+
>
|
|
145
|
+
{item.title}
|
|
146
|
+
</a>
|
|
147
|
+
</Dropdown.Item>
|
|
148
|
+
))}
|
|
149
|
+
</div>
|
|
150
|
+
</Header.TopDropdownMenu>
|
|
151
|
+
</Header.TopItem>
|
|
152
|
+
)}
|
|
153
|
+
|
|
154
|
+
{config.settings.isMultilingual && (
|
|
155
|
+
<Header.TopDropdownMenu
|
|
156
|
+
id="language-switcher"
|
|
157
|
+
className="item"
|
|
158
|
+
hasLanguageDropdown={
|
|
159
|
+
config.settings.supportedLanguages.length > 1 &&
|
|
160
|
+
config.settings.hasLanguageDropdown
|
|
161
|
+
}
|
|
162
|
+
text={`${language.toUpperCase()}`}
|
|
163
|
+
mobileText={`${language.toUpperCase()}`}
|
|
164
|
+
icon={
|
|
165
|
+
<Image src={globeIcon} alt="language dropdown globe icon"></Image>
|
|
166
|
+
}
|
|
167
|
+
viewportWidth={width}
|
|
168
|
+
>
|
|
169
|
+
<ul
|
|
170
|
+
className="wrapper language-list"
|
|
171
|
+
role="listbox"
|
|
172
|
+
aria-label="language switcher"
|
|
173
|
+
>
|
|
174
|
+
{eea.languages.map((item, index) => (
|
|
175
|
+
<Dropdown.Item
|
|
176
|
+
as="li"
|
|
177
|
+
key={index}
|
|
178
|
+
text={
|
|
179
|
+
<span>
|
|
180
|
+
{item.name}
|
|
181
|
+
<span className="country-code">
|
|
182
|
+
{item.code.toUpperCase()}
|
|
183
|
+
</span>
|
|
184
|
+
</span>
|
|
185
|
+
}
|
|
186
|
+
onClick={() => {
|
|
187
|
+
const translation = find(translations, {
|
|
188
|
+
language: item.code,
|
|
189
|
+
});
|
|
190
|
+
const to = translation
|
|
191
|
+
? flattenToAppURL(translation['@id'])
|
|
192
|
+
: `/${item.code}`;
|
|
193
|
+
setLanguage(item.code);
|
|
194
|
+
history.push(to);
|
|
195
|
+
}}
|
|
196
|
+
></Dropdown.Item>
|
|
197
|
+
))}
|
|
198
|
+
</ul>
|
|
199
|
+
</Header.TopDropdownMenu>
|
|
200
|
+
)}
|
|
201
|
+
</Header.TopHeader>
|
|
202
|
+
<Header.Main
|
|
203
|
+
pathname={pathname}
|
|
204
|
+
headerSearchBox={headerSearchBox}
|
|
205
|
+
inverted={isHomePageInverse ? true : false}
|
|
206
|
+
transparency={isHomePageInverse ? true : false}
|
|
207
|
+
logo={
|
|
208
|
+
<div {...(isSubsite ? { className: 'logo-wrapper' } : {})}>
|
|
209
|
+
<Logo
|
|
210
|
+
src={isHomePageInverse ? logoWhite : logo}
|
|
211
|
+
title={eea.websiteTitle}
|
|
212
|
+
alt={eea.organisationName}
|
|
213
|
+
url={eea.logoTargetUrl}
|
|
214
|
+
/>
|
|
215
|
+
|
|
216
|
+
{!!subsite && subsite.title && (
|
|
217
|
+
<UniversalLink item={subsite} className="subsite-logo">
|
|
218
|
+
{subsite.subsite_logo ? (
|
|
219
|
+
<Image
|
|
220
|
+
src={subsite.subsite_logo.scales.mini.download}
|
|
221
|
+
alt={subsite.title}
|
|
222
|
+
/>
|
|
223
|
+
) : (
|
|
224
|
+
subsite.title
|
|
225
|
+
)}
|
|
226
|
+
</UniversalLink>
|
|
227
|
+
)}
|
|
228
|
+
</div>
|
|
229
|
+
}
|
|
230
|
+
menuItems={items}
|
|
231
|
+
renderGlobalMenuItem={(item, { onClick }) => (
|
|
232
|
+
<a
|
|
233
|
+
href={item.url || '/'}
|
|
234
|
+
title={item.title}
|
|
235
|
+
onClick={(e) => {
|
|
236
|
+
e.preventDefault();
|
|
237
|
+
onClick(e, item);
|
|
238
|
+
}}
|
|
239
|
+
>
|
|
240
|
+
{item.title}
|
|
241
|
+
</a>
|
|
242
|
+
)}
|
|
243
|
+
renderMenuItem={(item, options, props) => (
|
|
244
|
+
<UniversalLink
|
|
245
|
+
href={item.url || '/'}
|
|
246
|
+
title={item.nav_title || item.title}
|
|
247
|
+
{...(options || {})}
|
|
248
|
+
className={cx(options?.className, {
|
|
249
|
+
active: item.url === router_pathname,
|
|
250
|
+
})}
|
|
251
|
+
>
|
|
252
|
+
{props?.iconPosition !== 'right' && props?.children}
|
|
253
|
+
<span>{item.nav_title || item.title}</span>
|
|
254
|
+
{props?.iconPosition === 'right' && props?.children}
|
|
255
|
+
</UniversalLink>
|
|
256
|
+
)}
|
|
257
|
+
></Header.Main>
|
|
258
|
+
</Header>
|
|
259
|
+
);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
export default compose(
|
|
263
|
+
withRouter,
|
|
264
|
+
connect(
|
|
265
|
+
(state) => ({
|
|
266
|
+
token: state.userSession.token,
|
|
267
|
+
items: state.navigation.items,
|
|
268
|
+
subsite: state.content.data?.['@components']?.subsite,
|
|
269
|
+
}),
|
|
270
|
+
{ getNavigation },
|
|
271
|
+
),
|
|
272
|
+
)(EEAHeader);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const useCopyToClipboard = (text) => {
|
|
4
|
+
const [copyStatus, setCopyStatus] = React.useState('inactive');
|
|
5
|
+
const copy = React.useCallback(() => {
|
|
6
|
+
navigator.clipboard.writeText(text).then(
|
|
7
|
+
() => setCopyStatus('copied'),
|
|
8
|
+
() => setCopyStatus('failed'),
|
|
9
|
+
);
|
|
10
|
+
}, [text]);
|
|
11
|
+
|
|
12
|
+
React.useEffect(() => {
|
|
13
|
+
if (copyStatus === 'inactive') {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const timeout = setTimeout(() => setCopyStatus('inactive'), 3000);
|
|
18
|
+
|
|
19
|
+
return () => clearTimeout(timeout);
|
|
20
|
+
}, [copyStatus]);
|
|
21
|
+
|
|
22
|
+
return [copyStatus, copy];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default useCopyToClipboard;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const useOutsideClick = (ref, callback) => {
|
|
4
|
+
const handleClick = (e) => {
|
|
5
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
6
|
+
callback();
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
React.useEffect(() => {
|
|
11
|
+
document.addEventListener('mousedown', handleClick);
|
|
12
|
+
return () => {
|
|
13
|
+
document.removeEventListener('mousedown', handleClick);
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
return [ref];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default useOutsideClick;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 32C25.732 32 32 25.732 32 18C32 10.268 25.732 4 18 4C10.268 4 4 10.268 4 18C4 25.732 10.268 32 18 32ZM27.4141 18.0001L19.707 25.7072L18.2927 24.293L23.5857 19H8V17H23.5856L18.2927 11.7072L19.707 10.293L27.4141 18.0001Z"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" d="M6 9V12H8H28H30V9H6ZM5 14H7V29C7 29.5523 7.44772 30 8 30H28C28.5523 30 29 29.5523 29 29V14H31C31.5523 14 32 13.5523 32 13V8C32 7.44772 31.5523 7 31 7H5C4.44772 7 4 7.44772 4 8V13C4 13.5523 4.44771 14 5 14ZM9 28V14H27V28H9ZM14 18H22C22.5523 18 23 18.4477 23 19C23 19.5523 22.5523 20 22 20H14C13.4477 20 13 19.5523 13 19C13 18.4477 13.4477 18 14 18ZM11 19C11 17.3431 12.3431 16 14 16H22C23.6569 16 25 17.3431 25 19C25 20.6569 23.6569 22 22 22H14C12.3431 22 11 20.6569 11 19Z" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="30" height="30" viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 8V9V22H26.0312C26.5515 22 27 21.5672 27 21V8H8ZM8 24H6H4C2.34315 24 1 22.6569 1 21V11C1 9.89543 1.89543 9 3 9H6V7.66667C6 6.7611 6.72674 6 7.65625 6H27.3438C28.2732 6 29 6.76105 29 7.66667V21C29 22.6419 27.6856 24 26.0312 24H8ZM6 11H3V21C3 21.5523 3.44772 22 4 22H6V11ZM11 11V13H16V11H11ZM10 9C9.44772 9 9 9.44772 9 10V14C9 14.5523 9.44771 15 10 15H17C17.5523 15 18 14.5523 18 14V10C18 9.44772 17.5523 9 17 9H10ZM19 11C19 10.4477 19.4477 10 20 10H25C25.5523 10 26 10.4477 26 11C26 11.5523 25.5523 12 25 12H20C19.4477 12 19 11.5523 19 11ZM20 13C19.4477 13 19 13.4477 19 14C19 14.5523 19.4477 15 20 15H25C25.5523 15 26 14.5523 26 14C26 13.4477 25.5523 13 25 13H20ZM9 17C9 16.4477 9.44772 16 10 16H25C25.5523 16 26 16.4477 26 17C26 17.5523 25.5523 18 25 18H10C9.44771 18 9 17.5523 9 17ZM10 19C9.44772 19 9 19.4477 9 20C9 20.5523 9.44771 21 10 21H25C25.5523 21 26 20.5523 26 20C26 19.4477 25.5523 19 25 19H10Z" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M23 7H7V23H23V7ZM7 5H5V7V23V25H7H23H25V23V7V5H23H7ZM9 10H15V12H9V10ZM21 16V14H9V16H21ZM21 18V20H9V18H21ZM29 11H27V9H31V31H9V27H11V29H29V11Z" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9309 24.0522C20.2716 25.2765 18.2202 26 16 26C10.4772 26 6 21.5228 6 16C6 10.4772 10.4772 6 16 6C21.5228 6 26 10.4772 26 16C26 18.2202 25.2765 20.2716 24.0522 21.9309L28.8389 26.7175C29.4247 27.3033 29.4247 28.2531 28.8389 28.8389C28.2531 29.4246 27.3033 29.4246 26.7175 28.8389L21.9309 24.0522ZM23 16C23 19.866 19.866 23 16 23C12.134 23 9 19.866 9 16C9 12.134 12.134 9 16 9C19.866 9 23 12.134 23 16Z" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" d="M13.5066 12.948L3.40259 14.416L10.7136 21.543L8.98859 31.607L18.0256 26.856L27.0636 31.607L25.3366 21.543L32.6486 14.416L22.5446 12.948L18.0256 3.79199L13.5066 12.948Z"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.0586 24.5466C29.2864 22.6639 30 20.4153 30 18C30 11.3726 24.6274 6 18 6C11.3726 6 6 11.3726 6 18C6 20.155 6.56808 22.1774 7.56265 23.9255C10.1493 21.4928 13.6496 20 17.5 20C21.6681 20 25.426 21.7493 28.0586 24.5466ZM26.8119 26.1457C24.537 23.6037 21.2101 22 17.5 22C14.0646 22 10.9577 23.3751 8.71039 25.5968C10.911 28.2847 14.2552 30 18 30C21.4832 30 24.6197 28.516 26.8119 26.1457ZM18 32C25.732 32 32 25.732 32 18C32 10.268 25.732 4 18 4C10.268 4 4 10.268 4 18C4 25.732 10.268 32 18 32ZM18 16C19.6569 16 21 14.6569 21 13C21 11.3431 19.6569 10 18 10C16.3431 10 15 11.3431 15 13C15 14.6569 16.3431 16 18 16ZM18 18C20.7614 18 23 15.7614 23 13C23 10.2386 20.7614 8 18 8C15.2386 8 13 10.2386 13 13C13 15.7614 15.2386 18 18 18Z" />
|
|
3
|
+
</svg>
|