g-comments 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +44 -8
- package/dist/{chunk-X6RAR374.cjs → chunk-IBNNENCZ.cjs} +14 -2
- package/dist/chunk-IBNNENCZ.cjs.map +1 -0
- package/dist/{chunk-6E3M3PQN.js → chunk-WACVXJHD.js} +14 -2
- package/dist/chunk-WACVXJHD.js.map +1 -0
- package/dist/element.d.ts +58 -5
- package/dist/element.js +983 -965
- package/dist/element.js.map +1 -1
- package/dist/index.cjs +16 -16
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{messages-BlBkT6Kr.d.cts → messages-C9bMljl3.d.cts} +51 -1
- package/dist/{messages-BlBkT6Kr.d.ts → messages-C9bMljl3.d.ts} +51 -1
- package/dist/react.cjs +236 -35
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +20 -5
- package/dist/react.d.ts +20 -5
- package/dist/react.js +206 -6
- package/dist/react.js.map +1 -1
- package/package.json +9 -9
- package/styles/styles.css +957 -947
- package/dist/chunk-6E3M3PQN.js.map +0 -1
- package/dist/chunk-X6RAR374.cjs.map +0 -1
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/util.ts","../src/react/context.ts","../src/react/provider.tsx","../src/react/appearance.ts","../src/react/icons.tsx","../src/react/hooks/use-config.ts","../src/react/hooks/use-commenter.ts","../src/react/hooks/use-thread.ts","../src/react/root.tsx","../src/react/composer/markdown.ts","../src/react/composer/use-mentions.ts","../src/react/composer/composer.tsx","../src/react/item-context.ts","../src/react/comment-parts.tsx","../src/react/dev-panel.tsx","../src/react/header.tsx","../src/react/list.tsx","../src/react/sign-in.tsx","../src/react/status.tsx","../src/react/comments.tsx","../src/react/hooks/use-comment-count.ts","../src/react/comment-count.tsx"],"names":["useEffect","useLayoutEffect","isCommentsError","CommentsError","createContext","createTranslator","PACKAGE_NAME","useContext","useMemo","normalizeForum","clientRegistry","resolveLocale","useRef","jsx","useState","useCallback","useSyncExternalStore","currentUrlWithoutHash","thread","context","findComment","STORAGE_PREFIX","useId","createComposerTimer","jsxs","Fragment","initial","loaded","encodeRef","defaultPageUrl"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useEffect, useLayoutEffect } from \"react\";\nimport { CommentsError, isCommentsError } from \"../errors\";\n\nexport const useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport function toCommentsError(error: unknown): CommentsError {\n if (isCommentsError(error)) {\n return error;\n }\n return new CommentsError(\"unknown\", error instanceof Error ? error.message : String(error), {\n cause: error,\n });\n}\n\nexport function noop(): void {}\n\n/**\n * The document or shadow root an element lives in. `document.activeElement`\n * and `document.getElementById` stop at a shadow boundary, so lookups inside a\n * custom element's shadow tree go through this.\n */\nexport function rootNodeOf(element: Element): Document | ShadowRoot {\n const root = element.getRootNode();\n return root instanceof Document || root instanceof ShadowRoot ? root : element.ownerDocument;\n}\n\n/** Pages served from a development host get setup diagnostics without `debug`. */\nexport function isLocalPage(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n const host = window.location.hostname;\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".test\")\n );\n}\n\nexport function readDraft(key: string): string {\n try {\n return globalThis.localStorage?.getItem(key) ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nexport function writeDraft(key: string, value: string): void {\n try {\n if (value.trim() === \"\") {\n globalThis.localStorage?.removeItem(key);\n } else {\n globalThis.localStorage?.setItem(key, value);\n }\n } catch {\n // Quota or privacy-mode failures keep the draft in memory only.\n }\n}\n\nconst tickListeners = new Set<() => void>();\nlet tickTimer: ReturnType<typeof setInterval> | undefined;\n\n/** One shared minute ticker for every relative timestamp on the page. */\nexport function onMinuteTick(listener: () => void): () => void {\n tickListeners.add(listener);\n tickTimer ??= setInterval(() => {\n for (const tick of [...tickListeners]) {\n tick();\n }\n }, 60_000);\n return () => {\n tickListeners.delete(listener);\n if (tickListeners.size === 0) {\n clearInterval(tickTimer);\n tickTimer = undefined;\n }\n };\n}\n\nconst UNITS: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n [\"year\", 31_536_000],\n [\"month\", 2_592_000],\n [\"week\", 604_800],\n [\"day\", 86_400],\n [\"hour\", 3_600],\n [\"minute\", 60],\n];\n\nexport function formatRelative(iso: string, now: number, locale: string): string {\n const seconds = Math.round((Date.parse(iso) - now) / 1000);\n const format = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n for (const [unit, size] of UNITS) {\n if (Math.abs(seconds) >= size) {\n return format.format(Math.round(seconds / size), unit);\n }\n }\n return format.format(0, \"second\");\n}\n\nexport function formatAbsolute(iso: string, locale: string): string {\n return new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeStyle: \"short\" }).format(\n new Date(iso),\n );\n}\n","import { createContext, useContext, useMemo } from \"react\";\nimport { PACKAGE_NAME } from \"../constants\";\nimport type { CommentsClient } from \"../core/client\";\nimport { normalizeForum } from \"../core/http\";\nimport { clientRegistry } from \"../core/registry\";\nimport {\n createTranslator,\n type Messages,\n resolveLocale,\n type SupportedLocale,\n type Translator,\n} from \"../messages\";\nimport type { Appearance, Theme } from \"./appearance\";\nimport type { CommentsEvent } from \"./events\";\nimport { noop } from \"./util\";\n\nexport interface CommentsContextValue {\n client: CommentsClient;\n t: Translator;\n locale: SupportedLocale;\n messages: Partial<Messages> | undefined;\n theme: Theme;\n appearance: Appearance | undefined;\n debug: boolean;\n emit: (event: CommentsEvent) => void;\n}\n\nexport const CommentsContext = createContext<CommentsContextValue | null>(null);\n\nconst defaultTranslator = createTranslator();\n\n/**\n * The provider's context, or a standalone one for an explicit `forum` that the\n * provider does not serve. Standalone clients come from the shared registry, so\n * every component naming the same forum shares one client.\n */\nexport function useCommentsContext(forum?: string): CommentsContextValue {\n const value = useOptionalCommentsContext(forum);\n if (!value) {\n throw new Error(\n `${PACKAGE_NAME}: render this inside <DiscourseComments forum=\"…\"> or pass a \\`forum\\` prop`,\n );\n }\n return value;\n}\n\n/** Like `useCommentsContext`, but `null` when nothing provides a client. */\nexport function useOptionalCommentsContext(forum?: string): CommentsContextValue | null {\n const context = useContext(CommentsContext);\n const standalone = useMemo((): CommentsContextValue | null => {\n if (forum === undefined || (context && normalizeForum(forum).base === context.client.forum)) {\n return null;\n }\n return {\n client: clientRegistry.acquire({ forum }),\n t: context?.t ?? defaultTranslator,\n locale: context?.locale ?? resolveLocale(undefined),\n messages: context?.messages,\n theme: context?.theme ?? \"auto\",\n appearance: context?.appearance,\n debug: context?.debug ?? false,\n emit: context?.emit ?? noop,\n };\n }, [forum, context]);\n\n return standalone ?? context;\n}\n\n/** The client the surrounding `<DiscourseComments>` provides. */\nexport function useClient(): CommentsClient {\n const context = useContext(CommentsContext);\n if (!context) {\n throw new Error(`${PACKAGE_NAME}: useClient() needs a <DiscourseComments> provider`);\n }\n return context.client;\n}\n","import { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport type { CommentsClient, CreateClientOptions } from \"../core/client\";\nimport { clientRegistry } from \"../core/registry\";\nimport { createTranslator, type Messages, resolveLocale } from \"../messages\";\nimport type { Appearance, Theme } from \"./appearance\";\nimport { CommentsContext, type CommentsContextValue } from \"./context\";\nimport type { CommentsEvent } from \"./events\";\n\ninterface ProviderOptions {\n children?: ReactNode;\n /** Default appearance for every widget inside; widgets merge their own on top. */\n appearance?: Appearance;\n /** UI language (`en`, `pt-BR`; other `pt*` map to `pt-BR`), also sent as `Accept-Language`. */\n locale?: string;\n /** Overrides for individual UI strings. */\n messages?: Partial<Messages>;\n theme?: Theme;\n /** Logs client activity and shows setup diagnostics outside localhost. */\n debug?: boolean;\n onEvent?: (event: CommentsEvent) => void;\n}\n\n// A closed popup is the reader's choice and an expired key is reported as `auth.signedOut`.\nconst QUIET_AUTH_ERRORS: ReadonlySet<string> = new Set([\"cancelled\", \"invalid_key\"]);\n\n/** Client options beyond `forum`; they apply when the shared client is first created. */\ntype ClientCreationOptions = Omit<CreateClientOptions, \"forum\" | \"locale\" | \"debug\">;\n\nexport type DiscourseCommentsProps = ProviderOptions &\n (\n | ({ forum: string; client?: undefined } & ClientCreationOptions)\n | { client: CommentsClient; forum?: undefined }\n );\n\n/**\n * Shares one client (auth, config, counts batching, realtime) with every\n * comments widget and hook below it.\n */\nexport function DiscourseComments(props: DiscourseCommentsProps) {\n const { children, appearance, locale, messages, theme = \"auto\", debug = false, onEvent } = props;\n const explicitClient = props.client;\n const forum = props.forum;\n\n const creation: CreateClientOptions | null =\n props.forum === undefined\n ? null\n : {\n forum: props.forum,\n fetch: props.fetch,\n headers: props.headers,\n storage: props.storage,\n clientId: props.clientId,\n locale,\n debug,\n };\n const client = useMemo(\n () => explicitClient ?? clientRegistry.acquire(creation!),\n [explicitClient, forum],\n );\n\n // Inline `messages={{ … }}` objects must not rebuild the translator every render.\n const messagesKey = messages ? JSON.stringify(messages) : \"\";\n const t = useMemo(() => createTranslator(locale, messages), [locale, messagesKey]);\n\n const onEventRef = useRef(onEvent);\n useEffect(() => {\n onEventRef.current = onEvent;\n });\n\n const value = useMemo(\n (): CommentsContextValue => ({\n client,\n t,\n locale: resolveLocale(locale),\n messages,\n theme,\n appearance,\n debug,\n emit: (event) => onEventRef.current?.(event),\n }),\n [client, t, locale, messagesKey, theme, appearance, debug],\n );\n\n useEffect(() => {\n let previous = client.auth.state();\n return client.auth.onChange((state) => {\n const wasSignedIn = previous.status === \"signed-in\";\n if (state.status === \"signed-in\" && state.user && !wasSignedIn) {\n onEventRef.current?.({ type: \"auth.signedIn\", user: state.user });\n } else if (state.status === \"anonymous\" && wasSignedIn) {\n onEventRef.current?.({\n type: \"auth.signedOut\",\n expired: state.error?.type === \"invalid_key\",\n });\n }\n const failure = state.error;\n if (failure && failure !== previous.error && !QUIET_AUTH_ERRORS.has(failure.type)) {\n onEventRef.current?.({ type: \"error\", action: \"signIn\", error: failure });\n }\n previous = state;\n });\n }, [client]);\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n","import type { CSSProperties } from \"react\";\n\n/** `auto` follows `prefers-color-scheme`; `inherit` leaves the colours to the page. */\nexport type Theme = \"auto\" | \"light\" | \"dark\" | \"inherit\";\n\n/** Design tokens; each is set as `--gc-<kebab-case name>` on the widget root. */\nexport type AppearanceVariable =\n | \"font\"\n | \"fg\"\n | \"fgMuted\"\n | \"bg\"\n | \"bgSubtle\"\n | \"border\"\n | \"accent\"\n | \"accentFg\"\n | \"danger\"\n | \"radius\"\n | \"shadow\"\n | \"space\"\n | \"avatarSize\";\n\n/** Elements that accept extra class names through `appearance.elements`. */\nexport type AppearanceElement =\n | \"root\"\n | \"header\"\n | \"count\"\n | \"sort\"\n | \"signIn\"\n | \"composer\"\n | \"textarea\"\n | \"toolbar\"\n | \"list\"\n | \"comment\"\n | \"avatar\"\n | \"meta\"\n | \"body\"\n | \"actions\"\n | \"menu\"\n | \"button\"\n | \"primaryButton\"\n | \"loadMore\"\n | \"pill\"\n | \"notice\"\n | \"dialog\";\n\nexport interface Appearance {\n /** Token overrides, e.g. `{ accent: \"var(--brand)\", radius: \"0\" }`. */\n variables?: Partial<Record<AppearanceVariable, string>>;\n /** Extra class names, e.g. `{ comment: \"card\", button: \"btn\" }`. */\n elements?: Partial<Record<AppearanceElement, string>>;\n}\n\nexport type ElementClasses = Partial<Record<AppearanceElement, string>>;\n\nexport function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/** Later layers win for variables; element classes accumulate. */\nexport function mergeAppearance(...layers: Array<Appearance | undefined>): Required<Appearance> {\n const variables: Partial<Record<AppearanceVariable, string>> = {};\n const elements: ElementClasses = {};\n for (const layer of layers) {\n if (!layer) {\n continue;\n }\n Object.assign(variables, layer.variables);\n for (const [name, value] of Object.entries(layer.elements ?? {}) as Array<\n [AppearanceElement, string | undefined]\n >) {\n elements[name] = cx(elements[name], value) || undefined;\n }\n }\n return { variables, elements };\n}\n\nexport function variablesStyle(variables: Appearance[\"variables\"]): CSSProperties {\n const style: Record<string, string> = {};\n for (const [name, value] of Object.entries(variables ?? {})) {\n if (value !== undefined && value !== \"\") {\n style[`--gc-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}`] = value;\n }\n }\n return style as CSSProperties;\n}\n","import type { ReactNode } from \"react\";\n\nfunction Icon({ children }: { children: ReactNode }) {\n return (\n <svg\n className=\"gc-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport function HeartIcon({ filled = false }: { filled?: boolean }) {\n return (\n <Icon>\n <path\n fill={filled ? \"currentColor\" : \"none\"}\n d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z\"\n />\n </Icon>\n );\n}\n\nexport function ReplyIcon() {\n return (\n <Icon>\n <path d=\"M9 17 4 12l5-5\" />\n <path d=\"M20 18v-2a4 4 0 0 0-4-4H4\" />\n </Icon>\n );\n}\n\nexport function MoreIcon() {\n return (\n <Icon>\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n </Icon>\n );\n}\n\nexport function PinIcon() {\n return (\n <Icon>\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.8V4h6v6.8l2 3.2H7z\" />\n </Icon>\n );\n}\n\nexport function BoldIcon() {\n return (\n <Icon>\n <path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" />\n </Icon>\n );\n}\n\nexport function ItalicIcon() {\n return (\n <Icon>\n <path d=\"M19 4h-9M14 20H5M15 4 9 20\" />\n </Icon>\n );\n}\n\nexport function LinkIcon() {\n return (\n <Icon>\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </Icon>\n );\n}\n\nexport function CodeIcon() {\n return (\n <Icon>\n <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />\n </Icon>\n );\n}\n\nexport function QuoteIcon() {\n return (\n <Icon>\n <path d=\"M3 21c3 0 7-1 7-8V5H3v7h4c0 3-1 5-4 6zM14 21c3 0 7-1 7-8V5h-7v7h4c0 3-1 5-4 6z\" />\n </Icon>\n );\n}\n\nexport function ImageIcon() {\n return (\n <Icon>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21\" />\n </Icon>\n );\n}\n\nexport function BackIcon() {\n return (\n <Icon>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { CommentsError } from \"../../errors\";\nimport type { Config } from \"../../types\";\nimport { toCommentsError } from \"../util\";\n\n// Lets widgets mounted after the first one render with the config right away.\nconst loaded = new WeakMap<CommentsClient, Config>();\n\nexport interface ConfigState {\n config: Config | null;\n error: CommentsError | null;\n /** Asks again after a failure. */\n reload(): void;\n}\n\ninterface ClientConfig {\n client: CommentsClient;\n config: Config | null;\n error: CommentsError | null;\n}\n\nfunction initial(client: CommentsClient): ClientConfig {\n return { client, config: loaded.get(client) ?? null, error: null };\n}\n\n/** The forum's comments config, refreshed when the reader signs in or out. */\nexport function useConfig(client: CommentsClient): ConfigState {\n const [stored, setState] = useState<ClientConfig>(() => initial(client));\n // State belongs to one client: after a switch (another forum), nothing of the\n // previous forum's providers or limits may show while the new config loads.\n let state = stored;\n if (stored.client !== client) {\n state = initial(client);\n setState(state);\n }\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n let active = true;\n const update = (next: (current: ClientConfig) => ClientConfig) =>\n setState((current) => (active && current.client === client ? next(current) : current));\n const load = () =>\n client.config().then(\n (config) => {\n loaded.set(client, config);\n update((current) =>\n current.config === config && !current.error ? current : { client, config, error: null },\n );\n },\n (error: unknown) => {\n update((current) => ({ ...current, error: toCommentsError(error) }));\n },\n );\n void load();\n // The client drops its cached config when the reader changes; this asks again.\n const stop = client.auth.onChange(() => void load());\n return () => {\n active = false;\n stop();\n };\n }, [client, attempt]);\n\n const reload = useCallback(() => setAttempt((count) => count + 1), []);\n return { config: state.config, error: state.error, reload };\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport type { AuthStatus, SignInOptions } from \"../../core/auth\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { CommentsError } from \"../../errors\";\nimport type { AuthProvider, Commenter, Config } from \"../../types\";\nimport { useCommentsContext } from \"../context\";\nimport { useConfig } from \"./use-config\";\n\nexport interface CommenterState {\n user: Commenter | null;\n status: AuthStatus;\n /** The forum's sign-in providers; empty until the forum config has loaded. */\n providers: readonly AuthProvider[];\n /** The forum is answering anonymously under load: treat the widget as read-only. */\n degraded: boolean;\n /** Why the last sign-in failed or the session ended. */\n error: CommentsError | null;\n /** Opens the forum's sign-in popup; call it from a click handler so it is not blocked. */\n signIn(options?: SignInOptions): Promise<Commenter | null>;\n cancelSignIn(): void;\n signOut(): Promise<void>;\n}\n\n/** The signed-in reader of the provider's forum (or of `forum`). */\nexport function useCommenter(options: { forum?: string } = {}): CommenterState {\n const { client } = useCommentsContext(options.forum);\n const { config } = useConfig(client);\n return useCommenterFor(client, config);\n}\n\nexport function useCommenterFor(client: CommentsClient, config: Config | null): CommenterState {\n const { auth } = client;\n const subscribe = useCallback((onChange: () => void) => auth.onChange(onChange), [auth]);\n const getState = useCallback(() => auth.state(), [auth]);\n const state = useSyncExternalStore(subscribe, getState, getState);\n const actions = useMemo(\n () => ({\n signIn: (signInOptions?: SignInOptions) => auth.signIn(signInOptions),\n cancelSignIn: () => auth.cancelSignIn(),\n signOut: () => auth.signOut(),\n }),\n [auth],\n );\n const providers = config?.auth_providers ?? auth.providers;\n\n return useMemo(\n () => ({\n user: state.user,\n status: state.status,\n providers,\n degraded: state.degraded,\n error: state.error,\n ...actions,\n }),\n [state, providers, actions],\n );\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type { CommentsClient, OpenThreadOptions } from \"../../core/client\";\nimport { currentUrlWithoutHash } from \"../../core/env\";\nimport type { ThreadHandle, ThreadSnapshot } from \"../../core/thread\";\nimport type { CommentsError } from \"../../errors\";\nimport { useCommentsContext } from \"../context\";\nimport { toCommentsError } from \"../util\";\n\nexport interface UseThreadOptions extends OpenThreadOptions {\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n}\n\nexport interface UseThreadResult {\n /** `null` until the thread has been opened. */\n thread: ThreadHandle | null;\n /** Re-rendered on every change; `null` until the thread has been opened. */\n snapshot: ThreadSnapshot | null;\n /** Why the thread could not be opened; load failures live in `snapshot.error`. */\n error: CommentsError | null;\n /** Opens the thread again after `error`, or reloads it after a failed load. */\n retry(): void;\n}\n\n/**\n * Opens the page's thread and keeps a live snapshot of it. The handle is\n * disposed on unmount and reopened when `identifier`, `url` or (without `url`)\n * the page address changes; `sort` changes reload the same handle.\n */\nexport function useThread(options: UseThreadOptions = {}): UseThreadResult {\n const { client } = useCommentsContext(options.forum);\n return useThreadFor(client, options);\n}\n\nexport function useThreadFor(\n client: CommentsClient,\n { identifier, url, title, sort }: OpenThreadOptions,\n onOpenError?: (error: CommentsError) => void,\n): UseThreadResult {\n const [attempt, setAttempt] = useState(0);\n const [opened, setOpened] = useState<{ thread: ThreadHandle | null; error: CommentsError | null }>(\n { thread: null, error: null },\n );\n // Without an explicit url the thread follows the address bar (SPA navigation);\n // the hash is left out so deep links do not reopen it.\n const pageKey = url === undefined ? (currentUrlWithoutHash() ?? \"\") : \"\";\n const latest = useRef({ title, sort, onOpenError });\n latest.current = { title, sort, onOpenError };\n const requestedSort = useRef(sort);\n\n useEffect(() => {\n let active = true;\n let handle: ThreadHandle | null = null;\n setOpened((current) => (current.thread || current.error ? { thread: null, error: null } : current));\n // A microtask later, effects higher in the tree have set the page's title\n // and canonical link, which `open` reads by default.\n queueMicrotask(() => {\n if (!active) {\n return;\n }\n const { title: openTitle, sort: openSort } = latest.current;\n requestedSort.current = openSort;\n client.threads.open({ identifier, url, title: openTitle, sort: openSort }).then(\n (thread) => {\n if (!active) {\n thread.dispose();\n return;\n }\n handle = thread;\n setOpened({ thread, error: null });\n },\n (error: unknown) => {\n if (active) {\n const failure = toCommentsError(error);\n setOpened({ thread: null, error: failure });\n latest.current.onOpenError?.(failure);\n }\n },\n );\n });\n return () => {\n active = false;\n handle?.dispose();\n };\n }, [client, identifier, url, pageKey, attempt]);\n\n const { thread } = opened;\n\n useEffect(() => {\n if (thread && sort !== undefined && sort !== requestedSort.current) {\n requestedSort.current = sort;\n void thread.setSort(sort).catch(() => {});\n }\n }, [thread, sort]);\n\n const subscribe = useCallback(\n (onChange: () => void) => (thread ? thread.subscribe(onChange) : () => {}),\n [thread],\n );\n const getSnapshot = useCallback(() => thread?.snapshot() ?? null, [thread]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const retry = useCallback(() => {\n if (thread) {\n void thread.load().catch(() => {});\n } else {\n setAttempt((count) => count + 1);\n }\n }, [thread]);\n\n return { thread, snapshot, error: opened.error, retry };\n}\n","import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { PACKAGE_NAME, STORAGE_PREFIX } from \"../constants\";\nimport type { CommentsClient, OpenThreadOptions } from \"../core/client\";\nimport type { PostResult, ThreadHandle, ThreadSnapshot } from \"../core/thread\";\nimport { findComment } from \"../core/tree\";\nimport type { CommentsError } from \"../errors\";\nimport { createTranslator, type SupportedLocale, resolveLocale, type Translator } from \"../messages\";\nimport type { AnyThread, Comment, Config } from \"../types\";\nimport {\n type Appearance,\n cx,\n type ElementClasses,\n mergeAppearance,\n type Theme,\n variablesStyle,\n} from \"./appearance\";\nimport { useCommentsContext, useOptionalCommentsContext } from \"./context\";\nimport type { CommentsAction, CommentsEvent } from \"./events\";\nimport { type CommenterState, useCommenterFor } from \"./hooks/use-commenter\";\nimport { useConfig } from \"./hooks/use-config\";\nimport { useThreadFor } from \"./hooks/use-thread\";\nimport { toCommentsError } from \"./util\";\n\n/**\n * Where signing in happens: `inline` shows a \"Join the conversation\" panel,\n * `on-submit` lets anonymous readers write and signs them in when they post,\n * `manual` leaves it to the site (`useCommenter().signIn()`).\n */\nexport type SignInMode = \"inline\" | \"on-submit\" | \"manual\";\n\nexport interface CommentsProps extends OpenThreadOptions {\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n /** Visual nesting levels; deeper replies collapse into \"Continue this thread\". */\n maxDepth?: number;\n signIn?: SignInMode;\n /**\n * With `signIn=\"manual\"`, called when an anonymous reader tries to like or\n * reply, so the site can start its own sign-in. Without it those actions are\n * unavailable to anonymous readers in manual mode.\n */\n onSignInRequired?: () => void;\n /** Hides every write action. */\n readOnly?: boolean;\n /** Comment id to scroll to and highlight; defaults to the `#gc-<id>` fragment. */\n highlight?: number | null;\n /** Shown above the composer; defaults to the forum's setting. */\n guidelinesUrl?: string;\n onPosted?: (result: PostResult) => void;\n appearance?: Appearance;\n /** Renders without the default styles; class names stay for targeting. */\n unstyled?: boolean;\n theme?: Theme;\n locale?: string;\n className?: string;\n}\n\nexport interface RootProps extends CommentsProps {\n children?: ReactNode;\n}\n\nexport interface FocusView {\n /** The comment shown as the top of the focused branch. */\n id: number;\n ancestors: readonly Comment[];\n truncated: boolean;\n}\n\nexport interface RootContextValue {\n client: CommentsClient;\n t: Translator;\n locale: SupportedLocale;\n thread: ThreadHandle | null;\n snapshot: ThreadSnapshot | null;\n /** Why the thread could not be opened. */\n openError: CommentsError | null;\n retry(): void;\n config: Config | null;\n configError: CommentsError | null;\n commenter: CommenterState;\n maxDepth: number;\n signInMode: SignInMode;\n readOnly: boolean;\n guidelinesUrl: string | null;\n debug: boolean;\n elements: ElementClasses;\n /** False when the site or the forum made the widget read-only. */\n writable: boolean;\n /** Whether the main composer is shown. */\n canCompose: boolean;\n /** Signed in, but the forum does not let this reader comment here. */\n commentingDenied: boolean;\n /** Whether \"Reply\" is offered (it may start a sign-in). */\n canReply: boolean;\n /** An anonymous reader's like or reply can lead to a sign-in (popup, or the site's own). */\n canRequestSignIn: boolean;\n focusView: FocusView | null;\n continueThread(commentId: number): Promise<void>;\n closeFocusView(): void;\n highlightId: number | null;\n /** Moves focus to a comment once it is rendered. */\n focusComment(commentId: number, options?: { scroll?: boolean }): void;\n /**\n * Resolves `true` once a reader is signed in; must be called from a click\n * handler. In manual mode it only notifies the site and resolves `false`.\n */\n ensureSignedIn(): Promise<boolean>;\n reportError(action: CommentsAction, error: unknown): void;\n emit(event: CommentsEvent): void;\n onPosted: ((result: PostResult) => void) | undefined;\n /** Storage key for a composer draft in this thread, or `null` before the thread is open. */\n draftKey(scope: string): string | null;\n}\n\nconst RootContext = createContext<RootContextValue | null>(null);\n\nexport function useRootContext(component = \"This component\"): RootContextValue {\n const value = useContext(RootContext);\n if (!value) {\n throw new Error(`${PACKAGE_NAME}: ${component} must be rendered inside <Comments.Root>`);\n }\n return value;\n}\n\n/**\n * Opens the thread and provides it to the primitives inside. Without a\n * provider or `forum` nothing can be opened, so it renders a quiet notice\n * instead of throwing (a consumer's tests may mount pages without one).\n */\nexport function Root(props: RootProps) {\n const context = useOptionalCommentsContext(props.forum);\n if (!context) {\n return (\n <section className={cx(\"gc-root\", \"gc-root--unconfigured\", props.className)} data-gc-unconfigured=\"\">\n <p className=\"gc-notice\">{`${PACKAGE_NAME}: render <Comments> inside <DiscourseComments forum=\"…\"> or pass a forum prop.`}</p>\n </section>\n );\n }\n return <ConfiguredRoot {...props} />;\n}\n\nfunction ConfiguredRoot(props: RootProps) {\n const {\n forum,\n identifier,\n url,\n title,\n sort,\n maxDepth = 2,\n signIn: signInMode = \"inline\",\n onSignInRequired,\n readOnly = false,\n highlight,\n guidelinesUrl,\n onPosted,\n appearance,\n unstyled = false,\n theme: themeProp,\n locale: localeProp,\n className,\n children,\n } = props;\n const context = useCommentsContext(forum);\n const { client, emit } = context;\n const rootRef = useRef<HTMLElement>(null);\n\n const t = useMemo(\n () => (localeProp ? createTranslator(localeProp, context.messages) : context.t),\n [localeProp, context.messages, context.t],\n );\n const locale = localeProp ? resolveLocale(localeProp) : context.locale;\n const theme = themeProp ?? context.theme;\n const { variables, elements } = useMemo(\n () => mergeAppearance(context.appearance, appearance),\n [context.appearance, appearance],\n );\n\n const threadIdRef = useRef<string | undefined>(undefined);\n const reportError = useCallback(\n (action: CommentsAction, error: unknown) =>\n emit({ type: \"error\", action, error: toCommentsError(error), threadId: threadIdRef.current }),\n [emit],\n );\n\n const { thread, snapshot, error: openError, retry: retryThread } = useThreadFor(\n client,\n { identifier, url, title, sort },\n (error) => reportError(\"open\", error),\n );\n threadIdRef.current = thread?.id;\n const { config, error: configError, reload: reloadConfig } = useConfig(client);\n const commenter = useCommenterFor(client, config);\n const retry = useCallback(() => {\n retryThread();\n if (configError) {\n reloadConfig();\n }\n }, [retryThread, configError, reloadConfig]);\n\n const loadError = snapshot?.status === \"error\" ? snapshot.error : null;\n useEffect(() => {\n if (loadError) {\n reportError(\"load\", loadError);\n }\n }, [loadError, reportError]);\n\n // `can_comment` is per reader; until the thread is reloaded for a reader who\n // just signed in, the anonymous value would hide the composer mid-post.\n const userId = commenter.user?.id ?? null;\n const [authEpoch, setAuthEpoch] = useState<{ userId: number | null; thread: AnyThread | null }>(\n { userId, thread: null },\n );\n if (authEpoch.userId !== userId) {\n setAuthEpoch({ userId, thread: snapshot?.thread ?? null });\n }\n const permissionsFresh = !!snapshot && snapshot.thread !== authEpoch.thread;\n\n const signedIn = commenter.status === \"signed-in\";\n const closed = snapshot?.thread.closed ?? false;\n const writable = !readOnly && !commenter.degraded;\n const open = !!snapshot && snapshot.status !== \"error\" && writable && !closed;\n const commentingDenied =\n open && signedIn && permissionsFresh && !snapshot.thread.can_comment;\n const canCompose = open && !commentingDenied && (signedIn || signInMode === \"on-submit\");\n const canReply = open && !commentingDenied;\n\n const [focusView, setFocusView] = useState<FocusView | null>(null);\n // Every request that changes the focused branch takes a number; late answers to older ones are dropped.\n const viewRequest = useRef(0);\n const [highlightId, setHighlightId] = useState<number | null>(null);\n const focusRequest = useRef<{ id: number; scroll: boolean } | null>(null);\n const [, setFocusTick] = useState(0);\n\n const focusComment = useCallback((commentId: number, options?: { scroll?: boolean }) => {\n focusRequest.current = { id: commentId, scroll: options?.scroll ?? false };\n setFocusTick((tick) => tick + 1);\n }, []);\n\n // Runs after every render: a requested comment may only appear a render later.\n useEffect(() => {\n const request = focusRequest.current;\n const element = request && rootRef.current?.querySelector<HTMLElement>(`#gc-${request.id}`);\n if (!request || !element) {\n return;\n }\n focusRequest.current = null;\n if (request.scroll) {\n element.scrollIntoView?.({ block: \"center\" });\n }\n element.focus({ preventScroll: request.scroll });\n });\n\n useEffect(() => {\n viewRequest.current++;\n setFocusView(null);\n }, [thread]);\n\n const continueThread = useCallback(\n async (commentId: number) => {\n if (!thread) {\n return;\n }\n const request = ++viewRequest.current;\n try {\n const context = await thread.context(commentId);\n if (request !== viewRequest.current) {\n return;\n }\n setFocusView({\n id: commentId,\n ancestors: context.ancestors,\n truncated: context.ancestorsTruncated,\n });\n focusComment(commentId);\n } catch (error) {\n if (request === viewRequest.current) {\n reportError(\"context\", error);\n }\n }\n },\n [thread, focusComment, reportError],\n );\n\n const closeFocusView = useCallback(() => {\n viewRequest.current++;\n if (focusView) {\n focusComment(focusView.id);\n }\n setFocusView(null);\n }, [focusView, focusComment]);\n\n const hashId = useHashCommentId();\n const requestedHighlight = highlight ?? hashId;\n const handledHighlight = useRef<{ thread: ThreadHandle; id: number } | null>(null);\n const ready = snapshot?.status === \"ready\";\n\n useEffect(() => {\n const handled = handledHighlight.current;\n if (\n !thread ||\n !ready ||\n requestedHighlight === null ||\n (handled?.thread === thread && handled.id === requestedHighlight)\n ) {\n return;\n }\n handledHighlight.current = { thread, id: requestedHighlight };\n const id = requestedHighlight;\n const request = ++viewRequest.current;\n void (async () => {\n let location = findComment(thread.snapshot().comments, id);\n if (!location) {\n try {\n await thread.context(id);\n } catch (error) {\n if (request === viewRequest.current) {\n reportError(\"context\", error);\n }\n return;\n }\n location = findComment(thread.snapshot().comments, id);\n }\n if (!location || request !== viewRequest.current) {\n return;\n }\n // Every request replaces the focused branch: shallow targets render in the main tree.\n if (location.depth > maxDepth) {\n const cut = location.depth - maxDepth;\n const tree = thread.snapshot().comments;\n const ancestors = location.path\n .slice(0, cut)\n .map((ancestorId) => findComment(tree, ancestorId)?.node)\n .filter((node): node is Comment => node !== undefined);\n setFocusView({ id: location.path[cut]!, ancestors, truncated: false });\n } else {\n setFocusView(null);\n }\n setHighlightId(id);\n focusComment(id, { scroll: true });\n })();\n }, [thread, ready, requestedHighlight, maxDepth, focusComment, reportError]);\n\n const onSignInRequiredRef = useRef(onSignInRequired);\n onSignInRequiredRef.current = onSignInRequired;\n const canRequestSignIn = signInMode !== \"manual\" || onSignInRequired !== undefined;\n\n const ensureSignedIn = useCallback((): Promise<boolean> => {\n if (client.auth.status === \"signed-in\") {\n return Promise.resolve(true);\n }\n // Manual mode never opens the forum's popup: the site owns sign-in.\n if (signInMode === \"manual\") {\n onSignInRequiredRef.current?.();\n return Promise.resolve(false);\n }\n return client.auth.signIn().then(\n (user) => user !== null,\n () => false,\n );\n }, [client, signInMode]);\n\n const threadKey = snapshot?.thread.key;\n const draftKey = useCallback(\n (scope: string) =>\n threadKey === undefined ? null : `${STORAGE_PREFIX}:${client.forum}:draft:${threadKey}:${scope}`,\n [client.forum, threadKey],\n );\n\n const value: RootContextValue = {\n client,\n t,\n locale,\n thread,\n snapshot,\n openError,\n retry,\n config,\n configError,\n commenter,\n maxDepth,\n signInMode,\n readOnly,\n guidelinesUrl: guidelinesUrl ?? config?.guidelines_url ?? null,\n debug: context.debug,\n elements,\n writable,\n canCompose,\n commentingDenied,\n canReply,\n canRequestSignIn,\n focusView,\n continueThread,\n closeFocusView,\n highlightId,\n focusComment,\n ensureSignedIn,\n reportError,\n emit,\n onPosted,\n draftKey,\n };\n\n return (\n <RootContext.Provider value={value}>\n <section\n ref={rootRef}\n className={cx(\"gc-root\", !unstyled && \"gc-root--styled\", elements.root, className)}\n data-gc-theme={theme === \"inherit\" ? undefined : theme}\n style={variablesStyle(variables)}\n aria-label={t(\"comments\")}\n aria-busy={!snapshot && !openError ? true : undefined}\n >\n {children}\n </section>\n </RootContext.Provider>\n );\n}\n\nfunction useHashCommentId(): number | null {\n const [id, setId] = useState<number | null>(null);\n useEffect(() => {\n const read = () => {\n const match = /^#gc-(\\d+)$/.exec(window.location.hash);\n setId(match ? Number(match[1]) : null);\n };\n read();\n window.addEventListener(\"hashchange\", read);\n return () => window.removeEventListener(\"hashchange\", read);\n }, []);\n return id;\n}\n","// Pure textarea edits for the composer toolbar, mentions and uploads.\nimport type { Upload } from \"../../types\";\n\nexport interface TextEdit {\n value: string;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport type Format = \"bold\" | \"italic\" | \"link\" | \"code\" | \"quote\";\n\nexport function applyFormat(value: string, start: number, end: number, format: Format): TextEdit {\n const selected = value.slice(start, end);\n switch (format) {\n case \"bold\":\n return wrap(value, start, end, \"**\", \"**\");\n case \"italic\":\n return wrap(value, start, end, \"*\", \"*\");\n case \"code\":\n return selected.includes(\"\\n\") ? fence(value, start, end) : wrap(value, start, end, \"`\", \"`\");\n case \"link\": {\n // The URL placeholder is selected so typing replaces it.\n const url = \"https://\";\n const urlStart = start + selected.length + 3;\n return {\n value: `${value.slice(0, start)}[${selected}](${url})${value.slice(end)}`,\n selectionStart: urlStart,\n selectionEnd: urlStart + url.length,\n };\n }\n case \"quote\":\n return quote(value, start, end);\n }\n}\n\nexport function insertText(value: string, start: number, end: number, text: string): TextEdit {\n const caret = start + text.length;\n return {\n value: value.slice(0, start) + text + value.slice(end),\n selectionStart: caret,\n selectionEnd: caret,\n };\n}\n\n/** Discourse's upload markdown: ``. */\nexport function imageMarkdown(upload: Upload): string {\n const name = upload.original_filename.replace(/\\.[^.]+$/, \"\").replace(/[[\\]|]/g, \"\");\n const size = upload.width && upload.height ? `|${upload.width}x${upload.height}` : \"\";\n return ``;\n}\n\nexport interface MentionQuery {\n /** Index of the `@`. */\n start: number;\n query: string;\n}\n\n/** The `@partial` username right before the caret, if any. */\nexport function mentionQuery(value: string, caret: number): MentionQuery | null {\n const match = /(?:^|[\\s([{])@([\\w.-]{1,60})$/.exec(value.slice(0, caret));\n if (!match) {\n return null;\n }\n const query = match[1]!;\n return { start: caret - query.length - 1, query };\n}\n\nfunction wrap(value: string, start: number, end: number, before: string, after: string): TextEdit {\n return {\n value: value.slice(0, start) + before + value.slice(start, end) + after + value.slice(end),\n selectionStart: start + before.length,\n selectionEnd: end + before.length,\n };\n}\n\nfunction fence(value: string, start: number, end: number): TextEdit {\n const before = start > 0 && value[start - 1] !== \"\\n\" ? \"\\n\" : \"\";\n const open = `${before}\\`\\`\\`\\n`;\n const close = \"\\n```\\n\";\n return {\n value: value.slice(0, start) + open + value.slice(start, end) + close + value.slice(end),\n selectionStart: start + open.length,\n selectionEnd: end + open.length,\n };\n}\n\nfunction quote(value: string, start: number, end: number): TextEdit {\n const lineStart = value.lastIndexOf(\"\\n\", start - 1) + 1;\n const lines = value.slice(lineStart, end).split(\"\\n\");\n const quoted = lines.map((line) => `> ${line}`).join(\"\\n\");\n return {\n value: value.slice(0, lineStart) + quoted + value.slice(end),\n selectionStart: start + 2,\n selectionEnd: end + 2 * lines.length,\n };\n}\n","import { type KeyboardEvent, useCallback, useEffect, useState } from \"react\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { Commenter } from \"../../types\";\nimport { type MentionQuery, mentionQuery } from \"./markdown\";\n\nconst SEARCH_DELAY_MS = 150;\n\nexport interface Mentions {\n open: boolean;\n users: readonly Commenter[];\n active: number;\n setActive(index: number): void;\n /** Returns true when the key was handled by the suggestion list. */\n onKeyDown(event: KeyboardEvent<HTMLTextAreaElement>): boolean;\n pick(index: number): void;\n}\n\n/** `@username` autocomplete for the composer textarea. */\nexport function useMentions(options: {\n client: CommentsClient;\n threadId: string;\n enabled: boolean;\n value: string;\n caret: number;\n onPick(query: MentionQuery, username: string): void;\n}): Mentions {\n const { client, threadId, enabled, value, caret, onPick } = options;\n const query = enabled ? mentionQuery(value, caret) : null;\n const [results, setResults] = useState<{ query: string; users: readonly Commenter[] }>({\n query: \"\",\n users: [],\n });\n const [active, setActive] = useState(0);\n const [dismissed, setDismissed] = useState<string | null>(null);\n const queryKey = query ? `${query.start}:${query.query}` : null;\n\n useEffect(() => {\n if (!query) {\n return;\n }\n let current = true;\n const timer = setTimeout(() => {\n client.mentions(query.query, threadId).then(\n (users) => {\n if (current) {\n setResults({ query: query.query, users });\n setActive(0);\n }\n },\n () => {},\n );\n }, SEARCH_DELAY_MS);\n return () => {\n current = false;\n clearTimeout(timer);\n };\n }, [client, threadId, query?.query]);\n\n const open =\n query !== null &&\n results.query === query.query &&\n results.users.length > 0 &&\n dismissed !== queryKey;\n\n const pick = useCallback(\n (index: number) => {\n const user = results.users[index];\n if (query && user) {\n onPick(query, user.username);\n }\n },\n [results.users, query, onPick],\n );\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!open) {\n return false;\n }\n const count = results.users.length;\n switch (event.key) {\n case \"ArrowDown\":\n setActive((index) => (index + 1) % count);\n break;\n case \"ArrowUp\":\n setActive((index) => (index - 1 + count) % count);\n break;\n case \"Enter\":\n case \"Tab\":\n if (event.metaKey || event.ctrlKey) {\n return false;\n }\n pick(active);\n break;\n case \"Escape\":\n setDismissed(queryKey);\n break;\n default:\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n return true;\n };\n\n return { open, users: results.users, active, setActive, onKeyDown, pick };\n}\n","import {\n type ChangeEvent,\n type ClipboardEvent,\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createComposerTimer } from \"../../core/composer\";\nimport type { ThreadHandle } from \"../../core/thread\";\nimport type { CommentsError } from \"../../errors\";\nimport type { MessageKey, Translator } from \"../../messages\";\nimport type { Comment } from \"../../types\";\nimport { cx } from \"../appearance\";\nimport {\n BoldIcon,\n CodeIcon,\n ImageIcon,\n ItalicIcon,\n LinkIcon,\n QuoteIcon,\n} from \"../icons\";\nimport { type RootContextValue, useRootContext } from \"../root\";\nimport {\n readDraft,\n rootNodeOf,\n toCommentsError,\n useIsomorphicLayoutEffect,\n writeDraft,\n} from \"../util\";\nimport {\n applyFormat,\n type Format,\n imageMarkdown,\n insertText,\n type MentionQuery,\n type TextEdit,\n} from \"./markdown\";\nimport { useMentions } from \"./use-mentions\";\n\nexport interface ComposerProps {\n /** Replies to this comment (the inline reply composer). */\n replyTo?: Comment;\n /** Edits this comment; its markdown is loaded from the forum. */\n editing?: Comment;\n placeholder?: string;\n autoFocus?: boolean;\n /** Called after a successful post or save, and when the reader cancels. */\n onDone?: () => void;\n className?: string;\n}\n\n/**\n * The markdown composer. Without `replyTo`/`editing` it is the thread's main\n * composer and renders only when the reader may write (or may sign in on submit).\n */\nexport function Composer(props: ComposerProps) {\n const root = useRootContext(\"Comments.Composer\");\n if (!root.thread || !root.snapshot || !composerAllowed(root, props.editing)) {\n return null;\n }\n return <ComposerForm {...props} thread={root.thread} />;\n}\n\n/** Re-checked on every render, so a composer disappears when the reader loses the right to write. */\nfunction composerAllowed(root: RootContextValue, editing: Comment | undefined): boolean {\n if (editing) {\n return root.writable && root.commenter.status === \"signed-in\" && editing.can.edit;\n }\n return root.canCompose;\n}\n\nconst FORMATS: ReadonlyArray<{ format: Format; label: MessageKey; icon: ReactNode }> = [\n { format: \"bold\", label: \"bold\", icon: <BoldIcon /> },\n { format: \"italic\", label: \"italic\", icon: <ItalicIcon /> },\n { format: \"link\", label: \"insertLink\", icon: <LinkIcon /> },\n { format: \"code\", label: \"code\", icon: <CodeIcon /> },\n { format: \"quote\", label: \"quote\", icon: <QuoteIcon /> },\n];\n\nfunction ComposerForm({\n replyTo,\n editing,\n placeholder,\n autoFocus,\n onDone,\n className,\n thread,\n}: ComposerProps & { thread: ThreadHandle }) {\n const root = useRootContext();\n const { t, client, config, commenter, elements } = root;\n const id = useId();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const pendingSelection = useRef<[number, number] | null>(null);\n const [timer] = useState(createComposerTimer);\n\n const draftKey = editing ? null : root.draftKey(replyTo ? `reply:${replyTo.id}` : \"root\");\n const [value, setValueState] = useState(() => (draftKey ? readDraft(draftKey) : \"\"));\n const valueRef = useRef(value);\n valueRef.current = value;\n const [caret, setCaret] = useState(0);\n // Saving an edit before the original markdown arrived would overwrite text the reader never saw.\n const [raw, setRaw] = useState<\"loading\" | \"loaded\" | \"failed\">(editing ? \"loading\" : \"loaded\");\n const [rawAttempt, setRawAttempt] = useState(0);\n const [tab, setTab] = useState<\"write\" | \"preview\">(\"write\");\n const [preview, setPreview] = useState<{ html: string | null; loading: boolean; failed: boolean }>(\n { html: null, loading: false, failed: false },\n );\n const previewRequest = useRef(0);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<CommentsError | null>(null);\n const [uploading, setUploading] = useState(0);\n const [waitSeconds, startCountdown] = useCountdown();\n // A submission waiting for sign-in only posts if nothing invalidated it meanwhile.\n const submission = useRef(0);\n const allowedRef = useRef(true);\n allowedRef.current = composerAllowed(root, editing);\n\n const setValue = useCallback(\n (next: string, selection?: [number, number]) => {\n valueRef.current = next;\n setValueState(next);\n if (draftKey) {\n writeDraft(draftKey, next);\n }\n if (selection) {\n pendingSelection.current = selection;\n }\n },\n [draftKey],\n );\n\n const applyEdit = useCallback(\n (edit: TextEdit) => setValue(edit.value, [edit.selectionStart, edit.selectionEnd]),\n [setValue],\n );\n\n useIsomorphicLayoutEffect(() => {\n const selection = pendingSelection.current;\n const textarea = textareaRef.current;\n if (selection && textarea) {\n pendingSelection.current = null;\n textarea.focus();\n textarea.setSelectionRange(selection[0], selection[1]);\n setCaret(selection[1]);\n }\n });\n\n useEffect(() => {\n const textarea = textareaRef.current;\n if (autoFocus && !editing && textarea) {\n const end = valueRef.current.length;\n textarea.focus();\n textarea.setSelectionRange(end, end);\n setCaret(end);\n }\n }, [autoFocus, editing]);\n\n useEffect(\n () => () => {\n submission.current++;\n },\n [thread],\n );\n\n const editingId = editing?.id;\n useEffect(() => {\n if (editingId === undefined) {\n return;\n }\n let active = true;\n setRaw(\"loading\");\n setError(null);\n thread.raw(editingId).then(\n (source) => {\n if (active) {\n setValue(source, [source.length, source.length]);\n setRaw(\"loaded\");\n }\n },\n (failure: unknown) => {\n if (active) {\n setError(toCommentsError(failure));\n setRaw(\"failed\");\n }\n },\n );\n return () => {\n active = false;\n };\n }, [thread, editingId, setValue, rawAttempt]);\n\n useEffect(() => {\n if (waitSeconds === 0) {\n setError((current) => (current?.type === \"rate_limit\" ? null : current));\n }\n }, [waitSeconds]);\n\n const signedIn = commenter.status === \"signed-in\";\n const signingIn = commenter.status === \"signing-in\";\n const uploadsEnabled = signedIn && config?.features.uploads === true;\n const min = Math.max(config?.limits.min_post_length ?? 1, 1);\n const max = config?.limits.max_post_length ?? Number.POSITIVE_INFINITY;\n const length = value.trim().length;\n const tooShort = length > 0 && length < min;\n const tooLong = length > max;\n const loadingRaw = raw === \"loading\";\n const editable = raw === \"loaded\" && !submitting;\n const busy = submitting || raw !== \"loaded\" || uploading > 0 || waitSeconds > 0 || signingIn;\n const canSubmit = !busy && length >= min && !tooLong;\n\n const onPickMention = useCallback(\n (query: MentionQuery, username: string) =>\n applyEdit(insertText(valueRef.current, query.start, caret, `@${username} `)),\n [applyEdit, caret],\n );\n const mentions = useMentions({\n client,\n threadId: thread.id,\n enabled: signedIn && config?.features.mentions !== false && tab === \"write\" && editable,\n value,\n caret,\n onPick: onPickMention,\n });\n\n async function send() {\n if (!allowedRef.current) {\n return;\n }\n const body = valueRef.current;\n setSubmitting(true);\n setError(null);\n try {\n if (editing) {\n await thread.edit(editing.id, body);\n onDone?.();\n return;\n }\n const result = await thread.post({ body, replyTo: replyTo?.id, composer: timer });\n // Anything that changed the text while the request ran stays in the composer.\n if (valueRef.current === body) {\n setValue(\"\");\n }\n setTab(\"write\");\n if (result.type === \"created\") {\n root.emit({ type: \"comment.posted\", threadId: thread.id, comment: result.comment });\n if (replyTo) {\n root.focusComment(result.comment.id);\n }\n } else {\n root.emit({ type: \"comment.pending\", threadId: thread.id, pending: result.pending });\n }\n root.onPosted?.(result);\n onDone?.();\n } catch (failure) {\n const commentsError = toCommentsError(failure);\n if (commentsError.type === \"rate_limit\" && commentsError.waitSeconds) {\n startCountdown(commentsError.waitSeconds);\n }\n setError(commentsError);\n root.reportError(editing ? \"edit\" : \"post\", commentsError);\n } finally {\n setSubmitting(false);\n }\n }\n\n function submit() {\n if (!canSubmit) {\n return;\n }\n if (signedIn) {\n void send();\n return;\n }\n if (root.signInMode === \"on-submit\") {\n const token = ++submission.current;\n setError(null);\n // Started synchronously so the popup counts as part of the click or key press.\n client.auth.signIn().then(\n (user) => {\n if (user && token === submission.current) {\n void send();\n }\n },\n (failure: unknown) => {\n const signInError = toCommentsError(failure);\n // The inline panel is hidden in this mode, so the composer reports the failure.\n if (token === submission.current && signInError.type !== \"cancelled\") {\n setError(signInError);\n }\n },\n );\n }\n }\n\n function cancel() {\n submission.current++;\n onDone?.();\n }\n\n function format(kind: Format) {\n const textarea = textareaRef.current;\n const start = textarea?.selectionStart ?? valueRef.current.length;\n const end = textarea?.selectionEnd ?? start;\n applyEdit(applyFormat(valueRef.current, start, end, kind));\n }\n\n async function upload(files: readonly File[], pasted = false) {\n for (const file of files.filter((candidate) => candidate.type.startsWith(\"image/\"))) {\n setUploading((count) => count + 1);\n try {\n const uploaded = await client.attachments.upload(thread.id, file, { pasted });\n const textarea = textareaRef.current;\n const current = valueRef.current;\n const start = textarea?.selectionStart ?? current.length;\n const end = textarea?.selectionEnd ?? start;\n const before = start > 0 && current[start - 1] !== \"\\n\" ? \"\\n\" : \"\";\n applyEdit(insertText(current, start, end, `${before}${imageMarkdown(uploaded)}\\n`));\n } catch (failure) {\n setError(toCommentsError(failure));\n root.reportError(\"upload\", failure);\n } finally {\n setUploading((count) => count - 1);\n }\n }\n }\n\n function showPreview() {\n setTab(\"preview\");\n const body = valueRef.current;\n const request = ++previewRequest.current;\n if (!body.trim()) {\n setPreview({ html: null, loading: false, failed: false });\n return;\n }\n setPreview({ html: null, loading: true, failed: false });\n client.preview(body).then(\n (html) => {\n if (request === previewRequest.current) {\n setPreview({ html, loading: false, failed: false });\n }\n },\n (failure: unknown) => {\n if (request === previewRequest.current) {\n setPreview({ html: null, loading: false, failed: true });\n root.reportError(\"preview\", failure);\n }\n },\n );\n }\n\n function onChange(event: ChangeEvent<HTMLTextAreaElement>) {\n timer.typing();\n setValue(event.target.value);\n setCaret(event.target.selectionStart);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (mentions.onKeyDown(event)) {\n return;\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n submit();\n } else if (event.key === \"Escape\" && (replyTo || editing)) {\n event.preventDefault();\n cancel();\n }\n }\n\n function onPaste(event: ClipboardEvent<HTMLTextAreaElement>) {\n const files = [...event.clipboardData.files];\n if (uploadsEnabled && editable && files.some((file) => file.type.startsWith(\"image/\"))) {\n event.preventDefault();\n void upload(files, true);\n }\n }\n\n function onDragOver(event: DragEvent<HTMLTextAreaElement>) {\n if (uploadsEnabled && editable && event.dataTransfer.types.includes(\"Files\")) {\n event.preventDefault();\n }\n }\n\n function onDrop(event: DragEvent<HTMLTextAreaElement>) {\n const files = [...event.dataTransfer.files];\n if (uploadsEnabled && editable && files.length > 0) {\n event.preventDefault();\n void upload(files);\n }\n }\n\n function onTabKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (tab === \"write\") {\n showPreview();\n } else {\n setTab(\"write\");\n }\n rootNodeOf(event.currentTarget)\n .getElementById(`${id}-${tab === \"write\" ? \"preview\" : \"write\"}-tab`)\n ?.focus();\n }\n }\n\n const label = editing\n ? t(\"editing\")\n : replyTo\n ? t(\"replyingTo\", { username: replyTo.author?.username ?? \"\" })\n : t(\"composerPlaceholder\");\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const listId = `${id}-mentions`;\n const messages = error ? errorMessages(error, waitSeconds, t) : [];\n const submitLabel = editing ? t(\"save\") : replyTo ? t(\"reply\") : t(\"post\");\n const defaultPlaceholder = editing\n ? undefined\n : replyTo\n ? t(\"replyPlaceholder\")\n : t(\"composerPlaceholder\");\n const hint = tooLong ? t(\"tooLong\", { max }) : tooShort ? t(\"tooShort\", { min }) : null;\n const canPreview = signedIn;\n const isMain = !replyTo && !editing;\n\n return (\n <div\n className={cx(\n \"gc-composer\",\n replyTo && \"gc-composer--replying\",\n editing && \"gc-composer--editing\",\n elements.composer,\n className,\n )}\n >\n {isMain && root.guidelinesUrl && (\n <a\n className=\"gc-composer__guidelines\"\n href={root.guidelinesUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t(\"guidelines\")}\n </a>\n )}\n {!isMain && <p className=\"gc-composer__context\">{label}</p>}\n\n {canPreview && (\n <div className=\"gc-composer__tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n id={`${id}-write-tab`}\n className=\"gc-composer__tab\"\n aria-selected={tab === \"write\"}\n aria-controls={`${id}-write`}\n tabIndex={tab === \"write\" ? 0 : -1}\n onClick={() => setTab(\"write\")}\n onKeyDown={onTabKeyDown}\n >\n {t(\"write\")}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id={`${id}-preview-tab`}\n className=\"gc-composer__tab\"\n aria-selected={tab === \"preview\"}\n aria-controls={`${id}-preview`}\n tabIndex={tab === \"preview\" ? 0 : -1}\n onClick={showPreview}\n onKeyDown={onTabKeyDown}\n >\n {t(\"preview\")}\n </button>\n </div>\n )}\n\n <div\n className=\"gc-composer__panel\"\n id={`${id}-write`}\n role={canPreview ? \"tabpanel\" : undefined}\n aria-labelledby={canPreview ? `${id}-write-tab` : undefined}\n hidden={tab !== \"write\"}\n >\n {signedIn && (\n <div className={cx(\"gc-toolbar\", elements.toolbar)} role=\"group\" aria-label={t(\"formatting\")}>\n {FORMATS.map(({ format: kind, label: key, icon }) => (\n <button\n key={kind}\n type=\"button\"\n className=\"gc-toolbar__button\"\n aria-label={t(key)}\n title={t(key)}\n disabled={!editable}\n onClick={() => format(kind)}\n >\n {icon}\n </button>\n ))}\n {uploadsEnabled && (\n <>\n <button\n type=\"button\"\n className=\"gc-toolbar__button\"\n aria-label={t(\"upload\")}\n title={t(\"upload\")}\n disabled={!editable}\n onClick={() => fileRef.current?.click()}\n >\n <ImageIcon />\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n hidden\n onChange={(event) => {\n const files = [...(event.target.files ?? [])];\n event.target.value = \"\";\n void upload(files);\n }}\n />\n </>\n )}\n </div>\n )}\n <div className=\"gc-composer__field\">\n <textarea\n ref={textareaRef}\n className={cx(\"gc-composer__input\", elements.textarea)}\n value={value}\n placeholder={placeholder ?? defaultPlaceholder}\n aria-label={label}\n aria-describedby={cx(hint && hintId, messages.length > 0 && errorId) || undefined}\n aria-invalid={tooLong || undefined}\n aria-autocomplete={mentions.open ? \"list\" : undefined}\n aria-controls={mentions.open ? listId : undefined}\n aria-activedescendant={mentions.open ? `${listId}-${mentions.active}` : undefined}\n rows={isMain ? 3 : 2}\n disabled={raw !== \"loaded\"}\n readOnly={submitting}\n onChange={onChange}\n onSelect={(event) => setCaret(event.currentTarget.selectionStart)}\n onFocus={() => timer.start()}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onDragOver={onDragOver}\n onDrop={onDrop}\n />\n {mentions.open && (\n <ul className=\"gc-mentions\" role=\"listbox\" id={listId} aria-label={t(\"mentionSuggestions\")}>\n {mentions.users.map((user, index) => (\n <li\n key={user.id}\n id={`${listId}-${index}`}\n role=\"option\"\n aria-selected={index === mentions.active}\n className={cx(\n \"gc-mentions__option\",\n index === mentions.active && \"gc-mentions__option--active\",\n )}\n onMouseDown={(event) => {\n event.preventDefault();\n mentions.pick(index);\n }}\n onMouseEnter={() => mentions.setActive(index)}\n >\n <img className=\"gc-avatar gc-avatar--small\" src={user.avatar_url} alt=\"\" />\n <span className=\"gc-mentions__username\">@{user.username}</span>\n {user.name && <span className=\"gc-mentions__name\">{user.name}</span>}\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n\n {canPreview && (\n <div\n className=\"gc-composer__panel\"\n id={`${id}-preview`}\n role=\"tabpanel\"\n aria-labelledby={`${id}-preview-tab`}\n aria-busy={preview.loading || undefined}\n hidden={tab !== \"preview\"}\n >\n {preview.loading ? (\n <p className=\"gc-composer__status\">{t(\"loading\")}</p>\n ) : preview.failed ? (\n <p className=\"gc-composer__status\">{t(\"genericError\")}</p>\n ) : preview.html ? (\n <div\n className=\"gc-composer__preview gc-prose\"\n dangerouslySetInnerHTML={{ __html: preview.html }}\n />\n ) : (\n <p className=\"gc-composer__status\">{t(\"previewEmpty\")}</p>\n )}\n </div>\n )}\n\n <div className=\"gc-composer__footer\">\n <div className=\"gc-composer__messages\" aria-live=\"polite\">\n {loadingRaw && <p className=\"gc-composer__status\">{t(\"loading\")}</p>}\n {uploading > 0 && <p className=\"gc-composer__status\">{t(\"uploading\")}</p>}\n {signingIn && <p className=\"gc-composer__status\">{t(\"signingIn\")}</p>}\n {hint && (\n <p id={hintId} className=\"gc-composer__hint\">\n {hint}\n </p>\n )}\n {messages.length > 0 && (\n <div id={errorId} className=\"gc-composer__error\" role=\"alert\">\n {messages.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </div>\n )}\n </div>\n <div className=\"gc-composer__buttons\">\n {signingIn && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", elements.button)}\n onClick={() => client.auth.cancelSignIn()}\n >\n {t(\"signInCancel\")}\n </button>\n )}\n {raw === \"failed\" && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", elements.button)}\n onClick={() => setRawAttempt((count) => count + 1)}\n >\n {t(\"retry\")}\n </button>\n )}\n {!isMain && !signingIn && (\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={cancel}>\n {t(\"cancel\")}\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--primary\", elements.button, elements.primaryButton)}\n disabled={!canSubmit}\n aria-busy={submitting || undefined}\n onClick={submit}\n >\n {submitting && !editing ? t(\"posting\") : submitLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction errorMessages(error: CommentsError, waitSeconds: number, t: Translator): string[] {\n switch (error.type) {\n case \"rate_limit\":\n return waitSeconds > 0\n ? [t(\"rateLimited\", { count: waitSeconds })]\n : error.errors.slice(0, 1);\n case \"invalid_key\":\n case \"not_logged_in\":\n return [t(\"sessionExpired\")];\n case \"unreachable\":\n case \"unknown\":\n case \"cancelled\":\n return [t(\"genericError\")];\n default:\n return error.errors.length > 0 ? error.errors : [t(\"genericError\")];\n }\n}\n\n/** Seconds left until a rate-limited action may be retried. */\nfunction useCountdown(): [number, (seconds: number) => void] {\n const [until, setUntil] = useState(0);\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (until <= Date.now()) {\n return;\n }\n const timer = setInterval(() => {\n const at = Date.now();\n setNow(at);\n if (at >= until) {\n clearInterval(timer);\n }\n }, 250);\n return () => clearInterval(timer);\n }, [until]);\n\n const start = useCallback((seconds: number) => {\n const at = Date.now();\n setNow(at);\n setUntil(at + seconds * 1000);\n }, []);\n\n return [Math.max(0, Math.ceil((until - now) / 1000)), start];\n}\n","import { createContext, useContext } from \"react\";\nimport { PACKAGE_NAME } from \"../constants\";\nimport type { Comment } from \"../types\";\n\n/** What a comment is showing besides its body. */\nexport type ItemMode = \"view\" | \"reply\" | \"edit\" | \"report\" | \"delete\";\n\nexport interface ItemContextValue {\n comment: Comment;\n depth: number;\n mode: ItemMode;\n /** Switches mode; leaving a panel returns focus to whatever opened it. */\n setMode(mode: ItemMode, trigger?: HTMLElement | null): void;\n /** Transient feedback (\"Link copied\", errors) shown under the comment. */\n notice: { text: string; error: boolean } | null;\n setNotice(notice: { text: string; error: boolean } | null): void;\n}\n\nexport const ItemContext = createContext<ItemContextValue | null>(null);\n\nexport function useItemContext(component: string): ItemContextValue {\n const value = useContext(ItemContext);\n if (!value) {\n throw new Error(`${PACKAGE_NAME}: ${component} must be rendered inside <Comments.Item>`);\n }\n return value;\n}\n","import {\n type FormEvent,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { currentUrlWithoutHash } from \"../core/env\";\nimport type { Translator } from \"../messages\";\nimport type { CommentAuthor, Commenter, FlagType } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { Composer } from \"./composer/composer\";\nimport { HeartIcon, MoreIcon, PinIcon, ReplyIcon } from \"./icons\";\nimport { useItemContext } from \"./item-context\";\nimport { useRootContext } from \"./root\";\nimport { formatAbsolute, formatRelative, onMinuteTick, rootNodeOf, toCommentsError } from \"./util\";\n\ninterface PartProps {\n className?: string;\n}\n\nexport function Avatar({ className }: PartProps) {\n const { comment } = useItemContext(\"Comments.Avatar\");\n const { elements } = useRootContext(\"Comments.Avatar\");\n return <UserAvatar user={comment.author} className={cx(elements.avatar, className)} />;\n}\n\nexport function UserAvatar({\n user,\n className,\n}: {\n user: CommentAuthor | Commenter | null;\n className?: string;\n}) {\n if (user?.avatar_url) {\n return (\n <img\n className={cx(\"gc-avatar\", className)}\n src={user.avatar_url}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n }\n const initial = (user?.name || user?.username || \"\").charAt(0).toUpperCase();\n return (\n <span className={cx(\"gc-avatar\", \"gc-avatar--placeholder\", className)} aria-hidden=\"true\">\n {initial}\n </span>\n );\n}\n\n/** Author, badges, timestamp (a `#gc-<id>` permalink) and edited mark. */\nexport function Meta({ className }: PartProps) {\n const { comment } = useItemContext(\"Comments.Meta\");\n const { t, locale, client, elements } = useRootContext(\"Comments.Meta\");\n const author = comment.author;\n const name = author ? author.name || author.username : null;\n\n return (\n <div className={cx(\"gc-comment__meta\", elements.meta, className)}>\n {name &&\n (author?.username ? (\n <a\n className=\"gc-comment__author\"\n href={`${client.forum}/u/${encodeURIComponent(author.username)}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className=\"gc-comment__author\">{name}</span>\n ))}\n {author?.staff && <span className=\"gc-badge gc-badge--staff\">{t(\"staff\")}</span>}\n {comment.pinned && (\n <span className=\"gc-badge gc-badge--featured\">\n <PinIcon />\n {t(\"pinned\")}\n </span>\n )}\n <a className=\"gc-comment__time\" href={`#gc-${comment.id}`}>\n <RelativeTime iso={comment.created_at} locale={locale} />\n </a>\n {comment.edited && (\n <span className=\"gc-comment__edited\" title={formatAbsolute(comment.updated_at, locale)}>\n {t(\"edited\")}\n </span>\n )}\n </div>\n );\n}\n\nfunction RelativeTime({ iso, locale }: { iso: string; locale: string }) {\n const [now, setNow] = useState(Date.now);\n useEffect(() => onMinuteTick(() => setNow(Date.now())), []);\n return (\n <time dateTime={iso} title={formatAbsolute(iso, locale)}>\n {formatRelative(iso, now, locale)}\n </time>\n );\n}\n\n/** The comment's cooked HTML, or its inline editor while editing. */\nexport function Body({ className }: PartProps) {\n const { comment, mode, setMode } = useItemContext(\"Comments.Body\");\n const { t, elements } = useRootContext(\"Comments.Body\");\n const classes = cx(\"gc-comment__body\", elements.body, className);\n\n if (mode === \"edit\") {\n return <Composer editing={comment} onDone={() => setMode(\"view\")} />;\n }\n if (comment.deleted) {\n return <p className={cx(classes, \"gc-comment__body--removed\")}>{t(\"deleted\")}</p>;\n }\n if (comment.hidden && !comment.html) {\n return <p className={cx(classes, \"gc-comment__body--removed\")}>{t(\"hidden\")}</p>;\n }\n return (\n <>\n {comment.hidden && <p className=\"gc-comment__hidden-note\">{t(\"hidden\")}</p>}\n {/* Cooked and sanitized by the forum. */}\n <div className={cx(classes, \"gc-prose\")} dangerouslySetInnerHTML={{ __html: comment.html }} />\n </>\n );\n}\n\ninterface MenuItem {\n key: string;\n label: string;\n danger?: boolean;\n onSelect(trigger: HTMLElement | null): void;\n}\n\n/** Like, reply and a menu with copy link, edit, delete, report and feature. */\nexport function Actions({ className }: PartProps) {\n const root = useRootContext(\"Comments.Actions\");\n const { comment, depth, setMode, setNotice } = useItemContext(\"Comments.Actions\");\n const { t, thread, commenter, elements, writable } = root;\n if (!thread || comment.deleted) {\n return null;\n }\n\n const signedIn = commenter.status === \"signed-in\";\n const { likes, can } = comment;\n const likeDisabled =\n !writable ||\n (signedIn ? !likes.can_like && !likes.liked : !root.canRequestSignIn);\n const buttonClass = cx(\"gc-button\", \"gc-button--ghost\", \"gc-button--small\", elements.button);\n\n const fail = (action: Parameters<typeof root.reportError>[0], error: unknown) => {\n setNotice({ text: actionError(error, t), error: true });\n root.reportError(action, error);\n };\n\n const toggleLike = () => {\n setNotice(null);\n const liked = !likes.liked;\n const ready = signedIn ? Promise.resolve(true) : root.ensureSignedIn();\n void ready.then(async (ok) => {\n if (!ok) {\n return;\n }\n try {\n const updated = liked ? await thread.like(comment.id) : await thread.unlike(comment.id);\n root.emit({ type: \"comment.liked\", threadId: thread.id, comment: updated, liked });\n } catch (error) {\n fail(\"like\", error);\n }\n });\n };\n\n const reply = (event: MouseEvent<HTMLButtonElement>) => {\n const trigger = event.currentTarget;\n setNotice(null);\n if (signedIn || root.signInMode === \"on-submit\") {\n setMode(\"reply\", trigger);\n return;\n }\n void root.ensureSignedIn().then((ok) => ok && setMode(\"reply\", trigger));\n };\n\n const items: MenuItem[] = [\n {\n key: \"copy\",\n label: t(\"copyLink\"),\n onSelect: () => {\n const href = `${currentUrlWithoutHash() ?? \"\"}#gc-${comment.id}`;\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard;\n if (!clipboard) {\n window.location.hash = `gc-${comment.id}`;\n return;\n }\n clipboard.writeText(href).then(\n () => setNotice({ text: t(\"linkCopied\"), error: false }),\n () => {\n window.location.hash = `gc-${comment.id}`;\n },\n );\n },\n },\n ];\n if (writable && can.edit) {\n items.push({ key: \"edit\", label: t(\"edit\"), onSelect: (trigger) => setMode(\"edit\", trigger) });\n }\n if (writable && can.pin && depth === 0) {\n items.push({\n key: \"pin\",\n label: comment.pinned ? t(\"unpin\") : t(\"pin\"),\n onSelect: () => {\n const action = comment.pinned ? thread.unpin(comment.id) : thread.pin(comment.id);\n action.catch((error: unknown) => fail(\"pin\", error));\n },\n });\n }\n if (writable && can.flag) {\n items.push({ key: \"report\", label: t(\"report\"), onSelect: (trigger) => setMode(\"report\", trigger) });\n }\n if (writable && can.delete) {\n items.push({\n key: \"delete\",\n label: t(\"delete\"),\n danger: true,\n onSelect: (trigger) => setMode(\"delete\", trigger),\n });\n }\n\n return (\n <div className={cx(\"gc-actions\", elements.actions, className)}>\n <button\n type=\"button\"\n className={cx(buttonClass, \"gc-actions__like\", likes.liked && \"gc-actions__like--active\")}\n aria-pressed={likes.liked}\n aria-label={`${t(likes.liked ? \"unlike\" : \"like\")}, ${t(\"likeCount\", { count: likes.count })}`}\n disabled={likeDisabled}\n onClick={toggleLike}\n >\n <HeartIcon filled={likes.liked} />\n <span className=\"gc-actions__count\">{likes.count}</span>\n </button>\n {root.canReply && (signedIn || root.canRequestSignIn) && (\n <button type=\"button\" className={buttonClass} onClick={reply}>\n <ReplyIcon />\n {t(\"reply\")}\n </button>\n )}\n <ActionMenu items={items} label={t(\"moreActions\")} buttonClass={buttonClass} />\n </div>\n );\n}\n\nfunction ActionMenu({\n items,\n label,\n buttonClass,\n}: {\n items: readonly MenuItem[];\n label: string;\n buttonClass: string;\n}) {\n const { elements } = useRootContext();\n const [open, setOpen] = useState(false);\n const id = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n menuRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n const onPointerDown = (event: PointerEvent) => {\n // `event.target` is retargeted to the host at the document level inside a shadow root.\n const path = event.composedPath();\n const inside = (node: Node | null) => node !== null && path.includes(node);\n if (!inside(menuRef.current) && !inside(buttonRef.current)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open]);\n\n const close = (refocus: boolean) => {\n setOpen(false);\n if (refocus) {\n buttonRef.current?.focus();\n }\n };\n\n const onMenuKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n const options = [...(menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])];\n const index = options.indexOf(rootNodeOf(event.currentTarget).activeElement as HTMLElement);\n const move = (next: number) => options[(next + options.length) % options.length]?.focus();\n switch (event.key) {\n case \"ArrowDown\":\n move(index + 1);\n break;\n case \"ArrowUp\":\n move(index - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(options.length - 1);\n break;\n case \"Escape\":\n close(true);\n break;\n case \"Tab\":\n setOpen(false);\n return;\n default:\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n };\n\n return (\n <div className=\"gc-menu\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={cx(buttonClass, \"gc-button--icon\")}\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n onClick={() => setOpen((current) => !current)}\n >\n <MoreIcon />\n </button>\n {open && (\n <ul\n ref={menuRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n className={cx(\"gc-menu__list\", elements.menu)}\n onKeyDown={onMenuKeyDown}\n >\n {items.map((item) => (\n <li key={item.key} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={cx(\"gc-menu__item\", item.danger && \"gc-menu__item--danger\")}\n onClick={() => {\n // Panels opened by the item move focus into themselves afterwards.\n close(true);\n item.onSelect(buttonRef.current);\n }}\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nconst FLAG_TYPES: readonly FlagType[] = [\n \"inappropriate\",\n \"spam\",\n \"illegal\",\n \"off_topic\",\n \"notify_moderators\",\n];\n// The forum rejects these reports without an explanation.\nconst MESSAGE_REQUIRED: ReadonlySet<FlagType> = new Set([\"illegal\", \"notify_moderators\"]);\n\nexport function ReportForm({ onClose }: { onClose(): void }) {\n const root = useRootContext(\"Comments.Item\");\n const { comment, setNotice } = useItemContext(\"Comments.Item\");\n const { t, thread, elements } = root;\n const [type, setType] = useState<FlagType>(\"inappropriate\");\n const [message, setMessage] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n const formRef = useRef<HTMLFormElement>(null);\n const needsMessage = MESSAGE_REQUIRED.has(type);\n const messageLabel = needsMessage ? t(\"reportMessageRequired\") : t(\"reportMessagePlaceholder\");\n\n useEffect(() => {\n formRef.current?.querySelector<HTMLInputElement>(\"input:checked\")?.focus();\n }, []);\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (!thread || !root.writable || !comment.can.flag || (needsMessage && !message.trim())) {\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n await thread.flag(comment.id, { type, message: message.trim() || undefined });\n setNotice({ text: t(\"reportSent\"), error: false });\n onClose();\n } catch (failure) {\n setError(actionError(failure, t));\n root.reportError(\"flag\", failure);\n setSubmitting(false);\n }\n };\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={`${id}-title`}\n className={cx(\"gc-report\", elements.dialog)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <form ref={formRef} onSubmit={submit}>\n <fieldset className=\"gc-report__options\">\n <legend id={`${id}-title`} className=\"gc-report__title\">\n {t(\"reportTitle\")}\n </legend>\n {FLAG_TYPES.map((flag) => (\n <label key={flag} className=\"gc-report__option\">\n <input\n type=\"radio\"\n name={`${id}-type`}\n value={flag}\n checked={type === flag}\n onChange={() => setType(flag)}\n />\n {t(`report.${flag}`)}\n </label>\n ))}\n </fieldset>\n <textarea\n className=\"gc-report__message\"\n value={message}\n placeholder={messageLabel}\n aria-label={messageLabel}\n required={needsMessage}\n rows={2}\n onChange={(event) => setMessage(event.target.value)}\n />\n {error && (\n <p className=\"gc-report__error\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"gc-report__buttons\">\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={onClose}>\n {t(\"cancel\")}\n </button>\n <button\n type=\"submit\"\n className={cx(\"gc-button\", \"gc-button--primary\", elements.button, elements.primaryButton)}\n disabled={submitting || (needsMessage && !message.trim())}\n >\n {t(\"report\")}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nexport function DeleteConfirm({ onClose }: { onClose(): void }) {\n const root = useRootContext(\"Comments.Item\");\n const { comment, setNotice } = useItemContext(\"Comments.Item\");\n const { t, thread, elements } = root;\n const [deleting, setDeleting] = useState(false);\n const id = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => cancelRef.current?.focus(), []);\n\n const confirm = async () => {\n if (!thread || !root.writable || !comment.can.delete) {\n return;\n }\n setDeleting(true);\n try {\n await thread.remove(comment.id);\n } catch (failure) {\n setNotice({ text: actionError(failure, t), error: true });\n root.reportError(\"delete\", failure);\n }\n onClose();\n };\n\n return (\n <div\n role=\"alertdialog\"\n aria-modal=\"false\"\n aria-labelledby={id}\n className={cx(\"gc-confirm\", elements.dialog)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <p id={id} className=\"gc-confirm__text\">\n {t(\"deleteConfirm\")}\n </p>\n <div className=\"gc-confirm__buttons\">\n <button ref={cancelRef} type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={onClose}>\n {t(\"cancel\")}\n </button>\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--danger\", elements.button)}\n disabled={deleting}\n onClick={() => void confirm()}\n >\n {t(\"delete\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction actionError(error: unknown, t: Translator): string {\n const failure = toCommentsError(error);\n if (failure.type === \"rate_limit\" && failure.waitSeconds) {\n return t(\"rateLimited\", { count: failure.waitSeconds });\n }\n if (failure.type === \"invalid_key\" || failure.type === \"not_logged_in\") {\n return t(\"sessionExpired\");\n }\n if (failure.type === \"unreachable\" || failure.type === \"unknown\" || failure.errors.length === 0) {\n return t(\"genericError\");\n }\n return failure.errors[0]!;\n}\n","import { PACKAGE_NAME } from \"../constants\";\nimport type { CommentsError } from \"../errors\";\nimport { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\nimport { isLocalPage } from \"./util\";\n\n// Developer-facing diagnostics (setting names, nginx snippets) stay in English,\n// like the client's own `CommentsError.hint`; readers only ever see the\n// translated \"Comments are unavailable\" notice.\n\ninterface Cause {\n text: string;\n link?: { href: string; label: string };\n code?: string;\n}\n\n/**\n * Explains setup problems (origin not allowed, plugin disabled, basic auth\n * blocking preflights…). Renders on localhost-like hosts or with `debug`.\n */\nexport function DevPanel({ className }: { className?: string }) {\n const { client, openError, snapshot, configError, debug, commenter } =\n useRootContext(\"Comments.DevPanel\");\n if (!debug && !isLocalPage()) {\n return null;\n }\n const error =\n openError ?? (snapshot?.status === \"error\" ? snapshot.error : null) ?? configError ?? null;\n const origin = typeof window === \"undefined\" ? \"\" : window.location.origin;\n\n if (!error) {\n if (!debug || !snapshot) {\n return null;\n }\n return (\n <details className={cx(\"gc-devpanel\", \"gc-devpanel--ok\", className)}>\n <summary className=\"gc-devpanel__title\">{PACKAGE_NAME} diagnostics</summary>\n <dl className=\"gc-devpanel__details\">\n <dt>Forum</dt>\n <dd>{client.forum}</dd>\n <dt>Thread</dt>\n <dd>\n {snapshot.thread.id} {snapshot.virtual ? \"(not created yet)\" : \"\"}\n </dd>\n <dt>Key</dt>\n <dd>{snapshot.thread.key}</dd>\n <dt>Updates</dt>\n <dd>{snapshot.connection}</dd>\n <dt>Reader</dt>\n <dd>\n {commenter.status}\n {commenter.degraded ? \" (degraded)\" : \"\"}\n </dd>\n </dl>\n </details>\n );\n }\n\n const { summary, causes } = diagnose(error, client.forum, origin);\n return (\n <aside\n className={cx(\"gc-devpanel\", className)}\n aria-label={`${PACKAGE_NAME} setup diagnostics`}\n >\n <p className=\"gc-devpanel__title\">{PACKAGE_NAME} could not load comments</p>\n <p className=\"gc-devpanel__summary\">{summary}</p>\n {causes.length > 0 && (\n <ol className=\"gc-devpanel__causes\">\n {causes.map((cause) => (\n <li key={cause.text}>\n {cause.text}\n {cause.link && (\n <>\n {\" \"}\n <a href={cause.link.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {cause.link.label}\n </a>\n </>\n )}\n {cause.code && (\n <pre className=\"gc-devpanel__code\">\n <code>{cause.code}</code>\n </pre>\n )}\n </li>\n ))}\n </ol>\n )}\n <dl className=\"gc-devpanel__details\">\n <dt>Forum</dt>\n <dd>{client.forum}</dd>\n <dt>Page origin</dt>\n <dd>{origin}</dd>\n <dt>Error</dt>\n <dd>\n <code>{error.type}</code> (status {error.status}): {error.message}\n </dd>\n </dl>\n <p className=\"gc-devpanel__note\">\n Shown on localhost or with debug. Readers see a short “Comments are unavailable” notice.\n </p>\n </aside>\n );\n}\n\nexport function diagnose(\n error: CommentsError,\n forum: string,\n origin: string,\n): { summary: string; causes: Cause[] } {\n const host = origin ? new URL(origin).host : \"this site's host\";\n const embedding = {\n href: `${forum}/admin/customize/embedding`,\n label: \"Open Admin → Customize → Embedding\",\n };\n const setting = (name: string) => ({\n href: `${forum}/admin/site_settings/category/all_results?filter=${name}`,\n label: `Open ${name}`,\n });\n const originNotAllowed: Cause = {\n text: `This page's origin (${origin || \"unknown\"}) is not allowed: add ${host} as an embedding host, or add the origin to discourse_comments_allowed_origins.`,\n link: embedding,\n };\n const pluginDisabled: Cause = {\n text: \"The discourse-comments plugin is not installed or is disabled (discourse_comments_enabled).\",\n link: setting(\"discourse_comments_enabled\"),\n };\n\n switch (error.type) {\n case \"unreachable\":\n return {\n summary: `The browser got no usable response from ${forum}; CORS hides the reason, so check these in order.`,\n causes: [\n originNotAllowed,\n {\n text: \"The forum is behind HTTP basic auth, which rejects CORS preflight (OPTIONS) requests. Let OPTIONS through without credentials and pass the credentials with the provider's headers prop, e.g. in nginx:\",\n code: [\n \"location / {\",\n \" limit_except OPTIONS {\",\n ' auth_basic \"Restricted\";',\n \" auth_basic_user_file /etc/nginx/.htpasswd;\",\n \" }\",\n \"}\",\n ].join(\"\\n\"),\n },\n pluginDisabled,\n {\n text: \"The forum URL is wrong or the forum is offline.\",\n link: { href: forum, label: \"Open the forum\" },\n },\n ],\n };\n case \"not_found\":\n return { summary: \"The comments API answered 404.\", causes: [pluginDisabled] };\n case \"page_not_allowed\":\n return {\n summary: `${forum} does not accept comments for this page.`,\n causes: [\n {\n text: `Add ${host} as an embedding host (check its allowed paths), or add this origin to discourse_comments_allowed_origins.`,\n link: embedding,\n },\n ],\n };\n case \"no_category\":\n return {\n summary: \"The forum has no category for new comment threads.\",\n causes: [\n { text: `Pick a category for ${host} under Embedding.`, link: embedding },\n {\n text: \"Or set discourse_comments_default_category (and discourse_comments_default_author).\",\n link: setting(\"discourse_comments_default_category\"),\n },\n ],\n };\n case \"invalid_url\":\n return {\n summary: \"The forum rejected the page URL.\",\n causes: [\n {\n text: 'Pass an absolute http(s) url prop, or add a <link rel=\"canonical\"> to the page.',\n },\n ],\n };\n case \"thread_conflict\":\n return {\n summary: \"The identifier and the URL already belong to different threads.\",\n causes: [\n { text: \"Pass the identifier this URL was first used with, or only one of the two.\" },\n ],\n };\n case \"invalid_access\":\n return {\n summary: \"The forum refused access to this thread.\",\n causes: [\n {\n text: \"The thread's category may not be visible to this reader; check the category's security settings.\",\n },\n ],\n };\n default:\n return { summary: error.message, causes: [] };\n }\n}\n","import { type ReactNode, useId } from \"react\";\nimport type { Sort as SortName } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\n\nexport interface HeaderProps {\n /** Defaults to `<Comments.Count />` and `<Comments.Sort />`. */\n children?: ReactNode;\n className?: string;\n}\n\nexport function Header({ children, className }: HeaderProps) {\n const { elements } = useRootContext(\"Comments.Header\");\n return (\n <header className={cx(\"gc-header\", elements.header, className)}>\n {children ?? (\n <>\n <Count />\n <Sort />\n </>\n )}\n </header>\n );\n}\n\nexport interface CountProps {\n /** Heading element; `h2` by default. */\n as?: \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"span\";\n /** Custom content for the comment count, e.g. `(n) => n`. */\n render?: (count: number) => ReactNode;\n className?: string;\n}\n\nexport function Count({ as: Tag = \"h2\", render, className }: CountProps) {\n const { t, snapshot, elements } = useRootContext(\"Comments.Count\");\n const count = snapshot?.thread.count;\n return (\n <Tag className={cx(\"gc-header__count\", elements.count, className)}>\n {count === undefined ? t(\"comments\") : render ? render(count) : t(\"commentCount\", { count })}\n </Tag>\n );\n}\n\nexport function Sort({ className }: { className?: string }) {\n const { t, thread, snapshot, elements, reportError } = useRootContext(\"Comments.Sort\");\n const id = useId();\n if (!thread || !snapshot || snapshot.thread.sorts.length < 2) {\n return null;\n }\n return (\n <div className={cx(\"gc-sort\", elements.sort, className)}>\n <label className=\"gc-sort__label\" htmlFor={id}>\n {t(\"sortBy\")}\n </label>\n <select\n id={id}\n className=\"gc-sort__select\"\n value={snapshot.sort}\n disabled={snapshot.status === \"loading\"}\n onChange={(event) =>\n void thread.setSort(event.target.value as SortName).catch((error: unknown) =>\n reportError(\"load\", error),\n )\n }\n >\n {snapshot.thread.sorts.map((sort) => (\n <option key={sort} value={sort}>\n {t(`sort.${sort}`)}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","import {\n createContext,\n Fragment,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { findComment } from \"../core/tree\";\nimport type { Comment } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { Actions, Avatar, Body, DeleteConfirm, Meta, ReportForm } from \"./comment-parts\";\nimport { Composer } from \"./composer/composer\";\nimport { BackIcon } from \"./icons\";\nimport { ItemContext, type ItemContextValue, type ItemMode, useItemContext } from \"./item-context\";\nimport { useRootContext } from \"./root\";\n\nexport type RenderComment = (comment: Comment, depth: number) => ReactNode;\n\nconst defaultRender: RenderComment = (comment, depth) => <Item comment={comment} depth={depth} />;\n\n// Replies reuse the render function given to `Comments.List`, so custom markup applies at every depth.\nconst ListContext = createContext<RenderComment>(defaultRender);\n\nexport interface ListProps {\n /** Renders one comment; defaults to `<Comments.Item comment={c} depth={depth} />`. */\n children?: RenderComment;\n className?: string;\n}\n\n/** The comment tree, with its loading, error and \"continue this thread\" states. */\nexport function List({ children, className }: ListProps) {\n const root = useRootContext(\"Comments.List\");\n const render = children ?? defaultRender;\n const { snapshot, openError, t, elements, focusView } = root;\n\n if (openError || snapshot?.status === \"error\") {\n return (\n <div className={cx(\"gc-notice\", \"gc-notice--error\", elements.notice)} role=\"alert\">\n <p className=\"gc-notice__text\">{t(\"unavailable\")}</p>\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={root.retry}>\n {t(\"retry\")}\n </button>\n </div>\n );\n }\n if (!snapshot || (snapshot.status === \"loading\" && snapshot.comments.length === 0)) {\n return (\n <p className=\"gc-list__status\" role=\"status\">\n {t(\"loading\")}\n </p>\n );\n }\n\n const listClass = cx(\"gc-list\", elements.list, className);\n if (focusView) {\n const tree = snapshot.comments;\n const target = findComment(tree, focusView.id)?.node;\n return (\n <ListContext.Provider value={render}>\n <div className=\"gc-focus\">\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--link\", \"gc-focus__back\", elements.button)}\n onClick={root.closeFocusView}\n >\n <BackIcon />\n {t(\"backToAll\")}\n </button>\n {focusView.truncated && <p className=\"gc-focus__truncated\">{t(\"ancestorsTruncated\")}</p>}\n {focusView.ancestors.length > 0 && (\n <ol className=\"gc-context\">\n {focusView.ancestors.map((ancestor) => (\n <Item\n key={ancestor.id}\n comment={findComment(tree, ancestor.id)?.node ?? ancestor}\n showReplies={false}\n />\n ))}\n </ol>\n )}\n {target && <ol className={listClass}>{render(target, 0)}</ol>}\n </div>\n </ListContext.Provider>\n );\n }\n\n if (snapshot.comments.length === 0) {\n return null;\n }\n return (\n <ListContext.Provider value={render}>\n <ol className={listClass}>\n {snapshot.comments.map((comment) => (\n <Fragment key={comment.id}>{render(comment, 0)}</Fragment>\n ))}\n </ol>\n </ListContext.Provider>\n );\n}\n\nexport interface ItemProps {\n comment: Comment;\n /** 0 for top-level comments. */\n depth?: number;\n /** Replaces the default avatar, meta, body and actions. */\n children?: ReactNode;\n /** Render the comment without its replies (used for ancestors in a focused branch). */\n showReplies?: boolean;\n className?: string;\n}\n\n/** One comment: its card, inline reply/edit/report panels and its replies. */\nexport function Item({ comment, depth = 0, children, showReplies = true, className }: ItemProps) {\n const root = useRootContext(\"Comments.Item\");\n const { t, elements } = root;\n const [mode, setModeState] = useState<ItemMode>(\"view\");\n const [notice, setNotice] = useState<ItemContextValue[\"notice\"]>(null);\n const articleRef = useRef<HTMLElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const restoreFocus = useRef(false);\n\n const setMode = useCallback((next: ItemMode, trigger?: HTMLElement | null) => {\n if (next === \"view\") {\n restoreFocus.current = true;\n } else {\n triggerRef.current = trigger ?? null;\n }\n setModeState(next);\n }, []);\n\n useEffect(() => {\n if (mode !== \"view\" || !restoreFocus.current) {\n return;\n }\n restoreFocus.current = false;\n const trigger = triggerRef.current;\n (trigger?.isConnected ? trigger : articleRef.current)?.focus();\n }, [mode]);\n\n // Panels follow the reader's current rights: going read-only, losing a\n // permission or signing out closes them instead of leaving stale forms behind.\n const signedIn = root.commenter.status === \"signed-in\";\n const writable = root.writable && signedIn;\n const allowed: Record<ItemMode, boolean> = {\n view: true,\n reply: root.canCompose,\n edit: writable && comment.can.edit,\n report: writable && comment.can.flag,\n delete: writable && comment.can.delete,\n };\n const modeAllowed = allowed[mode];\n const activeMode: ItemMode = modeAllowed ? mode : \"view\";\n\n useEffect(() => {\n if (!modeAllowed) {\n setMode(\"view\");\n }\n }, [modeAllowed, setMode]);\n\n useEffect(() => {\n if (!notice || notice.error) {\n return;\n }\n const timer = setTimeout(() => setNotice(null), 3000);\n return () => clearTimeout(timer);\n }, [notice]);\n\n const value = useMemo(\n (): ItemContextValue => ({ comment, depth, mode: activeMode, setMode, notice, setNotice }),\n [comment, depth, activeMode, setMode, notice],\n );\n\n const name = comment.author ? comment.author.name || comment.author.username : null;\n const label = comment.deleted || !name ? t(\"deletedComment\") : t(\"commentBy\", { name });\n const close = () => setMode(\"view\");\n\n return (\n <ItemContext.Provider value={value}>\n <li\n className={cx(\n \"gc-comment\",\n depth > 0 && \"gc-comment--reply\",\n comment.pinned && \"gc-comment--pinned\",\n comment.deleted && \"gc-comment--deleted\",\n root.highlightId === comment.id && \"gc-comment--highlighted\",\n elements.comment,\n className,\n )}\n data-depth={depth}\n >\n <article\n ref={articleRef}\n id={`gc-${comment.id}`}\n className=\"gc-comment__card\"\n tabIndex={-1}\n aria-label={label}\n >\n {children ?? (\n <>\n <Avatar />\n <div className=\"gc-comment__main\">\n <Meta />\n <Body />\n <Actions />\n </div>\n </>\n )}\n {activeMode === \"report\" && <ReportForm onClose={close} />}\n {activeMode === \"delete\" && <DeleteConfirm onClose={close} />}\n {notice && (\n <p\n className={cx(\"gc-comment__notice\", notice.error && \"gc-comment__notice--error\")}\n role={notice.error ? \"alert\" : \"status\"}\n >\n {notice.text}\n </p>\n )}\n </article>\n {activeMode === \"reply\" && <Composer replyTo={comment} autoFocus onDone={close} />}\n {showReplies && <Replies />}\n </li>\n </ItemContext.Provider>\n );\n}\n\nfunction Replies() {\n const root = useRootContext();\n const { comment, depth } = useItemContext(\"Comments.Item\");\n const render = useContext(ListContext);\n const { t, thread, snapshot, maxDepth, elements } = root;\n if (!thread || !snapshot) {\n return null;\n }\n\n const children = comment.children;\n const linkButton = cx(\"gc-button\", \"gc-button--link\", elements.button);\n if (depth >= maxDepth) {\n if (comment.direct_reply_count === 0 && children.length === 0) {\n return null;\n }\n return (\n <button\n type=\"button\"\n className={cx(linkButton, \"gc-comment__continue\")}\n onClick={() => void root.continueThread(comment.id)}\n >\n {t(\"continueThread\")}\n </button>\n );\n }\n\n const branch = snapshot.branches[comment.id];\n const remaining = comment.direct_reply_count - children.length;\n const hasMore = (branch?.hasMore ?? true) && remaining > 0;\n const name = comment.author?.name || comment.author?.username || \"\";\n\n const loadReplies = async () => {\n const before = new Set(children.map((child) => child.id));\n try {\n await thread.loadReplies(comment.id);\n } catch (error) {\n root.reportError(\"loadReplies\", error);\n return;\n }\n // The button may be gone now; move focus to the first reply that arrived.\n const loaded = findComment(thread.snapshot().comments, comment.id)?.node.children ?? [];\n const first = loaded.find((child) => !before.has(child.id));\n if (first) {\n root.focusComment(first.id);\n }\n };\n\n return (\n <>\n {children.length > 0 && (\n <ol className=\"gc-replies\" aria-label={t(\"repliesTo\", { name })}>\n {children.map((child) => (\n <Fragment key={child.id}>{render(child, depth + 1)}</Fragment>\n ))}\n </ol>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className={cx(linkButton, \"gc-comment__more\")}\n disabled={branch?.loading}\n aria-busy={branch?.loading || undefined}\n onClick={() => void loadReplies()}\n >\n {children.length === 0\n ? t(\"loadReplies\", { count: remaining })\n : t(\"loadMoreReplies\", { count: remaining })}\n </button>\n )}\n </>\n );\n}\n","import { type ReactNode, useId } from \"react\";\nimport { cx } from \"./appearance\";\nimport { UserAvatar } from \"./comment-parts\";\nimport type { CommenterState } from \"./hooks/use-commenter\";\nimport { useRootContext } from \"./root\";\n\nexport interface SignInProps {\n /** Custom UI; called in every sign-in mode, including `manual`. */\n children?: (commenter: CommenterState) => ReactNode;\n className?: string;\n}\n\n/**\n * Inline mode: a \"Join the conversation\" panel with the forum's providers.\n * Signed in: who is commenting, with a sign-out button.\n */\nexport function SignIn({ children, className }: SignInProps) {\n const root = useRootContext(\"Comments.SignIn\");\n const { t, commenter, elements, client, config, snapshot, signInMode } = root;\n const titleId = useId();\n\n if (children) {\n return <>{children(commenter)}</>;\n }\n if (signInMode === \"manual\") {\n return null;\n }\n\n const button = cx(\"gc-button\", elements.button);\n const classes = cx(\"gc-signin\", elements.signIn, className);\n\n if (commenter.status === \"signed-in\" && commenter.user) {\n const { user } = commenter;\n return (\n <div className={cx(classes, \"gc-signin--signed-in\")}>\n <UserAvatar user={user} className=\"gc-avatar--small\" />\n <span className=\"gc-signin__user\">{t(\"signedInAs\", { username: `@${user.username}` })}</span>\n <button\n type=\"button\"\n className={cx(button, \"gc-button--link\")}\n onClick={() => void commenter.signOut()}\n >\n {t(\"signOut\")}\n </button>\n </div>\n );\n }\n\n const closed = snapshot?.thread.closed ?? false;\n if (signInMode !== \"inline\" || !root.writable || closed || !snapshot) {\n return null;\n }\n\n const forumName = config?.forum.name ?? new URL(client.forum).host;\n const signingIn = commenter.status === \"signing-in\";\n const failure =\n commenter.error && commenter.error.type !== \"cancelled\"\n ? commenter.error.type === \"invalid_key\"\n ? t(\"sessionExpired\")\n : (commenter.error.errors[0] ?? t(\"genericError\"))\n : null;\n\n return (\n <div\n className={cx(classes, signingIn && \"gc-signin--signing-in\")}\n role=\"group\"\n aria-labelledby={titleId}\n >\n <p id={titleId} className=\"gc-signin__title\">\n {t(\"joinConversation\")}\n </p>\n <div aria-live=\"polite\">\n {signingIn ? (\n <p className=\"gc-signin__body\">{t(\"signingIn\")}</p>\n ) : (\n <p className=\"gc-signin__body\">{t(\"joinConversationBody\", { forum: forumName })}</p>\n )}\n {failure && !signingIn && (\n <p className=\"gc-signin__error\" role=\"alert\">\n {failure}\n </p>\n )}\n </div>\n <div className=\"gc-signin__actions\">\n {signingIn ? (\n <button type=\"button\" className={button} onClick={() => commenter.cancelSignIn()}>\n {t(\"signInCancel\")}\n </button>\n ) : (\n <>\n <button\n type=\"button\"\n className={cx(button, \"gc-button--primary\", elements.primaryButton)}\n onClick={() => void commenter.signIn().catch(() => {})}\n >\n {t(\"signIn\")}\n </button>\n {commenter.providers.map((provider) => (\n <button\n key={provider.name}\n type=\"button\"\n className={button}\n onClick={() => void commenter.signIn({ provider: provider.name }).catch(() => {})}\n >\n {t(\"signInWith\", { provider: provider.title })}\n </button>\n ))}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\n\n/** Read-only, closed and not-allowed notices that replace the composer. */\nexport function Notice({ className }: { className?: string }) {\n const { t, snapshot, readOnly, commenter, commentingDenied, elements } =\n useRootContext(\"Comments.Notice\");\n if (!snapshot || snapshot.status === \"error\") {\n return null;\n }\n let text: string | null = null;\n let modifier = \"\";\n if (readOnly || commenter.degraded) {\n text = t(\"readOnly\");\n modifier = \"gc-notice--read-only\";\n } else if (snapshot.thread.closed) {\n text = t(\"closed\");\n modifier = \"gc-notice--closed\";\n } else if (commentingDenied) {\n text = t(\"cannotComment\");\n modifier = \"gc-notice--denied\";\n }\n if (!text) {\n return null;\n }\n return (\n <p className={cx(\"gc-notice\", modifier, elements.notice, className)} role=\"status\">\n {text}\n </p>\n );\n}\n\n/** The \"N new comments\" pill for top-level comments that arrived live. */\nexport function NewComments({ className }: { className?: string }) {\n const root = useRootContext(\"Comments.NewComments\");\n const { t, thread, snapshot, elements, focusView } = root;\n const count = focusView ? 0 : (snapshot?.pendingNew ?? 0);\n\n const show = () => {\n if (!thread) {\n return;\n }\n const before = new Set(thread.snapshot().comments.map((comment) => comment.id));\n thread.showPending();\n const first = thread.snapshot().comments.find((comment) => !before.has(comment.id));\n if (first) {\n root.focusComment(first.id);\n }\n };\n\n // The live region stays mounted so the arrival of new comments is announced.\n return (\n <div className=\"gc-pill-region\" aria-live=\"polite\">\n {count > 0 && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-pill\", elements.button, elements.pill, className)}\n onClick={show}\n >\n {t(\"newComments\", { count })}\n </button>\n )}\n </div>\n );\n}\n\n/** The reader's own comments that went to the review queue. */\nexport function AwaitingApproval({ className }: { className?: string }) {\n const { t, snapshot, elements } = useRootContext(\"Comments.AwaitingApproval\");\n const pending = snapshot?.awaitingApproval ?? [];\n return (\n <div className=\"gc-pending-region\" aria-live=\"polite\">\n {pending.map((entry, index) => (\n <p\n key={entry.reviewable_id ?? `pending-${index}`}\n className={cx(\"gc-notice\", \"gc-notice--pending\", elements.notice, className)}\n >\n {entry.message || t(\"pending\")}\n </p>\n ))}\n </div>\n );\n}\n\nexport function LoadMore({ className }: { className?: string }) {\n const root = useRootContext(\"Comments.LoadMore\");\n const { t, thread, snapshot, elements, focusView } = root;\n if (!thread || !snapshot?.hasMore || focusView || snapshot.status !== \"ready\") {\n return null;\n }\n\n const loadMore = async () => {\n const before = new Set(thread.snapshot().comments.map((comment) => comment.id));\n try {\n await thread.loadMore();\n } catch (error) {\n root.reportError(\"loadMore\", error);\n return;\n }\n const first = thread.snapshot().comments.find((comment) => !before.has(comment.id));\n if (first && !thread.snapshot().hasMore) {\n root.focusComment(first.id);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-load-more\", elements.button, elements.loadMore, className)}\n disabled={snapshot.loadingMore}\n aria-busy={snapshot.loadingMore || undefined}\n onClick={() => void loadMore()}\n >\n {snapshot.loadingMore ? t(\"loading\") : t(\"loadMore\")}\n </button>\n );\n}\n","import { Actions, Avatar, Body, Meta } from \"./comment-parts\";\nimport { Composer } from \"./composer/composer\";\nimport { DevPanel } from \"./dev-panel\";\nimport { Count, Header, Sort } from \"./header\";\nimport { Item, List } from \"./list\";\nimport { type CommentsProps, Root } from \"./root\";\nimport { SignIn } from \"./sign-in\";\nimport { AwaitingApproval, LoadMore, NewComments, Notice } from \"./status\";\n\n/**\n * The drop-in comments section for the current page, assembled from the\n * `Comments.*` primitives that are also exported for custom layouts.\n */\nfunction CommentsSection(props: CommentsProps) {\n return (\n <Root {...props}>\n <Header />\n <DevPanel />\n <Notice />\n <SignIn />\n <Composer />\n <AwaitingApproval />\n <NewComments />\n <List />\n <LoadMore />\n </Root>\n );\n}\n\nexport const Comments = Object.assign(CommentsSection, {\n Root,\n Header,\n Count,\n Sort,\n SignIn,\n Composer,\n List,\n Item,\n Avatar,\n Meta,\n Body,\n Actions,\n LoadMore,\n NewComments,\n AwaitingApproval,\n Notice,\n DevPanel,\n});\n","import { useEffect, useRef, useState } from \"react\";\nimport { encodeRef } from \"../../core/counts\";\nimport type { CommentsError } from \"../../errors\";\nimport type { CountRef } from \"../../types\";\nimport { useOptionalCommentsContext } from \"../context\";\nimport { toCommentsError } from \"../util\";\n\nexport interface CommentCountState {\n /** `null` while loading or after an error. */\n count: number | null;\n error: CommentsError | null;\n}\n\n/**\n * Fetches a comment count once per ref. Lookups from the same render are\n * batched into one request by the client; the count is not live.\n */\nexport function useCommentCount(\n ref: CountRef | null,\n options: { forum?: string } = {},\n): CommentCountState {\n // Without a provider or `forum` there is nothing to ask; the count stays unknown.\n const client = useOptionalCommentsContext(options.forum)?.client;\n const key = ref ? safeEncode(ref) : null;\n const latestRef = useRef(ref);\n latestRef.current = ref;\n const [state, setState] = useState<CommentCountState & { key: string | null }>({\n key: null,\n count: null,\n error: null,\n });\n\n useEffect(() => {\n const current = latestRef.current;\n if (key === null || !current || !client) {\n return;\n }\n let active = true;\n client.count(current).then(\n (count) => active && setState({ key, count, error: null }),\n (error: unknown) => active && setState({ key, count: null, error: toCommentsError(error) }),\n );\n return () => {\n active = false;\n };\n }, [client, key]);\n\n return state.key === key ? { count: state.count, error: state.error } : { count: null, error: null };\n}\n\n// Identifier refs need the page host, which does not exist during server rendering.\nfunction safeEncode(ref: CountRef): string | null {\n try {\n return encodeRef(ref);\n } catch {\n return null;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { defaultPageUrl } from \"../core/env\";\nimport type { CountRef } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { useOptionalCommentsContext } from \"./context\";\nimport { useCommentCount } from \"./hooks/use-comment-count\";\n\nexport interface CommentCountProps {\n identifier?: string;\n /** Host the `identifier` belongs to; defaults to the current page's host. */\n host?: string;\n /** Defaults to the current page (canonical link, else the address). */\n url?: string;\n topicId?: number;\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n /** Custom content, e.g. `(n) => n` for just the number. */\n render?: (count: number) => ReactNode;\n className?: string;\n}\n\n/** \"12 comments\" for a page, fetched once on mount and batched with other counts. */\nexport function CommentCount({\n identifier,\n host,\n url,\n topicId,\n forum,\n render,\n className,\n}: CommentCountProps) {\n const context = useOptionalCommentsContext(forum);\n const pageUrl = url ?? defaultPageUrl();\n const ref: CountRef | null =\n topicId !== undefined\n ? { topicId }\n : identifier !== undefined\n ? { identifier, host }\n : pageUrl\n ? { url: pageUrl }\n : null;\n const { count } = useCommentCount(ref, { forum });\n\n // Rendered outside any provider (a consumer's test, a static page): show nothing.\n if (!context) {\n return null;\n }\n const { t } = context;\n\n return (\n <span className={cx(\"gc-count\", className)} aria-busy={count === null || undefined}>\n {count === null ? null : render ? render(count) : t(\"commentCount\", { count })}\n </span>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/util.ts","../src/react/context.ts","../src/react/provider.tsx","../src/react/appearance.ts","../src/react/icons.tsx","../src/react/forum-theme.ts","../src/react/hooks/use-config.ts","../src/react/hooks/use-commenter.ts","../src/react/hooks/use-forum-theme.ts","../src/react/hooks/use-thread.ts","../src/react/root.tsx","../src/react/composer/markdown.ts","../src/react/composer/use-mentions.ts","../src/react/composer/composer.tsx","../src/react/item-context.ts","../src/react/comment-parts.tsx","../src/react/dev-panel.tsx","../src/react/header.tsx","../src/react/list.tsx","../src/react/sign-in.tsx","../src/react/status.tsx","../src/react/comments.tsx","../src/react/hooks/use-comment-count.ts","../src/react/comment-count.tsx"],"names":["useEffect","useLayoutEffect","isCommentsError","CommentsError","createContext","createTranslator","PACKAGE_NAME","useContext","useMemo","normalizeForum","clientRegistry","resolveLocale","useRef","jsx","useState","useCallback","useSyncExternalStore","loaded","initial","currentUrlWithoutHash","thread","context","findComment","STORAGE_PREFIX","useId","createComposerTimer","jsxs","Fragment","encodeRef","defaultPageUrl"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useEffect, useLayoutEffect } from \"react\";\nimport { CommentsError, isCommentsError } from \"../errors\";\n\nexport const useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport function toCommentsError(error: unknown): CommentsError {\n if (isCommentsError(error)) {\n return error;\n }\n return new CommentsError(\"unknown\", error instanceof Error ? error.message : String(error), {\n cause: error,\n });\n}\n\nexport function noop(): void {}\n\n/**\n * The document or shadow root an element lives in. `document.activeElement`\n * and `document.getElementById` stop at a shadow boundary, so lookups inside a\n * custom element's shadow tree go through this.\n */\nexport function rootNodeOf(element: Element): Document | ShadowRoot {\n const root = element.getRootNode();\n return root instanceof Document || root instanceof ShadowRoot ? root : element.ownerDocument;\n}\n\n/** Pages served from a development host get setup diagnostics without `debug`. */\nexport function isLocalPage(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n const host = window.location.hostname;\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".test\")\n );\n}\n\nexport function readDraft(key: string): string {\n try {\n return globalThis.localStorage?.getItem(key) ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nexport function writeDraft(key: string, value: string): void {\n try {\n if (value.trim() === \"\") {\n globalThis.localStorage?.removeItem(key);\n } else {\n globalThis.localStorage?.setItem(key, value);\n }\n } catch {\n // Quota or privacy-mode failures keep the draft in memory only.\n }\n}\n\nconst tickListeners = new Set<() => void>();\nlet tickTimer: ReturnType<typeof setInterval> | undefined;\n\n/** One shared minute ticker for every relative timestamp on the page. */\nexport function onMinuteTick(listener: () => void): () => void {\n tickListeners.add(listener);\n tickTimer ??= setInterval(() => {\n for (const tick of [...tickListeners]) {\n tick();\n }\n }, 60_000);\n return () => {\n tickListeners.delete(listener);\n if (tickListeners.size === 0) {\n clearInterval(tickTimer);\n tickTimer = undefined;\n }\n };\n}\n\nconst UNITS: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n [\"year\", 31_536_000],\n [\"month\", 2_592_000],\n [\"week\", 604_800],\n [\"day\", 86_400],\n [\"hour\", 3_600],\n [\"minute\", 60],\n];\n\nexport function formatRelative(iso: string, now: number, locale: string): string {\n const seconds = Math.round((Date.parse(iso) - now) / 1000);\n const format = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n for (const [unit, size] of UNITS) {\n if (Math.abs(seconds) >= size) {\n return format.format(Math.round(seconds / size), unit);\n }\n }\n return format.format(0, \"second\");\n}\n\nexport function formatAbsolute(iso: string, locale: string): string {\n return new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeStyle: \"short\" }).format(\n new Date(iso),\n );\n}\n","import { createContext, useContext, useMemo } from \"react\";\nimport { PACKAGE_NAME } from \"../constants\";\nimport type { CommentsClient } from \"../core/client\";\nimport { normalizeForum } from \"../core/http\";\nimport { clientRegistry } from \"../core/registry\";\nimport {\n createTranslator,\n type Messages,\n resolveLocale,\n type SupportedLocale,\n type Translator,\n} from \"../messages\";\nimport type { Appearance, Theme } from \"./appearance\";\nimport type { CommentsEvent } from \"./events\";\nimport { noop } from \"./util\";\n\nexport interface CommentsContextValue {\n client: CommentsClient;\n t: Translator;\n locale: SupportedLocale;\n messages: Partial<Messages> | undefined;\n theme: Theme;\n appearance: Appearance | undefined;\n debug: boolean;\n emit: (event: CommentsEvent) => void;\n}\n\nexport const CommentsContext = createContext<CommentsContextValue | null>(null);\n\nconst defaultTranslator = createTranslator();\n\n/**\n * The provider's context, or a standalone one for an explicit `forum` that the\n * provider does not serve. Standalone clients come from the shared registry, so\n * every component naming the same forum shares one client.\n */\nexport function useCommentsContext(forum?: string): CommentsContextValue {\n const value = useOptionalCommentsContext(forum);\n if (!value) {\n throw new Error(\n `${PACKAGE_NAME}: render this inside <DiscourseComments forum=\"…\"> or pass a \\`forum\\` prop`,\n );\n }\n return value;\n}\n\n/** Like `useCommentsContext`, but `null` when nothing provides a client. */\nexport function useOptionalCommentsContext(forum?: string): CommentsContextValue | null {\n const context = useContext(CommentsContext);\n const standalone = useMemo((): CommentsContextValue | null => {\n if (forum === undefined || (context && normalizeForum(forum).base === context.client.forum)) {\n return null;\n }\n return {\n client: clientRegistry.acquire({ forum }),\n t: context?.t ?? defaultTranslator,\n locale: context?.locale ?? resolveLocale(undefined),\n messages: context?.messages,\n theme: context?.theme ?? \"auto\",\n appearance: context?.appearance,\n debug: context?.debug ?? false,\n emit: context?.emit ?? noop,\n };\n }, [forum, context]);\n\n return standalone ?? context;\n}\n\n/** The client the surrounding `<DiscourseComments>` provides. */\nexport function useClient(): CommentsClient {\n const context = useContext(CommentsContext);\n if (!context) {\n throw new Error(`${PACKAGE_NAME}: useClient() needs a <DiscourseComments> provider`);\n }\n return context.client;\n}\n","import { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport type { CommentsClient, CreateClientOptions } from \"../core/client\";\nimport { clientRegistry } from \"../core/registry\";\nimport { createTranslator, type Messages, resolveLocale } from \"../messages\";\nimport type { Appearance, Theme } from \"./appearance\";\nimport { CommentsContext, type CommentsContextValue } from \"./context\";\nimport type { CommentsEvent } from \"./events\";\n\ninterface ProviderOptions {\n children?: ReactNode;\n /** Default appearance for every widget inside; widgets merge their own on top. */\n appearance?: Appearance;\n /** UI language (`en`, `pt-BR`; other `pt*` map to `pt-BR`), also sent as `Accept-Language`. */\n locale?: string;\n /** Overrides for individual UI strings. */\n messages?: Partial<Messages>;\n theme?: Theme;\n /** Logs client activity and shows setup diagnostics outside localhost. */\n debug?: boolean;\n onEvent?: (event: CommentsEvent) => void;\n}\n\n// A closed popup is the reader's choice and an expired key is reported as `auth.signedOut`.\nconst QUIET_AUTH_ERRORS: ReadonlySet<string> = new Set([\"cancelled\", \"invalid_key\"]);\n\n/** Client options beyond `forum`; they apply when the shared client is first created. */\ntype ClientCreationOptions = Omit<CreateClientOptions, \"forum\" | \"locale\" | \"debug\">;\n\nexport type DiscourseCommentsProps = ProviderOptions &\n (\n | ({ forum: string; client?: undefined } & ClientCreationOptions)\n | { client: CommentsClient; forum?: undefined }\n );\n\n/**\n * Shares one client (auth, config, counts batching, realtime) with every\n * comments widget and hook below it.\n */\nexport function DiscourseComments(props: DiscourseCommentsProps) {\n const { children, appearance, locale, messages, theme = \"auto\", debug = false, onEvent } = props;\n const explicitClient = props.client;\n const forum = props.forum;\n\n const creation: CreateClientOptions | null =\n props.forum === undefined\n ? null\n : {\n forum: props.forum,\n fetch: props.fetch,\n headers: props.headers,\n storage: props.storage,\n clientId: props.clientId,\n locale,\n debug,\n };\n const client = useMemo(\n () => explicitClient ?? clientRegistry.acquire(creation!),\n [explicitClient, forum],\n );\n\n // Inline `messages={{ … }}` objects must not rebuild the translator every render.\n const messagesKey = messages ? JSON.stringify(messages) : \"\";\n const t = useMemo(() => createTranslator(locale, messages), [locale, messagesKey]);\n\n const onEventRef = useRef(onEvent);\n useEffect(() => {\n onEventRef.current = onEvent;\n });\n\n const value = useMemo(\n (): CommentsContextValue => ({\n client,\n t,\n locale: resolveLocale(locale),\n messages,\n theme,\n appearance,\n debug,\n emit: (event) => onEventRef.current?.(event),\n }),\n [client, t, locale, messagesKey, theme, appearance, debug],\n );\n\n useEffect(() => {\n let previous = client.auth.state();\n return client.auth.onChange((state) => {\n const wasSignedIn = previous.status === \"signed-in\";\n if (state.status === \"signed-in\" && state.user && !wasSignedIn) {\n onEventRef.current?.({ type: \"auth.signedIn\", user: state.user });\n } else if (state.status === \"anonymous\" && wasSignedIn) {\n onEventRef.current?.({\n type: \"auth.signedOut\",\n expired: state.error?.type === \"invalid_key\",\n });\n }\n const failure = state.error;\n if (failure && failure !== previous.error && !QUIET_AUTH_ERRORS.has(failure.type)) {\n onEventRef.current?.({ type: \"error\", action: \"signIn\", error: failure });\n }\n previous = state;\n });\n }, [client]);\n\n return <CommentsContext.Provider value={value}>{children}</CommentsContext.Provider>;\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * `auto` follows `prefers-color-scheme`, `inherit` leaves the colours to the\n * page, and `forum` applies the forum's own palettes, fonts and theme CSS.\n */\nexport type Theme = \"auto\" | \"light\" | \"dark\" | \"inherit\" | \"forum\";\n\n/** Design tokens; each is set as `--gc-<kebab-case name>` on the widget root. */\nexport type AppearanceVariable =\n | \"font\"\n | \"fg\"\n | \"fgMuted\"\n | \"bg\"\n | \"bgSubtle\"\n | \"border\"\n | \"accent\"\n | \"accentFg\"\n | \"danger\"\n | \"radius\"\n | \"shadow\"\n | \"space\"\n | \"avatarSize\";\n\n/** Elements that accept extra class names through `appearance.elements`. */\nexport type AppearanceElement =\n | \"root\"\n | \"header\"\n | \"count\"\n | \"sort\"\n | \"signIn\"\n | \"composer\"\n | \"textarea\"\n | \"toolbar\"\n | \"list\"\n | \"comment\"\n | \"avatar\"\n | \"meta\"\n | \"body\"\n | \"actions\"\n | \"menu\"\n | \"button\"\n | \"primaryButton\"\n | \"loadMore\"\n | \"pill\"\n | \"notice\"\n | \"dialog\";\n\nexport interface Appearance {\n /** Token overrides, e.g. `{ accent: \"var(--brand)\", radius: \"0\" }`. */\n variables?: Partial<Record<AppearanceVariable, string>>;\n /** Extra class names, e.g. `{ comment: \"card\", button: \"btn\" }`. */\n elements?: Partial<Record<AppearanceElement, string>>;\n}\n\nexport type ElementClasses = Partial<Record<AppearanceElement, string>>;\n\nexport function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/** Later layers win for variables; element classes accumulate. */\nexport function mergeAppearance(...layers: Array<Appearance | undefined>): Required<Appearance> {\n const variables: Partial<Record<AppearanceVariable, string>> = {};\n const elements: ElementClasses = {};\n for (const layer of layers) {\n if (!layer) {\n continue;\n }\n Object.assign(variables, layer.variables);\n for (const [name, value] of Object.entries(layer.elements ?? {}) as Array<\n [AppearanceElement, string | undefined]\n >) {\n elements[name] = cx(elements[name], value) || undefined;\n }\n }\n return { variables, elements };\n}\n\nexport function variablesStyle(variables: Appearance[\"variables\"]): CSSProperties {\n const style: Record<string, string> = {};\n for (const [name, value] of Object.entries(variables ?? {})) {\n if (value !== undefined && value !== \"\") {\n style[`--gc-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}`] = value;\n }\n }\n return style as CSSProperties;\n}\n","import type { ReactNode } from \"react\";\n\nfunction Icon({ children }: { children: ReactNode }) {\n return (\n <svg\n className=\"gc-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport function HeartIcon({ filled = false }: { filled?: boolean }) {\n return (\n <Icon>\n <path\n fill={filled ? \"currentColor\" : \"none\"}\n d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z\"\n />\n </Icon>\n );\n}\n\nexport function ReplyIcon() {\n return (\n <Icon>\n <path d=\"M9 17 4 12l5-5\" />\n <path d=\"M20 18v-2a4 4 0 0 0-4-4H4\" />\n </Icon>\n );\n}\n\nexport function MoreIcon() {\n return (\n <Icon>\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n </Icon>\n );\n}\n\nexport function PinIcon() {\n return (\n <Icon>\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.8V4h6v6.8l2 3.2H7z\" />\n </Icon>\n );\n}\n\nexport function BoldIcon() {\n return (\n <Icon>\n <path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" />\n </Icon>\n );\n}\n\nexport function ItalicIcon() {\n return (\n <Icon>\n <path d=\"M19 4h-9M14 20H5M15 4 9 20\" />\n </Icon>\n );\n}\n\nexport function LinkIcon() {\n return (\n <Icon>\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </Icon>\n );\n}\n\nexport function CodeIcon() {\n return (\n <Icon>\n <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />\n </Icon>\n );\n}\n\nexport function QuoteIcon() {\n return (\n <Icon>\n <path d=\"M3 21c3 0 7-1 7-8V5H3v7h4c0 3-1 5-4 6zM14 21c3 0 7-1 7-8V5h-7v7h4c0 3-1 5-4 6z\" />\n </Icon>\n );\n}\n\nexport function ImageIcon() {\n return (\n <Icon>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21\" />\n </Icon>\n );\n}\n\nexport function BackIcon() {\n return (\n <Icon>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n );\n}\n","import type { ForumColorScheme, ForumTheme } from \"../types\";\n\n/**\n * Turns the forum's theme data into CSS for the widget root: every forum\n * colour as `--gc-forum-<name>`, the fonts as `--gc-forum-font-<role>`, and\n * the widget tokens defaulting to the forum's colours while anything set\n * through `--gc-*` (inline or inherited) still wins.\n */\n\nconst FORUM_ROOT = '.gc-root[data-gc-theme=\"forum\"]';\nconst FORUM_STYLED_ROOT = '.gc-root--styled[data-gc-theme=\"forum\"]';\n\n/** Widget token → the forum colour it defaults to. */\nconst TOKEN_SOURCES: ReadonlyArray<readonly [token: string, color: string]> = [\n [\"fg\", \"primary\"],\n [\"fg-muted\", \"primary-medium\"],\n [\"bg\", \"secondary\"],\n [\"bg-subtle\", \"primary-very-low\"],\n [\"border\", \"primary-low\"],\n [\"accent\", \"tertiary\"],\n [\"accent-fg\", \"secondary\"],\n [\"danger\", \"danger\"],\n];\n\nconst SAFE_NAME = /^[\\w-]+$/;\n// Nothing that could end a declaration, a block or the style element itself.\nconst SAFE_VALUE = /^[^;{}<>]+$/;\nconst SAFE_FAMILY = /^[^\"'\\;{}<>]+$/;\nconst FONT_SOURCE = /^url\\(\"https?:\\/\\/[^\"\\s<>]+\"\\)(?:\\s+format\\(\"[\\w-]+\"\\))?$|^local\\(\"[^\"\\\\<>]+\"\\)$/;\nconst FONT_WEIGHT = /^(?:[1-9]\\d{0,2}|normal|bold)$/;\nconst SCHEME_TYPES = new Set([\"light\", \"dark\"]);\n\nconst STYLE_ATTRIBUTE = \"data-gc-forum-theme\";\nconst FONTS_ATTRIBUTE = \"data-gc-forum-fonts\";\n\nfunction colorDeclarations(scheme: ForumColorScheme): string {\n let css = \"\";\n for (const [name, value] of Object.entries(scheme.colors)) {\n if (SAFE_NAME.test(name) && SAFE_VALUE.test(value)) {\n css += `--gc-forum-${name}:${value};`;\n }\n }\n if (SCHEME_TYPES.has(scheme.type)) {\n css += `color-scheme:${scheme.type};`;\n }\n return css;\n}\n\nfunction fontDeclarations(fonts: ForumTheme[\"fonts\"]): string {\n let css = \"\";\n for (const [role, font] of Object.entries(fonts)) {\n if (font && SAFE_NAME.test(role) && SAFE_VALUE.test(font.stack)) {\n css += `--gc-forum-font-${role}:${font.stack};`;\n }\n }\n return css;\n}\n\nfunction tokenDeclarations(theme: ForumTheme): string {\n let css = \"\";\n for (const [token, color] of TOKEN_SOURCES) {\n if (color in theme.schemes.light.colors) {\n css += `--_gc-${token}:var(--gc-${token},var(--gc-forum-${color}));`;\n }\n }\n if (theme.fonts.body) {\n css += \"--_gc-font:var(--gc-font,var(--gc-forum-font-body));\";\n }\n return css;\n}\n\n/** The scoped token rules for a forum theme (unlayered; see `forumThemeStyleText`). */\nexport function forumThemeCss(theme: ForumTheme): string {\n const { light, dark } = theme.schemes;\n let css = `${FORUM_ROOT}{${colorDeclarations(light)}${fontDeclarations(theme.fonts)}}\\n`;\n css += `${FORUM_STYLED_ROOT}{${tokenDeclarations(theme)}}\\n`;\n if (dark) {\n css += `@media (prefers-color-scheme: dark){${FORUM_ROOT}{${colorDeclarations(dark)}}}\\n`;\n }\n return css;\n}\n\n/** `@font-face` rules for the fonts the forum serves; they belong to the document, not a shadow root. */\nexport function forumFontFacesCss(theme: ForumTheme): string {\n let css = \"\";\n // Body and heading are often the same font; one rule per face is enough.\n const seen = new Set<string>();\n for (const font of Object.values(theme.fonts)) {\n for (const face of font?.faces ?? []) {\n const weight = String(face.weight);\n const rule = `@font-face{font-family:\"${face.family}\";src:${face.src};font-weight:${weight};font-display:swap;}\\n`;\n if (\n SAFE_FAMILY.test(face.family) &&\n FONT_SOURCE.test(face.src) &&\n FONT_WEIGHT.test(weight) &&\n !seen.has(rule)\n ) {\n seen.add(rule);\n css += rule;\n }\n }\n }\n return css;\n}\n\n/** The theme's stylesheets, keeping only http(s) URLs (https when the forum is https). */\nexport function forumStylesheetUrls(theme: ForumTheme, forum: string): string[] {\n const secure = forum.startsWith(\"https:\");\n const urls: string[] = [];\n for (const href of theme.stylesheets) {\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n continue;\n }\n if (url.protocol === \"https:\" || (!secure && url.protocol === \"http:\")) {\n urls.push(url.href);\n }\n }\n return urls;\n}\n\n/**\n * The whole `<style>` for a forum theme: the layer order, the theme's\n * stylesheets imported into the `gc-forum` layer, then the token rules in the\n * same layer. Site CSS stays unlayered, so it wins over the forum's CSS\n * whatever its order or specificity, while the forum's wins over the defaults.\n */\nexport function forumThemeStyleText(theme: ForumTheme, forum: string): string {\n const imports = forumStylesheetUrls(theme, forum)\n .map((href) => `@import url(${JSON.stringify(href)}) layer(gc-forum);\\n`)\n .join(\"\");\n return `@layer gc-defaults, gc-forum;\\n${imports}@layer gc-forum{\\n${forumThemeCss(theme)}}\\n`;\n}\n\ntype StyleRoot = Document | ShadowRoot;\n\nfunction documentOf(root: StyleRoot): Document {\n return root.nodeType === 9 ? (root as Document) : (root as ShadowRoot).ownerDocument;\n}\n\nfunction replaceNodes(\n container: ParentNode,\n attribute: string,\n forum: string,\n key: string,\n create: () => Node[],\n): void {\n let current = false;\n for (const node of container.querySelectorAll(`[${attribute}]`)) {\n const value = node.getAttribute(attribute);\n if (value === key) {\n current = true;\n } else if (value?.startsWith(`${forum}#`)) {\n node.remove();\n }\n }\n if (!current) {\n container.append(...create());\n }\n}\n\n/**\n * Installs a forum theme where the widget lives: the page's `<head>` or the\n * custom element's shadow root, once per forum and theme version. An older\n * version of the same forum's theme is replaced; other forums are left alone.\n */\nexport function applyForumTheme(root: StyleRoot, theme: ForumTheme, forum: string): void {\n const doc = documentOf(root);\n const container: ParentNode = root.nodeType === 9 ? doc.head : (root as ShadowRoot);\n const key = `${forum}#${theme.version}`;\n\n replaceNodes(container, STYLE_ATTRIBUTE, forum, key, () => {\n const style = doc.createElement(\"style\");\n style.setAttribute(STYLE_ATTRIBUTE, key);\n style.textContent = forumThemeStyleText(theme, forum);\n return [style];\n });\n\n const faces = forumFontFacesCss(theme);\n if (faces) {\n replaceNodes(doc.head, FONTS_ATTRIBUTE, forum, key, () => {\n const style = doc.createElement(\"style\");\n style.setAttribute(FONTS_ATTRIBUTE, key);\n style.textContent = faces;\n return [style];\n });\n }\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { CommentsError } from \"../../errors\";\nimport type { Config } from \"../../types\";\nimport { toCommentsError } from \"../util\";\n\n// Lets widgets mounted after the first one render with the config right away.\nconst loaded = new WeakMap<CommentsClient, Config>();\n\nexport interface ConfigState {\n config: Config | null;\n error: CommentsError | null;\n /** Asks again after a failure. */\n reload(): void;\n}\n\ninterface ClientConfig {\n client: CommentsClient;\n config: Config | null;\n error: CommentsError | null;\n}\n\nfunction initial(client: CommentsClient): ClientConfig {\n return { client, config: loaded.get(client) ?? null, error: null };\n}\n\n/** The forum's comments config, refreshed when the reader signs in or out. */\nexport function useConfig(client: CommentsClient): ConfigState {\n const [stored, setState] = useState<ClientConfig>(() => initial(client));\n // State belongs to one client: after a switch (another forum), nothing of the\n // previous forum's providers or limits may show while the new config loads.\n let state = stored;\n if (stored.client !== client) {\n state = initial(client);\n setState(state);\n }\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n let active = true;\n const update = (next: (current: ClientConfig) => ClientConfig) =>\n setState((current) => (active && current.client === client ? next(current) : current));\n const load = () =>\n client.config().then(\n (config) => {\n loaded.set(client, config);\n update((current) =>\n current.config === config && !current.error ? current : { client, config, error: null },\n );\n },\n (error: unknown) => {\n update((current) => ({ ...current, error: toCommentsError(error) }));\n },\n );\n void load();\n // The client drops its cached config when the reader changes; this asks again.\n const stop = client.auth.onChange(() => void load());\n return () => {\n active = false;\n stop();\n };\n }, [client, attempt]);\n\n const reload = useCallback(() => setAttempt((count) => count + 1), []);\n return { config: state.config, error: state.error, reload };\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport type { AuthStatus, SignInOptions } from \"../../core/auth\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { CommentsError } from \"../../errors\";\nimport type { AuthProvider, Commenter, Config } from \"../../types\";\nimport { useCommentsContext } from \"../context\";\nimport { useConfig } from \"./use-config\";\n\nexport interface CommenterState {\n user: Commenter | null;\n status: AuthStatus;\n /** The forum's sign-in providers; empty until the forum config has loaded. */\n providers: readonly AuthProvider[];\n /** The forum is answering anonymously under load: treat the widget as read-only. */\n degraded: boolean;\n /** Why the last sign-in failed or the session ended. */\n error: CommentsError | null;\n /** Opens the forum's sign-in popup; call it from a click handler so it is not blocked. */\n signIn(options?: SignInOptions): Promise<Commenter | null>;\n cancelSignIn(): void;\n signOut(): Promise<void>;\n}\n\n/** The signed-in reader of the provider's forum (or of `forum`). */\nexport function useCommenter(options: { forum?: string } = {}): CommenterState {\n const { client } = useCommentsContext(options.forum);\n const { config } = useConfig(client);\n return useCommenterFor(client, config);\n}\n\nexport function useCommenterFor(client: CommentsClient, config: Config | null): CommenterState {\n const { auth } = client;\n const subscribe = useCallback((onChange: () => void) => auth.onChange(onChange), [auth]);\n const getState = useCallback(() => auth.state(), [auth]);\n const state = useSyncExternalStore(subscribe, getState, getState);\n const actions = useMemo(\n () => ({\n signIn: (signInOptions?: SignInOptions) => auth.signIn(signInOptions),\n cancelSignIn: () => auth.cancelSignIn(),\n signOut: () => auth.signOut(),\n }),\n [auth],\n );\n const providers = config?.auth_providers ?? auth.providers;\n\n return useMemo(\n () => ({\n user: state.user,\n status: state.status,\n providers,\n degraded: state.degraded,\n error: state.error,\n ...actions,\n }),\n [state, providers, actions],\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { CommentsError } from \"../../errors\";\nimport type { ForumTheme } from \"../../types\";\nimport { useCommentsContext } from \"../context\";\nimport { toCommentsError } from \"../util\";\n\n// Lets widgets mounted after the first one apply the theme right away.\nconst loaded = new WeakMap<CommentsClient, ForumTheme>();\n\nexport interface ForumThemeState {\n /** `null` until loaded (or when `enabled` is false). */\n theme: ForumTheme | null;\n error: CommentsError | null;\n}\n\ninterface ClientTheme extends ForumThemeState {\n client: CommentsClient;\n}\n\nfunction initial(client: CommentsClient): ClientTheme {\n return { client, theme: loaded.get(client) ?? null, error: null };\n}\n\nexport function useForumThemeFor(client: CommentsClient, enabled: boolean): ForumThemeState {\n const [stored, setState] = useState<ClientTheme>(() => initial(client));\n let state = stored;\n if (stored.client !== client) {\n state = initial(client);\n setState(state);\n }\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n let active = true;\n client.theme().then(\n (theme) => {\n loaded.set(client, theme);\n if (active) {\n setState((current) =>\n current.client === client && current.theme !== theme\n ? { client, theme, error: null }\n : current,\n );\n }\n },\n (error: unknown) => {\n if (active) {\n setState((current) =>\n current.client === client ? { ...current, error: toCommentsError(error) } : current,\n );\n }\n },\n );\n return () => {\n active = false;\n };\n }, [client, enabled]);\n\n return { theme: state.theme, error: state.error };\n}\n\n/**\n * The forum's palettes, fonts and theme stylesheets (`GET /comments/theme`),\n * for sites that style their own UI after the forum. `<Comments theme=\"forum\">`\n * applies the same data to the widget.\n */\nexport function useForumTheme(): ForumThemeState {\n const { client } = useCommentsContext();\n return useForumThemeFor(client, true);\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type { CommentsClient, OpenThreadOptions } from \"../../core/client\";\nimport { currentUrlWithoutHash } from \"../../core/env\";\nimport type { ThreadHandle, ThreadSnapshot } from \"../../core/thread\";\nimport type { CommentsError } from \"../../errors\";\nimport { useCommentsContext } from \"../context\";\nimport { toCommentsError } from \"../util\";\n\nexport interface UseThreadOptions extends OpenThreadOptions {\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n}\n\nexport interface UseThreadResult {\n /** `null` until the thread has been opened. */\n thread: ThreadHandle | null;\n /** Re-rendered on every change; `null` until the thread has been opened. */\n snapshot: ThreadSnapshot | null;\n /** Why the thread could not be opened; load failures live in `snapshot.error`. */\n error: CommentsError | null;\n /** Opens the thread again after `error`, or reloads it after a failed load. */\n retry(): void;\n}\n\n/**\n * Opens the page's thread and keeps a live snapshot of it. The handle is\n * disposed on unmount and reopened when `identifier`, `url` or (without `url`)\n * the page address changes; `sort` changes reload the same handle.\n */\nexport function useThread(options: UseThreadOptions = {}): UseThreadResult {\n const { client } = useCommentsContext(options.forum);\n return useThreadFor(client, options);\n}\n\nexport function useThreadFor(\n client: CommentsClient,\n { identifier, url, title, sort }: OpenThreadOptions,\n onOpenError?: (error: CommentsError) => void,\n): UseThreadResult {\n const [attempt, setAttempt] = useState(0);\n const [opened, setOpened] = useState<{ thread: ThreadHandle | null; error: CommentsError | null }>(\n { thread: null, error: null },\n );\n // Without an explicit url the thread follows the address bar (SPA navigation);\n // the hash is left out so deep links do not reopen it.\n const pageKey = url === undefined ? (currentUrlWithoutHash() ?? \"\") : \"\";\n const latest = useRef({ title, sort, onOpenError });\n latest.current = { title, sort, onOpenError };\n const requestedSort = useRef(sort);\n\n useEffect(() => {\n let active = true;\n let handle: ThreadHandle | null = null;\n setOpened((current) => (current.thread || current.error ? { thread: null, error: null } : current));\n // A microtask later, effects higher in the tree have set the page's title\n // and canonical link, which `open` reads by default.\n queueMicrotask(() => {\n if (!active) {\n return;\n }\n const { title: openTitle, sort: openSort } = latest.current;\n requestedSort.current = openSort;\n client.threads.open({ identifier, url, title: openTitle, sort: openSort }).then(\n (thread) => {\n if (!active) {\n thread.dispose();\n return;\n }\n handle = thread;\n setOpened({ thread, error: null });\n },\n (error: unknown) => {\n if (active) {\n const failure = toCommentsError(error);\n setOpened({ thread: null, error: failure });\n latest.current.onOpenError?.(failure);\n }\n },\n );\n });\n return () => {\n active = false;\n handle?.dispose();\n };\n }, [client, identifier, url, pageKey, attempt]);\n\n const { thread } = opened;\n\n useEffect(() => {\n if (thread && sort !== undefined && sort !== requestedSort.current) {\n requestedSort.current = sort;\n void thread.setSort(sort).catch(() => {});\n }\n }, [thread, sort]);\n\n const subscribe = useCallback(\n (onChange: () => void) => (thread ? thread.subscribe(onChange) : () => {}),\n [thread],\n );\n const getSnapshot = useCallback(() => thread?.snapshot() ?? null, [thread]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const retry = useCallback(() => {\n if (thread) {\n void thread.load().catch(() => {});\n } else {\n setAttempt((count) => count + 1);\n }\n }, [thread]);\n\n return { thread, snapshot, error: opened.error, retry };\n}\n","import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { PACKAGE_NAME, STORAGE_PREFIX } from \"../constants\";\nimport type { CommentsClient, OpenThreadOptions } from \"../core/client\";\nimport type { PostResult, ThreadHandle, ThreadSnapshot } from \"../core/thread\";\nimport { findComment } from \"../core/tree\";\nimport type { CommentsError } from \"../errors\";\nimport { createTranslator, type SupportedLocale, resolveLocale, type Translator } from \"../messages\";\nimport type { AnyThread, Comment, Config } from \"../types\";\nimport {\n type Appearance,\n cx,\n type ElementClasses,\n mergeAppearance,\n type Theme,\n variablesStyle,\n} from \"./appearance\";\nimport { useCommentsContext, useOptionalCommentsContext } from \"./context\";\nimport type { CommentsAction, CommentsEvent } from \"./events\";\nimport { applyForumTheme } from \"./forum-theme\";\nimport { type CommenterState, useCommenterFor } from \"./hooks/use-commenter\";\nimport { useConfig } from \"./hooks/use-config\";\nimport { useForumThemeFor } from \"./hooks/use-forum-theme\";\nimport { useThreadFor } from \"./hooks/use-thread\";\nimport { rootNodeOf, toCommentsError } from \"./util\";\n\n/**\n * Where signing in happens: `inline` shows a \"Join the conversation\" panel,\n * `on-submit` lets anonymous readers write and signs them in when they post,\n * `manual` leaves it to the site (`useCommenter().signIn()`).\n */\nexport type SignInMode = \"inline\" | \"on-submit\" | \"manual\";\n\nexport interface CommentsProps extends OpenThreadOptions {\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n /** Visual nesting levels; deeper replies collapse into \"Continue this thread\". */\n maxDepth?: number;\n signIn?: SignInMode;\n /**\n * With `signIn=\"manual\"`, called when an anonymous reader tries to like or\n * reply, so the site can start its own sign-in. Without it those actions are\n * unavailable to anonymous readers in manual mode.\n */\n onSignInRequired?: () => void;\n /** Hides every write action. */\n readOnly?: boolean;\n /** Comment id to scroll to and highlight; defaults to the `#gc-<id>` fragment. */\n highlight?: number | null;\n /** Shown above the composer; defaults to the forum's setting. */\n guidelinesUrl?: string;\n onPosted?: (result: PostResult) => void;\n appearance?: Appearance;\n /** Renders without the default styles; class names stay for targeting. */\n unstyled?: boolean;\n theme?: Theme;\n locale?: string;\n className?: string;\n}\n\nexport interface RootProps extends CommentsProps {\n children?: ReactNode;\n}\n\nexport interface FocusView {\n /** The comment shown as the top of the focused branch. */\n id: number;\n ancestors: readonly Comment[];\n truncated: boolean;\n}\n\nexport interface RootContextValue {\n client: CommentsClient;\n t: Translator;\n locale: SupportedLocale;\n thread: ThreadHandle | null;\n snapshot: ThreadSnapshot | null;\n /** Why the thread could not be opened. */\n openError: CommentsError | null;\n retry(): void;\n config: Config | null;\n configError: CommentsError | null;\n commenter: CommenterState;\n maxDepth: number;\n signInMode: SignInMode;\n readOnly: boolean;\n guidelinesUrl: string | null;\n debug: boolean;\n elements: ElementClasses;\n /** False when the site or the forum made the widget read-only. */\n writable: boolean;\n /** Whether the main composer is shown. */\n canCompose: boolean;\n /** Signed in, but the forum does not let this reader comment here. */\n commentingDenied: boolean;\n /** Whether \"Reply\" is offered (it may start a sign-in). */\n canReply: boolean;\n /** An anonymous reader's like or reply can lead to a sign-in (popup, or the site's own). */\n canRequestSignIn: boolean;\n focusView: FocusView | null;\n continueThread(commentId: number): Promise<void>;\n closeFocusView(): void;\n highlightId: number | null;\n /** Moves focus to a comment once it is rendered. */\n focusComment(commentId: number, options?: { scroll?: boolean }): void;\n /**\n * Resolves `true` once a reader is signed in; must be called from a click\n * handler. In manual mode it only notifies the site and resolves `false`.\n */\n ensureSignedIn(): Promise<boolean>;\n reportError(action: CommentsAction, error: unknown): void;\n emit(event: CommentsEvent): void;\n onPosted: ((result: PostResult) => void) | undefined;\n /** Storage key for a composer draft in this thread, or `null` before the thread is open. */\n draftKey(scope: string): string | null;\n}\n\nconst RootContext = createContext<RootContextValue | null>(null);\n\nexport function useRootContext(component = \"This component\"): RootContextValue {\n const value = useContext(RootContext);\n if (!value) {\n throw new Error(`${PACKAGE_NAME}: ${component} must be rendered inside <Comments.Root>`);\n }\n return value;\n}\n\n/**\n * Opens the thread and provides it to the primitives inside. Without a\n * provider or `forum` nothing can be opened, so it renders a quiet notice\n * instead of throwing (a consumer's tests may mount pages without one).\n */\nexport function Root(props: RootProps) {\n const context = useOptionalCommentsContext(props.forum);\n if (!context) {\n return (\n <section className={cx(\"gc-root\", \"gc-root--unconfigured\", props.className)} data-gc-unconfigured=\"\">\n <p className=\"gc-notice\">{`${PACKAGE_NAME}: render <Comments> inside <DiscourseComments forum=\"…\"> or pass a forum prop.`}</p>\n </section>\n );\n }\n return <ConfiguredRoot {...props} />;\n}\n\nfunction ConfiguredRoot(props: RootProps) {\n const {\n forum,\n identifier,\n url,\n title,\n sort,\n maxDepth = 2,\n signIn: signInMode = \"inline\",\n onSignInRequired,\n readOnly = false,\n highlight,\n guidelinesUrl,\n onPosted,\n appearance,\n unstyled = false,\n theme: themeProp,\n locale: localeProp,\n className,\n children,\n } = props;\n const context = useCommentsContext(forum);\n const { client, emit } = context;\n const rootRef = useRef<HTMLElement>(null);\n\n const t = useMemo(\n () => (localeProp ? createTranslator(localeProp, context.messages) : context.t),\n [localeProp, context.messages, context.t],\n );\n const locale = localeProp ? resolveLocale(localeProp) : context.locale;\n const theme = themeProp ?? context.theme;\n const { variables, elements } = useMemo(\n () => mergeAppearance(context.appearance, appearance),\n [context.appearance, appearance],\n );\n\n const threadIdRef = useRef<string | undefined>(undefined);\n const reportError = useCallback(\n (action: CommentsAction, error: unknown) =>\n emit({ type: \"error\", action, error: toCommentsError(error), threadId: threadIdRef.current }),\n [emit],\n );\n\n const { thread, snapshot, error: openError, retry: retryThread } = useThreadFor(\n client,\n { identifier, url, title, sort },\n (error) => reportError(\"open\", error),\n );\n threadIdRef.current = thread?.id;\n const { config, error: configError, reload: reloadConfig } = useConfig(client);\n const commenter = useCommenterFor(client, config);\n\n const forumTheme = useForumThemeFor(client, theme === \"forum\");\n useEffect(() => {\n const element = rootRef.current;\n if (theme === \"forum\" && forumTheme.theme && element) {\n applyForumTheme(rootNodeOf(element), forumTheme.theme, client.forum);\n }\n }, [theme, forumTheme.theme, client.forum]);\n const themeError = theme === \"forum\" ? forumTheme.error : null;\n useEffect(() => {\n if (themeError) {\n reportError(\"theme\", themeError);\n }\n }, [themeError, reportError]);\n const retry = useCallback(() => {\n retryThread();\n if (configError) {\n reloadConfig();\n }\n }, [retryThread, configError, reloadConfig]);\n\n const loadError = snapshot?.status === \"error\" ? snapshot.error : null;\n useEffect(() => {\n if (loadError) {\n reportError(\"load\", loadError);\n }\n }, [loadError, reportError]);\n\n // `can_comment` is per reader; until the thread is reloaded for a reader who\n // just signed in, the anonymous value would hide the composer mid-post.\n const userId = commenter.user?.id ?? null;\n const [authEpoch, setAuthEpoch] = useState<{ userId: number | null; thread: AnyThread | null }>(\n { userId, thread: null },\n );\n if (authEpoch.userId !== userId) {\n setAuthEpoch({ userId, thread: snapshot?.thread ?? null });\n }\n const permissionsFresh = !!snapshot && snapshot.thread !== authEpoch.thread;\n\n const signedIn = commenter.status === \"signed-in\";\n const closed = snapshot?.thread.closed ?? false;\n const writable = !readOnly && !commenter.degraded;\n const open = !!snapshot && snapshot.status !== \"error\" && writable && !closed;\n const commentingDenied =\n open && signedIn && permissionsFresh && !snapshot.thread.can_comment;\n const canCompose = open && !commentingDenied && (signedIn || signInMode === \"on-submit\");\n const canReply = open && !commentingDenied;\n\n const [focusView, setFocusView] = useState<FocusView | null>(null);\n // Every request that changes the focused branch takes a number; late answers to older ones are dropped.\n const viewRequest = useRef(0);\n const [highlightId, setHighlightId] = useState<number | null>(null);\n const focusRequest = useRef<{ id: number; scroll: boolean } | null>(null);\n const [, setFocusTick] = useState(0);\n\n const focusComment = useCallback((commentId: number, options?: { scroll?: boolean }) => {\n focusRequest.current = { id: commentId, scroll: options?.scroll ?? false };\n setFocusTick((tick) => tick + 1);\n }, []);\n\n // Runs after every render: a requested comment may only appear a render later.\n useEffect(() => {\n const request = focusRequest.current;\n const element = request && rootRef.current?.querySelector<HTMLElement>(`#gc-${request.id}`);\n if (!request || !element) {\n return;\n }\n focusRequest.current = null;\n if (request.scroll) {\n element.scrollIntoView?.({ block: \"center\" });\n }\n element.focus({ preventScroll: request.scroll });\n });\n\n useEffect(() => {\n viewRequest.current++;\n setFocusView(null);\n }, [thread]);\n\n const continueThread = useCallback(\n async (commentId: number) => {\n if (!thread) {\n return;\n }\n const request = ++viewRequest.current;\n try {\n const context = await thread.context(commentId);\n if (request !== viewRequest.current) {\n return;\n }\n setFocusView({\n id: commentId,\n ancestors: context.ancestors,\n truncated: context.ancestorsTruncated,\n });\n focusComment(commentId);\n } catch (error) {\n if (request === viewRequest.current) {\n reportError(\"context\", error);\n }\n }\n },\n [thread, focusComment, reportError],\n );\n\n const closeFocusView = useCallback(() => {\n viewRequest.current++;\n if (focusView) {\n focusComment(focusView.id);\n }\n setFocusView(null);\n }, [focusView, focusComment]);\n\n const hashId = useHashCommentId();\n const requestedHighlight = highlight ?? hashId;\n const handledHighlight = useRef<{ thread: ThreadHandle; id: number } | null>(null);\n const ready = snapshot?.status === \"ready\";\n\n useEffect(() => {\n const handled = handledHighlight.current;\n if (\n !thread ||\n !ready ||\n requestedHighlight === null ||\n (handled?.thread === thread && handled.id === requestedHighlight)\n ) {\n return;\n }\n handledHighlight.current = { thread, id: requestedHighlight };\n const id = requestedHighlight;\n const request = ++viewRequest.current;\n void (async () => {\n let location = findComment(thread.snapshot().comments, id);\n if (!location) {\n try {\n await thread.context(id);\n } catch (error) {\n if (request === viewRequest.current) {\n reportError(\"context\", error);\n }\n return;\n }\n location = findComment(thread.snapshot().comments, id);\n }\n if (!location || request !== viewRequest.current) {\n return;\n }\n // Every request replaces the focused branch: shallow targets render in the main tree.\n if (location.depth > maxDepth) {\n const cut = location.depth - maxDepth;\n const tree = thread.snapshot().comments;\n const ancestors = location.path\n .slice(0, cut)\n .map((ancestorId) => findComment(tree, ancestorId)?.node)\n .filter((node): node is Comment => node !== undefined);\n setFocusView({ id: location.path[cut]!, ancestors, truncated: false });\n } else {\n setFocusView(null);\n }\n setHighlightId(id);\n focusComment(id, { scroll: true });\n })();\n }, [thread, ready, requestedHighlight, maxDepth, focusComment, reportError]);\n\n const onSignInRequiredRef = useRef(onSignInRequired);\n onSignInRequiredRef.current = onSignInRequired;\n const canRequestSignIn = signInMode !== \"manual\" || onSignInRequired !== undefined;\n\n const ensureSignedIn = useCallback((): Promise<boolean> => {\n if (client.auth.status === \"signed-in\") {\n return Promise.resolve(true);\n }\n // Manual mode never opens the forum's popup: the site owns sign-in.\n if (signInMode === \"manual\") {\n onSignInRequiredRef.current?.();\n return Promise.resolve(false);\n }\n return client.auth.signIn().then(\n (user) => user !== null,\n () => false,\n );\n }, [client, signInMode]);\n\n const threadKey = snapshot?.thread.key;\n const draftKey = useCallback(\n (scope: string) =>\n threadKey === undefined ? null : `${STORAGE_PREFIX}:${client.forum}:draft:${threadKey}:${scope}`,\n [client.forum, threadKey],\n );\n\n const value: RootContextValue = {\n client,\n t,\n locale,\n thread,\n snapshot,\n openError,\n retry,\n config,\n configError,\n commenter,\n maxDepth,\n signInMode,\n readOnly,\n guidelinesUrl: guidelinesUrl ?? config?.guidelines_url ?? null,\n debug: context.debug,\n elements,\n writable,\n canCompose,\n commentingDenied,\n canReply,\n canRequestSignIn,\n focusView,\n continueThread,\n closeFocusView,\n highlightId,\n focusComment,\n ensureSignedIn,\n reportError,\n emit,\n onPosted,\n draftKey,\n };\n\n return (\n <RootContext.Provider value={value}>\n <section\n ref={rootRef}\n className={cx(\"gc-root\", !unstyled && \"gc-root--styled\", elements.root, className)}\n data-gc-theme={theme === \"inherit\" ? undefined : theme}\n style={variablesStyle(variables)}\n aria-label={t(\"comments\")}\n aria-busy={!snapshot && !openError ? true : undefined}\n >\n {children}\n </section>\n </RootContext.Provider>\n );\n}\n\nfunction useHashCommentId(): number | null {\n const [id, setId] = useState<number | null>(null);\n useEffect(() => {\n const read = () => {\n const match = /^#gc-(\\d+)$/.exec(window.location.hash);\n setId(match ? Number(match[1]) : null);\n };\n read();\n window.addEventListener(\"hashchange\", read);\n return () => window.removeEventListener(\"hashchange\", read);\n }, []);\n return id;\n}\n","// Pure textarea edits for the composer toolbar, mentions and uploads.\nimport type { Upload } from \"../../types\";\n\nexport interface TextEdit {\n value: string;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport type Format = \"bold\" | \"italic\" | \"link\" | \"code\" | \"quote\";\n\nexport function applyFormat(value: string, start: number, end: number, format: Format): TextEdit {\n const selected = value.slice(start, end);\n switch (format) {\n case \"bold\":\n return wrap(value, start, end, \"**\", \"**\");\n case \"italic\":\n return wrap(value, start, end, \"*\", \"*\");\n case \"code\":\n return selected.includes(\"\\n\") ? fence(value, start, end) : wrap(value, start, end, \"`\", \"`\");\n case \"link\": {\n // The URL placeholder is selected so typing replaces it.\n const url = \"https://\";\n const urlStart = start + selected.length + 3;\n return {\n value: `${value.slice(0, start)}[${selected}](${url})${value.slice(end)}`,\n selectionStart: urlStart,\n selectionEnd: urlStart + url.length,\n };\n }\n case \"quote\":\n return quote(value, start, end);\n }\n}\n\nexport function insertText(value: string, start: number, end: number, text: string): TextEdit {\n const caret = start + text.length;\n return {\n value: value.slice(0, start) + text + value.slice(end),\n selectionStart: caret,\n selectionEnd: caret,\n };\n}\n\n/** Discourse's upload markdown: ``. */\nexport function imageMarkdown(upload: Upload): string {\n const name = upload.original_filename.replace(/\\.[^.]+$/, \"\").replace(/[[\\]|]/g, \"\");\n const size = upload.width && upload.height ? `|${upload.width}x${upload.height}` : \"\";\n return ``;\n}\n\nexport interface MentionQuery {\n /** Index of the `@`. */\n start: number;\n query: string;\n}\n\n/** The `@partial` username right before the caret, if any. */\nexport function mentionQuery(value: string, caret: number): MentionQuery | null {\n const match = /(?:^|[\\s([{])@([\\w.-]{1,60})$/.exec(value.slice(0, caret));\n if (!match) {\n return null;\n }\n const query = match[1]!;\n return { start: caret - query.length - 1, query };\n}\n\nfunction wrap(value: string, start: number, end: number, before: string, after: string): TextEdit {\n return {\n value: value.slice(0, start) + before + value.slice(start, end) + after + value.slice(end),\n selectionStart: start + before.length,\n selectionEnd: end + before.length,\n };\n}\n\nfunction fence(value: string, start: number, end: number): TextEdit {\n const before = start > 0 && value[start - 1] !== \"\\n\" ? \"\\n\" : \"\";\n const open = `${before}\\`\\`\\`\\n`;\n const close = \"\\n```\\n\";\n return {\n value: value.slice(0, start) + open + value.slice(start, end) + close + value.slice(end),\n selectionStart: start + open.length,\n selectionEnd: end + open.length,\n };\n}\n\nfunction quote(value: string, start: number, end: number): TextEdit {\n const lineStart = value.lastIndexOf(\"\\n\", start - 1) + 1;\n const lines = value.slice(lineStart, end).split(\"\\n\");\n const quoted = lines.map((line) => `> ${line}`).join(\"\\n\");\n return {\n value: value.slice(0, lineStart) + quoted + value.slice(end),\n selectionStart: start + 2,\n selectionEnd: end + 2 * lines.length,\n };\n}\n","import { type KeyboardEvent, useCallback, useEffect, useState } from \"react\";\nimport type { CommentsClient } from \"../../core/client\";\nimport type { Commenter } from \"../../types\";\nimport { type MentionQuery, mentionQuery } from \"./markdown\";\n\nconst SEARCH_DELAY_MS = 150;\n\nexport interface Mentions {\n open: boolean;\n users: readonly Commenter[];\n active: number;\n setActive(index: number): void;\n /** Returns true when the key was handled by the suggestion list. */\n onKeyDown(event: KeyboardEvent<HTMLTextAreaElement>): boolean;\n pick(index: number): void;\n}\n\n/** `@username` autocomplete for the composer textarea. */\nexport function useMentions(options: {\n client: CommentsClient;\n threadId: string;\n enabled: boolean;\n value: string;\n caret: number;\n onPick(query: MentionQuery, username: string): void;\n}): Mentions {\n const { client, threadId, enabled, value, caret, onPick } = options;\n const query = enabled ? mentionQuery(value, caret) : null;\n const [results, setResults] = useState<{ query: string; users: readonly Commenter[] }>({\n query: \"\",\n users: [],\n });\n const [active, setActive] = useState(0);\n const [dismissed, setDismissed] = useState<string | null>(null);\n const queryKey = query ? `${query.start}:${query.query}` : null;\n\n useEffect(() => {\n if (!query) {\n return;\n }\n let current = true;\n const timer = setTimeout(() => {\n client.mentions(query.query, threadId).then(\n (users) => {\n if (current) {\n setResults({ query: query.query, users });\n setActive(0);\n }\n },\n () => {},\n );\n }, SEARCH_DELAY_MS);\n return () => {\n current = false;\n clearTimeout(timer);\n };\n }, [client, threadId, query?.query]);\n\n const open =\n query !== null &&\n results.query === query.query &&\n results.users.length > 0 &&\n dismissed !== queryKey;\n\n const pick = useCallback(\n (index: number) => {\n const user = results.users[index];\n if (query && user) {\n onPick(query, user.username);\n }\n },\n [results.users, query, onPick],\n );\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!open) {\n return false;\n }\n const count = results.users.length;\n switch (event.key) {\n case \"ArrowDown\":\n setActive((index) => (index + 1) % count);\n break;\n case \"ArrowUp\":\n setActive((index) => (index - 1 + count) % count);\n break;\n case \"Enter\":\n case \"Tab\":\n if (event.metaKey || event.ctrlKey) {\n return false;\n }\n pick(active);\n break;\n case \"Escape\":\n setDismissed(queryKey);\n break;\n default:\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n return true;\n };\n\n return { open, users: results.users, active, setActive, onKeyDown, pick };\n}\n","import {\n type ChangeEvent,\n type ClipboardEvent,\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createComposerTimer } from \"../../core/composer\";\nimport type { ThreadHandle } from \"../../core/thread\";\nimport type { CommentsError } from \"../../errors\";\nimport type { MessageKey, Translator } from \"../../messages\";\nimport type { Comment } from \"../../types\";\nimport { cx } from \"../appearance\";\nimport {\n BoldIcon,\n CodeIcon,\n ImageIcon,\n ItalicIcon,\n LinkIcon,\n QuoteIcon,\n} from \"../icons\";\nimport { type RootContextValue, useRootContext } from \"../root\";\nimport {\n readDraft,\n rootNodeOf,\n toCommentsError,\n useIsomorphicLayoutEffect,\n writeDraft,\n} from \"../util\";\nimport {\n applyFormat,\n type Format,\n imageMarkdown,\n insertText,\n type MentionQuery,\n type TextEdit,\n} from \"./markdown\";\nimport { useMentions } from \"./use-mentions\";\n\nexport interface ComposerProps {\n /** Replies to this comment (the inline reply composer). */\n replyTo?: Comment;\n /** Edits this comment; its markdown is loaded from the forum. */\n editing?: Comment;\n placeholder?: string;\n autoFocus?: boolean;\n /** Called after a successful post or save, and when the reader cancels. */\n onDone?: () => void;\n className?: string;\n}\n\n/**\n * The markdown composer. Without `replyTo`/`editing` it is the thread's main\n * composer and renders only when the reader may write (or may sign in on submit).\n */\nexport function Composer(props: ComposerProps) {\n const root = useRootContext(\"Comments.Composer\");\n if (!root.thread || !root.snapshot || !composerAllowed(root, props.editing)) {\n return null;\n }\n return <ComposerForm {...props} thread={root.thread} />;\n}\n\n/** Re-checked on every render, so a composer disappears when the reader loses the right to write. */\nfunction composerAllowed(root: RootContextValue, editing: Comment | undefined): boolean {\n if (editing) {\n return root.writable && root.commenter.status === \"signed-in\" && editing.can.edit;\n }\n return root.canCompose;\n}\n\nconst FORMATS: ReadonlyArray<{ format: Format; label: MessageKey; icon: ReactNode }> = [\n { format: \"bold\", label: \"bold\", icon: <BoldIcon /> },\n { format: \"italic\", label: \"italic\", icon: <ItalicIcon /> },\n { format: \"link\", label: \"insertLink\", icon: <LinkIcon /> },\n { format: \"code\", label: \"code\", icon: <CodeIcon /> },\n { format: \"quote\", label: \"quote\", icon: <QuoteIcon /> },\n];\n\nfunction ComposerForm({\n replyTo,\n editing,\n placeholder,\n autoFocus,\n onDone,\n className,\n thread,\n}: ComposerProps & { thread: ThreadHandle }) {\n const root = useRootContext();\n const { t, client, config, commenter, elements } = root;\n const id = useId();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const pendingSelection = useRef<[number, number] | null>(null);\n const [timer] = useState(createComposerTimer);\n\n const draftKey = editing ? null : root.draftKey(replyTo ? `reply:${replyTo.id}` : \"root\");\n const [value, setValueState] = useState(() => (draftKey ? readDraft(draftKey) : \"\"));\n const valueRef = useRef(value);\n valueRef.current = value;\n const [caret, setCaret] = useState(0);\n // Saving an edit before the original markdown arrived would overwrite text the reader never saw.\n const [raw, setRaw] = useState<\"loading\" | \"loaded\" | \"failed\">(editing ? \"loading\" : \"loaded\");\n const [rawAttempt, setRawAttempt] = useState(0);\n const [tab, setTab] = useState<\"write\" | \"preview\">(\"write\");\n const [preview, setPreview] = useState<{ html: string | null; loading: boolean; failed: boolean }>(\n { html: null, loading: false, failed: false },\n );\n const previewRequest = useRef(0);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<CommentsError | null>(null);\n const [uploading, setUploading] = useState(0);\n const [waitSeconds, startCountdown] = useCountdown();\n // A submission waiting for sign-in only posts if nothing invalidated it meanwhile.\n const submission = useRef(0);\n const allowedRef = useRef(true);\n allowedRef.current = composerAllowed(root, editing);\n\n const setValue = useCallback(\n (next: string, selection?: [number, number]) => {\n valueRef.current = next;\n setValueState(next);\n if (draftKey) {\n writeDraft(draftKey, next);\n }\n if (selection) {\n pendingSelection.current = selection;\n }\n },\n [draftKey],\n );\n\n const applyEdit = useCallback(\n (edit: TextEdit) => setValue(edit.value, [edit.selectionStart, edit.selectionEnd]),\n [setValue],\n );\n\n useIsomorphicLayoutEffect(() => {\n const selection = pendingSelection.current;\n const textarea = textareaRef.current;\n if (selection && textarea) {\n pendingSelection.current = null;\n textarea.focus();\n textarea.setSelectionRange(selection[0], selection[1]);\n setCaret(selection[1]);\n }\n });\n\n useEffect(() => {\n const textarea = textareaRef.current;\n if (autoFocus && !editing && textarea) {\n const end = valueRef.current.length;\n textarea.focus();\n textarea.setSelectionRange(end, end);\n setCaret(end);\n }\n }, [autoFocus, editing]);\n\n useEffect(\n () => () => {\n submission.current++;\n },\n [thread],\n );\n\n const editingId = editing?.id;\n useEffect(() => {\n if (editingId === undefined) {\n return;\n }\n let active = true;\n setRaw(\"loading\");\n setError(null);\n thread.raw(editingId).then(\n (source) => {\n if (active) {\n setValue(source, [source.length, source.length]);\n setRaw(\"loaded\");\n }\n },\n (failure: unknown) => {\n if (active) {\n setError(toCommentsError(failure));\n setRaw(\"failed\");\n }\n },\n );\n return () => {\n active = false;\n };\n }, [thread, editingId, setValue, rawAttempt]);\n\n useEffect(() => {\n if (waitSeconds === 0) {\n setError((current) => (current?.type === \"rate_limit\" ? null : current));\n }\n }, [waitSeconds]);\n\n const signedIn = commenter.status === \"signed-in\";\n const signingIn = commenter.status === \"signing-in\";\n const uploadsEnabled = signedIn && config?.features.uploads === true;\n const min = Math.max(config?.limits.min_post_length ?? 1, 1);\n const max = config?.limits.max_post_length ?? Number.POSITIVE_INFINITY;\n const length = value.trim().length;\n const tooShort = length > 0 && length < min;\n const tooLong = length > max;\n const loadingRaw = raw === \"loading\";\n const editable = raw === \"loaded\" && !submitting;\n const busy = submitting || raw !== \"loaded\" || uploading > 0 || waitSeconds > 0 || signingIn;\n const canSubmit = !busy && length >= min && !tooLong;\n\n const onPickMention = useCallback(\n (query: MentionQuery, username: string) =>\n applyEdit(insertText(valueRef.current, query.start, caret, `@${username} `)),\n [applyEdit, caret],\n );\n const mentions = useMentions({\n client,\n threadId: thread.id,\n enabled: signedIn && config?.features.mentions !== false && tab === \"write\" && editable,\n value,\n caret,\n onPick: onPickMention,\n });\n\n async function send() {\n if (!allowedRef.current) {\n return;\n }\n const body = valueRef.current;\n setSubmitting(true);\n setError(null);\n try {\n if (editing) {\n await thread.edit(editing.id, body);\n onDone?.();\n return;\n }\n const result = await thread.post({ body, replyTo: replyTo?.id, composer: timer });\n // Anything that changed the text while the request ran stays in the composer.\n if (valueRef.current === body) {\n setValue(\"\");\n }\n setTab(\"write\");\n if (result.type === \"created\") {\n root.emit({ type: \"comment.posted\", threadId: thread.id, comment: result.comment });\n if (replyTo) {\n root.focusComment(result.comment.id);\n }\n } else {\n root.emit({ type: \"comment.pending\", threadId: thread.id, pending: result.pending });\n }\n root.onPosted?.(result);\n onDone?.();\n } catch (failure) {\n const commentsError = toCommentsError(failure);\n if (commentsError.type === \"rate_limit\" && commentsError.waitSeconds) {\n startCountdown(commentsError.waitSeconds);\n }\n setError(commentsError);\n root.reportError(editing ? \"edit\" : \"post\", commentsError);\n } finally {\n setSubmitting(false);\n }\n }\n\n function submit() {\n if (!canSubmit) {\n return;\n }\n if (signedIn) {\n void send();\n return;\n }\n if (root.signInMode === \"on-submit\") {\n const token = ++submission.current;\n setError(null);\n // Started synchronously so the popup counts as part of the click or key press.\n client.auth.signIn().then(\n (user) => {\n if (user && token === submission.current) {\n void send();\n }\n },\n (failure: unknown) => {\n const signInError = toCommentsError(failure);\n // The inline panel is hidden in this mode, so the composer reports the failure.\n if (token === submission.current && signInError.type !== \"cancelled\") {\n setError(signInError);\n }\n },\n );\n }\n }\n\n function cancel() {\n submission.current++;\n onDone?.();\n }\n\n function format(kind: Format) {\n const textarea = textareaRef.current;\n const start = textarea?.selectionStart ?? valueRef.current.length;\n const end = textarea?.selectionEnd ?? start;\n applyEdit(applyFormat(valueRef.current, start, end, kind));\n }\n\n async function upload(files: readonly File[], pasted = false) {\n for (const file of files.filter((candidate) => candidate.type.startsWith(\"image/\"))) {\n setUploading((count) => count + 1);\n try {\n const uploaded = await client.attachments.upload(thread.id, file, { pasted });\n const textarea = textareaRef.current;\n const current = valueRef.current;\n const start = textarea?.selectionStart ?? current.length;\n const end = textarea?.selectionEnd ?? start;\n const before = start > 0 && current[start - 1] !== \"\\n\" ? \"\\n\" : \"\";\n applyEdit(insertText(current, start, end, `${before}${imageMarkdown(uploaded)}\\n`));\n } catch (failure) {\n setError(toCommentsError(failure));\n root.reportError(\"upload\", failure);\n } finally {\n setUploading((count) => count - 1);\n }\n }\n }\n\n function showPreview() {\n setTab(\"preview\");\n const body = valueRef.current;\n const request = ++previewRequest.current;\n if (!body.trim()) {\n setPreview({ html: null, loading: false, failed: false });\n return;\n }\n setPreview({ html: null, loading: true, failed: false });\n client.preview(body).then(\n (html) => {\n if (request === previewRequest.current) {\n setPreview({ html, loading: false, failed: false });\n }\n },\n (failure: unknown) => {\n if (request === previewRequest.current) {\n setPreview({ html: null, loading: false, failed: true });\n root.reportError(\"preview\", failure);\n }\n },\n );\n }\n\n function onChange(event: ChangeEvent<HTMLTextAreaElement>) {\n timer.typing();\n setValue(event.target.value);\n setCaret(event.target.selectionStart);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (mentions.onKeyDown(event)) {\n return;\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n submit();\n } else if (event.key === \"Escape\" && (replyTo || editing)) {\n event.preventDefault();\n cancel();\n }\n }\n\n function onPaste(event: ClipboardEvent<HTMLTextAreaElement>) {\n const files = [...event.clipboardData.files];\n if (uploadsEnabled && editable && files.some((file) => file.type.startsWith(\"image/\"))) {\n event.preventDefault();\n void upload(files, true);\n }\n }\n\n function onDragOver(event: DragEvent<HTMLTextAreaElement>) {\n if (uploadsEnabled && editable && event.dataTransfer.types.includes(\"Files\")) {\n event.preventDefault();\n }\n }\n\n function onDrop(event: DragEvent<HTMLTextAreaElement>) {\n const files = [...event.dataTransfer.files];\n if (uploadsEnabled && editable && files.length > 0) {\n event.preventDefault();\n void upload(files);\n }\n }\n\n function onTabKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (tab === \"write\") {\n showPreview();\n } else {\n setTab(\"write\");\n }\n rootNodeOf(event.currentTarget)\n .getElementById(`${id}-${tab === \"write\" ? \"preview\" : \"write\"}-tab`)\n ?.focus();\n }\n }\n\n const label = editing\n ? t(\"editing\")\n : replyTo\n ? t(\"replyingTo\", { username: replyTo.author?.username ?? \"\" })\n : t(\"composerPlaceholder\");\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const listId = `${id}-mentions`;\n const messages = error ? errorMessages(error, waitSeconds, t) : [];\n const submitLabel = editing ? t(\"save\") : replyTo ? t(\"reply\") : t(\"post\");\n const defaultPlaceholder = editing\n ? undefined\n : replyTo\n ? t(\"replyPlaceholder\")\n : t(\"composerPlaceholder\");\n const hint = tooLong ? t(\"tooLong\", { max }) : tooShort ? t(\"tooShort\", { min }) : null;\n const canPreview = signedIn;\n const isMain = !replyTo && !editing;\n\n return (\n <div\n className={cx(\n \"gc-composer\",\n replyTo && \"gc-composer--replying\",\n editing && \"gc-composer--editing\",\n elements.composer,\n className,\n )}\n >\n {isMain && root.guidelinesUrl && (\n <a\n className=\"gc-composer__guidelines\"\n href={root.guidelinesUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t(\"guidelines\")}\n </a>\n )}\n {!isMain && <p className=\"gc-composer__context\">{label}</p>}\n\n {canPreview && (\n <div className=\"gc-composer__tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n id={`${id}-write-tab`}\n className=\"gc-composer__tab\"\n aria-selected={tab === \"write\"}\n aria-controls={`${id}-write`}\n tabIndex={tab === \"write\" ? 0 : -1}\n onClick={() => setTab(\"write\")}\n onKeyDown={onTabKeyDown}\n >\n {t(\"write\")}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id={`${id}-preview-tab`}\n className=\"gc-composer__tab\"\n aria-selected={tab === \"preview\"}\n aria-controls={`${id}-preview`}\n tabIndex={tab === \"preview\" ? 0 : -1}\n onClick={showPreview}\n onKeyDown={onTabKeyDown}\n >\n {t(\"preview\")}\n </button>\n </div>\n )}\n\n <div\n className=\"gc-composer__panel\"\n id={`${id}-write`}\n role={canPreview ? \"tabpanel\" : undefined}\n aria-labelledby={canPreview ? `${id}-write-tab` : undefined}\n hidden={tab !== \"write\"}\n >\n {signedIn && (\n <div className={cx(\"gc-toolbar\", elements.toolbar)} role=\"group\" aria-label={t(\"formatting\")}>\n {FORMATS.map(({ format: kind, label: key, icon }) => (\n <button\n key={kind}\n type=\"button\"\n className=\"gc-toolbar__button\"\n aria-label={t(key)}\n title={t(key)}\n disabled={!editable}\n onClick={() => format(kind)}\n >\n {icon}\n </button>\n ))}\n {uploadsEnabled && (\n <>\n <button\n type=\"button\"\n className=\"gc-toolbar__button\"\n aria-label={t(\"upload\")}\n title={t(\"upload\")}\n disabled={!editable}\n onClick={() => fileRef.current?.click()}\n >\n <ImageIcon />\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n hidden\n onChange={(event) => {\n const files = [...(event.target.files ?? [])];\n event.target.value = \"\";\n void upload(files);\n }}\n />\n </>\n )}\n </div>\n )}\n <div className=\"gc-composer__field\">\n <textarea\n ref={textareaRef}\n className={cx(\"gc-composer__input\", elements.textarea)}\n value={value}\n placeholder={placeholder ?? defaultPlaceholder}\n aria-label={label}\n aria-describedby={cx(hint && hintId, messages.length > 0 && errorId) || undefined}\n aria-invalid={tooLong || undefined}\n aria-autocomplete={mentions.open ? \"list\" : undefined}\n aria-controls={mentions.open ? listId : undefined}\n aria-activedescendant={mentions.open ? `${listId}-${mentions.active}` : undefined}\n rows={isMain ? 3 : 2}\n disabled={raw !== \"loaded\"}\n readOnly={submitting}\n onChange={onChange}\n onSelect={(event) => setCaret(event.currentTarget.selectionStart)}\n onFocus={() => timer.start()}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onDragOver={onDragOver}\n onDrop={onDrop}\n />\n {mentions.open && (\n <ul className=\"gc-mentions\" role=\"listbox\" id={listId} aria-label={t(\"mentionSuggestions\")}>\n {mentions.users.map((user, index) => (\n <li\n key={user.id}\n id={`${listId}-${index}`}\n role=\"option\"\n aria-selected={index === mentions.active}\n className={cx(\n \"gc-mentions__option\",\n index === mentions.active && \"gc-mentions__option--active\",\n )}\n onMouseDown={(event) => {\n event.preventDefault();\n mentions.pick(index);\n }}\n onMouseEnter={() => mentions.setActive(index)}\n >\n <img className=\"gc-avatar gc-avatar--small\" src={user.avatar_url} alt=\"\" />\n <span className=\"gc-mentions__username\">@{user.username}</span>\n {user.name && <span className=\"gc-mentions__name\">{user.name}</span>}\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n\n {canPreview && (\n <div\n className=\"gc-composer__panel\"\n id={`${id}-preview`}\n role=\"tabpanel\"\n aria-labelledby={`${id}-preview-tab`}\n aria-busy={preview.loading || undefined}\n hidden={tab !== \"preview\"}\n >\n {preview.loading ? (\n <p className=\"gc-composer__status\">{t(\"loading\")}</p>\n ) : preview.failed ? (\n <p className=\"gc-composer__status\">{t(\"genericError\")}</p>\n ) : preview.html ? (\n <div\n className=\"gc-composer__preview gc-prose\"\n dangerouslySetInnerHTML={{ __html: preview.html }}\n />\n ) : (\n <p className=\"gc-composer__status\">{t(\"previewEmpty\")}</p>\n )}\n </div>\n )}\n\n <div className=\"gc-composer__footer\">\n <div className=\"gc-composer__messages\" aria-live=\"polite\">\n {loadingRaw && <p className=\"gc-composer__status\">{t(\"loading\")}</p>}\n {uploading > 0 && <p className=\"gc-composer__status\">{t(\"uploading\")}</p>}\n {signingIn && <p className=\"gc-composer__status\">{t(\"signingIn\")}</p>}\n {hint && (\n <p id={hintId} className=\"gc-composer__hint\">\n {hint}\n </p>\n )}\n {messages.length > 0 && (\n <div id={errorId} className=\"gc-composer__error\" role=\"alert\">\n {messages.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </div>\n )}\n </div>\n <div className=\"gc-composer__buttons\">\n {signingIn && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", elements.button)}\n onClick={() => client.auth.cancelSignIn()}\n >\n {t(\"signInCancel\")}\n </button>\n )}\n {raw === \"failed\" && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", elements.button)}\n onClick={() => setRawAttempt((count) => count + 1)}\n >\n {t(\"retry\")}\n </button>\n )}\n {!isMain && !signingIn && (\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={cancel}>\n {t(\"cancel\")}\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--primary\", elements.button, elements.primaryButton)}\n disabled={!canSubmit}\n aria-busy={submitting || undefined}\n onClick={submit}\n >\n {submitting && !editing ? t(\"posting\") : submitLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction errorMessages(error: CommentsError, waitSeconds: number, t: Translator): string[] {\n switch (error.type) {\n case \"rate_limit\":\n return waitSeconds > 0\n ? [t(\"rateLimited\", { count: waitSeconds })]\n : error.errors.slice(0, 1);\n case \"invalid_key\":\n case \"not_logged_in\":\n return [t(\"sessionExpired\")];\n case \"unreachable\":\n case \"unknown\":\n case \"cancelled\":\n return [t(\"genericError\")];\n default:\n return error.errors.length > 0 ? error.errors : [t(\"genericError\")];\n }\n}\n\n/** Seconds left until a rate-limited action may be retried. */\nfunction useCountdown(): [number, (seconds: number) => void] {\n const [until, setUntil] = useState(0);\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (until <= Date.now()) {\n return;\n }\n const timer = setInterval(() => {\n const at = Date.now();\n setNow(at);\n if (at >= until) {\n clearInterval(timer);\n }\n }, 250);\n return () => clearInterval(timer);\n }, [until]);\n\n const start = useCallback((seconds: number) => {\n const at = Date.now();\n setNow(at);\n setUntil(at + seconds * 1000);\n }, []);\n\n return [Math.max(0, Math.ceil((until - now) / 1000)), start];\n}\n","import { createContext, useContext } from \"react\";\nimport { PACKAGE_NAME } from \"../constants\";\nimport type { Comment } from \"../types\";\n\n/** What a comment is showing besides its body. */\nexport type ItemMode = \"view\" | \"reply\" | \"edit\" | \"report\" | \"delete\";\n\nexport interface ItemContextValue {\n comment: Comment;\n depth: number;\n mode: ItemMode;\n /** Switches mode; leaving a panel returns focus to whatever opened it. */\n setMode(mode: ItemMode, trigger?: HTMLElement | null): void;\n /** Transient feedback (\"Link copied\", errors) shown under the comment. */\n notice: { text: string; error: boolean } | null;\n setNotice(notice: { text: string; error: boolean } | null): void;\n}\n\nexport const ItemContext = createContext<ItemContextValue | null>(null);\n\nexport function useItemContext(component: string): ItemContextValue {\n const value = useContext(ItemContext);\n if (!value) {\n throw new Error(`${PACKAGE_NAME}: ${component} must be rendered inside <Comments.Item>`);\n }\n return value;\n}\n","import {\n type FormEvent,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { currentUrlWithoutHash } from \"../core/env\";\nimport type { Translator } from \"../messages\";\nimport type { CommentAuthor, Commenter, FlagType } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { Composer } from \"./composer/composer\";\nimport { HeartIcon, MoreIcon, PinIcon, ReplyIcon } from \"./icons\";\nimport { useItemContext } from \"./item-context\";\nimport { useRootContext } from \"./root\";\nimport { formatAbsolute, formatRelative, onMinuteTick, rootNodeOf, toCommentsError } from \"./util\";\n\ninterface PartProps {\n className?: string;\n}\n\nexport function Avatar({ className }: PartProps) {\n const { comment } = useItemContext(\"Comments.Avatar\");\n const { elements } = useRootContext(\"Comments.Avatar\");\n return <UserAvatar user={comment.author} className={cx(elements.avatar, className)} />;\n}\n\nexport function UserAvatar({\n user,\n className,\n}: {\n user: CommentAuthor | Commenter | null;\n className?: string;\n}) {\n if (user?.avatar_url) {\n return (\n <img\n className={cx(\"gc-avatar\", className)}\n src={user.avatar_url}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n }\n const initial = (user?.name || user?.username || \"\").charAt(0).toUpperCase();\n return (\n <span className={cx(\"gc-avatar\", \"gc-avatar--placeholder\", className)} aria-hidden=\"true\">\n {initial}\n </span>\n );\n}\n\n/** Author, badges, timestamp (a `#gc-<id>` permalink) and edited mark. */\nexport function Meta({ className }: PartProps) {\n const { comment } = useItemContext(\"Comments.Meta\");\n const { t, locale, client, elements } = useRootContext(\"Comments.Meta\");\n const author = comment.author;\n const name = author ? author.name || author.username : null;\n\n return (\n <div className={cx(\"gc-comment__meta\", elements.meta, className)}>\n {name &&\n (author?.username ? (\n <a\n className=\"gc-comment__author\"\n href={`${client.forum}/u/${encodeURIComponent(author.username)}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className=\"gc-comment__author\">{name}</span>\n ))}\n {author?.staff && <span className=\"gc-badge gc-badge--staff\">{t(\"staff\")}</span>}\n {comment.pinned && (\n <span className=\"gc-badge gc-badge--featured\">\n <PinIcon />\n {t(\"pinned\")}\n </span>\n )}\n <a className=\"gc-comment__time\" href={`#gc-${comment.id}`}>\n <RelativeTime iso={comment.created_at} locale={locale} />\n </a>\n {comment.edited && (\n <span className=\"gc-comment__edited\" title={formatAbsolute(comment.updated_at, locale)}>\n {t(\"edited\")}\n </span>\n )}\n </div>\n );\n}\n\nfunction RelativeTime({ iso, locale }: { iso: string; locale: string }) {\n const [now, setNow] = useState(Date.now);\n useEffect(() => onMinuteTick(() => setNow(Date.now())), []);\n return (\n <time dateTime={iso} title={formatAbsolute(iso, locale)}>\n {formatRelative(iso, now, locale)}\n </time>\n );\n}\n\n/** The comment's cooked HTML, or its inline editor while editing. */\nexport function Body({ className }: PartProps) {\n const { comment, mode, setMode } = useItemContext(\"Comments.Body\");\n const { t, elements } = useRootContext(\"Comments.Body\");\n const classes = cx(\"gc-comment__body\", elements.body, className);\n\n if (mode === \"edit\") {\n return <Composer editing={comment} onDone={() => setMode(\"view\")} />;\n }\n if (comment.deleted) {\n return <p className={cx(classes, \"gc-comment__body--removed\")}>{t(\"deleted\")}</p>;\n }\n if (comment.hidden && !comment.html) {\n return <p className={cx(classes, \"gc-comment__body--removed\")}>{t(\"hidden\")}</p>;\n }\n return (\n <>\n {comment.hidden && <p className=\"gc-comment__hidden-note\">{t(\"hidden\")}</p>}\n {/* Cooked and sanitized by the forum. */}\n <div className={cx(classes, \"gc-prose\")} dangerouslySetInnerHTML={{ __html: comment.html }} />\n </>\n );\n}\n\ninterface MenuItem {\n key: string;\n label: string;\n danger?: boolean;\n onSelect(trigger: HTMLElement | null): void;\n}\n\n/** Like, reply and a menu with copy link, edit, delete, report and feature. */\nexport function Actions({ className }: PartProps) {\n const root = useRootContext(\"Comments.Actions\");\n const { comment, depth, setMode, setNotice } = useItemContext(\"Comments.Actions\");\n const { t, thread, commenter, elements, writable } = root;\n if (!thread || comment.deleted) {\n return null;\n }\n\n const signedIn = commenter.status === \"signed-in\";\n const { likes, can } = comment;\n const likeDisabled =\n !writable ||\n (signedIn ? !likes.can_like && !likes.liked : !root.canRequestSignIn);\n const buttonClass = cx(\"gc-button\", \"gc-button--ghost\", \"gc-button--small\", elements.button);\n\n const fail = (action: Parameters<typeof root.reportError>[0], error: unknown) => {\n setNotice({ text: actionError(error, t), error: true });\n root.reportError(action, error);\n };\n\n const toggleLike = () => {\n setNotice(null);\n const liked = !likes.liked;\n const ready = signedIn ? Promise.resolve(true) : root.ensureSignedIn();\n void ready.then(async (ok) => {\n if (!ok) {\n return;\n }\n try {\n const updated = liked ? await thread.like(comment.id) : await thread.unlike(comment.id);\n root.emit({ type: \"comment.liked\", threadId: thread.id, comment: updated, liked });\n } catch (error) {\n fail(\"like\", error);\n }\n });\n };\n\n const reply = (event: MouseEvent<HTMLButtonElement>) => {\n const trigger = event.currentTarget;\n setNotice(null);\n if (signedIn || root.signInMode === \"on-submit\") {\n setMode(\"reply\", trigger);\n return;\n }\n void root.ensureSignedIn().then((ok) => ok && setMode(\"reply\", trigger));\n };\n\n const items: MenuItem[] = [\n {\n key: \"copy\",\n label: t(\"copyLink\"),\n onSelect: () => {\n const href = `${currentUrlWithoutHash() ?? \"\"}#gc-${comment.id}`;\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard;\n if (!clipboard) {\n window.location.hash = `gc-${comment.id}`;\n return;\n }\n clipboard.writeText(href).then(\n () => setNotice({ text: t(\"linkCopied\"), error: false }),\n () => {\n window.location.hash = `gc-${comment.id}`;\n },\n );\n },\n },\n ];\n if (writable && can.edit) {\n items.push({ key: \"edit\", label: t(\"edit\"), onSelect: (trigger) => setMode(\"edit\", trigger) });\n }\n if (writable && can.pin && depth === 0) {\n items.push({\n key: \"pin\",\n label: comment.pinned ? t(\"unpin\") : t(\"pin\"),\n onSelect: () => {\n const action = comment.pinned ? thread.unpin(comment.id) : thread.pin(comment.id);\n action.catch((error: unknown) => fail(\"pin\", error));\n },\n });\n }\n if (writable && can.flag) {\n items.push({ key: \"report\", label: t(\"report\"), onSelect: (trigger) => setMode(\"report\", trigger) });\n }\n if (writable && can.delete) {\n items.push({\n key: \"delete\",\n label: t(\"delete\"),\n danger: true,\n onSelect: (trigger) => setMode(\"delete\", trigger),\n });\n }\n\n return (\n <div className={cx(\"gc-actions\", elements.actions, className)}>\n <button\n type=\"button\"\n className={cx(buttonClass, \"gc-actions__like\", likes.liked && \"gc-actions__like--active\")}\n aria-pressed={likes.liked}\n aria-label={`${t(likes.liked ? \"unlike\" : \"like\")}, ${t(\"likeCount\", { count: likes.count })}`}\n disabled={likeDisabled}\n onClick={toggleLike}\n >\n <HeartIcon filled={likes.liked} />\n <span className=\"gc-actions__count\">{likes.count}</span>\n </button>\n {root.canReply && (signedIn || root.canRequestSignIn) && (\n <button type=\"button\" className={buttonClass} onClick={reply}>\n <ReplyIcon />\n {t(\"reply\")}\n </button>\n )}\n <ActionMenu items={items} label={t(\"moreActions\")} buttonClass={buttonClass} />\n </div>\n );\n}\n\nfunction ActionMenu({\n items,\n label,\n buttonClass,\n}: {\n items: readonly MenuItem[];\n label: string;\n buttonClass: string;\n}) {\n const { elements } = useRootContext();\n const [open, setOpen] = useState(false);\n const id = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n menuRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n const onPointerDown = (event: PointerEvent) => {\n // `event.target` is retargeted to the host at the document level inside a shadow root.\n const path = event.composedPath();\n const inside = (node: Node | null) => node !== null && path.includes(node);\n if (!inside(menuRef.current) && !inside(buttonRef.current)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open]);\n\n const close = (refocus: boolean) => {\n setOpen(false);\n if (refocus) {\n buttonRef.current?.focus();\n }\n };\n\n const onMenuKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n const options = [...(menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])];\n const index = options.indexOf(rootNodeOf(event.currentTarget).activeElement as HTMLElement);\n const move = (next: number) => options[(next + options.length) % options.length]?.focus();\n switch (event.key) {\n case \"ArrowDown\":\n move(index + 1);\n break;\n case \"ArrowUp\":\n move(index - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(options.length - 1);\n break;\n case \"Escape\":\n close(true);\n break;\n case \"Tab\":\n setOpen(false);\n return;\n default:\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n };\n\n return (\n <div className=\"gc-menu\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={cx(buttonClass, \"gc-button--icon\")}\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n onClick={() => setOpen((current) => !current)}\n >\n <MoreIcon />\n </button>\n {open && (\n <ul\n ref={menuRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n className={cx(\"gc-menu__list\", elements.menu)}\n onKeyDown={onMenuKeyDown}\n >\n {items.map((item) => (\n <li key={item.key} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={cx(\"gc-menu__item\", item.danger && \"gc-menu__item--danger\")}\n onClick={() => {\n // Panels opened by the item move focus into themselves afterwards.\n close(true);\n item.onSelect(buttonRef.current);\n }}\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nconst FLAG_TYPES: readonly FlagType[] = [\n \"inappropriate\",\n \"spam\",\n \"illegal\",\n \"off_topic\",\n \"notify_moderators\",\n];\n// The forum rejects these reports without an explanation.\nconst MESSAGE_REQUIRED: ReadonlySet<FlagType> = new Set([\"illegal\", \"notify_moderators\"]);\n\nexport function ReportForm({ onClose }: { onClose(): void }) {\n const root = useRootContext(\"Comments.Item\");\n const { comment, setNotice } = useItemContext(\"Comments.Item\");\n const { t, thread, elements } = root;\n const [type, setType] = useState<FlagType>(\"inappropriate\");\n const [message, setMessage] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n const formRef = useRef<HTMLFormElement>(null);\n const needsMessage = MESSAGE_REQUIRED.has(type);\n const messageLabel = needsMessage ? t(\"reportMessageRequired\") : t(\"reportMessagePlaceholder\");\n\n useEffect(() => {\n formRef.current?.querySelector<HTMLInputElement>(\"input:checked\")?.focus();\n }, []);\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (!thread || !root.writable || !comment.can.flag || (needsMessage && !message.trim())) {\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n await thread.flag(comment.id, { type, message: message.trim() || undefined });\n setNotice({ text: t(\"reportSent\"), error: false });\n onClose();\n } catch (failure) {\n setError(actionError(failure, t));\n root.reportError(\"flag\", failure);\n setSubmitting(false);\n }\n };\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={`${id}-title`}\n className={cx(\"gc-report\", elements.dialog)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <form ref={formRef} onSubmit={submit}>\n <fieldset className=\"gc-report__options\">\n <legend id={`${id}-title`} className=\"gc-report__title\">\n {t(\"reportTitle\")}\n </legend>\n {FLAG_TYPES.map((flag) => (\n <label key={flag} className=\"gc-report__option\">\n <input\n type=\"radio\"\n name={`${id}-type`}\n value={flag}\n checked={type === flag}\n onChange={() => setType(flag)}\n />\n {t(`report.${flag}`)}\n </label>\n ))}\n </fieldset>\n <textarea\n className=\"gc-report__message\"\n value={message}\n placeholder={messageLabel}\n aria-label={messageLabel}\n required={needsMessage}\n rows={2}\n onChange={(event) => setMessage(event.target.value)}\n />\n {error && (\n <p className=\"gc-report__error\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"gc-report__buttons\">\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={onClose}>\n {t(\"cancel\")}\n </button>\n <button\n type=\"submit\"\n className={cx(\"gc-button\", \"gc-button--primary\", elements.button, elements.primaryButton)}\n disabled={submitting || (needsMessage && !message.trim())}\n >\n {t(\"report\")}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nexport function DeleteConfirm({ onClose }: { onClose(): void }) {\n const root = useRootContext(\"Comments.Item\");\n const { comment, setNotice } = useItemContext(\"Comments.Item\");\n const { t, thread, elements } = root;\n const [deleting, setDeleting] = useState(false);\n const id = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => cancelRef.current?.focus(), []);\n\n const confirm = async () => {\n if (!thread || !root.writable || !comment.can.delete) {\n return;\n }\n setDeleting(true);\n try {\n await thread.remove(comment.id);\n } catch (failure) {\n setNotice({ text: actionError(failure, t), error: true });\n root.reportError(\"delete\", failure);\n }\n onClose();\n };\n\n return (\n <div\n role=\"alertdialog\"\n aria-modal=\"false\"\n aria-labelledby={id}\n className={cx(\"gc-confirm\", elements.dialog)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <p id={id} className=\"gc-confirm__text\">\n {t(\"deleteConfirm\")}\n </p>\n <div className=\"gc-confirm__buttons\">\n <button ref={cancelRef} type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={onClose}>\n {t(\"cancel\")}\n </button>\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--danger\", elements.button)}\n disabled={deleting}\n onClick={() => void confirm()}\n >\n {t(\"delete\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction actionError(error: unknown, t: Translator): string {\n const failure = toCommentsError(error);\n if (failure.type === \"rate_limit\" && failure.waitSeconds) {\n return t(\"rateLimited\", { count: failure.waitSeconds });\n }\n if (failure.type === \"invalid_key\" || failure.type === \"not_logged_in\") {\n return t(\"sessionExpired\");\n }\n if (failure.type === \"unreachable\" || failure.type === \"unknown\" || failure.errors.length === 0) {\n return t(\"genericError\");\n }\n return failure.errors[0]!;\n}\n","import { PACKAGE_NAME } from \"../constants\";\nimport type { CommentsError } from \"../errors\";\nimport { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\nimport { isLocalPage } from \"./util\";\n\n// Developer-facing diagnostics (setting names, nginx snippets) stay in English,\n// like the client's own `CommentsError.hint`; readers only ever see the\n// translated \"Comments are unavailable\" notice.\n\ninterface Cause {\n text: string;\n link?: { href: string; label: string };\n code?: string;\n}\n\n/**\n * Explains setup problems (origin not allowed, plugin disabled, basic auth\n * blocking preflights…). Renders on localhost-like hosts or with `debug`.\n */\nexport function DevPanel({ className }: { className?: string }) {\n const { client, openError, snapshot, configError, debug, commenter } =\n useRootContext(\"Comments.DevPanel\");\n if (!debug && !isLocalPage()) {\n return null;\n }\n const error =\n openError ?? (snapshot?.status === \"error\" ? snapshot.error : null) ?? configError ?? null;\n const origin = typeof window === \"undefined\" ? \"\" : window.location.origin;\n\n if (!error) {\n if (!debug || !snapshot) {\n return null;\n }\n return (\n <details className={cx(\"gc-devpanel\", \"gc-devpanel--ok\", className)}>\n <summary className=\"gc-devpanel__title\">{PACKAGE_NAME} diagnostics</summary>\n <dl className=\"gc-devpanel__details\">\n <dt>Forum</dt>\n <dd>{client.forum}</dd>\n <dt>Thread</dt>\n <dd>\n {snapshot.thread.id} {snapshot.virtual ? \"(not created yet)\" : \"\"}\n </dd>\n <dt>Key</dt>\n <dd>{snapshot.thread.key}</dd>\n <dt>Updates</dt>\n <dd>{snapshot.connection}</dd>\n <dt>Reader</dt>\n <dd>\n {commenter.status}\n {commenter.degraded ? \" (degraded)\" : \"\"}\n </dd>\n </dl>\n </details>\n );\n }\n\n const { summary, causes } = diagnose(error, client.forum, origin);\n return (\n <aside\n className={cx(\"gc-devpanel\", className)}\n aria-label={`${PACKAGE_NAME} setup diagnostics`}\n >\n <p className=\"gc-devpanel__title\">{PACKAGE_NAME} could not load comments</p>\n <p className=\"gc-devpanel__summary\">{summary}</p>\n {causes.length > 0 && (\n <ol className=\"gc-devpanel__causes\">\n {causes.map((cause) => (\n <li key={cause.text}>\n {cause.text}\n {cause.link && (\n <>\n {\" \"}\n <a href={cause.link.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {cause.link.label}\n </a>\n </>\n )}\n {cause.code && (\n <pre className=\"gc-devpanel__code\">\n <code>{cause.code}</code>\n </pre>\n )}\n </li>\n ))}\n </ol>\n )}\n <dl className=\"gc-devpanel__details\">\n <dt>Forum</dt>\n <dd>{client.forum}</dd>\n <dt>Page origin</dt>\n <dd>{origin}</dd>\n <dt>Error</dt>\n <dd>\n <code>{error.type}</code> (status {error.status}): {error.message}\n </dd>\n </dl>\n <p className=\"gc-devpanel__note\">\n Shown on localhost or with debug. Readers see a short “Comments are unavailable” notice.\n </p>\n </aside>\n );\n}\n\nexport function diagnose(\n error: CommentsError,\n forum: string,\n origin: string,\n): { summary: string; causes: Cause[] } {\n const host = origin ? new URL(origin).host : \"this site's host\";\n const embedding = {\n href: `${forum}/admin/customize/embedding`,\n label: \"Open Admin → Customize → Embedding\",\n };\n const setting = (name: string) => ({\n href: `${forum}/admin/site_settings/category/all_results?filter=${name}`,\n label: `Open ${name}`,\n });\n const originNotAllowed: Cause = {\n text: `This page's origin (${origin || \"unknown\"}) is not allowed: add ${host} as an embedding host, or add the origin to discourse_comments_allowed_origins.`,\n link: embedding,\n };\n const pluginDisabled: Cause = {\n text: \"The discourse-comments plugin is not installed or is disabled (discourse_comments_enabled).\",\n link: setting(\"discourse_comments_enabled\"),\n };\n\n switch (error.type) {\n case \"unreachable\":\n return {\n summary: `The browser got no usable response from ${forum}; CORS hides the reason, so check these in order.`,\n causes: [\n originNotAllowed,\n {\n text: \"The forum is behind HTTP basic auth, which rejects CORS preflight (OPTIONS) requests. Let OPTIONS through without credentials and pass the credentials with the provider's headers prop, e.g. in nginx:\",\n code: [\n \"location / {\",\n \" limit_except OPTIONS {\",\n ' auth_basic \"Restricted\";',\n \" auth_basic_user_file /etc/nginx/.htpasswd;\",\n \" }\",\n \"}\",\n ].join(\"\\n\"),\n },\n pluginDisabled,\n {\n text: \"The forum URL is wrong or the forum is offline.\",\n link: { href: forum, label: \"Open the forum\" },\n },\n ],\n };\n case \"not_found\":\n return { summary: \"The comments API answered 404.\", causes: [pluginDisabled] };\n case \"page_not_allowed\":\n return {\n summary: `${forum} does not accept comments for this page.`,\n causes: [\n {\n text: `Add ${host} as an embedding host (check its allowed paths), or add this origin to discourse_comments_allowed_origins.`,\n link: embedding,\n },\n ],\n };\n case \"no_category\":\n return {\n summary: \"The forum has no category for new comment threads.\",\n causes: [\n { text: `Pick a category for ${host} under Embedding.`, link: embedding },\n {\n text: \"Or set discourse_comments_default_category (and discourse_comments_default_author).\",\n link: setting(\"discourse_comments_default_category\"),\n },\n ],\n };\n case \"invalid_url\":\n return {\n summary: \"The forum rejected the page URL.\",\n causes: [\n {\n text: 'Pass an absolute http(s) url prop, or add a <link rel=\"canonical\"> to the page.',\n },\n ],\n };\n case \"thread_conflict\":\n return {\n summary: \"The identifier and the URL already belong to different threads.\",\n causes: [\n { text: \"Pass the identifier this URL was first used with, or only one of the two.\" },\n ],\n };\n case \"invalid_access\":\n return {\n summary: \"The forum refused access to this thread.\",\n causes: [\n {\n text: \"The thread's category may not be visible to this reader; check the category's security settings.\",\n },\n ],\n };\n default:\n return { summary: error.message, causes: [] };\n }\n}\n","import { type ReactNode, useId } from \"react\";\nimport type { Sort as SortName } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\n\nexport interface HeaderProps {\n /** Defaults to `<Comments.Count />` and `<Comments.Sort />`. */\n children?: ReactNode;\n className?: string;\n}\n\nexport function Header({ children, className }: HeaderProps) {\n const { elements } = useRootContext(\"Comments.Header\");\n return (\n <header className={cx(\"gc-header\", elements.header, className)}>\n {children ?? (\n <>\n <Count />\n <Sort />\n </>\n )}\n </header>\n );\n}\n\nexport interface CountProps {\n /** Heading element; `h2` by default. */\n as?: \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"span\";\n /** Custom content for the comment count, e.g. `(n) => n`. */\n render?: (count: number) => ReactNode;\n className?: string;\n}\n\nexport function Count({ as: Tag = \"h2\", render, className }: CountProps) {\n const { t, snapshot, elements } = useRootContext(\"Comments.Count\");\n const count = snapshot?.thread.count;\n return (\n <Tag className={cx(\"gc-header__count\", elements.count, className)}>\n {count === undefined ? t(\"comments\") : render ? render(count) : t(\"commentCount\", { count })}\n </Tag>\n );\n}\n\nexport function Sort({ className }: { className?: string }) {\n const { t, thread, snapshot, elements, reportError } = useRootContext(\"Comments.Sort\");\n const id = useId();\n if (!thread || !snapshot || snapshot.thread.sorts.length < 2) {\n return null;\n }\n return (\n <div className={cx(\"gc-sort\", elements.sort, className)}>\n <label className=\"gc-sort__label\" htmlFor={id}>\n {t(\"sortBy\")}\n </label>\n <select\n id={id}\n className=\"gc-sort__select\"\n value={snapshot.sort}\n disabled={snapshot.status === \"loading\"}\n onChange={(event) =>\n void thread.setSort(event.target.value as SortName).catch((error: unknown) =>\n reportError(\"load\", error),\n )\n }\n >\n {snapshot.thread.sorts.map((sort) => (\n <option key={sort} value={sort}>\n {t(`sort.${sort}`)}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","import {\n createContext,\n Fragment,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { findComment } from \"../core/tree\";\nimport type { Comment } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { Actions, Avatar, Body, DeleteConfirm, Meta, ReportForm } from \"./comment-parts\";\nimport { Composer } from \"./composer/composer\";\nimport { BackIcon } from \"./icons\";\nimport { ItemContext, type ItemContextValue, type ItemMode, useItemContext } from \"./item-context\";\nimport { useRootContext } from \"./root\";\n\nexport type RenderComment = (comment: Comment, depth: number) => ReactNode;\n\nconst defaultRender: RenderComment = (comment, depth) => <Item comment={comment} depth={depth} />;\n\n// Replies reuse the render function given to `Comments.List`, so custom markup applies at every depth.\nconst ListContext = createContext<RenderComment>(defaultRender);\n\nexport interface ListProps {\n /** Renders one comment; defaults to `<Comments.Item comment={c} depth={depth} />`. */\n children?: RenderComment;\n className?: string;\n}\n\n/** The comment tree, with its loading, error and \"continue this thread\" states. */\nexport function List({ children, className }: ListProps) {\n const root = useRootContext(\"Comments.List\");\n const render = children ?? defaultRender;\n const { snapshot, openError, t, elements, focusView } = root;\n\n if (openError || snapshot?.status === \"error\") {\n return (\n <div className={cx(\"gc-notice\", \"gc-notice--error\", elements.notice)} role=\"alert\">\n <p className=\"gc-notice__text\">{t(\"unavailable\")}</p>\n <button type=\"button\" className={cx(\"gc-button\", elements.button)} onClick={root.retry}>\n {t(\"retry\")}\n </button>\n </div>\n );\n }\n if (!snapshot || (snapshot.status === \"loading\" && snapshot.comments.length === 0)) {\n return (\n <p className=\"gc-list__status\" role=\"status\">\n {t(\"loading\")}\n </p>\n );\n }\n\n const listClass = cx(\"gc-list\", elements.list, className);\n if (focusView) {\n const tree = snapshot.comments;\n const target = findComment(tree, focusView.id)?.node;\n return (\n <ListContext.Provider value={render}>\n <div className=\"gc-focus\">\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-button--link\", \"gc-focus__back\", elements.button)}\n onClick={root.closeFocusView}\n >\n <BackIcon />\n {t(\"backToAll\")}\n </button>\n {focusView.truncated && <p className=\"gc-focus__truncated\">{t(\"ancestorsTruncated\")}</p>}\n {focusView.ancestors.length > 0 && (\n <ol className=\"gc-context\">\n {focusView.ancestors.map((ancestor) => (\n <Item\n key={ancestor.id}\n comment={findComment(tree, ancestor.id)?.node ?? ancestor}\n showReplies={false}\n />\n ))}\n </ol>\n )}\n {target && <ol className={listClass}>{render(target, 0)}</ol>}\n </div>\n </ListContext.Provider>\n );\n }\n\n if (snapshot.comments.length === 0) {\n return null;\n }\n return (\n <ListContext.Provider value={render}>\n <ol className={listClass}>\n {snapshot.comments.map((comment) => (\n <Fragment key={comment.id}>{render(comment, 0)}</Fragment>\n ))}\n </ol>\n </ListContext.Provider>\n );\n}\n\nexport interface ItemProps {\n comment: Comment;\n /** 0 for top-level comments. */\n depth?: number;\n /** Replaces the default avatar, meta, body and actions. */\n children?: ReactNode;\n /** Render the comment without its replies (used for ancestors in a focused branch). */\n showReplies?: boolean;\n className?: string;\n}\n\n/** One comment: its card, inline reply/edit/report panels and its replies. */\nexport function Item({ comment, depth = 0, children, showReplies = true, className }: ItemProps) {\n const root = useRootContext(\"Comments.Item\");\n const { t, elements } = root;\n const [mode, setModeState] = useState<ItemMode>(\"view\");\n const [notice, setNotice] = useState<ItemContextValue[\"notice\"]>(null);\n const articleRef = useRef<HTMLElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const restoreFocus = useRef(false);\n\n const setMode = useCallback((next: ItemMode, trigger?: HTMLElement | null) => {\n if (next === \"view\") {\n restoreFocus.current = true;\n } else {\n triggerRef.current = trigger ?? null;\n }\n setModeState(next);\n }, []);\n\n useEffect(() => {\n if (mode !== \"view\" || !restoreFocus.current) {\n return;\n }\n restoreFocus.current = false;\n const trigger = triggerRef.current;\n (trigger?.isConnected ? trigger : articleRef.current)?.focus();\n }, [mode]);\n\n // Panels follow the reader's current rights: going read-only, losing a\n // permission or signing out closes them instead of leaving stale forms behind.\n const signedIn = root.commenter.status === \"signed-in\";\n const writable = root.writable && signedIn;\n const allowed: Record<ItemMode, boolean> = {\n view: true,\n reply: root.canCompose,\n edit: writable && comment.can.edit,\n report: writable && comment.can.flag,\n delete: writable && comment.can.delete,\n };\n const modeAllowed = allowed[mode];\n const activeMode: ItemMode = modeAllowed ? mode : \"view\";\n\n useEffect(() => {\n if (!modeAllowed) {\n setMode(\"view\");\n }\n }, [modeAllowed, setMode]);\n\n useEffect(() => {\n if (!notice || notice.error) {\n return;\n }\n const timer = setTimeout(() => setNotice(null), 3000);\n return () => clearTimeout(timer);\n }, [notice]);\n\n const value = useMemo(\n (): ItemContextValue => ({ comment, depth, mode: activeMode, setMode, notice, setNotice }),\n [comment, depth, activeMode, setMode, notice],\n );\n\n const name = comment.author ? comment.author.name || comment.author.username : null;\n const label = comment.deleted || !name ? t(\"deletedComment\") : t(\"commentBy\", { name });\n const close = () => setMode(\"view\");\n\n return (\n <ItemContext.Provider value={value}>\n <li\n className={cx(\n \"gc-comment\",\n depth > 0 && \"gc-comment--reply\",\n comment.pinned && \"gc-comment--pinned\",\n comment.deleted && \"gc-comment--deleted\",\n root.highlightId === comment.id && \"gc-comment--highlighted\",\n elements.comment,\n className,\n )}\n data-depth={depth}\n >\n <article\n ref={articleRef}\n id={`gc-${comment.id}`}\n className=\"gc-comment__card\"\n tabIndex={-1}\n aria-label={label}\n >\n {children ?? (\n <>\n <Avatar />\n <div className=\"gc-comment__main\">\n <Meta />\n <Body />\n <Actions />\n </div>\n </>\n )}\n {activeMode === \"report\" && <ReportForm onClose={close} />}\n {activeMode === \"delete\" && <DeleteConfirm onClose={close} />}\n {notice && (\n <p\n className={cx(\"gc-comment__notice\", notice.error && \"gc-comment__notice--error\")}\n role={notice.error ? \"alert\" : \"status\"}\n >\n {notice.text}\n </p>\n )}\n </article>\n {activeMode === \"reply\" && <Composer replyTo={comment} autoFocus onDone={close} />}\n {showReplies && <Replies />}\n </li>\n </ItemContext.Provider>\n );\n}\n\nfunction Replies() {\n const root = useRootContext();\n const { comment, depth } = useItemContext(\"Comments.Item\");\n const render = useContext(ListContext);\n const { t, thread, snapshot, maxDepth, elements } = root;\n if (!thread || !snapshot) {\n return null;\n }\n\n const children = comment.children;\n const linkButton = cx(\"gc-button\", \"gc-button--link\", elements.button);\n if (depth >= maxDepth) {\n if (comment.direct_reply_count === 0 && children.length === 0) {\n return null;\n }\n return (\n <button\n type=\"button\"\n className={cx(linkButton, \"gc-comment__continue\")}\n onClick={() => void root.continueThread(comment.id)}\n >\n {t(\"continueThread\")}\n </button>\n );\n }\n\n const branch = snapshot.branches[comment.id];\n const remaining = comment.direct_reply_count - children.length;\n const hasMore = (branch?.hasMore ?? true) && remaining > 0;\n const name = comment.author?.name || comment.author?.username || \"\";\n\n const loadReplies = async () => {\n const before = new Set(children.map((child) => child.id));\n try {\n await thread.loadReplies(comment.id);\n } catch (error) {\n root.reportError(\"loadReplies\", error);\n return;\n }\n // The button may be gone now; move focus to the first reply that arrived.\n const loaded = findComment(thread.snapshot().comments, comment.id)?.node.children ?? [];\n const first = loaded.find((child) => !before.has(child.id));\n if (first) {\n root.focusComment(first.id);\n }\n };\n\n return (\n <>\n {children.length > 0 && (\n <ol className=\"gc-replies\" aria-label={t(\"repliesTo\", { name })}>\n {children.map((child) => (\n <Fragment key={child.id}>{render(child, depth + 1)}</Fragment>\n ))}\n </ol>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className={cx(linkButton, \"gc-comment__more\")}\n disabled={branch?.loading}\n aria-busy={branch?.loading || undefined}\n onClick={() => void loadReplies()}\n >\n {children.length === 0\n ? t(\"loadReplies\", { count: remaining })\n : t(\"loadMoreReplies\", { count: remaining })}\n </button>\n )}\n </>\n );\n}\n","import { type ReactNode, useId } from \"react\";\nimport { cx } from \"./appearance\";\nimport { UserAvatar } from \"./comment-parts\";\nimport type { CommenterState } from \"./hooks/use-commenter\";\nimport { useRootContext } from \"./root\";\n\nexport interface SignInProps {\n /** Custom UI; called in every sign-in mode, including `manual`. */\n children?: (commenter: CommenterState) => ReactNode;\n className?: string;\n}\n\n/**\n * Inline mode: a \"Join the conversation\" panel with the forum's providers.\n * Signed in: who is commenting, with a sign-out button.\n */\nexport function SignIn({ children, className }: SignInProps) {\n const root = useRootContext(\"Comments.SignIn\");\n const { t, commenter, elements, client, config, snapshot, signInMode } = root;\n const titleId = useId();\n\n if (children) {\n return <>{children(commenter)}</>;\n }\n if (signInMode === \"manual\") {\n return null;\n }\n\n const button = cx(\"gc-button\", elements.button);\n const classes = cx(\"gc-signin\", elements.signIn, className);\n\n if (commenter.status === \"signed-in\" && commenter.user) {\n const { user } = commenter;\n return (\n <div className={cx(classes, \"gc-signin--signed-in\")}>\n <UserAvatar user={user} className=\"gc-avatar--small\" />\n <span className=\"gc-signin__user\">{t(\"signedInAs\", { username: `@${user.username}` })}</span>\n <button\n type=\"button\"\n className={cx(button, \"gc-button--link\")}\n onClick={() => void commenter.signOut()}\n >\n {t(\"signOut\")}\n </button>\n </div>\n );\n }\n\n const closed = snapshot?.thread.closed ?? false;\n if (signInMode !== \"inline\" || !root.writable || closed || !snapshot) {\n return null;\n }\n\n const forumName = config?.forum.name ?? new URL(client.forum).host;\n const signingIn = commenter.status === \"signing-in\";\n const failure =\n commenter.error && commenter.error.type !== \"cancelled\"\n ? commenter.error.type === \"invalid_key\"\n ? t(\"sessionExpired\")\n : (commenter.error.errors[0] ?? t(\"genericError\"))\n : null;\n\n return (\n <div\n className={cx(classes, signingIn && \"gc-signin--signing-in\")}\n role=\"group\"\n aria-labelledby={titleId}\n >\n <p id={titleId} className=\"gc-signin__title\">\n {t(\"joinConversation\")}\n </p>\n <div aria-live=\"polite\">\n {signingIn ? (\n <p className=\"gc-signin__body\">{t(\"signingIn\")}</p>\n ) : (\n <p className=\"gc-signin__body\">{t(\"joinConversationBody\", { forum: forumName })}</p>\n )}\n {failure && !signingIn && (\n <p className=\"gc-signin__error\" role=\"alert\">\n {failure}\n </p>\n )}\n </div>\n <div className=\"gc-signin__actions\">\n {signingIn ? (\n <button type=\"button\" className={button} onClick={() => commenter.cancelSignIn()}>\n {t(\"signInCancel\")}\n </button>\n ) : (\n <>\n <button\n type=\"button\"\n className={cx(button, \"gc-button--primary\", elements.primaryButton)}\n onClick={() => void commenter.signIn().catch(() => {})}\n >\n {t(\"signIn\")}\n </button>\n {commenter.providers.map((provider) => (\n <button\n key={provider.name}\n type=\"button\"\n className={button}\n onClick={() => void commenter.signIn({ provider: provider.name }).catch(() => {})}\n >\n {t(\"signInWith\", { provider: provider.title })}\n </button>\n ))}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { cx } from \"./appearance\";\nimport { useRootContext } from \"./root\";\n\n/** Read-only, closed and not-allowed notices that replace the composer. */\nexport function Notice({ className }: { className?: string }) {\n const { t, snapshot, readOnly, commenter, commentingDenied, elements } =\n useRootContext(\"Comments.Notice\");\n if (!snapshot || snapshot.status === \"error\") {\n return null;\n }\n let text: string | null = null;\n let modifier = \"\";\n if (readOnly || commenter.degraded) {\n text = t(\"readOnly\");\n modifier = \"gc-notice--read-only\";\n } else if (snapshot.thread.closed) {\n text = t(\"closed\");\n modifier = \"gc-notice--closed\";\n } else if (commentingDenied) {\n text = t(\"cannotComment\");\n modifier = \"gc-notice--denied\";\n }\n if (!text) {\n return null;\n }\n return (\n <p className={cx(\"gc-notice\", modifier, elements.notice, className)} role=\"status\">\n {text}\n </p>\n );\n}\n\n/** The \"N new comments\" pill for top-level comments that arrived live. */\nexport function NewComments({ className }: { className?: string }) {\n const root = useRootContext(\"Comments.NewComments\");\n const { t, thread, snapshot, elements, focusView } = root;\n const count = focusView ? 0 : (snapshot?.pendingNew ?? 0);\n\n const show = () => {\n if (!thread) {\n return;\n }\n const before = new Set(thread.snapshot().comments.map((comment) => comment.id));\n thread.showPending();\n const first = thread.snapshot().comments.find((comment) => !before.has(comment.id));\n if (first) {\n root.focusComment(first.id);\n }\n };\n\n // The live region stays mounted so the arrival of new comments is announced.\n return (\n <div className=\"gc-pill-region\" aria-live=\"polite\">\n {count > 0 && (\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-pill\", elements.button, elements.pill, className)}\n onClick={show}\n >\n {t(\"newComments\", { count })}\n </button>\n )}\n </div>\n );\n}\n\n/** The reader's own comments that went to the review queue. */\nexport function AwaitingApproval({ className }: { className?: string }) {\n const { t, snapshot, elements } = useRootContext(\"Comments.AwaitingApproval\");\n const pending = snapshot?.awaitingApproval ?? [];\n return (\n <div className=\"gc-pending-region\" aria-live=\"polite\">\n {pending.map((entry, index) => (\n <p\n key={entry.reviewable_id ?? `pending-${index}`}\n className={cx(\"gc-notice\", \"gc-notice--pending\", elements.notice, className)}\n >\n {entry.message || t(\"pending\")}\n </p>\n ))}\n </div>\n );\n}\n\nexport function LoadMore({ className }: { className?: string }) {\n const root = useRootContext(\"Comments.LoadMore\");\n const { t, thread, snapshot, elements, focusView } = root;\n if (!thread || !snapshot?.hasMore || focusView || snapshot.status !== \"ready\") {\n return null;\n }\n\n const loadMore = async () => {\n const before = new Set(thread.snapshot().comments.map((comment) => comment.id));\n try {\n await thread.loadMore();\n } catch (error) {\n root.reportError(\"loadMore\", error);\n return;\n }\n const first = thread.snapshot().comments.find((comment) => !before.has(comment.id));\n if (first && !thread.snapshot().hasMore) {\n root.focusComment(first.id);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={cx(\"gc-button\", \"gc-load-more\", elements.button, elements.loadMore, className)}\n disabled={snapshot.loadingMore}\n aria-busy={snapshot.loadingMore || undefined}\n onClick={() => void loadMore()}\n >\n {snapshot.loadingMore ? t(\"loading\") : t(\"loadMore\")}\n </button>\n );\n}\n","import { Actions, Avatar, Body, Meta } from \"./comment-parts\";\nimport { Composer } from \"./composer/composer\";\nimport { DevPanel } from \"./dev-panel\";\nimport { Count, Header, Sort } from \"./header\";\nimport { Item, List } from \"./list\";\nimport { type CommentsProps, Root } from \"./root\";\nimport { SignIn } from \"./sign-in\";\nimport { AwaitingApproval, LoadMore, NewComments, Notice } from \"./status\";\n\n/**\n * The drop-in comments section for the current page, assembled from the\n * `Comments.*` primitives that are also exported for custom layouts.\n */\nfunction CommentsSection(props: CommentsProps) {\n return (\n <Root {...props}>\n <Header />\n <DevPanel />\n <Notice />\n <SignIn />\n <Composer />\n <AwaitingApproval />\n <NewComments />\n <List />\n <LoadMore />\n </Root>\n );\n}\n\nexport const Comments = Object.assign(CommentsSection, {\n Root,\n Header,\n Count,\n Sort,\n SignIn,\n Composer,\n List,\n Item,\n Avatar,\n Meta,\n Body,\n Actions,\n LoadMore,\n NewComments,\n AwaitingApproval,\n Notice,\n DevPanel,\n});\n","import { useEffect, useRef, useState } from \"react\";\nimport { encodeRef } from \"../../core/counts\";\nimport type { CommentsError } from \"../../errors\";\nimport type { CountRef } from \"../../types\";\nimport { useOptionalCommentsContext } from \"../context\";\nimport { toCommentsError } from \"../util\";\n\nexport interface CommentCountState {\n /** `null` while loading or after an error. */\n count: number | null;\n error: CommentsError | null;\n}\n\n/**\n * Fetches a comment count once per ref. Lookups from the same render are\n * batched into one request by the client; the count is not live.\n */\nexport function useCommentCount(\n ref: CountRef | null,\n options: { forum?: string } = {},\n): CommentCountState {\n // Without a provider or `forum` there is nothing to ask; the count stays unknown.\n const client = useOptionalCommentsContext(options.forum)?.client;\n const key = ref ? safeEncode(ref) : null;\n const latestRef = useRef(ref);\n latestRef.current = ref;\n const [state, setState] = useState<CommentCountState & { key: string | null }>({\n key: null,\n count: null,\n error: null,\n });\n\n useEffect(() => {\n const current = latestRef.current;\n if (key === null || !current || !client) {\n return;\n }\n let active = true;\n client.count(current).then(\n (count) => active && setState({ key, count, error: null }),\n (error: unknown) => active && setState({ key, count: null, error: toCommentsError(error) }),\n );\n return () => {\n active = false;\n };\n }, [client, key]);\n\n return state.key === key ? { count: state.count, error: state.error } : { count: null, error: null };\n}\n\n// Identifier refs need the page host, which does not exist during server rendering.\nfunction safeEncode(ref: CountRef): string | null {\n try {\n return encodeRef(ref);\n } catch {\n return null;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { defaultPageUrl } from \"../core/env\";\nimport type { CountRef } from \"../types\";\nimport { cx } from \"./appearance\";\nimport { useOptionalCommentsContext } from \"./context\";\nimport { useCommentCount } from \"./hooks/use-comment-count\";\n\nexport interface CommentCountProps {\n identifier?: string;\n /** Host the `identifier` belongs to; defaults to the current page's host. */\n host?: string;\n /** Defaults to the current page (canonical link, else the address). */\n url?: string;\n topicId?: number;\n /** Uses the shared client for this forum instead of the provider's. */\n forum?: string;\n /** Custom content, e.g. `(n) => n` for just the number. */\n render?: (count: number) => ReactNode;\n className?: string;\n}\n\n/** \"12 comments\" for a page, fetched once on mount and batched with other counts. */\nexport function CommentCount({\n identifier,\n host,\n url,\n topicId,\n forum,\n render,\n className,\n}: CommentCountProps) {\n const context = useOptionalCommentsContext(forum);\n const pageUrl = url ?? defaultPageUrl();\n const ref: CountRef | null =\n topicId !== undefined\n ? { topicId }\n : identifier !== undefined\n ? { identifier, host }\n : pageUrl\n ? { url: pageUrl }\n : null;\n const { count } = useCommentCount(ref, { forum });\n\n // Rendered outside any provider (a consumer's test, a static page): show nothing.\n if (!context) {\n return null;\n }\n const { t } = context;\n\n return (\n <span className={cx(\"gc-count\", className)} aria-busy={count === null || undefined}>\n {count === null ? null : render ? render(count) : t(\"commentCount\", { count })}\n </span>\n );\n}\n"]}
|