187200a1bc
* Record cold start and execution metrics on attempt executions. Add cold start metrics as span events on attempt spans and display them in the run dashboard * Add deployed tasks run timeline metrics * Add Dequeued event to run timeline and cleanup the run timeline code * Adds variants to storybook * WIP adding new span styles * Added offset progress bar animation * More storybook states * Adds support for the full vertical span to show the same state * Adds error state to timelineLine * Added additional state * Added more line styling * Added progress state to dequeued * Added another state to storybook * Fixed classname error * Updated styles for the span timeline points * Fixes alignment of timeline follow cursor indicator * Adds help text tooltip to timeline span type titles * Fixes type error * Tweaked wording of tooltips * Fixed type error (check this) * Moved isAdmin to a higher level * removed unused admin props * Removed unused Admin filter * Fixed border styling * made the opacity of the timeline states 30% less * Undo type cast * Added a diminished style that’s used for spans (grey progress bar) * Adds new storybook state * Fixed timeline state * Removed state if span isn’t the first * Changed the timestamp span icon --------- Co-authored-by: James Ritchie <james@trigger.dev>
37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { UIMatch } from "@remix-run/react";
|
|
import type { User } from "~/models/user.server";
|
|
import { loader } from "~/root";
|
|
import { useChanged } from "./useChanged";
|
|
import { useTypedMatchesData } from "./useTypedMatchData";
|
|
import { useIsImpersonating } from "./useOrganizations";
|
|
|
|
export function useOptionalUser(matches?: UIMatch[]): User | undefined {
|
|
const routeMatch = useTypedMatchesData<typeof loader>({
|
|
id: "root",
|
|
matches,
|
|
});
|
|
|
|
return routeMatch?.user ?? undefined;
|
|
}
|
|
|
|
export function useUser(matches?: UIMatch[]): User {
|
|
const maybeUser = useOptionalUser(matches);
|
|
if (!maybeUser) {
|
|
throw new Error(
|
|
"No user found in root loader, but user is required by useUser. If user is optional, try useOptionalUser instead."
|
|
);
|
|
}
|
|
return maybeUser;
|
|
}
|
|
|
|
export function useUserChanged(callback: (user: User | undefined) => void) {
|
|
useChanged(useOptionalUser, callback);
|
|
}
|
|
|
|
export function useHasAdminAccess(matches?: UIMatch[]): boolean {
|
|
const user = useOptionalUser(matches);
|
|
const isImpersonating = useIsImpersonating(matches);
|
|
|
|
return Boolean(user?.admin) || isImpersonating;
|
|
}
|