gatsby-theme-q3 3.1.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +73 -34
- package/gatsby-browser.js +29 -0
- package/gatsby-config.js +7 -47
- package/gatsby-node.js +0 -1
- package/lib/components/PageWrapper.js +2 -11
- package/lib/components/SearchEngine.js +67 -20
- package/lib/components/Wrapper.js +3 -25
- package/lib/components/__tests__/SearchEngine.test.js +41 -0
- package/lib/components/useSiteMetaData.js +13 -12
- package/package.json +6 -6
- package/src/components/PageWrapper.jsx +1 -13
- package/src/components/SearchEngine.jsx +82 -23
- package/src/components/Wrapper.jsx +3 -27
- package/src/components/__tests__/SearchEngine.test.jsx +58 -0
- package/src/components/useSiteMetaData.js +17 -16
- package/__tests__/config.int.test.js +0 -73
- package/helpers/__tests__/loadContent.unit.test.js +0 -13
- package/helpers/__tests__/pagination.unit.test.js +0 -139
- package/helpers/__tests__/slug.unit.test.js +0 -21
- package/helpers/archive.js +0 -42
- package/helpers/index.js +0 -19
- package/helpers/loadContent.js +0 -45
- package/helpers/loadTheme.js +0 -10
- package/helpers/pagination.js +0 -109
- package/helpers/setup.js +0 -60
- package/helpers/slug.js +0 -31
- package/helpers/slugType.js +0 -24
- package/lib/components/LocaleBundles.js +0 -42
- package/lib/components/useLocale.js +0 -31
- package/src/components/LocaleBundles.jsx +0 -37
- package/src/components/useLocale.js +0 -20
package/helpers/pagination.js
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
const { get } = require('lodash');
|
2
|
-
|
3
|
-
const getId = (v) => get(v, 'contentful_id');
|
4
|
-
|
5
|
-
const genCursor = (a = [], i = 0) => ({
|
6
|
-
isFirst: i === 0,
|
7
|
-
isLast: i === a.length - 1,
|
8
|
-
next: a[i + 1],
|
9
|
-
prev: a[i - 1],
|
10
|
-
first: a[0],
|
11
|
-
last: a[a.length - 1],
|
12
|
-
});
|
13
|
-
|
14
|
-
const joinArchiveUrlWithPageNumber = (url, page) =>
|
15
|
-
`${url}/${page}`;
|
16
|
-
|
17
|
-
const getPreviousArchiveUrl = (archiveUrl, page) => {
|
18
|
-
if (page === 2) return archiveUrl;
|
19
|
-
if (page !== 1)
|
20
|
-
return joinArchiveUrlWithPageNumber(
|
21
|
-
archiveUrl,
|
22
|
-
page - 1,
|
23
|
-
);
|
24
|
-
|
25
|
-
return null;
|
26
|
-
};
|
27
|
-
|
28
|
-
const getNextArchiveUrl = (
|
29
|
-
archiveUrl,
|
30
|
-
page,
|
31
|
-
totalNumberOfPages,
|
32
|
-
) => {
|
33
|
-
if (page < totalNumberOfPages)
|
34
|
-
return joinArchiveUrlWithPageNumber(
|
35
|
-
archiveUrl,
|
36
|
-
page + 1,
|
37
|
-
);
|
38
|
-
|
39
|
-
return null;
|
40
|
-
};
|
41
|
-
|
42
|
-
const getCurrentArchiveUrl = (archiveUrl, page) =>
|
43
|
-
page < 2
|
44
|
-
? archiveUrl
|
45
|
-
: joinArchiveUrlWithPageNumber(archiveUrl, page);
|
46
|
-
|
47
|
-
const getNumberOfPages = (
|
48
|
-
entries = [],
|
49
|
-
postsPerPage = 15,
|
50
|
-
) => {
|
51
|
-
const len = Array.isArray(entries) ? entries.length : 0;
|
52
|
-
return Math.ceil(len / postsPerPage);
|
53
|
-
};
|
54
|
-
|
55
|
-
const appendSiblingsToContext = (entries) =>
|
56
|
-
entries.map((node, i) => {
|
57
|
-
const cursor = genCursor(entries, i);
|
58
|
-
const prev = getId(
|
59
|
-
cursor.isFirst ? cursor.last : cursor.prev,
|
60
|
-
);
|
61
|
-
|
62
|
-
const next = getId(
|
63
|
-
cursor.isLast ? cursor.first : cursor.next,
|
64
|
-
);
|
65
|
-
|
66
|
-
return {
|
67
|
-
...node,
|
68
|
-
prev,
|
69
|
-
next,
|
70
|
-
};
|
71
|
-
});
|
72
|
-
|
73
|
-
const paginateArchiveContext = (entries = [], pathName) => {
|
74
|
-
const postsPerPage = 15;
|
75
|
-
const numPages = getNumberOfPages(entries, postsPerPage);
|
76
|
-
const output = [];
|
77
|
-
|
78
|
-
for (let i = 0; i < numPages; i += 1) {
|
79
|
-
const page = i + 1; // always offset for pretty URLs
|
80
|
-
const path = getCurrentArchiveUrl(pathName, page);
|
81
|
-
const prev = getPreviousArchiveUrl(pathName, page);
|
82
|
-
const next = getNextArchiveUrl(
|
83
|
-
pathName,
|
84
|
-
page,
|
85
|
-
numPages,
|
86
|
-
);
|
87
|
-
|
88
|
-
output.push({
|
89
|
-
limit: postsPerPage,
|
90
|
-
skip: i * postsPerPage,
|
91
|
-
total: numPages,
|
92
|
-
pageNum: i,
|
93
|
-
path,
|
94
|
-
next,
|
95
|
-
prev,
|
96
|
-
});
|
97
|
-
}
|
98
|
-
|
99
|
-
return output;
|
100
|
-
};
|
101
|
-
|
102
|
-
module.exports = {
|
103
|
-
appendSiblingsToContext,
|
104
|
-
genCursor,
|
105
|
-
getNextArchiveUrl,
|
106
|
-
getNumberOfPages,
|
107
|
-
getPreviousArchiveUrl,
|
108
|
-
paginateArchiveContext,
|
109
|
-
};
|
package/helpers/setup.js
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
const path = require('path');
|
2
|
-
const fs = require('fs');
|
3
|
-
const { compact, get } = require('lodash');
|
4
|
-
const loadContent = require('./loadContent');
|
5
|
-
const loadTheme = require('./loadTheme');
|
6
|
-
|
7
|
-
const getFile =
|
8
|
-
(directory) =>
|
9
|
-
(possibleFileNames = []) =>
|
10
|
-
possibleFileNames.reduce((acc, curr) => {
|
11
|
-
if (acc) return acc;
|
12
|
-
const filename = path.resolve(directory, curr);
|
13
|
-
return fs.existsSync(filename) ? filename : undefined;
|
14
|
-
}, undefined);
|
15
|
-
|
16
|
-
module.exports = (
|
17
|
-
siteMetadata,
|
18
|
-
plugins = [],
|
19
|
-
workingDirection = process.cwd(),
|
20
|
-
) => {
|
21
|
-
const f = getFile(workingDirection);
|
22
|
-
|
23
|
-
const locale = loadContent(f(['locale', 'lang']));
|
24
|
-
const theme = loadTheme(
|
25
|
-
f(['theme.js', 'gatsby-theme.js', 'mui.js']),
|
26
|
-
);
|
27
|
-
|
28
|
-
return {
|
29
|
-
siteMetadata: {
|
30
|
-
appDirectory: '/app',
|
31
|
-
author: '3merge',
|
32
|
-
description: '',
|
33
|
-
siteUrl: 'https://3merge.ca/',
|
34
|
-
...siteMetadata,
|
35
|
-
},
|
36
|
-
plugins: compact(
|
37
|
-
[
|
38
|
-
{
|
39
|
-
resolve: 'gatsby-theme-q3',
|
40
|
-
options: {
|
41
|
-
icon: f([
|
42
|
-
'static/favicon.png',
|
43
|
-
'static/favicon.jpg',
|
44
|
-
]),
|
45
|
-
|
46
|
-
brandingColor: get(
|
47
|
-
theme,
|
48
|
-
'palette.primary.main',
|
49
|
-
'#000',
|
50
|
-
),
|
51
|
-
|
52
|
-
locale,
|
53
|
-
theme,
|
54
|
-
...siteMetadata,
|
55
|
-
},
|
56
|
-
},
|
57
|
-
].concat(plugins),
|
58
|
-
),
|
59
|
-
};
|
60
|
-
};
|
package/helpers/slug.js
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
const slugify = require('slugify');
|
2
|
-
|
3
|
-
const getSlug = (target) => {
|
4
|
-
const keys = ['slug', 'title', 'name', 'contentful_id'];
|
5
|
-
|
6
|
-
let slug;
|
7
|
-
let i = 0;
|
8
|
-
|
9
|
-
do {
|
10
|
-
const v = target[keys[i]];
|
11
|
-
if (v)
|
12
|
-
slug = slugify(v, {
|
13
|
-
replacement: '-',
|
14
|
-
remove: undefined,
|
15
|
-
lower: true,
|
16
|
-
strict: true,
|
17
|
-
});
|
18
|
-
|
19
|
-
i += 1;
|
20
|
-
} while (!slug);
|
21
|
-
|
22
|
-
return slug;
|
23
|
-
};
|
24
|
-
|
25
|
-
const getDirectoryPath = (v) => {
|
26
|
-
if (typeof v !== 'string') return '/';
|
27
|
-
return v.startsWith('/') ? v : `/${v}`;
|
28
|
-
};
|
29
|
-
|
30
|
-
module.exports = (node = {}, basepath = '/') =>
|
31
|
-
[getDirectoryPath(basepath), getSlug(node)].join('/');
|
package/helpers/slugType.js
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
const slug = require('./slug');
|
2
|
-
|
3
|
-
module.exports = (
|
4
|
-
dir,
|
5
|
-
resourceName,
|
6
|
-
{ createFieldExtension, createTypes },
|
7
|
-
) => {
|
8
|
-
// mirrors reach router prop
|
9
|
-
// an unlikely name otherwise
|
10
|
-
const resolverKey = 'to';
|
11
|
-
|
12
|
-
createFieldExtension({
|
13
|
-
name: resolverKey,
|
14
|
-
extend: () => ({
|
15
|
-
resolve: (source) => slug(source, dir),
|
16
|
-
}),
|
17
|
-
});
|
18
|
-
|
19
|
-
createTypes(`
|
20
|
-
type ${resourceName} implements Node {
|
21
|
-
${resolverKey}: String @${resolverKey}
|
22
|
-
}
|
23
|
-
`);
|
24
|
-
};
|
@@ -1,42 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
|
-
var _q3UiLocale = require("q3-ui-locale");
|
9
|
-
|
10
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
11
|
-
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
-
|
14
|
-
const registeri18ResourceBundles = contentData => {
|
15
|
-
if (!contentData || !('en' in contentData)) return;
|
16
|
-
Object.entries(contentData).forEach(([key, bundle]) => {
|
17
|
-
Object.entries(bundle).forEach(([namespace, data]) => {
|
18
|
-
_q3UiLocale.i18n.addResourceBundle(key, namespace, data, true, true);
|
19
|
-
});
|
20
|
-
});
|
21
|
-
};
|
22
|
-
|
23
|
-
const LocaleBundles = ({
|
24
|
-
children,
|
25
|
-
locale
|
26
|
-
}) => {
|
27
|
-
registeri18ResourceBundles(locale);
|
28
|
-
return children;
|
29
|
-
};
|
30
|
-
|
31
|
-
LocaleBundles.defaultProps = {
|
32
|
-
children: null,
|
33
|
-
locale: {}
|
34
|
-
};
|
35
|
-
LocaleBundles.propTypes = {
|
36
|
-
// eslint-disable-next-line
|
37
|
-
children: _propTypes.default.any,
|
38
|
-
// eslint-disable-next-line
|
39
|
-
locale: _propTypes.default.object
|
40
|
-
};
|
41
|
-
var _default = LocaleBundles;
|
42
|
-
exports.default = _default;
|
@@ -1,31 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
|
-
var _react = _interopRequireDefault(require("react"));
|
9
|
-
|
10
|
-
var _q3UiLocale = require("q3-ui-locale");
|
11
|
-
|
12
|
-
var _q3UiPermissions = require("q3-ui-permissions");
|
13
|
-
|
14
|
-
var _q3UiRest = require("q3-ui-rest");
|
15
|
-
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
|
-
|
18
|
-
const useLocale = () => {
|
19
|
-
var _React$useContext, _React$useContext$sta;
|
20
|
-
|
21
|
-
const profile = (_React$useContext = _react.default.useContext(_q3UiPermissions.AuthContext)) === null || _React$useContext === void 0 ? void 0 : (_React$useContext$sta = _React$useContext.state) === null || _React$useContext$sta === void 0 ? void 0 : _React$useContext$sta.profile;
|
22
|
-
const lng = profile === null || profile === void 0 ? void 0 : profile.lang;
|
23
|
-
(0, _q3UiRest.useTimezoneInterceptor)(profile === null || profile === void 0 ? void 0 : profile.timezone);
|
24
|
-
|
25
|
-
_react.default.useEffect(() => {
|
26
|
-
if (lng && _q3UiLocale.i18n.resolvedLanguage) _q3UiLocale.i18n.changeLanguage(lng);
|
27
|
-
}, [lng]);
|
28
|
-
};
|
29
|
-
|
30
|
-
var _default = useLocale;
|
31
|
-
exports.default = _default;
|
@@ -1,37 +0,0 @@
|
|
1
|
-
import { i18n } from 'q3-ui-locale';
|
2
|
-
import PropTypes from 'prop-types';
|
3
|
-
|
4
|
-
const registeri18ResourceBundles = (contentData) => {
|
5
|
-
if (!contentData || !('en' in contentData)) return;
|
6
|
-
|
7
|
-
Object.entries(contentData).forEach(([key, bundle]) => {
|
8
|
-
Object.entries(bundle).forEach(([namespace, data]) => {
|
9
|
-
i18n.addResourceBundle(
|
10
|
-
key,
|
11
|
-
namespace,
|
12
|
-
data,
|
13
|
-
true,
|
14
|
-
true,
|
15
|
-
);
|
16
|
-
});
|
17
|
-
});
|
18
|
-
};
|
19
|
-
|
20
|
-
const LocaleBundles = ({ children, locale }) => {
|
21
|
-
registeri18ResourceBundles(locale);
|
22
|
-
return children;
|
23
|
-
};
|
24
|
-
|
25
|
-
LocaleBundles.defaultProps = {
|
26
|
-
children: null,
|
27
|
-
locale: {},
|
28
|
-
};
|
29
|
-
|
30
|
-
LocaleBundles.propTypes = {
|
31
|
-
// eslint-disable-next-line
|
32
|
-
children: PropTypes.any,
|
33
|
-
// eslint-disable-next-line
|
34
|
-
locale: PropTypes.object,
|
35
|
-
};
|
36
|
-
|
37
|
-
export default LocaleBundles;
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { i18n } from 'q3-ui-locale';
|
3
|
-
import { AuthContext } from 'q3-ui-permissions';
|
4
|
-
import { useTimezoneInterceptor } from 'q3-ui-rest';
|
5
|
-
|
6
|
-
const useLocale = () => {
|
7
|
-
const profile =
|
8
|
-
React.useContext(AuthContext)?.state?.profile;
|
9
|
-
|
10
|
-
const lng = profile?.lang;
|
11
|
-
|
12
|
-
useTimezoneInterceptor(profile?.timezone);
|
13
|
-
|
14
|
-
React.useEffect(() => {
|
15
|
-
if (lng && i18n.resolvedLanguage)
|
16
|
-
i18n.changeLanguage(lng);
|
17
|
-
}, [lng]);
|
18
|
-
};
|
19
|
-
|
20
|
-
export default useLocale;
|