feat(confirm): centralize confirmation dialogs and add i18n
Introduce a generic ConfirmDialog and a promise-based requestConfirmation API in App.svelte so callers can await user responses instead of using window.confirm. Provide helper builders (branchDeleteConfirmRequest, discardConfirmRequest) to create dialog content for common cases. Many call sites were switched to use requestConfirmation and now render the in-app ConfirmDialog; the previous specialized confirm components (BranchDeleteConfirmDialog, DiscardConfirmDialog) were removed. Add lightweight i18n support (setLanguage, t()) and new messages/i18n modules, and replace hardcoded English strings in several components (e.g. AiSettingsPage, BlameDialog and many confirmation prompts) with translated keys. Summary of effects: - Replaces native window.confirm with awaitable in-app ConfirmDialog dialogs. - Centralizes confirmation UI and content construction in App.svelte. - Adds i18n plumbing and updates UI text to use t(). - Removes two specialized confirm dialog components and adds src/lib/components/ConfirmDialog.svelte.
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
import { onMount } from "svelte";
|
||||
import type { AiSettings } from "../types";
|
||||
import CreateReviewDialog from "./CreateReviewDialog.svelte";
|
||||
import ConfirmDialog, { type ConfirmRequest } from "./ConfirmDialog.svelte";
|
||||
import { t } from "../i18n.svelte";
|
||||
import CommentEditor from "./CommentEditor.svelte";
|
||||
import SelectMenu from "./SelectMenu.svelte";
|
||||
import { cubicOut } from "svelte/easing";
|
||||
@@ -340,16 +342,35 @@
|
||||
return de ? "Request wieder öffnen" : "Reopen request";
|
||||
}
|
||||
|
||||
let reviewConfirmRequest = $state<ConfirmRequest | null>(null);
|
||||
let reviewConfirmResolve: ((confirmed: boolean) => void) | null = null;
|
||||
|
||||
function askReviewConfirmation(request: IntegrationReviewRequest, action: IntegrationReviewAction): Promise<boolean> {
|
||||
const values = { number: request.number };
|
||||
reviewConfirmRequest = action === "merge"
|
||||
? { title: t("confirm.review.mergeTitle", values), message: t("confirm.review.mergeMessage"), items: [request.title], confirmLabel: t("confirm.review.mergeAction"), danger: false }
|
||||
: action === "close"
|
||||
? { title: t("confirm.review.closeTitle", values), message: t("confirm.review.closeMessage"), items: [request.title], confirmLabel: t("confirm.review.closeAction") }
|
||||
: { title: t("confirm.review.reopenTitle", values), message: t("confirm.review.reopenMessage"), items: [request.title], confirmLabel: t("confirm.review.reopenAction"), danger: false };
|
||||
|
||||
return new Promise<boolean>((resolve) => {
|
||||
reviewConfirmResolve = resolve;
|
||||
});
|
||||
}
|
||||
|
||||
function answerReviewConfirmation(confirmed: boolean) {
|
||||
const resolve = reviewConfirmResolve;
|
||||
reviewConfirmRequest = null;
|
||||
reviewConfirmResolve = null;
|
||||
resolve?.(confirmed);
|
||||
}
|
||||
|
||||
async function performReviewAction(request: IntegrationReviewRequest, action: IntegrationReviewAction) {
|
||||
const source = activeSource;
|
||||
if (!source || actionBusyId) return;
|
||||
if (action !== "approve") {
|
||||
const prompt = action === "merge"
|
||||
? (de ? `Request #${request.number} wirklich zusammenführen?` : `Merge request #${request.number}?`)
|
||||
: action === "close"
|
||||
? (de ? `Request #${request.number} wirklich schließen?` : `Close request #${request.number}?`)
|
||||
: (de ? `Request #${request.number} wieder öffnen?` : `Reopen request #${request.number}?`);
|
||||
if (!window.confirm(prompt)) return;
|
||||
const confirmed = await askReviewConfirmation(request, action);
|
||||
if (!confirmed) return;
|
||||
}
|
||||
actionMenuId = "";
|
||||
actionNotice = "";
|
||||
@@ -636,3 +657,11 @@
|
||||
.review-center .action-menu button:hover:not(:disabled){background:var(--color-surface-hover)}
|
||||
.review-comment-editor{flex:0 0 auto;min-width:0;padding:14px 0 18px;border-top:1px solid var(--color-border-subtle)}
|
||||
</style>
|
||||
|
||||
{#if reviewConfirmRequest}
|
||||
<ConfirmDialog
|
||||
request={reviewConfirmRequest}
|
||||
onConfirm={() => answerReviewConfirmation(true)}
|
||||
onCancel={() => answerReviewConfirmation(false)}
|
||||
/>
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user