добавил кнопку для прикрепления картинки к сообщению

This commit is contained in:
UNIKNOW 2024-03-03 00:11:17 +04:00
parent f3143c7532
commit 30f4a51707
2 changed files with 217 additions and 192 deletions

View file

@ -1,233 +1,241 @@
<script> <script>
import Header from '../Header.svelte'; import Header from '../Header.svelte';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import Time from "svelte-time"; import Time from 'svelte-time';
import { dayjs } from "svelte-time"; import { dayjs } from 'svelte-time';
import 'dayjs/locale/ru'; import 'dayjs/locale/ru';
import {UserCheck,getLastMessages,MessagePicToUrl} from '$lib/userFunction.js'; import { UserCheck, getLastMessages, MessagePicToUrl } from '$lib/userFunction.js';
import createWebSocket from '$lib/websocket'; import createWebSocket from '$lib/websocket';
dayjs.locale("ru"); dayjs.locale('ru');
console.clear(); console.clear();
let userId let userId; //пользователь, который залогинен
let socket let socket; //вебсокет
let messages = [];
let messageText = '';
let messagePic;
let messages = []; //массив сообщений, которые отображаются на сайте
let messageText = ''; //сообщения для отправки
let messagePic; //картинка для отправки
onMount(async () => {
const userData = await UserCheck();
let userId = userData.id;
let chatId = 2;
const websocketUrl = `ws://localhost:8000/api/chat/ws/${chatId}?user_id=${userId}`;
onMount(async() => { messages = await getLastMessages();
const userData = await UserCheck();
let userId = userData.id;
let chatId = 2
const websocketUrl = `ws://localhost:8000/api/chat/ws/${chatId}?user_id=${userId}`;
messages = await getLastMessages(); socket = createWebSocket(websocketUrl, (message) => {
messages = [message, ...messages];
});
});
socket = createWebSocket(websocketUrl, (message) => { async function uploadImages() {
const fileInput = document.getElementById('file');
const file = fileInput.files[0];
let urlpic;
if (file) {
urlpic = await MessagePicToUrl(file);
} else {
urlpic = null;
}
fileInput.value = null;
return urlpic;
}
messages = [message, ...messages] async function sendMessage() {
}); let messageUrl = await uploadImages();
});
async function uploadImages(){ if (messageText.trim() !== '' || messageUrl != null) {
socket.send(JSON.stringify({ message: messageText, image_url: messageUrl }));
const fileInput = document.getElementById('fileInput'); messageText = '';
const file = fileInput.files[0]; }
let urlpic = await MessagePicToUrl(file) }
return urlpic
}
async function sendMessage() {
let messageUrl = await uploadImages()
console.log("юрл - ", messageUrl)
if (messageUrl === undefined){
messageUrl = null
}
if (messageText.trim() !== '') {
socket.send(JSON.stringify({'message':messageText,"image_url": messageUrl}));
messageText = '';
}}
let textarea;
const updateTextareaSize = () => {
// Устанавливаем высоту textarea на основе количества строк
textarea.style.height = 'auto'; // Сбрасываем высоту на auto перед измерением
textarea.style.height = `${textarea.scrollHeight}px`;
console.log(textarea.style.height)
};
function handleKeyPress(event) {
if (event.key === 'Enter' && !event.shiftKey) {
// Если нажат Enter и не нажат Shift, отправляем сообщение
sendMessage(event);
}
}
let textarea;
const updateTextareaSize = () => {
// Устанавливаем высоту textarea на основе количества строк
textarea.style.height = 'auto'; // Сбрасываем высоту на auto перед измерением
textarea.style.height = `${textarea.scrollHeight}px`;
console.log(textarea.style.height);
};
function handleKeyPress(event) {
if (event.key === 'Enter' && !event.shiftKey) {
// Если нажат Enter и не нажат Shift, отправляем сообщение
sendMessage(event);
}
}
</script> </script>
<body class="backgroundPic"> <body class="backgroundPic">
<div class="DivHeader"><Header /></div>
<div>жопа2</div>
<div class="divChat">
<div class="chatBox">
{#each messages as message}
<div class="MsgAll">
<img class="MsgAva" src={message.avatar_image} alt="ава" />
<div class="divMessage">
<div class="userFiled">
<h3 class="MsgName">{message.username}</h3>
<Time relative timestamp={message.created_at}></Time>
</div>
<div class="DivHeader"><Header/></div> <p class="MsgMsg">{message.message}</p>
<div>жопа2</div>
<div class="divChat">
<div class="chatBox"> {#if message.image_url != null}
<img class="MsgPic" src={message.image_url} alt="" />
{#each messages as message} {/if}
<div class="MsgAll"> </div>
<img class="MsgAva" src="{message.avatar_image}" alt="ава"> </div>
<div class="divMessage"> {/each}
<div class="userFiled"> </div>
<h3 class="MsgName">{message.username}</h3>
<Time relative timestamp="{message.created_at}" ></Time>
</div>
<p class="MsgMsg">{message.message}</p>
{#if message.image_url != null}
<img class="MsgPic" src="{message.image_url}" alt="">
{/if}
</div>
</div>
{/each}
<form class="chatSend" on:submit={sendMessage}>
<textarea
placeholder="Введите сообщение"
maxlength="2000"
class="chatInput"
rows="1"
bind:this={textarea}
on:input={updateTextareaSize}
type="text"
bind:value={messageText}
on:keypress={handleKeyPress}
></textarea>
<div class="fileInputDiv">
<input name="file" id="file" type="file" accept="image/*" bind:value={messagePic} />
<label class="attachingImages" for="file"><img src="./attachment.svg" alt=""></label>
</div> </div>
</form>
<form class="chatSend" on:submit={sendMessage}> </div>
<textarea <div>жопа4</div>
placeholder="Введите сообщение" maxlength="2000" class="chatInput" <div>жопа5</div>
rows="1" bind:this={textarea} on:input={updateTextareaSize} <div>жопа6</div>
type="text" bind:value={messageText} on:keypress={handleKeyPress} <div>жопа7</div>
></textarea>
<input id="fileInput" type="file" accept="image/*" bind:value={messagePic}>
</form>
</div>
<div>жопа4</div>
<div>жопа5</div>
<div>жопа6</div>
<div>жопа7</div>
</body> </body>
<style> <style>
.userFiled{ .attachingImages{
display: flex;
justify-content:flex-start;
}
.MsgName{
display: flex; display: flex;
width: 10vw;
height: 10vw;
background-color: rgba(255, 255, 255, 0.1);
} }
.MsgPic{ #file{
margin-left: 1vw; display: none;
margin-bottom: 1vh;
width: 80%;
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 15px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.9);
} }
.MsgAva{ .userFiled {
height: 6vh; display: flex;
min-height: 50px; justify-content: flex-start;
width: auto; }
border: 2px solid rgba(255, 255, 255, 0.6); .MsgName {
border-radius: 10px; display: flex;
margin: 0.25vw; }
}
.MsgAll{ .MsgPic {
display: flex; margin-left: 1vw;
flex: 90; margin-bottom: 1vh;
} width: 80%;
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 15px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.9);
}
.divMessage{ .MsgAva {
background-color:rgba(255, 255, 255, 0.3); height: 6vh;
border: 1px solid rgba(255, 255, 255, 0.5); min-height: 50px;
border-radius: 15px; width: auto;
box-shadow: 0 0px 30px rgba(0, 0, 0,0.2); border: 2px solid rgba(255, 255, 255, 0.6);
border-radius: 10px;
margin: 0.25vw;
}
margin: 3px; .MsgAll {
transform:translate(90deg); display: flex;
flex: 90;
}
} .divMessage {
background-color: rgba(255, 255, 255, 0.3);
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 15px;
box-shadow: 0 0px 30px rgba(0, 0, 0, 0.2);
margin: 3px;
transform: translate(90deg);
}
.chatBox {
display: flex;
flex: 30;
flex-direction: column-reverse;
align-items: flex-start;
.chatBox{ overflow-y: auto;
width: 100%;
display: flex; /* From https://css.glass */
flex: 30; background-color: rgba(255, 255, 255, 0.2);
flex-direction:column-reverse; border-radius: 15px;
align-items:flex-start; box-shadow: 0 4px 30px rgb(0, 0, 0, 0.5);
backdrop-filter: blur(7px);
border: 1px solid rgba(255, 255, 255, 0.43);
}
overflow-y: auto; .DivHeader {
width: 100%; grid-column: 3 span;
border: 0 !important;
margin: 0;
padding: 0;
}
.chatSend {
display: flex;
flex: 2;
width: 100%;
justify-content: space-between;
}
/* From https://css.glass */ .chatInput {
background-color: rgba(255, 255, 255, 0.20); width: 100%;
border-radius: 15px; resize: none;
box-shadow: 0 4px 30px rgb(0,0,0,0.5); box-sizing: border-box;
backdrop-filter: blur(7px); }
border: 1px solid rgba(255,255,255,0.43)
}
.DivHeader{ .divChat {
grid-column: 3 span; flex-direction: column;
border: 0!important; display: flex;
margin: 0; }
padding: 0;
}
.chatSend{ body {
display: flex; display: grid;
flex: 2; grid-template-columns: 25vw 50vw 25vw; /* 2 колонки с равным распределением ширины */
width: 100%; grid-template-rows: 10vh 80vh 10vh;
justify-content: space-between; }
}
.chatInput{ body > * {
width: 100%; border: 1px solid black;
resize: none; }
box-sizing: border-box;
}
.divChat{ * {
flex-direction: column; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
display: flex; }
}
body{ .backgroundPic {
display: grid; grid-column: span 3;
grid-template-columns: 25vw 50vw 25vw; /* 2 колонки с равным распределением ширины */ grid-row: span 3;
grid-template-rows: 10vh 80vh 10vh;
}
body > *{
border: 1px solid black;
}
*{
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.backgroundPic{
grid-column: span 3;
grid-row: span 3;
background-color: #563E89;
background-image: url(./BPytka.png);
background-repeat: no-repeat;
background-size:50vh;
background-position-x:50%;
background-position-y:50%;
}
background-color: #563e89;
background-image: url(./BPytka.png);
background-repeat: no-repeat;
background-size: 50vh;
background-position-x: 50%;
background-position-y: 50%;
}
</style> </style>

17
static/attachment.svg Normal file
View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<title>attachment-2</title>
<desc>Created with Sketch Beta.</desc>
<defs>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Icon-Set" sketch:type="MSLayerGroup" transform="translate(-258.000000, -154.000000)" fill="#000000">
<path d="M284.562,164.181 L270.325,178.26 C267.966,180.593 264.141,180.593 261.782,178.26 C259.423,175.928 259.423,172.146 261.782,169.813 L274.596,157.141 C276.168,155.586 278.718,155.586 280.291,157.141 C281.863,158.696 281.863,161.218 280.291,162.772 L267.477,175.444 C266.691,176.222 265.416,176.222 264.629,175.444 C263.843,174.667 263.843,173.406 264.629,172.628 L276.02,161.365 L274.596,159.957 L263.206,171.221 C261.633,172.775 261.633,175.297 263.206,176.853 C264.778,178.407 267.328,178.407 268.901,176.852 L281.714,164.181 C284.073,161.849 284.074,158.065 281.715,155.733 C279.355,153.4 275.531,153.4 273.172,155.733 L259.646,169.108 L259.696,169.157 C257.238,172.281 257.455,176.797 260.358,179.668 C263.262,182.539 267.828,182.754 270.987,180.323 L271.036,180.372 L285.986,165.589 L284.562,164.181" id="attachment-2" sketch:type="MSShapeGroup">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB