emile 9 months ago
parent f300b70523
commit 5973a3d335

BIN
.DS_Store vendored

Binary file not shown.

BIN
osinaweb/.DS_Store vendored

Binary file not shown.

Binary file not shown.

@ -20,13 +20,22 @@
width: 0px !important;
}
#conversation::-webkit-scrollbar {
width: 3px !important;
}
#conversation::-webkit-scrollbar-thumb {
background: #c0c2c58b !important;
}
@media screen and (max-width: 798px) {
#closeChatContainer {
display: none !important;
}
}
.rtl {
direction: rtl;
}

@ -2,6 +2,7 @@ from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Visitor)
admin.site.register(VisitorLog)
admin.site.register(ChatRoom)
admin.site.register(ChatRoomGuest)
admin.site.register(ChatMember)

@ -7,6 +7,13 @@ class ChatRoomGuestSerializer(serializers.ModelSerializer):
model = ChatRoomGuest
fields = '__all__'
class ChatMessageAttachement(serializers.ModelSerializer):
class Meta:
model = ChatMessageAttachment
fields = '__all__'
class ChatRoomSerializer(serializers.ModelSerializer):
chatroomguest = ChatRoomGuestSerializer()
class Meta:

@ -19,20 +19,28 @@ class OsitcomVisitor(WebsocketConsumer):
def disconnect(self, close_code):
if self.visitor:
self.visitor.left_date = datetime.now()
self.visitor.save()
self.current_log.left_date = datetime.now()
self.current_log.save()
async_to_sync(self.channel_layer.group_discard)(
'ositcom_visitors', self.channel_name
)
def receive(self, text_data):
text_data_json = json.loads(text_data)
event_type = text_data_json.get('event_type')
if event_type == 'new_visitor':
if event_type == 'visitor_ping':
session_id = text_data_json.get('session_id')
if Visitor.objects.filter(session_id=session_id).last():
self.visitor = Visitor.objects.filter(session_id=session_id).last()
else:
self.visitor = Visitor.objects.create(
session_id = text_data_json.get('session_id'),
session_id = session_id,
ip_address = text_data_json.get('client_ip'),
country = text_data_json.get('country'),
)
self.current_log = VisitorLog.objects.create(
visitor = self.visitor,
referrer = text_data_json.get('referrer'),
country = text_data_json.get('client_country'),
url = text_data_json.get('url'),
visit_date = datetime.now()
)
@ -41,6 +49,7 @@ class OsitcomVisitor(WebsocketConsumer):
class OsitcomChatRoom(WebsocketConsumer):
def connect(self):
self.session_id = self.scope['url_route']['kwargs']['session_id']
@ -48,14 +57,14 @@ class OsitcomChatRoom(WebsocketConsumer):
self.session_id, self.channel_name
)
self.accept()
chat_room_guest = ChatRoomGuest.objects.filter(session_id=self.session_id).last()
self.visitor = Visitor.objects.filter(session_id=self.session_id).last()
chat_room_guest = ChatRoomGuest.objects.filter(visitor=self.visitor).last()
if chat_room_guest:
chat_room = chat_room_guest.room
self.chat_room = chat_room
else:
self.chat_room = None
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.session_id, self.channel_name
@ -79,11 +88,15 @@ class OsitcomChatRoom(WebsocketConsumer):
name=f"Support: {self.session_id}",
date_created = datetime.now()
)
if text_data_json.get('guest_name'):
self.visitor.name = text_data_json.get('guest_name')
self.visitor.save()
if text_data_json.get('guest_mobile_number'):
self.visitor.mobile_number = text_data_json.get('guest_mobile_number')
self.visitor.save()
chat_room_guest = ChatRoomGuest.objects.create(
room=chat_room,
name= text_data_json.get('guest_name'),
mobile_number= text_data_json.get('guest_mobile_number'),
session_id=self.session_id
visitor=self.visitor
)
self.chat_room = chat_room
event = {
@ -193,7 +206,7 @@ class OsitcomChatRoom(WebsocketConsumer):
else:
number_of_unread = ChatMessage.objects.filter(room=self.chat_room, member__isnull=False).exclude(chatmessageseen__guest=guest).count()
latest_unread_message = ChatMessage.objects.filter(room=self.chat_room).exclude(chatmessageseen__guest=guest).last()
latest_unread_message = ChatMessage.objects.filter(room=self.chat_room, member__isnull=False).exclude(chatmessageseen__guest=guest).last()
event = {
'type': 'update_read_messages_handler',
@ -220,21 +233,39 @@ class OsitcomChatRoom(WebsocketConsumer):
if self.chat_room:
chat_room = self.chat_room
chat_room_messages = ChatMessage.objects.filter(room=chat_room).order_by('date_sent')
else:
chat_room = None
chat_room_messages = None
context = {
'chat_room': chat_room,
'chat_room_messages': chat_room_messages,
}
if self.client_type == 'mobile_admin':
chat_room_data = model_to_dict(chat_room)
chat_room_messages_data = [model_to_dict(message) for message in chat_room_messages]
chat_room_messages_data = []
for message in chat_room_messages:
message_data = model_to_dict(message)
attachment = getattr(message, 'chatmessageattachment', None)
if attachment:
message_data['attachment'] = {
'attachment': attachment.attachment,
'is_image': attachment.is_image(),
'file_name': attachment.file_name,
}
else:
message_data['attachment'] = None
chat_room_messages_data.append(message_data)
self.send(text_data=json.dumps({
'event_type': 'load_chat',
'chat_room_data': chat_room_data,
'chat_room_messages_data': chat_room_messages_data
},cls=DjangoJSONEncoder))
'chat_room_messages_data': chat_room_messages_data,
}, cls=DjangoJSONEncoder))
elif self.client_type == 'website_admin':
html = render_to_string("chat_templates/chat-widget.html", context=context)
@ -328,10 +359,20 @@ class OsitcomChatRoom(WebsocketConsumer):
'message_attachment': message_attachment,
'file_type': event['file_type']
}
if self.client_type == 'mobile_admin':
message_attachment_data = model_to_dict(message_attachment)
self.send(text_data=json.dumps({
'event_type': 'uploaded_file',
'message_attachment_data': message_attachment_data,
'user': message_attachment.message.member.id if message_attachment.message.member else None,
'file_type': event['file_type']
},cls=DjangoJSONEncoder))
else:
html = render_to_string("partials/message-attachment.html", context=context)
self.send(text_data=json.dumps({
'event_type': 'uploaded_file',
'file_name': event['file_name'],
'user': message_attachment.message.member.id if message_attachment.message.member else None,
'html': html,
}))
@ -351,19 +392,6 @@ class OsitcomChatRoom(WebsocketConsumer):
else:
latest_unread_message = None
def uploaded_file_handler(self, event):
message_attachment = get_object_or_404(ChatMessageAttachment, id=event['message_attachment_id'])
context = {
'message_attachment': message_attachment,
'file_type': event['file_type']
}
html = render_to_string("partials/message-attachment.html", context=context)
self.send(text_data=json.dumps({
'event_type': 'uploaded_file',
'file_name': event['file_name'],
'html': html,
}))
def end_chat_handler(self, event):
if event['user_id']:
member = get_object_or_404(User, id=event['user_id'])

@ -0,0 +1,72 @@
# Generated by Django 4.2.5 on 2024-08-02 19:36
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osichat', '0017_chatroom_date_terminated_chatroom_terminated_by'),
]
operations = [
migrations.CreateModel(
name='VisitorLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.URLField()),
('referrer', models.URLField(blank=True, null=True)),
('visit_date', models.DateTimeField(null=True)),
('left_date', models.DateTimeField(null=True)),
],
),
migrations.RemoveField(
model_name='chatroomguest',
name='mobile_number',
),
migrations.RemoveField(
model_name='chatroomguest',
name='name',
),
migrations.RemoveField(
model_name='chatroomguest',
name='session_id',
),
migrations.RemoveField(
model_name='visitor',
name='left_date',
),
migrations.RemoveField(
model_name='visitor',
name='referrer',
),
migrations.RemoveField(
model_name='visitor',
name='url',
),
migrations.RemoveField(
model_name='visitor',
name='visit_date',
),
migrations.AddField(
model_name='chatroomguest',
name='visitor',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.visitor'),
),
migrations.AddField(
model_name='visitor',
name='email',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AddField(
model_name='visitor',
name='mobile_number',
field=models.CharField(blank=True, max_length=10, null=True),
),
migrations.AddField(
model_name='visitor',
name='name',
field=models.CharField(blank=True, max_length=200, null=True),
),
]

@ -0,0 +1,19 @@
# Generated by Django 4.2.5 on 2024-08-02 20:01
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osichat', '0018_visitorlog_remove_chatroomguest_mobile_number_and_more'),
]
operations = [
migrations.AddField(
model_name='visitorlog',
name='visitor',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.visitor'),
),
]

@ -8,11 +8,19 @@ class Visitor(models.Model):
session_id = models.CharField(max_length=300)
ip_address = models.CharField(max_length=300)
country = models.CharField(max_length=15, null=True)
name = models.CharField(max_length=200, blank=True, null=True)
mobile_number = models.CharField(max_length=10, null=True, blank=True)
email = models.CharField(max_length=100, null=True, blank=True)
class VisitorLog(models.Model):
visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE, null=True)
url = models.URLField()
referrer = models.URLField(null=True, blank=True)
visit_date = models.DateTimeField(null=True)
left_date = models.DateTimeField(null=True)
class ChatRoom(models.Model):
name = models.CharField(max_length=300)
created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True)
@ -36,11 +44,7 @@ class ChatRoom(models.Model):
class ChatRoomGuest(models.Model):
room = models.OneToOneField(ChatRoom, on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=300)
mobile_number = models.CharField(max_length=100)
session_id = models.CharField(max_length=300)
visitor = models.ForeignKey(Visitor, null=True, on_delete=models.CASCADE)
class ChatMember(models.Model):
member = models.ForeignKey(User, on_delete=models.CASCADE)

@ -1,5 +1,6 @@
{%load static%}
<p id="chatRoomId" class="hidden">{{chat_room.id}}</p>
<div class="w-full h-full md:h-[450px] lg:h-[550px] bg-white rounded-b-none md:rounded-b-md flex flex-col justify-end">
@ -32,14 +33,13 @@
</div>
<div
class="max-w-[80%] bg-gray-50 px-4 py-3 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-7 bg-opacity-50 shadow-md border border-gray-100">
<p>{% if chat_room.chatroomguest.name %}Hello {{chat_room.chatroomguest.name}},{% else %}Hello,{% endif %} thank you for contacting us. Please bear with us while we
<p>{% if chat_room.chatroomguest.visitor.name %}Hello {{chat_room.chatroomguest.visitor.name}},{% else %}Hello,{% endif %} thank you for contacting us. Please bear with us while we
connect you with the next available agent as soon as possible.</p>
</div>
</div>
<!-- USER MESSAGES -->
<div id="messages" class="w-full flex flex-col gap-5 pb-1">
{% for message in chat_room_messages %}
<!-- STAFF MESSAGE -->
{% if message.member %}
@ -64,7 +64,7 @@
{% if message.chatmessageattachment.is_image %}
<div
class="max-w-[80%] bg-gray-50 p-4 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-6 bg-opacity-50 shadow-md border border-gray-100">
<img src="http://192.168.1.106:8000/{{message.chatmessageattachment.attachment}}" class="rounded-md">
<img src="http://192.168.1.111:8000/{{message.chatmessageattachment.attachment}}" class="rounded-md">
</div>
{% else %}
<div
@ -130,14 +130,12 @@
<div id="typing" class="hidden"></div>
</div>
<form class="px-5 p-3 bg-transparent relative" id="sendMessage">
<form class="px-5 pt-3 bg-transparent relative" id="sendMessage">
{% csrf_token %}
<div class="w-full bg-white h-fit rounded-md border border-gray-200 flex items-center justify-between">
<textarea name="message" id="dynamicTextarea"
placeholder="Write your message..."
class="w-full outline-none p-3 resize-none h-[50px] max-h-[200px] duration-500"></textarea>
class="w-full outline-none p-3 resize-none h-[50px] max-h-[200px] duration-500 border-none rounded-md"></textarea>
<div class="h-full right-0 top-0 px-3 flex items-center gap-2 text-osiblue">
@ -159,12 +157,13 @@
</button>
</div>
</div>
</form>
<div class="w-full rounded-b-md px-3 pt-3 flex justify-center items-center gap-1 bg-white">
<!-- FOOTER -->
<div class="w-full rounded-b-md px-3 py-3 flex justify-center items-center gap-1 bg-white">
<img src="http://192.168.1.111:8000/static/images/ositcom_logos/ositcom(o).png" class="w-[20px]">
<p class="text-xs text-secondosiblue">Osichat 2.0 by <a href="https://ositcom.com/" target="_blank"
class="hover:text-gray-400 duration-500">Ositcom</a></p>
</div>
</form>
</div>

@ -3,11 +3,19 @@
<div class="w-full h-full md:h-fit md:w-[400px] flex flex-col fixed z-50 right-0 md:right-5 bottom-0 md:bottom-24 shadow-md duration-500 hidden"
id="chatWidget">
<div class="w-full h-full inset-0 absolute flex justify-center items-center p-2 bg-black z-20 bg-opacity-50 rounded-none md:rounded-md hidden" id="osichatLoader">
<!-- LOADER -->
<div class="w-full h-full inset-0 absolute flex justify-center items-center p-2 bg-black z-20 bg-opacity-50 rounded-none md:rounded-md hidden"
id="osichatLoader">
<div role="status">
<svg aria-hidden="true" class="w-14 h-14 text-gray-200 animate-spin fill-secondosiblue" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"/>
<path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"/>
<svg aria-hidden="true" class="w-14 h-14 text-gray-200 animate-spin fill-secondosiblue"
viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
fill="currentColor" />
<path
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
fill="currentFill" />
</svg>
</div>
</div>
@ -30,11 +38,13 @@
<div id="endChat" class="{% if not chat_room or chat_room.date_terminated %} hidden {% endif %}">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
class="text-white w-7 notFilledSvg cursor-pointer hover:scale-105 duration-500" fill="none">
class="text-white w-7 notFilledSvg cursor-pointer hover:scale-105 duration-500 hover:scale-105 duration-500"
fill="none">
<path
d="M11 3L10.3374 3.23384C7.75867 4.144 6.46928 4.59908 5.73464 5.63742C5 6.67576 5 8.0431 5 10.7778V13.2222C5 15.9569 5 17.3242 5.73464 18.3626C6.46928 19.4009 7.75867 19.856 10.3374 20.7662L11 21"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M21 12L11 12M21 12C21 11.2998 19.0057 9.99153 18.5 9.5M21 12C21 12.7002 19.0057 14.0085 18.5 14.5"
<path
d="M21 12L11 12M21 12C21 11.2998 19.0057 9.99153 18.5 9.5M21 12C21 12.7002 19.0057 14.0085 18.5 14.5"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
@ -42,20 +52,35 @@
<!-- CLOSE CHAT CONFIRMATION MESSAGE -->
<div class="w-full h-full absolute inset-0 rounded-none md:rounded-md bg-black bg-opacity-50 flex justify-center items-center p-5 z-20 hidden" id="endChatConfirmationContainer">
<div class="w-full h-fit p-5 bg-white rounded-md shadow-md flex flex-col justify-center items-center gap-3 relative">
<div class="w-full h-full absolute inset-0 rounded-none md:rounded-md bg-black bg-opacity-50 flex justify-center items-center p-5 z-20 hidden"
id="endChatConfirmationContainer">
<div
class="w-full h-fit p-5 bg-white rounded-md shadow-md flex flex-col justify-center items-center gap-3 relative">
<div id="closeConfirmationMessage">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-5 text-secondosiblue absolute top-3 right-3 hover:text-fifthosiblue duration-300 cursor-pointer">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor"
class="w-5 text-secondosiblue absolute top-3 right-3 hover:text-fifthosiblue duration-300 cursor-pointer">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg>
</div>
<p class="text-center text-secondosiblue mt-5">Are you sure you want to end this chat?</p>
<p class="text-center text-secondosiblue">Are you sure you want to end this chat?</p>
<div class="px-5 py-2 flex items-center gap-2 bg-gray-100 rounded-md shadow-md flex justify-center items-center text-secondosiblue text-sm cursor-pointer hover:scale-105 duration-500" id="endChatComfirmed">
End
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="w-5 notFilledSvg"
fill="none">
<path
d="M11 3L10.3374 3.23384C7.75867 4.144 6.46928 4.59908 5.73464 5.63742C5 6.67576 5 8.0431 5 10.7778V13.2222C5 15.9569 5 17.3242 5.73464 18.3626C6.46928 19.4009 7.75867 19.856 10.3374 20.7662L11 21"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path
d="M21 12L11 12M21 12C21 11.2998 19.0057 9.99153 18.5 9.5M21 12C21 12.7002 19.0057 14.0085 18.5 14.5"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</svg>
<button id="endChatComfirmed" class="rounded-md bg-red-500 border border-red-500 uppercase text-white px-5 py-2 shadow-md text-sm cursor-pointer hover:bg-white hover:text-red-500 duration-300">
End chat
</button>
</div>
</div>
</div>
<!-- END CLOSE CHAT CONFIRMATION MESSAGE -->

@ -1,6 +1,4 @@
{%load static%}
<p id="chatRoomId" class="hidden">{{chat_room.id}}</p>
<div class="w-full h-full md:h-[450px] lg:h-[550px] bg-white rounded-b-none md:rounded-b-md flex flex-col justify-end">
<div class="overflow-y-auto flex flex-col gap-5 px-5 pt-3" id="conversation">
@ -32,14 +30,12 @@
</div>
<div
class="max-w-[80%] bg-gray-50 px-4 py-3 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-7 bg-opacity-50 shadow-md border border-gray-100">
<p>{% if chat_room.chatroomguest.name %}Hello {{chat_room.chatroomguest.name}},{% else %}Hello,{% endif %} thank you for contacting us. Please bear with us while we
<p>{% if chat_room.chatroomguest.visitor.name %}Hello {{chat_room.chatroomguest.visitor.name}},{% else %}Hello,{% endif %} thank you for contacting us. Please bear with us while we
connect you with the next available agent as soon as possible.</p>
</div>
</div>
<!-- USER MESSAGES -->
<div id="messages" class="w-full flex flex-col gap-5 pb-1">
{% for message in chat_room_messages %}
<!-- STAFF MESSAGE -->
{% if message.member %}
@ -64,17 +60,25 @@
{% if message.chatmessageattachment.is_image %}
<div
class="max-w-[80%] bg-gray-50 p-4 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-6 bg-opacity-50 shadow-md border border-gray-100">
<img src="http://192.168.1.106:8000/{{message.chatmessageattachment.attachment}}" class="rounded-md">
<img src="http://192.168.1.111:8000/{{message.chatmessageattachment.attachment}}"
class="rounded-md">
</div>
{% else %}
<div
class="max-w-[80%] bg-gray-50 p-4 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-6 bg-opacity-50 shadow-md border border-gray-100">
<div class="w-full flex items-center gap-1">
<div>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="w-5 text-secondosiblue notFilledSvg">
<path d="M8 7L16 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M8 11L12 11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
class="w-5 text-secondosiblue notFilledSvg">
<path d="M8 7L16 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round"></path>
<path d="M8 11L12 11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round"></path>
<path
d="M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round">
</path>
</svg>
</div>
<div class="flex flex-col">
@ -98,19 +102,29 @@
{% else %}
{% if message.chatmessageattachment.is_image %}
<div class="w-full flex justify-end">
<div class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<img src="http://192.168.1.111:8000/{{message.chatmessageattachment.attachment}}" class="rounded-md">
<div
class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<img src="http://192.168.1.111:8000/{{message.chatmessageattachment.attachment}}"
class="rounded-md">
</div>
</div>
{% else %}
<div class="w-full flex justify-end">
<div class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<div
class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<div class="w-full flex items-center gap-1">
<div>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="w-5 text-white notFilledSvg">
<path d="M8 7L16 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M8 11L12 11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
class="w-5 text-white notFilledSvg">
<path d="M8 7L16 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round"></path>
<path d="M8 11L12 11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round"></path>
<path
d="M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round">
</path>
</svg>
</div>
<div class="flex flex-col">
@ -123,12 +137,267 @@
{% endif %}
{% endif %}
{% endfor %}
<!-- REVIEW CONTAINER SENT BY THE BOTT -->
<div class="w-full flex items-end gap-2">
<div>
<div
class="w-[25px] h-[25px] rounded-full shadow-md text-white flex justify-center items-center bg-osiblue">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="w-4" color="#000000"
fill="none">
<path d="M4 15.5C2.89543 15.5 2 14.6046 2 13.5C2 12.3954 2.89543 11.5 4 11.5" stroke="white"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
<path d="M20 15.5C21.1046 15.5 22 14.6046 22 13.5C22 12.3954 21.1046 11.5 20 11.5"
stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
<path d="M7 7L7 4" stroke="white" stroke-width="1.5" stroke-linejoin="round" />
<path d="M17 7L17 4" stroke="white" stroke-width="1.5" stroke-linejoin="round" />
<circle cx="7" cy="3" r="1" stroke="white" stroke-width="1.5" stroke-linejoin="round" />
<circle cx="17" cy="3" r="1" stroke="white" stroke-width="1.5" stroke-linejoin="round" />
<path
d="M13.5 7H10.5C7.67157 7 6.25736 7 5.37868 7.90898C4.5 8.81796 4.5 10.2809 4.5 13.2069C4.5 16.1329 4.5 17.5958 5.37868 18.5048C6.25736 19.4138 7.67157 19.4138 10.5 19.4138H11.5253C12.3169 19.4138 12.5962 19.5773 13.1417 20.1713C13.745 20.8283 14.6791 21.705 15.5242 21.9091C16.7254 22.1994 16.8599 21.7979 16.5919 20.6531C16.5156 20.327 16.3252 19.8056 16.526 19.5018C16.6385 19.3316 16.8259 19.2898 17.2008 19.2061C17.7922 19.074 18.2798 18.8581 18.6213 18.5048C19.5 17.5958 19.5 16.1329 19.5 13.2069C19.5 10.2809 19.5 8.81796 18.6213 7.90898C17.7426 7 16.3284 7 13.5 7Z"
stroke="white" stroke-width="1.5" stroke-linejoin="round" />
<path d="M9.5 15C10.0701 15.6072 10.9777 16 12 16C13.0223 16 13.9299 15.6072 14.5 15"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round" />
<path d="M9.00896 11H9" stroke="#20336b" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" />
<path d="M15.009 11H15" stroke="#20336b" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" />
</svg>
</div>
</div>
<audio id="notification-sound" src="http://192.168.1.111:8000/static/notifications/osichat-notification.mp3" preload="auto"></audio>
<div
class="w-[80%] flex flex-col gap-3 bg-gray-50 px-4 py-3 rounded-r-3xl border-t-2 border-secondosiblue rounded-tl-3xl text-secondosiblue text-sm leading-7 bg-opacity-50 shadow-md">
<p class="text-center text-secondosiblue">Rate your conversation</p>
<div class="w-full flex justify-center items-center gap-3">
<button data-reaction="" class="cursor-pointer hover:scale-105 duration-500 w-fit h-fit rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" class="w-9"
xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px"
viewBox="0 0 999 961" style="enable-background:new 0 0 999 961;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #D62B2B;
}
.st1 {
fill: #FFFFFF;
}
.st2 {
fill: #1A212D;
}
.st3 {
fill: #962A2A;
}
.st4 {
fill: #EFC029;
}
.st5 {
fill: #B79430;
}
.st6 {
fill: #8ACC36;
}
.st7 {
fill: #5D891F;
}
</style>
<g id="background">
</g>
<g id="objects">
<g>
<circle class="st6" cx="482" cy="485" r="470.3" />
<g>
<circle class="st1" cx="292.8" cy="418.6" r="124.3" />
<circle class="st2" cx="302" cy="426.7" r="67.9" />
<circle class="st1" cx="349.2" cy="387.6" r="24.2" />
</g>
<g>
<circle class="st1" cx="671.2" cy="418.6" r="124.3" />
<circle class="st2" cx="662" cy="426.7" r="67.9" />
<circle class="st1" cx="705.8" cy="387.6" r="24.2" />
</g>
<path class="st7"
d="M626.5,612c4.1,0,8.3,1.1,12.2,3.3c11.5,6.7,15.3,21.5,8.6,33c-0.6,1.1-16.2,27.4-45.7,53.3 C561.8,736.6,515,755,466.2,755s-95.6-18.5-135.4-53.4c-29.6-26-45.1-52.2-45.7-53.3c-6.7-11.5-2.9-26.3,8.6-33 c11.5-6.7,26.2-2.9,33,8.6c0.2,0.3,13,21.7,37.1,42.5c31,26.8,65.5,40.4,102.4,40.4s71.4-13.6,102.4-40.4 c24.1-20.9,37-42.3,37.1-42.5C610.2,616.2,618.3,612,626.5,612z" />
</g>
</g>
</svg>
</button>
<div id="typing" class="hidden"></div>
<button data-reaction="" class="cursor-pointer hover:scale-105 duration-500 w-fit h-fit rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1" x="0px" y="0px" class="w-9" viewBox="0 0 999 961"
style="enable-background:new 0 0 999 961;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #D62B2B;
}
.st1 {
fill: #FFFFFF;
}
.st2 {
fill: #1A212D;
}
.st3 {
fill: #962A2A;
}
.st4 {
fill: #EFC029;
}
.st5 {
fill: #B79430;
}
.st6 {
fill: #8ACC36;
}
.st7 {
fill: #5D891F;
}
</style>
<g id="background">
</g>
<g id="objects">
<g>
<circle class="st4" cx="499.5" cy="480.5" r="470.3" />
<g>
<circle class="st1" cx="310.3" cy="414.1" r="124.3" />
<circle class="st2" cx="319.5" cy="422.1" r="67.9" />
<circle class="st1" cx="366.7" cy="383" r="24.2" />
</g>
<g>
<circle class="st1" cx="688.7" cy="414.1" r="124.3" />
<circle class="st2" cx="679.5" cy="422.1" r="67.9" />
<circle class="st1" cx="723.2" cy="383" r="24.2" />
</g>
<rect x="309.9" y="646.4" class="st5" width="379.1" height="48.2" />
</g>
</g>
</svg>
</button>
<button data-reaction="" class="cursor-pointer hover:scale-105 duration-500 w-fit h-fit rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1" x="0px" y="0px" class="w-9" viewBox="0 0 999 961"
style="enable-background:new 0 0 999 961;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #D62B2B;
}
.st1 {
fill: #FFFFFF;
}
.st2 {
fill: #1A212D;
}
.st3 {
fill: #962A2A;
}
.st4 {
fill: #EFC029;
}
.st5 {
fill: #B79430;
}
.st6 {
fill: #8ACC36;
}
.st7 {
fill: #5D891F;
}
</style>
<g id="background">
</g>
<g id="objects">
<g>
<circle class="st0" cx="499.5" cy="480.5" r="470.3" />
<g>
<circle class="st1" cx="310.3" cy="414.1" r="124.3" />
<circle class="st2" cx="319.5" cy="422.1" r="67.9" />
<circle class="st1" cx="366.7" cy="383" r="24.2" />
</g>
<g>
<circle class="st1" cx="688.7" cy="414.1" r="124.3" />
<circle class="st2" cx="679.5" cy="422.1" r="67.9" />
<circle class="st1" cx="723.2" cy="383" r="24.2" />
</g>
<path class="st3"
d="M336.7,746.1c-4.1,0-8.3-1.1-12.2-3.3c-11.5-6.7-15.3-21.5-8.6-33c0.6-1.1,16.2-27.4,45.7-53.3 c39.8-34.9,86.6-53.4,135.4-53.4c48.8,0,95.6,18.5,135.4,53.4c29.6,26,45.1,52.2,45.7,53.3c6.7,11.5,2.9,26.3-8.6,33 c-11.5,6.7-26.2,2.9-33-8.6c-0.2-0.3-13-21.7-37.1-42.5c-31-26.8-65.5-40.4-102.4-40.4s-71.4,13.6-102.4,40.4 c-24.1,20.9-37,42.3-37.1,42.5C353.1,741.8,345,746.1,336.7,746.1z" />
</g>
</g>
</svg>
</button>
</div>
<form class="w-full relative" id="sendReview">
{% csrf_token %}
<div
class="w-full bg-white h-fit rounded-md border border-gray-200 flex items-center justify-between">
<input name="message" placeholder="Tell us more..." id="messageInputTag"
class="w-full border-none rounded-md outline-none px-3 py-2 resize-none duration-500">
<div class="h-full right-0 top-0 px-3 flex items-center gap-2 text-osiblue">
<button type="submit" id="submitButton" class="hidden">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="w-5 notFilledSvg">
<path stroke-linecap="round" stroke-linejoin="round"
d="M6 12 3.269 3.125A59.769 59.769 0 0 1 21.485 12 59.768 59.768 0 0 1 3.27 20.875L5.999 12Zm0 0h7.5" />
</svg>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="mt-5">
<!-- NEW CONVERSATION BUTTON -->
<div class="px-5">
<button id="startNewConversation"
class="w-full px-5 py-2 bg-osiblue border border-osiblue rounded-md text-white cursor-pointer hover:bg-white hover:text-osiblue duration-300">
Start New Conversation
</button>
</div>
<!-- FOOTER -->
<div class="w-full rounded-b-md px-3 py-3 flex justify-center items-center gap-1 bg-white">
<img src="http://192.168.1.111:8000/static/images/ositcom_logos/ositcom(o).png" class="w-[20px]">
<p class="text-xs text-secondosiblue">Osichat 2.0 by <a href="https://ositcom.com/" target="_blank"
class="hover:text-gray-400 duration-500">Ositcom</a></p>
</div>
</div>
</div>
{% block form %}
{% endblock form %}

@ -1,5 +1,5 @@
{% if chat_message.member %}
<div class="w-full flex items-end justify-start gap-2 fade-in-up">
<div class="w-full flex items-end justify-start gap-2">
<div>
<div
class="w-[25px] h-[25px] rounded-full shadow-md text-white flex justify-center items-center bg-osiblue uppercase text-xs">
@ -45,7 +45,7 @@
<!-- GUEST MESSAGE -->
{% else %}
{% if not chat_message.chatmessageattachment %}
<div class="w-full flex justify-end fade-in-up">
<div class="w-full flex justify-end">
<div
class="max-w-[80%] px-4 py-3 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<p style="white-space: pre-line; overflow-wrap: anywhere;">{{chat_message.content}}</p>
@ -53,13 +53,13 @@
</div>
{% else %}
{% if chat_message.chatmessageattachment.is_image %}
<div class="w-full flex justify-end fade-in-up">
<div class="w-full flex justify-end">
<div class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<img src="http://192.168.1.111:8000/{{chat_message.chatmessageattachment.attachment}}" class="rounded-md">
</div>
</div>
{% else %}
<div class="w-full flex justify-end fade-in-up">
<div class="w-full flex justify-end">
<div class="max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue">
<div class="w-full flex items-center gap-1">
<div>
@ -78,14 +78,3 @@
{% endif %}
{% endif %}
{% endif %}
<style>
@keyframes fadeInAndUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0px); }
}
.fade-in-up {
animation: fadeInAndUp 0.6s ease;
}
</style>

@ -45,7 +45,7 @@
</div>
{% else %}
<div class="w-fit bg-opacity-70 bg-osiblue px-3 py-2 rounded-md w-full h-[300px]">
<img src="http://192.168.1.111:8000{{latest_unread_message.chatmessageattachment.attachment}}" class="w-full h-full object-cover rounded-md">
<img src="http://192.168.1.111:8000/{{latest_unread_message.chatmessageattachment.attachment}}" class="w-full h-full object-cover rounded-md">
</div>
{% endif %}

@ -107,7 +107,8 @@ def utilities(request):
latest_chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent')).order_by('-last_update', '-date_created')
return {'total_tasks': total_tasks,
return {
'total_tasks': total_tasks,
'latest_statuses' : latest_statuses,
'last_status': last_status,
'notes' : notes,

@ -3,7 +3,7 @@
<p id="sessionid" class="hidden">{{guest_session_id}}</p>
<p id="userId" class="hidden">{{request.user.id}}</p>
<div class="w-full h-full flex flex-col justify-between">
<div class="w-full h-full flex flex-col justify-end">
<!-- HEADER -->
<div class="w-full flex items-center gap-1 py-3 px-3 border-b border-gray-100 text-[17px] text-secondosiblue">
<div class="w-[30px] h-[30px] rounded-full shadow-md text-white flex justify-center items-center bg-osiblue">
@ -17,9 +17,8 @@
<p>{{chat_room.chatroomguest.name}}</p>
</div>
<!-- MESSAGES -->
<div class="w-full h-full overflow-y-auto flex-l flex flex-col justify-end gap-3 p-3 relative" style="overflow-y: auto !important;">
<div class="flex-1 overflow-y-auto p-3 flex flex-col gap-4" id="messages_container">
{% for message in chat_messages %}
{% if message.member == request.user %}
<div class="w-full flex items-end justify-end gap-2">
@ -69,7 +68,6 @@
<!-- END TYPING -->
</div>
<!-- INPUT FORM -->
<form class="px-5 pb-5 bg-transparent relative" id="sendMessage">
{% csrf_token %}

@ -40,7 +40,7 @@
<!-- RIGHT SIDE - CONVERSATION -->
<div class="col-span-2 h-full" id="inner-conversation">
<div class="col-span-2 overflow-hidden" id="inner-conversation">
<!-- the messages are here -->
</div>
</div>

@ -5,13 +5,11 @@
<!-- LEFT SIDE -->
<div class="w-full xxlg1:w-[75%] flex flex-col items-center gap-5">
<!-- RESPONSE MESSGAE FOR SHARING A TICKET -->
<div id="successMessage"
class="fixed mx-auto top-10 opacity-0 w-[85%] s:w-fit px-9 s:px-14 py-3 rounded-md bg-osiblue bg-opacity-80 text-white text-center rounded-t-md shadow-md z-10 pointer-events-none">
</div>
<!-- TICKETS -->
<div class="w-full h-fit bg-white p-3 rounded-md shadow-md {% if not open_tickets %} hidden {% endif %}" id="tickets-div">
<div class="overflow-x-auto border border-gray-300 rounded-md tableContainer" id="openTickets">

Binary file not shown.

@ -1039,6 +1039,10 @@ video {
height: 2rem;
}
.h-\[100\%\] {
height: 100%;
}
.h-\[1000px\] {
height: 1000px;
}
@ -1256,6 +1260,10 @@ video {
width: 2rem;
}
.w-9 {
width: 2.25rem;
}
.w-\[100px\] {
width: 100px;
}
@ -1876,6 +1884,10 @@ video {
border-top-width: 1px;
}
.border-t-2 {
border-top-width: 2px;
}
.border-none {
border-style: none;
}
@ -1944,6 +1956,11 @@ video {
border-right-color: transparent;
}
.border-t-secondosiblue {
--tw-border-opacity: 1;
border-top-color: rgb(55 74 122 / var(--tw-border-opacity));
}
.border-opacity-10 {
--tw-border-opacity: 0.1;
}
@ -2361,6 +2378,11 @@ video {
padding-right: 0.75rem;
}
.ps-3 {
-webkit-padding-start: 0.75rem;
padding-inline-start: 0.75rem;
}
.pt-2 {
padding-top: 0.5rem;
}
@ -2679,6 +2701,16 @@ video {
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.grayscale {
--tw-grayscale: grayscale(100%);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.grayscale-0 {
--tw-grayscale: grayscale(0);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.filter {
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
@ -2721,6 +2753,14 @@ video {
width: 0px !important;
}
#conversation::-webkit-scrollbar {
width: 3px !important;
}
#conversation::-webkit-scrollbar-thumb {
background: #c0c2c58b !important;
}
@media screen and (max-width: 798px) {
#closeChatContainer {
display: none !important;

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

@ -1,15 +0,0 @@
from django.http import HttpResponseForbidden
from functools import wraps
def require_token(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
token = request.META.get('HTTP_AUTHORIZATION')
static_token = 'A3uLHUthhCTba5q62eVG4XSHghB5nmPqk!XZyHsHP' # Replace with your static token.
if token == f'Token {static_token}':
return view_func(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return _wrapped_view

@ -1,15 +0,0 @@
from django.http import HttpResponseForbidden
from functools import wraps
def require_token(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
token = request.META.get('HTTP_AUTHORIZATION')
static_token = 'A3uLHUthhCTba5q62eVG4XSHghB5nmPqk!XZyHsHP' # Replace with your static token.
if token == f'Token {static_token}':
return view_func(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return _wrapped_view

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save