feat(common): improve confirmation modal api

This commit is contained in:
2026-01-30 23:14:51 +01:00
parent 8e7895ae59
commit db4b5cc9f9
7 changed files with 27 additions and 30 deletions

View File

@@ -18,12 +18,12 @@ const CLIP_HEIGHT = LOGICAL_HEIGHT - BOTTOM_BAR_HEIGHT;
const handleActivateA = () => {
confirmationModal.onConfirm?.();
confirmationModal.close();
confirmationModal.close("confirm");
};
const handleActivateB = () => {
confirmationModal.onCancel?.();
confirmationModal.close();
confirmationModal.close("cancel");
};
onRender((ctx) => {
@@ -45,7 +45,7 @@ onRender((ctx) => {
}, 100);
onUnmounted(() => {
confirmationModal.close();
confirmationModal.close("cancel");
});
</script>

View File

@@ -14,17 +14,13 @@ const handleActivateB = () => {
const handleActivateA = () => {
if (isDead()) {
resetBoard();
confirmationModal.close();
return;
}
let confirmed = false;
confirmationModal.open({
text: $t("settings.options.2048.restartConfirmation"),
onConfirm: () => {
confirmed = true;
},
onClosed: () => {
if (confirmed) {
onConfirm: () => {},
onClosed: (choice) => {
if (choice === "confirm") {
resetBoard();
}
},
@@ -93,14 +89,11 @@ let tiles: VisualTile[] = [];
let animating = false;
const showRestartModal = () => {
let confirmed = false;
confirmationModal.open({
text: $t("settings.options.2048.gameOver"),
onConfirm: () => {
confirmed = true;
},
onClosed: () => {
if (confirmed) {
onConfirm: () => {},
onClosed: (choice) => {
if (choice === "confirm") {
resetBoard();
}
},

View File

@@ -93,9 +93,8 @@ const handleConfirm = () => {
{ locale: selectedLocale.code },
),
onClosed: () => store.closeSubMenu(),
timeout: 2000,
});
// TODO: add "timeout" to confirmationModal.open
setTimeout(() => confirmationModal.close(), 2000);
};
onRender((ctx) => {

View File

@@ -42,8 +42,8 @@ const handleConfirm = () => {
onClosed: () => {
store.closeSubMenu();
},
timeout: 2000,
});
setTimeout(() => confirmationModal.close(), 2000);
};
until(() => app.ready)

View File

@@ -43,10 +43,8 @@ const handleActivateA = () => {
confirmationModal.open({
text,
onClosed: () => store.closeSubMenu(),
timeout: 2000,
});
setTimeout(() => {
confirmationModal.close();
}, 2000);
};
defineOptions({ render: () => null });

View File

@@ -125,10 +125,8 @@ const handleConfirm = () => {
confirmationModal.open({
text: $t("settings.user.color.confirmation"),
onClosed: () => store.closeSubMenu(),
timeout: 2000,
});
setTimeout(() => {
confirmationModal.close();
}, 2000);
};
</script>

View File

@@ -10,8 +10,8 @@ export const useConfirmationModal = defineStore("confirmationModal", {
isOpen: false,
text: "",
onConfirm: null as (() => void) | null,
onClosed: null as (() => void) | null,
onCancel: null as (() => void) | null,
onClosed: null as ((choice: "confirm" | "cancel") => void) | null,
offsetY: MODAL_MAX_Y_OFFSET,
buttonsYOffset: 0,
modalButtonsYOffset: BUTTONS_MAX_Y_OFFSET,
@@ -24,7 +24,8 @@ export const useConfirmationModal = defineStore("confirmationModal", {
text: string;
onCancel?: () => void;
onConfirm?: () => void;
onClosed?: () => void;
onClosed?: (choice: "confirm" | "cancel") => void;
timeout?: number;
}) {
gsap.killTweensOf(this);
this.text = options.text;
@@ -58,10 +59,17 @@ export const useConfirmationModal = defineStore("confirmationModal", {
this,
{ modalButtonsYOffset: BUTTONS_MAX_Y_OFFSET },
{ modalButtonsYOffset: 0, duration: BUTTONS_TIME, ease: "none" },
);
)
.call(() => {
if (options.timeout) {
setTimeout(() => {
this.close("cancel");
}, options.timeout);
}
});
},
close() {
close(choice: "confirm" | "cancel") {
if (!this.isVisible || this.isClosing) return;
this.isClosing = true;
@@ -89,6 +97,7 @@ export const useConfirmationModal = defineStore("confirmationModal", {
.call(() => {
const closedCallback = this.onClosed;
// TODO: this.$reset() ?
this.isVisible = false;
this.isClosing = false;
this.isOpen = false;
@@ -96,7 +105,7 @@ export const useConfirmationModal = defineStore("confirmationModal", {
this.onConfirm = null;
this.onClosed = null;
closedCallback?.();
closedCallback?.(choice);
});
},
},