53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { computed, reactive } from 'vue';
 | |
| import * as Misskey from 'misskey-js';
 | |
| import { api } from './os';
 | |
| 
 | |
| // TODO: 他のタブと永続化されたstateを同期
 | |
| 
 | |
| const data = localStorage.getItem('instance');
 | |
| 
 | |
| // TODO: instanceをリアクティブにするかは再考の余地あり
 | |
| 
 | |
| export const instance: Misskey.entities.InstanceMetadata = reactive(data ? JSON.parse(data) : {
 | |
| 	// TODO: set default values
 | |
| });
 | |
| 
 | |
| export async function fetchInstance() {
 | |
| 	const meta = await api('meta', {
 | |
| 		detail: false
 | |
| 	});
 | |
| 
 | |
| 	for (const [k, v] of Object.entries(meta)) {
 | |
| 		instance[k] = v;
 | |
| 	}
 | |
| 
 | |
| 	localStorage.setItem('instance', JSON.stringify(instance));
 | |
| }
 | |
| 
 | |
| export const emojiCategories = computed(() => {
 | |
| 	if (instance.emojis == null) return [];
 | |
| 	const categories = new Set();
 | |
| 	for (const emoji of instance.emojis) {
 | |
| 		categories.add(emoji.category);
 | |
| 	}
 | |
| 	return Array.from(categories);
 | |
| });
 | |
| 
 | |
| export const emojiTags = computed(() => {
 | |
| 	if (instance.emojis == null) return [];
 | |
| 	const tags = new Set();
 | |
| 	for (const emoji of instance.emojis) {
 | |
| 		for (const tag of emoji.aliases) {
 | |
| 			tags.add(tag);
 | |
| 		}
 | |
| 	}
 | |
| 	return Array.from(tags);
 | |
| });
 | |
| 
 | |
| // このファイルに書きたくないけどここに書かないと何故かVeturが認識しない
 | |
| declare module '@vue/runtime-core' {
 | |
| 	interface ComponentCustomProperties {
 | |
| 		$instance: typeof instance;
 | |
| 	}
 | |
| }
 | 
