@social-mail/social-mail-client 1.2.641 → 1.2.643
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/dist/admin/AdminAppIndex.pack.js +526 -566
- package/dist/admin/AdminAppIndex.pack.js.map +1 -1
- package/dist/admin/AdminAppIndex.pack.min.js +9 -13
- package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
- package/dist/admin/commands/AdminCommands.d.ts +0 -1
- package/dist/admin/commands/AdminCommands.d.ts.map +1 -1
- package/dist/admin/commands/AdminCommands.js +0 -4
- package/dist/admin/commands/AdminCommands.js.map +1 -1
- package/dist/admin/drawer/AdminDrawer.d.ts.map +1 -1
- package/dist/admin/drawer/AdminDrawer.js +0 -4
- package/dist/admin/drawer/AdminDrawer.js.map +1 -1
- package/dist/common/commands/CommonCommands.d.ts +1 -1
- package/dist/common/commands/CommonCommands.d.ts.map +1 -1
- package/dist/common/commands/CommonCommands.js +3 -3
- package/dist/common/commands/CommonCommands.js.map +1 -1
- package/dist/common/controls/phone-editor/PhoneEditor.d.ts +3 -0
- package/dist/common/controls/phone-editor/PhoneEditor.d.ts.map +1 -1
- package/dist/common/controls/phone-editor/PhoneEditor.js +25 -4
- package/dist/common/controls/phone-editor/PhoneEditor.js.map +1 -1
- package/dist/common/pages/stores/StoreDetailPage.d.ts +2 -2
- package/dist/common/pages/stores/StoreDetailPage.d.ts.map +1 -1
- package/dist/common/pages/stores/StoreDetailPage.js +2 -8
- package/dist/common/pages/stores/StoreDetailPage.js.map +1 -1
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts +10 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts.map +1 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js +87 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js.map +1 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts +23 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts.map +1 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js +129 -0
- package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js.map +1 -0
- package/dist/common/pages/stores/products/EditProductListPage.d.ts +2 -2
- package/dist/common/pages/stores/products/EditProductListPage.d.ts.map +1 -1
- package/dist/common/pages/stores/products/EditProductListPage.js.map +1 -1
- package/dist/common/pages/stores/settings/EditSettingsPage.d.ts +2 -2
- package/dist/common/pages/stores/settings/EditSettingsPage.d.ts.map +1 -1
- package/dist/common/pages/stores/settings/EditSettingsPage.js +4 -4
- package/dist/common/pages/stores/settings/EditSettingsPage.js.map +1 -1
- package/dist/model/model.d.ts +50 -51
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +195 -205
- package/dist/model/model.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.js +303 -261
- package/dist/public/channel/ChannelView.pack.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.min.js +2 -2
- package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
- package/dist/public/preview/zip/DownloadZip.pack.js +303 -261
- package/dist/public/preview/zip/DownloadZip.pack.js.map +1 -1
- package/dist/public/preview/zip/DownloadZip.pack.min.js +1 -1
- package/dist/public/preview/zip/DownloadZip.pack.min.js.map +1 -1
- package/dist/public/store/Store.d.ts +2 -2
- package/dist/public/store/Store.d.ts.map +1 -1
- package/dist/public/store/Store.js +29 -7
- package/dist/public/store/Store.js.map +1 -1
- package/dist/public/store/Store.pack.js +19655 -18064
- package/dist/public/store/Store.pack.js.map +1 -1
- package/dist/public/store/Store.pack.min.js +370 -161
- package/dist/public/store/Store.pack.min.js.map +1 -1
- package/dist/public/store/StoreItemDetailView.d.ts +1 -0
- package/dist/public/store/StoreItemDetailView.d.ts.map +1 -1
- package/dist/public/store/StoreItemDetailView.js +24 -8
- package/dist/public/store/StoreItemDetailView.js.map +1 -1
- package/dist/public/store/StoreItemListView.d.ts.map +1 -1
- package/dist/public/store/StoreItemListView.js +7 -4
- package/dist/public/store/StoreItemListView.js.map +1 -1
- package/dist/public/store/StoreUrlService.d.ts +22 -15
- package/dist/public/store/StoreUrlService.d.ts.map +1 -1
- package/dist/public/store/StoreUrlService.js +39 -12
- package/dist/public/store/StoreUrlService.js.map +1 -1
- package/dist/public/store/cart/ShoppingCart.pack.js +303 -261
- package/dist/public/store/cart/ShoppingCart.pack.js.map +1 -1
- package/dist/public/store/cart/ShoppingCart.pack.min.js +2 -2
- package/dist/public/store/cart/ShoppingCart.pack.min.js.map +1 -1
- package/dist/public/user/SiteLogin.d.ts +28 -0
- package/dist/public/user/SiteLogin.d.ts.map +1 -0
- package/dist/public/user/SiteLogin.js +224 -0
- package/dist/public/user/SiteLogin.js.map +1 -0
- package/dist/public/user/WebSiteUserService.d.ts +10 -0
- package/dist/public/user/WebSiteUserService.d.ts.map +1 -0
- package/dist/public/user/WebSiteUserService.js +52 -0
- package/dist/public/user/WebSiteUserService.js.map +1 -0
- package/dist/services/store/StoreItemService.d.ts +1 -1
- package/dist/services/store/StoreItemService.d.ts.map +1 -1
- package/dist/services/store/StoreItemService.js +6 -6
- package/dist/services/store/StoreItemService.js.map +1 -1
- package/dist/services/store/StoreService.d.ts +5 -5
- package/dist/services/store/StoreService.d.ts.map +1 -1
- package/dist/services/store/StoreService.js +7 -7
- package/dist/services/store/StoreService.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/web/AppIndex.pack.js +528 -301
- package/dist/web/AppIndex.pack.js.map +1 -1
- package/dist/web/AppIndex.pack.min.js +8 -8
- package/dist/web/AppIndex.pack.min.js.map +1 -1
- package/dist/web/drawer/AppDrawer.d.ts +1 -1
- package/dist/web/drawer/AppDrawer.js +2 -2
- package/dist/web/drawer/AppDrawer.js.map +1 -1
- package/node_modules/@web-atoms/entity/dist/services/BaseEntityService.d.ts +1 -1
- package/node_modules/@web-atoms/entity/dist/services/BaseEntityService.d.ts.map +1 -1
- package/node_modules/@web-atoms/entity/dist/services/BaseEntityService.js +108 -56
- package/node_modules/@web-atoms/entity/dist/services/BaseEntityService.js.map +1 -1
- package/node_modules/@web-atoms/entity/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@web-atoms/entity/package.json +1 -1
- package/node_modules/@web-atoms/entity/src/services/BaseEntityService.ts +109 -54
- package/package.json +2 -2
- package/src/admin/commands/AdminCommands.ts +0 -5
- package/src/admin/drawer/AdminDrawer.tsx +0 -5
- package/src/common/commands/CommonCommands.ts +3 -4
- package/src/common/controls/phone-editor/PhoneEditor.tsx +24 -1
- package/src/common/pages/stores/StoreDetailPage.tsx +4 -8
- package/src/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.tsx +62 -0
- package/src/common/pages/stores/payment-gateway/PaymentGatewayListPage.tsx +94 -0
- package/src/common/pages/stores/products/EditProductListPage.tsx +2 -2
- package/src/common/pages/stores/settings/EditSettingsPage.tsx +3 -3
- package/src/model/model.ts +69 -86
- package/src/public/store/Store.tsx +18 -4
- package/src/public/store/StoreItemDetailView.tsx +17 -4
- package/src/public/store/StoreItemListView.tsx +4 -2
- package/src/public/store/StoreUrlService.ts +62 -27
- package/src/public/user/SiteLogin.tsx +239 -0
- package/src/public/user/WebSiteUserService.ts +39 -0
- package/src/services/store/StoreItemService.ts +6 -4
- package/src/services/store/StoreService.ts +11 -11
- package/src/web/drawer/AppDrawer.tsx +2 -2
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts +0 -11
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts.map +0 -1
- package/dist/admin/pages/stores/AdminStoreDetailPage.js +0 -122
- package/dist/admin/pages/stores/AdminStoreDetailPage.js.map +0 -1
- package/dist/admin/pages/stores/AdminStoreList.d.ts +0 -13
- package/dist/admin/pages/stores/AdminStoreList.d.ts.map +0 -1
- package/dist/admin/pages/stores/AdminStoreList.js +0 -131
- package/dist/admin/pages/stores/AdminStoreList.js.map +0 -1
- package/dist/common/pages/stores/templates/EditStoreTemplatesPage.d.ts +0 -11
- package/dist/common/pages/stores/templates/EditStoreTemplatesPage.d.ts.map +0 -1
- package/dist/common/pages/stores/templates/EditStoreTemplatesPage.js +0 -28
- package/dist/common/pages/stores/templates/EditStoreTemplatesPage.js.map +0 -1
- package/src/admin/pages/stores/AdminStoreDetailPage.tsx +0 -102
- package/src/admin/pages/stores/AdminStoreList.tsx +0 -109
- package/src/common/pages/stores/templates/EditStoreTemplatesPage.tsx +0 -19
|
@@ -13,11 +13,18 @@ import styled from "@web-atoms/core/dist/style/styled";
|
|
|
13
13
|
import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
|
|
14
14
|
import { formatCurrency, formatPrice } from "../../common/currency";
|
|
15
15
|
import ToggleButtonBar from "@web-atoms/web-controls/dist/basic/ToggleButtonBar";
|
|
16
|
+
import { StoreUrlService } from "./StoreUrlService";
|
|
17
|
+
import WebSiteUserService from "../user/WebSiteUserService";
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
let storeID;
|
|
20
|
+
let itemID;
|
|
18
21
|
|
|
22
|
+
const { detail } = StoreUrlService.getParameters();
|
|
19
23
|
|
|
20
|
-
|
|
24
|
+
if (detail) {
|
|
25
|
+
storeID = detail.storeID;
|
|
26
|
+
itemID = detail.productID;
|
|
27
|
+
}
|
|
21
28
|
|
|
22
29
|
storeID = parseInt(storeID, 36);
|
|
23
30
|
itemID = parseInt(itemID, 36);
|
|
@@ -236,7 +243,7 @@ export default class StoreItemDetailView extends AtomControl {
|
|
|
236
243
|
|
|
237
244
|
getFiles(item: IStoreItem, variant: IStoreItem, size: IStoreItem) {
|
|
238
245
|
const variantFiles = variant?.mediaFiles?.filter((x) => x.isPreview);
|
|
239
|
-
const files = variantFiles ?? item.mediaFiles
|
|
246
|
+
const files = variantFiles ?? item.mediaFiles?.filter((x) => x.isPreview) ?? [];
|
|
240
247
|
if (size?.mediaFiles) {
|
|
241
248
|
files.push(... size.mediaFiles.filter((x) => x.isPreview));
|
|
242
249
|
}
|
|
@@ -303,7 +310,7 @@ export default class StoreItemDetailView extends AtomControl {
|
|
|
303
310
|
<p class="price">
|
|
304
311
|
<label text={ formatPrice(price) }/>
|
|
305
312
|
</p>
|
|
306
|
-
<button class="buy">Buy</button>
|
|
313
|
+
<button data-click-event="buy-now" class="buy">Buy</button>
|
|
307
314
|
|
|
308
315
|
{ this.model.sizes?.length && <ToggleButtonBar
|
|
309
316
|
items={this.model.sizes}
|
|
@@ -335,6 +342,12 @@ export default class StoreItemDetailView extends AtomControl {
|
|
|
335
342
|
this.selectedFile = this.model.mediaFiles.find((x) => x.appFileID === id);
|
|
336
343
|
}
|
|
337
344
|
|
|
345
|
+
@Action({ onEvent: "buy-now"})
|
|
346
|
+
async buyNow() {
|
|
347
|
+
const userService = this.resolve(WebSiteUserService);
|
|
348
|
+
const user = await userService.getUser();
|
|
349
|
+
}
|
|
350
|
+
|
|
338
351
|
async getItem() {
|
|
339
352
|
return this.entityService
|
|
340
353
|
.query(StoreItem, "storeQuery")
|
|
@@ -231,9 +231,11 @@ export default class StoreItemListView extends AtomControl {
|
|
|
231
231
|
<img
|
|
232
232
|
src={Bind.oneTimeAsync(() => this.downloadImage(item))}
|
|
233
233
|
/>
|
|
234
|
-
<
|
|
234
|
+
<a
|
|
235
|
+
title={item.name || item.variantFor?.name || item.name}
|
|
236
|
+
href={StoreUrlService.productUrl(item)}><button
|
|
235
237
|
class="buy"
|
|
236
|
-
text="Buy"
|
|
238
|
+
text="Buy"/></a>
|
|
237
239
|
<div class="price">
|
|
238
240
|
<label text={ formatPrice(item.storeItemPrices?.[0] ?? item.variantFor?.storeItemPrices?.[0] )}/>
|
|
239
241
|
</div>
|
|
@@ -3,21 +3,28 @@ import { toBase36 } from "../../common/toBase36";
|
|
|
3
3
|
import { IStoreItem } from "../../model/model";
|
|
4
4
|
|
|
5
5
|
export type IStorePageParameters = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
6
|
+
login?: {
|
|
7
|
+
storeID: any;
|
|
8
|
+
},
|
|
9
|
+
buy?: {
|
|
10
|
+
productID: any,
|
|
11
|
+
currency: string
|
|
12
|
+
},
|
|
13
|
+
detail?: {
|
|
14
|
+
storeID: any,
|
|
15
|
+
productID: any,
|
|
16
|
+
currency: any,
|
|
17
|
+
},
|
|
18
|
+
order?: {
|
|
19
|
+
storeID: any;
|
|
20
|
+
orderID: any;
|
|
21
|
+
}
|
|
22
|
+
orders?: {
|
|
23
|
+
storeID: any,
|
|
24
|
+
},
|
|
25
|
+
checkout?: {
|
|
26
|
+
orderID: any;
|
|
27
|
+
}
|
|
21
28
|
};
|
|
22
29
|
|
|
23
30
|
export const StoreUrlService = {
|
|
@@ -26,7 +33,7 @@ export const StoreUrlService = {
|
|
|
26
33
|
const storeID = toBase36(p.storeID);
|
|
27
34
|
const productID = toBase36(p.variantForID ?? p.storeItemID);
|
|
28
35
|
if (AppLocation.isLocalTesting) {
|
|
29
|
-
return `?detail
|
|
36
|
+
return `?detail=store/${storeID}/${productID}`;
|
|
30
37
|
}
|
|
31
38
|
return `/store/${storeID}/${productID}/${encodeURIComponent(p.name)}`;
|
|
32
39
|
},
|
|
@@ -42,29 +49,57 @@ export const StoreUrlService = {
|
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
const {
|
|
45
|
-
1:
|
|
46
|
-
2:
|
|
47
|
-
3:
|
|
52
|
+
1: root,
|
|
53
|
+
2: route,
|
|
54
|
+
3: p1,
|
|
55
|
+
4: p2
|
|
48
56
|
} = /^\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\/?/.exec(pathname) ?? [];
|
|
49
57
|
|
|
58
|
+
if (root !== "store") {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
|
|
50
62
|
switch(route) {
|
|
63
|
+
case "login":
|
|
64
|
+
return {
|
|
65
|
+
login: {
|
|
66
|
+
storeID: p1
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
case "orders":
|
|
70
|
+
return {
|
|
71
|
+
orders: {
|
|
72
|
+
storeID: p1
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
case "orders":
|
|
76
|
+
return {
|
|
77
|
+
order: {
|
|
78
|
+
storeID: p1,
|
|
79
|
+
orderID: p2
|
|
80
|
+
}
|
|
81
|
+
};
|
|
51
82
|
case "buy":
|
|
52
83
|
return {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
84
|
+
buy: {
|
|
85
|
+
productID: p1,
|
|
86
|
+
currency: p2 || "INR"
|
|
87
|
+
}
|
|
56
88
|
};
|
|
57
89
|
case "checkout":
|
|
58
90
|
return {
|
|
59
|
-
|
|
60
|
-
|
|
91
|
+
checkout: {
|
|
92
|
+
orderID: p1
|
|
93
|
+
}
|
|
61
94
|
};
|
|
62
95
|
}
|
|
63
96
|
|
|
64
97
|
return {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
98
|
+
detail: {
|
|
99
|
+
storeID: route,
|
|
100
|
+
productID: p1,
|
|
101
|
+
currency: p2 || "INR"
|
|
102
|
+
}
|
|
68
103
|
};
|
|
69
104
|
|
|
70
105
|
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import Bind from "@web-atoms/core/dist/core/Bind";
|
|
2
|
+
import XNode from "@web-atoms/core/dist/core/XNode";
|
|
3
|
+
import styled from "@web-atoms/core/dist/style/styled";
|
|
4
|
+
import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl";
|
|
5
|
+
import Form from "@web-atoms/web-controls/dist/basic/Form";
|
|
6
|
+
import FormField from "@web-atoms/web-controls/dist/basic/FormField";
|
|
7
|
+
import ToggleButtonBar from "@web-atoms/web-controls/dist/basic/ToggleButtonBar";
|
|
8
|
+
import PhoneEditor from "../../common/controls/phone-editor/PhoneEditor";
|
|
9
|
+
import { EmailIconButton, EmailIconTextButton, SaveIconTextButton, UploadIconButton } from "../../common/controls/buttons/IconButton";
|
|
10
|
+
import Action from "@web-atoms/core/dist/view-model/Action";
|
|
11
|
+
import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
|
|
12
|
+
import EntityService from "../../services/EntityService";
|
|
13
|
+
import { IVerificationToken, VerificationToken, VerificationTokenAddress } from "../../model/model";
|
|
14
|
+
import Loader from "../../common/controls/Loader";
|
|
15
|
+
import { AtomDisposableList } from "@web-atoms/core/dist/core/AtomDisposableList";
|
|
16
|
+
import { StringHelper } from "@web-atoms/core/dist/core/StringHelper";
|
|
17
|
+
import QRCodeControl from "../../common/controls/qrcode/QRCode";
|
|
18
|
+
|
|
19
|
+
styled.css `
|
|
20
|
+
position: absolute;
|
|
21
|
+
left: 0;
|
|
22
|
+
top: 0;
|
|
23
|
+
width: 100%;
|
|
24
|
+
height: 100vh;
|
|
25
|
+
|
|
26
|
+
background-color: canvas;
|
|
27
|
+
|
|
28
|
+
display: grid;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-items: center;
|
|
31
|
+
|
|
32
|
+
`.installGlobal("site-login");
|
|
33
|
+
|
|
34
|
+
styled.css `
|
|
35
|
+
& [styler-layout=component] {
|
|
36
|
+
position: relative;
|
|
37
|
+
}
|
|
38
|
+
`.installGlobal("body");
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
export interface IVerification {
|
|
42
|
+
id: any;
|
|
43
|
+
accessCode: string;
|
|
44
|
+
code: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface IUserModel {
|
|
48
|
+
emailAddress?: string;
|
|
49
|
+
phoneNumber?: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
|
|
52
|
+
email?: IVerification;
|
|
53
|
+
phone?: IVerification;
|
|
54
|
+
captcha?: IVerification;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const verifyModes = [
|
|
58
|
+
{ label: "Email", value: "email" },
|
|
59
|
+
{ label: "Cell Phone", value: "phone" }
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
export default class SiteLogin extends AtomControl {
|
|
63
|
+
|
|
64
|
+
@InjectProperty
|
|
65
|
+
entityService: EntityService;
|
|
66
|
+
|
|
67
|
+
model: IUserModel = { emailAddress: "", phoneNumber: "", name: "" };
|
|
68
|
+
|
|
69
|
+
verifyMode: string = "email";
|
|
70
|
+
|
|
71
|
+
constructor(app, e = document.createElement("site-login")) {
|
|
72
|
+
super(app, e);
|
|
73
|
+
this.element.setAttribute("site-login", "true");
|
|
74
|
+
this.pushInit();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async init() {
|
|
78
|
+
|
|
79
|
+
this.renderer = <div><Loader/></div>;
|
|
80
|
+
|
|
81
|
+
await this.verifyCaptcha();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async verifyCaptcha() {
|
|
85
|
+
|
|
86
|
+
const captcha = await this.entityService.save(VerificationToken.create({
|
|
87
|
+
type: "captcha"
|
|
88
|
+
}));
|
|
89
|
+
|
|
90
|
+
const { verificationID: id, accessCode } = captcha;
|
|
91
|
+
|
|
92
|
+
this.model.captcha = {
|
|
93
|
+
id,
|
|
94
|
+
accessCode,
|
|
95
|
+
code: ""
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
this.renderer = <div>
|
|
99
|
+
<Form>
|
|
100
|
+
<FormField label="Captcha">
|
|
101
|
+
<img src={`/api/users/captcha/${id}/${accessCode}`}/>
|
|
102
|
+
</FormField>
|
|
103
|
+
<FormField label="Enter 5 Digit Code">
|
|
104
|
+
<input
|
|
105
|
+
type="tel"
|
|
106
|
+
value={Bind.twoWaysImmediate(() => this.model.captcha.code)}/>
|
|
107
|
+
</FormField>
|
|
108
|
+
<div>
|
|
109
|
+
<UploadIconButton data-submit-event="verify-captcha"/>
|
|
110
|
+
</div>
|
|
111
|
+
</Form>
|
|
112
|
+
</div>;
|
|
113
|
+
|
|
114
|
+
await this.waitForEvents("verify-captcha");
|
|
115
|
+
|
|
116
|
+
const v = await this.entityService.invoke(VerificationToken, "verifyCode", captcha, id, accessCode, this.model.captcha.code);
|
|
117
|
+
if (!v.verified) {
|
|
118
|
+
alert("Verification failed, try again");
|
|
119
|
+
await this.verifyCaptcha();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
await this.displayCheckUserExists();
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
async displayCheckUserExists() {
|
|
129
|
+
this.renderer = <div>
|
|
130
|
+
<Form>
|
|
131
|
+
<FormField label="Verify">
|
|
132
|
+
<ToggleButtonBar items={verifyModes} value={Bind.twoWaysImmediate(() => this.verifyMode)} />
|
|
133
|
+
</FormField>
|
|
134
|
+
<FormField label="Email" style-display={Bind.oneWay(() => this.verifyMode === "email")}>
|
|
135
|
+
<input value={Bind.twoWaysImmediate(() => this.model.emailAddress)} />
|
|
136
|
+
</FormField>
|
|
137
|
+
<FormField label="Cell Phone" style-display={Bind.oneWay(() => this.verifyMode === "phone")}>
|
|
138
|
+
<PhoneEditor value={Bind.twoWaysImmediate(() => this.model.phoneNumber)} />
|
|
139
|
+
</FormField>
|
|
140
|
+
<div>
|
|
141
|
+
<EmailIconTextButton
|
|
142
|
+
data-submit-event="proceed-verification"
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
</Form>
|
|
146
|
+
</div>;
|
|
147
|
+
|
|
148
|
+
await this.waitForEvents("proceed-verification");
|
|
149
|
+
|
|
150
|
+
const isEmail = this.verifyMode === "email";
|
|
151
|
+
|
|
152
|
+
const type = isEmail ? "email" : "sms";
|
|
153
|
+
|
|
154
|
+
const address = isEmail ? this.model.emailAddress : this.model.phoneNumber;
|
|
155
|
+
|
|
156
|
+
const ve = VerificationToken.create({
|
|
157
|
+
type: "email",
|
|
158
|
+
verifyAddresses: address
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
await this.entityService.save(ve, (c) => c.include((x) => x.addresses));
|
|
162
|
+
|
|
163
|
+
if (!isEmail) {
|
|
164
|
+
this.renderer = <div>
|
|
165
|
+
<QRCodeControl
|
|
166
|
+
smsConfig={ve.smsConfig}
|
|
167
|
+
/>
|
|
168
|
+
</div>;
|
|
169
|
+
|
|
170
|
+
for (let index = 0; index < 5; index++) {
|
|
171
|
+
const v = await this.entityService.query(VerificationToken, "get", ve.verificationID, ve.accessCode)
|
|
172
|
+
.firstOrDefault();
|
|
173
|
+
if (v.verified) {
|
|
174
|
+
ve.verified = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (!ve.verified) {
|
|
180
|
+
await this.displayCheckUserExists();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@Action({ onEvent: "verify-email"})
|
|
188
|
+
async verifyEmail() {
|
|
189
|
+
|
|
190
|
+
const address = this.model.emailAddress;
|
|
191
|
+
|
|
192
|
+
const ve = VerificationToken.create({
|
|
193
|
+
type: "email",
|
|
194
|
+
verifyAddresses: [address]
|
|
195
|
+
});
|
|
196
|
+
await this.entityService.save(ve, (c) => c);
|
|
197
|
+
|
|
198
|
+
this.renderer = <div>
|
|
199
|
+
<Form>
|
|
200
|
+
<FormField label="Code">
|
|
201
|
+
|
|
202
|
+
</FormField>
|
|
203
|
+
</Form>
|
|
204
|
+
</div>;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@Action({ onEvent: "verify-phone"})
|
|
208
|
+
async verifyPhone() {
|
|
209
|
+
const address = this.model.emailAddress;
|
|
210
|
+
|
|
211
|
+
const ve = VerificationToken.create({
|
|
212
|
+
type: "email",
|
|
213
|
+
verifyAddresses: address
|
|
214
|
+
});
|
|
215
|
+
await this.entityService.save(ve, (c) => c);
|
|
216
|
+
|
|
217
|
+
this.renderer = <div>
|
|
218
|
+
<Form>
|
|
219
|
+
<FormField label="Code">
|
|
220
|
+
|
|
221
|
+
</FormField>
|
|
222
|
+
</Form>
|
|
223
|
+
</div>;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private waitForEvents<T = any>( ... names: string[]): Promise<CustomEvent<T>> {
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
|
|
229
|
+
const d = new AtomDisposableList();
|
|
230
|
+
for (const n of names) {
|
|
231
|
+
const name = StringHelper.fromHyphenToCamel(n);
|
|
232
|
+
d.add(this.bindEvent(this.element, name, (ce: CustomEvent) => {
|
|
233
|
+
d.dispose();
|
|
234
|
+
resolve(ce);
|
|
235
|
+
} ));
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
|
+
import { IUser, LoginSession } from "../../model/model";
|
|
3
|
+
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
4
|
+
import EntityService from "../../services/EntityService";
|
|
5
|
+
import SocialMailApp from "../../common/SocialMailApp";
|
|
6
|
+
import SiteLogin from "./SiteLogin";
|
|
7
|
+
import { App } from "@web-atoms/core/dist/App";
|
|
8
|
+
|
|
9
|
+
@DISingleton()
|
|
10
|
+
export default class WebSiteUserService {
|
|
11
|
+
|
|
12
|
+
@Inject
|
|
13
|
+
entityService: EntityService;
|
|
14
|
+
|
|
15
|
+
@Inject
|
|
16
|
+
app: App;
|
|
17
|
+
|
|
18
|
+
user: IUser = null;
|
|
19
|
+
|
|
20
|
+
public async getUser() {
|
|
21
|
+
this.user ??= (await this.entityService.query(LoginSession, "currentUser").firstOrDefault())?.user;
|
|
22
|
+
SocialMailApp.user = this.user;
|
|
23
|
+
if (this.user?.userID) {
|
|
24
|
+
// let start syncing...
|
|
25
|
+
// this.app.resolve(LocalDbService).syncAll(this.user.userID).catch(console.error);
|
|
26
|
+
return this.user;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
// request login..
|
|
31
|
+
const sl = new SiteLogin(this.app);
|
|
32
|
+
|
|
33
|
+
const c = document.body.querySelector(`[styler-layout="component"]`) ?? document.body;
|
|
34
|
+
c.appendChild(sl.element);
|
|
35
|
+
|
|
36
|
+
return this.user;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
2
|
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
3
3
|
import EntityService from "../EntityService";
|
|
4
|
-
import { AppFile, IStoreItem,
|
|
4
|
+
import { AppFile, IStoreItem, StoreItem, StoreMediaFile, WebSiteFolder } from "../../model/model";
|
|
5
5
|
import { Sql } from "../../common/Sql";
|
|
6
6
|
import DateTime from "@web-atoms/date-time/dist/DateTime";
|
|
7
7
|
import MimeTypeService from "../files/MimeTypeService";
|
|
@@ -20,8 +20,9 @@ export default class StoreItemService {
|
|
|
20
20
|
cloudFileService: CloudFileService;
|
|
21
21
|
|
|
22
22
|
getStore(storeID: any) {
|
|
23
|
-
return this.entityService.query(
|
|
24
|
-
.where({ storeID }, (p) => (x) => x.
|
|
23
|
+
return this.entityService.query(WebSiteFolder)
|
|
24
|
+
.where({ storeID }, (p) => (x) => x.folderID === p.storeID)
|
|
25
|
+
.include((x) => x.folder)
|
|
25
26
|
.firstOrDefault();
|
|
26
27
|
}
|
|
27
28
|
|
|
@@ -43,7 +44,8 @@ export default class StoreItemService {
|
|
|
43
44
|
const item = items.find((x) => x.storeItemID === id);
|
|
44
45
|
if (!item.folderID) {
|
|
45
46
|
// lets create one...
|
|
46
|
-
const store = await this.entityService.query(
|
|
47
|
+
const store = await this.entityService.query(WebSiteFolder).where({ storeID: item.storeID}, (p) => (x) => x.folderID === p.storeID)
|
|
48
|
+
.include((x) => x.folder)
|
|
47
49
|
.firstOrDefault();
|
|
48
50
|
const { folderID: parentID} = store;
|
|
49
51
|
const now = DateTime.now;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
2
|
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
3
3
|
import EntityService from "../EntityService";
|
|
4
|
-
import {
|
|
4
|
+
import { IWebSiteFolder, WebSiteFolder } from "../../model/model";
|
|
5
5
|
import { Sql } from "../../common/Sql";
|
|
6
6
|
|
|
7
7
|
@DISingleton()
|
|
@@ -11,12 +11,11 @@ export default class StoreService {
|
|
|
11
11
|
private entityService: EntityService;
|
|
12
12
|
|
|
13
13
|
async get(storeID) {
|
|
14
|
-
return this.entityService.query(
|
|
15
|
-
.where({ storeID }, (p) => (x) => x.
|
|
16
|
-
.include((x) =>
|
|
17
|
-
x.
|
|
18
|
-
|
|
19
|
-
])
|
|
14
|
+
return this.entityService.query(WebSiteFolder)
|
|
15
|
+
.where({ storeID }, (p) => (x) => x.folderID === p.storeID)
|
|
16
|
+
.include((x) =>
|
|
17
|
+
x.folder.accessList
|
|
18
|
+
)
|
|
20
19
|
.firstOrDefault();
|
|
21
20
|
}
|
|
22
21
|
|
|
@@ -31,13 +30,14 @@ export default class StoreService {
|
|
|
31
30
|
size = 100,
|
|
32
31
|
cancelToken
|
|
33
32
|
}) {
|
|
34
|
-
let q = this.entityService.query(
|
|
33
|
+
let q = this.entityService.query(WebSiteFolder);
|
|
35
34
|
if (search) {
|
|
36
35
|
search = search + "%";
|
|
37
|
-
q = q.where({ search }, (p) => (x) => Sql.text.like(x.name, p.search));
|
|
36
|
+
q = q.where({ search }, (p) => (x) => Sql.text.like(x.folder.name, p.search));
|
|
38
37
|
}
|
|
39
38
|
return q
|
|
40
|
-
.orderByDescending((x) => x.
|
|
39
|
+
.orderByDescending((x) => x.folderID)
|
|
40
|
+
.include((x) => x.folder)
|
|
41
41
|
.toPagedList({
|
|
42
42
|
start,
|
|
43
43
|
size,
|
|
@@ -45,7 +45,7 @@ export default class StoreService {
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
async save(store:
|
|
48
|
+
async save(store: IWebSiteFolder) {
|
|
49
49
|
await this.entityService.save(store, (x) => x);
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -136,8 +136,8 @@ export default class AppDrawer extends Drawer {
|
|
|
136
136
|
commandLink={null}
|
|
137
137
|
/>
|
|
138
138
|
{ ... stores.map((s) => <MenuItem
|
|
139
|
-
label={s.name}
|
|
140
|
-
commandLink={AppCommands.editStore.displayRoute({ id: s.
|
|
139
|
+
label={s.folder.name}
|
|
140
|
+
commandLink={AppCommands.editStore.displayRoute({ id: s.folderID})}
|
|
141
141
|
/>)}
|
|
142
142
|
</ExpanderMenu>}
|
|
143
143
|
{ mailboxes.length && <MenuItem
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
|
|
2
|
-
import { IStore, IStoreUser, IWebSiteStore } from "../../../model/model";
|
|
3
|
-
export default class AdminStoreDetailPage extends ContentPage<IStore> {
|
|
4
|
-
model: IStore;
|
|
5
|
-
private storeService;
|
|
6
|
-
init(): Promise<void>;
|
|
7
|
-
chooseUser(): Promise<IStoreUser>;
|
|
8
|
-
chooseWebSite(): Promise<IWebSiteStore>;
|
|
9
|
-
saveStore(): Promise<void>;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=AdminStoreDetailPage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminStoreDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/admin/pages/stores/AdminStoreDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mDAAmD,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAA0C,MAAM,sBAAsB,CAAC;AAiBjH,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,WAAW,CAAC,MAAM,CAAC;IAE1D,KAAK,EAAE,MAAM,CAAC;IAGrB,OAAO,CAAC,YAAY,CAAe;IAE7B,IAAI;IAkDJ,UAAU;IAQV,aAAa;IAcb,SAAS;CAIlB"}
|