11import { computed , effectScope , onScopeDispose , ref , toRefs , watch } from 'vue' ;
22import type { Ref } from 'vue' ;
3- import { useEventListener , usePreferredColorScheme } from '@vueuse/core' ;
3+ import { useDateFormat , useEventListener , useNow , usePreferredColorScheme } from '@vueuse/core' ;
44import { defineStore } from 'pinia' ;
55import { getPaletteColorByNumber } from '@sa/color' ;
66import { localStg } from '@/utils/storage' ;
77import { SetupStoreId } from '@/enum' ;
8+ import { useAuthStore } from '../auth' ;
89import {
910 addThemeVarsToGlobal ,
1011 createThemeToken ,
@@ -18,10 +19,14 @@ import {
1819export const useThemeStore = defineStore ( SetupStoreId . Theme , ( ) => {
1920 const scope = effectScope ( ) ;
2021 const osTheme = usePreferredColorScheme ( ) ;
22+ const authStore = useAuthStore ( ) ;
2123
2224 /** Theme settings */
2325 const settings : Ref < App . Theme . ThemeSetting > = ref ( initThemeSettings ( ) ) ;
2426
27+ /** Watermark time instance with controls */
28+ const { now : watermarkTime , pause : pauseWatermarkTime , resume : resumeWatermarkTime } = useNow ( { controls : true } ) ;
29+
2530 /** Dark mode */
2631 const darkMode = computed ( ( ) => {
2732 if ( settings . value . themeScheme === 'auto' ) {
@@ -57,6 +62,28 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
5762 */
5863 const settingsJson = computed ( ( ) => JSON . stringify ( settings . value ) ) ;
5964
65+ /** Watermark time date formatter */
66+ const formattedWatermarkTime = computed ( ( ) => {
67+ const { watermark } = settings . value ;
68+ const date = useDateFormat ( watermarkTime , watermark . timeFormat ) ;
69+ return date . value ;
70+ } ) ;
71+
72+ /** Watermark content */
73+ const watermarkContent = computed ( ( ) => {
74+ const { watermark } = settings . value ;
75+
76+ if ( watermark . enableUserName && authStore . userInfo . userName ) {
77+ return authStore . userInfo . userName ;
78+ }
79+
80+ if ( watermark . enableTime ) {
81+ return formattedWatermarkTime . value ;
82+ }
83+
84+ return watermark . text ;
85+ } ) ;
86+
6087 /** Reset store */
6188 function resetStore ( ) {
6289 const themeStore = useThemeStore ( ) ;
@@ -153,6 +180,44 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
153180 settings . value . layout . reverseHorizontalMix = reverse ;
154181 }
155182
183+ /**
184+ * Set watermark enable user name
185+ *
186+ * @param enable Whether to enable user name watermark
187+ */
188+ function setWatermarkEnableUserName ( enable : boolean ) {
189+ settings . value . watermark . enableUserName = enable ;
190+
191+ if ( enable ) {
192+ settings . value . watermark . enableTime = false ;
193+ }
194+ }
195+
196+ /**
197+ * Set watermark enable time
198+ *
199+ * @param enable Whether to enable time watermark
200+ */
201+ function setWatermarkEnableTime ( enable : boolean ) {
202+ settings . value . watermark . enableTime = enable ;
203+
204+ if ( enable ) {
205+ settings . value . watermark . enableUserName = false ;
206+ }
207+ }
208+
209+ /** Only run timer when watermark is visible and time display is enabled */
210+ function updateWatermarkTimer ( ) {
211+ const { watermark } = settings . value ;
212+ const shouldRunTimer = watermark . visible && watermark . enableTime ;
213+
214+ if ( shouldRunTimer ) {
215+ resumeWatermarkTime ( ) ;
216+ } else {
217+ pauseWatermarkTime ( ) ;
218+ }
219+ }
220+
156221 /** Cache theme settings */
157222 function cacheThemeSettings ( ) {
158223 const isProd = import . meta. env . PROD ;
@@ -196,6 +261,15 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
196261 } ,
197262 { immediate : true }
198263 ) ;
264+
265+ // watch watermark settings to control timer
266+ watch (
267+ ( ) => [ settings . value . watermark . visible , settings . value . watermark . enableTime ] ,
268+ ( ) => {
269+ updateWatermarkTimer ( ) ;
270+ } ,
271+ { immediate : true }
272+ ) ;
199273 } ) ;
200274
201275 /** On scope dispose */
@@ -209,13 +283,16 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
209283 themeColors,
210284 naiveTheme,
211285 settingsJson,
286+ watermarkContent,
212287 setGrayscale,
213288 setColourWeakness,
214289 resetStore,
215290 setThemeScheme,
216291 toggleThemeScheme,
217292 updateThemeColors,
218293 setThemeLayout,
219- setLayoutReverseHorizontalMix
294+ setLayoutReverseHorizontalMix,
295+ setWatermarkEnableUserName,
296+ setWatermarkEnableTime
220297 } ;
221298} ) ;
0 commit comments