homeflowjs 0.9.0 → 0.9.3

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.
@@ -0,0 +1,109 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Loader from '../shared/loader.component';
4
+
5
+ const ArticlesGrid = ({
6
+ handleIsLoading,
7
+ pageSize,
8
+ gridClass,
9
+ articleItem,
10
+ loadMoreButtonContainerClass,
11
+ loadMoreButtonClass,
12
+ loadMoreButtonText,
13
+ // eslint-disable-next-line react/prop-types
14
+ customLoader,
15
+ }) => {
16
+ const [pagination, setPagination] = useState({});
17
+ const [articles, setArticles] = useState([]);
18
+ const [page, setPage] = useState(1);
19
+ const [showMore, setShowMore] = useState(true);
20
+ const [isLoading, setIsLoading] = useState(true);
21
+ const [loadingMore, setLoadingMore] = useState(false);
22
+
23
+ const agent = `${window.location.protocol}//${window.location.host}`;
24
+ const path = window.location.pathname;
25
+ const topicPath = '/articles/topic-';
26
+
27
+ const topic = path.includes(topicPath)
28
+ ? `&topic=${path.slice(path.indexOf(topicPath) + topicPath.length).replace('#/', '')}`
29
+ : '';
30
+ const url = `${agent}/articles.ljson?page=${page}&page_size=${pageSize}${topic}`;
31
+
32
+ const loader = () => {
33
+ if (customLoader) return customLoader;
34
+ return <Loader containerClass={loadMoreButtonContainerClass} />;
35
+ };
36
+
37
+ const fetchArticles = (firstRender = false) => {
38
+ fetch(url)
39
+ .then((response) => response.json())
40
+ .then((json) => {
41
+ setArticles((prev) => [...prev, ...json.articles]);
42
+ setPagination(json.pagination);
43
+ setShowMore(json.pagination.has_next_page);
44
+ setPage(json.pagination.current_page + 1);
45
+ setIsLoading(false);
46
+ setLoadingMore(false);
47
+ if (handleIsLoading && firstRender) handleIsLoading(false);
48
+ })
49
+ .catch((e) => console.log('error', e));
50
+ };
51
+
52
+ const loadMore = () => {
53
+ if (pagination.has_next_page) {
54
+ setLoadingMore(true);
55
+ fetchArticles();
56
+ }
57
+ return false;
58
+ };
59
+
60
+ useEffect(() => {
61
+ if (handleIsLoading) handleIsLoading(true);
62
+ fetchArticles(true);
63
+ }, []);
64
+
65
+ return (
66
+ <>
67
+ <div className={gridClass}>
68
+ {articles.map((article) => articleItem(article))}
69
+ </div>
70
+ <div className={loadMoreButtonContainerClass}>
71
+ {(showMore && !isLoading) && (
72
+ <>
73
+ {loadingMore ? (
74
+ loader()
75
+ ) : (
76
+ <button
77
+ type="button"
78
+ onClick={loadMore}
79
+ className={loadMoreButtonClass}
80
+ >
81
+ {loadMoreButtonText}
82
+ </button>
83
+ )}
84
+ </>
85
+ )}
86
+ </div>
87
+ </>
88
+ );
89
+ };
90
+
91
+ ArticlesGrid.propTypes = {
92
+ gridClass: PropTypes.string.isRequired,
93
+ articleItem: PropTypes.elementType.isRequired,
94
+ handleIsLoading: PropTypes.elementType,
95
+ loadMoreButtonClass: PropTypes.string,
96
+ loadMoreButtonText: PropTypes.string,
97
+ loadMoreButtonContainerClass: PropTypes.string,
98
+ pageSize: PropTypes.number,
99
+ };
100
+
101
+ ArticlesGrid.defaultProps = {
102
+ loadMoreButtonClass: '',
103
+ loadMoreButtonContainerClass: '',
104
+ loadMoreButtonText: 'Load more',
105
+ handleIsLoading: null,
106
+ pageSize: 12,
107
+ };
108
+
109
+ export default ArticlesGrid;
@@ -0,0 +1,5 @@
1
+ import ArticlesGrid from './articles-grid.component';
2
+
3
+ export {
4
+ ArticlesGrid,
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homeflowjs",
3
- "version": "0.9.0",
3
+ "version": "0.9.3",
4
4
  "description": "JavaScript toolkit for Homeflow themes",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -218,7 +218,11 @@ export default class DraggableMap {
218
218
  if (!store.getState().app.themePreferences.google_maps_api_key) {
219
219
  console.warn('Tried to render a Google map layer without a google maps API key being set in admin.');
220
220
  }
221
- layer = new L.Google('ROADMAP');
221
+ layer = new L.TileLayer(
222
+ 'http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}', {
223
+ subdomains: ['mt0','mt1','mt2','mt3'],
224
+ attribution: '<img src="https://developers.google.com/maps/documentation/images/powered_by_google_on_white.png" alt="Powered by Google" />'
225
+ });
222
226
  }
223
227
 
224
228
  // if a callback has been passed with a custom layer, invoke it
@@ -56,7 +56,11 @@ const SortOrderSelect = (props) => {
56
56
  };
57
57
 
58
58
  return (
59
- <select value={sorted} onChange={handleChange} className={className}>
59
+ <select
60
+ value={sorted || defaultSort}
61
+ onChange={handleChange}
62
+ className={className}
63
+ >
60
64
  {children}
61
65
  </select>
62
66
  );
@@ -1,17 +1,30 @@
1
1
  import React from 'react';
2
+ import PropTypes from 'prop-types';
2
3
 
3
4
  import './loader.styles.scss';
4
5
 
5
- const Loader = ({ className, message }) => (
6
- <div>
7
- <div className={`la-ball-beat la-dark la-2x ${className ? className : ''}`}>
8
- <div></div>
9
- <div></div>
10
- <div></div>
6
+ const Loader = ({ containerClass, className, message }) => (
7
+ <div className={containerClass}>
8
+ <div className={`la-ball-beat la-dark la-2x ${className}`}>
9
+ <div />
10
+ <div />
11
+ <div />
11
12
  </div>
12
13
 
13
14
  {message && <p style={{ marginTop: '10px' }}>{message}</p>}
14
15
  </div>
15
16
  );
16
17
 
18
+ Loader.propTypes = {
19
+ className: PropTypes.string,
20
+ message: PropTypes.string,
21
+ containerClass: PropTypes.string,
22
+ };
23
+
24
+ Loader.defaultProps = {
25
+ className: '',
26
+ message: '',
27
+ containerClass: '',
28
+ };
29
+
17
30
  export default Loader;