Groups is fully removed:

No homepage navigation, Account feature, tier setting, API, or client 
code.
Legacy group tables, entitlements, messages, voice files, and config are 
purged automatically.
New cache-busted client: cyberchat-app.js?v=20260609.3.
Browser and SQLite migration tests passed with no console errors.
This commit is contained in:
Ty Clifford
2026-06-09 00:16:32 -04:00
parent ccdbc47642
commit a1971f9515
11 changed files with 143 additions and 1110 deletions
-3
View File
@@ -1178,9 +1178,6 @@ html, body {
.cc-inline-btn.danger { color: var(--r); border-color: var(--r); }
.cc-inline-btn:disabled { opacity: .35; cursor: not-allowed; }
.cc-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.cc-member-list { display: flex; gap: 6px; flex-wrap: wrap; }
.cc-member-list span { padding: 4px 7px; border: 1px solid var(--bd); border-radius: 2px; font: 10px var(--mono); }
.cc-member-list button { color: var(--r); background: none; border: 0; margin-left: 4px; }
.cc-empty-card { padding: 30px; color: var(--t1); border: 1px dashed var(--bd); text-align: center; font: 10px var(--mono); }
.cc-search-row { display: grid; grid-template-columns: 1fr auto; gap: 8px; margin-bottom: 12px; }
.cc-archive-list { display: flex; flex-direction: column; gap: 6px; }
@@ -19,6 +19,11 @@
};
let root;
let wakeListenersBound = false;
const displayedFeatures = new Set([
'voice_messages', 'recording_status', 'auto_voice_send', 'auto_voice_play',
'username_color', 'text_archive_days', 'text_export', 'voice_archive',
'voice_export', 'email_2fa'
]);
const $ = (s, c) => (c || root).querySelector(s);
const $$ = (s, c) => Array.from((c || root).querySelectorAll(s));
const esc = value => String(value == null ? '' : value)
@@ -27,8 +32,8 @@
function base() {
if (window.CYBERCHAT_BASE != null) return String(window.CYBERCHAT_BASE).replace(/\/$/, '');
const script = Array.from(document.scripts).find(item => item.src.includes('cyberchat-v4.js'));
return script ? script.src.replace(/\/assets\/js\/cyberchat-v4\.js.*$/, '') : '';
const script = Array.from(document.scripts).find(item => item.src.includes('cyberchat-app.js'));
return script ? script.src.replace(/\/assets\/js\/cyberchat-app\.js.*$/, '') : '';
}
function apiUrl(file, query = '') { return base() + '/api/' + file + (query ? '?' + query : ''); }
function publicUrl(path) {
@@ -54,6 +59,10 @@
return state.user?.features && Object.prototype.hasOwnProperty.call(state.user.features, key)
? state.user.features[key] : fallback;
}
function visibleFeatures() {
return Object.entries(state.user?.features || {})
.filter(([key]) => displayedFeatures.has(String(key).toLowerCase()));
}
function toast(message, type = 'error') {
const area = $('#cc-toasts');
if (!area) return;
@@ -681,7 +690,7 @@
</section></div>
${showBilling ? billingHtml(billing) : ''}
<section class="cc-card cc-feature-card"><h3>CURRENT FEATURES</h3><div class="cc-feature-list">
${Object.entries(state.user.features).map(([key, value]) => `<span><b>${esc(key.replace(/_/g, ' '))}</b> ${esc(String(value))}</span>`).join('')}</div></section>
${visibleFeatures().map(([key, value]) => `<span><b>${esc(key.replace(/_/g, ' '))}</b> ${esc(String(value))}</span>`).join('')}</div></section>
</div>`;
$('#logout').addEventListener('click', () => logout(true));
$('#email-send').addEventListener('click', requestEmail);
File diff suppressed because it is too large Load Diff