Skip to content

Commit 141e3f1

Browse files
committed
Moved tainted check to RoleMethod.
1 parent 49a2104 commit 141e3f1

File tree

2 files changed

+45
-47
lines changed

2 files changed

+45
-47
lines changed

src/lib/client/superForm.ts

+45-47
Original file line numberDiff line numberDiff line change
@@ -1114,11 +1114,54 @@ export function superForm<
11141114
//#region Tainted
11151115

11161116
const Tainted = {
1117+
defaultMessage: 'Leave page? Changes that you made may not be saved.',
11171118
state: writable<TaintedFields<T> | undefined>(),
11181119
message: options.taintedMessage,
1119-
clean: clone(form.data) // Important to clone form.data, so it's not comparing the same object,
1120+
clean: clone(form.data), // Important to clone form.data, so it's not comparing the same object,
1121+
forceRedirection: false
11201122
};
11211123

1124+
async function Tainted_check(nav: BeforeNavigate) {
1125+
if (options.taintedMessage && !Data.submitting && !Tainted.forceRedirection) {
1126+
if (Tainted_isTainted()) {
1127+
const { taintedMessage } = options;
1128+
const isTaintedFunction = typeof taintedMessage === 'function';
1129+
1130+
// As beforeNavigate does not support Promise, we cancel the redirection until the promise resolve
1131+
// if it's a custom function
1132+
if (isTaintedFunction) nav.cancel();
1133+
// Does not display any dialog on page refresh or closing tab, will use default browser behaviour
1134+
if (nav.type === 'leave') return;
1135+
1136+
const message =
1137+
isTaintedFunction || taintedMessage === true ? Tainted.defaultMessage : taintedMessage;
1138+
1139+
let shouldRedirect;
1140+
try {
1141+
// - rejected => shouldRedirect = false
1142+
// - resolved with false => shouldRedirect = false
1143+
// - resolved with true => shouldRedirect = true
1144+
shouldRedirect = isTaintedFunction ? await taintedMessage() : window.confirm(message);
1145+
} catch {
1146+
shouldRedirect = false;
1147+
}
1148+
1149+
if (shouldRedirect && nav.to) {
1150+
try {
1151+
Tainted.forceRedirection = true;
1152+
await goto(nav.to.url, { ...nav.to.params });
1153+
return;
1154+
} finally {
1155+
// Reset forceRedirection for multiple-tainted purpose
1156+
Tainted.forceRedirection = false;
1157+
}
1158+
} else if (!shouldRedirect && !isTaintedFunction) {
1159+
nav.cancel();
1160+
}
1161+
}
1162+
}
1163+
}
1164+
11221165
function Tainted_enable() {
11231166
options.taintedMessage = Tainted.message;
11241167
}
@@ -1353,53 +1396,8 @@ export function superForm<
13531396

13541397
///// Store subscriptions ///////////////////////////////////////////////////
13551398

1356-
// Tainted check
1357-
const defaultMessage = 'Leave page? Changes that you made may not be saved.';
1358-
let forceRedirection = false;
1359-
1360-
async function taintedCheck(nav: BeforeNavigate) {
1361-
if (options.taintedMessage && !Data.submitting && !forceRedirection) {
1362-
if (Tainted_isTainted()) {
1363-
const { taintedMessage } = options;
1364-
const isTaintedFunction = typeof taintedMessage === 'function';
1365-
1366-
// As beforeNavigate does not support Promise, we cancel the redirection until the promise resolve
1367-
// if it's a custom function
1368-
if (isTaintedFunction) nav.cancel();
1369-
// Does not display any dialog on page refresh or closing tab, will use default browser behaviour
1370-
if (nav.type === 'leave') return;
1371-
1372-
const message =
1373-
isTaintedFunction || taintedMessage === true ? defaultMessage : taintedMessage;
1374-
1375-
let shouldRedirect;
1376-
try {
1377-
// - rejected => shouldRedirect = false
1378-
// - resolved with false => shouldRedirect = false
1379-
// - resolved with true => shouldRedirect = true
1380-
shouldRedirect = isTaintedFunction ? await taintedMessage() : window.confirm(message);
1381-
} catch {
1382-
shouldRedirect = false;
1383-
}
1384-
1385-
if (shouldRedirect && nav.to) {
1386-
try {
1387-
forceRedirection = true;
1388-
await goto(nav.to.url, { ...nav.to.params });
1389-
return;
1390-
} finally {
1391-
// Reset forceRedirection for multiple-tainted purpose
1392-
forceRedirection = false;
1393-
}
1394-
} else if (!shouldRedirect && !isTaintedFunction) {
1395-
nav.cancel();
1396-
}
1397-
}
1398-
}
1399-
}
1400-
14011399
if (browser) {
1402-
beforeNavigate(taintedCheck);
1400+
beforeNavigate(Tainted_check);
14031401

14041402
// Need to subscribe to catch page invalidation.
14051403
Unsubscriptions_add(

src/lib/client/tainted.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)