7 changed files with 281 additions and 19 deletions
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
import { create } from "zustand"; |
||||
import { persist } from "zustand/middleware"; |
||||
import { immer } from "zustand/middleware/immer"; |
||||
|
||||
export interface SubtitleStyling { |
||||
/** |
||||
* Text color of subtitles, hex string |
||||
*/ |
||||
color: string; |
||||
|
||||
/** |
||||
* size percentage, ranges between 0 and 2 |
||||
*/ |
||||
size: number; |
||||
|
||||
/** |
||||
* background opacity, ranges between 0 and 1 |
||||
*/ |
||||
backgroundOpacity: number; |
||||
} |
||||
|
||||
export interface SubtitleStore { |
||||
enabled: boolean; |
||||
lastSelectedLanguage: string | null; |
||||
styling: SubtitleStyling; |
||||
updateStyling(newStyling: Partial<SubtitleStyling>): void; |
||||
setLanguage(language: string | null): void; |
||||
} |
||||
|
||||
// TODO add migration from previous stored settings
|
||||
export const useSubtitleStore = create( |
||||
persist( |
||||
immer<SubtitleStore>((set) => ({ |
||||
enabled: false, |
||||
lastSelectedLanguage: null, |
||||
styling: { |
||||
color: "#ffffff", |
||||
backgroundOpacity: 0.5, |
||||
size: 1, |
||||
}, |
||||
updateStyling(newStyling) { |
||||
set((s) => { |
||||
if (newStyling.backgroundOpacity !== undefined) |
||||
s.styling.backgroundOpacity = newStyling.backgroundOpacity; |
||||
if (newStyling.color !== undefined) |
||||
s.styling.color = newStyling.color.toLowerCase(); |
||||
if (newStyling.size !== undefined) |
||||
s.styling.size = Math.min(2, Math.max(0.1, newStyling.size)); |
||||
}); |
||||
}, |
||||
setLanguage(lang) { |
||||
set((s) => { |
||||
s.enabled = !!lang; |
||||
if (lang) s.lastSelectedLanguage = lang; |
||||
}); |
||||
}, |
||||
})), |
||||
{ |
||||
name: "__MW::subtitles", |
||||
} |
||||
) |
||||
); |
Loading…
Reference in new issue