@webiny/app-mailer 0.0.0-unstable.78f581c1d2 β†’ 0.0.0-unstable.7be00a75a9

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/Module.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const Module: () => React.JSX.Element;
package/Module.js ADDED
@@ -0,0 +1,36 @@
1
+ import react, { Suspense, lazy } from "react";
2
+ import { AdminConfig, AdminLayout, HasPermission, Plugins, useRouter } from "@webiny/app-admin";
3
+ import { OverlayLoader } from "@webiny/admin-ui";
4
+ import { usePermission } from "./hooks/usePermission.js";
5
+ import { Routes } from "./routes.js";
6
+ const { Menu: Menu, Route: Route } = AdminConfig;
7
+ const Settings = /*#__PURE__*/ lazy(()=>import("./views/settings/index.js"));
8
+ const Loader = ({ children, ...props })=>/*#__PURE__*/ react.createElement(Suspense, {
9
+ fallback: /*#__PURE__*/ react.createElement(OverlayLoader, null)
10
+ }, /*#__PURE__*/ react.cloneElement(children, props));
11
+ const MailerSettings = ()=>{
12
+ const router = useRouter();
13
+ const { canChangeSettings } = usePermission();
14
+ const changeSettings = canChangeSettings();
15
+ if (!changeSettings) return null;
16
+ return /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(HasPermission, {
17
+ name: "mailer.settings"
18
+ }, /*#__PURE__*/ react.createElement(Route, {
19
+ route: Routes.Settings,
20
+ element: /*#__PURE__*/ react.createElement(AdminLayout, {
21
+ title: "Mailer - Settings"
22
+ }, /*#__PURE__*/ react.createElement(Loader, null, /*#__PURE__*/ react.createElement(Settings, null)))
23
+ }), /*#__PURE__*/ react.createElement(Menu, {
24
+ name: "mailer.settings",
25
+ parent: "settings.system",
26
+ element: /*#__PURE__*/ react.createElement(Menu.Link, {
27
+ text: "Mailer",
28
+ to: router.getLink(Routes.Settings),
29
+ pinnable: true
30
+ })
31
+ })));
32
+ };
33
+ const Module = ()=>/*#__PURE__*/ react.createElement(Plugins, null, /*#__PURE__*/ react.createElement(MailerSettings, null));
34
+ export { Module };
35
+
36
+ //# sourceMappingURL=Module.js.map
package/Module.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Module.js","sources":["../src/Module.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { AdminConfig, Plugins, AdminLayout, useRouter } from \"@webiny/app-admin\";\nimport { HasPermission } from \"@webiny/app-admin\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { usePermission } from \"~/hooks/usePermission.js\";\nimport { Routes } from \"~/routes.js\";\n\nconst { Menu, Route } = AdminConfig;\n\nconst Settings = lazy(\n () =>\n import(\n /* webpackChunkName: \"mailer-settings\" */\n \"~/views/settings/index.js\"\n )\n);\n\ninterface LoaderProps {\n children: React.ReactElement;\n}\n\nconst Loader = ({ children, ...props }: LoaderProps) => (\n <Suspense fallback={<OverlayLoader />}>{React.cloneElement(children, props)}</Suspense>\n);\n\nconst MailerSettings = () => {\n const router = useRouter();\n const { canChangeSettings } = usePermission();\n\n const changeSettings = canChangeSettings();\n\n if (!changeSettings) {\n return null;\n }\n\n return (\n <AdminConfig>\n <HasPermission name={\"mailer.settings\"}>\n <Route\n route={Routes.Settings}\n element={\n <AdminLayout title={\"Mailer - Settings\"}>\n <Loader>\n <Settings />\n </Loader>\n </AdminLayout>\n }\n />\n <Menu\n name={\"mailer.settings\"}\n parent={\"settings.system\"}\n element={\n <Menu.Link\n text={\"Mailer\"}\n to={router.getLink(Routes.Settings)}\n pinnable={true}\n />\n }\n />\n </HasPermission>\n </AdminConfig>\n );\n};\n\nexport const Module = () => {\n return (\n <Plugins>\n <MailerSettings />\n </Plugins>\n );\n};\n"],"names":["Menu","Route","AdminConfig","Settings","lazy","Loader","children","props","Suspense","OverlayLoader","React","MailerSettings","router","useRouter","canChangeSettings","usePermission","changeSettings","HasPermission","Routes","AdminLayout","Module","Plugins"],"mappings":";;;;;AAOA,MAAM,EAAEA,MAAAA,IAAI,EAAEC,OAAAA,KAAK,EAAE,GAAGC;AAExB,MAAMC,WAAW,WAAHA,GAAGC,KACb,IACI,MAAM,CAAN;AAUR,MAAMC,SAAS,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoB,iBAC/C,oBAACC,UAAQA;QAAC,wBAAU,oBAACC,eAAaA;qBAAMC,MAAAA,YAAkB,CAACJ,UAAUC;AAGzE,MAAMI,iBAAiB;IACnB,MAAMC,SAASC;IACf,MAAM,EAAEC,iBAAiB,EAAE,GAAGC;IAE9B,MAAMC,iBAAiBF;IAEvB,IAAI,CAACE,gBACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAACd,aAAWA,MAAAA,WAAAA,GACR,oBAACe,eAAaA;QAAC,MAAM;qBACjB,oBAAChB,OAAKA;QACF,OAAOiB,OAAO,QAAQ;QACtB,uBACI,oBAACC,aAAWA;YAAC,OAAO;yBAChB,oBAACd,QAAMA,MAAAA,WAAAA,GACH,oBAACF,UAAQA;sBAKzB,oBAACH,MAAIA;QACD,MAAM;QACN,QAAQ;QACR,uBACI,oBAACA,KAAK,IAAI;YACN,MAAM;YACN,IAAIY,OAAO,OAAO,CAACM,OAAO,QAAQ;YAClC,UAAU;;;AAOtC;AAEO,MAAME,SAAS,IACX,WAAP,GACI,oBAACC,SAAOA,MAAAA,WAAAA,GACJ,oBAACV,gBAAcA"}
package/README.md CHANGED
@@ -1,22 +1,11 @@
1
1
  # @webiny/app-mailer
2
2
 
3
- [![](https://img.shields.io/npm/dw/@webiny/app-mailer.svg)](https://www.npmjs.com/package/@webiny/app-mailer)
4
- [![](https://img.shields.io/npm/v/@webiny/app-mailer.svg)](https://www.npmjs.com/package/@webiny/app-mailer)
5
- [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
6
- [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
7
6
 
8
- An app for changing the mailer settings.
7
+ πŸ“˜ **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
9
8
 
10
- Use together with [@webiny/api-mailer](../api-mailer) package.
9
+ ---
11
10
 
12
- ## Install
13
-
14
- ```
15
- npm install --save @webiny/app-mailer
16
- ```
17
-
18
- Or if you prefer yarn:
19
-
20
- ```
21
- yarn add @webiny/app-mailer
22
- ```
11
+ _This README file is automatically generated during the publish process._
@@ -1,26 +1,17 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.usePermission = void 0;
7
-
8
- var _appSecurity = require("@webiny/app-security");
9
-
10
- var _react = require("react");
11
-
12
- var usePermission = function usePermission() {
13
- var _useSecurity = (0, _appSecurity.useSecurity)(),
14
- identity = _useSecurity.identity,
15
- getPermission = _useSecurity.getPermission;
16
-
17
- var canChangeSettings = (0, _react.useCallback)(function () {
18
- var permission = getPermission("mailer.settings");
19
- return !!permission;
20
- }, [identity]);
21
- return {
22
- canChangeSettings: canChangeSettings
23
- };
1
+ import { useSecurity } from "@webiny/app-admin";
2
+ import { useCallback } from "react";
3
+ const usePermission = ()=>{
4
+ const { identity, getPermission } = useSecurity();
5
+ const canChangeSettings = useCallback(()=>{
6
+ const permission = getPermission("mailer.settings");
7
+ return !!permission;
8
+ }, [
9
+ identity
10
+ ]);
11
+ return {
12
+ canChangeSettings
13
+ };
24
14
  };
15
+ export { usePermission };
25
16
 
26
- exports.usePermission = usePermission;
17
+ //# sourceMappingURL=usePermission.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["usePermission","useSecurity","identity","getPermission","canChangeSettings","useCallback","permission"],"sources":["usePermission.ts"],"sourcesContent":["import { useSecurity } from \"@webiny/app-security\";\nimport { useCallback } from \"react\";\nimport { MailerSecurityPermission } from \"~/types\";\n\nexport const usePermission = () => {\n const { identity, getPermission } = useSecurity();\n\n const canChangeSettings = useCallback((): boolean => {\n const permission = getPermission<MailerSecurityPermission>(\"mailer.settings\");\n return !!permission;\n }, [identity]);\n\n return {\n canChangeSettings\n };\n};\n"],"mappings":";;;;;;;AAAA;;AACA;;AAGO,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,GAAM;EAC/B,mBAAoC,IAAAC,wBAAA,GAApC;EAAA,IAAQC,QAAR,gBAAQA,QAAR;EAAA,IAAkBC,aAAlB,gBAAkBA,aAAlB;;EAEA,IAAMC,iBAAiB,GAAG,IAAAC,kBAAA,EAAY,YAAe;IACjD,IAAMC,UAAU,GAAGH,aAAa,CAA2B,iBAA3B,CAAhC;IACA,OAAO,CAAC,CAACG,UAAT;EACH,CAHyB,EAGvB,CAACJ,QAAD,CAHuB,CAA1B;EAKA,OAAO;IACHE,iBAAiB,EAAjBA;EADG,CAAP;AAGH,CAXM"}
1
+ {"version":3,"file":"hooks/usePermission.js","sources":["../../src/hooks/usePermission.ts"],"sourcesContent":["import { useSecurity } from \"@webiny/app-admin\";\nimport { useCallback } from \"react\";\nimport type { MailerSecurityPermission } from \"~/types.js\";\n\nexport const usePermission = () => {\n const { identity, getPermission } = useSecurity();\n\n const canChangeSettings = useCallback((): boolean => {\n const permission = getPermission<MailerSecurityPermission>(\"mailer.settings\");\n return !!permission;\n }, [identity]);\n\n return {\n canChangeSettings\n };\n};\n"],"names":["usePermission","identity","getPermission","useSecurity","canChangeSettings","useCallback","permission"],"mappings":";;AAIO,MAAMA,gBAAgB;IACzB,MAAM,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGC;IAEpC,MAAMC,oBAAoBC,YAAY;QAClC,MAAMC,aAAaJ,cAAwC;QAC3D,OAAO,CAAC,CAACI;IACb,GAAG;QAACL;KAAS;IAEb,OAAO;QACHG;IACJ;AACJ"}
package/index.d.ts CHANGED
@@ -1,2 +1 @@
1
- import { Module } from "./plugins/Module";
2
- export { Module };
1
+ export { Module } from "./Module.js";
package/index.js CHANGED
@@ -1,13 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "Module", {
7
- enumerable: true,
8
- get: function get() {
9
- return _Module.Module;
10
- }
11
- });
12
-
13
- var _Module = require("./plugins/Module");
1
+ export { Module } from "./Module.js";
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/app-mailer",
3
- "version": "0.0.0-unstable.78f581c1d2",
4
- "main": "index.js",
3
+ "version": "0.0.0-unstable.7be00a75a9",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
5
9
  "repository": {
6
10
  "type": "git",
7
11
  "url": "https://github.com/webiny/webiny-js.git"
@@ -10,50 +14,35 @@
10
14
  "license": "MIT",
11
15
  "dependencies": {
12
16
  "@apollo/react-components": "3.1.5",
13
- "@babel/runtime": "7.19.0",
14
- "@emotion/core": "10.3.1",
15
- "@webiny/app-admin": "0.0.0-unstable.78f581c1d2",
16
- "@webiny/app-security": "0.0.0-unstable.78f581c1d2",
17
- "@webiny/form": "0.0.0-unstable.78f581c1d2",
18
- "@webiny/ui": "0.0.0-unstable.78f581c1d2",
19
- "@webiny/validation": "0.0.0-unstable.78f581c1d2",
17
+ "@webiny/admin-ui": "0.0.0-unstable.7be00a75a9",
18
+ "@webiny/app-admin": "0.0.0-unstable.7be00a75a9",
19
+ "@webiny/form": "0.0.0-unstable.7be00a75a9",
20
+ "@webiny/validation": "0.0.0-unstable.7be00a75a9",
20
21
  "apollo-cache": "1.3.5",
21
22
  "apollo-client": "2.6.10",
22
23
  "apollo-link": "1.2.14",
23
24
  "apollo-utilities": "1.3.4",
24
- "graphql": "15.8.0",
25
+ "graphql": "16.14.0",
25
26
  "graphql-tag": "2.12.6",
26
- "prop-types": "15.8.1",
27
- "react": "17.0.2",
28
- "react-dom": "17.0.2",
29
- "react-helmet": "6.1.0"
27
+ "react": "18.3.1",
28
+ "react-dom": "18.3.1"
30
29
  },
31
30
  "devDependencies": {
32
- "@babel/cli": "^7.19.3",
33
- "@babel/core": "^7.19.3",
34
- "@babel/preset-env": "^7.19.4",
35
- "@babel/preset-react": "^7.0.0",
36
- "@babel/preset-typescript": "^7.18.6",
37
- "@types/react": "17.0.39",
38
- "@webiny/cli": "^0.0.0-unstable.78f581c1d2",
39
- "@webiny/project-utils": "^0.0.0-unstable.78f581c1d2",
40
- "babel-plugin-emotion": "^9.2.8",
41
- "rimraf": "^3.0.2",
42
- "ttypescript": "^1.5.12",
43
- "typescript": "4.7.4"
31
+ "@types/react": "18.3.29",
32
+ "@webiny/build-tools": "0.0.0-unstable.7be00a75a9",
33
+ "rimraf": "6.1.3",
34
+ "typescript": "6.0.3"
44
35
  },
45
36
  "publishConfig": {
46
- "access": "public",
47
- "directory": "dist"
48
- },
49
- "scripts": {
50
- "build": "yarn webiny run build",
51
- "watch": "yarn webiny run watch"
37
+ "access": "public"
52
38
  },
53
39
  "svgo": {
54
40
  "plugins": {
55
41
  "removeViewBox": false
56
42
  }
57
43
  },
58
- "gitHead": "78f581c1d2e5e6936aa11b9452a66d2a3652a1b2"
44
+ "gitHead": "b8aec8a1be3f25c3b428b357fe1e352c7cbff9ae",
45
+ "webiny": {
46
+ "publishFrom": "dist"
47
+ }
59
48
  }
package/routes.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Route } from "@webiny/app-admin";
2
+ export declare const Routes: {
3
+ Settings: Route<undefined>;
4
+ };
package/routes.js ADDED
@@ -0,0 +1,10 @@
1
+ import { Route } from "@webiny/app-admin";
2
+ const Routes = {
3
+ Settings: new Route({
4
+ name: "Mailer/Settings",
5
+ path: "/mailer/settings"
6
+ })
7
+ };
8
+ export { Routes };
9
+
10
+ //# sourceMappingURL=routes.js.map
package/routes.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sources":["../src/routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n Settings: new Route({\n name: \"Mailer/Settings\",\n path: \"/mailer/settings\"\n })\n};\n"],"names":["Routes","Route"],"mappings":";AAEO,MAAMA,SAAS;IAClB,UAAU,IAAIC,MAAM;QAChB,MAAM;QACN,MAAM;IACV;AACJ"}
package/types.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { SecurityPermission } from "@webiny/app-security/types";
1
+ import { Identity } from "@webiny/app-admin/domain/Identity.js";
2
2
  /**
3
3
  * A base security permission for APW.
4
4
  *
5
5
  * @category SecurityPermission
6
6
  */
7
- export interface MailerSecurityPermission extends SecurityPermission {
7
+ export interface MailerSecurityPermission extends Identity.Permission {
8
8
  changeSettings?: boolean;
9
9
  }
10
10
  /**
@@ -13,6 +13,7 @@ export interface MailerSecurityPermission extends SecurityPermission {
13
13
  */
14
14
  export interface TransportSettings {
15
15
  host: string;
16
+ port?: number;
16
17
  user: string;
17
18
  from: string;
18
19
  replyTo?: string;
package/types.js CHANGED
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
@@ -1,2 +1,2 @@
1
1
  import React from "react";
2
- export declare const Settings: React.FC;
2
+ export declare const Settings: () => React.JSX.Element;
@@ -1,252 +1,203 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
-
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.Settings = void 0;
11
-
12
- var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
13
-
14
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
15
-
16
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
-
18
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
-
20
- var _react = _interopRequireWildcard(require("react"));
21
-
22
- var _appAdmin = require("@webiny/app-admin");
23
-
24
- var _reactComponents = require("@apollo/react-components");
25
-
26
- var _form = require("@webiny/form");
27
-
28
- var _SimpleForm = require("@webiny/app-admin/components/SimpleForm");
29
-
30
- var _Progress = require("@webiny/ui/Progress");
31
-
32
- var _Grid = require("@webiny/ui/Grid");
33
-
34
- var _Input = require("@webiny/ui/Input");
35
-
36
- var _validation = require("@webiny/validation");
37
-
38
- var _Button = require("@webiny/ui/Button");
39
-
40
- var _graphql = require("./graphql");
41
-
42
- var _Alert = require("@webiny/ui/Alert");
43
-
44
- var displayErrors = function displayErrors(errors) {
45
- if (!errors) {
46
- return null;
47
- }
48
-
49
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, errors.map(function (error) {
50
- var field = error.path[0];
51
-
52
- if (!field) {
53
- return null;
54
- }
55
-
56
- return /*#__PURE__*/_react.default.createElement(_Alert.Alert, {
57
- key: "".concat(field),
58
- title: error.message,
59
- type: "danger"
60
- });
61
- }));
1
+ import react, { useEffect, useRef, useState } from "react";
2
+ import { CenteredView, SimpleForm, SimpleFormContent, SimpleFormFooter, SimpleFormHeader, useSnackbar } from "@webiny/app-admin";
3
+ import { Mutation, Query } from "@apollo/react-components";
4
+ import { Form } from "@webiny/form";
5
+ import { validation } from "@webiny/validation";
6
+ import { GET_SETTINGS_QUERY, SAVE_SETTINGS_MUTATION } from "./graphql.js";
7
+ import { Alert, Button, Grid, Input, OverlayLoader } from "@webiny/admin-ui";
8
+ const displayErrors = (errors)=>{
9
+ if (!errors) return null;
10
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, errors.map((error)=>{
11
+ const field = error.path[0];
12
+ if (!field) return null;
13
+ return /*#__PURE__*/ react.createElement(Alert, {
14
+ key: `${field}`,
15
+ title: "Error",
16
+ type: "danger"
17
+ }, error.message);
18
+ }));
62
19
  };
63
-
64
- var Settings = function Settings() {
65
- var _useSnackbar = (0, _appAdmin.useSnackbar)(),
66
- showSnackbar = _useSnackbar.showSnackbar;
67
-
68
- var password = (0, _react.useRef)();
69
-
70
- var _useState = (0, _react.useState)(),
71
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
72
- errors = _useState2[0],
73
- setErrors = _useState2[1];
74
-
75
- (0, _react.useEffect)(function () {
76
- var t = setTimeout(function () {
77
- if (!password.current) {
78
- return;
79
- }
80
-
81
- password.current.value = "";
82
- }, 300);
83
- return function () {
84
- clearTimeout(t);
85
- };
86
- }, []);
87
- return /*#__PURE__*/_react.default.createElement(_reactComponents.Query, {
88
- query: _graphql.GET_SETTINGS_QUERY
89
- }, function (_ref) {
90
- var response = _ref.data,
91
- queryInProgress = _ref.loading;
92
- return /*#__PURE__*/_react.default.createElement(_reactComponents.Mutation, {
93
- mutation: _graphql.SAVE_SETTINGS_MUTATION
94
- }, function (update, result) {
95
- var _ref2 = (response === null || response === void 0 ? void 0 : response.mailer.settings) || {},
96
- settingsData = _ref2.data,
97
- settingsError = _ref2.error;
98
-
99
- var mutationInProgress = result.loading;
100
-
101
- var _onSubmit = /*#__PURE__*/function () {
102
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(data) {
103
- return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
104
- while (1) {
105
- switch (_context.prev = _context.next) {
106
- case 0:
107
- setErrors([]);
108
- _context.next = 3;
109
- return update({
20
+ const Settings = ()=>{
21
+ const { showSnackbar } = useSnackbar();
22
+ const password = useRef(null);
23
+ const [errors, setErrors] = useState();
24
+ useEffect(()=>{
25
+ const t = setTimeout(()=>{
26
+ if (!password.current) return;
27
+ password.current.value = "";
28
+ }, 300);
29
+ return ()=>{
30
+ clearTimeout(t);
31
+ };
32
+ }, []);
33
+ return /*#__PURE__*/ react.createElement(Query, {
34
+ query: GET_SETTINGS_QUERY
35
+ }, ({ data: response, loading: queryInProgress })=>/*#__PURE__*/ react.createElement(Mutation, {
36
+ mutation: SAVE_SETTINGS_MUTATION
37
+ }, (update, result)=>{
38
+ const { data: settingsData, error: settingsError } = response?.mailer.settings || {};
39
+ const settingsSource = settingsData?.source;
40
+ const { loading: mutationInProgress } = result;
41
+ const onSubmit = async (data)=>{
42
+ setErrors([]);
43
+ const response = await update({
110
44
  variables: {
111
- data: data
45
+ data
112
46
  },
113
- update: function update(cache, result) {
114
- var _result$data;
115
-
116
- var data = structuredClone(cache.readQuery({
117
- query: _graphql.GET_SETTINGS_QUERY
118
- }));
119
-
120
- var _ref4 = ((_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.mailer.settings) || {},
121
- updateData = _ref4.data,
122
- updateError = _ref4.error;
123
-
124
- var errors = updateError === null || updateError === void 0 ? void 0 : updateError.data.errors;
125
-
126
- if (errors) {
127
- setErrors(errors);
128
- showSnackbar("Settings not updated! Please check your network and console logs for detailed information.");
129
- return;
130
- }
131
-
132
- data.mailer.settings.data = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingsData), updateData);
133
- cache.writeQuery({
134
- query: _graphql.GET_SETTINGS_QUERY,
135
- data: data
136
- });
137
- showSnackbar("Settings updated successfully.");
47
+ refetchQueries: [
48
+ {
49
+ query: GET_SETTINGS_QUERY
50
+ }
51
+ ],
52
+ awaitRefetchQueries: true
53
+ });
54
+ const saveError = response.data?.mailer.settings.error;
55
+ if (saveError) {
56
+ const validationErrors = saveError.data?.errors;
57
+ if (validationErrors) setErrors(validationErrors);
58
+ showSnackbar("Settings not updated! Please check your network and console logs for detailed information.");
59
+ return;
60
+ }
61
+ showSnackbar("Settings updated successfully.");
62
+ };
63
+ if ("code" === settingsSource) return /*#__PURE__*/ react.createElement(CenteredView, null, /*#__PURE__*/ react.createElement(SimpleForm, null, /*#__PURE__*/ react.createElement(SimpleFormHeader, {
64
+ title: "Mailer Settings"
65
+ }), /*#__PURE__*/ react.createElement(SimpleFormContent, null, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
66
+ span: 12
67
+ }, /*#__PURE__*/ react.createElement(Alert, {
68
+ title: "Managed by code",
69
+ type: "info"
70
+ }, "Mailer settings are managed by code. Edit", " ", /*#__PURE__*/ react.createElement("code", null, "webiny.config.tsx"), " to change them.")), /*#__PURE__*/ react.createElement(Grid.Column, {
71
+ span: 12
72
+ }, /*#__PURE__*/ react.createElement(Input, {
73
+ size: "lg",
74
+ type: "text",
75
+ label: "Hostname",
76
+ value: settingsData?.host ?? "",
77
+ disabled: true
78
+ })), /*#__PURE__*/ react.createElement(Grid.Column, {
79
+ span: 12
80
+ }, /*#__PURE__*/ react.createElement(Input, {
81
+ size: "lg",
82
+ type: "number",
83
+ label: "Port",
84
+ value: String(settingsData?.port ?? ""),
85
+ disabled: true
86
+ })), /*#__PURE__*/ react.createElement(Grid.Column, {
87
+ span: 12
88
+ }, /*#__PURE__*/ react.createElement(Input, {
89
+ size: "lg",
90
+ type: "text",
91
+ label: "User",
92
+ value: settingsData?.user ?? "",
93
+ disabled: true
94
+ })), /*#__PURE__*/ react.createElement(Grid.Column, {
95
+ span: 12
96
+ }, /*#__PURE__*/ react.createElement(Input, {
97
+ size: "lg",
98
+ type: "text",
99
+ label: "From",
100
+ value: settingsData?.from ?? "",
101
+ disabled: true
102
+ })), /*#__PURE__*/ react.createElement(Grid.Column, {
103
+ span: 12
104
+ }, /*#__PURE__*/ react.createElement(Input, {
105
+ size: "lg",
106
+ type: "text",
107
+ label: "Reply-To",
108
+ value: settingsData?.replyTo ?? "",
109
+ disabled: true
110
+ })))), /*#__PURE__*/ react.createElement(SimpleFormFooter, null, "")));
111
+ if (settingsError) return /*#__PURE__*/ react.createElement(SimpleForm, null, /*#__PURE__*/ react.createElement(SimpleFormHeader, {
112
+ title: "Mailer Settings"
113
+ }), /*#__PURE__*/ react.createElement(SimpleFormContent, null, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
114
+ span: 12
115
+ }, /*#__PURE__*/ react.createElement(Alert, {
116
+ title: settingsError.message,
117
+ type: "danger"
118
+ })))), /*#__PURE__*/ react.createElement(SimpleFormFooter, null, ""));
119
+ const passwordValidators = [];
120
+ if (!settingsData?.user) passwordValidators.push(validation.create("required,minLength:5"));
121
+ return /*#__PURE__*/ react.createElement(CenteredView, null, /*#__PURE__*/ react.createElement(Form, {
122
+ data: settingsData || {},
123
+ onSubmit: (data)=>{
124
+ onSubmit(data);
125
+ }
126
+ }, ({ Bind, form })=>/*#__PURE__*/ react.createElement(SimpleForm, null, (queryInProgress || mutationInProgress) && /*#__PURE__*/ react.createElement(OverlayLoader, null), /*#__PURE__*/ react.createElement(SimpleFormHeader, {
127
+ title: "Mailer Settings"
128
+ }), /*#__PURE__*/ react.createElement(SimpleFormContent, null, displayErrors(errors), /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
129
+ span: 12
130
+ }, /*#__PURE__*/ react.createElement(Bind, {
131
+ name: "host",
132
+ validators: [
133
+ validation.create("required,minLength:1")
134
+ ]
135
+ }, /*#__PURE__*/ react.createElement(Input, {
136
+ size: "lg",
137
+ type: "text",
138
+ label: "Hostname"
139
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
140
+ span: 12
141
+ }, /*#__PURE__*/ react.createElement(Bind, {
142
+ name: "port"
143
+ }, /*#__PURE__*/ react.createElement(Input, {
144
+ size: "lg",
145
+ type: "number",
146
+ label: "Port"
147
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
148
+ span: 12
149
+ }, /*#__PURE__*/ react.createElement(Bind, {
150
+ name: "user",
151
+ validators: [
152
+ validation.create("required,minLength:1")
153
+ ]
154
+ }, /*#__PURE__*/ react.createElement(Input, {
155
+ size: "lg",
156
+ type: "text",
157
+ label: "User",
158
+ autoComplete: "new-password"
159
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
160
+ span: 12
161
+ }, /*#__PURE__*/ react.createElement(Bind, {
162
+ name: "password",
163
+ validators: passwordValidators
164
+ }, /*#__PURE__*/ react.createElement(Input, {
165
+ size: "lg",
166
+ label: "Password",
167
+ type: "password",
168
+ autoComplete: "new-password",
169
+ value: "",
170
+ inputRef: password
171
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
172
+ span: 12
173
+ }, /*#__PURE__*/ react.createElement(Bind, {
174
+ name: "from",
175
+ validators: [
176
+ validation.create("required,minLength:1,email")
177
+ ]
178
+ }, /*#__PURE__*/ react.createElement(Input, {
179
+ size: "lg",
180
+ type: "text",
181
+ label: "Mail from"
182
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
183
+ span: 12
184
+ }, /*#__PURE__*/ react.createElement(Bind, {
185
+ name: "replyTo",
186
+ validators: [
187
+ validation.create("email")
188
+ ]
189
+ }, /*#__PURE__*/ react.createElement(Input, {
190
+ size: "lg",
191
+ type: "text",
192
+ label: "Mail reply-to"
193
+ }))))), /*#__PURE__*/ react.createElement(SimpleFormFooter, null, /*#__PURE__*/ react.createElement(Button, {
194
+ text: "Save",
195
+ onClick: (ev)=>{
196
+ form.submit(ev);
138
197
  }
139
- });
140
-
141
- case 3:
142
- case "end":
143
- return _context.stop();
144
- }
145
- }
146
- }, _callee);
198
+ })))));
147
199
  }));
148
-
149
- return function onSubmit(_x) {
150
- return _ref3.apply(this, arguments);
151
- };
152
- }();
153
-
154
- if (settingsError) {
155
- var _settingsError$data;
156
-
157
- return /*#__PURE__*/_react.default.createElement(_appAdmin.CenteredView, null, /*#__PURE__*/_react.default.createElement(_SimpleForm.SimpleFormHeader, {
158
- title: "Mailer Settings"
159
- }), /*#__PURE__*/_react.default.createElement(_Grid.Grid, {
160
- style: {
161
- backgroundColor: "#FFFFFF"
162
- }
163
- }, /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
164
- span: 12
165
- }, /*#__PURE__*/_react.default.createElement(_Alert.Alert, {
166
- title: settingsError.message,
167
- type: "danger"
168
- }), ((_settingsError$data = settingsError.data) === null || _settingsError$data === void 0 ? void 0 : _settingsError$data.description) && /*#__PURE__*/_react.default.createElement("p", null, settingsError.data.description))));
169
- }
170
-
171
- var passwordValidators = [];
172
-
173
- if (!(settingsData !== null && settingsData !== void 0 && settingsData.user)) {
174
- passwordValidators.push(_validation.validation.create("required,minLength:5"));
175
- }
176
-
177
- return /*#__PURE__*/_react.default.createElement(_appAdmin.CenteredView, null, /*#__PURE__*/_react.default.createElement(_form.Form, {
178
- data: settingsData || {},
179
- onSubmit: function onSubmit(data) {
180
- /**
181
- * We are positive that data is TransportSettings.
182
- */
183
- _onSubmit(data);
184
- }
185
- }, function (_ref5) {
186
- var Bind = _ref5.Bind,
187
- form = _ref5.form;
188
- return /*#__PURE__*/_react.default.createElement(_SimpleForm.SimpleForm, null, (queryInProgress || mutationInProgress) && /*#__PURE__*/_react.default.createElement(_Progress.CircularProgress, null), /*#__PURE__*/_react.default.createElement(_SimpleForm.SimpleFormHeader, {
189
- title: "Mailer Settings"
190
- }), /*#__PURE__*/_react.default.createElement(_SimpleForm.SimpleFormContent, null, displayErrors(errors), /*#__PURE__*/_react.default.createElement(_Grid.Grid, null, /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
191
- span: 12
192
- }, /*#__PURE__*/_react.default.createElement(Bind, {
193
- name: "host",
194
- validators: [_validation.validation.create("required,minLength:1")]
195
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
196
- type: "text",
197
- label: "Hostname"
198
- }))), /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
199
- span: 12
200
- }, /*#__PURE__*/_react.default.createElement(Bind, {
201
- name: "port"
202
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
203
- type: "number",
204
- label: "Port"
205
- }))), /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
206
- span: 12
207
- }, /*#__PURE__*/_react.default.createElement(Bind, {
208
- name: "user",
209
- validators: [_validation.validation.create("required,minLength:1")]
210
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
211
- type: "text",
212
- label: "User",
213
- autoComplete: "new-password"
214
- }))), /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
215
- span: 12
216
- }, /*#__PURE__*/_react.default.createElement(Bind, {
217
- name: "password",
218
- validators: passwordValidators
219
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
220
- label: "Password",
221
- type: "password",
222
- autoComplete: "new-password",
223
- value: "" // @ts-ignore
224
- ,
225
- inputRef: password
226
- }))), /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
227
- span: 12
228
- }, /*#__PURE__*/_react.default.createElement(Bind, {
229
- name: "from",
230
- validators: [_validation.validation.create("required,minLength:1,email")]
231
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
232
- type: "text",
233
- label: "Mail from"
234
- }))), /*#__PURE__*/_react.default.createElement(_Grid.Cell, {
235
- span: 12
236
- }, /*#__PURE__*/_react.default.createElement(Bind, {
237
- name: "replyTo",
238
- validators: [_validation.validation.create("email")]
239
- }, /*#__PURE__*/_react.default.createElement(_Input.Input, {
240
- type: "text",
241
- label: "Mail reply-to"
242
- }))))), /*#__PURE__*/_react.default.createElement(_SimpleForm.SimpleFormFooter, null, /*#__PURE__*/_react.default.createElement(_Button.ButtonPrimary, {
243
- onClick: function onClick(ev) {
244
- form.submit(ev);
245
- }
246
- }, "Save Settings")));
247
- }));
248
- });
249
- });
250
200
  };
201
+ export { Settings };
251
202
 
252
- exports.Settings = Settings;
203
+ //# sourceMappingURL=Settings.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["displayErrors","errors","map","error","field","path","message","Settings","useSnackbar","showSnackbar","password","useRef","useState","setErrors","useEffect","t","setTimeout","current","value","clearTimeout","GET_SETTINGS_QUERY","response","data","queryInProgress","loading","SAVE_SETTINGS_MUTATION","update","result","mailer","settings","settingsData","settingsError","mutationInProgress","onSubmit","variables","cache","structuredClone","readQuery","query","updateData","updateError","writeQuery","backgroundColor","description","passwordValidators","user","push","validation","create","Bind","form","ev","submit"],"sources":["Settings.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { CenteredView, useSnackbar } from \"@webiny/app-admin\";\nimport { Mutation, Query } from \"@apollo/react-components\";\nimport { Form } from \"@webiny/form\";\nimport {\n SimpleForm,\n SimpleFormContent,\n SimpleFormFooter,\n SimpleFormHeader\n} from \"@webiny/app-admin/components/SimpleForm\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { Cell, Grid } from \"@webiny/ui/Grid\";\nimport { Input } from \"@webiny/ui/Input\";\nimport { validation } from \"@webiny/validation\";\nimport { ButtonPrimary } from \"@webiny/ui/Button\";\nimport {\n GET_SETTINGS_QUERY,\n SettingsQueryResponse,\n SAVE_SETTINGS_MUTATION,\n SaveSettingsMutationVariables,\n SaveSettingsMutationResponse\n} from \"./graphql\";\nimport { TransportSettings, ValidationError } from \"~/types\";\nimport { Alert } from \"@webiny/ui/Alert\";\nimport { Validator } from \"@webiny/validation/types\";\n\nconst displayErrors = (errors?: ValidationError[]) => {\n if (!errors) {\n return null;\n }\n return (\n <>\n {errors.map(error => {\n const field = error.path[0];\n if (!field) {\n return null;\n }\n return <Alert key={`${field}`} title={error.message} type=\"danger\" />;\n })}\n </>\n );\n};\n\nexport const Settings: React.FC = () => {\n const { showSnackbar } = useSnackbar();\n\n const password = useRef<HTMLInputElement>();\n\n const [errors, setErrors] = useState<ValidationError[] | undefined>();\n\n useEffect(() => {\n const t = setTimeout(() => {\n if (!password.current) {\n return;\n }\n password.current.value = \"\";\n }, 300);\n\n return () => {\n clearTimeout(t);\n };\n }, []);\n\n return (\n <Query<SettingsQueryResponse> query={GET_SETTINGS_QUERY}>\n {({ data: response, loading: queryInProgress }) => (\n <Mutation<SaveSettingsMutationResponse, SaveSettingsMutationVariables>\n mutation={SAVE_SETTINGS_MUTATION}\n >\n {(update, result) => {\n const { data: settingsData, error: settingsError } =\n response?.mailer.settings || {};\n const { loading: mutationInProgress } = result;\n\n const onSubmit = async (data: TransportSettings): Promise<void> => {\n setErrors([]);\n await update({\n variables: {\n data\n },\n update: (cache, result) => {\n const data = structuredClone(\n cache.readQuery({ query: GET_SETTINGS_QUERY })\n );\n\n const { data: updateData, error: updateError } =\n result.data?.mailer.settings || {};\n\n const errors = updateError?.data.errors;\n if (errors) {\n setErrors(errors);\n showSnackbar(\n \"Settings not updated! Please check your network and console logs for detailed information.\"\n );\n return;\n }\n\n data.mailer.settings.data = {\n ...settingsData,\n ...updateData\n };\n\n cache.writeQuery({\n query: GET_SETTINGS_QUERY,\n data\n });\n showSnackbar(\"Settings updated successfully.\");\n }\n });\n };\n if (settingsError) {\n return (\n <CenteredView>\n <SimpleFormHeader title=\"Mailer Settings\" />\n <Grid style={{ backgroundColor: \"#FFFFFF\" }}>\n <Cell span={12}>\n <Alert title={settingsError.message} type=\"danger\" />\n {settingsError.data?.description && (\n <p>{settingsError.data.description}</p>\n )}\n </Cell>\n </Grid>\n </CenteredView>\n );\n }\n\n const passwordValidators: Validator[] = [];\n if (!settingsData?.user) {\n passwordValidators.push(validation.create(\"required,minLength:5\"));\n }\n\n return (\n <CenteredView>\n <Form\n data={settingsData || {}}\n onSubmit={data => {\n /**\n * We are positive that data is TransportSettings.\n */\n onSubmit(data as unknown as TransportSettings);\n }}\n >\n {({ Bind, form }) => (\n <SimpleForm>\n {(queryInProgress || mutationInProgress) && (\n <CircularProgress />\n )}\n <SimpleFormHeader title=\"Mailer Settings\" />\n <SimpleFormContent>\n {displayErrors(errors)}\n <Grid>\n <Cell span={12}>\n <Bind\n name={\"host\"}\n validators={[\n validation.create(\n \"required,minLength:1\"\n )\n ]}\n >\n <Input type=\"text\" label=\"Hostname\" />\n </Bind>\n </Cell>\n <Cell span={12}>\n <Bind name={\"port\"}>\n <Input type=\"number\" label=\"Port\" />\n </Bind>\n </Cell>\n <Cell span={12}>\n <Bind\n name={\"user\"}\n validators={[\n validation.create(\n \"required,minLength:1\"\n )\n ]}\n >\n <Input\n type=\"text\"\n label=\"User\"\n autoComplete=\"new-password\"\n />\n </Bind>\n </Cell>\n <Cell span={12}>\n <Bind\n name={\"password\"}\n validators={passwordValidators}\n >\n <Input\n label=\"Password\"\n type=\"password\"\n autoComplete=\"new-password\"\n value={\"\"}\n // @ts-ignore\n inputRef={password}\n />\n </Bind>\n </Cell>\n <Cell span={12}>\n <Bind\n name={\"from\"}\n validators={[\n validation.create(\n \"required,minLength:1,email\"\n )\n ]}\n >\n <Input type=\"text\" label=\"Mail from\" />\n </Bind>\n </Cell>\n <Cell span={12}>\n <Bind\n name={\"replyTo\"}\n validators={[\n validation.create(\"email\")\n ]}\n >\n <Input\n type=\"text\"\n label=\"Mail reply-to\"\n />\n </Bind>\n </Cell>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>\n <ButtonPrimary\n onClick={ev => {\n form.submit(ev);\n }}\n >\n Save Settings\n </ButtonPrimary>\n </SimpleFormFooter>\n </SimpleForm>\n )}\n </Form>\n </CenteredView>\n );\n }}\n </Mutation>\n )}\n </Query>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"views/settings/Settings.js","sources":["../../../src/views/settings/Settings.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { CenteredView, useSnackbar } from \"@webiny/app-admin\";\nimport { Mutation, Query } from \"@apollo/react-components\";\nimport { Form } from \"@webiny/form\";\nimport {\n SimpleForm,\n SimpleFormContent,\n SimpleFormFooter,\n SimpleFormHeader\n} from \"@webiny/app-admin\";\nimport { validation } from \"@webiny/validation\";\nimport type {\n SaveSettingsMutationResponse,\n SaveSettingsMutationVariables,\n SettingsQueryResponse\n} from \"./graphql.js\";\nimport { GET_SETTINGS_QUERY, SAVE_SETTINGS_MUTATION } from \"./graphql.js\";\nimport type { TransportSettings, ValidationError } from \"~/types.js\";\nimport type { Validator } from \"@webiny/validation/types.js\";\nimport { Alert, Button, Grid, Input, OverlayLoader } from \"@webiny/admin-ui\";\n\nconst displayErrors = (errors?: ValidationError[]) => {\n if (!errors) {\n return null;\n }\n return (\n <>\n {errors.map(error => {\n const field = error.path[0];\n if (!field) {\n return null;\n }\n return (\n <Alert key={`${field}`} title={\"Error\"} type=\"danger\">\n {error.message}\n </Alert>\n );\n })}\n </>\n );\n};\n\nexport const Settings = () => {\n const { showSnackbar } = useSnackbar();\n\n const password = useRef<HTMLInputElement>(null);\n\n const [errors, setErrors] = useState<ValidationError[] | undefined>();\n\n useEffect(() => {\n const t = setTimeout(() => {\n if (!password.current) {\n return;\n }\n password.current.value = \"\";\n }, 300);\n\n return () => {\n clearTimeout(t);\n };\n }, []);\n\n return (\n <Query<SettingsQueryResponse> query={GET_SETTINGS_QUERY}>\n {({ data: response, loading: queryInProgress }) => (\n <Mutation<SaveSettingsMutationResponse, SaveSettingsMutationVariables>\n mutation={SAVE_SETTINGS_MUTATION}\n >\n {(update, result) => {\n const { data: settingsData, error: settingsError } =\n response?.mailer.settings || {};\n const settingsSource = settingsData?.source;\n const { loading: mutationInProgress } = result;\n\n const onSubmit = async (data: TransportSettings): Promise<void> => {\n setErrors([]);\n const response = await update({\n variables: { data },\n refetchQueries: [{ query: GET_SETTINGS_QUERY }],\n awaitRefetchQueries: true\n });\n\n const saveError = response.data?.mailer.settings.error;\n if (saveError) {\n const validationErrors = saveError.data?.errors;\n if (validationErrors) {\n setErrors(validationErrors);\n }\n showSnackbar(\n \"Settings not updated! Please check your network and console logs for detailed information.\"\n );\n return;\n }\n showSnackbar(\"Settings updated successfully.\");\n };\n if (settingsSource === \"code\") {\n return (\n <CenteredView>\n <SimpleForm>\n <SimpleFormHeader title=\"Mailer Settings\" />\n <SimpleFormContent>\n <Grid>\n <Grid.Column span={12}>\n <Alert title=\"Managed by code\" type=\"info\">\n Mailer settings are managed by code. Edit{\" \"}\n <code>webiny.config.tsx</code> to change\n them.\n </Alert>\n </Grid.Column>\n <Grid.Column span={12}>\n <Input\n size=\"lg\"\n type=\"text\"\n label=\"Hostname\"\n value={settingsData?.host ?? \"\"}\n disabled\n />\n </Grid.Column>\n <Grid.Column span={12}>\n <Input\n size=\"lg\"\n type=\"number\"\n label=\"Port\"\n value={String(settingsData?.port ?? \"\")}\n disabled\n />\n </Grid.Column>\n <Grid.Column span={12}>\n <Input\n size=\"lg\"\n type=\"text\"\n label=\"User\"\n value={settingsData?.user ?? \"\"}\n disabled\n />\n </Grid.Column>\n <Grid.Column span={12}>\n <Input\n size=\"lg\"\n type=\"text\"\n label=\"From\"\n value={settingsData?.from ?? \"\"}\n disabled\n />\n </Grid.Column>\n <Grid.Column span={12}>\n <Input\n size=\"lg\"\n type=\"text\"\n label=\"Reply-To\"\n value={settingsData?.replyTo ?? \"\"}\n disabled\n />\n </Grid.Column>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>{\"\"}</SimpleFormFooter>\n </SimpleForm>\n </CenteredView>\n );\n }\n if (settingsError) {\n return (\n <SimpleForm>\n <SimpleFormHeader title=\"Mailer Settings\" />\n <SimpleFormContent>\n <Grid>\n <Grid.Column span={12}>\n <Alert\n title={settingsError.message}\n type=\"danger\"\n />\n </Grid.Column>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>{\"\"}</SimpleFormFooter>\n </SimpleForm>\n );\n }\n\n const passwordValidators: Validator[] = [];\n if (!settingsData?.user) {\n passwordValidators.push(validation.create(\"required,minLength:5\"));\n }\n\n return (\n <CenteredView>\n <Form\n data={settingsData || {}}\n onSubmit={data => {\n /**\n * We are positive that data is TransportSettings.\n */\n onSubmit(data as unknown as TransportSettings);\n }}\n >\n {({ Bind, form }) => (\n <SimpleForm>\n {(queryInProgress || mutationInProgress) && (\n <OverlayLoader />\n )}\n <SimpleFormHeader title=\"Mailer Settings\" />\n <SimpleFormContent>\n {displayErrors(errors)}\n <Grid>\n <Grid.Column span={12}>\n <Bind\n name={\"host\"}\n validators={[\n validation.create(\n \"required,minLength:1\"\n )\n ]}\n >\n <Input\n size={\"lg\"}\n type=\"text\"\n label=\"Hostname\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"port\"}>\n <Input\n size={\"lg\"}\n type=\"number\"\n label=\"Port\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"user\"}\n validators={[\n validation.create(\n \"required,minLength:1\"\n )\n ]}\n >\n <Input\n size={\"lg\"}\n type=\"text\"\n label=\"User\"\n autoComplete=\"new-password\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"password\"}\n validators={passwordValidators}\n >\n <Input\n size={\"lg\"}\n label=\"Password\"\n type=\"password\"\n autoComplete=\"new-password\"\n value={\"\"}\n inputRef={password}\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"from\"}\n validators={[\n validation.create(\n \"required,minLength:1,email\"\n )\n ]}\n >\n <Input\n size={\"lg\"}\n type=\"text\"\n label=\"Mail from\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name={\"replyTo\"}\n validators={[\n validation.create(\"email\")\n ]}\n >\n <Input\n size={\"lg\"}\n type=\"text\"\n label=\"Mail reply-to\"\n />\n </Bind>\n </Grid.Column>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>\n <Button\n text={\"Save\"}\n onClick={ev => {\n form.submit(ev);\n }}\n />\n </SimpleFormFooter>\n </SimpleForm>\n )}\n </Form>\n </CenteredView>\n );\n }}\n </Mutation>\n )}\n </Query>\n );\n};\n"],"names":["displayErrors","errors","error","field","Alert","Settings","showSnackbar","useSnackbar","password","useRef","setErrors","useState","useEffect","t","setTimeout","clearTimeout","Query","GET_SETTINGS_QUERY","response","queryInProgress","Mutation","SAVE_SETTINGS_MUTATION","update","result","settingsData","settingsError","settingsSource","mutationInProgress","onSubmit","data","saveError","validationErrors","CenteredView","SimpleForm","SimpleFormHeader","SimpleFormContent","Grid","Input","String","SimpleFormFooter","passwordValidators","validation","Form","Bind","form","OverlayLoader","Button","ev"],"mappings":";;;;;;;AAqBA,MAAMA,gBAAgB,CAACC;IACnB,IAAI,CAACA,QACD,OAAO;IAEX,OAAO,WAAP,GACI,0CACKA,OAAO,GAAG,CAACC,CAAAA;QACR,MAAMC,QAAQD,MAAM,IAAI,CAAC,EAAE;QAC3B,IAAI,CAACC,OACD,OAAO;QAEX,OAAO,WAAP,GACI,oBAACC,OAAKA;YAAC,KAAK,GAAGD,OAAO;YAAE,OAAO;YAAS,MAAK;WACxCD,MAAM,OAAO;IAG1B;AAGZ;AAEO,MAAMG,WAAW;IACpB,MAAM,EAAEC,YAAY,EAAE,GAAGC;IAEzB,MAAMC,WAAWC,OAAyB;IAE1C,MAAM,CAACR,QAAQS,UAAU,GAAGC;IAE5BC,UAAU;QACN,MAAMC,IAAIC,WAAW;YACjB,IAAI,CAACN,SAAS,OAAO,EACjB;YAEJA,SAAS,OAAO,CAAC,KAAK,GAAG;QAC7B,GAAG;QAEH,OAAO;YACHO,aAAaF;QACjB;IACJ,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACG,OAAKA;QAAwB,OAAOC;OAChC,CAAC,EAAE,MAAMC,QAAQ,EAAE,SAASC,eAAe,EAAE,iBAC1C,oBAACC,UAAQA;YACL,UAAUC;WAET,CAACC,QAAQC;YACN,MAAM,EAAE,MAAMC,YAAY,EAAE,OAAOC,aAAa,EAAE,GAC9CP,UAAU,OAAO,YAAY,CAAC;YAClC,MAAMQ,iBAAiBF,cAAc;YACrC,MAAM,EAAE,SAASG,kBAAkB,EAAE,GAAGJ;YAExC,MAAMK,WAAW,OAAOC;gBACpBnB,UAAU,EAAE;gBACZ,MAAMQ,WAAW,MAAMI,OAAO;oBAC1B,WAAW;wBAAEO;oBAAK;oBAClB,gBAAgB;wBAAC;4BAAE,OAAOZ;wBAAmB;qBAAE;oBAC/C,qBAAqB;gBACzB;gBAEA,MAAMa,YAAYZ,SAAS,IAAI,EAAE,OAAO,SAAS;gBACjD,IAAIY,WAAW;oBACX,MAAMC,mBAAmBD,UAAU,IAAI,EAAE;oBACzC,IAAIC,kBACArB,UAAUqB;oBAEdzB,aACI;oBAEJ;gBACJ;gBACAA,aAAa;YACjB;YACA,IAAIoB,AAAmB,WAAnBA,gBACA,OAAO,WAAP,GACI,oBAACM,cAAYA,MAAAA,WAAAA,GACT,oBAACC,YAAUA,MAAAA,WAAAA,GACP,oBAACC,kBAAgBA;gBAAC,OAAM;8BACxB,oBAACC,mBAAiBA,MAAAA,WAAAA,GACd,oBAACC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAAChC,OAAKA;gBAAC,OAAM;gBAAkB,MAAK;eAAO,6CACG,mBAC1C,oBAAC,cAAK,sBAAwB,oCAItC,oBAACgC,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAACC,OAAKA;gBACF,MAAK;gBACL,MAAK;gBACL,OAAM;gBACN,OAAOb,cAAc,QAAQ;gBAC7B;+BAGR,oBAACY,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAACC,OAAKA;gBACF,MAAK;gBACL,MAAK;gBACL,OAAM;gBACN,OAAOC,OAAOd,cAAc,QAAQ;gBACpC;+BAGR,oBAACY,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAACC,OAAKA;gBACF,MAAK;gBACL,MAAK;gBACL,OAAM;gBACN,OAAOb,cAAc,QAAQ;gBAC7B;+BAGR,oBAACY,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAACC,OAAKA;gBACF,MAAK;gBACL,MAAK;gBACL,OAAM;gBACN,OAAOb,cAAc,QAAQ;gBAC7B;+BAGR,oBAACY,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAACC,OAAKA;gBACF,MAAK;gBACL,MAAK;gBACL,OAAM;gBACN,OAAOb,cAAc,WAAW;gBAChC;iCAKhB,oBAACe,kBAAgBA,MAAE;YAKnC,IAAId,eACA,OAAO,WAAP,GACI,oBAACQ,YAAUA,MAAAA,WAAAA,GACP,oBAACC,kBAAgBA;gBAAC,OAAM;8BACxB,oBAACC,mBAAiBA,MAAAA,WAAAA,GACd,oBAACC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;gBAAC,MAAM;6BACf,oBAAChC,OAAKA;gBACF,OAAOqB,cAAc,OAAO;gBAC5B,MAAK;iCAKrB,oBAACc,kBAAgBA,MAAE;YAK/B,MAAMC,qBAAkC,EAAE;YAC1C,IAAI,CAAChB,cAAc,MACfgB,mBAAmB,IAAI,CAACC,WAAW,MAAM,CAAC;YAG9C,OAAO,WAAP,GACI,oBAACT,cAAYA,MAAAA,WAAAA,GACT,oBAACU,MAAIA;gBACD,MAAMlB,gBAAgB,CAAC;gBACvB,UAAUK,CAAAA;oBAIND,SAASC;gBACb;eAEC,CAAC,EAAEc,IAAI,EAAEC,IAAI,EAAE,iBACZ,oBAACX,YAAUA,MACLd,AAAAA,CAAAA,mBAAmBQ,kBAAiB,mBAClC,oBAACkB,eAAaA,OAAAA,WAAAA,GAElB,oBAACX,kBAAgBA;oBAAC,OAAM;kCACxB,oBAACC,mBAAiBA,MACbnC,cAAcC,SAAAA,WAAAA,GACf,oBAACmC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBACG,MAAM;oBACN,YAAY;wBACRF,WAAW,MAAM,CACb;qBAEP;iCAED,oBAACJ,OAAKA;oBACF,MAAM;oBACN,MAAK;oBACL,OAAM;oCAIlB,oBAACD,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBAAK,MAAM;iCACR,oBAACN,OAAKA;oBACF,MAAM;oBACN,MAAK;oBACL,OAAM;oCAIlB,oBAACD,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBACG,MAAM;oBACN,YAAY;wBACRF,WAAW,MAAM,CACb;qBAEP;iCAED,oBAACJ,OAAKA;oBACF,MAAM;oBACN,MAAK;oBACL,OAAM;oBACN,cAAa;oCAIzB,oBAACD,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBACG,MAAM;oBACN,YAAYH;iCAEZ,oBAACH,OAAKA;oBACF,MAAM;oBACN,OAAM;oBACN,MAAK;oBACL,cAAa;oBACb,OAAO;oBACP,UAAU7B;oCAItB,oBAAC4B,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBACG,MAAM;oBACN,YAAY;wBACRF,WAAW,MAAM,CACb;qBAEP;iCAED,oBAACJ,OAAKA;oBACF,MAAM;oBACN,MAAK;oBACL,OAAM;oCAIlB,oBAACD,KAAK,MAAM;oBAAC,MAAM;iCACf,oBAACO,MAAAA;oBACG,MAAM;oBACN,YAAY;wBACRF,WAAW,MAAM,CAAC;qBACrB;iCAED,oBAACJ,OAAKA;oBACF,MAAM;oBACN,MAAK;oBACL,OAAM;sCAM1B,oBAACE,kBAAgBA,MAAAA,WAAAA,GACb,oBAACO,QAAMA;oBACH,MAAM;oBACN,SAASC,CAAAA;wBACLH,KAAK,MAAM,CAACG;oBAChB;;QAQhC;AAKpB"}
@@ -1,22 +1,25 @@
1
- import { ApiError, TransportSettings, ValidationErrors } from "../../types";
1
+ import type { ApiError, TransportSettings, ValidationErrors } from "../../types.js";
2
+ export type MailerSettingsSource = "code" | "storage" | null;
3
+ /** Settings as they appear in GraphQL responses β€” never includes the password. */
4
+ export type PublicTransportSettings = Omit<TransportSettings, "password"> & {
5
+ source?: MailerSettingsSource;
6
+ };
2
7
  export interface SettingsQueryResponse {
3
8
  mailer: {
4
9
  settings: {
5
- data: TransportSettings | null;
10
+ data: PublicTransportSettings | null;
6
11
  error: ApiError | null;
7
12
  };
8
13
  };
9
14
  }
10
15
  export declare const GET_SETTINGS_QUERY: import("graphql").DocumentNode;
11
16
  export interface SaveSettingsMutationVariables {
12
- data: TransportSettings & {
13
- password?: string;
14
- };
17
+ data: TransportSettings;
15
18
  }
16
19
  export interface SaveSettingsMutationResponse {
17
20
  mailer: {
18
21
  settings: {
19
- data: TransportSettings | null;
22
+ data: PublicTransportSettings | null;
20
23
  error: ApiError<ValidationErrors> | null;
21
24
  };
22
25
  };
@@ -1,21 +1,41 @@
1
- "use strict";
1
+ import graphql_tag from "graphql-tag";
2
+ const SETTINGS_FIELDS = `
3
+ {
4
+ host
5
+ port
6
+ user
7
+ from
8
+ replyTo
9
+ source
10
+ }
11
+ `;
12
+ const ERROR_FIELDS = `
13
+ {
14
+ message
15
+ code
16
+ data
17
+ }
18
+ `;
19
+ const GET_SETTINGS_QUERY = graphql_tag`
20
+ query GetMailerSettings {
21
+ mailer {
22
+ settings: getSettings {
23
+ data ${SETTINGS_FIELDS}
24
+ error ${ERROR_FIELDS}
25
+ }
26
+ }
27
+ }
28
+ `;
29
+ const SAVE_SETTINGS_MUTATION = graphql_tag`
30
+ mutation SaveTransportSettings($data: MailerTransportSettingsInput!) {
31
+ mailer {
32
+ settings: saveSettings(data: $data) {
33
+ data ${SETTINGS_FIELDS}
34
+ error ${ERROR_FIELDS}
35
+ }
36
+ }
37
+ }
38
+ `;
39
+ export { GET_SETTINGS_QUERY, SAVE_SETTINGS_MUTATION };
2
40
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.SAVE_SETTINGS_MUTATION = exports.GET_SETTINGS_QUERY = void 0;
9
-
10
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
-
12
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
13
-
14
- var _templateObject, _templateObject2;
15
-
16
- var SETTINGS_FIELDS = "\n {\n host\n port\n user\n from\n replyTo\n }\n";
17
- var ERROR_FIELDS = "\n {\n message\n code\n data\n }\n";
18
- var GET_SETTINGS_QUERY = (0, _graphqlTag.default)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n query GetMailerSettings {\n mailer {\n settings: getSettings {\n data ", "\n error ", "\n }\n }\n }\n"])), SETTINGS_FIELDS, ERROR_FIELDS);
19
- exports.GET_SETTINGS_QUERY = GET_SETTINGS_QUERY;
20
- var SAVE_SETTINGS_MUTATION = (0, _graphqlTag.default)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n mutation SaveTransportSettings($data: TransportSettingsInput!) {\n mailer {\n settings: saveSettings(data: $data) {\n data ", "\n error ", "\n }\n }\n }\n"])), SETTINGS_FIELDS, ERROR_FIELDS);
21
- exports.SAVE_SETTINGS_MUTATION = SAVE_SETTINGS_MUTATION;
41
+ //# sourceMappingURL=graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SETTINGS_FIELDS","ERROR_FIELDS","GET_SETTINGS_QUERY","gql","SAVE_SETTINGS_MUTATION"],"sources":["graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport { ApiError, TransportSettings, ValidationErrors } from \"~/types\";\n\nconst SETTINGS_FIELDS = `\n {\n host\n port\n user\n from\n replyTo\n }\n`;\n\nconst ERROR_FIELDS = `\n {\n message\n code\n data\n }\n`;\n\nexport interface SettingsQueryResponse {\n mailer: {\n settings: {\n data: TransportSettings | null;\n error: ApiError | null;\n };\n };\n}\nexport const GET_SETTINGS_QUERY = gql`\n query GetMailerSettings {\n mailer {\n settings: getSettings {\n data ${SETTINGS_FIELDS}\n error ${ERROR_FIELDS}\n }\n }\n }\n`;\n\nexport interface SaveSettingsMutationVariables {\n data: TransportSettings & {\n password?: string;\n };\n}\n\nexport interface SaveSettingsMutationResponse {\n mailer: {\n settings: {\n data: TransportSettings | null;\n error: ApiError<ValidationErrors> | null;\n };\n };\n}\nexport const SAVE_SETTINGS_MUTATION = gql`\n mutation SaveTransportSettings($data: TransportSettingsInput!) {\n mailer {\n settings: saveSettings(data: $data) {\n data ${SETTINGS_FIELDS}\n error ${ERROR_FIELDS}\n }\n }\n }\n`;\n"],"mappings":";;;;;;;;;;;AAAA;;;;AAGA,IAAMA,eAAe,8FAArB;AAUA,IAAMC,YAAY,kEAAlB;AAgBO,IAAMC,kBAAkB,OAAGC,mBAAH,qQAIRH,eAJQ,EAKPC,YALO,CAAxB;;AAyBA,IAAMG,sBAAsB,OAAGD,mBAAH,4TAIZH,eAJY,EAKXC,YALW,CAA5B"}
1
+ {"version":3,"file":"views/settings/graphql.js","sources":["../../../src/views/settings/graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport type { ApiError, TransportSettings, ValidationErrors } from \"~/types.js\";\n\nconst SETTINGS_FIELDS = `\n {\n host\n port\n user\n from\n replyTo\n source\n }\n`;\n\nconst ERROR_FIELDS = `\n {\n message\n code\n data\n }\n`;\n\nexport type MailerSettingsSource = \"code\" | \"storage\" | null;\n\n/** Settings as they appear in GraphQL responses β€” never includes the password. */\nexport type PublicTransportSettings = Omit<TransportSettings, \"password\"> & {\n source?: MailerSettingsSource;\n};\n\nexport interface SettingsQueryResponse {\n mailer: {\n settings: {\n data: PublicTransportSettings | null;\n error: ApiError | null;\n };\n };\n}\nexport const GET_SETTINGS_QUERY = gql`\n query GetMailerSettings {\n mailer {\n settings: getSettings {\n data ${SETTINGS_FIELDS}\n error ${ERROR_FIELDS}\n }\n }\n }\n`;\n\nexport interface SaveSettingsMutationVariables {\n data: TransportSettings;\n}\n\nexport interface SaveSettingsMutationResponse {\n mailer: {\n settings: {\n data: PublicTransportSettings | null;\n error: ApiError<ValidationErrors> | null;\n };\n };\n}\nexport const SAVE_SETTINGS_MUTATION = gql`\n mutation SaveTransportSettings($data: MailerTransportSettingsInput!) {\n mailer {\n settings: saveSettings(data: $data) {\n data ${SETTINGS_FIELDS}\n error ${ERROR_FIELDS}\n }\n }\n }\n`;\n"],"names":["SETTINGS_FIELDS","ERROR_FIELDS","GET_SETTINGS_QUERY","gql","SAVE_SETTINGS_MUTATION"],"mappings":";AAGA,MAAMA,kBAAkB,CAAC;;;;;;;;;AASzB,CAAC;AAED,MAAMC,eAAe,CAAC;;;;;;AAMtB,CAAC;AAiBM,MAAMC,qBAAqBC,WAAG,CAAC;;;;qBAIjB,EAAEH,gBAAgB;sBACjB,EAAEC,aAAa;;;;AAIrC,CAAC;AAcM,MAAMG,yBAAyBD,WAAG,CAAC;;;;qBAIrB,EAAEH,gBAAgB;sBACjB,EAAEC,aAAa;;;;AAIrC,CAAC"}
@@ -1,2 +1,2 @@
1
- import { Settings } from "./Settings";
1
+ import { Settings } from "./Settings.js";
2
2
  export default Settings;
@@ -1,11 +1,5 @@
1
- "use strict";
1
+ import { Settings } from "./Settings.js";
2
+ const settings = Settings;
3
+ export default settings;
2
4
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _Settings = require("./Settings");
9
-
10
- var _default = _Settings.Settings;
11
- exports.default = _default;
5
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Settings"],"sources":["index.ts"],"sourcesContent":["import { Settings } from \"./Settings\";\n\nexport default Settings;\n"],"mappings":";;;;;;;AAAA;;eAEeA,kB"}
1
+ {"version":3,"file":"views/settings/index.js","sources":["../../../src/views/settings/index.ts"],"sourcesContent":["import { Settings } from \"./Settings.js\";\n\nexport default Settings;\n"],"names":["Settings"],"mappings":";AAEA,iBAAeA"}
package/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sources":["index.tsx"],"sourcesContent":["import { Module } from \"~/plugins/Module\";\n\nexport { Module };\n"],"mappings":";;;;;;;;;;;;AAAA"}
@@ -1,2 +0,0 @@
1
- import React from "react";
2
- export declare const Module: React.FC;
package/plugins/Module.js DELETED
@@ -1,77 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
- var _interopRequireWildcard3 = require("@babel/runtime/helpers/interopRequireWildcard").default;
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.Module = void 0;
11
-
12
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
-
14
- var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));
15
-
16
- var _react = _interopRequireWildcard3(require("react"));
17
-
18
- var _appAdmin = require("@webiny/app-admin");
19
-
20
- var _appSecurity = require("@webiny/app-security");
21
-
22
- var _AdminLayout = require("@webiny/app-admin/components/AdminLayout");
23
-
24
- var _reactHelmet = _interopRequireDefault(require("react-helmet"));
25
-
26
- var _usePermission2 = require("../hooks/usePermission");
27
-
28
- var _Progress = require("@webiny/ui/Progress");
29
-
30
- var _excluded = ["children"];
31
- var Settings = /*#__PURE__*/(0, _react.lazy)(function () {
32
- return Promise.resolve().then(function () {
33
- return (0, _interopRequireWildcard2.default)(require("../views/settings"));
34
- });
35
- });
36
-
37
- var Loader = function Loader(_ref) {
38
- var children = _ref.children,
39
- props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
40
- return /*#__PURE__*/_react.default.createElement(_react.Suspense, {
41
- fallback: /*#__PURE__*/_react.default.createElement(_Progress.CircularProgress, null)
42
- }, /*#__PURE__*/_react.default.cloneElement(children, props));
43
- };
44
-
45
- var Module = function Module() {
46
- var _usePermission = (0, _usePermission2.usePermission)(),
47
- canChangeSettings = _usePermission.canChangeSettings;
48
-
49
- var changeSettings = canChangeSettings();
50
-
51
- if (!changeSettings) {
52
- return null;
53
- }
54
-
55
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_appAdmin.AddMenu, {
56
- name: "settings"
57
- }, /*#__PURE__*/_react.default.createElement(_appAdmin.AddMenu, {
58
- name: "settings.mailer",
59
- label: "Mailer"
60
- }, /*#__PURE__*/_react.default.createElement(_appAdmin.AddMenu, {
61
- name: "settings.mailer.settings",
62
- label: "Settings",
63
- path: "/mailer/settings"
64
- }))), /*#__PURE__*/_react.default.createElement(_appAdmin.AddRoute, {
65
- exact: true,
66
- path: "/mailer/settings",
67
- render: function render() {
68
- return /*#__PURE__*/_react.default.createElement(_appSecurity.SecureRoute, {
69
- permission: "mailer.settings"
70
- }, /*#__PURE__*/_react.default.createElement(_AdminLayout.AdminLayout, null, /*#__PURE__*/_react.default.createElement(_reactHelmet.default, {
71
- title: "Mailer - Settings"
72
- }), /*#__PURE__*/_react.default.createElement(Loader, null, /*#__PURE__*/_react.default.createElement(Settings, null))));
73
- }
74
- }));
75
- };
76
-
77
- exports.Module = Module;
@@ -1 +0,0 @@
1
- {"version":3,"names":["Settings","lazy","Loader","children","props","React","cloneElement","Module","usePermission","canChangeSettings","changeSettings"],"sources":["Module.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { AddMenu as Menu, AddRoute } from \"@webiny/app-admin\";\nimport { SecureRoute } from \"@webiny/app-security\";\nimport { AdminLayout } from \"@webiny/app-admin/components/AdminLayout\";\nimport Helmet from \"react-helmet\";\nimport { usePermission } from \"~/hooks/usePermission\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\n\nconst Settings = lazy(() => import(\"~/views/settings\"));\n\ninterface LoaderProps {\n children: React.ReactElement;\n}\nconst Loader: React.FC<LoaderProps> = ({ children, ...props }) => (\n <Suspense fallback={<CircularProgress />}>{React.cloneElement(children, props)}</Suspense>\n);\n\nexport const Module: React.FC = () => {\n const { canChangeSettings } = usePermission();\n\n const changeSettings = canChangeSettings();\n\n if (!changeSettings) {\n return null;\n }\n\n return (\n <>\n <Menu name={\"settings\"}>\n <Menu name={\"settings.mailer\"} label={\"Mailer\"}>\n <Menu\n name={\"settings.mailer.settings\"}\n label={\"Settings\"}\n path={\"/mailer/settings\"}\n />\n </Menu>\n </Menu>\n <AddRoute\n exact\n path={\"/mailer/settings\"}\n render={() => (\n <SecureRoute permission={\"mailer.settings\"}>\n <AdminLayout>\n <Helmet title={\"Mailer - Settings\"} />\n <Loader>\n <Settings />\n </Loader>\n </AdminLayout>\n </SecureRoute>\n )}\n />\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;AAEA,IAAMA,QAAQ,gBAAG,IAAAC,WAAA,EAAK;EAAA;IAAA;EAAA;AAAA,CAAL,CAAjB;;AAKA,IAAMC,MAA6B,GAAG,SAAhCA,MAAgC;EAAA,IAAGC,QAAH,QAAGA,QAAH;EAAA,IAAgBC,KAAhB;EAAA,oBAClC,6BAAC,eAAD;IAAU,QAAQ,eAAE,6BAAC,0BAAD;EAApB,gBAA2CC,cAAA,CAAMC,YAAN,CAAmBH,QAAnB,EAA6BC,KAA7B,CAA3C,CADkC;AAAA,CAAtC;;AAIO,IAAMG,MAAgB,GAAG,SAAnBA,MAAmB,GAAM;EAClC,qBAA8B,IAAAC,6BAAA,GAA9B;EAAA,IAAQC,iBAAR,kBAAQA,iBAAR;;EAEA,IAAMC,cAAc,GAAGD,iBAAiB,EAAxC;;EAEA,IAAI,CAACC,cAAL,EAAqB;IACjB,OAAO,IAAP;EACH;;EAED,oBACI,yEACI,6BAAC,iBAAD;IAAM,IAAI,EAAE;EAAZ,gBACI,6BAAC,iBAAD;IAAM,IAAI,EAAE,iBAAZ;IAA+B,KAAK,EAAE;EAAtC,gBACI,6BAAC,iBAAD;IACI,IAAI,EAAE,0BADV;IAEI,KAAK,EAAE,UAFX;IAGI,IAAI,EAAE;EAHV,EADJ,CADJ,CADJ,eAUI,6BAAC,kBAAD;IACI,KAAK,MADT;IAEI,IAAI,EAAE,kBAFV;IAGI,MAAM,EAAE;MAAA,oBACJ,6BAAC,wBAAD;QAAa,UAAU,EAAE;MAAzB,gBACI,6BAAC,wBAAD,qBACI,6BAAC,oBAAD;QAAQ,KAAK,EAAE;MAAf,EADJ,eAEI,6BAAC,MAAD,qBACI,6BAAC,QAAD,OADJ,CAFJ,CADJ,CADI;IAAA;EAHZ,EAVJ,CADJ;AA2BH,CApCM"}
package/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import { SecurityPermission } from \"@webiny/app-security/types\";\n\n/**\n * A base security permission for APW.\n *\n * @category SecurityPermission\n */\nexport interface MailerSecurityPermission extends SecurityPermission {\n changeSettings?: boolean;\n}\n\n/**\n * GraphQL API call response for the transport settings values\n * @category GraphQL\n */\nexport interface TransportSettings {\n host: string;\n user: string;\n from: string;\n replyTo?: string;\n password?: string;\n}\n/**\n *\n * @category GraphQL\n */\nexport interface ApiError<T = Record<string, any>> {\n message: string;\n code: string;\n data: T;\n}\n\n/**\n * Description of the JOI validation errors received from the API.\n *\n * @category GraphQL\n */\nexport interface ValidationError {\n message: string;\n path: string[];\n}\n\nexport interface ValidationErrors {\n errors: ValidationError[];\n}\n"],"mappings":""}