Commit Graph
3760 Commits
Author SHA1 Message Date
Tommaso Casaburi 6c660c01cd ci(release): run react doctor against previous tag v0.9.1 2026-06-07 23:13:45 +07:00
Tommaso Casaburi af2689c4dc chore(release): v0.9.1 2026-06-07 23:09:29 +07:00
Tommaso Casaburi 6bca832ccf chore(deps): upgrade bitsocial-react-hooks to 0.1.16 2026-06-07 23:07:33 +07:00
Tommaso Casaburi 30010bfc1a Merge branch 'codex/feature/submit-board-button' 2026-06-07 22:47:46 +07:00
Tommaso Casaburi 4e7b89e861 Merge branch 'codex/fix/banned-post-modal-state' 2026-06-07 22:47:14 +07:00
Tommaso Casaburi 04af198140 feat(directory): add submit board link 2026-06-07 22:47:09 +07:00
Tommaso Casaburi 38d18b141e fix(edit menu): read canonical author bans 2026-06-07 22:46:20 +07:00
Tommaso Casaburi 28c762e131 docs(readme): document local browser daemon 2026-06-07 22:08:20 +07:00
Tommaso Casaburi 2eebe407b1 chore(deps): upgrade bitsocial-react-hooks to 0.1.15 2026-06-07 15:28:58 +07:00
Tommaso Casaburi 155e92a8c9 Merge branch 'codex/fix/fit-expanded-images-default' 2026-06-06 23:19:27 +07:00
Tommaso Casaburi e47750edf8 fix: default fit expanded images to screen on
New users get fit-to-screen enabled by default in the expanded media store.
2026-06-06 23:19:22 +07:00
Tommaso Casaburi bc67e961fc fix: use body color for brackets around inline action buttons
Wrap copy-error and failed-publish bracket characters in spans so they use body text color instead of inheriting the action button color.
2026-06-06 23:15:29 +07:00
Tommaso Casaburi 404a464310 feat: use s.5chan.app share links and remove report menu items
Copy share links as path-based s.5chan.app URLs so the share server can render social previews, rename the menu label, remove the stub report action, and update the FAQ.
2026-06-06 19:06:04 +07:00
Tommaso CasaburiandGitHub aa5a985201 ci(react-doctor): add official PR-review Action, drop redundant CLI step (#1156)
Adds the official react-doctor GitHub Action (millionco/react-doctor@v1),
which posts inline review comments + a sticky summary for issues a PR
INTRODUCES (diffed against the merge-base) -- more visible than the
previous CLI '--annotations' markers.

Removes the now-redundant react-doctor steps from ci.yml (the
detect-changes/diff-annotations/skip steps and the push-time full scan)
so react-doctor runs once per PR, not twice. It reads doctor.config.jsonc,
so the React-Compiler rules we don't enforce stay suppressed.
2026-06-05 22:34:29 +07:00
Tommaso CasaburiandGitHub 0493492f55 fix(react-doctor): correct test exclusion + React-Compiler lint policy + state-sync fix (#1155)
* fix(react-doctor): correctly exclude test files from scoring

The intended test-file ignore in react-doctor.config.json was never
applied: react-doctor's config precedence reads the "reactDoctor" key
in package.json (which had no ignore), shadowing the config file. On
top of that, react-doctor 0.4.0's ignore.files matcher is broken — any
non-empty value collapses scan scope and drops real product files, not
just tests.

Consolidate to a single canonical doctor.config.json using
ignore.overrides (which works correctly): only test files are excluded
while all product code is still scored. Remove the shadowing
package.json key and the dead react-doctor.config.json.

Product-code baseline is 55 (92 errors, 515 warnings, 118 files).

* chore(react-doctor): add long-running task tracking for score effort

* refactor(react): remove compiler-redundant memoization in verified files

Delete manual useMemo/useCallback/memo that the React Compiler already
handles, in 7 files validated to be behavior-preserving (factories are
pure functions of compiler-trackable reactive inputs). Kept memos whose
factories read external mutable DOM/theme state with load-bearing deps
(e.g. use-reply-height-estimates metrics). Also hoists a regex and reads
a localStorage value once.

Note: this is code-quality cleanup; react-doctor's score is error-
weighted, so warning cleanup like this does not move the score. See
docs/agent-runs/react-doctor-score/progress.md.

* fix(react-doctor): adopt React-Compiler lint policy + fix one state-sync bug

react-doctor's score is dominated by React-Compiler optimizability
diagnostics that flag intentional patterns (the latest-ref idiom) and
current compiler limitations (try/finally, throw-in-try/catch the
compiler can't lower yet), not bugs. Rewriting that working code to
satisfy them would degrade it.

- Replace doctor.config.json with a documented doctor.config.jsonc that
  does not enforce the react-hooks-js (React Compiler) rules or
  react-compiler-no-manual-memoization. All real code-quality, a11y, and
  performance rules stay enforced.
- Fix one genuine state-sync bug: use-now-seconds refreshed 'now' via a
  synchronous setState inside an effect (an extra render with a stale
  value); move it to a render-time prev-prop comparison (React's
  adjust-during-render pattern), behavior-equivalent.

Score 54 (broken config) -> 63. type-check/lint/1051 tests pass; browser
smoke confirms timestamps render with no re-render regression. The
remaining no-adjust-state-on-prop-change diagnostics are real bugs but
entangled with legitimate side effects (navigate/ref-cancel/async) in
critical flows; left for careful follow-up.

* chore(react-doctor): remove the vanity score badge, keep PR-diff review

The single 0-100 react-doctor score mostly reflects React-Compiler
optimizability and isn't a meaningful health grade to display (see
docs/agent-runs/react-doctor-score). Remove the README badge and its now-
dead generation infra (CI write/upload/publish steps + the
write-react-doctor-badge.mjs script + doctor:badge package script).

Kept: react-doctor's actual value -- the PR step that runs
'yarn doctor --diff <base> --annotations' on pull requests touching React
files, surfacing newly-introduced issues inline. Coverage badge untouched.

* docs(react-doctor): document why the score is not a target to chase

Record the reasoning so future agents/contributors don't re-attempt to
grind the react-doctor score: it overwhelmingly reflects React-Compiler
optimizability (most 'errors' flag intentional patterns and current
compiler limitations, not bugs) and saturates on the fraction of clean
files, so ~63 is the honest ceiling and 90 only comes from disabling the
linter.

- Add a known-surprises entry with the full reasoning + mitigation.
- Reframe the AGENTS.md react-doctor verification line: it's a PR-diff
  reviewer for newly-introduced issues, not an aggregate score to raise.
2026-06-05 22:21:30 +07:00
Tommaso Casaburi 1e82893621 Merge branch 'master' of github.com:bitsocialnet/5chan 2026-06-05 18:48:32 +07:00
Tommaso CasaburiandGitHub 9f58bf7e22 chore(deps): upgrade react to 19.2.7 and react types to 19.x (#1154)
Bump react and react-dom 19.1.2 -> 19.2.7 and @types/react and
@types/react-dom from v18 to v19. Keeps babel-plugin-react-compiler,
which is a separate build-time tool, not part of the React 19 runtime.

The @types v19 upgrade surfaced 21 type-only errors, all fixed without
runtime behavior changes:

- useRef<T>() now requires an explicit argument: pass undefined
- DOM element refs are RefObject<T | null>: widen PostFormFields and
  AdvancedSettings ref prop types accordingly
- retype reply-modal onInput handler to FormEvent + currentTarget
- add a null guard for the boards-bar search input
- update test mocks for stricter cloneElement/forwardRef typings

Verified: type-check, lint, 1051 tests, and build pass; react-doctor
score unchanged at 54; browser smoke across Chromium/Firefox/WebKit
plus mobile viewport clean.
2026-06-05 18:43:28 +07:00
Tommaso Casaburi 1edd46eb84 docs: clarify large artifact context tooling 2026-06-05 18:40:37 +07:00
Tommaso Casaburi 70ffeb816e chore(deps): bump bitsocial-react-hooks to 0.1.14 2026-06-05 17:48:26 +07:00
Tommaso Casaburi 0ba711b666 chore(deps): bump react-doctor to 0.4.0 2026-06-05 17:47:40 +07:00
Tommaso CasaburiandGitHub 69ee15786b fix(quotes): handle cross-thread quotes (publish + hover preview) (#1153)
* fix(quotes): publish only same-thread quoted cids

Quoting a post from another thread failed to publish with "One or more
quoted CIDs are not under the same post". That message is the protocol
error ERR_QUOTED_CID_NOT_UNDER_POST from @pkcprotocol/pkc-js, not a custom
5chan error: a reply's quotedCids must all live under the reply's own
thread.

The reply publish path resolved every >>number quotelink to a CID through
the board-scoped number map and sent them all as quotedCids, so any
cross-thread quotelink made the protocol reject the whole post.

Track each comment's thread (postCid) in usePostNumberStore and filter the
merged quotedCids to same-thread entries before publishing. Cross-thread
quotelinks still render and navigate via their >>number text; only the
published metadata changes. Same-thread replies resolved on demand by the
external-quote resolver are preserved because the resolver registers what
it finds.

Regression introduced in 9f14a6326 (populate quotedCids when publishing
replies with quote references).

* fix(quotes): show hover preview for cross-thread quotelinks

Hovering a >>number quote whose thread was not loaded showed nothing: the
quotelink rendered as an inert span with no floating preview. NumberQuoteLink
only fell back to the lazy resolver when the number->cid mapping was unknown.
When the cid was known but the comment body was not cached, it rendered
ReplyQuotePreview with an undefined comment, which is treated as pending
resolution and rendered as inert text that never fetched the body (the lookup
used onlyIfCached).

Load the body lazily on hover instead: NumberQuoteLink keeps onlyIfCached until
the quotelink is hovered, and ReplyQuotePreview's pending quotelink is now
hoverable when its cid is known so it can request that fetch and prime the
floating-preview position. Once the body resolves the preview appears without
re-hovering. Same-thread quotes stay cached, so this never fetches for them.

* fix(quotes): filter the final quotedCids payload to same-thread

Apply the same-thread filter to the merged publish options rather than only the
derived subset, so any quotedCids carried on stored publishCommentOptions cannot
bypass the guard. Defense in depth for the protocol's same-thread requirement
(ERR_QUOTED_CID_NOT_UNDER_POST); addresses PR review feedback.
2026-06-05 17:45:42 +07:00
Tommaso CasaburiandGitHub 12977fa24a fix(mod-queue): rework excerpt hover preview, scope pending-age alerts (#1152)
Render the compact mod queue excerpt hover preview like the quote-link previews (clean read-only Post via useFloating, anchored to the right of the excerpt on desktop / below on mobile), cap its content at 350 chars, and scope the red pending-age timestamp to posts actually awaiting approval. Adds keyboard handlers to the span fallback.
2026-06-05 17:29:04 +07:00
Tommaso Casaburi ae16ae3dd3 feat(markdown): add /g/ [code] tag syntax highlighting
Parse [code] blocks on /g/ into Prettify-style highlighted code boxes while leaving the tags as literal text on other boards.
2026-06-05 17:02:44 +07:00
Tommaso Casaburi bdbe44aa90 fix(theme): prevent default theme flash on hard refresh
Seed the theme store from a synchronous localStorage mirror so the first render uses the saved theme before async localForage load completes.
2026-06-05 10:24:29 +07:00
Tommaso Casaburi 3ece699a6f fix(post form): publish twimg query-format links with path extension
Normalize pbs.twimg.com media URLs that use ?format= to their file-extension form at publish time without rewriting the input field.
2026-06-04 18:00:25 +07:00
Tommaso Casaburi 8badc2b7a5 Merge branch 'codex/fix/tor-flag-tooltip' 2026-06-04 17:19:07 +07:00
Tommaso Casaburi 0f6d74592e fix(flags): label Tor country flag 2026-06-04 17:18:35 +07:00
Tommaso Casaburi a7997592be Merge branch 'codex/fix/challenge-modal-drag-snapback' 2026-06-04 17:16:51 +07:00
Tommaso Casaburi 0ee3fb00bd fix(challenge modal): stop drag position snapback on re-render
Replace react-spring position state with imperative DOM transforms so re-renders no longer animate the modal back to its centered origin.
2026-06-04 17:16:44 +07:00
Tommaso Casaburi 54f2cf2b84 fix(markdown): render moderation reason links 2026-06-04 15:54:15 +07:00
Tommaso CasaburiandGitHub 608402b5c8 fix(board): prevent transient no threads state (#1151)
* fix(board): prevent transient no threads state

* fix(board): scope raw thread fallback by sort

* fix(board): keep flash table loading during feed sync
2026-06-04 13:43:52 +07:00
Tommaso Casaburi 49d6723225 Merge branch 'codex/fix/neutral-mod-approval-reason' 2026-06-03 18:53:31 +07:00
Tommaso Casaburi be2b774382 fix(mod queue): show pending approval reasons directly 2026-06-03 18:53:11 +07:00
Tommaso Casaburi 40bafa2a0f fix: default mod queue to feed view 2026-06-03 18:32:51 +07:00
Tommaso Casaburi 248ee5b0d5 Merge branch 'codex/fix/post-form-link-media-validation' 2026-06-03 17:10:52 +07:00
Tommaso Casaburi 95f3a54b9d fix(post form): reject non-media file links 2026-06-03 17:10:37 +07:00
Tommaso Casaburi 72aca22723 fix(faq): scroll direct hash links 2026-06-03 17:06:24 +07:00
Tommaso Casaburi 188c44a923 Merge branch 'codex/feature/homepage-stats-scope' 2026-06-03 14:48:16 +07:00
Tommaso Casaburi d357514397 feat(home stats): load stats progressively 2026-06-03 14:47:51 +07:00
Tommaso CasaburiandGitHub d09d2d05d1 fix(fortune): scope s5s fortune markup (#1150)
* fix(markdown): scope fortune markup to fortune boards

* fix(fortune): store fortune output as bbcode

* fix(fortune): keep legacy fortune rendering

* fix(tests): resolve catalog button mock merge

* fix(fortune): validate hidden fortune length
2026-06-03 13:49:35 +07:00
Tommaso Casaburi 84f357cba1 merge: integrate master post-form and youtube changes 2026-06-02 15:00:19 +07:00
Tommaso Casaburi 4cc2bf4ea1 fix(flags): resolve comment flags from directory list candidates
Use directory list board entries when the active address is not yet in
the directories cache so /pol and similar boards get correct flag UI.
2026-06-02 15:00:14 +07:00
Tommaso Casaburi 8f4b02727c merge: integrate master board selector fix 2026-06-02 14:59:22 +07:00
Tommaso Casaburi 0a601c9392 fix(post-form): auto-convert YouTube links to thumbnail URLs
Add a countdown notice and shared hook to replace YouTube watch links
with img.youtube.com thumbnails in post and reply forms, with i18n copy.
2026-06-02 14:59:14 +07:00
Tommaso Casaburi a7cd3ac87f fix(post-form): restore native board selector appearance
Exclude the board dropdown from post-form field chrome so it keeps the
browser default select styling, matching flag selector behavior.
2026-06-02 14:58:32 +07:00
Tommaso Casaburi ea7883b107 chore(deps): bump react-doctor to 0.2.16 2026-06-02 13:32:57 +07:00
Tommaso Casaburi 75c805c822 fix(post options): link sage warning to FAQ 2026-06-02 12:16:22 +07:00
Tommaso Casaburi 342a8f53a7 Merge branch 'master' of github.com:bitsocialnet/5chan 2026-06-01 13:01:42 +07:00
Tommaso CasaburiandGitHub 829b672053 fix(embed): restore youtube thumbnails and file-row labels (#1148)
* fix(comment-content): render reason text as comment content

* fix(post-form): use native browser styling for flash tag select

Exclude the flash tag dropdown from themed post-form select styling so it
renders with the browser's default select appearance, matching the flag selector.

* fix(p2p-stats): show peer flags for DNS6 relay hostnames

Extract embedded IPv6 addresses from dns6 multiaddrs so geo lookup and country flags work for relay peers that publish IPv6 via DNS hostnames.

* fix(flags): hide geolocation-only selectors on /int/ and /sp/

Country-only boards auto-publish geographic location flags without
showing a flag dropdown, matching existing /bant/ behavior.

* fix(embed): restore youtube thumbnails and file-row labels

Restore thumbnail-first previews for YouTube embeds in post media and markdown hover.
Desktop posts show File with the thumbnail image URL and a youtube video type label.

* fix(embed): address youtube thumbnail review feedback

Translate the youtube video label, handle mobile/music YouTube hosts as standard YouTube URLs, keep affected mocks current, and cap default Vitest workers to reduce local CPU spikes.
2026-06-01 12:57:17 +07:00
Tommaso Casaburi b9ab1ba470 merge: show specific role in moderation posting warning 2026-06-01 12:48:47 +07:00