From b4cf23f8568d2a67ea13f615af63ccf1ce4efc41 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Thu, 17 Jul 2025 10:25:04 +0300 Subject: [PATCH] feat(fe2): more accessible error reference (#5090) * feat(fe2): more accessible error reference * use wrench icon * michals comments * more michals comments --- .../components/header/nav/UserMenu.vue | 23 +++++++++++++++---- .../frontend-2/layouts/loginOrRegister.vue | 20 ++++++++++++---- .../frontend-2/lib/core/composables/error.ts | 15 +++++++----- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/packages/frontend-2/components/header/nav/UserMenu.vue b/packages/frontend-2/components/header/nav/UserMenu.vue index 3f6b9413b..84675ebe8 100644 --- a/packages/frontend-2/components/header/nav/UserMenu.vue +++ b/packages/frontend-2/components/header/nav/UserMenu.vue @@ -88,11 +88,20 @@ Log in -
+ +
+ +
Version {{ version }}
+
-
- Version {{ version }} -
+ + Copy support reference +
@@ -112,6 +121,7 @@ import { useTheme } from '~~/lib/core/composables/theme' import { settingsUserRoutes, settingsServerRoutes } from '~/lib/common/helpers/route' import type { RouteLocationRaw } from 'vue-router' import { useServerInfo } from '~/lib/core/composables/server' +import { useGenerateErrorReference } from '~/lib/core/composables/error' defineProps<{ loginUrl?: RouteLocationRaw @@ -122,6 +132,7 @@ const { activeUser, isGuest } = useActiveUser() const { isDarkTheme, toggleTheme } = useTheme() const { serverInfo } = useServerInfo() const menuButtonId = useId() +const { copyReference } = useGenerateErrorReference() const showInviteDialog = ref(false) @@ -131,4 +142,8 @@ const isAdmin = computed(() => activeUser.value?.role === Roles.Server.Admin) const toggleInviteDialog = () => { showInviteDialog.value = true } + +const copySupportReference = async () => { + await copyReference() +} diff --git a/packages/frontend-2/layouts/loginOrRegister.vue b/packages/frontend-2/layouts/loginOrRegister.vue index 9df47e193..603c19a71 100644 --- a/packages/frontend-2/layouts/loginOrRegister.vue +++ b/packages/frontend-2/layouts/loginOrRegister.vue @@ -3,9 +3,19 @@
- - - +
+ + + + + + +
@@ -14,10 +24,12 @@ diff --git a/packages/frontend-2/lib/core/composables/error.ts b/packages/frontend-2/lib/core/composables/error.ts index 60a5ca855..c7617723f 100644 --- a/packages/frontend-2/lib/core/composables/error.ts +++ b/packages/frontend-2/lib/core/composables/error.ts @@ -91,7 +91,7 @@ type CreateErrorReferenceParams = { /** * Specify date to use in the error reference. */ - date: Date | dayjs.Dayjs + date?: Date | dayjs.Dayjs /** * Optionally add extra payload to the logger.error() call */ @@ -103,9 +103,10 @@ export const useGenerateErrorReference = () => { const reqId = useRequestId({ forceFrontendValue: true }) const serverReqId = useServerRequestId() const { copy } = useClipboard() + const { userId } = useActiveUser() - const createErrorReference = (params: CreateErrorReferenceParams) => { - const date = params.date + const createErrorReference = (params?: CreateErrorReferenceParams) => { + const date = params?.date || new Date() let base = `Reference: #${reqId}` if (serverReqId.value) base += ` | #${serverReqId.value}` @@ -118,11 +119,13 @@ export const useGenerateErrorReference = () => { // New ID that will be unique to this copy of the reference and that will cause an error to be logged // that we can then easily find by this ID const newId = 'fe-error-' + nanoid() - base += ` | ID: ${newId}` + base += ` | Ref ID: ${newId}` + base += ` | User ID: ${userId.value || 'anonymous'}` + logger.error( { errorId: newId, - extraPayload: params.extraPayload + extraPayload: params?.extraPayload }, `Error reference logged: ${base}` ) @@ -130,7 +133,7 @@ export const useGenerateErrorReference = () => { return base } - const copyReference = async (params: CreateErrorReferenceParams) => { + const copyReference = async (params?: CreateErrorReferenceParams) => { await copy(createErrorReference(params), { successMessage: 'Reference copied. Please include this when contacting support.' })