import type { ResourceAccessRequestFailure } from "./useResourceAccessGate.js"; export type AccessRequestRole = "viewer" | "commenter" | "editor" | "admin"; /** One access request, as someone who manages access reviews it. */ export interface AccessRequestReview { id: string; generation: number; state: "pending" | "approved" | "declined"; requester: { email: string; name: string | null; }; note: string | null; requestedAt: string; decidedAt: string | null; grantedRole: AccessRequestRole | null; resource: { type: string; id: string; label: string; title: string; path: string | null; }; } export interface AccessRequestDecisionFailure extends ResourceAccessRequestFailure { /** * Why the server refused, such as a sharing rule. Absent for unexpected * failures, whose server message isn't meant for people. */ message: string | null; } type DecidedRequest = Pick; export interface AccessRequestDecisions { approve: (request: DecidedRequest, role: AccessRequestRole) => Promise; decline: (request: DecidedRequest) => Promise; /** The request a decision is in flight for. */ pendingId: string | null; error: AccessRequestDecisionFailure | null; /** An allowed request whose requester couldn't be emailed. */ unemailed: Pick | null; } /** * Allow and Decline, shared by the approval page and the Share panels. A * decision someone else already made calls `onStale`, so the caller reloads * instead of offering the same outdated request again. */ export declare function useAccessRequestDecisions(onStale: () => unknown): AccessRequestDecisions; export interface AccessRequestReviewController { review: AccessRequestReview | undefined; isLoading: boolean; /** The viewer isn't signed in. */ isSignedOut: boolean; /** The request doesn't exist, or the viewer can't manage its resource. */ isUnavailable: boolean; /** Reading the request failed for another reason; retry with `refetch`. */ isError: boolean; refetch: () => Promise; decisions: AccessRequestDecisions; } /** * Loads one access request for its approval page. Opening the page only * reads; Allow and Decline are explicit calls on `decisions`. */ export declare function useAccessRequestReview(requestId: string): AccessRequestReviewController; export interface ResourceAccessRequestsController { /** The newest pending requests. */ requests: AccessRequestReview[]; /** Older pending requests exist beyond `requests`. */ hasMore: boolean; isLoading: boolean; isError: boolean; refetch: () => Promise; decisions: AccessRequestDecisions; } /** Pending access requests for one resource, for its Share panel. */ export declare function useResourceAccessRequests({ resourceType, resourceId, enabled, }: { resourceType: string; resourceId: string; enabled?: boolean; }): ResourceAccessRequestsController; export {};