Ідея для зменшення вкладеності коментарів та її умовна реалізація
Сама ідея
Щоб зменшити швидкість росту відступів у деревоподібних коментарях, діалог між двома людьми можна залишати на одному рівні, допоки до них не долучиться хтось третій.
Але як тільки у діалог долучається хтось третій, рівень коментарів збільшується з цього моменту. Далі може встановитись діалог вже між третім та першим чи третім і другим користувачем, в такому разі також рівень залишиться незмінним, до поки триватиме діалог між двома. І так далі.
Наприклад:
перший другий перший другий перший другий перший другий перший другий перший другий третій другий третій другий
і т.д.
Коли хтось хоче написати коментар до середніх коментарів такої гілки, то усі нижні коментарі автоматично зміщуються на один рівень.
Якщо в попередньому прикладі ось так вклиниться четвертий (показано покищо без зміщення, яке йтиме далі):
перший другий перший другий четвертий <-- вклинився перший другий перший другий перший другий перший другий третій другий третій другий
то зміщення буде наступне:
перший другий перший другий четвертий перший другий перший другий перший другий перший другий третій другий третій другий
Порівняння останнього прикладу зі звичними деревоподібними коментарями:
перший другий перший другий четвертий перший другий перший другий перший другий перший другий третій другий третій другий
Може десь таке вже є, ніхто не бачив?
Практична реалізація
А тепер глянемо що відбувається по-моментам, та прикинемо який код для цього потрібен. Я написав умовний код на JavaScript. By default compactMode = true
Момент 1:
перший другий перший другий перший другий перший другий перший другий перший другий третій другий третій другий
Для кожного коментаря працює приблизно наступна логіка:
if(currentComment.compactMode && currentComment.parent)
{
if
(
currentComment.parent.level == 1
||
(
currentComment.parent.parent
&& currentComment.parent.parent.userId != currentComment.userId
)
)
{
currentComment.doOffset();
currentComment.compactMode = false;
}
}
Момент 2:
перший другий перший другий четвертий <-- вклинився перший другий перший другий перший другий перший другий третій другий третій другий
Момент 3:
перший другий перший другий четвертий --> перший <-- зміщення усього нижнього дерева на один рівень --> другий --> перший --> другий --> перший --> другий --> перший --> другий --> третій --> другий --> третій --> другий
Додалась нова умова, і тепер для кожного коментаря працює приблизно наступна логіка:
if(currentComment.compactMode && currentComment.parent)
{
if
(
currentComment.parent.level == 1
|| currentComment.parent.children.length > 1 // <-- Тут спрацьовує ця умова.
||
(
currentComment.parent.parent
&& currentComment.parent.parent.userId != currentComment.userId
)
)
{
currentComment.doOffset();
currentComment.compactMode = false;
}
}
Момент 4:
перший другий перший другий четвертий перший --> другий <-- ще одне зміщення усього нижнього дерева на один рівень --> перший --> другий --> перший --> другий --> перший --> другий --> третій --> другий --> третій --> другий
Додалась ще одна умова, і тепер для кожного коментаря працює приблизно наступна логіка:
if(currentComment.compactMode && currentComment.parent)
{
if
(
currentComment.parent.level == 1
|| currentComment.parent.children.length > 1
||
(
currentComment.parent.parent
&&
(
currentComment.parent.parent.userId != currentComment.userId
|| currentComment.parent.parent.children.length > 1 // <-- Тут спрацьовує ця умова.
)
)
)
{
currentComment.doOffset();
currentComment.compactMode = false;
}
}
Тобто останній приклад коду описує усю необхідну логіку для функціонування таких коментарів.
40 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів