bananas-commerce-admin 0.1.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/README.md +25 -0
- package/dist/cjs/Admin.js +47 -0
- package/dist/cjs/App.js +49 -0
- package/dist/cjs/api.js +225 -0
- package/dist/cjs/components/Branding.js +41 -0
- package/dist/cjs/components/Hamburger.js +40 -0
- package/dist/cjs/components/Link.js +21 -0
- package/dist/cjs/components/Logo.js +25 -0
- package/dist/cjs/components/NavBar.js +101 -0
- package/dist/cjs/components/NavBarItem.js +42 -0
- package/dist/cjs/components/NavBarRoutes.js +47 -0
- package/dist/cjs/components/ProgressBar.js +14 -0
- package/dist/cjs/components/User.js +71 -0
- package/dist/cjs/containers/Content.js +16 -0
- package/dist/cjs/containers/ErrorScreen.js +35 -0
- package/dist/cjs/containers/LoadingScreen.js +84 -0
- package/dist/cjs/containers/PageErrorBoundary.js +43 -0
- package/dist/cjs/containers/PageLoader.js +123 -0
- package/dist/cjs/contexts/ApiContext.js +105 -0
- package/dist/cjs/contexts/I18nContext.js +109 -0
- package/dist/cjs/contexts/RouterContext.js +99 -0
- package/dist/cjs/contexts/UserContext.js +144 -0
- package/dist/cjs/extensions/bananas/components/PasswordChangeForm.js +85 -0
- package/dist/cjs/extensions/bananas/index.js +54 -0
- package/dist/cjs/extensions/bananas/pages/me/list.js +20 -0
- package/dist/cjs/extensions/pos/components/PurchaseRow.js +32 -0
- package/dist/cjs/extensions/pos/components/ReceiptCard.js +86 -0
- package/dist/cjs/extensions/pos/components/ReceiptLine.js +29 -0
- package/dist/cjs/extensions/pos/index.js +22 -0
- package/dist/cjs/extensions/pos/pages/purchase/detail.js +13 -0
- package/dist/cjs/extensions/pos/pages/purchase/list.js +34 -0
- package/dist/cjs/extensions/pos/types/purchase.js +2 -0
- package/dist/cjs/extensions/pos/types/receipt.js +2 -0
- package/dist/cjs/forms/LoginForm.js +63 -0
- package/dist/cjs/hooks/useAsyncError.js +15 -0
- package/dist/cjs/hooks/useLocalStorage.js +47 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/pages/DashboardPage.js +10 -0
- package/dist/cjs/pages/LoginPage.js +31 -0
- package/dist/cjs/router/Router.js +35 -0
- package/dist/cjs/router/routes.js +57 -0
- package/dist/cjs/types/index.js +2 -0
- package/dist/cjs/util/get_cookie.js +10 -0
- package/dist/cjs/util/index.js +62 -0
- package/dist/cjs/util/select_styles.js +38 -0
- package/dist/esm/Admin.js +42 -0
- package/dist/esm/App.js +44 -0
- package/dist/esm/api.js +219 -0
- package/dist/esm/components/Branding.js +36 -0
- package/dist/esm/components/Hamburger.js +35 -0
- package/dist/esm/components/Link.js +16 -0
- package/dist/esm/components/Logo.js +20 -0
- package/dist/esm/components/NavBar.js +73 -0
- package/dist/esm/components/NavBarItem.js +37 -0
- package/dist/esm/components/NavBarRoutes.js +42 -0
- package/dist/esm/components/ProgressBar.js +9 -0
- package/dist/esm/components/User.js +66 -0
- package/dist/esm/containers/Content.js +11 -0
- package/dist/esm/containers/ErrorScreen.js +30 -0
- package/dist/esm/containers/LoadingScreen.js +79 -0
- package/dist/esm/containers/PageErrorBoundary.js +38 -0
- package/dist/esm/containers/PageLoader.js +117 -0
- package/dist/esm/contexts/ApiContext.js +77 -0
- package/dist/esm/contexts/I18nContext.js +77 -0
- package/dist/esm/contexts/RouterContext.js +71 -0
- package/dist/esm/contexts/UserContext.js +113 -0
- package/dist/esm/extensions/bananas/components/PasswordChangeForm.js +80 -0
- package/dist/esm/extensions/bananas/index.js +48 -0
- package/dist/esm/extensions/bananas/pages/me/list.js +15 -0
- package/dist/esm/extensions/pos/components/PurchaseRow.js +25 -0
- package/dist/esm/extensions/pos/components/ReceiptCard.js +56 -0
- package/dist/esm/extensions/pos/components/ReceiptLine.js +22 -0
- package/dist/esm/extensions/pos/index.js +16 -0
- package/dist/esm/extensions/pos/pages/purchase/detail.js +8 -0
- package/dist/esm/extensions/pos/pages/purchase/list.js +29 -0
- package/dist/esm/extensions/pos/types/purchase.js +1 -0
- package/dist/esm/extensions/pos/types/receipt.js +1 -0
- package/dist/esm/forms/LoginForm.js +58 -0
- package/dist/esm/hooks/useAsyncError.js +9 -0
- package/dist/esm/hooks/useLocalStorage.js +41 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/pages/DashboardPage.js +5 -0
- package/dist/esm/pages/LoginPage.js +26 -0
- package/dist/esm/router/Router.js +28 -0
- package/dist/esm/router/routes.js +49 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/util/get_cookie.js +6 -0
- package/dist/esm/util/index.js +54 -0
- package/dist/esm/util/select_styles.js +34 -0
- package/dist/types/Admin.d.ts +13 -0
- package/dist/types/App.d.ts +13 -0
- package/dist/types/api.d.ts +20 -0
- package/dist/types/components/Branding.d.ts +14 -0
- package/dist/types/components/Hamburger.d.ts +8 -0
- package/dist/types/components/Link.d.ts +9 -0
- package/dist/types/components/Logo.d.ts +7 -0
- package/dist/types/components/NavBar.d.ts +11 -0
- package/dist/types/components/NavBarItem.d.ts +12 -0
- package/dist/types/components/NavBarRoutes.d.ts +7 -0
- package/dist/types/components/ProgressBar.d.ts +7 -0
- package/dist/types/components/User.d.ts +824 -0
- package/dist/types/containers/Content.d.ts +3 -0
- package/dist/types/containers/ErrorScreen.d.ts +7 -0
- package/dist/types/containers/LoadingScreen.d.ts +50 -0
- package/dist/types/containers/PageErrorBoundary.d.ts +16 -0
- package/dist/types/containers/PageLoader.d.ts +13 -0
- package/dist/types/contexts/ApiContext.d.ts +12 -0
- package/dist/types/contexts/I18nContext.d.ts +10 -0
- package/dist/types/contexts/RouterContext.d.ts +24 -0
- package/dist/types/contexts/UserContext.d.ts +20 -0
- package/dist/types/extensions/bananas/components/PasswordChangeForm.d.ts +3 -0
- package/dist/types/extensions/bananas/index.d.ts +2 -0
- package/dist/types/extensions/bananas/pages/me/list.d.ts +6 -0
- package/dist/types/extensions/pos/components/PurchaseRow.d.ts +7 -0
- package/dist/types/extensions/pos/components/ReceiptCard.d.ts +7 -0
- package/dist/types/extensions/pos/components/ReceiptLine.d.ts +7 -0
- package/dist/types/extensions/pos/index.d.ts +2 -0
- package/dist/types/extensions/pos/pages/purchase/detail.d.ts +7 -0
- package/dist/types/extensions/pos/pages/purchase/list.d.ts +9 -0
- package/dist/types/extensions/pos/types/purchase.d.ts +18 -0
- package/dist/types/extensions/pos/types/receipt.d.ts +34 -0
- package/dist/types/forms/LoginForm.d.ts +3 -0
- package/dist/types/hooks/useAsyncError.d.ts +1 -0
- package/dist/types/hooks/useLocalStorage.d.ts +2 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/pages/DashboardPage.d.ts +5 -0
- package/dist/types/pages/LoginPage.d.ts +9 -0
- package/dist/types/router/Router.d.ts +13 -0
- package/dist/types/router/routes.d.ts +20 -0
- package/dist/types/types/index.d.ts +6 -0
- package/dist/types/util/get_cookie.d.ts +1 -0
- package/dist/types/util/index.d.ts +8 -0
- package/dist/types/util/select_styles.d.ts +3 -0
- package/example/Dockerfile +27 -0
- package/example/docker-compose.yml +7 -0
- package/example/index.html +13 -0
- package/example/index.tsx +21 -0
- package/example/package-lock.json +13167 -0
- package/example/package.json +52 -0
- package/example/pages/.gitkeep +0 -0
- package/example/webpack.config.js +67 -0
- package/package.json +52 -0
- package/src/Admin.tsx +94 -0
- package/src/App.tsx +43 -0
- package/src/api.ts +202 -0
- package/src/components/Branding.tsx +79 -0
- package/src/components/Hamburger.tsx +41 -0
- package/src/components/Link.tsx +23 -0
- package/src/components/Logo.tsx +57 -0
- package/src/components/NavBar.tsx +115 -0
- package/src/components/NavBarItem.tsx +73 -0
- package/src/components/NavBarRoutes.tsx +67 -0
- package/src/components/ProgressBar.tsx +30 -0
- package/src/components/User.tsx +97 -0
- package/src/containers/Content.tsx +18 -0
- package/src/containers/ErrorScreen.tsx +64 -0
- package/src/containers/LoadingScreen.tsx +135 -0
- package/src/containers/PageErrorBoundary.tsx +32 -0
- package/src/containers/PageLoader.tsx +64 -0
- package/src/contexts/ApiContext.tsx +55 -0
- package/src/contexts/I18nContext.tsx +55 -0
- package/src/contexts/RouterContext.tsx +127 -0
- package/src/contexts/UserContext.tsx +99 -0
- package/src/extensions/bananas/components/PasswordChangeForm.tsx +138 -0
- package/src/extensions/bananas/index.ts +14 -0
- package/src/extensions/bananas/pages/me/list.tsx +31 -0
- package/src/extensions/pos/components/PurchaseRow.tsx +42 -0
- package/src/extensions/pos/components/ReceiptCard.tsx +101 -0
- package/src/extensions/pos/components/ReceiptLine.tsx +51 -0
- package/src/extensions/pos/index.tsx +20 -0
- package/src/extensions/pos/pages/purchase/detail.tsx +22 -0
- package/src/extensions/pos/pages/purchase/list.tsx +56 -0
- package/src/extensions/pos/types/purchase.ts +20 -0
- package/src/extensions/pos/types/receipt.ts +36 -0
- package/src/forms/LoginForm.tsx +99 -0
- package/src/hooks/useAsyncError.ts +13 -0
- package/src/hooks/useLocalStorage.ts +42 -0
- package/src/index.ts +18 -0
- package/src/pages/DashboardPage.tsx +9 -0
- package/src/pages/LoginPage.tsx +50 -0
- package/src/router/Router.tsx +63 -0
- package/src/router/routes.ts +67 -0
- package/src/types/index.ts +4 -0
- package/src/types/swagger-client.d.ts +1 -0
- package/src/util/get_cookie.ts +6 -0
- package/src/util/index.ts +63 -0
- package/src/util/select_styles.ts +29 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import React from "react";
|
|
13
|
+
import { useTheme } from "@mui/material/styles";
|
|
14
|
+
import Box from "@mui/material/Box";
|
|
15
|
+
import CircularProgress from "@mui/material/CircularProgress";
|
|
16
|
+
import Fade from "@mui/material/Fade";
|
|
17
|
+
import { alpha } from "@mui/system";
|
|
18
|
+
import Logo from "../components/Logo";
|
|
19
|
+
import { ss } from "../util/select_styles";
|
|
20
|
+
var styles = function (theme) {
|
|
21
|
+
return ({
|
|
22
|
+
root: {
|
|
23
|
+
position: "relative",
|
|
24
|
+
top: 0,
|
|
25
|
+
left: 0,
|
|
26
|
+
width: "100%",
|
|
27
|
+
height: "100%",
|
|
28
|
+
display: "flex",
|
|
29
|
+
flexDirection: "column",
|
|
30
|
+
alignItems: "center",
|
|
31
|
+
justifyContent: "center",
|
|
32
|
+
},
|
|
33
|
+
backdrop: {
|
|
34
|
+
position: "absolute",
|
|
35
|
+
zIndex: 2000,
|
|
36
|
+
backgroundColor: alpha(theme.palette.background.default, 0.666),
|
|
37
|
+
},
|
|
38
|
+
backdropPrimary: {
|
|
39
|
+
backgroundColor: alpha(theme.palette.primary.main, 0.666),
|
|
40
|
+
},
|
|
41
|
+
backdropSecondary: {
|
|
42
|
+
backgroundColor: alpha(theme.palette.secondary.main, 0.666),
|
|
43
|
+
},
|
|
44
|
+
backdropPaper: {
|
|
45
|
+
backgroundColor: alpha(theme.palette.background.paper, 0.666),
|
|
46
|
+
},
|
|
47
|
+
spinner: {
|
|
48
|
+
color: theme.palette.primary.main,
|
|
49
|
+
},
|
|
50
|
+
spinnerContrast: {
|
|
51
|
+
color: theme.palette.primary.contrastText,
|
|
52
|
+
},
|
|
53
|
+
logo: {
|
|
54
|
+
position: "absolute",
|
|
55
|
+
margin: 0,
|
|
56
|
+
marginTop: theme.spacing(-36),
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
var LoadingScreenInner = function (_a) {
|
|
61
|
+
var loading = _a.loading, logo = _a.logo, classes = _a.classes, backdrop = _a.backdrop, color = _a.color;
|
|
62
|
+
return (React.createElement(Box, { sx: ss(classes.root, [classes.backdrop, backdrop], [classes.backdropPrimary, backdrop && color === "primary"], [classes.backdropSecondary, backdrop && color === "secondary"], [classes.backdropPaper, backdrop && color === "paper"]) },
|
|
63
|
+
React.createElement(Box, { sx: classes.logo }, logo && React.createElement(Logo, { src: logo })),
|
|
64
|
+
loading && (React.createElement(CircularProgress, { sx: ss(classes.spinner, [classes.spinnerContrast, !color]) }))));
|
|
65
|
+
};
|
|
66
|
+
var LoadingScreen = function (props) {
|
|
67
|
+
var _a = __assign({}, props), loading = _a.loading, logo = _a.logo, backdrop = _a.backdrop, color = _a.color, classes = _a.classes;
|
|
68
|
+
classes !== null && classes !== void 0 ? classes : (classes = styles(useTheme()));
|
|
69
|
+
loading !== null && loading !== void 0 ? loading : (loading = true);
|
|
70
|
+
backdrop !== null && backdrop !== void 0 ? backdrop : (backdrop = false);
|
|
71
|
+
return backdrop
|
|
72
|
+
? (React.createElement(Fade, { in: loading, timeout: {
|
|
73
|
+
enter: 750,
|
|
74
|
+
exit: 250,
|
|
75
|
+
} },
|
|
76
|
+
React.createElement(LoadingScreenInner, { loading: loading, logo: logo, backdrop: backdrop, color: color, classes: classes })))
|
|
77
|
+
: (React.createElement(LoadingScreenInner, { loading: loading, logo: logo, backdrop: backdrop, color: color, classes: classes }));
|
|
78
|
+
};
|
|
79
|
+
export default LoadingScreen;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
if (typeof b !== "function" && b !== null)
|
|
10
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
+
extendStatics(d, b);
|
|
12
|
+
function __() { this.constructor = d; }
|
|
13
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
import React from "react";
|
|
17
|
+
var PageErrorBoundary = /** @class */ (function (_super) {
|
|
18
|
+
__extends(PageErrorBoundary, _super);
|
|
19
|
+
function PageErrorBoundary(props) {
|
|
20
|
+
var _this = _super.call(this, props) || this;
|
|
21
|
+
_this.state = { error: null };
|
|
22
|
+
_this.errorPage = props.errorPage;
|
|
23
|
+
return _this;
|
|
24
|
+
}
|
|
25
|
+
PageErrorBoundary.prototype.componentDidCatch = function (error) {
|
|
26
|
+
this.setState({ error: error });
|
|
27
|
+
};
|
|
28
|
+
PageErrorBoundary.prototype.render = function () {
|
|
29
|
+
var error = this.state.error;
|
|
30
|
+
if (error) {
|
|
31
|
+
var ErrorPage = this.errorPage;
|
|
32
|
+
return React.createElement(ErrorPage, { error: error });
|
|
33
|
+
}
|
|
34
|
+
return this.props.children;
|
|
35
|
+
};
|
|
36
|
+
return PageErrorBoundary;
|
|
37
|
+
}(React.Component));
|
|
38
|
+
export default PageErrorBoundary;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
if (typeof b !== "function" && b !== null)
|
|
10
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
+
extendStatics(d, b);
|
|
12
|
+
function __() { this.constructor = d; }
|
|
13
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
26
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
27
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
28
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
29
|
+
function step(op) {
|
|
30
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
31
|
+
while (_) try {
|
|
32
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
33
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
34
|
+
switch (op[0]) {
|
|
35
|
+
case 0: case 1: t = op; break;
|
|
36
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
37
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
38
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
39
|
+
default:
|
|
40
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
41
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
42
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
43
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
44
|
+
if (t[2]) _.ops.pop();
|
|
45
|
+
_.trys.pop(); continue;
|
|
46
|
+
}
|
|
47
|
+
op = body.call(thisArg, _);
|
|
48
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
49
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
import React from "react";
|
|
53
|
+
import { Suspense } from "react";
|
|
54
|
+
import { useParams, useSearchParams } from "react-router-dom";
|
|
55
|
+
import { useApi } from "../contexts/ApiContext";
|
|
56
|
+
import useAsyncError from "../hooks/useAsyncError";
|
|
57
|
+
import LoadingScreen from "./LoadingScreen";
|
|
58
|
+
var PageLoadFailedError = /** @class */ (function (_super) {
|
|
59
|
+
__extends(PageLoadFailedError, _super);
|
|
60
|
+
function PageLoadFailedError(response, message) {
|
|
61
|
+
var _this = _super.call(this, message) || this;
|
|
62
|
+
_this.response = response;
|
|
63
|
+
return _this;
|
|
64
|
+
}
|
|
65
|
+
return PageLoadFailedError;
|
|
66
|
+
}(Error));
|
|
67
|
+
export { PageLoadFailedError };
|
|
68
|
+
var PageLoader = function (_a) {
|
|
69
|
+
var route = _a.route, page = _a.page;
|
|
70
|
+
var Page = React.lazy(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
71
|
+
var _a;
|
|
72
|
+
return __generator(this, function (_b) {
|
|
73
|
+
switch (_b.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
_a = {};
|
|
76
|
+
return [4 /*yield*/, Promise.resolve(page)];
|
|
77
|
+
case 1: return [2 /*return*/, (_a.default = _b.sent(),
|
|
78
|
+
_a)];
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}); });
|
|
82
|
+
var api = useApi();
|
|
83
|
+
var params = useParams();
|
|
84
|
+
var searchParams = useSearchParams()[0];
|
|
85
|
+
var _b = React.useState(null), data = _b[0], setData = _b[1];
|
|
86
|
+
var throwError = useAsyncError();
|
|
87
|
+
React.useEffect(function () {
|
|
88
|
+
if (data === null) {
|
|
89
|
+
api.operations[route.id].call({
|
|
90
|
+
params: params,
|
|
91
|
+
query: Object.fromEntries(searchParams.entries()),
|
|
92
|
+
})
|
|
93
|
+
.then(function (response) { return __awaiter(void 0, void 0, void 0, function () {
|
|
94
|
+
var _a;
|
|
95
|
+
return __generator(this, function (_b) {
|
|
96
|
+
switch (_b.label) {
|
|
97
|
+
case 0:
|
|
98
|
+
if (!response.ok) return [3 /*break*/, 2];
|
|
99
|
+
_a = setData;
|
|
100
|
+
return [4 /*yield*/, response.json()];
|
|
101
|
+
case 1:
|
|
102
|
+
_a.apply(void 0, [_b.sent()]);
|
|
103
|
+
return [3 /*break*/, 3];
|
|
104
|
+
case 2:
|
|
105
|
+
throwError(new PageLoadFailedError(response, "Page data load failed with ".concat(response.status, " ").concat(response.statusText)));
|
|
106
|
+
_b.label = 3;
|
|
107
|
+
case 3: return [2 /*return*/];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}); })
|
|
111
|
+
.catch(throwError);
|
|
112
|
+
}
|
|
113
|
+
}, [api, params, searchParams, data]);
|
|
114
|
+
return (React.createElement(Suspense, { fallback: React.createElement(LoadingScreen, null) },
|
|
115
|
+
React.createElement(Page, { data: data })));
|
|
116
|
+
};
|
|
117
|
+
export default PageLoader;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (_) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { useSnackbar } from "notistack";
|
|
38
|
+
import * as React from "react";
|
|
39
|
+
import { ApiClient } from "../api";
|
|
40
|
+
import { getCookie } from "../util/get_cookie";
|
|
41
|
+
var ApiContext = React.createContext(undefined);
|
|
42
|
+
export var useApi = function () { return React.useContext(ApiContext); };
|
|
43
|
+
export var ApiContextProvider = function (_a) {
|
|
44
|
+
var children = _a.children, init = _a.api;
|
|
45
|
+
var _b = React.useState(), api = _b[0], setApi = _b[1];
|
|
46
|
+
var enqueueSnackbar = useSnackbar().enqueueSnackbar;
|
|
47
|
+
React.useEffect(function () {
|
|
48
|
+
if (api === undefined) {
|
|
49
|
+
(init instanceof ApiClient
|
|
50
|
+
? Promise.resolve(init)
|
|
51
|
+
: typeof init === "string" ||
|
|
52
|
+
init instanceof URL
|
|
53
|
+
? ApiClient.load(init)
|
|
54
|
+
: ApiClient.load(init.schema, init.server)).then(function (api) { return __awaiter(void 0, void 0, void 0, function () {
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
switch (_a.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
setApi(api);
|
|
59
|
+
if (!(getCookie("csrftoken") === undefined)) return [3 /*break*/, 2];
|
|
60
|
+
return [4 /*yield*/, api.operations["bananas.csrf:list"].call()];
|
|
61
|
+
case 1:
|
|
62
|
+
_a.sent();
|
|
63
|
+
_a.label = 2;
|
|
64
|
+
case 2: return [2 /*return*/];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}); }).catch(function (e) {
|
|
68
|
+
enqueueSnackbar("Failed to load schema, view console for more info", {
|
|
69
|
+
variant: "error",
|
|
70
|
+
});
|
|
71
|
+
throw e;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}, [api]);
|
|
75
|
+
return (React.createElement(ApiContext.Provider, { value: api }, children));
|
|
76
|
+
};
|
|
77
|
+
export default ApiContext;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (_) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import * as React from "react";
|
|
38
|
+
import useLocalStorage from "../hooks/useLocalStorage";
|
|
39
|
+
import { useApi } from "./ApiContext";
|
|
40
|
+
export function interpolateString(string, params) {
|
|
41
|
+
return Array.isArray(params)
|
|
42
|
+
? params.reduce(function (s, value) { return s.replace(/%[sd]|\{\}/, value); }, string)
|
|
43
|
+
: Object.entries(params).reduce(function (s, _a) {
|
|
44
|
+
var key = _a[0], value = _a[1];
|
|
45
|
+
return s.replace(new RegExp("%\\(".concat(key, "\\)[sd]|\\{").concat(key, "\\}"), "g"), value);
|
|
46
|
+
}, string);
|
|
47
|
+
}
|
|
48
|
+
var I18nContext = React.createContext(undefined);
|
|
49
|
+
export var useI18n = function () { return React.useContext(I18nContext); };
|
|
50
|
+
export var I18nContextProvider = function (_a) {
|
|
51
|
+
var children = _a.children;
|
|
52
|
+
var api = useApi();
|
|
53
|
+
var _b = useLocalStorage("i18n", undefined), i18n = _b[0], setI18n = _b[1];
|
|
54
|
+
React.useEffect(function () {
|
|
55
|
+
if (api && i18n === undefined) {
|
|
56
|
+
api.operations["bananas.i18n:list"].call().then(function (response) { return __awaiter(void 0, void 0, void 0, function () {
|
|
57
|
+
var i18n;
|
|
58
|
+
return __generator(this, function (_a) {
|
|
59
|
+
switch (_a.label) {
|
|
60
|
+
case 0: return [4 /*yield*/, response.json()];
|
|
61
|
+
case 1:
|
|
62
|
+
i18n = (_a.sent()).catalog;
|
|
63
|
+
setI18n(i18n);
|
|
64
|
+
return [2 /*return*/];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}); });
|
|
68
|
+
}
|
|
69
|
+
}, [api, i18n]);
|
|
70
|
+
var t = function (key, params) {
|
|
71
|
+
var _a;
|
|
72
|
+
var value = (_a = i18n === null || i18n === void 0 ? void 0 : i18n[key]) !== null && _a !== void 0 ? _a : key;
|
|
73
|
+
return params ? interpolateString(value, params) : value;
|
|
74
|
+
};
|
|
75
|
+
return (React.createElement(I18nContext.Provider, { value: { i18n: i18n, t: t } }, children));
|
|
76
|
+
};
|
|
77
|
+
export default I18nContext;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useNavigate } from "react-router-dom";
|
|
3
|
+
import { getPage, getPath, getTitle, isNavigation, parseOperationId, } from "../router/routes";
|
|
4
|
+
import { useApi } from "./ApiContext";
|
|
5
|
+
var RouterContext = React.createContext({
|
|
6
|
+
routes: [],
|
|
7
|
+
getRoute: function (reverse) { return void reverse; },
|
|
8
|
+
navigate: function (route, options) { return void [route, options]; },
|
|
9
|
+
});
|
|
10
|
+
export var useRouter = function () { return React.useContext(RouterContext); };
|
|
11
|
+
export var RouterContextProvider = function (_a) {
|
|
12
|
+
var children = _a.children;
|
|
13
|
+
var routes = [];
|
|
14
|
+
var api = useApi();
|
|
15
|
+
var routerNavigate = useNavigate();
|
|
16
|
+
for (var _i = 0, _b = Object.values(api.operations); _i < _b.length; _i++) {
|
|
17
|
+
var operation = _b[_i];
|
|
18
|
+
var parsedOperationId = parseOperationId(operation.id);
|
|
19
|
+
if (!parsedOperationId) {
|
|
20
|
+
throw new TypeError("Could not parse operation id ".concat(operation.id));
|
|
21
|
+
}
|
|
22
|
+
var app = parsedOperationId.app, view = parsedOperationId.view, action = parsedOperationId.action;
|
|
23
|
+
var title = getTitle(view, operation.summary);
|
|
24
|
+
var navigation = isNavigation(operation.tags);
|
|
25
|
+
var path = getPath(operation.endpoint, operation.method, action);
|
|
26
|
+
var page = getPage(path, action);
|
|
27
|
+
routes.push({
|
|
28
|
+
id: operation.id,
|
|
29
|
+
app: app,
|
|
30
|
+
view: view,
|
|
31
|
+
action: action,
|
|
32
|
+
title: title,
|
|
33
|
+
navigation: navigation,
|
|
34
|
+
path: path,
|
|
35
|
+
page: page,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
var getRoute = function (reverse) {
|
|
39
|
+
return routes.find(function (_a) {
|
|
40
|
+
var id = _a.id;
|
|
41
|
+
return reverse === id;
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var navigate = function (route, options) {
|
|
45
|
+
var _a;
|
|
46
|
+
// Relative history, e.g. go back or forward x steps
|
|
47
|
+
if (typeof route === "number") {
|
|
48
|
+
routerNavigate(route);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Direct operation id routes, requires reversing the operation id
|
|
52
|
+
if (typeof route === "string") {
|
|
53
|
+
var routeInfo = getRoute(route);
|
|
54
|
+
if (routeInfo === undefined) {
|
|
55
|
+
throw new Error("Could not find route with reverse: ".concat(route));
|
|
56
|
+
}
|
|
57
|
+
route = routeInfo;
|
|
58
|
+
}
|
|
59
|
+
var path = route.path;
|
|
60
|
+
for (var _i = 0, _b = Object.entries((_a = options === null || options === void 0 ? void 0 : options.params) !== null && _a !== void 0 ? _a : {}); _i < _b.length; _i++) {
|
|
61
|
+
var _c = _b[_i], key = _c[0], value = _c[1];
|
|
62
|
+
path = path.replace(":".concat(key), encodeURIComponent(value));
|
|
63
|
+
}
|
|
64
|
+
routerNavigate({
|
|
65
|
+
pathname: path,
|
|
66
|
+
search: new URLSearchParams(options === null || options === void 0 ? void 0 : options.query).toString(),
|
|
67
|
+
}, { replace: options === null || options === void 0 ? void 0 : options.replace });
|
|
68
|
+
};
|
|
69
|
+
return (React.createElement(RouterContext.Provider, { value: { routes: routes, getRoute: getRoute, navigate: navigate } }, children));
|
|
70
|
+
};
|
|
71
|
+
export default RouterContext;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (_) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import * as React from "react";
|
|
38
|
+
import useLocalStorage from "../hooks/useLocalStorage";
|
|
39
|
+
import { useApi } from "./ApiContext";
|
|
40
|
+
var UserContext = React.createContext(undefined);
|
|
41
|
+
export var useUser = function () { return React.useContext(UserContext); };
|
|
42
|
+
export var UserContextProvider = function (_a) {
|
|
43
|
+
var children = _a.children;
|
|
44
|
+
var api = useApi();
|
|
45
|
+
var _b = useLocalStorage("user", null), user = _b[0], setUser = _b[1];
|
|
46
|
+
React.useEffect(function () {
|
|
47
|
+
if (api !== undefined) {
|
|
48
|
+
api.isAuthenticated().then(function (authenticated) {
|
|
49
|
+
if (!authenticated) {
|
|
50
|
+
setUser(null);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}, [user, api]);
|
|
55
|
+
var login = function (username, password) { return __awaiter(void 0, void 0, void 0, function () {
|
|
56
|
+
var response, user_1;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
switch (_a.label) {
|
|
59
|
+
case 0: return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.operations["bananas.login:create"].call({
|
|
60
|
+
body: { username: username, password: password },
|
|
61
|
+
}))];
|
|
62
|
+
case 1:
|
|
63
|
+
response = _a.sent();
|
|
64
|
+
if (!(response !== undefined && response.ok)) return [3 /*break*/, 3];
|
|
65
|
+
return [4 /*yield*/, response.json()];
|
|
66
|
+
case 2:
|
|
67
|
+
user_1 = _a.sent();
|
|
68
|
+
setUser(user_1);
|
|
69
|
+
return [2 /*return*/, user_1];
|
|
70
|
+
case 3:
|
|
71
|
+
setUser(null);
|
|
72
|
+
return [2 /*return*/, null];
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}); };
|
|
76
|
+
var changePassword = function (oldPassword, newPassword1, newPassword2) { return __awaiter(void 0, void 0, void 0, function () {
|
|
77
|
+
var response;
|
|
78
|
+
return __generator(this, function (_a) {
|
|
79
|
+
switch (_a.label) {
|
|
80
|
+
case 0: return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.operations["bananas.change_password:create"].call({
|
|
81
|
+
body: {
|
|
82
|
+
old_password: oldPassword,
|
|
83
|
+
new_password1: newPassword1,
|
|
84
|
+
new_password2: newPassword2,
|
|
85
|
+
},
|
|
86
|
+
}))];
|
|
87
|
+
case 1:
|
|
88
|
+
response = _a.sent();
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
throw new Error("Failed to change password");
|
|
91
|
+
}
|
|
92
|
+
return [2 /*return*/];
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}); };
|
|
96
|
+
var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
97
|
+
var response;
|
|
98
|
+
return __generator(this, function (_a) {
|
|
99
|
+
switch (_a.label) {
|
|
100
|
+
case 0: return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.operations["bananas.logout:create"].call())];
|
|
101
|
+
case 1:
|
|
102
|
+
response = _a.sent();
|
|
103
|
+
if (response !== undefined && response.ok) {
|
|
104
|
+
setUser(null);
|
|
105
|
+
return [2 /*return*/];
|
|
106
|
+
}
|
|
107
|
+
throw new Error("Could not log out");
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}); };
|
|
111
|
+
return (React.createElement(UserContext.Provider, { value: { user: user, login: login, logout: logout, changePassword: changePassword } }, children));
|
|
112
|
+
};
|
|
113
|
+
export default UserContext;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import { useSnackbar } from "notistack";
|
|
13
|
+
import React from "react";
|
|
14
|
+
import Box from "@mui/material/Box";
|
|
15
|
+
import FormControl from "@mui/material/FormControl";
|
|
16
|
+
import FormGroup from "@mui/material/FormGroup";
|
|
17
|
+
import FormLabel from "@mui/material/FormLabel";
|
|
18
|
+
import { useTheme } from "@mui/material/styles";
|
|
19
|
+
import TextField from "@mui/material/TextField";
|
|
20
|
+
import Typography from "@mui/material/Typography";
|
|
21
|
+
import { useApi } from "../../../contexts/ApiContext";
|
|
22
|
+
import { useI18n } from "../../../contexts/I18nContext";
|
|
23
|
+
import { useUser } from "../../../contexts/UserContext";
|
|
24
|
+
import LoadingButton from "@mui/lab/LoadingButton";
|
|
25
|
+
var PasswordChangeForm = function () {
|
|
26
|
+
var theme = useTheme();
|
|
27
|
+
var t = useI18n().t;
|
|
28
|
+
var api = useApi();
|
|
29
|
+
var enqueueSnackbar = useSnackbar().enqueueSnackbar;
|
|
30
|
+
var _a = React.useState(false), loading = _a[0], setLoading = _a[1];
|
|
31
|
+
var operation = api.operations["bananas.change_password:create"];
|
|
32
|
+
var properties = operation.request.body.schema.properties;
|
|
33
|
+
var _b = React.useState({
|
|
34
|
+
"old_password": "",
|
|
35
|
+
"new_password1": "",
|
|
36
|
+
"new_password2": "",
|
|
37
|
+
}), fields = _b[0], setFields = _b[1];
|
|
38
|
+
var changePassword = useUser().changePassword;
|
|
39
|
+
var onSubmit = function (event) {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
setLoading(true);
|
|
42
|
+
changePassword(fields.old_password, fields.new_password1, fields.new_password2).then(function () {
|
|
43
|
+
enqueueSnackbar(t("Password changed successfully."), {
|
|
44
|
+
variant: "success",
|
|
45
|
+
});
|
|
46
|
+
setFields({
|
|
47
|
+
"old_password": "",
|
|
48
|
+
"new_password1": "",
|
|
49
|
+
"new_password2": "",
|
|
50
|
+
});
|
|
51
|
+
}).catch(function () {
|
|
52
|
+
enqueueSnackbar(t("Incorrect authentication credentials."), {
|
|
53
|
+
variant: "error",
|
|
54
|
+
});
|
|
55
|
+
}).finally(function () { return setLoading(false); });
|
|
56
|
+
};
|
|
57
|
+
var onChange = function (event) {
|
|
58
|
+
var _a;
|
|
59
|
+
setFields(__assign(__assign({}, fields), (_a = {}, _a[event.target.name] = event.target.value, _a)));
|
|
60
|
+
};
|
|
61
|
+
return (React.createElement(Box, { component: "form", onSubmit: onSubmit, sx: {
|
|
62
|
+
maxWidth: 350,
|
|
63
|
+
}, "data-testid": "change-password-form" },
|
|
64
|
+
React.createElement(FormLabel, { component: "legend", sx: {
|
|
65
|
+
marginBottom: theme.spacing(2),
|
|
66
|
+
} }, operation.summary),
|
|
67
|
+
React.createElement(Typography, null, t("Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly.")),
|
|
68
|
+
React.createElement(FormControl, { fullWidth: true, component: "fieldset" },
|
|
69
|
+
React.createElement(FormGroup, null, ["old_password", "new_password1", "new_password2"].map(function (field) { return (React.createElement(TextField, { key: field, autoComplete: field, sx: {
|
|
70
|
+
marginTop: theme.spacing(3),
|
|
71
|
+
}, label: properties[field].title, inputProps: { "aria-label": properties[field].title }, name: field, value: fields[field], type: "password", onChange: onChange, fullWidth: true, required: true, color: "secondary" })); }))),
|
|
72
|
+
React.createElement(FormControl, { fullWidth: true, margin: "normal", sx: {
|
|
73
|
+
marginTop: theme.spacing(3),
|
|
74
|
+
marginBottom: 0,
|
|
75
|
+
} },
|
|
76
|
+
React.createElement(LoadingButton, { sx: {
|
|
77
|
+
margin: "auto",
|
|
78
|
+
}, variant: "outlined", type: "submit", color: "secondary", fullWidth: true, "aria-label": "login", loading: loading }, t("Change my password")))));
|
|
79
|
+
};
|
|
80
|
+
export default PasswordChangeForm;
|