mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-06 23:12:22 +02:00
`emailLibrary/index.js` goes from 11,375 lines to 6,187. What came out:
- `settingsPage.js` (879) — the Email Settings view, its form and controls,
away/auto-reply including the calendar-event sync, and the display
preferences. The inline-image preference lives here rather than with the
renderer because the settings form owns writing it.
- `unsubscribe.js` (1,224) — the bulk-unsubscribe review flow. One exported
entry point, its own localStorage keys, its own agent-tool-output listeners.
- `reader.js` (676) — opening an email as a docked tab or a floating window,
plus the AI summary panel both of them share.
- `menus.js` (855) — the reader More menu, the card kebab menu, the bulk
Actions menu and `_bulkAction`.
- `bodyRender.js` (871) — plain and threaded body rendering, inline MIME
images, quote folding.
- `attachments.js` (491) — attachment chips and the deferred load for messages
whose attachment list was not in the list response.
- `aiReply.js` (449) — AI-reply entry points, the per-message context draft,
the translate and remind submenus.
The extracted modules import back from `index.js`, so the graph has cycles.
That is safe for hoisted function declarations and unsafe for a value read
during evaluation, so nothing crosses a module boundary except functions:
`API_BASE` is re-declared per module, the way `emailInbox.js` and
`emailShared.js` already do it, and `_autoReplyRefreshSeq` moves into
`state.js` because the settings page and the unread-badge refresh both write
it and an imported binding is read-only. The module-graph test enters the
package at each module in turn, which is the order that would expose a
dead-zone read.
Two test helpers grew while doing this. `js_function_source` replaces three
marker-pair slices ("from this signature down to that comment") whose end
marker had moved into another module — the slice ran past the function and
kept passing against the wrong text. Its first implementation balanced braces
by walking characters and ended `_toggleCardPreview` 18 lines early, because
the apostrophe in `// that's a scroll, not a nav` opened a string that ate the
braces after it. It now keys on the invariant the file actually holds: a
top-level declaration starts at column 0, so its closing brace is the next
lone `}` at column 0.
44 lines
1.7 KiB
JavaScript
44 lines
1.7 KiB
JavaScript
// static/js/emailLibrary/state.js
|
|
//
|
|
// Shared mutable state for the email-library popup. Keeping these on a
|
|
// single exported object lets sibling modules (utils, signatureFold,
|
|
// future render/menu/composer splits) read and write the same values
|
|
// without each one importing 19 `let` bindings — which ES modules
|
|
// don't allow from outside the defining module anyway.
|
|
//
|
|
// Writes look like `state._libOpen = true` everywhere; reads look like
|
|
// `state._libOpen`. The names match the originals so the refactor is a
|
|
// pure rename, not a semantic change.
|
|
|
|
export const state = {
|
|
_libOpen: false,
|
|
_libJustOpened: false,
|
|
_libEmails: [],
|
|
_libTotal: 0,
|
|
_libOffset: 0,
|
|
_libFolder: 'INBOX',
|
|
_libFolders: [],
|
|
_libAccountId: null, // null = backend default account
|
|
_libAccounts: [], // list of accounts for the chip strip
|
|
_libAutoReplyActive: false, // active account currently has an away reply
|
|
_libPendingExpandUid: null,
|
|
_libSearch: '',
|
|
_libFilter: 'all', // all, unread, unanswered
|
|
_libSort: 'recent', // recent, unread, favorites
|
|
_libHasAttachments: false,
|
|
_libShowTags: localStorage.getItem('odysseus.email.showTags') !== '0',
|
|
// Embedded MIME images are shown by default; Email Settings can opt a
|
|
// mailbox back into the manual-load behavior.
|
|
_libViewInlineImages: true,
|
|
_libLoading: false,
|
|
_docModule: null,
|
|
_onEmailClick: null,
|
|
_libEscHandler: null,
|
|
_selectMode: false,
|
|
_selectedUids: new Set(),
|
|
// Generation guard for the away/auto-reply refresh. Written by the
|
|
// settings page and by the unread-badge refresh, which live in
|
|
// different modules, so it cannot be a module-level `let`.
|
|
_autoReplyRefreshSeq: 0,
|
|
};
|