overseer voting stuff yay!

This commit is contained in:
legop3
2026-05-19 21:08:06 -04:00
parent ab32b0416c
commit 8c2162d918
12 changed files with 142 additions and 21 deletions
@@ -0,0 +1,43 @@
import { useSessionActions, useSessionSelector } from '../../context/SessionContext.jsx';
import { useSettingsNamespace } from '../../settings/index.js';
export default function OverseerPreferencePanel() {
const { identifySession } = useSessionActions();
const sessionIdentity = useSessionSelector((state) => state.session?.identity || null);
const vote = useSessionSelector((state) => state.session?.overseerVote || null);
const { value: profile } = useSettingsNamespace('profile', { nickname: '' });
const { value: identity } = useSettingsNamespace('identity', { cookieUserId: '' });
const { value, save } = useSettingsNamespace('overseerPreference', { enabled: true });
const enabled = Boolean(value?.enabled);
const running = Boolean(vote?.running);
const onToggle = async (event) => {
const next = Boolean(event?.target?.checked);
await save((current) => ({ ...(current || {}), enabled: next }));
await identifySession({
cookieUserId: String(identity?.cookieUserId || '').trim(),
nickname: String(profile?.nickname || '').trim(),
overseerEnabled: next,
});
};
return (
<section className="surface p-1 text-xs text-slate-200">
<div className="flex items-center justify-between gap-2">
<label className="inline-flex items-center gap-1.5">
<input type="checkbox" checked={enabled} onChange={onToggle} />
<span>Overseer vote</span>
</label>
<span className={running ? 'text-emerald-300' : 'text-slate-400'}>
running: {running ? 'yes' : 'no'}
</span>
</div>
<div className="mt-1 text-[0.65rem] text-slate-400">
yes {Number(vote?.yesCount || 0)} / no {Number(vote?.noCount || 0)} / online {Number(vote?.onlineCount || 0)}
</div>
<div className="mt-0.5 text-[0.65rem] text-slate-500">
your vote: {(sessionIdentity?.overseerEnabled ?? enabled) ? 'yes' : 'no'}
</div>
</section>
);
}
+3 -1
View File
@@ -23,6 +23,7 @@ import VipPanel from '../VipPanel/index.jsx';
import { useSessionSelector } from '../../context/SessionContext.jsx';
import { useSettingsNamespace } from '../../settings/index.js';
import ButtonBoxPanel from '../ButtonBoxPanel/index.jsx';
import OverseerPreferencePanel from '../OverseerPreferencePanel/index.jsx';
import { useState } from 'react';
import { useManualDockAssist } from '../../features/manualDockAssist/useManualDockAssist.js';
@@ -177,7 +178,8 @@ export default function RightPaneTabs({ layout, onOpenHelpOverlay }) {
</div>
<div className="grid items-stretch gap-0.5 grid-cols-[minmax(0,1.3fr)_minmax(0,0.22fr)] h-[14rem]">
<ChatPanel fillHeight />
<div className="grid min-h-0 gap-0.5 grid-rows-[minmax(0,1fr)_auto]">
<div className="grid min-h-0 gap-0.5 grid-rows-[auto_minmax(0,1fr)_auto]">
<OverseerPreferencePanel />
<RawUserPilePanel compact hideNicknameForm fillHeight />
<NicknameEntryPanel compact />
</div>