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

入力フォームでもリアクション選択時に使用するピッカーを使うようにしたい #12337

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
370099d
入力フォームでもリアクション選択時に使用するピッカーを使うようにしたい
samunohito Nov 15, 2023
531313f
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 15, 2023
6b33854
erase console.log
samunohito Nov 15, 2023
52f3364
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 15, 2023
b68b4eb
fix CHANGELOG.md
samunohito Nov 15, 2023
a696a0f
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 15, 2023
d23fb31
reaction-picker.ts を戻し、今回の対応を入れた emoji-picker.ts を新たに作成
samunohito Nov 15, 2023
96ea351
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 21, 2023
a9406c3
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 22, 2023
4bf240f
fix CHANGELOG.md
samunohito Nov 22, 2023
50e0573
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 22, 2023
8e18453
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 22, 2023
bffc292
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 24, 2023
888f8b2
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Nov 28, 2023
9c15acf
Merge branch 'develop' into enhance/input_form_reaction_picker
samunohito Dec 3, 2023
62a2922
Merge branch 'develop' into enhance/input_form_reaction_picker
syuilo Dec 3, 2023
a3b2ec4
tweak
syuilo Dec 3, 2023
77ee21d
Merge branch 'enhance/input_form_reaction_picker' of https://github.c…
syuilo Dec 3, 2023
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
### Client
- Feat: 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加
- Feat: データセーバーでコードハイライトの読み込みを削減できるように
- Enhance: 投稿フォームの絵文字ピッカーをリアクション時に使用するものと同じのを使用するように #12336
- Enhance: 絵文字のオートコンプリート機能強化 #12364
- Enhance: ユーザーのRawデータを表示するページが復活
- Enhance: リアクション選択時に音を鳴らせるように
Expand Down
2 changes: 2 additions & 0 deletions packages/frontend/src/boot/main-boot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { claimAchievement, claimedAchievements } from '@/scripts/achievements.js
import { mainRouter } from '@/router.js';
import { initializeSw } from '@/scripts/initialize-sw.js';
import { deckStore } from '@/ui/deck/deck-store.js';
import { emojiPicker } from '@/scripts/emoji-picker.js';

export async function mainBoot() {
const { isClientUpdated } = await common(() => createApp(
Expand All @@ -30,6 +31,7 @@ export async function mainBoot() {
));

reactionPicker.init();
emojiPicker.init();

if (isClientUpdated && $i) {
popup(defineAsyncComponent(() => import('@/components/MkUpdated.vue')), {}, {}, 'closed');
Expand Down
5 changes: 3 additions & 2 deletions packages/frontend/src/components/MkEmojiPicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</section>

<div v-if="tab === 'index'" class="group index">
<section v-if="showPinned">
<section v-if="showPinned && pinned.length > 0">
<div class="body">
<button
v-for="emoji in pinned"
Expand Down Expand Up @@ -137,14 +137,15 @@ const searchEl = shallowRef<HTMLInputElement>();
const emojisEl = shallowRef<HTMLDivElement>();

const {
reactions: pinned,
reactions: pinnedReactions,
reactionPickerSize,
reactionPickerWidth,
reactionPickerHeight,
disableShowingAnimatedImages,
recentlyUsedEmojis,
} = defaultStore.reactiveState;

const pinned = computed(() => props.asReactionPicker ? pinnedReactions.value : []); // TODO: 非リアクションの絵文字ピッカー用のpinned絵文字を設定可能にする?
const size = computed(() => props.asReactionPicker ? reactionPickerSize.value : 1);
const width = computed(() => props.asReactionPicker ? reactionPickerWidth.value : 3);
const height = computed(() => props.asReactionPicker ? reactionPickerHeight.value : 2);
Expand Down
19 changes: 11 additions & 8 deletions packages/frontend/src/components/MkEmojiPickerDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,21 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>

<script lang="ts" setup>
import { shallowRef } from 'vue';
import MkModal from '@/components/MkModal.vue';
import MkEmojiPicker from '@/components/MkEmojiPicker.vue';
import { defaultStore } from '@/store.js';

withDefaults(defineProps<{
const props = withDefaults(defineProps<{
manualShowing?: boolean | null;
src?: HTMLElement;
showPinned?: boolean;
asReactionPicker?: boolean;
choseAndClose?: boolean;
}>(), {
manualShowing: null,
showPinned: true,
asReactionPicker: false,
choseAndClose: true,
});

const emit = defineEmits<{
Expand All @@ -53,21 +54,23 @@ const emit = defineEmits<{
(ev: 'closed'): void;
}>();

const modal = shallowRef<InstanceType<typeof MkModal>>();
const picker = shallowRef<InstanceType<typeof MkEmojiPicker>>();
const modal = $shallowRef<InstanceType<typeof MkModal>>();
const picker = $shallowRef<InstanceType<typeof MkEmojiPicker>>();

function chosen(emoji: any) {
emit('done', emoji);
modal.value?.close();
if (props.choseAndClose) {
modal?.close();
}
}

function opening() {
picker.value?.reset();
picker.value?.focus();
picker?.reset();
picker?.focus();

// 何故かちょっと待たないとフォーカスされない
setTimeout(() => {
picker.value?.focus();
picker?.focus();
}, 10);
}
</script>
Expand Down
11 changes: 10 additions & 1 deletion packages/frontend/src/components/MkPostForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ import { deepClone } from '@/scripts/clone.js';
import MkRippleEffect from '@/components/MkRippleEffect.vue';
import { miLocalStorage } from '@/local-storage.js';
import { claimAchievement } from '@/scripts/achievements.js';
import { emojiPicker } from '@/scripts/emoji-picker.js';

const modal = inject('modal');

Expand Down Expand Up @@ -845,7 +846,15 @@ function insertMention() {
}

async function insertEmoji(ev: MouseEvent) {
os.openEmojiPicker(ev.currentTarget ?? ev.target, {}, textareaEl);
emojiPicker.show(
ev.currentTarget ?? ev.target,
emoji => {
insertTextAtCursor(textareaEl, emoji);
},
() => {
focus();
},
);
}

function showActions(ev) {
Expand Down
57 changes: 57 additions & 0 deletions packages/frontend/src/scripts/emoji-picker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/

import { defineAsyncComponent, Ref, ref } from 'vue';
import { popup } from '@/os.js';

/**
* 絵文字ピッカーを表示する。
* 類似の機能として{@link ReactionPicker}が存在しているが、この機能とは動きが異なる。
* 投稿フォームなどで絵文字を選択する時など、絵文字ピックアップ後でもダイアログが消えずに残り、
* 一度表示したダイアログを連続で使用できることが望ましいシーンでの利用が想定される。
*/
class EmojiPicker {
private src: Ref<HTMLElement | null> = ref(null);
private manualShowing = ref(false);
private onChosen?: (emoji: string) => void;
private onClosed?: () => void;

constructor() {
// nop
}

public async init() {
await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
src: this.src,
asReactionPicker: false,
manualShowing: this.manualShowing,
choseAndClose: false,
}, {
done: emoji => {
if (this.onChosen) this.onChosen(emoji);
},
close: () => {
this.manualShowing.value = false;
},
closed: () => {
this.src.value = null;
if (this.onClosed) this.onClosed();
},
});
}

public show(
src: HTMLElement,
onChosen: EmojiPicker['onChosen'],
onClosed: EmojiPicker['onClosed'],
) {
this.src.value = src;
this.manualShowing.value = true;
this.onChosen = onChosen;
this.onClosed = onClosed;
}
}

export const emojiPicker = new EmojiPicker();
Loading