File size: 3,536 Bytes
90f0300
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { useRef, useState } from 'react';
import { getToken, readStoredValue } from '../api.js';
import { DEFAULT_STATUS } from '../relay-status.js';
import {
  DEFAULT_REASONING_EFFORT,
  REASONING_DEFAULT_VERSION,
  REASONING_DEFAULT_VERSION_KEY,
  REASONING_EFFORT_KEY,
  THEME_KEY
} from '../app-core-utils.js';

function initialReasoningEffort() {
  const defaultVersion = readStoredValue(REASONING_DEFAULT_VERSION_KEY);
  if (defaultVersion !== REASONING_DEFAULT_VERSION) {
    return DEFAULT_REASONING_EFFORT;
  }
  return readStoredValue(REASONING_EFFORT_KEY, DEFAULT_REASONING_EFFORT);
}

export function useAppState() {
  const [status, setStatus] = useState(DEFAULT_STATUS);
  const [authenticated, setAuthenticated] = useState(Boolean(getToken()));
  const [drawerOpen, setDrawerOpen] = useState(false);
  const [projects, setProjects] = useState([]);
  const [selectedProject, setSelectedProject] = useState(null);
  const [expandedProjectIds, setExpandedProjectIds] = useState({});
  const [hiddenProjectIds, setHiddenProjectIds] = useState(() => new Set());
  const [sessionsByProject, setSessionsByProject] = useState({});
  const [loadingProjectId, setLoadingProjectId] = useState(null);
  const [selectedSession, setSelectedSession] = useState(null);
  const [messages, setMessages] = useState([]);
  const [previewImage, setPreviewImage] = useState(null);
  const [docsOpen, setDocsOpen] = useState(false);
  const [docsBusy, setDocsBusy] = useState(false);
  const [docsError, setDocsError] = useState('');
  const [input, setInput] = useState('');
  const [attachments, setAttachments] = useState([]);
  const [uploading, setUploading] = useState(false);
  const [permissionMode, setPermissionMode] = useState('default');
  const [selectedModel, setSelectedModel] = useState(DEFAULT_STATUS.model);
  const [selectedReasoningEffort, setSelectedReasoningEffort] = useState(initialReasoningEffort);
  const [runningById, setRunningById] = useState({});
  const [theme, setTheme] = useState(() =>
    readStoredValue(THEME_KEY) === 'dark' ? 'dark' : 'light'
  );
  const [syncing, setSyncing] = useState(false);
  const [connectionState, setConnectionState] = useState(() => (getToken() ? 'connecting' : 'disconnected'));
  const wsRef = useRef(null);
  const selectedProjectRef = useRef(null);
  const selectedSessionRef = useRef(null);
  const hiddenProjectIdsRef = useRef(new Set());
  const runningByIdRef = useRef({});
  const lastLocalRunAtRef = useRef(0);
  const activePollsRef = useRef(new Set());
  const turnRefreshTimersRef = useRef(new Map());

  return {
    status, setStatus, authenticated, setAuthenticated, drawerOpen, setDrawerOpen,
    projects, setProjects, selectedProject, setSelectedProject, expandedProjectIds,
    setExpandedProjectIds, hiddenProjectIds, setHiddenProjectIds, sessionsByProject,
    setSessionsByProject, loadingProjectId, setLoadingProjectId, selectedSession, setSelectedSession, messages, setMessages,
    previewImage, setPreviewImage, docsOpen, setDocsOpen, docsBusy, setDocsBusy,
    docsError, setDocsError, input, setInput, attachments, setAttachments, uploading,
    setUploading, permissionMode, setPermissionMode, selectedModel, setSelectedModel,
    selectedReasoningEffort, setSelectedReasoningEffort, runningById, setRunningById,
    theme, setTheme, syncing, setSyncing, connectionState, setConnectionState, wsRef,
    selectedProjectRef, selectedSessionRef, hiddenProjectIdsRef, runningByIdRef,
    lastLocalRunAtRef, activePollsRef, turnRefreshTimersRef
  };
}