# apps/web/src/lib/assistantCitationNavigation.ts · gitcafe/t3code

[View on GitCafe](https://git.cafe/gitcafe/t3code/blob/df4ae529eacfff8db38f2f4b9b767d3717446c8a/apps/web/src/lib/assistantCitationNavigation.ts)

Repository: [gitcafe/t3code](https://git.cafe/gitcafe/t3code)

Visibility: public

Requested revision: df4ae529eacfff8db38f2f4b9b767d3717446c8a

Requested commit: df4ae529eacfff8db38f2f4b9b767d3717446c8a

Commit: df4ae529eacfff8db38f2f4b9b767d3717446c8a

Blob: 1a4606d34d6057e880de5cf26f9fe2cc3445a3a5

Size: 1628 bytes

[Immutable source](https://git.cafe/gitcafe/t3code/blob/df4ae529eacfff8db38f2f4b9b767d3717446c8a/apps/web/src/lib/assistantCitationNavigation.ts?format=markdown)

```
import type { AssistantCitation } from "@t3tools/contracts";
import {
  formatAssistantCitationHref,
  parseAssistantCitationHref,
} from "@t3tools/shared/assistantCitations";
import * as Encoding from "effect/Encoding";
import * as Result from "effect/Result";

import { randomUUID } from "./utils";

declare module "@tanstack/react-router" {
  interface HistoryState {
    assistantCitationActivation?: string;
  }
}

const CITATION_HASH_PREFIX = "assistant-citation=";

/** Base64url keeps router hash normalization from decoding quote whitespace or source IDs. */
export function assistantCitationHash(citation: AssistantCitation) {
  return `${CITATION_HASH_PREFIX}${Encoding.encodeBase64Url(formatAssistantCitationHref(citation))}`;
}

export function assistantCitationFromLocation(href: string) {
  const hashIndex = href.indexOf("#");
  if (hashIndex === -1) return null;
  const hash = href.slice(hashIndex + 1);
  if (!hash.startsWith(CITATION_HASH_PREFIX) || hash.length > 140_000) return null;
  try {
    return parseAssistantCitationHref(
      Result.getOrThrow(Encoding.decodeBase64UrlString(hash.slice(CITATION_HASH_PREFIX.length))),
    );
  } catch {
    return null;
  }
}

/** A fresh activation lets the same link reveal its source again after dismissal. */
export function assistantCitationNavigation(citation: AssistantCitation) {
  return {
    to: "/$environmentId/$threadId" as const,
    params: { environmentId: citation.environmentId, threadId: citation.threadId },
    hash: assistantCitationHash(citation),
    resetScroll: false,
    state: { assistantCitationActivation: randomUUID() },
  };
}

```
