Skip to content

Commit 3481917

Browse files
committed
Make chronicle a posts-only feed
1 parent cb20643 commit 3481917

2 files changed

Lines changed: 30 additions & 110 deletions

File tree

app/js/ui/screens/chronicle.js

Lines changed: 8 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ var ChronicleScreen = (function() {
112112
feed.innerHTML = '<p class="empty-state">' + Helpers.t('loading') + '</p>';
113113

114114
var state = StateEngine.getState();
115-
var entries = _collectStateEntries(state);
115+
var entries = _collectPostEntries(state);
116116
var accounts = _getFeedAccounts(state);
117117

118118
if (!accounts.length || typeof VoiceProtocol === 'undefined' || !VoiceProtocol.loadChronicle) {
@@ -207,18 +207,18 @@ var ChronicleScreen = (function() {
207207
};
208208
}
209209

210-
function _collectStateEntries(state) {
210+
function _collectPostEntries(state) {
211211
var entries = [];
212212

213213
if (state.recentActions) {
214214
for (var i = state.recentActions.length - 1; i >= 0 && entries.length < 50; i--) {
215215
var action = state.recentActions[i];
216-
var narrative = _actionToNarrative(action);
217-
if (narrative && _entryMatchesRequiredTag(action.type, narrative)) {
216+
var postText = _actionToPostText(action);
217+
if (postText && _entryMatchesRequiredTag(action.type, postText)) {
218218
entries.push({
219219
type: 'action',
220220
account: action.sender,
221-
text: narrative,
221+
text: postText,
222222
actionType: action.type,
223223
timestamp: action.timestamp,
224224
blockNum: action.blockNum
@@ -227,23 +227,6 @@ var ChronicleScreen = (function() {
227227
}
228228
}
229229

230-
if (state.duels && state.duels.history) {
231-
for (var j = state.duels.history.length - 1; j >= 0 && entries.length < 50; j--) {
232-
var duel = state.duels.history[j];
233-
var duelNarrative = _duelToNarrative(duel, state);
234-
if (duelNarrative) {
235-
entries.push({
236-
type: 'duel',
237-
account: duel.winner || duel.challenger,
238-
text: duelNarrative,
239-
actionType: 'duel_completed',
240-
timestamp: null,
241-
blockNum: duel.completedBlock
242-
});
243-
}
244-
}
245-
}
246-
247230
return entries;
248231
}
249232

@@ -362,67 +345,9 @@ var ChronicleScreen = (function() {
362345
return true;
363346
}
364347

365-
function _actionToNarrative(action) {
366-
var t = Helpers.t;
367-
var charInfo = StateEngine.getCharacter(action.sender);
368-
var name = (charInfo && charInfo.name) || action.sender || '???';
369-
370-
switch (action.type) {
371-
case 'chronicle_post':
372-
return action.text || (action.message && action.message.text) || '';
373-
case 'hunt':
374-
return t('chronicle_narrative_hunt', { name: name });
375-
case 'hunt_victory':
376-
case 'hunt_defeat':
377-
if (action.events && action.events[0]) {
378-
var creature = action.events[0].creature || '';
379-
if (action.type === 'hunt_victory') {
380-
return t('chronicle_narrative_hunt_win', { name: name, creature: creature });
381-
} else {
382-
return t('chronicle_narrative_hunt_lose', { name: name, creature: creature });
383-
}
384-
}
385-
return t('chronicle_narrative_hunt', { name: name });
386-
case 'character_created':
387-
return t('chronicle_narrative_awaken', { name: name });
388-
case 'rest_complete':
389-
return t('chronicle_narrative_rest', { name: name });
390-
case 'blessing_sent':
391-
if (!_isBlessAction(action)) return null;
392-
return t('chronicle_narrative_bless', { name: name, target: action.receiver || '' });
393-
default:
394-
return null;
395-
}
396-
}
397-
398-
function _isBlessAction(action) {
399-
if (!action) return false;
400-
return action.type === 'blessing_sent' && action.memo && String(action.memo).indexOf(BLESS_MEMO_PREFIX) === 0;
401-
}
402-
403-
function _duelToNarrative(duel, state) {
404-
var t = Helpers.t;
405-
var charA = state.characters[duel.challenger] || {};
406-
var charB = state.characters[duel.target] || {};
407-
var nameA = charA.name || duel.challenger;
408-
var nameB = charB.name || duel.target;
409-
410-
if (duel.forfeited) {
411-
return t('chronicle_narrative_duel_forfeit', { winner: duel.winner === duel.challenger ? nameA : nameB });
412-
}
413-
414-
if (duel.winner) {
415-
var winnerName = duel.winner === duel.challenger ? nameA : nameB;
416-
var loserName = duel.winner === duel.challenger ? nameB : nameA;
417-
return t('chronicle_narrative_duel_win', {
418-
winner: winnerName,
419-
loser: loserName,
420-
winsA: duel.winsA || 0,
421-
winsB: duel.winsB || 0
422-
});
423-
}
424-
425-
return t('chronicle_narrative_duel_draw', { nameA: nameA, nameB: nameB });
348+
function _actionToPostText(action) {
349+
if (!action || action.type !== 'chronicle_post') return null;
350+
return action.text || (action.message && action.message.text) || '';
426351
}
427352

428353
function _filterByTab(entries, state) {

plan.md

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,39 @@
1-
# Viz-magic — duel incoming challenge UX plan
1+
# Viz-magic — chronicle posts-only cleanup plan
22

33
## Scope
4-
- Сделать входящий вызов на дуэль заметным для target-аккаунта.
5-
- Добавить клиентское уведомление и быстрый переход в нужный экран.
6-
- Упростить принятие вызова из UI без необходимости догадываться зайти в арену.
4+
- Вернуть хронику к исходной модели: лента постов пользователей, а не mixed activity feed.
5+
- Убрать игровые события и bless/award narrative из основной ленты хроники.
6+
- Сохранить кнопку благословения как действие под постом.
77

88
## Non-goals
9-
- Не менять duel protocol и blockchain action types.
10-
- Не добавлять серверный push или внешний notification backend.
11-
- Не переписывать полностью arena/duel flow beyond incoming challenge UX.
9+
- Не трогать VoiceProtocol и storage формат пользовательских постов.
10+
- Не проектировать отдельную activity-вкладку в этом проходе.
11+
- Не ломать compose/send flow и bless action под постом.
1212

1313
## Milestones
14-
1. Проверить, где именно приходит `duel_challenge` и как target сейчас узнаёт о вызове.
15-
2. Добавить уведомление для target-игрока.
16-
3. Сделать автопереход в арену при входящем вызове.
17-
4. Оставить быстрый accept flow из текущих экранов арены/дуэли.
18-
5. Прогнать локальные проверки JS.
14+
1. Зафиксировать источник истины для хроники: посты из voice/publication + локально отправленные post entries.
15+
2. Убрать сбор recentActions/duel history в основной feed.
16+
3. Оставить табы working поверх post-only набора.
17+
4. Прогнать локальные проверки JS.
1918

2019
## Expected files or subsystems
21-
- `app/js/ui/screens/arena.js`
22-
- `app/js/ui/screens/duel.js`
23-
- `app/js/i18n/ru.js`
24-
- `app/js/i18n/en.js`
20+
- `app/js/ui/screens/chronicle.js`
2521

2622
## Implementation tasks
27-
- Подписаться на `duel_challenge` для текущего пользователя.
28-
- Показать toast/announce с понятным текстом про входящий вызов.
29-
- Автоматически переводить игрока в `arena`, где already existing accept UI доступен сразу.
30-
- При желании усилить narrator/aria message для blind UX.
23+
- Оставить в ленте только `chronicle_post` и voice/publication entries с required tag.
24+
- Не рендерить blessing/hunt/rest/duel как feed entries.
25+
- Сохранить локальный optimistic post injection после отправки пользователем.
3126

3227
## Validation
33-
- При входящем вызове target-аккаунт получает заметное уведомление.
34-
- После вызова игрок автоматически попадает в экран арены или легко открывает его одним действием.
35-
- Принятие вызова остаётся рабочим через существующий accept flow.
28+
- В хронике больше не появляются bless/award/hunt/duel/rest записи.
29+
- Пользовательские посты по-прежнему видны.
30+
- Кнопка благословения под постом остаётся рабочей.
3631
- `node --check` проходит для изменённых JS файлов.
3732

3833
## Risks or assumptions
39-
- Событие `duel_challenge` уже есть в client event flow; используем его как primary trigger, а не low-level chain polling.
40-
- Автопереход в `arena`, а не сразу в `duel`, снижает риск пропустить context и кнопки принятия.
34+
- Временный optimistic local post живёт в `recentActions`, но фильтруется только как `chronicle_post`.
35+
- Если потом понадобится activity feed, его лучше делать отдельным экраном/вкладкой, не в основной хронике.
4136

4237
## Definition of done
43-
- Вызванный игрок реально узнаёт о дуэли без ручного похода по меню.
44-
- Входящий duel challenge ведёт в понятный экран с возможностью принять вызов.
38+
- Хроника снова воспринимается как лента постов.
39+
- Игровые события больше не засоряют social feed.

0 commit comments

Comments
 (0)