Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(frontend): サーバーの表示をアイコンのみに切り替えられるように #14822

Open
wants to merge 17 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
2518cf3
Merge pull request #14675 from misskey-dev/develop
misskey-release-bot[bot] Oct 9, 2024
b99e13e
Merge pull request #14741 from misskey-dev/develop
misskey-release-bot[bot] Oct 15, 2024
2dcd911
feat(frontend): サーバーの表示をアイコンのみに切り替えられるように
MattyaDaihuku Oct 23, 2024
40ac246
Merge branch 'misskey-dev:develop' into instanceicon
MattyaDaihuku Oct 29, 2024
8c1dfab
fix(frontend): MkSelectにinstanceIconの設定を含めるように
MattyaDaihuku Nov 3, 2024
1368f58
fix(frontend): MkAvatar内にMkInstanceIconの内容を含めるように
MattyaDaihuku Nov 17, 2024
e9e2e3c
Merge branch 'develop' into instanceicon
MattyaDaihuku Nov 17, 2024
e8518de
Merge pull request #14924 from misskey-dev/develop
misskey-release-bot[bot] Nov 22, 2024
906a776
Merge branch 'misskey-dev:develop' into instanceicon
MattyaDaihuku Dec 30, 2024
3688049
Merge pull request #15279 from misskey-dev/develop
misskey-release-bot[bot] Jan 28, 2025
c93ead7
Merge pull request #15378 from misskey-dev/develop
misskey-release-bot[bot] Feb 5, 2025
4565291
Merge remote-tracking branch 'origin/master' into instanceicon
MattyaDaihuku Feb 17, 2025
b837d51
Merge remote-tracking branch 'origin/develop' into instanceicon
MattyaDaihuku Feb 17, 2025
ecec18f
Merge branch 'misskey-dev:develop' into instanceicon
MattyaDaihuku Feb 17, 2025
9633f55
fix: upstreamに追従して変更
MattyaDaihuku Feb 17, 2025
e09cde1
Merge branch 'misskey-dev:develop' into instanceicon
MattyaDaihuku Feb 21, 2025
bbb16cf
fix
MattyaDaihuku Feb 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7446,6 +7446,14 @@ export interface Locale extends ILocale {
* 常に表示
*/
"always": string;
/**
* リモートユーザーに表示(アイコンのみ)
*/
"remoteIcon": string;
/**
* 常に表示(アイコンのみ)
*/
"alwaysIcon": string;
};
"_serverDisconnectedBehavior": {
/**
Expand Down
2 changes: 2 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1944,6 +1944,8 @@ _instanceTicker:
none: "表示しない"
remote: "リモートユーザーに表示"
always: "常に表示"
remoteIcon: "リモートユーザーに表示(アイコンのみ)"
alwaysIcon: "常に表示(アイコンのみ)"

_serverDisconnectedBehavior:
reload: "自動でリロード"
Expand Down
54 changes: 54 additions & 0 deletions packages/frontend/src/components/MkInstanceIcon.vue
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これはコンポーネントとして切り出さず、MkAvatar内に直接実装した方が自然かつパフォーマンスも良さそうです

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

わかりました!そうします!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MkAvatar内に直接実装しました

Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->

<template>
<div>
<img v-if="faviconUrl" :class="$style.instanceIcon" :src="faviconUrl"/>
</div>
</template>

<script lang="ts" setup>
import { computed } from 'vue';
import { instance as Instance } from '@/instance.js';
import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js';
const props = defineProps<{
instance?: {
faviconUrl?: string | null
}
}>();
const faviconUrl = computed(() => props.instance ? getProxiedImageUrlNullable(props.instance.faviconUrl, 'preview') : getProxiedImageUrlNullable(Instance.iconUrl, 'preview') ?? '/favicon.ico');
</script>

<style lang="scss" module>
.instanceIcon {
width: 25px;
height: 25px;
border-radius: 50%;
opacity: 0.7;
background: var(--MI_THEME-panel);
box-shadow: 0 0 0 2px var(--MI_THEME-panel);
}

@container (max-width: 580px) {
.instanceIcon {
width: 21px;
height: 21px;
}
}

@container (max-width: 450px) {
.instanceIcon {
width: 19px;
height: 19px;
}
}

@container (max-width: 300px) {
.instanceIcon {
width: 17px;
height: 17px;
}
}
</style>
3 changes: 2 additions & 1 deletion packages/frontend/src/components/MkNote.vue
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
<article v-else :class="$style.article" @contextmenu.stop="onContextmenu">
<div v-if="appearNote.channel" :class="$style.colorBar" :style="{ background: appearNote.channel.color }"></div>
<MkAvatar :class="$style.avatar" :user="appearNote.user" :link="!mock" :preview="!mock"/>
<MkAvatar :class="$style.avatar" :user="appearNote.user" :link="!mock" :preview="!mock" :showInstance="showInstanceIcon"/>
<div :class="$style.main">
<MkNoteHeader :note="appearNote" :mini="true"/>
<MkInstanceTicker v-if="showTicker" :instance="appearNote.user.instance"/>
Expand Down Expand Up @@ -274,6 +274,7 @@ const hardMuted = ref(props.withHardMute && checkMute(appearNote.value, $i?.hard
const translation = ref<Misskey.entities.NotesTranslateResponse | null>(null);
const translating = ref(false);
const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.value.user.instance);
const showInstanceIcon = (defaultStore.state.instanceTicker === 'alwaysIcon') || (defaultStore.state.instanceTicker === 'remoteIcon' && appearNote.value.user.instance);
const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || (appearNote.value.visibility === 'followers' && appearNote.value.userId === $i?.id));
const renoteCollapsed = ref(
defaultStore.state.collapseRenotes && isRenote && (
Expand Down
30 changes: 30 additions & 0 deletions packages/frontend/src/components/global/MkAvatar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only
alt=""
>
</template>
<MkInstanceIcon v-if="showInstance" :class="$style.instanceicon" :instance="user.instance"/>
</component>
</template>

Expand All @@ -49,6 +50,7 @@ import { getStaticImageUrl } from '@/scripts/media-proxy.js';
import { acct, userPage } from '@/filters/user.js';
import MkUserOnlineIndicator from '@/components/MkUserOnlineIndicator.vue';
import { defaultStore } from '@/store.js';
import MkInstanceIcon from '@/components/MkInstanceIcon.vue';

const animation = ref(defaultStore.state.animation);
const squareAvatars = ref(defaultStore.state.squareAvatars);
Expand All @@ -62,13 +64,15 @@ const props = withDefaults(defineProps<{
indicator?: boolean;
decorations?: (Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'> & { blink?: boolean; })[];
forceShowDecoration?: boolean;
showInstance?: boolean;
}>(), {
target: null,
link: false,
preview: false,
indicator: false,
decorations: undefined,
forceShowDecoration: false,
showInstance: false,
});

const emit = defineEmits<{
Expand Down Expand Up @@ -343,4 +347,30 @@ watch(() => props.user.avatarBlurhash, () => {
filter: brightness(1);
}
}

.instanceicon {
height: 25px;
z-index: 2;
position: absolute;
left: 0;
bottom: 0;
}

@container (max-width: 580px) {
.instanceicon {
height: 21px;
}
}

@container (max-width: 450px) {
.instanceicon {
height: 19px;
}
}

@container (max-width: 300px) {
.instanceicon {
height: 17px;
}
}
</style>
2 changes: 2 additions & 0 deletions packages/frontend/src/pages/settings/general.vue
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<option value="none">{{ i18n.ts._instanceTicker.none }}</option>
<option value="remote">{{ i18n.ts._instanceTicker.remote }}</option>
<option value="always">{{ i18n.ts._instanceTicker.always }}</option>
<option value="remoteIcon">{{ i18n.ts._instanceTicker.remoteIcon }}</option>
<option value="alwaysIcon">{{ i18n.ts._instanceTicker.alwaysIcon }}</option>
</MkSelect>

<MkSelect v-model="nsfw">
Expand Down
2 changes: 1 addition & 1 deletion packages/frontend/src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ export const defaultStore = markRaw(new Storage('base', {
},
instanceTicker: {
where: 'device',
default: 'remote' as 'none' | 'remote' | 'always',
default: 'remote' as 'none' | 'remote' | 'always' | 'remoteIcon' | 'alwaysIcon',
},
emojiPickerScale: {
where: 'device',
Expand Down
Loading