@sentroy-co/client-sdk 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +139 -2
  2. package/dist/react/MediaManager.d.ts +69 -0
  3. package/dist/react/MediaManager.d.ts.map +1 -0
  4. package/dist/react/MediaManager.js +216 -0
  5. package/dist/react/MediaManager.js.map +1 -0
  6. package/dist/react/index.d.ts +4 -0
  7. package/dist/react/index.d.ts.map +1 -0
  8. package/dist/react/index.js +13 -0
  9. package/dist/react/index.js.map +1 -0
  10. package/dist/react/lib/Lightbox.d.ts +18 -0
  11. package/dist/react/lib/Lightbox.d.ts.map +1 -0
  12. package/dist/react/lib/Lightbox.js +40 -0
  13. package/dist/react/lib/Lightbox.js.map +1 -0
  14. package/dist/react/lib/use-media-list.d.ts +21 -0
  15. package/dist/react/lib/use-media-list.d.ts.map +1 -0
  16. package/dist/react/lib/use-media-list.js +50 -0
  17. package/dist/react/lib/use-media-list.js.map +1 -0
  18. package/dist/react/lib/utils.d.ts +17 -0
  19. package/dist/react/lib/utils.d.ts.map +1 -0
  20. package/dist/react/lib/utils.js +62 -0
  21. package/dist/react/lib/utils.js.map +1 -0
  22. package/dist/types.d.ts +5 -0
  23. package/dist/types.d.ts.map +1 -1
  24. package/package.json +40 -4
  25. package/src/http.ts +151 -0
  26. package/src/index.ts +106 -0
  27. package/src/react/MediaManager.tsx +628 -0
  28. package/src/react/index.ts +13 -0
  29. package/src/react/lib/Lightbox.tsx +162 -0
  30. package/src/react/lib/use-media-list.ts +54 -0
  31. package/src/react/lib/utils.ts +73 -0
  32. package/src/resources/buckets.ts +50 -0
  33. package/src/resources/domains.ts +16 -0
  34. package/src/resources/inbox.ts +99 -0
  35. package/src/resources/mailboxes.ts +11 -0
  36. package/src/resources/media.ts +115 -0
  37. package/src/resources/send.ts +11 -0
  38. package/src/resources/storage.ts +28 -0
  39. package/src/resources/templates.ts +16 -0
  40. package/src/types.ts +316 -0
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <h3 align="center">Sentroy Client SDK for TypeScript</h3>
6
6
 
7
7
  <p align="center">
8
- Server-side SDK to interact with the Sentroy platform API.<br />
8
+ TypeScript SDK to interact with the Sentroy platform API + opt-in React components.<br />
9
9
  Manage mail (domains, mailboxes, templates, inbox, send) and storage (buckets, media) from a single entry point.
10
10
  </p>
11
11
 
@@ -271,10 +271,147 @@ try {
271
271
  | `accessToken` | `string` | Yes | Access token (`stk_...`) |
272
272
  | `timeout` | `number` | No | Request timeout in ms (default: `30000`) |
273
273
 
274
+ ## React components (`@sentroy-co/client-sdk/react`)
275
+
276
+ Optional subpath. Only loaded if you import it; React + react-dom are
277
+ declared as **optional peer dependencies** so server-only consumers
278
+ don't need to install them.
279
+
280
+ ```bash
281
+ npm install react react-dom
282
+ ```
283
+
284
+ ### `MediaManager`
285
+
286
+ Drop-in storage browser/uploader for end-user apps. Talks to the same
287
+ Sentroy client you already use; renders Tailwind classes (host app's
288
+ Tailwind setup is reused — the package ships no styles).
289
+
290
+ ```tsx
291
+ "use client"
292
+
293
+ import { Sentroy } from "@sentroy-co/client-sdk"
294
+ import { MediaManager } from "@sentroy-co/client-sdk/react"
295
+
296
+ const client = new Sentroy({
297
+ baseUrl: "https://sentroy.com",
298
+ companySlug: "my-company",
299
+ accessToken: "stk_...",
300
+ })
301
+
302
+ export default function Page() {
303
+ return (
304
+ <MediaManager
305
+ client={client}
306
+ multiple
307
+ accept="image/*"
308
+ onChange={(selected) => console.log(selected)}
309
+ onSelect={(selected) => console.log("confirmed:", selected)}
310
+ />
311
+ )
312
+ }
313
+ ```
314
+
315
+ #### Features
316
+
317
+ - Bucket selector (auto-picks first if `bucketSlug` not provided)
318
+ - Search (filename) + file-type filter (image / video / audio / pdf / doc / archive / code)
319
+ - Upload via button **and** drag-and-drop
320
+ - Single or multi selection (`multiple` prop)
321
+ - `initialValue` accepts `Media[]` or `string[]` (id list) — pre-selected
322
+ on mount, fires `onChange` immediately so parent state stays in sync
323
+ - Press `Space` while a card is selected → opens it in fullscreen
324
+ **Lightbox** (image / video / audio render natively, others get a
325
+ download fallback). `Esc` closes, `←/→` step through siblings
326
+ - Detail pane on the right (large screens) — preview, metadata,
327
+ delete, "Use selection" CTA when `onSelect` provided
328
+
329
+ #### Props
330
+
331
+ | Prop | Type | Required | Description |
332
+ |----------------------|-------------------------------------------------------|:-:|:--|
333
+ | `client` | `Sentroy` | Yes | The configured client instance |
334
+ | `bucketSlug` | `string` | | Initial bucket; default = first one in the list |
335
+ | `multiple` | `boolean` | | Allow multi-selection. Default `false` |
336
+ | `accept` | `string` | | MIME pattern for upload, e.g. `"image/*"` |
337
+ | `initialValue` | `Array<Media \| string>` | | Pre-selected items (objects or ids) |
338
+ | `onChange` | `(selected: Media[]) => void` | | Fires on every selection change |
339
+ | `onSelect` | `(selected: Media[]) => void` | | Fires on confirm — picker dialogs use this |
340
+ | `bucketFilter` | `(b: Bucket) => boolean` | | Filter the bucket dropdown — hide system buckets |
341
+ | `showDetailsPane` | `boolean` | | Default `true` |
342
+ | `showBucketSelector` | `boolean` | | Default `true` |
343
+ | `className` | `string` | | Root wrapper class |
344
+ | `classNames` | `MediaManagerClassNames` | | Per-region class overrides (see theming) |
345
+
346
+ #### Theming
347
+
348
+ The component uses Tailwind utility classes that consume your design
349
+ tokens (`bg-background`, `text-foreground`, `border-border`,
350
+ `text-muted-foreground`, `bg-muted`, etc.). Drop-in usage in any
351
+ shadcn-style codebase needs no extra setup.
352
+
353
+ For finer control, override individual sections via `classNames`:
354
+
355
+ ```tsx
356
+ <MediaManager
357
+ client={client}
358
+ className="h-[600px] rounded-2xl border-purple-200"
359
+ classNames={{
360
+ toolbar: "bg-purple-50",
361
+ uploadButton: "bg-purple-600 text-white",
362
+ cardSelected: "ring-purple-400 border-purple-400",
363
+ grid: "sm:grid-cols-2 md:grid-cols-3", // override grid density
364
+ }}
365
+ />
366
+ ```
367
+
368
+ Available keys: `root`, `toolbar`, `searchInput`, `filterSelect`,
369
+ `uploadButton`, `bucketSelect`, `grid`, `card`, `cardSelected`,
370
+ `thumbnail`, `cardMeta`, `empty`, `details`, `dropZoneOverlay`.
371
+
372
+ When you migrate to a different theme system later, change tokens in
373
+ one place — every Tailwind utility resolves through your `globals.css`.
374
+
375
+ #### `Lightbox` (standalone)
376
+
377
+ Exported separately so you can use it outside `MediaManager` (e.g. in
378
+ a feed view):
379
+
380
+ ```tsx
381
+ import { Lightbox } from "@sentroy-co/client-sdk/react"
382
+
383
+ const [active, setActive] = useState<Media | null>(null)
384
+
385
+ return (
386
+ <>
387
+ {/* …trigger… */}
388
+ {active && (
389
+ <Lightbox media={active} onClose={() => setActive(null)} />
390
+ )}
391
+ </>
392
+ )
393
+ ```
394
+
395
+ Image / video / audio rendered inline; everything else gets a download
396
+ button. `Esc` closes, optional `onPrev` / `onNext` add ←/→ navigation.
397
+
398
+ #### Helpers
399
+
400
+ ```ts
401
+ import {
402
+ cn, // tiny class joiner
403
+ formatBytes, // 1234 → "1.21 KB"
404
+ detectKind, // image | video | audio | pdf | doc | archive | code | other
405
+ KIND_LABELS,
406
+ type MediaKind,
407
+ } from "@sentroy-co/client-sdk/react"
408
+ ```
409
+
274
410
  ## Requirements
275
411
 
276
412
  - Node.js 18+ (uses native `fetch`)
277
- - Server-side only
413
+ - React 18+ (only if you import from `/react`)
414
+ - Tailwind CSS in the host app (only for React components)
278
415
 
279
416
  ## Raw Documentation
280
417
 
@@ -0,0 +1,69 @@
1
+ import type { Sentroy } from "..";
2
+ import type { Bucket, Media } from "../types";
3
+ /**
4
+ * MediaManager — Sentroy storage'a bağlanan tek-component dosya yöneticisi.
5
+ *
6
+ * Tasarım hedefleri:
7
+ * - Tek bir prop'la (`client`) tam workflow: bucket select → list → arama →
8
+ * upload → seç → preview (lightbox) → delete.
9
+ * - Ne single ne multi-file selection için zorla; `multiple` prop'u akış
10
+ * belirler. `onChange` her seçim değişikliğinde tetiklenir.
11
+ * - `initialValue` ile pre-selected file'lar (Media obje veya id string).
12
+ * - Tema override: kök `className` + `classNames` map ile alt-component
13
+ * class'larını override edebilir consumer (ileride farklı tema
14
+ * promptları için tek değişiklik noktası).
15
+ * - Spacebar selected item'i lightbox'ta açar; ESC kapatır.
16
+ * - Drag-drop + click-to-upload.
17
+ *
18
+ * Tailwind class kullanır ama kendisi Tailwind import etmez — host app'in
19
+ * Tailwind setup'ı kullanılır. Class çakışmalarında tailwind-merge yerine
20
+ * "consumer'ın className son geliyor" kuralı yeterli.
21
+ */
22
+ export interface MediaManagerClassNames {
23
+ root?: string;
24
+ toolbar?: string;
25
+ searchInput?: string;
26
+ filterSelect?: string;
27
+ uploadButton?: string;
28
+ bucketSelect?: string;
29
+ grid?: string;
30
+ card?: string;
31
+ cardSelected?: string;
32
+ thumbnail?: string;
33
+ cardMeta?: string;
34
+ empty?: string;
35
+ details?: string;
36
+ dropZoneOverlay?: string;
37
+ }
38
+ export interface MediaManagerProps {
39
+ /** Sentroy client instance — caller kendi access token'i ile yaratır. */
40
+ client: Sentroy;
41
+ /**
42
+ * Başlangıçta açılacak bucket. Verilmezse component bucket list çeker
43
+ * ve ilkini açar; ilk render'da kullanıcı dropdown'tan değiştirebilir.
44
+ */
45
+ bucketSlug?: string;
46
+ /** Birden fazla seçilebilir mi? Default false. */
47
+ multiple?: boolean;
48
+ /** Yalnızca belirli MIME prefix'leri kabul et upload'ta — örn "image/*". */
49
+ accept?: string;
50
+ /** Kullanıcının önceden seçtiği item'lar — Media obje ya da id string. */
51
+ initialValue?: Array<Media | string>;
52
+ /** Seçim her değiştiğinde — tek seçimde array.length<=1. */
53
+ onChange?: (selected: Media[]) => void;
54
+ /** Çift tık veya tek seçim "confirm" — picker dialog'larda useful. */
55
+ onSelect?: (selected: Media[]) => void;
56
+ /** Bucket dropdown'unda hangi bucket'lar görünsün — gizli system
57
+ * bucket'larını filtrelemek için. */
58
+ bucketFilter?: (bucket: Bucket) => boolean;
59
+ /** Custom kök class. */
60
+ className?: string;
61
+ /** Alt-component class override haritası. */
62
+ classNames?: MediaManagerClassNames;
63
+ /** Detail panel'i sağda göster mi (default true). */
64
+ showDetailsPane?: boolean;
65
+ /** Toolbar'da bucket selector görünsün mü (default true). */
66
+ showBucketSelector?: boolean;
67
+ }
68
+ export declare function MediaManager(props: MediaManagerProps): import("react/jsx-runtime").JSX.Element;
69
+ //# sourceMappingURL=MediaManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaManager.d.ts","sourceRoot":"","sources":["../../src/react/MediaManager.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAW7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,YAAY,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;IACtC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;IACtC;0CACsC;IACtC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,sBAAsB,CAAA;IACnC,qDAAqD;IACrD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAcD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAghBpD"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaManager = MediaManager;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const Lightbox_1 = require("./lib/Lightbox");
7
+ const use_media_list_1 = require("./lib/use-media-list");
8
+ const utils_1 = require("./lib/utils");
9
+ const KIND_FILTERS = [
10
+ { value: "all", label: "All" },
11
+ { value: "image", label: utils_1.KIND_LABELS.image },
12
+ { value: "video", label: utils_1.KIND_LABELS.video },
13
+ { value: "audio", label: utils_1.KIND_LABELS.audio },
14
+ { value: "pdf", label: utils_1.KIND_LABELS.pdf },
15
+ { value: "doc", label: utils_1.KIND_LABELS.doc },
16
+ { value: "archive", label: utils_1.KIND_LABELS.archive },
17
+ { value: "code", label: utils_1.KIND_LABELS.code },
18
+ { value: "other", label: utils_1.KIND_LABELS.other },
19
+ ];
20
+ function MediaManager(props) {
21
+ const { client, bucketSlug: initialBucketSlug, multiple = false, accept, initialValue, onChange, onSelect, bucketFilter, className, classNames: cls = {}, showDetailsPane = true, showBucketSelector = true, } = props;
22
+ // ── Bucket state ───────────────────────────────────────────────────────
23
+ const [buckets, setBuckets] = (0, react_1.useState)([]);
24
+ const [bucketsLoading, setBucketsLoading] = (0, react_1.useState)(false);
25
+ const [activeBucketSlug, setActiveBucketSlug] = (0, react_1.useState)(initialBucketSlug ?? null);
26
+ (0, react_1.useEffect)(() => {
27
+ setBucketsLoading(true);
28
+ client.buckets
29
+ .list()
30
+ .then((list) => {
31
+ const filtered = bucketFilter ? list.filter(bucketFilter) : list;
32
+ setBuckets(filtered);
33
+ if (!activeBucketSlug && filtered.length > 0) {
34
+ setActiveBucketSlug(filtered[0].slug);
35
+ }
36
+ })
37
+ .catch(() => {
38
+ setBuckets([]);
39
+ })
40
+ .finally(() => setBucketsLoading(false));
41
+ // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ }, [client]);
43
+ // ── Media list ────────────────────────────────────────────────────────
44
+ const [refreshKey, setRefreshKey] = (0, react_1.useState)(0);
45
+ const { items, loading, error } = (0, use_media_list_1.useMediaList)({
46
+ client,
47
+ bucketSlug: activeBucketSlug,
48
+ refreshKey,
49
+ });
50
+ // ── Selection ──────────────────────────────────────────────────────────
51
+ const [selectedIds, setSelectedIds] = (0, react_1.useState)(() => {
52
+ const initial = new Set();
53
+ for (const v of initialValue ?? []) {
54
+ initial.add(typeof v === "string" ? v : v.id);
55
+ }
56
+ return initial;
57
+ });
58
+ // initialValue Media[] ise hemen onChange'i çağır ki parent state senkron
59
+ // başlasın. Sadece mount'ta.
60
+ (0, react_1.useEffect)(() => {
61
+ if (!initialValue || initialValue.length === 0)
62
+ return;
63
+ const objects = initialValue.filter((v) => typeof v !== "string");
64
+ if (objects.length > 0)
65
+ onChange?.(objects);
66
+ // eslint-disable-next-line react-hooks/exhaustive-deps
67
+ }, []);
68
+ const toggleSelect = (0, react_1.useCallback)((media) => {
69
+ setSelectedIds((prev) => {
70
+ const next = new Set(prev);
71
+ if (multiple) {
72
+ if (next.has(media.id))
73
+ next.delete(media.id);
74
+ else
75
+ next.add(media.id);
76
+ }
77
+ else {
78
+ // Single: aynısı tıklanırsa deselect
79
+ if (next.has(media.id) && next.size === 1)
80
+ next.clear();
81
+ else {
82
+ next.clear();
83
+ next.add(media.id);
84
+ }
85
+ }
86
+ return next;
87
+ });
88
+ }, [multiple]);
89
+ const selected = (0, react_1.useMemo)(() => items.filter((m) => selectedIds.has(m.id)), [items, selectedIds]);
90
+ // selected değiştiğinde onChange'i çağır
91
+ (0, react_1.useEffect)(() => {
92
+ onChange?.(selected);
93
+ // eslint-disable-next-line react-hooks/exhaustive-deps
94
+ }, [selectedIds, items]);
95
+ // ── Search + filter ────────────────────────────────────────────────────
96
+ const [search, setSearch] = (0, react_1.useState)("");
97
+ const [kindFilter, setKindFilter] = (0, react_1.useState)("all");
98
+ const visibleItems = (0, react_1.useMemo)(() => {
99
+ const q = search.trim().toLowerCase();
100
+ return items.filter((m) => {
101
+ if (q && !m.fileName.toLowerCase().includes(q))
102
+ return false;
103
+ if (kindFilter !== "all" && (0, utils_1.detectKind)(m) !== kindFilter)
104
+ return false;
105
+ return true;
106
+ });
107
+ }, [items, search, kindFilter]);
108
+ // ── Upload ─────────────────────────────────────────────────────────────
109
+ const fileInputRef = (0, react_1.useRef)(null);
110
+ const [uploading, setUploading] = (0, react_1.useState)(false);
111
+ const [dragOver, setDragOver] = (0, react_1.useState)(false);
112
+ const uploadFiles = (0, react_1.useCallback)(async (files) => {
113
+ if (!activeBucketSlug)
114
+ return;
115
+ setUploading(true);
116
+ try {
117
+ const list = Array.from(files);
118
+ for (const file of list) {
119
+ await client.media.upload(activeBucketSlug, { body: file });
120
+ }
121
+ setRefreshKey((k) => k + 1);
122
+ }
123
+ finally {
124
+ setUploading(false);
125
+ }
126
+ }, [client, activeBucketSlug]);
127
+ // ── Delete ─────────────────────────────────────────────────────────────
128
+ const [deletingId, setDeletingId] = (0, react_1.useState)(null);
129
+ const handleDelete = (0, react_1.useCallback)(async (media) => {
130
+ if (!activeBucketSlug)
131
+ return;
132
+ const ok = window.confirm(`Delete ${media.fileName}?`);
133
+ if (!ok)
134
+ return;
135
+ setDeletingId(media.id);
136
+ try {
137
+ await client.media.delete(activeBucketSlug, media.id);
138
+ setSelectedIds((prev) => {
139
+ const next = new Set(prev);
140
+ next.delete(media.id);
141
+ return next;
142
+ });
143
+ setRefreshKey((k) => k + 1);
144
+ }
145
+ finally {
146
+ setDeletingId(null);
147
+ }
148
+ }, [client, activeBucketSlug]);
149
+ // ── Lightbox (spacebar opens for active selection) ─────────────────────
150
+ const [lightboxIdx, setLightboxIdx] = (0, react_1.useState)(null);
151
+ (0, react_1.useEffect)(() => {
152
+ const onKey = (e) => {
153
+ if (e.code !== "Space")
154
+ return;
155
+ // Input/textarea içinde değilse spacebar lightbox'ı açar.
156
+ const tag = e.target?.tagName?.toLowerCase();
157
+ if (tag === "input" || tag === "textarea" || tag === "select")
158
+ return;
159
+ if (selected.length === 0 || lightboxIdx !== null)
160
+ return;
161
+ e.preventDefault();
162
+ const idx = visibleItems.findIndex((m) => m.id === selected[0].id);
163
+ if (idx >= 0)
164
+ setLightboxIdx(idx);
165
+ };
166
+ document.addEventListener("keydown", onKey);
167
+ return () => document.removeEventListener("keydown", onKey);
168
+ }, [selected, visibleItems, lightboxIdx]);
169
+ // ── Render ─────────────────────────────────────────────────────────────
170
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("flex flex-col gap-3 rounded-xl border bg-background text-foreground", className, cls.root), onDragOver: (e) => {
171
+ e.preventDefault();
172
+ setDragOver(true);
173
+ }, onDragLeave: () => setDragOver(false), onDrop: (e) => {
174
+ e.preventDefault();
175
+ setDragOver(false);
176
+ if (e.dataTransfer.files.length > 0)
177
+ uploadFiles(e.dataTransfer.files);
178
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("flex flex-wrap items-center gap-2 border-b px-3 py-2", cls.toolbar), children: [showBucketSelector && ((0, jsx_runtime_1.jsxs)("select", { value: activeBucketSlug ?? "", onChange: (e) => setActiveBucketSlug(e.target.value || null), disabled: bucketsLoading || buckets.length === 0, className: (0, utils_1.cn)("h-8 rounded-md border bg-transparent px-2 text-xs", cls.bucketSelect), children: [buckets.length === 0 && (0, jsx_runtime_1.jsx)("option", { value: "", children: "No buckets" }), buckets.map((b) => ((0, jsx_runtime_1.jsx)("option", { value: b.slug, children: b.name }, b.id)))] })), (0, jsx_runtime_1.jsx)("input", { type: "search", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search files\u2026", className: (0, utils_1.cn)("h-8 flex-1 rounded-md border bg-transparent px-2 text-xs", cls.searchInput) }), (0, jsx_runtime_1.jsx)("select", { value: kindFilter, onChange: (e) => setKindFilter(e.target.value), className: (0, utils_1.cn)("h-8 rounded-md border bg-transparent px-2 text-xs", cls.filterSelect), children: KIND_FILTERS.map((f) => ((0, jsx_runtime_1.jsx)("option", { value: f.value, children: f.label }, f.value))) }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => fileInputRef.current?.click(), disabled: !activeBucketSlug || uploading, className: (0, utils_1.cn)("h-8 rounded-md border bg-foreground px-3 text-xs font-medium text-background transition-opacity hover:opacity-90 disabled:opacity-50", cls.uploadButton), children: uploading ? "Uploading…" : "Upload" }), (0, jsx_runtime_1.jsx)("input", { ref: fileInputRef, type: "file", multiple: multiple || true, accept: accept, className: "hidden", onChange: (e) => {
179
+ if (e.target.files && e.target.files.length > 0) {
180
+ uploadFiles(e.target.files);
181
+ e.target.value = "";
182
+ }
183
+ } })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex min-h-[280px] flex-1", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex-1 overflow-y-auto p-3", children: [loading && ((0, jsx_runtime_1.jsx)("div", { className: "grid gap-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5", children: Array.from({ length: 8 }).map((_, i) => ((0, jsx_runtime_1.jsx)("div", { className: "h-28 animate-pulse rounded-md bg-muted/50" }, i))) })), error && ((0, jsx_runtime_1.jsx)("div", { className: "rounded-md border border-destructive/30 bg-destructive/5 p-3 text-xs text-destructive", children: error })), !loading && !error && visibleItems.length === 0 && ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("flex h-full flex-col items-center justify-center gap-2 py-8 text-center text-sm text-muted-foreground", cls.empty), children: [(0, jsx_runtime_1.jsx)("span", { children: "No files match." }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => fileInputRef.current?.click(), className: "text-xs underline", children: "Upload one" })] })), !loading && !error && visibleItems.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("grid gap-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5", cls.grid), children: visibleItems.map((media) => {
184
+ const isSel = selectedIds.has(media.id);
185
+ const kind = (0, utils_1.detectKind)(media);
186
+ const thumb = kind === "image" ? media.url || media.downloadUrl : null;
187
+ return ((0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => toggleSelect(media), onDoubleClick: () => {
188
+ const idx = visibleItems.findIndex((m) => m.id === media.id);
189
+ if (idx >= 0) {
190
+ if (!isSel)
191
+ toggleSelect(media);
192
+ setLightboxIdx(idx);
193
+ if (multiple === false && onSelect) {
194
+ onSelect([media]);
195
+ }
196
+ }
197
+ }, className: (0, utils_1.cn)("group flex flex-col overflow-hidden rounded-md border text-start transition-all", isSel
198
+ ? (0, utils_1.cn)("border-foreground/60 ring-2 ring-foreground/30", cls.cardSelected)
199
+ : "border-border hover:border-foreground/30", cls.card), children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("relative aspect-square overflow-hidden bg-muted/40", cls.thumbnail), children: [thumb ? (
200
+ // eslint-disable-next-line @next/next/no-img-element
201
+ (0, jsx_runtime_1.jsx)("img", { src: thumb, alt: media.alt ?? media.fileName, className: "size-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "flex size-full items-center justify-center text-[10px] uppercase text-muted-foreground", children: utils_1.KIND_LABELS[kind] })), isSel && ((0, jsx_runtime_1.jsx)("div", { className: "absolute right-1 top-1 flex size-5 items-center justify-center rounded-full bg-foreground text-background", children: (0, jsx_runtime_1.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", children: (0, jsx_runtime_1.jsx)("path", { d: "M20 6L9 17l-5-5" }) }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("flex flex-col gap-0.5 px-2 py-1.5 text-[11px]", cls.cardMeta), children: [(0, jsx_runtime_1.jsx)("span", { className: "truncate font-medium", children: media.fileName }), (0, jsx_runtime_1.jsx)("span", { className: "text-[10px] text-muted-foreground", children: (0, utils_1.formatBytes)(media.size ?? 0) })] })] }, media.id));
202
+ }) }))] }), showDetailsPane && ((0, jsx_runtime_1.jsx)("aside", { className: (0, utils_1.cn)("hidden w-64 shrink-0 flex-col gap-2 border-s bg-muted/10 p-3 lg:flex", cls.details), children: selected.length === 0 ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-xs text-muted-foreground", children: ["Select a file to see details. Press", " ", (0, jsx_runtime_1.jsx)("kbd", { className: "rounded border bg-muted px-1 text-[10px]", children: "Space" }), " ", "to preview."] })) : selected.length === 1 ? ((() => {
203
+ const m = selected[0];
204
+ const kind = (0, utils_1.detectKind)(m);
205
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "aspect-square overflow-hidden rounded-md bg-muted/30", children: kind === "image" && (m.url || m.downloadUrl) ? (
206
+ // eslint-disable-next-line @next/next/no-img-element
207
+ (0, jsx_runtime_1.jsx)("img", { src: m.url || m.downloadUrl || "", alt: m.alt ?? m.fileName, className: "size-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "flex size-full items-center justify-center text-xs text-muted-foreground", children: utils_1.KIND_LABELS[kind] })) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-0.5", children: [(0, jsx_runtime_1.jsx)("span", { className: "break-all text-xs font-medium", children: m.fileName }), (0, jsx_runtime_1.jsxs)("span", { className: "text-[10px] text-muted-foreground", children: [(0, utils_1.formatBytes)(m.size ?? 0), m.mimeType ? ` · ${m.mimeType}` : ""] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-auto flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
208
+ const idx = visibleItems.findIndex((it) => it.id === m.id);
209
+ if (idx >= 0)
210
+ setLightboxIdx(idx);
211
+ }, className: "flex-1 rounded-md border px-2 py-1 text-[11px] hover:bg-muted/50", children: "Preview" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => handleDelete(m), disabled: deletingId === m.id, className: "flex-1 rounded-md border border-destructive/30 px-2 py-1 text-[11px] text-destructive hover:bg-destructive/10 disabled:opacity-50", children: deletingId === m.id ? "…" : "Delete" })] }), onSelect && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => onSelect(selected), className: "rounded-md bg-foreground px-2 py-1.5 text-[11px] font-medium text-background hover:opacity-90", children: "Use selection" }))] }));
212
+ })()) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-xs font-medium", children: [selected.length, " files selected"] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-[10px] text-muted-foreground", children: ["Total ", (0, utils_1.formatBytes)(selected.reduce((s, m) => s + (m.size ?? 0), 0))] }), onSelect && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => onSelect(selected), className: "mt-auto rounded-md bg-foreground px-2 py-1.5 text-[11px] font-medium text-background hover:opacity-90", children: "Use selection" }))] })) }))] }), dragOver && ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("pointer-events-none absolute inset-0 rounded-xl border-2 border-dashed border-foreground/40 bg-foreground/5", cls.dropZoneOverlay) })), lightboxIdx !== null && visibleItems[lightboxIdx] && ((0, jsx_runtime_1.jsx)(Lightbox_1.Lightbox, { media: visibleItems[lightboxIdx], onClose: () => setLightboxIdx(null), onPrev: lightboxIdx > 0 ? () => setLightboxIdx(lightboxIdx - 1) : undefined, onNext: lightboxIdx < visibleItems.length - 1
213
+ ? () => setLightboxIdx(lightboxIdx + 1)
214
+ : undefined }))] }));
215
+ }
216
+ //# sourceMappingURL=MediaManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaManager.js","sourceRoot":"","sources":["../../src/react/MediaManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { MediaManager, type MediaManagerProps, type MediaManagerClassNames, } from "./MediaManager";
2
+ export { Lightbox, type LightboxProps } from "./lib/Lightbox";
3
+ export { cn, formatBytes, detectKind, KIND_LABELS, type MediaKind, } from "./lib/utils";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EACL,EAAE,EACF,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,SAAS,GACf,MAAM,aAAa,CAAA"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KIND_LABELS = exports.detectKind = exports.formatBytes = exports.cn = exports.Lightbox = exports.MediaManager = void 0;
4
+ var MediaManager_1 = require("./MediaManager");
5
+ Object.defineProperty(exports, "MediaManager", { enumerable: true, get: function () { return MediaManager_1.MediaManager; } });
6
+ var Lightbox_1 = require("./lib/Lightbox");
7
+ Object.defineProperty(exports, "Lightbox", { enumerable: true, get: function () { return Lightbox_1.Lightbox; } });
8
+ var utils_1 = require("./lib/utils");
9
+ Object.defineProperty(exports, "cn", { enumerable: true, get: function () { return utils_1.cn; } });
10
+ Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return utils_1.formatBytes; } });
11
+ Object.defineProperty(exports, "detectKind", { enumerable: true, get: function () { return utils_1.detectKind; } });
12
+ Object.defineProperty(exports, "KIND_LABELS", { enumerable: true, get: function () { return utils_1.KIND_LABELS; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":";;;AAAA,+CAIuB;AAHrB,4GAAA,YAAY,OAAA;AAId,2CAA6D;AAApD,oGAAA,QAAQ,OAAA;AACjB,qCAMoB;AALlB,2FAAA,EAAE,OAAA;AACF,oGAAA,WAAW,OAAA;AACX,mGAAA,UAAU,OAAA;AACV,oGAAA,WAAW,OAAA"}
@@ -0,0 +1,18 @@
1
+ import type { Media } from "../../types";
2
+ /**
3
+ * Sadeleştirilmiş lightbox — tek media item için fullscreen preview.
4
+ * Image/video native render, audio HTML5 player, diğerleri "download"
5
+ * fallback. ESC kapat, ←/→ next/prev (caller index callback'i sağlar).
6
+ *
7
+ * Headless yapı: tüm renderable HTML/inline class'lar default; consumer
8
+ * className override'ı ile değiştirebilir.
9
+ */
10
+ export interface LightboxProps {
11
+ media: Media;
12
+ onClose: () => void;
13
+ onPrev?: () => void;
14
+ onNext?: () => void;
15
+ className?: string;
16
+ }
17
+ export declare function Lightbox({ media, onClose, onPrev, onNext, className, }: LightboxProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=Lightbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lightbox.d.ts","sourceRoot":"","sources":["../../../src/react/lib/Lightbox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGxC;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE,aAAa,2CAuIf"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Lightbox = Lightbox;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const utils_1 = require("./utils");
7
+ function Lightbox({ media, onClose, onPrev, onNext, className, }) {
8
+ (0, react_1.useEffect)(() => {
9
+ const onKey = (e) => {
10
+ if (e.key === "Escape")
11
+ onClose();
12
+ if (e.key === "ArrowLeft" && onPrev)
13
+ onPrev();
14
+ if (e.key === "ArrowRight" && onNext)
15
+ onNext();
16
+ };
17
+ document.addEventListener("keydown", onKey);
18
+ document.body.style.overflow = "hidden";
19
+ return () => {
20
+ document.removeEventListener("keydown", onKey);
21
+ document.body.style.overflow = "";
22
+ };
23
+ }, [onClose, onPrev, onNext]);
24
+ const kind = (0, utils_1.detectKind)(media);
25
+ const url = media.url || media.downloadUrl;
26
+ return ((0, jsx_runtime_1.jsxs)("div", { role: "dialog", "aria-modal": "true", onClick: (e) => {
27
+ if (e.target === e.currentTarget)
28
+ onClose();
29
+ }, className: className ||
30
+ "fixed inset-0 z-50 flex items-center justify-center bg-black/90 p-4 backdrop-blur-sm", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, "aria-label": "Close", className: "absolute right-4 top-4 rounded-full bg-white/10 p-2 text-white transition-colors hover:bg-white/20", children: (0, jsx_runtime_1.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: (0, jsx_runtime_1.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) }) }), onPrev && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: (e) => {
31
+ e.stopPropagation();
32
+ onPrev();
33
+ }, "aria-label": "Previous", className: "absolute left-4 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white transition-colors hover:bg-white/20", children: (0, jsx_runtime_1.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: (0, jsx_runtime_1.jsx)("path", { d: "M15 18l-6-6 6-6" }) }) })), onNext && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: (e) => {
34
+ e.stopPropagation();
35
+ onNext();
36
+ }, "aria-label": "Next", className: "absolute right-4 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white transition-colors hover:bg-white/20", children: (0, jsx_runtime_1.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: (0, jsx_runtime_1.jsx)("path", { d: "M9 6l6 6-6 6" }) }) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex max-h-full max-w-5xl flex-col items-center gap-3", children: [kind === "image" && url && (
37
+ // eslint-disable-next-line @next/next/no-img-element
38
+ (0, jsx_runtime_1.jsx)("img", { src: url, alt: media.alt ?? media.fileName, className: "max-h-[80vh] max-w-full rounded-lg object-contain shadow-2xl" })), kind === "video" && url && ((0, jsx_runtime_1.jsx)("video", { src: url, controls: true, autoPlay: true, className: "max-h-[80vh] max-w-full rounded-lg shadow-2xl" })), kind === "audio" && url && ((0, jsx_runtime_1.jsxs)("div", { className: "flex w-full max-w-md flex-col gap-3 rounded-lg bg-white/10 p-6 text-white", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-center text-sm font-medium", children: media.fileName }), (0, jsx_runtime_1.jsx)("audio", { src: url, controls: true, className: "w-full" })] })), kind !== "image" && kind !== "video" && kind !== "audio" && ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col items-center gap-3 rounded-lg bg-white/10 p-8 text-white", children: [(0, jsx_runtime_1.jsxs)("svg", { width: "48", height: "48", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [(0, jsx_runtime_1.jsx)("path", { d: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" }), (0, jsx_runtime_1.jsx)("path", { d: "M14 2v6h6" })] }), (0, jsx_runtime_1.jsx)("div", { className: "text-sm font-medium", children: media.fileName }), (0, jsx_runtime_1.jsx)("a", { href: url, download: media.fileName, target: "_blank", rel: "noreferrer", className: "rounded-md bg-white px-4 py-2 text-xs font-semibold text-black hover:bg-white/90", children: "Download" })] })), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3 rounded-md bg-black/40 px-3 py-1.5 text-xs text-white/80", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono truncate max-w-xs", children: media.fileName }), (0, jsx_runtime_1.jsx)("span", { children: "\u00B7" }), (0, jsx_runtime_1.jsx)("span", { children: (0, utils_1.formatBytes)(media.size ?? 0) }), media.mimeType && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { children: "\u00B7" }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono opacity-70", children: media.mimeType })] }))] })] })] }));
39
+ }
40
+ //# sourceMappingURL=Lightbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lightbox.js","sourceRoot":"","sources":["../../../src/react/lib/Lightbox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Sentroy } from "../..";
2
+ import type { Media, MediaListResult } from "../../types";
3
+ /**
4
+ * Bir bucket'taki media listesini çeken hook. Search, kind filter ve
5
+ * folder filter local-side; SDK'nın list endpoint'i şimdilik bunları
6
+ * server-side desteklemiyor (genelde 100-200 dosyalık küçük scale,
7
+ * client-side OK). Büyük scale'de paginate + server filter eklenir.
8
+ */
9
+ export declare function useMediaList(args: {
10
+ client: Sentroy;
11
+ bucketSlug: string | null;
12
+ /** Yeniden tetiklenmek için artırılan key. */
13
+ refreshKey?: number;
14
+ }): {
15
+ data: MediaListResult | null;
16
+ items: Media[];
17
+ loading: boolean;
18
+ error: string | null;
19
+ refresh: () => void;
20
+ };
21
+ //# sourceMappingURL=use-media-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-media-list.d.ts","sourceRoot":"","sources":["../../../src/react/lib/use-media-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;;;;;;EAsCA"}