mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-22 01:47:39 -07:00
feat: ✨ patron labels
This commit is contained in:
parent
788d54af6f
commit
9c9a9ee261
5 changed files with 59 additions and 11 deletions
|
@ -1099,6 +1099,11 @@ noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it int
|
|||
with Calckey."
|
||||
silencedWarning: "This page is showing because these users are from servers your admin
|
||||
silenced, so they may potentially be spam."
|
||||
isBot: "This account is a bot"
|
||||
isLocked: "This account has follow approvals"
|
||||
isModerator: "Moderator"
|
||||
isAdmin: "Administrator"
|
||||
isPatron: "Calckey Patron"
|
||||
|
||||
_sensitiveMediaDetection:
|
||||
description: "Reduces the effort of server moderation through automatically recognizing
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import define from "../define.js";
|
||||
import Logger from "@/services/logger.js";
|
||||
|
||||
export const meta = {
|
||||
tags: ["meta"],
|
||||
|
@ -22,6 +23,9 @@ export default define(meta, paramDef, async () => {
|
|||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
patrons = data["patrons"];
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error fetching patrons:", error);
|
||||
});
|
||||
|
||||
return patrons;
|
||||
|
|
|
@ -5,6 +5,7 @@ import type * as Misskey from "calckey-js";
|
|||
// TODO: 他のタブと永続化されたstateを同期
|
||||
|
||||
const instanceData = localStorage.getItem("instance");
|
||||
const patronData = localStorage.getItem("patrons");
|
||||
|
||||
// TODO: instanceをリアクティブにするかは再考の余地あり
|
||||
|
||||
|
@ -16,6 +17,8 @@ export const instance: Misskey.entities.DetailedInstanceMetadata = reactive(
|
|||
},
|
||||
);
|
||||
|
||||
export const patrons = patronData || [];
|
||||
|
||||
export async function fetchInstance() {
|
||||
const meta = await api("meta", {
|
||||
detail: true,
|
||||
|
@ -28,6 +31,11 @@ export async function fetchInstance() {
|
|||
localStorage.setItem("instance", JSON.stringify(instance));
|
||||
}
|
||||
|
||||
export async function fetchPatrons() {
|
||||
const patrons = await api("patrons");
|
||||
localStorage.setItem("patrons", JSON.stringify(patrons));
|
||||
}
|
||||
|
||||
export const emojiCategories = computed(() => {
|
||||
if (instance.emojis == null) return [];
|
||||
const categories = new Set();
|
||||
|
|
|
@ -163,14 +163,15 @@ import { i18n } from "@/i18n";
|
|||
import { defaultStore } from "@/store";
|
||||
import * as os from "@/os";
|
||||
import { definePageMetadata } from "@/scripts/page-metadata";
|
||||
|
||||
const patrons = await os.api("patrons");
|
||||
import { patrons, fetchPatrons } from "@/instance";
|
||||
|
||||
let easterEggReady = false;
|
||||
let easterEggEmojis = $ref([]);
|
||||
let easterEggEngine = $ref(null);
|
||||
const containerEl = $ref<HTMLElement>();
|
||||
|
||||
await fetchPatrons()
|
||||
|
||||
function iconLoaded() {
|
||||
const emojis = defaultStore.state.reactions;
|
||||
const containerWidth = containerEl?.offsetWidth;
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
/></span>
|
||||
<span
|
||||
v-if="user.isAdmin"
|
||||
:title="i18n.ts.isAdmin"
|
||||
v-tooltip.noDelay="i18n.ts.isAdmin"
|
||||
style="color: var(--badge)"
|
||||
><i
|
||||
class="ph-bookmark-simple ph-fill ph-lg"
|
||||
|
@ -62,22 +62,36 @@
|
|||
></span>
|
||||
<span
|
||||
v-if="!user.isAdmin && user.isModerator"
|
||||
:title="i18n.ts.isModerator"
|
||||
v-tooltip.noDelay="i18n.ts.isModerator"
|
||||
style="color: var(--badge)"
|
||||
><i
|
||||
class="ph-bookmark-simple ph-bold"
|
||||
class="ph-bookmark-simple ph-bold ph-lg"
|
||||
></i
|
||||
></span>
|
||||
<span
|
||||
v-if="user.isLocked"
|
||||
:title="i18n.ts.isLocked"
|
||||
v-tooltip.noDelay="i18n.ts.isLocked"
|
||||
><i class="ph-lock ph-bold ph-lg"></i
|
||||
></span>
|
||||
<span
|
||||
v-if="user.isBot"
|
||||
:title="i18n.ts.isBot"
|
||||
v-tooltip.noDelay="i18n.ts.isBot"
|
||||
><i class="ph-robot ph-bold ph-lg"></i
|
||||
></span>
|
||||
<span
|
||||
v-if="
|
||||
patrons?.includes(
|
||||
`@${user.username}@${
|
||||
user.host || host
|
||||
}`
|
||||
)
|
||||
"
|
||||
v-tooltip.noDelay="i18n.ts.isPatron"
|
||||
style="color: var(--badge)"
|
||||
><i
|
||||
class="ph-hand-coins ph-bold ph-lg"
|
||||
></i
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -110,7 +124,7 @@
|
|||
/></span>
|
||||
<span
|
||||
v-if="user.isAdmin"
|
||||
:title="i18n.ts.isAdmin"
|
||||
v-tooltip.noDelay="i18n.ts.isAdmin"
|
||||
style="color: var(--badge)"
|
||||
><i
|
||||
class="ph-bookmark-simple ph-fill ph-lg"
|
||||
|
@ -118,18 +132,32 @@
|
|||
></span>
|
||||
<span
|
||||
v-if="!user.isAdmin && user.isModerator"
|
||||
:title="i18n.ts.isModerator"
|
||||
v-tooltip.noDelay="i18n.ts.isModerator"
|
||||
style="color: var(--badge)"
|
||||
><i class="ph-bookmark-simple ph-bold"></i
|
||||
></span>
|
||||
<span
|
||||
v-if="user.isLocked"
|
||||
:title="i18n.ts.isLocked"
|
||||
v-tooltip.noDelay="i18n.ts.isLocked"
|
||||
><i class="ph-lock ph-bold ph-lg"></i
|
||||
></span>
|
||||
<span v-if="user.isBot" :title="i18n.ts.isBot"
|
||||
<span
|
||||
v-if="user.isBot"
|
||||
v-tooltip.noDelay="i18n.ts.isBot"
|
||||
><i class="ph-robot ph-bold ph-lg"></i
|
||||
></span>
|
||||
<span
|
||||
v-if="
|
||||
patrons?.includes(
|
||||
`@${user.username}@${
|
||||
user.host || host
|
||||
}`
|
||||
)
|
||||
"
|
||||
v-tooltip.noDelay="i18n.ts.isPatron"
|
||||
style="color: var(--badge)"
|
||||
><i class="ph-hand-coins ph-bold ph-lg"></i
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="follow-container">
|
||||
|
@ -324,6 +352,8 @@ import * as os from "@/os";
|
|||
import { useRouter } from "@/router";
|
||||
import { i18n } from "@/i18n";
|
||||
import { $i } from "@/account";
|
||||
import { host } from "@/config";
|
||||
import { patrons } from "@/instance";
|
||||
|
||||
const XPhotos = defineAsyncComponent(() => import("./index.photos.vue"));
|
||||
const XActivity = defineAsyncComponent(() => import("./index.activity.vue"));
|
||||
|
|
Loading…
Reference in a new issue