@k-int/stripes-kint-components 5.14.0 → 5.15.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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [5.15.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.14.0...v5.15.0) (2025-02-21)
2
+
3
+
4
+ ### Features
5
+
6
+ * useSettings sections ([0c062bf](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/0c062bf203811078371820b5106b3106982845ad))
7
+
1
8
  # [5.14.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.13.0...v5.14.0) (2025-02-19)
2
9
 
3
10
 
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _reactQuery = require("react-query");
10
10
  var _core = require("@folio/stripes/core");
@@ -15,97 +15,213 @@ var _utils = require("../utils");
15
15
  var _hooks = require("../hooks");
16
16
  var _jsxRuntime = require("react/jsx-runtime");
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
- const useSettings = _ref => {
19
- let {
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
+ // TODO work underway to make the settings hook more useful when trying to render multiple sections at a time
21
+ const useSettings = function () {
22
+ let settingsProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
23
+ const {
20
24
  allowGlobalEdit = true,
21
25
  dynamicPageExclusions,
22
26
  intlKey: passedIntlKey,
23
27
  intlNS: passedIntlNS,
24
28
  labelOverrides = {},
25
- persistentPages,
29
+ pages,
30
+ // If this is present, act completely as a passthrough either in sections OR standalone
31
+ persistentPages = [],
32
+ preventQueries = false,
26
33
  refdataEndpoint,
34
+ renderSingleSection = false,
35
+ // IF SECTIONS == NULL, this prop allows the implementor to render the pageList as a section with label etc
36
+ sectionPermission,
37
+ // If we're rendering sections, this prevents the rendering of said section (works as fallback or prevention for single section)
38
+ sectionRoute,
39
+ sections,
40
+ // if present, should be an array of objects with the SAME shape as the overall props here.
41
+ // If a prop isn't present it can fall back to the "global" prop.
27
42
  settingEndpoint,
28
43
  templateEndpoint
29
- } = _ref;
44
+ } = settingsProps;
30
45
  const ky = (0, _core.useOkapiKy)();
46
+ const stripes = (0, _core.useStripes)();
31
47
  const kintIntl = (0, _hooks.useKintIntl)(passedIntlKey, passedIntlNS);
32
- const queryParams = (0, _utils.generateKiwtQueryParams)({
33
- filters: dynamicPageExclusions?.map(dpe => ({
34
- path: 'section',
35
- comparator: '!=',
36
- value: dpe
37
- })),
38
- perPage: 100,
39
- stats: false
40
- }, {});
41
- const {
42
- data: appSettings = [],
43
- isLoading
44
- } = (0, _reactQuery.useQuery)(['stripes-kint-components', 'useSettings', 'appSettings', settingEndpoint, queryParams], () => ky(`${settingEndpoint}?${queryParams?.join('&')}`).json());
45
- const sections = [...new Set(appSettings.map(s => s.section))];
46
- const dynamic = sections.map(section => {
48
+
49
+ // Set up array of queryParams, pageLists etc etc ready for us to do all the work in a single place
50
+
51
+ const sectionMetaArray = (0, _react.useMemo)(() => {
52
+ const array = [];
53
+ const getSectionQueryProps = sectionProps => {
54
+ const dqp = sectionProps.dynamicPageExclusions ?? dynamicPageExclusions;
55
+ const queryParams = (0, _utils.generateKiwtQueryParams)({
56
+ filters: dqp?.map(dpe => ({
57
+ path: 'section',
58
+ comparator: '!=',
59
+ value: dpe
60
+ })),
61
+ perPage: 100,
62
+ stats: false
63
+ }, {});
64
+ const finalSettingEndpoint = sectionProps.settingEndpoint ?? settingEndpoint;
65
+ const queryKey = ['stripes-kint-components', 'useSettings', 'appSettings', finalSettingEndpoint, queryParams];
66
+ const queryFn = () => ky(`${finalSettingEndpoint}?${queryParams?.join('&')}`).json();
67
+ return {
68
+ queryParams,
69
+ queryKey,
70
+ queryFn
71
+ };
72
+ };
73
+ if ((sections?.length ?? 0) > 0) {
74
+ array.push(...sections.map(section => {
75
+ const querySectionProps = getSectionQueryProps(section);
76
+ return {
77
+ ...settingsProps,
78
+ // ensure these fall through to section based props
79
+ ...querySectionProps,
80
+ ...section // return original section object
81
+ };
82
+ }));
83
+ } else {
84
+ const querySectionProps = getSectionQueryProps(settingsProps);
85
+ array.push({
86
+ ...settingsProps,
87
+ ...querySectionProps
88
+ });
89
+ }
90
+ return array;
91
+ }, [dynamicPageExclusions, ky, sections, settingEndpoint, settingsProps]);
92
+ const queries = (0, _react.useMemo)(() => sectionMetaArray.map(sma => {
93
+ let enabled = true;
94
+ if (sma.pages || sma.preventQueries || pages || preventQueries) {
95
+ enabled = false;
96
+ }
47
97
  return {
48
- route: section,
49
- label: kintIntl.formatKintMessage({
50
- id: `settings.settingsSection.${(0, _utils.toCamelCase)(section)}`,
51
- fallbackMessage: section
52
- }),
53
- component: props => /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPagePane, {
54
- intlKey: passedIntlKey,
55
- intlNS: passedIntlNS,
56
- sectionName: section,
57
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPage, {
58
- allowEdit: allowGlobalEdit,
98
+ queryKey: sma.queryKey,
99
+ queryFn: sma.queryFn,
100
+ enabled
101
+ };
102
+ }) ?? [], [pages, preventQueries, sectionMetaArray]);
103
+ const queryReturnArray = (0, _reactQuery.useQueries)(queries);
104
+ const [isLoading, setIsLoading] = (0, _react.useState)(true);
105
+ const getDynamicPages = (0, _react.useCallback)((qra, sma) => {
106
+ const pagesFromQueryReturn = [...new Set(qra.data?.map(s => s.section))];
107
+ const dynamic = pagesFromQueryReturn.map(page => {
108
+ const finalSectionRoute = sma.sectionRoute ?? sectionRoute;
109
+ const pageRoute = (finalSectionRoute ? `${finalSectionRoute}/` : '') + page;
110
+ return {
111
+ route: pageRoute,
112
+ label: kintIntl.formatKintMessage({
113
+ id: `settings.settingsSection.${(0, _utils.toCamelCase)(page)}`,
114
+ fallbackMessage: page
115
+ }),
116
+ component: props => /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPagePane, {
59
117
  intlKey: passedIntlKey,
60
118
  intlNS: passedIntlNS,
61
- labelOverrides: labelOverrides,
62
- sectionName: section,
63
- ...props
119
+ sectionName: page,
120
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPage, {
121
+ allowEdit: allowGlobalEdit,
122
+ intlKey: passedIntlKey,
123
+ intlNS: passedIntlNS,
124
+ labelOverrides: labelOverrides,
125
+ sectionName: page,
126
+ ...props
127
+ })
64
128
  })
65
- })
66
- };
67
- });
68
- const pageList = persistentPages.concat(dynamic).sort(_utils.sortByLabel);
69
- const intlKey = (0, _hooks.useIntlKey)(passedIntlKey, passedIntlNS);
70
- const SettingsContextProvider = _ref2 => {
71
- let {
72
- children
73
- } = _ref2;
74
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_contexts.SettingsContext.Provider, {
75
- value: {
76
- intlKey,
77
- // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
78
- refdataEndpoint,
79
- settingEndpoint,
80
- templateEndpoint
81
- },
82
- children: children
129
+ };
83
130
  });
84
- };
85
- SettingsContextProvider.propTypes = {
86
- children: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node])
87
- };
131
+ return {
132
+ pages: pagesFromQueryReturn,
133
+ dynamic
134
+ };
135
+ }, [allowGlobalEdit, kintIntl, labelOverrides, passedIntlKey, passedIntlNS, sectionRoute]);
136
+ (0, _react.useEffect)(() => {
137
+ // Handle loading
138
+ if (queryReturnArray.length > 0 && queryReturnArray.every(qra => qra.isLoading === false) && isLoading === true) {
139
+ setIsLoading(false);
140
+ }
141
+ }, [isLoading, queryReturnArray]);
142
+ const finalSections = (0, _react.useMemo)(() => {
143
+ return sectionMetaArray.map((sma, idx) => {
144
+ const SettingsContextProvider = _ref => {
145
+ let {
146
+ children
147
+ } = _ref;
148
+ const intlKey = (0, _hooks.useIntlKey)(passedIntlKey, passedIntlNS);
149
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_contexts.SettingsContext.Provider, {
150
+ value: {
151
+ intlKey: sma.intlKey ?? intlKey,
152
+ // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
153
+ refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
154
+ settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
155
+ templateEndpoint: sma.templateEndpoint ?? templateEndpoint
156
+ },
157
+ children: children
158
+ });
159
+ };
160
+ SettingsContextProvider.propTypes = {
161
+ children: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node])
162
+ };
163
+ const finalPermission = sma.sectionPermission ?? sectionPermission;
164
+ if (!finalPermission || stripes.hasPerm(finalPermission)) {
165
+ const dynamicPagesFromQueryReturn = getDynamicPages(queryReturnArray[idx], sma);
166
+ const finalPages = sma.pages ?? pages ?? (sma.persistentPages ?? persistentPages).concat(dynamicPagesFromQueryReturn.dynamic).sort(_utils.sortByLabel).map(p => {
167
+ return {
168
+ ...p,
169
+ component: pCProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsContextProvider, {
170
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(p.component, {
171
+ ...pCProps
172
+ })
173
+ })
174
+ };
175
+ });
176
+ return {
177
+ ...sma,
178
+ SettingsContextProvider,
179
+ ...dynamicPagesFromQueryReturn,
180
+ pageList: finalPages,
181
+ // DEPRECATED Here for backwards compatibility
182
+ pages: finalPages // ASSUMPTION MADE THAT INDICES REMAIN THE SAME
183
+ };
184
+ }
185
+ return null;
186
+ }).filter(Boolean);
187
+ }, [getDynamicPages, pages, passedIntlKey, passedIntlNS, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
188
+ const pageList = (0, _react.useMemo)(() => {
189
+ let finalPages = null;
190
+ if (finalSections && finalSections.length === 1 && !renderSingleSection) {
191
+ finalPages = pages ?? finalSections[0].pages;
192
+ }
193
+ return finalPages;
194
+ }, [finalSections, pages, renderSingleSection]);
195
+ const passedSections = (0, _react.useMemo)(() => {
196
+ if (finalSections.length > 1 || finalSections.length === 1 && renderSingleSection) {
197
+ return finalSections;
198
+ }
199
+ return null;
200
+ }, [finalSections, renderSingleSection]);
88
201
  const SettingsComponent = props => {
89
202
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_smartComponents.Settings, {
90
203
  pages: pageList,
91
204
  paneTitle: kintIntl.formatKintMessage({
92
205
  id: 'meta.title'
93
206
  }),
207
+ sections: passedSections,
94
208
  ...props
95
209
  });
96
210
  };
97
- const SettingsComponentWithContext = props => {
98
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsContextProvider, {
99
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsComponent, {
100
- ...props
101
- })
102
- });
103
- };
104
211
  return {
105
212
  isLoading,
106
213
  pageList,
107
- SettingsComponent: SettingsComponentWithContext,
108
- SettingsContextProvider
214
+ sections: finalSections,
215
+ SettingsComponent,
216
+ // This doesn't make much sense if there is more than one section, here to avoid breaking changes
217
+ SettingsContextProvider: finalSections && finalSections.length === 1 ? finalSections[0].SettingsContextProvider : _ref2 => {
218
+ let {
219
+ children
220
+ } = _ref2;
221
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
222
+ children: [" ", children, " "]
223
+ });
224
+ }
109
225
  };
110
226
  };
111
227
  var _default = exports.default = useSettings;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-int/stripes-kint-components",
3
- "version": "5.14.0",
3
+ "version": "5.15.0",
4
4
  "description": "Stripes Component library for K-Int specific applications",
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -1,8 +1,8 @@
1
- import React from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
- import { useQuery } from 'react-query';
5
- import { useOkapiKy } from '@folio/stripes/core';
4
+ import { useQueries } from 'react-query';
5
+ import { useOkapiKy, useStripes } from '@folio/stripes/core';
6
6
 
7
7
  import { Settings } from '@folio/stripes/smart-components';
8
8
 
@@ -12,88 +12,207 @@ import { SettingsContext } from '../contexts';
12
12
  import { generateKiwtQueryParams, sortByLabel, toCamelCase } from '../utils';
13
13
  import { useKintIntl, useIntlKey } from '../hooks';
14
14
 
15
- const useSettings = ({
16
- allowGlobalEdit = true,
17
- dynamicPageExclusions,
18
- intlKey: passedIntlKey,
19
- intlNS: passedIntlNS,
20
- labelOverrides = {},
21
- persistentPages,
22
- refdataEndpoint,
23
- settingEndpoint,
24
- templateEndpoint
25
- }) => {
15
+ // TODO work underway to make the settings hook more useful when trying to render multiple sections at a time
16
+ const useSettings = (settingsProps = {}) => {
17
+ const {
18
+ allowGlobalEdit = true,
19
+ dynamicPageExclusions,
20
+ intlKey: passedIntlKey,
21
+ intlNS: passedIntlNS,
22
+ labelOverrides = {},
23
+ pages, // If this is present, act completely as a passthrough either in sections OR standalone
24
+ persistentPages = [],
25
+ preventQueries = false,
26
+ refdataEndpoint,
27
+ renderSingleSection = false, // IF SECTIONS == NULL, this prop allows the implementor to render the pageList as a section with label etc
28
+ sectionPermission, // If we're rendering sections, this prevents the rendering of said section (works as fallback or prevention for single section)
29
+ sectionRoute,
30
+ sections, // if present, should be an array of objects with the SAME shape as the overall props here.
31
+ // If a prop isn't present it can fall back to the "global" prop.
32
+ settingEndpoint,
33
+ templateEndpoint
34
+ } = settingsProps;
35
+
26
36
  const ky = useOkapiKy();
37
+ const stripes = useStripes();
27
38
  const kintIntl = useKintIntl(passedIntlKey, passedIntlNS);
28
39
 
29
- const queryParams = generateKiwtQueryParams({
30
- filters: dynamicPageExclusions?.map(dpe => ({
31
- path: 'section',
32
- comparator: '!=',
33
- value: dpe
34
- })),
35
- perPage: 100,
36
- stats: false
37
- }, {});
38
-
39
- const { data: appSettings = [], isLoading } = useQuery(
40
- ['stripes-kint-components', 'useSettings', 'appSettings', settingEndpoint, queryParams],
41
- () => ky(`${settingEndpoint}?${queryParams?.join('&')}`).json()
42
- );
43
-
44
- const sections = [...new Set(appSettings.map(s => s.section))];
45
- const dynamic = sections.map(section => {
46
- return (
47
- {
48
- route: section,
49
- label: kintIntl.formatKintMessage({
50
- id: `settings.settingsSection.${toCamelCase(section)}`,
51
- fallbackMessage: section
52
- }),
53
- component: (props) => (
54
- <SettingPagePane
55
- intlKey={passedIntlKey}
56
- intlNS={passedIntlNS}
57
- sectionName={section}
58
- >
59
- <SettingPage
60
- allowEdit={allowGlobalEdit}
40
+ // Set up array of queryParams, pageLists etc etc ready for us to do all the work in a single place
41
+
42
+ const sectionMetaArray = useMemo(() => {
43
+ const array = [];
44
+ const getSectionQueryProps = (sectionProps) => {
45
+ const dqp = sectionProps.dynamicPageExclusions ?? dynamicPageExclusions;
46
+ const queryParams = generateKiwtQueryParams({
47
+ filters: dqp?.map(dpe => ({
48
+ path: 'section',
49
+ comparator: '!=',
50
+ value: dpe
51
+ })),
52
+ perPage: 100,
53
+ stats: false
54
+ }, {});
55
+ const finalSettingEndpoint = sectionProps.settingEndpoint ?? settingEndpoint;
56
+ const queryKey = ['stripes-kint-components', 'useSettings', 'appSettings', finalSettingEndpoint, queryParams];
57
+ const queryFn = () => ky(`${finalSettingEndpoint}?${queryParams?.join('&')}`).json();
58
+
59
+ return { queryParams, queryKey, queryFn };
60
+ };
61
+
62
+ if ((sections?.length ?? 0) > 0) {
63
+ array.push(...sections.map((section) => {
64
+ const querySectionProps = getSectionQueryProps(section);
65
+
66
+ return ({
67
+ ...settingsProps, // ensure these fall through to section based props
68
+ ...querySectionProps,
69
+ ...section // return original section object
70
+ });
71
+ }));
72
+ } else {
73
+ const querySectionProps = getSectionQueryProps(settingsProps);
74
+ array.push({
75
+ ...settingsProps,
76
+ ...querySectionProps,
77
+ });
78
+ }
79
+
80
+ return array;
81
+ }, [dynamicPageExclusions, ky, sections, settingEndpoint, settingsProps]);
82
+
83
+ const queries = useMemo(() => sectionMetaArray.map(sma => {
84
+ let enabled = true;
85
+ if (sma.pages || sma.preventQueries || pages || preventQueries) {
86
+ enabled = false;
87
+ }
88
+
89
+ return {
90
+ queryKey: sma.queryKey,
91
+ queryFn: sma.queryFn,
92
+ enabled
93
+ };
94
+ }) ?? [], [pages, preventQueries, sectionMetaArray]);
95
+
96
+ const queryReturnArray = useQueries(queries);
97
+
98
+ const [isLoading, setIsLoading] = useState(true);
99
+
100
+ const getDynamicPages = useCallback((qra, sma) => {
101
+ const pagesFromQueryReturn = [...new Set(qra.data?.map(s => s.section))];
102
+ const dynamic = pagesFromQueryReturn.map(page => {
103
+ const finalSectionRoute = sma.sectionRoute ?? sectionRoute;
104
+ const pageRoute = (finalSectionRoute ? `${finalSectionRoute}/` : '') + page;
105
+ return (
106
+ {
107
+ route: pageRoute,
108
+ label: kintIntl.formatKintMessage({
109
+ id: `settings.settingsSection.${toCamelCase(page)}`,
110
+ fallbackMessage: page
111
+ }),
112
+ component: (props) => (
113
+ <SettingPagePane
61
114
  intlKey={passedIntlKey}
62
115
  intlNS={passedIntlNS}
63
- labelOverrides={labelOverrides}
64
- sectionName={section}
65
- {...props}
66
- />
67
- </SettingPagePane>
68
- )
116
+ sectionName={page}
117
+ >
118
+ <SettingPage
119
+ allowEdit={allowGlobalEdit}
120
+ intlKey={passedIntlKey}
121
+ intlNS={passedIntlNS}
122
+ labelOverrides={labelOverrides}
123
+ sectionName={page}
124
+ {...props}
125
+ />
126
+ </SettingPagePane>
127
+ )
128
+ }
129
+ );
130
+ });
131
+
132
+ return {
133
+ pages: pagesFromQueryReturn,
134
+ dynamic,
135
+ };
136
+ }, [allowGlobalEdit, kintIntl, labelOverrides, passedIntlKey, passedIntlNS, sectionRoute]);
137
+
138
+ useEffect(() => {
139
+ // Handle loading
140
+ if (
141
+ queryReturnArray.length > 0 &&
142
+ queryReturnArray.every(qra => qra.isLoading === false) &&
143
+ isLoading === true
144
+ ) {
145
+ setIsLoading(false);
146
+ }
147
+ }, [isLoading, queryReturnArray]);
148
+
149
+ const finalSections = useMemo(() => {
150
+ return sectionMetaArray.map(((sma, idx) => {
151
+ const SettingsContextProvider = ({ children }) => {
152
+ const intlKey = useIntlKey(passedIntlKey, passedIntlNS);
153
+ return (
154
+ <SettingsContext.Provider
155
+ value={{
156
+ intlKey: sma.intlKey ?? intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
157
+ refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
158
+ settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
159
+ templateEndpoint: sma.templateEndpoint ?? templateEndpoint,
160
+ }}
161
+ >
162
+ {children}
163
+ </SettingsContext.Provider>
164
+ );
165
+ };
166
+
167
+ SettingsContextProvider.propTypes = {
168
+ children: PropTypes.oneOfType([
169
+ PropTypes.func,
170
+ PropTypes.node
171
+ ])
172
+ };
173
+
174
+ const finalPermission = sma.sectionPermission ?? sectionPermission;
175
+ if (!finalPermission || stripes.hasPerm(finalPermission)) {
176
+ const dynamicPagesFromQueryReturn = getDynamicPages(queryReturnArray[idx], sma);
177
+
178
+ const finalPages = sma.pages ?? pages ?? (sma.persistentPages ?? persistentPages).concat(dynamicPagesFromQueryReturn.dynamic).sort(sortByLabel).map((p) => {
179
+ return {
180
+ ...p,
181
+ component: (pCProps) => (
182
+ <SettingsContextProvider>
183
+ <p.component {...pCProps} />
184
+ </SettingsContextProvider>
185
+ )
186
+ };
187
+ });
188
+
189
+ return {
190
+ ...sma,
191
+ SettingsContextProvider,
192
+ ...dynamicPagesFromQueryReturn,
193
+ pageList: finalPages, // DEPRECATED Here for backwards compatibility
194
+ pages: finalPages // ASSUMPTION MADE THAT INDICES REMAIN THE SAME
195
+ };
69
196
  }
70
- );
71
- });
197
+ return null;
198
+ })).filter(Boolean);
199
+ }, [getDynamicPages, pages, passedIntlKey, passedIntlNS, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
72
200
 
73
- const pageList = persistentPages.concat(dynamic).sort(sortByLabel);
201
+ const pageList = useMemo(() => {
202
+ let finalPages = null;
203
+ if (finalSections && finalSections.length === 1 && !renderSingleSection) {
204
+ finalPages = pages ?? finalSections[0].pages;
205
+ }
74
206
 
75
- const intlKey = useIntlKey(passedIntlKey, passedIntlNS);
76
- const SettingsContextProvider = ({ children }) => {
77
- return (
78
- <SettingsContext.Provider
79
- value={{
80
- intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
81
- refdataEndpoint,
82
- settingEndpoint,
83
- templateEndpoint
84
- }}
85
- >
86
- {children}
87
- </SettingsContext.Provider>
88
- );
89
- };
207
+ return finalPages;
208
+ }, [finalSections, pages, renderSingleSection]);
90
209
 
91
- SettingsContextProvider.propTypes = {
92
- children: PropTypes.oneOfType([
93
- PropTypes.func,
94
- PropTypes.node
95
- ])
96
- };
210
+ const passedSections = useMemo(() => {
211
+ if (finalSections.length > 1 || (finalSections.length === 1 && renderSingleSection)) {
212
+ return finalSections;
213
+ }
214
+ return null;
215
+ }, [finalSections, renderSingleSection]);
97
216
 
98
217
  const SettingsComponent = (props) => {
99
218
  return (
@@ -101,26 +220,21 @@ const useSettings = ({
101
220
  pages={pageList}
102
221
  paneTitle={
103
222
  kintIntl.formatKintMessage({
104
- id: 'meta.title'
105
- })}
223
+ id: 'meta.title'
224
+ })}
225
+ sections={passedSections}
106
226
  {...props}
107
227
  />
108
228
  );
109
229
  };
110
230
 
111
- const SettingsComponentWithContext = (props) => {
112
- return (
113
- <SettingsContextProvider>
114
- <SettingsComponent {...props} />
115
- </SettingsContextProvider>
116
- );
117
- };
118
-
119
231
  return {
120
232
  isLoading,
121
233
  pageList,
122
- SettingsComponent: SettingsComponentWithContext,
123
- SettingsContextProvider
234
+ sections: finalSections,
235
+ SettingsComponent,
236
+ // This doesn't make much sense if there is more than one section, here to avoid breaking changes
237
+ SettingsContextProvider: (finalSections && finalSections.length === 1) ? finalSections[0].SettingsContextProvider : ({ children }) => <> { children } </>
124
238
  };
125
239
  };
126
240