Loading analyst/src/routes/_layout/route.tsx +16 −5 Original line number Diff line number Diff line import { DUMMY_EXERCISE, ExerciseContext } from '@inject/analyst' import { useStaffBoundary } from '@inject/frontend' import { GetExercise, useTypedQuery } from '@inject/graphql' import { authIdentity, GetExercise, useTypedQuery } from '@inject/graphql' import { ErrorMessage } from '@inject/shared' import { createFileRoute, Outlet, useParams } from '@tanstack/react-router' import { createFileRoute, Outlet, redirect, useParams, } from '@tanstack/react-router' import { useMemo } from 'react' import { NavigationBar } from '../../components/NavigationBar' import { ExerciseLayoutRoute } from './$exerciseId/route' const RouteComponent = () => { useStaffBoundary({ to: '/' }) const params = useParams({ from: ExerciseLayoutRoute.id, shouldThrow: false, Loading Loading @@ -57,6 +59,15 @@ const RouteComponent = () => { export const Route = createFileRoute('/_layout')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: '/', }) } }, head: () => ({ meta: [ { Loading frontend/src/email/TeamEmails/EmailCard.tsx +6 −21 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ import { useClient, WriteReadReceiptEmail } from '@inject/graphql' import { breakWord, Timestamp } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import type { FC } from 'react' import { useEffect, useLayoutEffect, useState } from 'react' import { useEffect, useState } from 'react' import InjectComment from '../../actionlog/InjectMessage/InjectComment' import { RenderedContent } from '../../components' import Description from '../../components/Description' Loading Loading @@ -59,22 +59,15 @@ export const EmailCard: FC<{ inInstructor, getFileLink, }) => { const client = useClient() // this ensures the message is rendered as 'not read' the first time it's rendered const [initialReadReceipt, setInitialReadReceipt] = useState(false) if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } const client = useClient() // this ensures the message is rendered as 'not read' the first time it's rendered useLayoutEffect(() => { if ( email.details.__typename === 'EmailType' && const [initialReadReceipt, _setInitialReadReceipt] = useState( !email.details.readReceipt ) { setInitialReadReceipt(true) } }, [email, email.readReceipt]) ) useEffect(() => { // you can't use URQL calls in layout effects Loading @@ -94,14 +87,6 @@ export const EmailCard: FC<{ initialReadReceipt, ]) if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } return ( <Section className={cx({ [section]: true, [unread]: initialReadReceipt === null })} Loading frontend/src/index.ts +0 −1 Original line number Diff line number Diff line Loading @@ -17,5 +17,4 @@ export type { ExtendedEmail } from './email/typing' export { InstructorQuestionnaireCard } from './instructor/InstructorQuestionnaire/InstructorQuestionnaireCard' export { LearningObjective } from './instructor/LearningObjectives/LearningObjective' export { useStaffBoundary } from './utils' export { barClass } from './views/InstructorView/barClass' frontend/src/routes/_navbar/exercise-panel/route.tsx +16 −11 Original line number Diff line number Diff line import { authIdentity } from '@inject/graphql' import { Container, flexedPage } from '@inject/shared' import { createFileRoute, Outlet } from '@tanstack/react-router' import { useStaffBoundary } from '../../../utils' import { createFileRoute, Outlet, redirect } from '@tanstack/react-router' import { RootRoute } from '../../__root' const RouteComponent = () => { useStaffBoundary({ to: RootRoute.to }) return ( const RouteComponent = () => ( <Container className={flexedPage} maxWidth={75}> <Outlet /> </Container> ) } export const Route = createFileRoute('/_navbar/exercise-panel')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: RootRoute.to, }) } }, head: () => ({ meta: [ { Loading frontend/src/routes/_navbar/staff.tsx +11 −4 Original line number Diff line number Diff line import { Classes, Icon, type IconName } from '@blueprintjs/core' import { css } from '@emotion/css' import { useAuthIdentity } from '@inject/graphql' import { authIdentity, useAuthIdentity } from '@inject/graphql' import { Container, LinkButton, useExperimentalV2 } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import { createFileRoute, useRouter } from '@tanstack/react-router' import { useStaffBoundary } from '../../utils' import { createFileRoute, redirect, useRouter } from '@tanstack/react-router' import { RightNavbar } from '../../views/InstructorView/RightNavbar' import { RootRoute } from '../__root' import { ExercisePanelRoute } from './exercise-panel' Loading Loading @@ -114,7 +113,6 @@ const RouteComponent = () => { }, ] useStaffBoundary({ to: RootRoute.to }) const { isSuperuser } = useAuthIdentity() const isExperimentalV2 = useExperimentalV2() Loading Loading @@ -169,6 +167,15 @@ export const StaffRouteComponent = RouteComponent export const Route = createFileRoute('/_navbar/staff')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: RootRoute.to, }) } }, head: () => ({ meta: [ { Loading Loading
analyst/src/routes/_layout/route.tsx +16 −5 Original line number Diff line number Diff line import { DUMMY_EXERCISE, ExerciseContext } from '@inject/analyst' import { useStaffBoundary } from '@inject/frontend' import { GetExercise, useTypedQuery } from '@inject/graphql' import { authIdentity, GetExercise, useTypedQuery } from '@inject/graphql' import { ErrorMessage } from '@inject/shared' import { createFileRoute, Outlet, useParams } from '@tanstack/react-router' import { createFileRoute, Outlet, redirect, useParams, } from '@tanstack/react-router' import { useMemo } from 'react' import { NavigationBar } from '../../components/NavigationBar' import { ExerciseLayoutRoute } from './$exerciseId/route' const RouteComponent = () => { useStaffBoundary({ to: '/' }) const params = useParams({ from: ExerciseLayoutRoute.id, shouldThrow: false, Loading Loading @@ -57,6 +59,15 @@ const RouteComponent = () => { export const Route = createFileRoute('/_layout')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: '/', }) } }, head: () => ({ meta: [ { Loading
frontend/src/email/TeamEmails/EmailCard.tsx +6 −21 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ import { useClient, WriteReadReceiptEmail } from '@inject/graphql' import { breakWord, Timestamp } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import type { FC } from 'react' import { useEffect, useLayoutEffect, useState } from 'react' import { useEffect, useState } from 'react' import InjectComment from '../../actionlog/InjectMessage/InjectComment' import { RenderedContent } from '../../components' import Description from '../../components/Description' Loading Loading @@ -59,22 +59,15 @@ export const EmailCard: FC<{ inInstructor, getFileLink, }) => { const client = useClient() // this ensures the message is rendered as 'not read' the first time it's rendered const [initialReadReceipt, setInitialReadReceipt] = useState(false) if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } const client = useClient() // this ensures the message is rendered as 'not read' the first time it's rendered useLayoutEffect(() => { if ( email.details.__typename === 'EmailType' && const [initialReadReceipt, _setInitialReadReceipt] = useState( !email.details.readReceipt ) { setInitialReadReceipt(true) } }, [email, email.readReceipt]) ) useEffect(() => { // you can't use URQL calls in layout effects Loading @@ -94,14 +87,6 @@ export const EmailCard: FC<{ initialReadReceipt, ]) if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } if (email.details.__typename !== 'EmailType') { throw new Error('Wrong details type') } return ( <Section className={cx({ [section]: true, [unread]: initialReadReceipt === null })} Loading
frontend/src/index.ts +0 −1 Original line number Diff line number Diff line Loading @@ -17,5 +17,4 @@ export type { ExtendedEmail } from './email/typing' export { InstructorQuestionnaireCard } from './instructor/InstructorQuestionnaire/InstructorQuestionnaireCard' export { LearningObjective } from './instructor/LearningObjectives/LearningObjective' export { useStaffBoundary } from './utils' export { barClass } from './views/InstructorView/barClass'
frontend/src/routes/_navbar/exercise-panel/route.tsx +16 −11 Original line number Diff line number Diff line import { authIdentity } from '@inject/graphql' import { Container, flexedPage } from '@inject/shared' import { createFileRoute, Outlet } from '@tanstack/react-router' import { useStaffBoundary } from '../../../utils' import { createFileRoute, Outlet, redirect } from '@tanstack/react-router' import { RootRoute } from '../../__root' const RouteComponent = () => { useStaffBoundary({ to: RootRoute.to }) return ( const RouteComponent = () => ( <Container className={flexedPage} maxWidth={75}> <Outlet /> </Container> ) } export const Route = createFileRoute('/_navbar/exercise-panel')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: RootRoute.to, }) } }, head: () => ({ meta: [ { Loading
frontend/src/routes/_navbar/staff.tsx +11 −4 Original line number Diff line number Diff line import { Classes, Icon, type IconName } from '@blueprintjs/core' import { css } from '@emotion/css' import { useAuthIdentity } from '@inject/graphql' import { authIdentity, useAuthIdentity } from '@inject/graphql' import { Container, LinkButton, useExperimentalV2 } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import { createFileRoute, useRouter } from '@tanstack/react-router' import { useStaffBoundary } from '../../utils' import { createFileRoute, redirect, useRouter } from '@tanstack/react-router' import { RightNavbar } from '../../views/InstructorView/RightNavbar' import { RootRoute } from '../__root' import { ExercisePanelRoute } from './exercise-panel' Loading Loading @@ -114,7 +113,6 @@ const RouteComponent = () => { }, ] useStaffBoundary({ to: RootRoute.to }) const { isSuperuser } = useAuthIdentity() const isExperimentalV2 = useExperimentalV2() Loading Loading @@ -169,6 +167,15 @@ export const StaffRouteComponent = RouteComponent export const Route = createFileRoute('/_navbar/staff')({ component: RouteComponent, beforeLoad: async ({ context }) => { const auth = await authIdentity(context.gql) if (!auth.isStaff) { throw redirect({ to: RootRoute.to, }) } }, head: () => ({ meta: [ { Loading