---
title: Share Dialog
description: A dialog that mints a shareable download or upload link with expiry presets clamped to the adapter's signed URL cap - driven by useFiles.
---

Mints a shareable link for one key. Download links go through [`url()`](/docs/api/url) — a signed URL where the adapter supports it, a permanent public one where it doesn't — while upload links go through [`signedUploadUrl()`](/docs/api/signed-upload-url). Pick an expiry (clamped to the adapter's cap), choose attachment (the default) or inline, then copy. Inline download links require the gateway's `authorize` hook to return `{ disposition: "inline" }`.

<Component path="share-dialog/examples/share-dialog-basic" />

## Installation

<ComponentInstall name="share-dialog" />

## Usage

```tsx lineNumbers
import { useFiles } from "files-sdk/react";

import { ShareDialog } from "@/components/files-sdk/share-dialog";

export function Row({ fileKey }: { fileKey: string }) {
  const files = useFiles({ endpoint: "/api/files" });

  return <ShareDialog files={files} fileKey={fileKey} />;
}
```

The component reads [`capabilities()`](/docs/capabilities) when it opens, so the expiry presets are clamped to the adapter's `signedUrl.maxExpiresIn` and it warns when the backend can only return a permanent public URL. A download link waits for that answer and carries an expiry only when `signedUrl.supported` is `true`, since the gateway answers an expiry on an adapter that can't sign with a `422`. Pass `mode="upload"` to hand out a presigned upload target instead — the dialog shows its method and any headers or form fields the target requires (a POST form, or Azure's `x-ms-blob-type` header), and copies the whole target as JSON when the URL alone isn't enough. Pass custom trigger content via `children` (rendered inside the trigger button, which you can style through `className`).

## Props

<AutoTypeTable
  path="registry/files-sdk/share-dialog/share-dialog.tsx"
  name="ShareDialogProps"
/>
