Improve chat replies, hubs API & UI
Backend: enrich message reply data (include created_at and media_files) and ensure chat owners are treated as members; tighten/extend permission checks and message query filters; fix hub routers so moderators/tags routes are resolved before hub detail; accept hub id from request.data in hub permission/tag views; add PostHub serializer and expose hub_detail on posts. Frontend: update generated API models (postHub, replyTo, members_detail, hub_detail); add hub-related pages/routes and components (HubCard, HubHeader, Tags) and a hub posts feed hook; rework message UI and composer to show richer reply previews (media thumbnails, timestamps), adjust video preload to metadata; add tag selection UI to PostComposer and wire hub tags fetching. Also: minor UI/UX improvements and generated model exports updated to match backend changes.
This commit is contained in:
@@ -43,11 +43,12 @@ class MessageHistorySerializer(serializers.ModelSerializer):
|
||||
|
||||
class ReplyToSerializer(serializers.ModelSerializer):
|
||||
sender = MessageSenderSerializer(read_only=True)
|
||||
media_files = MessageFileSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Message
|
||||
fields = ['id', 'content', 'sender']
|
||||
read_only_fields = ['id', 'content', 'sender']
|
||||
fields = ['id', 'content', 'sender', 'created_at', 'media_files']
|
||||
read_only_fields = ['id', 'content', 'sender', 'created_at', 'media_files']
|
||||
|
||||
|
||||
class MessageSerializer(serializers.ModelSerializer):
|
||||
@@ -69,23 +70,34 @@ class MessageSerializer(serializers.ModelSerializer):
|
||||
if not reply_to_id:
|
||||
return None
|
||||
try:
|
||||
msg = Message.all_objects.select_related('sender').get(pk=reply_to_id)
|
||||
msg = Message.all_objects.select_related('sender').prefetch_related('media_files').get(pk=reply_to_id)
|
||||
except Message.DoesNotExist:
|
||||
return None
|
||||
|
||||
from django.conf import settings
|
||||
sender_data = None
|
||||
if msg.sender:
|
||||
from django.conf import settings
|
||||
avatar = (settings.MEDIA_URL + msg.sender.avatar.name) if msg.sender.avatar else None
|
||||
sender_data = {'id': msg.sender.id, 'username': msg.sender.username, 'avatar': avatar}
|
||||
else:
|
||||
sender_data = {'id': 0, 'username': '…', 'avatar': None}
|
||||
|
||||
media_files_data = []
|
||||
if not msg.is_deleted:
|
||||
for f in msg.media_files.all():
|
||||
media_files_data.append({
|
||||
'id': f.id,
|
||||
'file': settings.MEDIA_URL + f.file.name if f.file else '',
|
||||
'media_type': f.media_type,
|
||||
'uploaded_at': f.uploaded_at.isoformat(),
|
||||
})
|
||||
|
||||
return {
|
||||
'id': msg.id,
|
||||
# content=None signals the frontend to show the deleted tombstone
|
||||
'content': None if msg.is_deleted else msg.content,
|
||||
'sender': sender_data,
|
||||
'created_at': msg.created_at.isoformat(),
|
||||
'media_files': media_files_data,
|
||||
}
|
||||
|
||||
class Meta:
|
||||
|
||||
Reference in New Issue
Block a user