enhance: uniform theme color (#8702)
* enhance: make theme color format uniform All newly fetched instance theme colors will be uniformely formatted as hashtag followed by 6 hexadecimal digits. Colors are checked for validity and invalid colors are not handled. * better input validation for own theme color * migration to unify theme color formats Fixes theme colors of other instances as well as the local instance. * add changelog entry Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
This commit is contained in:
		
							parent
							
								
									55a578a8df
								
							
						
					
					
						commit
						aaf5bb62ab
					
				
					 4 changed files with 47 additions and 10 deletions
				
			
		|  | @ -0,0 +1,38 @@ | |||
| import tinycolor from 'tinycolor2'; | ||||
| 
 | ||||
| export class uniformThemecolor1652859567549 { | ||||
| 	name = 'uniformThemecolor1652859567549' | ||||
| 
 | ||||
| 	async up(queryRunner) { | ||||
| 		const formatColor = (color) => { | ||||
| 			let tc = new tinycolor(color); | ||||
| 			if (color.isValid()) { | ||||
| 				return color.toHexString(); | ||||
| 			} else { | ||||
| 				return null; | ||||
| 			} | ||||
| 		}; | ||||
| 
 | ||||
| 		await Promise.all(queryRunner.query('SELECT "id", "themeColor" FROM "instance" WHERE "themeColor" IS NOT NULL') | ||||
| 		.then(instances => instances.map(instance => { | ||||
| 			// update theme color to uniform format, e.g. #00ff00
 | ||||
| 			// invalid theme colors get set to null
 | ||||
| 			instance.color = formatColor(instance.color); | ||||
| 
 | ||||
| 			return queryRunner.query('UPDATE "instance" SET "themeColor" = :themeColor WHERE "id" = :id', instance); | ||||
| 		}))); | ||||
| 
 | ||||
| 		// also fix own theme color
 | ||||
| 		await queryRunner.query('SELECT "themeColor" FROM "meta" WHERE "themeColor" IS NOT NULL LIMIT 1') | ||||
| 		.then(metas => { | ||||
| 			if (metas.length > 0) { | ||||
| 				return queryRunner.query('UPDATE "meta" SET "themeColor" = :color', { color: formatColor(metas[0].color) }); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	async down(queryRunner) { | ||||
| 		// The original representation is not stored, so migrating back is not possible.
 | ||||
| 		// The new format also works in older versions so this is not a problem.
 | ||||
| 	} | ||||
| } | ||||
|  | @ -27,7 +27,7 @@ export const paramDef = { | |||
| 		blockedHosts: { type: 'array', nullable: true, items: { | ||||
| 			type: 'string', | ||||
| 		} }, | ||||
| 		themeColor: { type: 'string', nullable: true }, | ||||
| 		themeColor: { type: 'string', nullable: true, pattern: '^#[0-9a-fA-F]{6}$' }, | ||||
| 		mascotImageUrl: { type: 'string', nullable: true }, | ||||
| 		bannerUrl: { type: 'string', nullable: true }, | ||||
| 		errorImageUrl: { type: 'string', nullable: true }, | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| import { DOMWindow, JSDOM } from 'jsdom'; | ||||
| import fetch from 'node-fetch'; | ||||
| import tinycolor from 'tinycolor2'; | ||||
| import { getJson, getHtml, getAgentByUrl } from '@/misc/fetch.js'; | ||||
| import { Instance } from '@/models/entities/instance.js'; | ||||
| import { Instances } from '@/models/index.js'; | ||||
|  | @ -208,16 +209,11 @@ async function fetchIconUrl(instance: Instance, doc: DOMWindow['document'] | nul | |||
| } | ||||
| 
 | ||||
| async function getThemeColor(doc: DOMWindow['document'] | null, manifest: Record<string, any> | null): Promise<string | null> { | ||||
| 	if (doc) { | ||||
| 		const themeColor = doc.querySelector('meta[name="theme-color"]')?.getAttribute('content'); | ||||
| 	const themeColor = doc?.querySelector('meta[name="theme-color"]')?.getAttribute('content') || manifest?.theme_color; | ||||
| 
 | ||||
| 		if (themeColor) { | ||||
| 			return themeColor; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (manifest) { | ||||
| 		return manifest.theme_color; | ||||
| 	if (themeColor) { | ||||
| 		const color = new tinycolor(themeColor); | ||||
| 		if (color.isValid()) return color.toHexString(); | ||||
| 	} | ||||
| 
 | ||||
| 	return null; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue