@wix/himalaya-cli 0.1142.0 → 0.1144.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/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/delivery-contract.d.ts +104 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/delivery.d.ts +33 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/index.d.ts +5 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap.mjs +509 -3
- package/dist/cli.mjs +31387 -30592
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/getting-started.md +29 -11
- package/guides/himi-skill.md +29 -11
- package/guides/sdk-reference.json +132 -0
- package/guides/templates.md +33 -0
- package/guides/trim-a-template.md +13 -0
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +2 -0
- package/templates/beauty-salon/tier5-src/himi-booking-time/index.ts +2 -2
- package/templates/beauty-salon/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/branded-lite/dev/index.ts +3 -1
- package/templates/branded-lite/tier5-src/himi-booking-time/index.ts +2 -2
- package/templates/branded-lite/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/branded-lite/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/community-club/dev/index.ts +2 -1
- package/templates/community-club/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/community-club/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/events-meetups/dev/index.ts +2 -1
- package/templates/events-meetups/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/events-meetups/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/gym-fitness/dev/index.ts +3 -1
- package/templates/gym-fitness/tier5-src/himi-booking-time/index.ts +2 -2
- package/templates/gym-fitness/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/gym-fitness/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/nonprofit-cause/dev/index.ts +2 -1
- package/templates/nonprofit-cause/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/nonprofit-cause/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/podcast-creator/dev/index.ts +2 -1
- package/templates/podcast-creator/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/podcast-creator/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/portfolio-creative/dev/index.ts +2 -1
- package/templates/portfolio-creative/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/portfolio-creative/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/restaurant/dev/index.ts +2 -1
- package/templates/restaurant/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/restaurant/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/retail-store/dev/index.ts +1 -0
- package/templates/retail-store/tier5-src/himi-store-account/index.ts +7 -1
- package/templates/yoga-studio/dev/index.ts +3 -1
- package/templates/yoga-studio/tier5-src/himi-booking-time/index.ts +2 -2
- package/templates/yoga-studio/tier5-src/himi-events-rsvp/index.ts +2 -2
- package/templates/yoga-studio/tier5-src/himi-store-account/index.ts +7 -1
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2581,6 +2581,7 @@ const SCREENS = runtimeSetting({
|
|
|
2581
2581
|
"type": "TextField",
|
|
2582
2582
|
"props": {
|
|
2583
2583
|
"placeholder": "Password",
|
|
2584
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2584
2585
|
"secure": true,
|
|
2585
2586
|
"autoCapitalization": "none",
|
|
2586
2587
|
"onChange": {
|
|
@@ -31169,6 +31170,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
31169
31170
|
"type": "TextField",
|
|
31170
31171
|
"props": {
|
|
31171
31172
|
"placeholder": "Password",
|
|
31173
|
+
"valuePath": "$service:himiBookingTime.password",
|
|
31172
31174
|
"secure": true,
|
|
31173
31175
|
"autoCapitalization": "none",
|
|
31174
31176
|
"onChange": {
|
|
@@ -32923,7 +32925,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
32923
32925
|
"type": "TextField",
|
|
32924
32926
|
"props": {
|
|
32925
32927
|
"placeholder": "Password",
|
|
32926
|
-
"
|
|
32928
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
32927
32929
|
"secure": true,
|
|
32928
32930
|
"autoCapitalization": "none",
|
|
32929
32931
|
"onChange": {
|
|
@@ -603,7 +603,7 @@ const svc = defineService<S, {
|
|
|
603
603
|
message: copyParam("time.signedInReady", "Signed in. You can book this time now."),
|
|
604
604
|
});
|
|
605
605
|
} catch {
|
|
606
|
-
return derive({ ...s, message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
|
|
606
|
+
return derive({ ...s, password: "", message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
|
|
607
607
|
}
|
|
608
608
|
},
|
|
609
609
|
register: async (s) => {
|
|
@@ -626,7 +626,7 @@ const svc = defineService<S, {
|
|
|
626
626
|
message: copyParam("time.registerReady", "Account created. You can book this time now."),
|
|
627
627
|
});
|
|
628
628
|
} catch {
|
|
629
|
-
return derive({ ...s, message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
|
|
629
|
+
return derive({ ...s, password: "", message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
|
|
630
630
|
}
|
|
631
631
|
},
|
|
632
632
|
bookSelected: async (s) => {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2235,6 +2235,7 @@ const SCREENS = runtimeSetting({
|
|
|
2235
2235
|
"type": "TextField",
|
|
2236
2236
|
"props": {
|
|
2237
2237
|
"placeholder": "Password",
|
|
2238
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2238
2239
|
"secure": true,
|
|
2239
2240
|
"autoCapitalization": "none",
|
|
2240
2241
|
"onChange": {
|
|
@@ -19612,7 +19613,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
19612
19613
|
"type": "TextField",
|
|
19613
19614
|
"props": {
|
|
19614
19615
|
"placeholder": "Password",
|
|
19615
|
-
"
|
|
19616
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
19616
19617
|
"secure": true,
|
|
19617
19618
|
"autoCapitalization": "none",
|
|
19618
19619
|
"onChange": {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2173,6 +2173,7 @@ const SCREENS = runtimeSetting({
|
|
|
2173
2173
|
"type": "TextField",
|
|
2174
2174
|
"props": {
|
|
2175
2175
|
"placeholder": "Password",
|
|
2176
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2176
2177
|
"secure": true,
|
|
2177
2178
|
"autoCapitalization": "none",
|
|
2178
2179
|
"onChange": {
|
|
@@ -19965,7 +19966,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
19965
19966
|
"type": "TextField",
|
|
19966
19967
|
"props": {
|
|
19967
19968
|
"placeholder": "Password",
|
|
19968
|
-
"
|
|
19969
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
19969
19970
|
"secure": true,
|
|
19970
19971
|
"autoCapitalization": "none",
|
|
19971
19972
|
"onChange": {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2043,6 +2043,7 @@ const SCREENS = runtimeSetting({
|
|
|
2043
2043
|
"type": "TextField",
|
|
2044
2044
|
"props": {
|
|
2045
2045
|
"placeholder": "Password",
|
|
2046
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2046
2047
|
"secure": true,
|
|
2047
2048
|
"autoCapitalization": "none",
|
|
2048
2049
|
"onChange": {
|
|
@@ -24332,7 +24333,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
24332
24333
|
"type": "TextField",
|
|
24333
24334
|
"props": {
|
|
24334
24335
|
"placeholder": "Password",
|
|
24335
|
-
"
|
|
24336
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
24336
24337
|
"secure": true,
|
|
24337
24338
|
"autoCapitalization": "none",
|
|
24338
24339
|
"onChange": {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2099,6 +2099,7 @@ const SCREENS = runtimeSetting({
|
|
|
2099
2099
|
"type": "TextField",
|
|
2100
2100
|
"props": {
|
|
2101
2101
|
"placeholder": "Password",
|
|
2102
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2102
2103
|
"secure": true,
|
|
2103
2104
|
"autoCapitalization": "none",
|
|
2104
2105
|
"onChange": {
|
|
@@ -17408,7 +17409,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
17408
17409
|
"type": "TextField",
|
|
17409
17410
|
"props": {
|
|
17410
17411
|
"placeholder": "Password",
|
|
17411
|
-
"
|
|
17412
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
17412
17413
|
"secure": true,
|
|
17413
17414
|
"autoCapitalization": "none",
|
|
17414
17415
|
"onChange": {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|
|
@@ -2507,6 +2507,7 @@ const SCREENS = runtimeSetting({
|
|
|
2507
2507
|
"type": "TextField",
|
|
2508
2508
|
"props": {
|
|
2509
2509
|
"placeholder": "Password",
|
|
2510
|
+
"valuePath": "$service:himiStoreAccount.password",
|
|
2510
2511
|
"secure": true,
|
|
2511
2512
|
"autoCapitalization": "none",
|
|
2512
2513
|
"onChange": {
|
|
@@ -24951,6 +24952,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
24951
24952
|
"type": "TextField",
|
|
24952
24953
|
"props": {
|
|
24953
24954
|
"placeholder": "Password",
|
|
24955
|
+
"valuePath": "$service:himiBookingTime.password",
|
|
24954
24956
|
"secure": true,
|
|
24955
24957
|
"autoCapitalization": "none",
|
|
24956
24958
|
"onChange": {
|
|
@@ -27133,7 +27135,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
27133
27135
|
"type": "TextField",
|
|
27134
27136
|
"props": {
|
|
27135
27137
|
"placeholder": "Password",
|
|
27136
|
-
"
|
|
27138
|
+
"valuePath": "$service:himiEventsRsvp.password",
|
|
27137
27139
|
"secure": true,
|
|
27138
27140
|
"autoCapitalization": "none",
|
|
27139
27141
|
"onChange": {
|
|
@@ -603,7 +603,7 @@ const svc = defineService<S, {
|
|
|
603
603
|
message: copyParam("time.signedInReady", "Signed in. You can book this time now."),
|
|
604
604
|
});
|
|
605
605
|
} catch {
|
|
606
|
-
return derive({ ...s, message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
|
|
606
|
+
return derive({ ...s, password: "", message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
|
|
607
607
|
}
|
|
608
608
|
},
|
|
609
609
|
register: async (s) => {
|
|
@@ -626,7 +626,7 @@ const svc = defineService<S, {
|
|
|
626
626
|
message: copyParam("time.registerReady", "Account created. You can book this time now."),
|
|
627
627
|
});
|
|
628
628
|
} catch {
|
|
629
|
-
return derive({ ...s, message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
|
|
629
|
+
return derive({ ...s, password: "", message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
|
|
630
630
|
}
|
|
631
631
|
},
|
|
632
632
|
bookSelected: async (s) => {
|
|
@@ -179,9 +179,9 @@ const svc = defineService<S, {
|
|
|
179
179
|
try {
|
|
180
180
|
await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
|
|
181
181
|
const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
|
|
182
|
-
return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
182
|
+
return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
|
|
183
183
|
} catch {
|
|
184
|
-
return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
184
|
+
return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
rsvp: async (s) => {
|
|
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
|
|
|
77
77
|
if (!next.isMember) return derive({ ...next, message: notMemberMessage });
|
|
78
78
|
return resumeAfterAuth(derive({ ...next, message: "" }));
|
|
79
79
|
} catch {
|
|
80
|
-
|
|
80
|
+
// Clear the password: service state is snapshotted to disk (the worker-state
|
|
81
|
+
// store), so a failed attempt must not leave it there in cleartext. The Password
|
|
82
|
+
// field binds `valuePath` to it, so the field empties too and a retry re-types.
|
|
83
|
+
return derive({ ...s, password: "", message: failedMessage });
|
|
81
84
|
} finally {
|
|
82
85
|
authInFlight = false;
|
|
83
86
|
}
|
|
@@ -168,6 +171,9 @@ interface S {
|
|
|
168
171
|
noReturnPath: boolean;
|
|
169
172
|
returnCta: string;
|
|
170
173
|
email: string;
|
|
174
|
+
/** Held only from typing to the submit. Service state is persisted, so every
|
|
175
|
+
* submitted sign-in/register clears it (success, not-a-member, and failure), as
|
|
176
|
+
* do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
|
|
171
177
|
password: string;
|
|
172
178
|
firstName: string;
|
|
173
179
|
lastName: string;
|