From 21ba6a6823efcbbe8a5857000253dfaefdec6e27 Mon Sep 17 00:00:00 2001 From: Alexander Brown <448862+DrJKL@users.noreply.github.com> Date: Tue, 27 Jan 2026 00:10:07 -0800 Subject: [PATCH 1/7] feat: decouple auth and telemetry with event hooks - Create authEventBus.ts with typed event hooks - Create authTracking.ts to subscribe telemetry to auth events - Remove direct telemetry imports from firebaseAuthStore - Remove useCurrentUser import from MixpanelTelemetryProvider - Breaks ~600 circular dependency cycles Amp-Thread-ID: https://ampcode.com/threads/T-019bfe73-6a29-7638-8160-8de515af8707 Co-authored-by: Amp --- src/platform/telemetry/authTracking.ts | 26 ++++++++++++++ src/platform/telemetry/index.ts | 7 ++++ .../cloud/MixpanelTelemetryProvider.ts | 12 +++---- src/platform/telemetry/types.ts | 3 ++ src/stores/authEventBus.ts | 16 +++++++++ src/stores/firebaseAuthStore.ts | 34 ++++++++++++++++--- 6 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/platform/telemetry/authTracking.ts create mode 100644 src/stores/authEventBus.ts diff --git a/src/platform/telemetry/authTracking.ts b/src/platform/telemetry/authTracking.ts new file mode 100644 index 0000000000..63ee70bf85 --- /dev/null +++ b/src/platform/telemetry/authTracking.ts @@ -0,0 +1,26 @@ +import { authEventHook, userResolvedHook } from '@/stores/authEventBus' + +import type { TelemetryProvider } from './types' + +export function initAuthTracking( + getTelemetry: () => TelemetryProvider | null +): void { + authEventHook.on((event) => { + const telemetry = getTelemetry() + if (!telemetry) return + + if (event.type === 'login' || event.type === 'register') { + telemetry.trackAuth({ + method: event.method, + is_new_user: event.is_new_user + }) + } + }) + + userResolvedHook.on((event) => { + const telemetry = getTelemetry() + if (!telemetry) return + + telemetry.identify?.(event.userId) + }) +} diff --git a/src/platform/telemetry/index.ts b/src/platform/telemetry/index.ts index 83d7f2c9f9..4e26a1d902 100644 --- a/src/platform/telemetry/index.ts +++ b/src/platform/telemetry/index.ts @@ -16,11 +16,13 @@ */ import { isCloud } from '@/platform/distribution/types' +import { initAuthTracking } from './authTracking' import { MixpanelTelemetryProvider } from './providers/cloud/MixpanelTelemetryProvider' import type { TelemetryProvider } from './types' // Singleton instance let _telemetryProvider: TelemetryProvider | null = null +let _authTrackingInitialized = false /** * Telemetry factory - conditionally creates provider based on distribution @@ -34,6 +36,11 @@ export function useTelemetry(): TelemetryProvider | null { // Use distribution check for tree-shaking if (isCloud) { _telemetryProvider = new MixpanelTelemetryProvider() + + if (!_authTrackingInitialized) { + initAuthTracking(() => _telemetryProvider) + _authTrackingInitialized = true + } } // For OSS builds, _telemetryProvider stays null } diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index 6f8c0ccbb6..baf5242e63 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -1,7 +1,6 @@ import type { OverridedMixpanel } from 'mixpanel-browser' import { watch } from 'vue' -import { useCurrentUser } from '@/composables/auth/useCurrentUser' import { checkForCompletedTopup as checkTopupUtil, clearTopupTracking as clearTopupUtil, @@ -120,11 +119,6 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { loaded: () => { this.isInitialized = true this.flushEventQueue() // flush events that were queued while initializing - useCurrentUser().onUserResolved((user) => { - if (this.mixpanel && user.id) { - this.mixpanel.identify(user.id) - } - }) } }) }) @@ -205,6 +199,12 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { ) } + identify(userId: string): void { + if (this.mixpanel) { + this.mixpanel.identify(userId) + } + } + trackSignupOpened(): void { this.trackEvent(TelemetryEvents.USER_SIGN_UP_OPENED) } diff --git a/src/platform/telemetry/types.ts b/src/platform/telemetry/types.ts index 2ce9c7f0f9..1bab7e39c3 100644 --- a/src/platform/telemetry/types.ts +++ b/src/platform/telemetry/types.ts @@ -272,6 +272,9 @@ export interface WorkflowCreatedMetadata { * Core telemetry provider interface */ export interface TelemetryProvider { + // User identification (called by auth event hooks) + identify?(userId: string): void + // Authentication flow events trackSignupOpened(): void trackAuth(metadata: AuthMetadata): void diff --git a/src/stores/authEventBus.ts b/src/stores/authEventBus.ts new file mode 100644 index 0000000000..5e51a58549 --- /dev/null +++ b/src/stores/authEventBus.ts @@ -0,0 +1,16 @@ +import { createEventHook } from '@vueuse/core' + +import type { AuthMetadata } from '@/platform/telemetry/types' + +export interface AuthEvent extends AuthMetadata { + type: 'login' | 'register' | 'logout' | 'password_reset' +} + +export interface UserResolvedEvent { + userId: string + email?: string | null + displayName?: string | null +} + +export const authEventHook = createEventHook() +export const userResolvedHook = createEventHook() diff --git a/src/stores/firebaseAuthStore.ts b/src/stores/firebaseAuthStore.ts index 6073a43040..76ee0359e8 100644 --- a/src/stores/firebaseAuthStore.ts +++ b/src/stores/firebaseAuthStore.ts @@ -25,8 +25,8 @@ import { getComfyApiBaseUrl } from '@/config/comfyApi' import { t } from '@/i18n' import { WORKSPACE_STORAGE_KEYS } from '@/platform/auth/workspace/workspaceConstants' import { isCloud } from '@/platform/distribution/types' -import { useTelemetry } from '@/platform/telemetry' import { useDialogService } from '@/services/dialogService' +import { authEventHook, userResolvedHook } from '@/stores/authEventBus' import { useApiKeyAuthStore } from '@/stores/apiKeyAuthStore' import type { AuthHeader } from '@/types/authTypes' import type { operations } from '@/types/comfyRegistryTypes' @@ -323,10 +323,16 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { ) if (isCloud) { - useTelemetry()?.trackAuth({ + authEventHook.trigger({ + type: 'login', method: 'email', is_new_user: false }) + userResolvedHook.trigger({ + userId: result.user.uid, + email: result.user.email, + displayName: result.user.displayName + }) } return result @@ -343,10 +349,16 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { ) if (isCloud) { - useTelemetry()?.trackAuth({ + authEventHook.trigger({ + type: 'register', method: 'email', is_new_user: true }) + userResolvedHook.trigger({ + userId: result.user.uid, + email: result.user.email, + displayName: result.user.displayName + }) } return result @@ -361,10 +373,16 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { if (isCloud) { const additionalUserInfo = getAdditionalUserInfo(result) const isNewUser = additionalUserInfo?.isNewUser ?? false - useTelemetry()?.trackAuth({ + authEventHook.trigger({ + type: isNewUser ? 'register' : 'login', method: 'google', is_new_user: isNewUser }) + userResolvedHook.trigger({ + userId: result.user.uid, + email: result.user.email, + displayName: result.user.displayName + }) } return result @@ -379,10 +397,16 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { if (isCloud) { const additionalUserInfo = getAdditionalUserInfo(result) const isNewUser = additionalUserInfo?.isNewUser ?? false - useTelemetry()?.trackAuth({ + authEventHook.trigger({ + type: isNewUser ? 'register' : 'login', method: 'github', is_new_user: isNewUser }) + userResolvedHook.trigger({ + userId: result.user.uid, + email: result.user.email, + displayName: result.user.displayName + }) } return result From 440e25e2321e5c02c69d6067c9dd4d9e469de0a0 Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Tue, 27 Jan 2026 00:21:15 -0800 Subject: [PATCH 2/7] fix(test): Mobile Settings (#8332) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Bigger mask. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8332-fix-test-Mobile-Settings-2f56d73d3650813b8e39ea5d77e39c18) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions --- ...le-settings-dialog-mobile-chrome-linux.png | Bin 17882 -> 16876 bytes .../content/setting/CurrentUserMessage.vue | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png index d6c21bb9825d0f648c9ae2f0272b0df472c48c8f..d9f0e5a7b0215452374763ff3729c462be227af8 100644 GIT binary patch literal 16876 zcmeIaWk8hczCH}P#f5?{K|vZsKuVNuFpwBR=|)M1A*360sVLGhLx)n*(hVxzGBikc zcMbLaSZnXI*V+5*bKdvA&-?BFMIAtx=eh6u`d#(l^H@=u_yXkxJUl#NS(%5*czF0C zcz9=Je>npmIcy=a!^8U(Pxj$GRp*$c;q&hPPA4bp?7lL;Ff@L?;-mcJxBBdap1DyA z--I2j!h#;Mqv6~S7hD_k(GiweBYcLd6!)@7a(6Rnl#P!hnx@5fkvFADSSDK*_up@p zv=_FcMcWT>?$x7}+3#Mh<*|jGXn)5(c{u zS6Oe&x5bL=z9A&#w;W8ucgFAR3{;7U4_0F3NA)h{cZlnhJ1+07PZ}8-5^Y*qSm1V+ zMP7_ay15-(V^@Ek-h^fkfBm|qEn1+EgTaf5ojv1VcNHZWr8V8Q7&LLFG$MN9@cY|~ zUMEMpRQwj#MI0^M-7D5_xRjy#Zkw6Sl5uKh8dQr53v2Vd6Lr~;+1}aOa$hd&+n8=) znSI|7NQa7)^em+0GpCmD{JCXL!sF!RBt+}N@i^fn?^9Y)=Y-_=@bGY7-I@%pg%UW9-f8fFhOW-hAfE>ISD$Ly0ZPXAjuf(Naah;r;1--K}T#ln= zo!{S_4WBHvotCq($P`zZ7@wNDxoL7;p1*JCOtKt01R0sODov}Wr)Q#3Y(0wE$IX79 zdZKuN+dy~ zejRN3n>@ln%wZucleIjAG1%bVh3!hWUE}+gBu5{QMiZ?zjU;)u5Pp)6+7dmV1<*sEP~NSWTD2Icq0UXohz15NPVk|I_I@}<@J#c2usmJGg|UMH!Jco>iAJ)p9#U}#{}Glc6a zY&tgasF~p&y~DX5w$)s;ak1H&;XEVDB`vK0v$iNcTRbMYu(h2X%-JCRxAHAb_tVR$ zU-AwwFD)5&gbcB%rOPNy^=9c%>J!f^W=e$=WTr&E_LFKk*nrgwH@so}JWay;Bc)IL zO|$KV9#=y2mfW?Fl$5Zx_wV25n{}A`FpfCpWo^CLe)OtaU$&4sx?5Q5<~JGKUZKAQ zyOCnvZx3Y*nbkB>m{>xRjeXGCEMiK8`TCL5&P2%IM%neBc_zO4kp^Bz4un}T95+pE z^WOXUh2;lUe16lrmy{T4VBC|gW?S{ci)$Y}?Z9-nu^1!arEe0$JmK}cIIgH zal!K^liwsNwoX?jTJ9cCrDCpOUDBE7GxV~dL^6c7iptr#LP#-M!55Os3^pOXiQVoV z3Xz!IN_iQKF*~aq7TKMHlErM*Hh)`8B|(}ui|EH=oDSix6ec+%_LyGb+|z99nVzup zIFD9&kO(!QlcYY~x*JOR#y)?WG5E0M)qFX+wdIbQwx`0r!&b=!q(b9jv**+vFCMLYg9G#TxK)){$ z`>_2N+dF7>4a{1jI8%rB zGhdQOZuQZQPFIS8#L-sQU8DM>lKZP8mB|k|wDKPEoM$yu&L%cH@AILXjH0eHHJMs$ z=zG}A=YnLDphqeG4R8FKid>nx=Mx3BDP{D~nhSK4ogpF2xnZxvxNl48Z?JCjbB^9z z({-)ZYk!Qp6}G-s5)*wRq!Ih!8oQi9_}y6z>9U-a#%MKySIMnAi+vr=@=^%4i`@D5 zUK3!=`7|;#DT}Quw=o48+o>D0XdzsCa;7Ynh)*Fquki+FT54*sRI;`lXUL(b&fJ#e zwt9j59uBvlVGxH<$B>6SDm+&8G;tx6Ess%265>QZ9$d!VpqR#NWE>SME;P`;74uiq z=nXS{yYvuY-m}QU8Z2O~KOfmb%{gDeDAKo>PaQI1(R=b7``pWslIxY9`wVg*&jd@f z*pm^i`#qRBvLd%2=?1;Ei3^Ktu?m5yahg{4%F@qLm62WB--4nTtrdK--zd}@83%8z zA0KWiQG^A2_zx;bn_0kKGU#iWo=VSlfi>yW-Lc|b>JH<*I&5}HaMPPLVu%<^CN0m z(>%g$$6Hd0B0NPX$S}8>+2va94_@SEa0^|;+CI^^q^T$$qB*aDlJ!Bqkej@ZSRkJZ zFAq_eWD5G$aSbKglVUg9UWn?$1Y}_BDIAB2EEyOWxZiKAH_$mPbkFaOdd0)EFukN4 zev^uX(50GraighReWV#{z*oh=dQK%kP68c4|1l)2*_?F;sSv8o;(ubClfiV&5vE6V zM2T@Me#j#sJ5If_?mabHrp`5Pxn;XL3Z+cs@$oV2{m>Q`iQ~OQZ=&FoS23Y@ zHc!$O3@D#UIyN=#UQ1n%JA>DXunpH{QRfNP?25*3yqRKWhO}+z@22d+<9_`+6FH~i zgKpUhq-$v0;SGG%is?@GN7tGhDryO*bz)Pet->Tt@0<+Z;=>h427D76{12k^54@>q zlk{M!DKsL2#l|MreT}g3CK*{28eQnGkZo3dLxe)b$3HO8Hz1(>s}nuG3_0t&T-i8L z7Yj2pGi2lfc~>;9TI4bvi3UAFcH*WJ#r{by_Bw_#1HVx_L}XG&@@A;HVe)D^e&Z!( zY`D3^&Va}_yhci9Y{RZ7zEFVAmW|jy5xIYSf4(Eu*#0li9(WyXha2+%!6~vD#wJQT z5r4hNV`eBOD$1sw8FYA#gVV!(#1)tcP%1z5y9pr{GD|G+Tj?sP0f|PhLRpmFzIj6} z_~LOq*LLaY6lQZ7EptE};fOb9+WKZY;%ID_G>vt2bz$;3t^DM(ow`i9md>{6+Lt{XNGGwf zuyA8}s?=_l;#g;_HS*i~`ug@_UspW9JE?|b3$E64Tdn%@=g-7cy+Alkr<j$y7ksX|HY#{-u62M7b8A6C*T{7NxKXNvnEl*~O4n5x zH_g>3#aLk}GWbr4WW+SW95-%!cOFtnRYc+WMda7h3fs$k+Uu02qv!x23KczGZ}4=n zfAM1PaI>Qs!^yrp?nBC=mZQIUd~|@NJ>KkK*RhjIs@j@&`bQYCVW1-Tk~Cmg$J4j z%k}Z2Rk%;W9VQBuUA)RqlI#X>EerHVq;AvrkYepii{D<%gc-1 zE(g6?LvA}uvPF$U<%U2H42_JOmik#M4T+uAOpu276$#xWEwdl~)j9o#WAQ(~G%TtG z&Wku3^g+zc(R}7o&M+V^(US6=P$-Ym0n|2o?6T~;M6X7vAuwv ztUp(|sp!FJXTR9H{o~`=&d$qKxCI2UGoR+~a^p7;49IznLh~MlX#VccPbL?7G6bxC zo^n&youy|+M)@W!>TQ`ZF){ZaXiy8=JFkr~eEi5xC+_|kpX-W_&Jf(+d^O#4)ifpq z+49ityK1jR_?C+~!f--IJrCO89`jp|WJW5jPt@5?H}l!ew8Gwk#d$Wqw1k=X4F;Y0 zJg*0?AVncsHC=UouyD~kQe9mg_J^OJ=y9hs=a$fPGkSB^S}j>_nq4D%r9anb<)@1` z+N|S}kR!(i2rZZuxw&`qP1^??PBO_zt zCtCN-HUWKoeK>T7Yc+vZqg7d}&0SqQg3hLoAOFB6xA02x?QfFH*i;FjEM5~3^IP;k zrPjDYPCh%moidK>Nf&Rya4N{iXjXexJ}lNN4`lM!D|hS*ms_i-tmNe6bXvWXqmiRu z<4ru<8ab5ktsJH%KqWSmS;2j4u9K_!&~+xg41GKP#dZrnDgvfW(~)4GRg_IbL{ zjl^Y(AD39Zyri)0)>!i9y&GBrDOaLGG6JMS*h)JnhZ|C<+3kl&(GW=~NWO-WX?*o5c0;d;VC^^YGzfuO+YKy|f<9eE(}A!oqUT6BAGP za|7PJd#Bnd8_G;InBA4yA?ShII#@lR=q0>-xo?v-(5xeFpxi0`nX2rBHmK}w$ExR@ zh7{|zHa5K>Y%Y=9CZ7A#gPf6*7I-~R9VE-?Cl9o zCSyJM<1nH3%|+rRPG(Qlx3zjoG8IRb2|@DO#@*R%P1Zn%MVz>Zgy0@a=^b{`%d`)h zjK2ML@;UU}1wnE5>sggw0Ahdq_yPN>xj^)`R$jm0^4FGcF+Sj)uq57F9xCRE)5^G9jY%o znh#Z^JGs8Styjdc9wj%AO|IViv9oD9fOFXJguTXU8!`;yeDWzqGX4HETC84pS?N-?GeoKQEY(XPQg|03t4qmNKZu z_(?{I&18!A{6w9vi<=v2ehYLt7!`L!-2?vsyB2D|!Gr`auXU+W7{l4RrE+KW@wLJ< zA24qA8F&TrXN9VK%+e`-^LCl?&X@@2JZ(OwPEn?66AU1o#Xjo@0qf&@x4oSq>m-Na z3=J-^?1|1qX#@B5>GIX8gZb3>IUlqJKppq(+u8b+Wg<>1ltLTlVHv;*>drA(-R?t3 zOG^Xscs5+N?foDG9Y`y-usYh@*=f_4{Y5L^RIk#tZBJ^kJB<-BJd9|LVtnLR;c-wz zV4T5Gwi@s;*ah$iJTAEf$JG%U3Kv~OSqE_Me2c`%^p@m)O*8mibOKho?(XjL z@)jq@qi`wdlCMrYuDCUYtdOz<6c-h>!`;i#7lRc|!XMzwX!vmUtTg#;-Tu0|WUmu^ z9QFMBl@S_XVCS(SJtV7=2lI2CuK?lU)R^|mrK37ONd-^~;eH;?wngXMfBONKb;~4! zltqzR)&aFs-b$iDRYVnNGkJD) zdQr`|1H56gd%e_i^pO#Cw6s>aEkrlpy| zx&n(9J<;BRW*0E3=SAu%Me!m#Kh=eE8DP-<8eam@jj@Q6o6l6vdwbQOL zHu`8WC;HyKd#tp6OAl#HeifvDy5>(MFg1~tI4QBxr1d2sk%$>^;(^>EFwGK^SG5t5BK5*!ke06Sbpeyc*&LIH93)%l=ya1_knOg9cSnHF-GsDBfU;y8c$W#5) zlR0p{X(D~GXOWb(kz^YbM`IT-o7TTSGNn27-e4hBi-dfG&!lYK~(JDr# z6`Q8n)SroZgT-|puKD`=59b=CK6}G2g$>AhJg(q& zPysG-`1q}5ml5Yl;?k=ey4S`(XN|vhK9>kBEGltj*Y`L}TzP7xqJ;TP3`%+GZBY}kE z;^#O2#><;3D`7pb0{{)}SANQ#eX1V0v79O$cpM3%e{+_r;>eMPSQ04Aa_US@ZdFy) z%E}6$Ri<(>oY!eSycwfoN)fPWaodY%PMsCpb_VznX9?WRGnCN_%YiqkzM2Tg}n| z)Wi8^In*!9-DC$Iw~N60?+wSWYbegNAm@Ouf_bYAV)8T^fW7Gmmhia?S7lnTFs9*_6nP%u%-UlhS&6^% z>@ebP;B7g|g?J-$4mo-x)|zSiG$#j37ON|Jk9Z6(VXg;fz8p zLX@$)&||kTC5!u%uI9mSr8`>bRt)T}IfvhF#*cz0MPm0WUOvyJrVYGfaF+}0krOnL zv+c1%NwSj!#3SfDBh8QQE?ji+=E1?i+C%A0N6q)ehgdOig|@@ovAx^TRw=c??Li$v7P9l`A{5+C_nSXvSnn^xJ+ zhpaPi6g={$tXERe)y_*Q|0`;1+yVhFT7>MHIodsf1Y~()f@Ax!_KfRUO>#OqvkISi z^yGvgaTm<)UXsNxu<-fvGUA115#o2gF11GX0|?ACqZe1J=|H0E#cu+wJAeKi8K-!Z z#EF?lK$a!#q{7nD5;z8waVbTrULepSc%}U{1RWL%h<<5{xT_GA0J1~7;CXI=USFnG za`Fv5b}CWlAWa953|mV#{(5abXy)7s8xM~~$_`P_LroY-L_XW=>%r|wBi>=1G!hck zYiq;aXcZmYY`nDb^`eJ9B(Gj6op(rbV|}2DePD%6^0Ai&%wt}h({XXdh`Ve&{2+bH zf2bhGg5F3~*?-h6=Nr(cZ6R)spFp$#BNeD42#n9WHPG>L0r z>97E;2>|TZD>u5DRh)i!xamHBUNKIz=Zmd5VtS($%mlyyL7Ry;0wc~32$F#Y-2oW2 zogNW%-}{nDf40T;O8>}+zWNJ$j-bJNDJYZI5fKrvL1o|RdVe#naosi+b@^1VLnrF| zbmA*7J!wQ%eUbI3Vsqd3x4t25@jPZL;Rc?a*?Q$by}L=?C8`fs(_HVq7;1b^02W>%xwpF{`zpalLFoKr;b{#fjgCMH72)8JPrZ?^iFX)-^`t`c1t<7 z*s0F2?n7ODJ?P%9JD=H;s$5)MPd%~GDv3C^>+{+J5xTDED>LAFK`R#bmZ^)Wx&f@eME%#XYhH6nWd=Rn=h{+odQ=V8FZQe;?n zLCkgQmR4RZ(7j@d0b#G>j=Oj7;yyjA@y6lAE7g`>pML@o8WAw|5}Qy0`nFb=hFMrf zqvb(9f6Ak3z*0?}A<*TGr{lOKT*+WzeEiAB@6kAWFc8440iR~0CqqM6NC=6Ct&ibz z9Q%3zO1@RD8$ zp_Y^+&Vk`08G^uoOg7(T?#DBbw$FjL0-g}i6T?9SwYWN5-mz8yCSPxF zFDPf8+@`&CQVveeXkO$ee3`SGf!7dTh0=j50Cwg-#)hq{_ItPbu>eM&K7BGyk~A0 zhjzgnY%*mx!lU)Sc>zNYvzsAV;Sv?q_0Bx~kww9&Fr|L{KxgS3fUl!j9||B17F(f* zhsVM8!QdCgm7k?>m6=K{cxsULPD~gcY|Urj%TU<`T=QD53lI5ud{oT|M^+TzeIeoA z>r{nkE6tBG!8gEN4I-qV3-A-ArKT1IP#P+>M&V(ZRaQEWdv(-4C7uMlfByr|SOzna z=m8s=7ccVViRJl!i(>qFNB+a+wi_9;>i_Z)I5UN)^N)OAKx8K0De0Ea1Nje>f7*R$ z2wIwL;i{IgJR0>n=`f4m?hRSla+v$^YSdHb6TVP{5b5Ih`1s@|uzN8}OUqDBi0TqK zLg+XXD=I2P#l+&uqo^N%bpr|T^0Hp0=3UNtMT5V}PVwr$%FdV6^{rVGaA&T9h;%@m z4CK#VHys=p;6q~fU|E6iXwQ_}OnT>7gC7bk!aU-(enrF^t+Te*d02LGs;x#!?fOQm z(Kd!Uh34~PV_%%tL$dYanR}a?)1`dLz-e{^v#GPQbFx86v)HQg*^!d?yc$@s(hX-$ zwK5^0(2KFBc^XZ?S6-~ir%l1%J|8|{v59ayK$qS!7y+f&1-gk_|0eM&@LO<|mq5pY zjcsGgc9V1A%NISMTr3EX1T57WXf`w$?`4qRpE};w&i`cE2MM*h2Riyp08?SIj*E-) zj@)>3G8uSu8Xr7sKiuC0B7*U@dRTi`L!%F_pqUwWWBz>r<@RfT|F-!qvk}koojel+ z=%+n585sjnK0><#B{m+rE5la9WlWv1{Fde~)|Be0U^tf{!rNy%3}AqKATXxn>C;4^ z*weB{-8UT?0%*>hAvymci3v3CG92k5*wi>-?s~h4TA%S6>A6A~66e2*N>N}u%P>P+ zx8_*86crU;y^@$}i|*TFnrV&HOMJ9l?;lMq>U^uts4-r`>*?67NukMx!0_+4NJ*Lf zLLJ?XaH|UfS*K8QS;EiR@$#!ziLgyLf&md;ikktaBdH@GKHMS(6ufeEYjt~30Ca?; z0fY63`!zPzu$|usjG66vH7P2B8-QYEY36=%SnS2gQ`m*<=Gri7sl(uZPpgp@PfUda zJyYA(re@%Jd{_$WqL!hqkOH-YfkMQL}bkk0;>9CP}!TdTPEtH8Pe{vRoV9oln<6>4A;%ykl}{DU*pf zouZ?{ec$%u{kKF)laulB?qhY4rF0oXB{p4=JZ50>uq}@(C(E_Pi48fYZJjl1jZiPL z7ywHX3PCAwnBHAF%JFcU`!VjiJ!0duySLupg&>EtlNCl<7dbRo62a4!Npyl+hsE?_ zS=kn#_v+}G%Hi=j-!Fd6x~6DjjVO1&kl_Cvhau~bwJr?&e|!k?ff z)^8x6$&HjbE|Xp5Rb)f+8j6V_7JZZ6cpmSYk(jbpVBNERA8EVW_gIk#kcF1}8`p-* zcY|K(rqyT*H@(Q_MG^0lW1rrBobc67AZ+}u5UoV@E|Fc5!}7G+Z4M6kvw7;KOzI2f z-+nt+?yy+)^xJo1UkG0~0*?;7*k3DyOAKc`=%NsuwjYxdp>EU7YDNvm{e`ITOEiP2dsy2GK`qtw5@4 z9(glmr!^`FayYn7p;BJnFGk$BR);^#$m(ZFXNN>b_)Ni)!s(my$lhD%L7{px(d^j} zGbR2| zb-@|mu%j5eH{EI;542pD2e-iqmOJWunQ8L(WFm6jUtlE2H{Nz&bD&XnJWFME8K%c+ z1E=LLe-Jg`rPnAZBD0B2e$^o;PWFHpkc^@b`%*qs!mIhH&;r4MN2-kAI2pS1zZUYC zA}o5+3wiO<`t!|FO)r@uGD|Q0@{+LNe=(^_i|ha^7|z{u(Nw5@ef-$sbztf9`t@rJ zL%!KNB3jW~by8$xWDqk1#iHhS4^~h1m-0urN=WG!BlGKBe|KHKt#$YIs)wxAQ<(s( zb3Hls;CujcGBYz%SvM>w=mqdOSasz5?DDb)z$y7p!k}<s2Xz;|e)+1q6!MK&6>n z5+Z-j)yg4)pZCa=iT}=v?t@i0$%kqkk{P#cC(6qN_KK) z=I1G>MR{)BdOnXe!NovMxPMS=Yj6Lvklg~zEf^AAvxw;Zr2)GK?=E$v22u-^nRV!E zbq!Zeft>)}1MgD)KMh9l?yaTTRG3xPRa(b@dU>G?4+!49U5>l+3_$pr-HwqIboNAd z7I%9fj^a0N`~fa36`5MLE);qSVMI&V&1A;L9=#!)Z1AJt+$^>nTAAF$+^qdF1GWhgkVnRu!XqKR$il zzf1kHfQ_A* zp4Z71a`!^#VMY2rKdGs!(?XcLU|3aVK*!y+pduqnX;51Nml1+$FbY!k7QiU&4P^$= zXN5#+uc<=6csJw?^_zw|+{#(I!F|;N#PI`on8y+M;*+49Iz(j}_Zav$4uS z^$9jG|nFtXRQnHuZ4hm24 zps2!plq8mE$cj)itrV*jU6Kpt_FE4kSrbJ7rt2451cOB76fP1I!z`Wu{N&X}iE)$R z1J+)W9Fpm~Bemepj_OcKNipebhNv`2IE6?fE_<+KXJ>m0*)kMEk&!Z}uvOP++9UJb zGKfUngfCaRT1JZ3@py+sVB_8k9}=b{=LHGw=F>*V`EzN z2U}nk3@>zXQ%=p!o^}H`+l(tTqVli;{HJf- zx`VOe9^PTS_-6@Z!kss!(vT8F$bsg)UJU~eR-Q|hG>i*Y*-LLLK2~w_|iA@`;Y5#{ai+zxt27aIwT=)hf&CJTM+a(%dO++dM zk7vjQE*2V!`yzHT@|!bs*}4?z_*yOB2L?Fn&H)we;eN&I;d_mpjEbtfg(!{FpfTni@7JFjvr46tn4S}- zS+IvTHkaIyEG?Sr5S^*`W%QRhWb7E~zqkx$RTwSs+1TyeQ{zxXP_VIwnYi)3mY$JH zf#=a6NYUYHuWHk_LF`z!Z4#_M1k>GvgSffQ_qwIFV75MTExLDa65Ns`btAinhM-Jo zO8Lv5)jT4lvuGrYiS@-D6g%3my6&yT!${|Ik2-UwoH|w$uW2gGlj9}%y}uX3|NH3g zfBvjtd+jAE{_Z}3{aC&5+j>#{1`AL$w^(8g_ph-eC_ z(`J^DktuOr|FrI5fS(*$s^&gfPi!z+rY(GpOTTq!NT-DwJcpi_;ZkJVMh0%ng{5|8 zTslRDpdoNEpb$api`dU?E#_43K|(EbZLrJ%q1m5}f3_+#`Lx&#RlsDq5zr*s)t)sK zE}O(UG(xua5T_m=XZ;*T(29@=8P>|wIBj}u$mW2HD=17R2(f~UOyjGw=eHHwnV?LU$a&i{JfrJEd~n5sl_KtIV|Y;Pb{VX66Cj*| z=~YUv<1YOWUVPu16w(c&ZdNyKundu%M8=sePJR`Sxb8Omr0 zuj8*@pVZqWeU{@3^?CX79t4@~eiU70_VfIPwQKvEULys_(ALXD)OsZ^o{^J>A0M5c zi}s@yx<4@t`5tb0vb$U|?MK z%xMoS;Z?joM8W@AC>6${B-_DFW=~GTNyr9wlh@VNIjoK(LLEuDcV#q?dy0obLxUVS zAZMf&m=PhwBPcGepB{f~-<8tlP1OO8o?cWh69N-754OClO}2VglsuvyIK1cKp3S6K z%h!lMsu7fBf38NzTEa~UPG(dBwsbrlZcuJNe+YjKS4MBdmdIh`E%>2+@z;n?HU7P? zFJEg|QGuwo7Sl1AfkzKKbdUf|F)iWz5D zS63JG#fula@T4M2>*XYhWJBxg?To`TtDB)|UIVMbqy^`sdu^QYW-gSDwhLg+rpg3= zrx7j)&rODczCt87A5aYCS0>*f?A}{@hCL8--&=#tr0g~fW(N_qV1ncFAcWaY4i3xR zX|Ih1wa_rvgYR6Xyh<;nR$qBD10Ns1FK0C9E+_HhH<6@3G=d>{xZa@!`*OBj57qsd zfp6_#^&LXj#PsoxlFQ%h9|F-h6``r%9X73;cN; z?H1t_gfRK?ja>s<6Nkf?$oz8+g;7<D)pw4i**EGfP8N z7+j!yCPVC;7Acg=&(BZN2pVD0Dc}GS*3c|^3J@dz*g{Bk`b)ZYkJ)7XHn^oAmN5^V z1`E=@eUqTzm+$>_`!RiWV22K@1C+M@GsK?NH#enaw*nynb_3?N9&;B+8cS@F&1-_y zY=i1=Uw%tXO$}5kY;2T?%+|`ENmu)bkAJezw~BHRcG*Y*Tmx3=bg*OTGMH}`2py6f zgK8TP?9BRi@4T=FW~`^Hi`%73z~>U->FdXE>d1sT!+zneH1AmeiiltwaDMxHlidXe2y^llBQRpWaEf6s33@+!mCycf0To!@-G3OiYX)bp!kTm(vKV)M?e~j|_`W z%r&V4==tALEbj58nEsEIFUEgc$AShy)b*bJf6}3JwHDw4;D9hvkYQ&tH^-&f{vRr3ap*JRKE3;zE)as}l!KW$PY$CxHEZ9eH-n3!`PMsM)Rbsm1N`8ppiCS6QVZa6s_b=pu#Q$|lVoY?qGZ}%BU zIKMan2fQKR$Yyn94Kkrx7%>aoPso~Tft?*6ttO`4YV4p0hSRDy~L zxM@sJ!gsz9833p$++OI-*bT@Wo0%zk`Yi{@fH-)z;F0l3di+sM93Y9l{Z|7bR@eh1 znXxaMM)pm@ZmwBz_r1qw^<{zJp{qfpT-0|F9wjTTK+sZ10q zMs>w<_HyOY`L<0Y>Ugq9bsYjem_~oLRnE>(28<3m* zfA2$ZNAzd(-A3Z&QS*^KmVHDL9h89INH(u%VW_(qhQ%{}x5cEMlTF6I&xbd_@Zd;u z(Vg<;Qcysx_;QuD=5tIbFMQa@sE+LPqrJ7qIbY8-it7fRQw@1lt8DtpBJ?9AV(5A! z^Qj4x#F87PPGA1S2>!{M>%K+T$ng1pr@rxjbYD5T@dEIBU9dyiC+=Rhz{1O(G;rc~?j`ZqDV^$OS*`R0j zQa^~|UF5P-LUif%uvpQyS|wJjFhOfT$N$L&`%^n7w>`f4Wo)cRoTwu|KkOVKW%<_7 z>XU$g0MF;o;MDH4`Bj%Sfh|y^R1qjm;*nA(QO(9IEiRIZTP^c z9FubXqA~GBogqFb9&E?M;C;Q>Y4&XwO&rATkUvukj7t-X;Fq7VGy-> zqMi;PSTmn+{d?KUCAb#raW0P%fa7oCSag<0iMfAZ*1yb)tFS{6uaSsL)o8mzltSEp z-QqdVwhBFE{G{xrvVXN&RJb`;msuR1F;_klM*VKkxxZpT2>ISlmui(Jwd71L1olbr zEcgGSgZwX^Px#k!=)Zo3{BPI$e?R+QJYfIt-<+@~#^LY_1Z+-!U%>y`V=n)9>Hqc{ x5dOsi9eTm9YB)LB_B9-Ue-NDB{IhtHneLn-_m1F^4Lm$qDaD7`_n-du{{SGM*v|j} literal 17882 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%0D3RmMUJr-_05(q7 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 IKWcgX5Bp;KTmS$7 diff --git a/src/components/dialog/content/setting/CurrentUserMessage.vue b/src/components/dialog/content/setting/CurrentUserMessage.vue index 141b72db66..8ad4475621 100644 --- a/src/components/dialog/content/setting/CurrentUserMessage.vue +++ b/src/components/dialog/content/setting/CurrentUserMessage.vue @@ -5,9 +5,10 @@ severity="info" icon="pi pi-user" pt:text="w-full" + data-testid="current-user-indicator" >
-
+
{{ $t('g.currentUser') }}: {{ userStore.currentUser?.username }}