Skip to content

Commit c279ec0

Browse files
author
Christian
committed
Handling ignored EditRetry
1 parent 73e78b3 commit c279ec0

File tree

6 files changed

+75
-8
lines changed

6 files changed

+75
-8
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<script setup lang="ts">
2+
const emit = defineEmits<{
3+
close: [];
4+
}>();
5+
6+
function closeDialog() {
7+
emit("close");
8+
}
9+
</script>
10+
11+
<template>
12+
<section name="edit_ignored_dialog">
13+
<div class="modal" style="z-index: 1050; display: block" role="dialog" aria-label="edit ignored">
14+
<div class="modal-mask">
15+
<div class="modal-dialog">
16+
<div class="modal-content">
17+
<div class="modal-header">
18+
<div class="modal-title">
19+
<h3>Edit Ignored</h3>
20+
</div>
21+
</div>
22+
<div class="modal-body">
23+
<p>This message retry was ignored because there had been another edit.</p>
24+
</div>
25+
<div class="modal-footer">
26+
<button class="btn btn-primary" @click="closeDialog()">Ok</button>
27+
</div>
28+
</div>
29+
</div>
30+
</div>
31+
</div>
32+
</section>
33+
</template>
34+
35+
<style scoped>
36+
@import "@/components/modal.css";
37+
</style>

src/Frontend/src/components/failedmessages/EditRetryDialog.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<script setup lang="ts">
22
import { computed, onMounted, ref, watch } from "vue";
3-
import { useRetryEditedMessage } from "@/composables/serviceFailedMessage";
43
import MessageHeader from "./EditMessageHeader.vue";
54
import type Header from "@/resources/Header";
65
import parseContentType from "@/composables/contentTypeParser";
@@ -105,7 +104,7 @@ function removeHeadersMarkedAsRemoved() {
105104
async function retryEditedMessage() {
106105
removeHeadersMarkedAsRemoved();
107106
try {
108-
await useRetryEditedMessage(id.value, localMessage);
107+
await store.retryEditedMessage(id.value, localMessage);
109108
localMessage.value.retried = true;
110109
return emit("confirm");
111110
} catch {

src/Frontend/src/components/messages/EditAndRetryButton.vue

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,31 @@ import { computed, ref } from "vue";
44
import { useShowToast } from "@/composables/toast";
55
import { TYPE } from "vue-toastification";
66
import EditRetryDialog from "@/components/failedmessages/EditRetryDialog.vue";
7+
import EditIgnoredDialog from "@/components/failedmessages/EditIgnoredDialog.vue";
78
import { MessageStatus } from "@/resources/Message";
89
import { storeToRefs } from "pinia";
910
import { FailedMessageStatus } from "@/resources/FailedMessage";
1011
import FAIcon from "@/components/FAIcon.vue";
1112
import { faPencil } from "@fortawesome/free-solid-svg-icons";
1213
1314
const store = useMessageStore();
14-
const { state, edit_and_retry_config } = storeToRefs(store);
15+
const { state, edit_and_retry_config, editRetryResponse } = storeToRefs(store);
1516
const isConfirmDialogVisible = ref(false);
17+
const isEditIgnoredDialogVisible = ref(false);
1618
1719
const failureStatus = computed(() => state.value.data.failure_status);
1820
const isDisabled = computed(() => failureStatus.value.retried || failureStatus.value.archived || failureStatus.value.resolved);
1921
const isVisible = computed(() => edit_and_retry_config.value.enabled && state.value.data.status !== MessageStatus.Successful && state.value.data.status !== MessageStatus.ResolvedSuccessfully);
22+
2023
const handleConfirm = async () => {
2124
isConfirmDialogVisible.value = false;
2225
23-
const message = `Retrying the edited message ${state.value.data.id} ...`;
24-
useShowToast(TYPE.INFO, "Info", message);
26+
if (editRetryResponse.value?.edit_ignored) {
27+
isEditIgnoredDialogVisible.value = true;
28+
} else {
29+
const message = `Retrying the edited message ${state.value.data.id} ...`;
30+
useShowToast(TYPE.INFO, "Info", message);
31+
}
2532
await store.pollForNextUpdate(FailedMessageStatus.Resolved);
2633
};
2734
@@ -36,6 +43,7 @@ async function openDialog() {
3643
<button type="button" class="btn btn-default" aria-label="Edit & retry" :disabled="isDisabled" @click="openDialog"><FAIcon :icon="faPencil" class="icon" /> Edit & retry</button>
3744
<Teleport to="#modalDisplay">
3845
<EditRetryDialog v-if="isConfirmDialogVisible" @cancel="isConfirmDialogVisible = false" @confirm="handleConfirm"></EditRetryDialog>
46+
<EditIgnoredDialog v-if="isEditIgnoredDialogVisible" @close="isEditIgnoredDialogVisible = false"></EditIgnoredDialog>
3947
</Teleport>
4048
</template>
4149
</template>

src/Frontend/src/composables/serviceFailedMessage.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { usePatchToServiceControl, usePostToServiceControl } from "./serviceServ
22
import type { Ref } from "vue";
33
import { useIsSupported } from "@/composables/serviceSemVer";
44
import { environment } from "@/composables/serviceServiceControl";
5+
import type EditRetryResponse from "@/resources/EditRetryResponse";
56

67
export async function useUnarchiveMessage(ids: string[]) {
78
const response = await usePatchToServiceControl("errors/unarchive/", ids);
@@ -28,7 +29,7 @@ export async function useRetryEditedMessage(
2829
// eslint-disable-next-line @typescript-eslint/no-explicit-any
2930
headers: any[];
3031
}>
31-
) {
32+
): Promise<EditRetryResponse> {
3233
let headers = editedMessage.value.headers;
3334
if (useIsSupported(environment.sc_version, "5.2.0")) {
3435
headers = editedMessage.value.headers.reduce(
@@ -49,4 +50,6 @@ export async function useRetryEditedMessage(
4950
if (!response.ok) {
5051
throw new Error(response.statusText);
5152
}
53+
54+
return (await response.json()) as EditRetryResponse;
5255
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default interface EditRetryResponse {
2+
edit_ignored: boolean;
3+
}

src/Frontend/src/stores/MessageStore.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { acceptHMRUpdate, defineStore, storeToRefs } from "pinia";
2-
import { computed, reactive, ref } from "vue";
2+
import { computed, reactive, ref, type Ref } from "vue";
33
import Header from "@/resources/Header";
44
import type EndpointDetails from "@/resources/EndpointDetails";
55
import FailedMessage, { ExceptionDetails, FailedMessageStatus } from "@/resources/FailedMessage";
@@ -10,8 +10,9 @@ import Message, { MessageStatus } from "@/resources/Message";
1010
import moment from "moment/moment";
1111
import { parse, stringify } from "lossless-json";
1212
import xmlFormat from "xml-formatter";
13-
import { useArchiveMessage, useRetryMessages, useUnarchiveMessage } from "@/composables/serviceFailedMessage";
13+
import { useArchiveMessage, useRetryMessages, useUnarchiveMessage, useRetryEditedMessage } from "@/composables/serviceFailedMessage";
1414
import { DataContainer } from "./DataContainer";
15+
import type EditRetryResponse from "@/resources/EditRetryResponse";
1516

1617
interface Model {
1718
id?: string;
@@ -63,6 +64,7 @@ export const useMessageStore = defineStore("MessageStore", () => {
6364
const headers = ref<DataContainer<Header[]>>({ data: [] });
6465
const body = ref<DataContainer<{ value?: string; content_type?: string; no_content?: boolean }>>({ data: {} });
6566
const state = reactive<DataContainer<Model>>({ data: { failure_metadata: {}, failure_status: {}, dialog_status: {}, invoked_saga: {} } });
67+
const editRetryResponse = ref<EditRetryResponse | null>(null);
6668
let bodyLoadedId = "";
6769
let conversationLoadedId = "";
6870
const conversationData = ref<DataContainer<Message[]>>({ data: [] });
@@ -83,6 +85,7 @@ export const useMessageStore = defineStore("MessageStore", () => {
8385
bodyLoadedId = "";
8486
conversationLoadedId = "";
8587
conversationData.value.data = [];
88+
editRetryResponse.value = null;
8689
}
8790

8891
async function loadFailedMessage(id: string) {
@@ -248,6 +251,18 @@ export const useMessageStore = defineStore("MessageStore", () => {
248251
}
249252
}
250253

254+
async function retryEditedMessage(
255+
id: string,
256+
editedMessage: Ref<{
257+
messageBody: string;
258+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
259+
headers: any[];
260+
}>
261+
): Promise<void> {
262+
const response = await useRetryEditedMessage(id, editedMessage);
263+
editRetryResponse.value = response;
264+
}
265+
251266
async function pollForNextUpdate(status: FailedMessageStatus) {
252267
if (!state.data.id) {
253268
return;
@@ -307,6 +322,7 @@ export const useMessageStore = defineStore("MessageStore", () => {
307322
body,
308323
state,
309324
edit_and_retry_config,
325+
editRetryResponse,
310326
reset,
311327
loadMessage,
312328
loadFailedMessage,
@@ -318,6 +334,7 @@ export const useMessageStore = defineStore("MessageStore", () => {
318334
retryMessage,
319335
conversationData,
320336
pollForNextUpdate,
337+
retryEditedMessage,
321338
};
322339
});
323340

0 commit comments

Comments
 (0)