Skip to content

Commit ff68f19

Browse files
author
web3blind
committed
Fix archive guild browser hydration
1 parent d769f97 commit ff68f19

5 files changed

Lines changed: 44 additions & 10 deletions

File tree

app/index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@
111111
<script src="lib/viz.min.js"></script>
112112

113113
<!-- Config -->
114-
<script src="js/config.js?v=20260620c"></script>
114+
<script src="js/config.js?v=20260621a"></script>
115115

116116
<!-- I18n -->
117-
<script src="js/i18n/ru.js?v=20260620c"></script>
118-
<script src="js/i18n/en.js?v=20260620c"></script>
117+
<script src="js/i18n/ru.js?v=20260621a"></script>
118+
<script src="js/i18n/en.js?v=20260621a"></script>
119119

120120
<!-- Utilities -->
121121
<script src="js/utils/helpers.js"></script>
@@ -125,7 +125,7 @@
125125
<!-- Blockchain layer -->
126126
<script src="js/blockchain/connection.js"></script>
127127
<script src="js/blockchain/account.js"></script>
128-
<script src="js/blockchain/history-source.js?v=20260620c"></script>
128+
<script src="js/blockchain/history-source.js?v=20260621a"></script>
129129
<script src="js/blockchain/broadcast.js"></script>
130130
<script src="js/blockchain/invite.js"></script>
131131

@@ -152,7 +152,7 @@
152152
<script src="js/engine/duel.js"></script>
153153
<script src="js/engine/duel-state.js"></script>
154154
<script src="js/engine/validator.js"></script>
155-
<script src="js/engine/guild.js"></script>
155+
<script src="js/engine/guild.js?v=20260621a"></script>
156156
<script src="js/engine/territory.js"></script>
157157
<script src="js/engine/crafting.js"></script>
158158
<script src="js/engine/enchanting.js"></script>
@@ -187,7 +187,7 @@
187187
<script src="js/ui/screens/chronicle.js"></script>
188188
<script src="js/ui/screens/duel.js"></script>
189189
<script src="js/ui/screens/arena.js"></script>
190-
<script src="js/ui/screens/guild.js?v=20260620c"></script>
190+
<script src="js/ui/screens/guild.js?v=20260621a"></script>
191191
<script src="js/ui/screens/map.js"></script>
192192
<script src="js/ui/screens/marketplace.js"></script>
193193
<script src="js/ui/screens/crafting.js"></script>

app/js/engine/guild.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ var GuildSystem = (function() {
342342
*/
343343
function checkWarExpiry(guild, blockNum) {
344344
if (!guild) return;
345+
if (!guild.wars) guild.wars = [];
345346
for (var i = 0; i < guild.wars.length; i++) {
346347
var war = guild.wars[i];
347348
if (war.state === WAR_STATE.ACTIVE && blockNum >= war.endBlock) {

app/js/ui/screens/guild.js

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,13 +323,15 @@ var GuildScreen = (function() {
323323
for (var i = 0; i < guilds.length; i++) {
324324
var guild = guilds[i];
325325
if (!guild || !guild.id) continue;
326+
_normalizeGuild(guild);
326327
if (!state.guilds[guild.id] || state.guilds[guild.id].isPlaceholder) {
327328
state.guilds[guild.id] = guild;
328329
changed = true;
329330
}
330331
}
331332
for (var gid in guildMap) {
332333
if (!guildMap.hasOwnProperty(gid)) continue;
334+
_normalizeGuild(guildMap[gid]);
333335
if (!state.guilds[gid] || state.guilds[gid].isPlaceholder) {
334336
state.guilds[gid] = guildMap[gid];
335337
changed = true;
@@ -366,7 +368,7 @@ var GuildScreen = (function() {
366368
if (err || !directory) return;
367369
if (_mergeArchiveGuildDirectory(StateEngine.getState(), directory)) {
368370
var container = Helpers.$('screen-guild');
369-
if (container && !container.getAttribute('aria-hidden')) render();
371+
if (_isScreenVisible(container)) render();
370372
}
371373
});
372374
}
@@ -405,7 +407,7 @@ var GuildScreen = (function() {
405407
currentState.guilds[guildId] = guild;
406408
// Re-render if guild screen is active
407409
var container = Helpers.$('screen-guild');
408-
if (container && !container.getAttribute('aria-hidden')) {
410+
if (_isScreenVisible(container)) {
409411
render();
410412
}
411413
}
@@ -427,6 +429,7 @@ var GuildScreen = (function() {
427429
if (!state.guilds) return list;
428430
for (var gid in state.guilds) {
429431
if (state.guilds.hasOwnProperty(gid)) {
432+
_normalizeGuild(state.guilds[gid]);
430433
list.push(state.guilds[gid]);
431434
}
432435
}
@@ -438,6 +441,27 @@ var GuildScreen = (function() {
438441
return list;
439442
}
440443

444+
function _normalizeGuild(guild) {
445+
if (!guild) return guild;
446+
guild.charter = guild.charter || {};
447+
if (!guild.charter.membership) guild.charter.membership = 'open';
448+
if (typeof guild.charter.tithe_pct !== 'number') guild.charter.tithe_pct = 1000;
449+
if (typeof guild.charter.min_shares !== 'number') guild.charter.min_shares = 0;
450+
guild.members = guild.members || {};
451+
guild.invites = guild.invites || {};
452+
guild.wars = guild.wars || [];
453+
guild.quests = guild.quests || [];
454+
guild.announcements = guild.announcements || [];
455+
if (typeof guild.totalDelegated !== 'number') guild.totalDelegated = 0;
456+
if (typeof guild.level !== 'number') guild.level = 1;
457+
if (typeof guild.xp !== 'number') guild.xp = 0;
458+
return guild;
459+
}
460+
461+
function _isScreenVisible(container) {
462+
return !!(container && container.getAttribute('aria-hidden') !== 'true');
463+
}
464+
441465
/**
442466
* Bind guild hall events
443467
*/
@@ -920,7 +944,7 @@ var GuildScreen = (function() {
920944
Helpers.EventBus.on(events[i], function() {
921945
// Re-render only if guild screen is currently visible
922946
var container = Helpers.$('screen-guild');
923-
if (container && !container.getAttribute('aria-hidden')) {
947+
if (_isScreenVisible(container)) {
924948
render();
925949
}
926950
});

app/sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Viz Magic — Service Worker
2-
var CACHE_NAME = 'viz-magic-v12';
2+
var CACHE_NAME = 'viz-magic-v13';
33
var ASSETS = [
44
'/',
55
'/index.html',

tests/player-bug-regressions.test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,15 @@ test('guild joining explains and enforces preparation requirements', function ()
133133
assert.ok(/character\.level < GUILD_JOIN_MIN_LEVEL/.test(guildJs), 'join handler should guard low-level direct clicks');
134134
});
135135

136+
test('archive-backed guilds normalize missing optional arrays and rerender visible screen', function () {
137+
assert.ok(/function _normalizeGuild/.test(guildJs), 'guild screen should normalize archive guild payloads');
138+
assert.ok(/guild\.wars = guild\.wars \|\| \[\]/.test(guildJs), 'archive guilds should get default wars array');
139+
assert.ok(/guild\.quests = guild\.quests \|\| \[\]/.test(guildJs), 'archive guilds should get default quests array');
140+
assert.ok(/guild\.announcements = guild\.announcements \|\| \[\]/.test(guildJs), 'archive guilds should get default announcements array');
141+
assert.ok(/function _isScreenVisible/.test(guildJs), 'guild screen should have an aria-hidden visibility helper');
142+
assert.ok(/getAttribute\('aria-hidden'\) !== 'true'/.test(guildJs), 'aria-hidden="false" should count as visible');
143+
});
144+
136145
test('high-traffic UI narration and inventory stat labels are translated', function () {
137146
['char_level_up', 'stat_pot', 'stat_res', 'stat_swf', 'stat_int', 'stat_for', 'duel_narrator_pre', 'duel_narrator_seal', 'duel_narrator_sealed', 'duel_narrator_waiting', 'duel_narrator_reveal'].forEach(function (key) {
138147
assert.ok(enJs.indexOf(key + ':') !== -1, 'English translation missing: ' + key);

0 commit comments

Comments
 (0)