summaryrefslogtreecommitdiff
path: root/packages/client/src/instance.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/client/src/instance.ts')
-rw-r--r--packages/client/src/instance.ts52
1 files changed, 52 insertions, 0 deletions
diff --git a/packages/client/src/instance.ts b/packages/client/src/instance.ts
new file mode 100644
index 0000000000..6e912aa2e5
--- /dev/null
+++ b/packages/client/src/instance.ts
@@ -0,0 +1,52 @@
+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;
+ }
+}