@opengeoweb/snackbar 9.15.0 → 9.17.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/index.esm.js CHANGED
@@ -3,8 +3,28 @@ import { useDispatch, useSelector } from 'react-redux';
3
3
  import { CustomIconButton, withEggs } from '@opengeoweb/shared';
4
4
  import { Snackbar } from '@mui/material';
5
5
  import { Close } from '@opengeoweb/theme';
6
- import { createEntityAdapter, createSlice, createSelector } from '@reduxjs/toolkit';
7
- import { takeLatest, select, put, delay } from 'redux-saga/effects';
6
+ import 'i18next';
7
+ import { useTranslation } from 'react-i18next';
8
+ import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware } from '@reduxjs/toolkit';
9
+
10
+ var en = {
11
+ "snackbar-close": "Close"
12
+ };
13
+ var fi = {
14
+ "snackbar-close": "ei käännetty"
15
+ };
16
+ var no = {
17
+ "snackbar-close": "Lukk"
18
+ };
19
+ var nl = {
20
+ "snackbar-close": "Sluiten"
21
+ };
22
+ var snackbarTranslations = {
23
+ en: en,
24
+ fi: fi,
25
+ no: no,
26
+ nl: nl
27
+ };
8
28
 
9
29
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
10
30
 
@@ -1104,11 +1124,40 @@ function __rest(s, e) {
1104
1124
  return t;
1105
1125
  }
1106
1126
 
1127
+ function __awaiter(thisArg, _arguments, P, generator) {
1128
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1129
+ return new (P || (P = Promise))(function (resolve, reject) {
1130
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1131
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1132
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1133
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1134
+ });
1135
+ }
1136
+
1107
1137
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1108
1138
  var e = new Error(message);
1109
1139
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1110
1140
  };
1111
1141
 
1142
+ /* *
1143
+ * Licensed under the Apache License, Version 2.0 (the "License");
1144
+ * you may not use this file except in compliance with the License.
1145
+ * You may obtain a copy of the License at
1146
+ *
1147
+ * http://www.apache.org/licenses/LICENSE-2.0
1148
+ *
1149
+ * Unless required by applicable law or agreed to in writing, software
1150
+ * distributed under the License is distributed on an "AS IS" BASIS,
1151
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1152
+ * See the License for the specific language governing permissions and
1153
+ * limitations under the License.
1154
+ *
1155
+ * Copyright 2024 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1156
+ * Copyright 2024 - Finnish Meteorological Institute (FMI)
1157
+ * */
1158
+ const SNACKBAR_NAMESPACE = 'snackbar';
1159
+ const useSnackbarTranslation = () => useTranslation(SNACKBAR_NAMESPACE);
1160
+
1112
1161
  const SnackbarWrapper = _a => {
1113
1162
  var {
1114
1163
  children,
@@ -1117,6 +1166,9 @@ const SnackbarWrapper = _a => {
1117
1166
  id
1118
1167
  } = _a,
1119
1168
  props = __rest(_a, ["children", "isOpen", "onCloseSnackbar", "id"]);
1169
+ const {
1170
+ t
1171
+ } = useSnackbarTranslation();
1120
1172
  return jsxs(Fragment, {
1121
1173
  children: [children, jsx(Snackbar, Object.assign({
1122
1174
  "data-testid": "snackbarComponent",
@@ -1127,7 +1179,7 @@ const SnackbarWrapper = _a => {
1127
1179
  mouseEvent: false
1128
1180
  },
1129
1181
  action: jsx(CustomIconButton, Object.assign({
1130
- "aria-label": "close",
1182
+ "aria-label": t('snackbar-close'),
1131
1183
  "data-testid": "snackbarCloseButton",
1132
1184
  onClick: onCloseSnackbar,
1133
1185
  size: "large",
@@ -1176,9 +1228,9 @@ const slice = createSlice({
1176
1228
  draft,
1177
1229
  // eslint-disable-next-line no-unused-vars
1178
1230
  action) => {},
1179
- // triggerOpenSnackbarBySaga is triggered by the saga to open the snackbar after the current snackbars have all been closed
1231
+ // triggerOpenSnackbarByListener is triggered by the listener to open the snackbar after the current snackbars have all been closed
1180
1232
  // DO NOT CALL THIS ACTION DIRECTLY!
1181
- triggerOpenSnackbarBySaga: (draft, action) => {
1233
+ triggerOpenSnackbarByListener: (draft, action) => {
1182
1234
  const {
1183
1235
  snackbarContent
1184
1236
  } = action.payload;
@@ -1234,10 +1286,10 @@ const getFirstSnackbarMessage = createSelector(getCurrentSnackbarMessages, curre
1234
1286
  });
1235
1287
 
1236
1288
  var selectors = /*#__PURE__*/Object.freeze({
1237
- __proto__: null,
1238
- getSnackbarStore: getSnackbarStore,
1239
- getCurrentSnackbarMessages: getCurrentSnackbarMessages,
1240
- getFirstSnackbarMessage: getFirstSnackbarMessage
1289
+ __proto__: null,
1290
+ getSnackbarStore: getSnackbarStore,
1291
+ getCurrentSnackbarMessages: getCurrentSnackbarMessages,
1292
+ getFirstSnackbarMessage: getFirstSnackbarMessage
1241
1293
  });
1242
1294
 
1243
1295
  /* *
@@ -1258,7 +1310,7 @@ var selectors = /*#__PURE__*/Object.freeze({
1258
1310
  * */
1259
1311
 
1260
1312
  var types = /*#__PURE__*/Object.freeze({
1261
- __proto__: null
1313
+ __proto__: null
1262
1314
  });
1263
1315
 
1264
1316
  var wellKnownSymbol$1 = wellKnownSymbol$3;
@@ -1367,31 +1419,37 @@ if (NOT_GENERIC || INCORRECT_NAME) {
1367
1419
  }
1368
1420
 
1369
1421
  const hideTime = 4000;
1370
- function* openSnackbarSaga(capturedAction) {
1371
- const snackbarMessage = capturedAction.payload.message;
1372
- const currentSnackbarMessages = yield select(getCurrentSnackbarMessages);
1373
- // If there are currently opened snackbars we need to close these first
1374
- if (currentSnackbarMessages.length) {
1375
- yield put(snackbarActions.closeSnackbar());
1376
- }
1377
- // Generate a unique id
1378
- const id = `snackbar${Date.now().toString()}`;
1379
- yield put(snackbarActions.triggerOpenSnackbarBySaga({
1380
- snackbarContent: {
1381
- message: snackbarMessage,
1382
- id
1422
+ const snackbarListener = createListenerMiddleware();
1423
+ snackbarListener.startListening({
1424
+ actionCreator: snackbarActions.openSnackbar,
1425
+ effect: ({
1426
+ payload
1427
+ }, listenerApi) => __awaiter(void 0, void 0, void 0, function* () {
1428
+ listenerApi.cancelActiveListeners();
1429
+ const {
1430
+ message: snackbarMessage
1431
+ } = payload;
1432
+ const currentSnackbarMessages = getCurrentSnackbarMessages(listenerApi.getState());
1433
+ // If there are currently opened snackbars we need to close these first
1434
+ if (currentSnackbarMessages.length) {
1435
+ listenerApi.dispatch(snackbarActions.closeSnackbar());
1383
1436
  }
1384
- }));
1385
- // If no new snackbar is triggered cancelling this saga, hide the snackbar after X seconds
1386
- yield delay(hideTime);
1387
- const currentSnackbarMessagesOpen = yield select(getCurrentSnackbarMessages);
1388
- if (currentSnackbarMessagesOpen.length) {
1389
- yield put(snackbarActions.closeSnackbar());
1390
- }
1391
- }
1392
- function* rootSaga() {
1393
- yield takeLatest(snackbarActions.openSnackbar.type, openSnackbarSaga);
1394
- }
1437
+ // Generate a unique id
1438
+ const id = `snackbar${Date.now().toString()}`;
1439
+ listenerApi.dispatch(snackbarActions.triggerOpenSnackbarByListener({
1440
+ snackbarContent: {
1441
+ message: snackbarMessage,
1442
+ id
1443
+ }
1444
+ }));
1445
+ // If no new snackbar is triggered cancelling this listener, hide the snackbar after X seconds
1446
+ yield listenerApi.delay(hideTime);
1447
+ const currentSnackbarMessagesOpen = getCurrentSnackbarMessages(listenerApi.getState());
1448
+ if (currentSnackbarMessagesOpen.length) {
1449
+ listenerApi.dispatch(snackbarActions.closeSnackbar());
1450
+ }
1451
+ })
1452
+ });
1395
1453
 
1396
1454
  /* *
1397
1455
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1414,7 +1472,7 @@ const snackbarModuleConfig = {
1414
1472
  reducersMap: {
1415
1473
  snackbar: reducer
1416
1474
  },
1417
- sagas: [rootSaga]
1475
+ middlewares: [snackbarListener.middleware]
1418
1476
  };
1419
1477
 
1420
1478
  const SnackbarWrapperConnect = withEggs([snackbarModuleConfig])(props => {
@@ -1431,4 +1489,4 @@ const SnackbarWrapperConnect = withEggs([snackbarModuleConfig])(props => {
1431
1489
  }, props));
1432
1490
  });
1433
1491
 
1434
- export { SnackbarWrapperConnect, snackbarActions, snackbarModuleConfig, reducer as snackbarReducer, rootSaga as snackbarSaga, selectors as snackbarSelectors, types as snackbarTypes };
1492
+ export { SnackbarWrapperConnect, hideTime, snackbarActions, snackbarListener, snackbarModuleConfig, reducer as snackbarReducer, selectors as snackbarSelectors, snackbarTranslations, types as snackbarTypes };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/snackbar",
3
- "version": "9.15.0",
3
+ "version": "9.17.0",
4
4
  "description": "GeoWeb snackbar library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -14,7 +14,8 @@
14
14
  "react-redux": "^8.1.3",
15
15
  "@reduxjs/toolkit": "^1.9.7",
16
16
  "@redux-eggs/core": "^2.2.0",
17
- "redux-saga": "^1.2.3"
17
+ "i18next": "^23.10.1",
18
+ "react-i18next": "^13.5.0"
18
19
  },
19
20
  "peerDependencies": {
20
21
  "react": "18"
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { Store } from '@reduxjs/toolkit';
3
+ interface SnackbarTranslationsWrapperProps {
4
+ children?: React.ReactNode;
5
+ }
6
+ export declare const DemoWrapper: React.FC<SnackbarTranslationsWrapperProps>;
7
+ interface ProviderProps {
8
+ children?: React.ReactNode;
9
+ store: Store;
10
+ }
11
+ export declare const DemoWrapperConnect: React.FC<ProviderProps>;
12
+ export {};
@@ -1,8 +1 @@
1
- import * as React from 'react';
2
- import { Store } from '@reduxjs/toolkit';
3
- interface TestProviderProps {
4
- children?: React.ReactNode;
5
- store: Store;
6
- }
7
- export declare const TestProvider: React.FC<TestProviderProps>;
8
1
  export {};
@@ -1,2 +1,4 @@
1
+ import snackbarTranslations from './locales/snackbar.json';
1
2
  export * from './components/Snackbar';
2
3
  export * from './store';
4
+ export { snackbarTranslations };
@@ -3,4 +3,4 @@ export * as snackbarSelectors from './selectors';
3
3
  export * as snackbarTypes from './types';
4
4
  export * from './config';
5
5
  export { reducer as snackbarReducer } from './reducer';
6
- export { rootSaga as snackbarSaga } from './sagas';
6
+ export * from './listener';
@@ -0,0 +1,3 @@
1
+ import { SnackbarModuleStore } from './types';
2
+ export declare const hideTime = 4000;
3
+ export declare const snackbarListener: import("@reduxjs/toolkit").ListenerMiddlewareInstance<SnackbarModuleStore, import("@reduxjs/toolkit").ThunkDispatch<SnackbarModuleStore, unknown, import("redux").AnyAction>, unknown>;
@@ -1,11 +1,11 @@
1
1
  import { PayloadAction, Draft } from '@reduxjs/toolkit';
2
- import { OpenSnackbarPayload, SnackbarItem, SnackbarState, TriggerOpenSnackbarBySagaPayload } from './types';
2
+ import { OpenSnackbarPayload, SnackbarItem, SnackbarState, TriggerOpenSnackbarByListenerPayload } from './types';
3
3
  export declare const snackbarAdapter: import("@reduxjs/toolkit").EntityAdapter<SnackbarItem>;
4
4
  export declare const initialState: SnackbarState;
5
5
  export declare const reducer: import("redux").Reducer<SnackbarState, import("redux").AnyAction>;
6
6
  export declare const snackbarActions: import("@reduxjs/toolkit").CaseReducerActions<{
7
7
  openSnackbar: (draft: Draft<SnackbarState>, action: PayloadAction<OpenSnackbarPayload>) => void;
8
- triggerOpenSnackbarBySaga: (draft: Draft<SnackbarState>, action: PayloadAction<TriggerOpenSnackbarBySagaPayload>) => void;
8
+ triggerOpenSnackbarByListener: (draft: Draft<SnackbarState>, action: PayloadAction<TriggerOpenSnackbarByListenerPayload>) => void;
9
9
  closeSnackbar: (draft: Draft<SnackbarState>) => void;
10
10
  }, "snackbar">;
11
- export type SnackbarActions = ReturnType<typeof snackbarActions.openSnackbar> | ReturnType<typeof snackbarActions.triggerOpenSnackbarBySaga> | ReturnType<typeof snackbarActions.closeSnackbar>;
11
+ export type SnackbarActions = ReturnType<typeof snackbarActions.openSnackbar> | ReturnType<typeof snackbarActions.triggerOpenSnackbarByListener> | ReturnType<typeof snackbarActions.closeSnackbar>;
@@ -10,6 +10,6 @@ export interface SnackbarModuleStore {
10
10
  export interface OpenSnackbarPayload {
11
11
  message: string;
12
12
  }
13
- export interface TriggerOpenSnackbarBySagaPayload {
13
+ export interface TriggerOpenSnackbarByListenerPayload {
14
14
  snackbarContent: SnackbarItem;
15
15
  }
@@ -0,0 +1,5 @@
1
+ import i18n from 'i18next';
2
+ import { UseTranslationResponse } from 'react-i18next';
3
+ export declare const SNACKBAR_NAMESPACE = "snackbar";
4
+ export declare const initSnackbarI18n: () => void;
5
+ export declare const useSnackbarTranslation: () => UseTranslationResponse<typeof SNACKBAR_NAMESPACE, typeof i18n>;
@@ -1,5 +0,0 @@
1
- import { SagaIterator } from 'redux-saga';
2
- import { SnackbarActions } from './reducer';
3
- export declare function openSnackbarSaga(capturedAction: SnackbarActions): SagaIterator;
4
- export declare function rootSaga(): SagaIterator;
5
- export default rootSaga;