Последняя версия с сервера прошлого разработчика
This commit is contained in:
187
resources/js/Shared/Messanger/MessangerModal.vue
Executable file
187
resources/js/Shared/Messanger/MessangerModal.vue
Executable file
@@ -0,0 +1,187 @@
|
||||
<template>
|
||||
<TransitionRoot as="template" :show="open">
|
||||
<Dialog as="div" static
|
||||
class="fixed z-[1000] inset-0 overflow-y-auto" :open="open"
|
||||
@close="closeAction"
|
||||
>
|
||||
<div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-4 text-center sm:block sm:p-0">
|
||||
<TransitionChild as="template" enter="ease-out duration-300"
|
||||
enter-from="opacity-0" enter-to="opacity-100"
|
||||
leave="ease-in duration-200" leave-from="opacity-100"
|
||||
leave-to="opacity-0"
|
||||
>
|
||||
<DialogOverlay class="fixed inset-0 bg-indigo-200 bg-opacity-75 transition-opacity" />
|
||||
</TransitionChild>
|
||||
|
||||
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">​</span>
|
||||
<TransitionChild as="template" enter="ease-out duration-300"
|
||||
enter-from="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" enter-to="opacity-100 translate-y-0 sm:scale-100"
|
||||
leave="ease-in duration-200" leave-from="opacity-100 translate-y-0 sm:scale-100"
|
||||
leave-to="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
||||
>
|
||||
<div class="inline-block align-bottom bg-indigo-300 rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle w-full sm:max-w-lg sm:w-full sm:p-6">
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-orange sm:mx-0 sm:h-10 sm:w-10">
|
||||
<ChatIcon class="h-6 w-6 text-red-600" aria-hidden="true" />
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
|
||||
<DialogTitle as="h3" class="text-lg leading-6 font-medium text-gray-light">
|
||||
Новое сообщение
|
||||
</DialogTitle>
|
||||
</div>
|
||||
<div v-if="showDialogLink" class="ml-auto">
|
||||
<a href="#" class="underline text-gray text-xs"
|
||||
@click.prevent="linkTo"
|
||||
>перейти в чат</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<textarea ref="textarea" v-model="form.message"
|
||||
rows="3"
|
||||
name="comment" class="outline-none focus:ring-orange-dark focus:border-transparent focus:ring-offset-0 bg-indigo-200 text-white max-h-56 block w-full py-3 border-0 resize-none sm:text-sm"
|
||||
placeholder="Сообщение ..."
|
||||
/>
|
||||
</div>
|
||||
<div class="mt-5 sm:mt-4 sm:flex sm:flex-row space-x-3 justify-end">
|
||||
<button type="button"
|
||||
class="my-1 transition shadow-none hover:shadow-classic inline-flex items-center px-6 py-2 justify-center text-base rounded-md text-white bg-indigo-300 focus:outline-none"
|
||||
@click="closeAction"
|
||||
>
|
||||
Отменить
|
||||
</button>
|
||||
<button type="button"
|
||||
class="my-1 transition shadow-none hover:shadow-classic inline-flex items-center px-6 py-2 justify-center text-base rounded-md text-white bg-green focus:outline-none"
|
||||
@click="submit"
|
||||
>
|
||||
Отправить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</TransitionChild>
|
||||
</div>
|
||||
</Dialog>
|
||||
</TransitionRoot>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
Dialog,
|
||||
DialogOverlay,
|
||||
DialogTitle,
|
||||
TransitionChild,
|
||||
TransitionRoot,
|
||||
} from '@headlessui/vue'
|
||||
import { ChatIcon } from '@heroicons/vue/outline'
|
||||
import { ref } from 'vue'
|
||||
import { useAutoresizeTextarea } from '@/includes/composables'
|
||||
import axios from 'axios'
|
||||
import { useForm } from '@inertiajs/inertia-vue3'
|
||||
import { Inertia } from '@inertiajs/inertia'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Dialog,
|
||||
DialogOverlay,
|
||||
DialogTitle,
|
||||
TransitionChild,
|
||||
TransitionRoot,
|
||||
ChatIcon,
|
||||
},
|
||||
|
||||
setup(props, {expose}) {
|
||||
|
||||
const form = useForm({
|
||||
message: null,
|
||||
chat_room: null,
|
||||
user_id: null,
|
||||
})
|
||||
|
||||
const textarea = ref()
|
||||
const user = ref()
|
||||
const open = ref(false)
|
||||
const chatCheck = ref(false)
|
||||
const showDialogLink = ref(false)
|
||||
|
||||
const openAction = (extUser) => {
|
||||
open.value = true
|
||||
user.value = extUser
|
||||
form.user_id = extUser.id
|
||||
if(!chatCheck.value){
|
||||
exsistChatRequest(user.value)
|
||||
}
|
||||
}
|
||||
const closeAction = () => {
|
||||
open.value = false
|
||||
}
|
||||
|
||||
const exsistChatRequest = (user) => {
|
||||
chatCheck.value = true
|
||||
axios.post('/messenger-check-room', {
|
||||
params: {
|
||||
user: user.id,
|
||||
}
|
||||
}).then(response => {
|
||||
if(response.data > 0){
|
||||
showDialogLink.value = 1
|
||||
form.chat_room = response.data
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const submit = () => {
|
||||
if(!form.message){
|
||||
alert('Введите сообщение')
|
||||
return
|
||||
}
|
||||
if(form.chat_room){
|
||||
createMessage()
|
||||
}else{
|
||||
createRoom()
|
||||
}
|
||||
}
|
||||
|
||||
const createMessage = () => {
|
||||
form.post(route('messenger.store.profile'), {
|
||||
onSuccess: () => {
|
||||
closeAction()
|
||||
form.message = ''
|
||||
linkTo()
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
const createRoom = () => {
|
||||
form.post(route('messenger.create.room'), {
|
||||
onSuccess: () => {
|
||||
closeAction()
|
||||
showDialogLink.value = 1
|
||||
form.message = ''
|
||||
linkTo()
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const linkTo = () => {
|
||||
Inertia.visit(`/messenger?user=${user.value.username}`, { method: 'get' })
|
||||
}
|
||||
|
||||
useAutoresizeTextarea(textarea)
|
||||
|
||||
expose({
|
||||
openAction
|
||||
})
|
||||
|
||||
return {
|
||||
form,
|
||||
textarea,
|
||||
open,
|
||||
closeAction,
|
||||
user,
|
||||
showDialogLink,
|
||||
submit,
|
||||
linkTo,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user