Усі проєкти Внутрішній інструмент

Join

Дошка, на якій видно, хто що робить: задачі перетягуються між чотирма колонками, є контакти, дедлайни й підзадачі. Те, по що компанія приходить, коли робота перестає вміщатися в груповий чат.

Моя роль
Повне переписування — архітектура, дизайн, код
Обсяг
~2 400 рядків, 38 компонентів
Стек
React 18, Vite, Tailwind, dnd-kit
Статус
Живий, вхід гостем
Дошка Join із задачами в чотирьох колонках

Чому переписав, а не залатав

Join починався як командний проєкт на чистому JavaScript. Він працював, але кожна нова функція означала правки, протягнуті крізь розмітку, стан і стилі, які від початку ніхто не розділяв. Замість наводити там лад я переписав застосунок з нуля на React — та сама ідея, інший фундамент.

Те, що ви бачите, — незалежна копія: оригінальний репозиторій команди не чіпав, а стара vanilla-версія лишилась у проєкті в теці legacy/, щоб їх можна було чесно порівняти.

Це те саме рішення, яке рано чи пізно доводиться ухвалювати клієнту про власну систему, тож скажу прямо. Переписувати варто тоді, коли ціна кожної наступної функції зростає; латати — коли не зростає. Тут зростала.

Що вміє

На комп'ютері це макет із бічною панеллю; на телефоні навігація переїжджає вниз екрана, під великий палець.

Найскладніше: перетягування, яке не стає пасткою

Перетягування карток — функція, яку просять усі, і саме вона тихо ламає застосунок для частини людей. Перетягування «тільки мишею» неможливе з клавіатури, незручне зі скрінрідером, а на телефоні воює зі скролом: кожна спроба посунути картку прокручує дошку.

Тому перетягування побудоване на dnd-kit — і це не єдиний спосіб перемістити задачу:

Жест ніколи не має бути єдиним шляхом до дії. Якщо перетягнути картку можна лише мишею, то людина з клавіатурою, зі скрінрідером чи просто з нетвердою рукою дошкою скористатися не зможе.

Дані, які працюють і з бекендом, і без нього

Усе сховище сховане за одним файлом — backend.js. Він віддає прості функції: завантажити все, зберегти задачу, видалити контакт, — а решта застосунку так і не дізнається, де насправді лежать дані.

Під ними — дві реалізації. Якщо в оточенні задано адресу Firebase, усе йде в Realtime Database через REST. Якщо не задано, ті самі виклики падають у localStorage, а на першому запуску застосунок сам засіває себе демо-даними, щоб дошка ніколи не зустрічала порожнечею.

На клієнтському проєкті це важить більше, ніж звучить. Демо можна дати будь-кому, не піднімаючи перед тим інфраструктуру; клієнту не треба нічого реєструвати, щоб побачити свій продукт живим. А коли знадобиться справжня база — це одна змінна оточення, а не переписування всіх екранів.

Що сказав би клієнту до того, як він почне цим користуватися

Два обмеження — краще назвати їх одразу, ніж щоб їх виявили потім:

Закрити обидва нескладно — вони лишені свідомо, бо це робота для портфоліо, а не система в продакшені.

Натисніть Guest log in — потрапите одразу на дошку, без реєстрації.