#pragma once #include "message.hpp" #include #include #include #include #include namespace ZShell { class ChatSession : public QObject { Q_OBJECT QML_ELEMENT QML_UNCREATABLE("Chat sessions are managed by Chat.chats") Q_PROPERTY(QString id READ id CONSTANT) Q_PROPERTY(QString title READ title NOTIFY titleChanged) Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) Q_PROPERTY(QDateTime createdAt READ createdAt CONSTANT) Q_PROPERTY(QDateTime updatedAt READ updatedAt NOTIFY updatedAtChanged) Q_PROPERTY(bool pinned READ pinned NOTIFY pinnedChanged) Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged) Q_PROPERTY(QList messages READ messages NOTIFY messagesChanged) public: explicit ChatSession(const QString& id, QObject* parent = nullptr); [[nodiscard]] QString id() const { return m_id; } [[nodiscard]] QString title() const { return m_title; } [[nodiscard]] QString icon() const { return m_icon; } [[nodiscard]] QDateTime createdAt() const { return QDateTime::fromMSecsSinceEpoch(m_createdAt); } [[nodiscard]] QDateTime updatedAt() const { return QDateTime::fromMSecsSinceEpoch(m_updatedAt); } [[nodiscard]] qint64 createdAtMs() const { return m_createdAt; } [[nodiscard]] qint64 updatedAtMs() const { return m_updatedAt; } [[nodiscard]] bool pinned() const { return m_pinned; } [[nodiscard]] int messageCount() const { return m_messageCount; } [[nodiscard]] QList messages() { ensureLoaded(); return m_messages; } void setTitle(const QString& value); void setIcon(const QString& value); void setUpdatedAt(qint64 value); void setPinned(bool value); void setMeta( const QString& title, qint64 createdAt, qint64 updatedAt, int messageCount); void ensureLoaded(); [[nodiscard]] bool isLoaded() const { return m_loaded; } void adoptMessages(QList messages); ChatMessage* appendMessage( ChatMessage::Role role, const QString& content, qint64 timestamp); void removeMessage(ChatMessage* message); void clearMessages(); Q_SIGNALS: void titleChanged(); void iconChanged(); void updatedAtChanged(); void pinnedChanged(); void messageCountChanged(); void messagesChanged(); private: void setCount(int value); QString m_id; QString m_title; QString m_icon; qint64 m_createdAt = 0; qint64 m_updatedAt = 0; bool m_pinned = false; int m_messageCount = 0; QList m_messages; bool m_loaded = false; }; } // namespace ZShell