@@ -3,21 +3,19 @@ import { getFileServerURL } from '@shared/Util';
33import { ITheme } from 'flashpoint-launcher' ;
44import { PropsWithChildren , useEffect , useRef } from 'react' ;
55
6- const globalThemeAttribute = 'data-theme' ;
7-
86type ThemeProviderProps = PropsWithChildren ;
97
108export function ThemeProvider ( { children } : ThemeProviderProps ) {
119 const systemThemeVersion = useAppSelector ( state => state . main . systemThemeVersion ) ;
12- const themeVersion = useAppSelector ( state => state . main . themeVersion ) + systemThemeVersion ;
10+ const themeVersion = useAppSelector ( state => state . main . themeVersion ) + ( systemThemeVersion || '' ) ;
1311 const availableThemes = useAppSelector ( state => state . main . themeList ) ;
1412 const currentTheme = useAppSelector ( state => state . preferences . currentTheme ) ;
1513 const coreHref = useRef ( document . querySelector ( '[data-corecss="true"]' ) ?. getAttribute ( 'href' ) || undefined ) ;
1614 const fancyHref = useRef ( document . querySelector ( '[data-fancycss="true"]' ) ?. getAttribute ( 'href' ) || undefined ) ;
1715
1816 // Update system theme when needed
1917 useEffect ( ( ) => {
20- if ( systemThemeVersion > 0 ) {
18+ if ( systemThemeVersion ) {
2119 // Don't need to update unless theme has incremented, first links are in raw HTML
2220 updateSystemThemeDom ( systemThemeVersion , coreHref . current , fancyHref . current ) ;
2321 }
@@ -33,7 +31,7 @@ export function ThemeProvider({ children }: ThemeProviderProps) {
3331}
3432
3533// Updates the System css links to force them to update with new version
36- function updateSystemThemeDom ( version : number , coreHref ?: string , fancyHref ?: string ) : void {
34+ function updateSystemThemeDom ( version : string , coreHref ?: string , fancyHref ?: string ) : void {
3735 if ( coreHref ) {
3836 const existingElements = document . querySelectorAll ( '[data-corecss="true"]' ) ;
3937 const newElement = createThemeElement ( `${ coreHref } ?v=${ version } ` ) ;
@@ -69,17 +67,17 @@ function updateSystemThemeDom(version: number, coreHref?: string, fancyHref?: st
6967
7068
7169// Updates the Theme css links to force them to update with new version, or with the newly selected them
72- function updateThemeDom ( version : number , theme ?: ITheme ) : void {
70+ function updateThemeDom ( version : string , theme ?: ITheme ) : void {
7371 const url = theme ? `${ getFileServerURL ( ) } /Themes/${ theme . id } /${ theme . entryPath } ?v=${ version } ` : undefined ;
7472 replaceThemeElement ( url ) ;
7573}
7674
7775function replaceThemeElement ( url ?: string ) {
7876 // Get list of old theme elems to remove after loading new theme elem
79- const existingElements = document . head . querySelectorAll ( `[ ${ globalThemeAttribute } ="true"]` ) ;
77+ const existingElements = document . head . querySelectorAll ( '[data-theme ="true"]' ) ;
8078 if ( url ) {
8179 const newElement = createThemeElement ( url ) ;
82- newElement . setAttribute ( globalThemeAttribute , 'true' ) ;
80+ newElement . setAttribute ( 'data-theme' , 'true' ) ;
8381 newElement . onload = ( ) => {
8482 existingElements . forEach ( ( elem ) => {
8583 try {
@@ -89,6 +87,16 @@ function replaceThemeElement(url?: string) {
8987 }
9088 } ) ;
9189 } ;
90+ newElement . onerror = ( ) => {
91+ console . error ( 'Failed to load theme:' , url ) ;
92+ existingElements . forEach ( ( elem ) => {
93+ try {
94+ elem . remove ( ) ;
95+ } catch {
96+ // Ignore, may have been removed earlier
97+ }
98+ } ) ;
99+ } ;
92100 if ( document . head ) { document . head . appendChild ( newElement ) ; }
93101 } else {
94102 existingElements . forEach ( ( elem ) => {
0 commit comments