summaryrefslogtreecommitdiff
path: root/packages/frontend/src/instance.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/instance.ts')
-rw-r--r--packages/frontend/src/instance.ts45
1 files changed, 45 insertions, 0 deletions
diff --git a/packages/frontend/src/instance.ts b/packages/frontend/src/instance.ts
new file mode 100644
index 0000000000..51464f32fb
--- /dev/null
+++ b/packages/frontend/src/instance.ts
@@ -0,0 +1,45 @@
+import { computed, reactive } from 'vue';
+import * as Misskey from 'misskey-js';
+import { api } from './os';
+
+// TODO: 他のタブと永続化されたstateを同期
+
+const instanceData = localStorage.getItem('instance');
+
+// TODO: instanceをリアクティブにするかは再考の余地あり
+
+export const instance: Misskey.entities.InstanceMetadata = reactive(instanceData ? JSON.parse(instanceData) : {
+ // 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);
+});