Надо решить как задавать переносы строк. Предлагаю следующим образом. Однакратное нажатие Enter в чате пусть задает перевод каретки, ну обычный line break. Это выводим как <br> прямо внутри текста. Тут пока никаких заморочек. Это, по сути, просто символ.
Два энтера подряд, или SHIFT+Enter закрывают параграф и начинает новый. Тут важно использовать именно тег <p>, чтобы иметь контроль над размером отступа. Просто вывести два <br> подряд не получится, там получается гигантский отступ над которым мы не имеем контроля. Так что фигарим именно параграфы.
Еще параграфы нужны для того, чтобы разрулить там замес с позиционированием даты.
Алгоритм получается примерно следующий. К нам с фронта прило сообжение, гладкий текст из textarea. Мы его сразу же оборачиваем в один большой <p> Дальше начинаем его анализировать, бежим слева на право и каждой однократное вхождение символа конца строки заменяем на <br>. Двухкратные заменяем на </p><p>.