Add chat settings modal & reply previews

Introduce a full ChatSettingsModal component for managing group chats (rename/icon upload, add/remove members, toggle moderators, leave/delete) and wire it into ChatRoomPage with a settings button. Add reply preview support end-to-end: new ReplyToSerializer and members_detail in backend serializers, updated frontend Message model (reply_to now contains preview object), and UI changes to Message to render reply excerpts. Improve socket handling to attach reply previews when available. Tweak backend Dockerfile to optionally install Windows/corporate CA bundle only if present and move pip install after copying source. Add Czech translations and small tooling/.claude config enhancements.
This commit is contained in:
2026-05-29 00:41:43 +02:00
parent 8269d044a2
commit 3d1965e5e6
8 changed files with 574 additions and 14 deletions

View File

@@ -2,10 +2,6 @@ FROM python:3.12-slim
WORKDIR /app
# Trust Windows/corporate root CAs before any network operations
COPY certs/windows-ca-bundle.crt /usr/local/share/ca-certificates/windows-ca-bundle.crt
RUN update-ca-certificates
# Install system dependencies including Node.js for yt-dlp JavaScript runtime
RUN apt-get update && apt-get install -y --no-install-recommends \
weasyprint \
@@ -18,13 +14,18 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
libmagic1 \
&& curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& update-ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Trust Windows/corporate root CAs if present (optional, no-op when certs/ is absent)
RUN test -f certs/windows-ca-bundle.crt \
&& install -m 644 certs/windows-ca-bundle.crt /usr/local/share/ca-certificates/windows-ca-bundle.crt \
&& update-ca-certificates \
|| true
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 8000

View File

@@ -40,8 +40,18 @@ class MessageHistorySerializer(serializers.ModelSerializer):
read_only_fields = ['archived_at']
class ReplyToSerializer(serializers.ModelSerializer):
sender = MessageSenderSerializer(read_only=True)
class Meta:
model = Message
fields = ['id', 'content', 'sender']
read_only_fields = ['id', 'content', 'sender']
class MessageSerializer(serializers.ModelSerializer):
sender = MessageSenderSerializer(read_only=True)
reply_to = ReplyToSerializer(read_only=True)
media_files = MessageFileSerializer(many=True, read_only=True)
reactions = MessageReactionSerializer(many=True, read_only=True)
@@ -79,6 +89,7 @@ class MessageSendSerializer(serializers.Serializer):
class ChatSerializer(serializers.ModelSerializer):
unread_count = serializers.SerializerMethodField(read_only=True)
members_detail = MessageSenderSerializer(source='members', many=True, read_only=True)
@extend_schema_field(serializers.IntegerField())
def get_unread_count(self, obj):
@@ -98,8 +109,9 @@ class ChatSerializer(serializers.ModelSerializer):
'id', 'chat_type', 'owner', 'name',
'icon', 'banner', 'members', 'moderators',
'hub', 'created_at', 'updated_at', 'unread_count',
'members_detail',
]
read_only_fields = ['owner', 'created_at', 'updated_at', 'unread_count']
read_only_fields = ['owner', 'created_at', 'updated_at', 'unread_count', 'members_detail']
class ChatMemberSerializer(serializers.Serializer):