Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions app/(app)/home/course-search.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
'use client';

import React, { Activity, addTransitionType, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from 'react';
import React, { Activity, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from 'react';
import Image from "@/app/components/common/app-image";
import Link from "next/link";
import { useRouter } from "next/navigation";
import SearchIcon from "@/app/components/assets/seacrh.svg";
import VoiceAgentButton from "@/app/components/voice/voice-agent-button";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { getAliasCourseCodes } from "@/lib/course-aliases";
import { createCourseFuse } from "@/lib/course-search-fuse";
import { normalizeCourseCode } from "@/lib/course-tags";
Expand Down Expand Up @@ -74,14 +75,14 @@ export default function CourseSearch({ courses }: CourseSearchProps) {
const navigateForward = (href: string, beforeNavigate?: () => void) => {
startTransition(() => {
beforeNavigate?.();
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(href);
});
};

const navigateToSearch = (href: string) => {
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
push(href);
});
};
Expand Down
4 changes: 2 additions & 2 deletions app/components/command-palette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import React, {
Activity,
addTransitionType,
startTransition,
useEffect,
useEffectEvent,
Expand All @@ -14,6 +13,7 @@ import { Command } from "cmdk";
import * as Dialog from "@radix-ui/react-dialog";
import { useAgent } from "agents/react";
import { usePathname, useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import {
invalidateAuthSessionCache,
useGuestPrompt,
Expand Down Expand Up @@ -1460,7 +1460,7 @@ function CommandPaletteSession({
if (href === pathname) return;

startTransition(() => {
addTransitionType(href.startsWith("/past_papers/") ? "nav-forward" : "nav-lateral");
addReactTransitionType(href.startsWith("/past_papers/") ? "nav-forward" : "nav-lateral");
push(href);
});
};
Expand Down
7 changes: 4 additions & 3 deletions app/components/common/directional-transition.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use client";

import React, { ViewTransition, useEffect, useState } from "react";
import React, { useEffect, useState } from "react";
import type { ViewTransitionClass } from "react";
import { OptionalViewTransition } from "@/app/components/common/react-transition";

// `<ViewTransition>` is an experimental React API. It used to be keyed on
// `pathname`, which forced the whole page subtree to remount on every
Expand Down Expand Up @@ -70,12 +71,12 @@ export default function DirectionalTransition({
}

return (
<ViewTransition
<OptionalViewTransition
enter={NAV_TRANSITION_CLASSES}
update={NAV_TRANSITION_CLASSES}
default="none"
>
{children}
</ViewTransition>
</OptionalViewTransition>
);
}
28 changes: 28 additions & 0 deletions app/components/common/react-transition.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"use client";

import React from "react";
import type { ViewTransitionProps } from "react";

type ReactTransitionRuntime = typeof React & {
addTransitionType?: (type: string) => void;
ViewTransition?: React.ComponentType<ViewTransitionProps>;
};

const reactTransitionRuntime = React as ReactTransitionRuntime;

export function addReactTransitionType(type: string) {
reactTransitionRuntime.addTransitionType?.(type);
}

export function OptionalViewTransition({
children,
...props
}: ViewTransitionProps) {
const ViewTransition = reactTransitionRuntime.ViewTransition;

if (typeof ViewTransition !== "function") {
return <>{children}</>;
}

return <ViewTransition {...props}>{children}</ViewTransition>;
}
5 changes: 3 additions & 2 deletions app/components/mobile-tab-bar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import Link from "next/link";
import Image from "@/app/components/common/app-image";
import { usePathname, useRouter } from "next/navigation";
import { addTransitionType, startTransition, useEffect, useReducer, type MouseEvent } from "react";
import { startTransition, useEffect, useReducer, type MouseEvent } from "react";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { APP_NAV_LINKS } from "@/lib/app-nav-links";
import c2cStyles from "./mobile-tab-bar.module.css";

Expand Down Expand Up @@ -96,7 +97,7 @@ export default function MobileTabBar({ toolsSheetOpen = false }: Props) {
event.preventDefault();
setNavTransitionOrigin(event.currentTarget);
startTransition(() => {
addTransitionType("nav-lateral");
addReactTransitionType("nav-lateral");
push(href);
});
};
Expand Down
5 changes: 3 additions & 2 deletions app/components/nav-bar.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
"use client";
import React, { addTransitionType, startTransition, useCallback, useEffect, useEffectEvent, useReducer, useRef, useSyncExternalStore } from "react";
import React, { startTransition, useCallback, useEffect, useEffectEvent, useReducer, useRef, useSyncExternalStore } from "react";
import dynamic from "next/dynamic";
import Link from "next/link";
import { createPortal } from "react-dom";
import Image from "@/app/components/common/app-image";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { usePathname, useRouter } from "next/navigation";
import ThemeToggleSwitch from "@/app/components/common/theme-toggle";
import { SignOut } from "@/app/components/sign-out";
Expand Down Expand Up @@ -296,7 +297,7 @@ const NavBar: React.FC<Props> = ({
event.preventDefault();
setNavTransitionOrigin(event.currentTarget);
startTransition(() => {
addTransitionType("nav-lateral");
addReactTransitionType("nav-lateral");
push(href);
});
};
Expand Down
13 changes: 7 additions & 6 deletions app/components/notes/notes-course-search.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
"use client";

import React, { Activity, addTransitionType, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
import React, { Activity, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
import Image from "@/app/components/common/app-image";
import SearchIcon from "@/app/components/assets/seacrh.svg";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { getAliasCourseCodes } from "@/lib/course-aliases";
import { createCourseFuse } from "@/lib/course-search-fuse";
import { normalizeCourseCode } from "@/lib/course-tags";
Expand Down Expand Up @@ -156,7 +157,7 @@ export default function NotesCourseSearch({
});

startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(`/notes/course/${encodeURIComponent(course.code)}`);
});
setIsOpen(false);
Expand All @@ -180,7 +181,7 @@ export default function NotesCourseSearch({
return;
}
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
push(`/notes?search=${encodeURIComponent(trimmed)}`);
});
setIsOpen(false);
Expand Down Expand Up @@ -246,7 +247,7 @@ export default function NotesCourseSearch({
hasSyllabus: false,
});
startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(`/notes/course/${encodeURIComponent(course.code)}`);
});
return;
Expand Down Expand Up @@ -277,13 +278,13 @@ export default function NotesCourseSearch({
hasSyllabus: false,
});
startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(`/notes/course/${encodeURIComponent(exact.code)}`);
});
return;
}
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
push(`/notes?search=${encodeURIComponent(trimmed)}`);
});
} catch {
Expand Down
5 changes: 3 additions & 2 deletions app/components/past_papers/answer-key-toggle.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use client";

import React, { addTransitionType, useTransition } from "react";
import React, { useTransition } from "react";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";

type Props = {
basePath: string;
Expand All @@ -23,7 +24,7 @@ export default function AnswerKeyToggle({ basePath, count, searchString }: Props

const qs = params.toString();
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
replace(qs ? `${basePath}?${qs}` : basePath);
});
};
Expand Down
7 changes: 4 additions & 3 deletions app/components/past_papers/course-paper-grid.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use client";

import React, { ViewTransition, useCallback, useEffect, useEffectEvent, useMemo, useReducer, useRef } from "react";
import React, { useCallback, useEffect, useEffectEvent, useMemo, useReducer, useRef } from "react";
import { createPortal } from "react-dom";
import { useRouter } from "next/navigation";
import {
Expand All @@ -12,6 +12,7 @@ import {
PanelRight,
X,
} from "lucide-react";
import { OptionalViewTransition } from "@/app/components/common/react-transition";
import { useToast } from "@/app/components/ui/use-toast";
import CoursePaperCard from "./course-paper-card";
import type { CoursePaperListItem } from "@/lib/data/course-papers";
Expand Down Expand Up @@ -669,7 +670,7 @@ export default function CoursePaperGrid({

<div className="course-paper-grid flex flex-wrap gap-3">
{papers.map((paper, index) => (
<ViewTransition
<OptionalViewTransition
key={paper.id}
enter={{
"filter-results": "paper-card-enter",
Expand Down Expand Up @@ -704,7 +705,7 @@ export default function CoursePaperGrid({
onContextMenuOpen={openContextMenu}
/>
</div>
</ViewTransition>
</OptionalViewTransition>
))}
</div>

Expand Down
5 changes: 3 additions & 2 deletions app/components/past_papers/filter-bar.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use client";

import React, { addTransitionType, memo, useCallback, useMemo, useTransition } from "react";
import React, { memo, useCallback, useMemo, useTransition } from "react";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { examTypeLabel, examTypeToSlug, examSlugToType } from "@/lib/exam-slug";
import type { Campus, ExamType, Semester } from "@/db";

Expand Down Expand Up @@ -102,7 +103,7 @@ export default function FilterBar({
next.delete("page");
const qs = next.toString();
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
replace(qs ? `${basePath}?${qs}` : basePath);
});
}, [basePath, replace, startTransition]);
Expand Down
9 changes: 5 additions & 4 deletions app/components/past_papers/past-papers-course-search.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
"use client";

import React, { Activity, addTransitionType, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
import React, { Activity, startTransition, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
import Image from "@/app/components/common/app-image";
import Link from "next/link";
import SearchIcon from "@/app/components/assets/seacrh.svg";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import { getAliasCourseCodes } from "@/lib/course-aliases";
import { createCourseFuse } from "@/lib/course-search-fuse";
import { normalizeCourseCode } from "@/lib/course-tags";
Expand Down Expand Up @@ -204,7 +205,7 @@ export default function PastPapersCourseSearch({
) => {
recordSelection(course, options);
startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(getCoursePastPapersPath(course.code));
});
};
Expand Down Expand Up @@ -288,7 +289,7 @@ export default function PastPapersCourseSearch({
hasSyllabus: false,
});
startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(`/past_papers/${encodeURIComponent(course.code)}`);
});
return;
Expand Down Expand Up @@ -322,7 +323,7 @@ export default function PastPapersCourseSearch({
hasSyllabus: false,
});
startTransition(() => {
addTransitionType("nav-forward");
addReactTransitionType("nav-forward");
push(`/past_papers/${encodeURIComponent(exact.code)}`);
});
return;
Expand Down
5 changes: 3 additions & 2 deletions app/components/past_papers/sort-dropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use client";

import React, { addTransitionType, useTransition } from "react";
import React, { useTransition } from "react";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";

const OPTIONS = [
{ value: "seasonal", label: "Current exam first" },
Expand Down Expand Up @@ -34,7 +35,7 @@ export default function SortDropdown({
params.delete("page");
const qs = params.toString();
startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
replace(qs ? `${basePath}?${qs}` : basePath);
});
};
Expand Down
4 changes: 2 additions & 2 deletions app/components/voice/voice-agent-provider.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"use client";

import React, {
addTransitionType,
createContext,
startTransition,
useCallback,
Expand All @@ -12,6 +11,7 @@ import React, {
useState,
} from "react";
import { useRouter } from "next/navigation";
import { addReactTransitionType } from "@/app/components/common/react-transition";
import {
createVoiceControlController,
defineVoiceTool,
Expand Down Expand Up @@ -428,7 +428,7 @@ export default function VoiceAgentProvider({
}

startTransition(() => {
addTransitionType("filter-results");
addReactTransitionType("filter-results");
replace(nextPath);
});
await settleUi({ targetPath: nextPath });
Expand Down
Loading