hippofish/packages/client/src/components/MkEmojiPickerDialog.vue
2023-08-10 20:25:21 +00:00

90 lines
1.8 KiB
Vue

<template>
<MkModal
ref="modal"
v-slot="{ type, maxHeight }"
:z-priority="'middle'"
:prefer-type="
asReactionPicker &&
defaultStore.state.reactionPickerUseDrawerForMobile === false
? 'popup'
: 'auto'
"
:transparent-bg="true"
:manual-showing="manualShowing"
:src="src"
@click="checkForShift"
@opening="opening"
@close="emit('close')"
@closed="emit('closed')"
>
<MkEmojiPicker
ref="picker"
class="ryghynhb _popup _shadow"
:class="{ drawer: type === 'drawer' }"
:show-pinned="showPinned"
:as-reaction-picker="asReactionPicker"
:as-drawer="type === 'drawer'"
:max-height="maxHeight"
@chosen="chosen"
/>
</MkModal>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import MkModal from "@/components/MkModal.vue";
import MkEmojiPicker from "@/components/MkEmojiPicker.vue";
import { defaultStore } from "@/store";
withDefaults(
defineProps<{
manualShowing?: boolean | null;
src?: HTMLElement;
showPinned?: boolean;
asReactionPicker?: boolean;
}>(),
{
manualShowing: null,
showPinned: true,
asReactionPicker: false,
},
);
const emit = defineEmits<{
(ev: "done", v: any): void;
(ev: "close"): void;
(ev: "closed"): void;
}>();
const modal = ref<InstanceType<typeof MkModal>>();
const picker = ref<InstanceType<typeof MkEmojiPicker>>();
function checkForShift(ev?: MouseEvent) {
if (ev?.shiftKey) return;
modal.value?.close(ev);
}
function chosen(emoji: any, ev: MouseEvent) {
emit("done", emoji);
checkForShift(ev);
}
function opening() {
try {
picker.value?.reset();
} catch (e) {
console.error("Something's wrong with resetting the emoji picker", e);
}
picker.value?.focus();
}
</script>
<style lang="scss" scoped>
.ryghynhb {
&.drawer {
border-radius: 24px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
}
</style>