64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
|
|
import { api, isElectronMode } from '@renderer/api';
|
|
import { AlertTriangle } from 'lucide-react';
|
|
|
|
import type { WindowsElevationStatus } from '@shared/types/api';
|
|
|
|
export const WindowsAdministratorBanner = (): React.JSX.Element | null => {
|
|
const [status, setStatus] = useState<WindowsElevationStatus | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (!isElectronMode()) {
|
|
return undefined;
|
|
}
|
|
|
|
const getStatus = api.getWindowsElevationStatus;
|
|
if (typeof getStatus !== 'function') {
|
|
return undefined;
|
|
}
|
|
|
|
let cancelled = false;
|
|
void getStatus()
|
|
.then((nextStatus) => {
|
|
if (!cancelled) {
|
|
setStatus(nextStatus);
|
|
}
|
|
})
|
|
.catch(() => {
|
|
if (!cancelled) {
|
|
setStatus(null);
|
|
}
|
|
});
|
|
|
|
return () => {
|
|
cancelled = true;
|
|
};
|
|
}, []);
|
|
|
|
if (!status?.isWindows || status.isAdministrator !== false) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className="mb-6 flex items-start gap-3 rounded-lg border px-4 py-3"
|
|
role="status"
|
|
style={{
|
|
borderColor: 'rgba(245, 158, 11, 0.35)',
|
|
backgroundColor: 'rgba(245, 158, 11, 0.07)',
|
|
}}
|
|
>
|
|
<AlertTriangle className="mt-0.5 size-4 shrink-0 text-amber-400" />
|
|
<div className="min-w-0 flex-1">
|
|
<div className="text-sm font-medium text-amber-200">
|
|
Windows Administrator mode recommended
|
|
</div>
|
|
<p className="mt-1 text-xs leading-5" style={{ color: 'var(--color-text-secondary)' }}>
|
|
OpenCode runtime checks can time out when Agent Teams AI is not elevated. Restart the app
|
|
with Run as administrator before launching OpenCode teams.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|