@sentroy-co/client-sdk 2.0.0 → 2.2.0
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.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/react/MediaManager.d.ts +69 -0
- package/dist/react/MediaManager.d.ts.map +1 -0
- package/dist/react/MediaManager.js +216 -0
- package/dist/react/MediaManager.js.map +1 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/lib/Lightbox.d.ts +18 -0
- package/dist/react/lib/Lightbox.d.ts.map +1 -0
- package/dist/react/lib/Lightbox.js +40 -0
- package/dist/react/lib/Lightbox.js.map +1 -0
- package/dist/react/lib/use-media-list.d.ts +21 -0
- package/dist/react/lib/use-media-list.d.ts.map +1 -0
- package/dist/react/lib/use-media-list.js +50 -0
- package/dist/react/lib/use-media-list.js.map +1 -0
- package/dist/react/lib/utils.d.ts +17 -0
- package/dist/react/lib/utils.d.ts.map +1 -0
- package/dist/react/lib/utils.js +62 -0
- package/dist/react/lib/utils.js.map +1 -0
- package/dist/resources/storage.d.ts +23 -0
- package/dist/resources/storage.d.ts.map +1 -0
- package/dist/resources/storage.js +31 -0
- package/dist/resources/storage.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +40 -4
- package/src/http.ts +151 -0
- package/src/index.ts +106 -0
- package/src/react/MediaManager.tsx +628 -0
- package/src/react/index.ts +13 -0
- package/src/react/lib/Lightbox.tsx +162 -0
- package/src/react/lib/use-media-list.ts +54 -0
- package/src/react/lib/utils.ts +73 -0
- package/src/resources/buckets.ts +50 -0
- package/src/resources/domains.ts +16 -0
- package/src/resources/inbox.ts +99 -0
- package/src/resources/mailboxes.ts +11 -0
- package/src/resources/media.ts +115 -0
- package/src/resources/send.ts +11 -0
- package/src/resources/storage.ts +28 -0
- package/src/resources/templates.ts +16 -0
- package/src/types.ts +316 -0
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { Inbox } from "./resources/inbox";
|
|
|
5
5
|
import { Send } from "./resources/send";
|
|
6
6
|
import { Buckets } from "./resources/buckets";
|
|
7
7
|
import { MediaResource } from "./resources/media";
|
|
8
|
+
import { Storage } from "./resources/storage";
|
|
8
9
|
import type { SentroyClientConfig } from "./types";
|
|
9
10
|
export declare class Sentroy {
|
|
10
11
|
readonly domains: Domains;
|
|
@@ -14,6 +15,7 @@ export declare class Sentroy {
|
|
|
14
15
|
readonly send: Send;
|
|
15
16
|
readonly buckets: Buckets;
|
|
16
17
|
readonly media: MediaResource;
|
|
18
|
+
readonly storage: Storage;
|
|
17
19
|
/**
|
|
18
20
|
* Create a new Sentroy client.
|
|
19
21
|
*
|
|
@@ -36,6 +38,6 @@ export declare class Sentroy {
|
|
|
36
38
|
*/
|
|
37
39
|
constructor(config: SentroyClientConfig);
|
|
38
40
|
}
|
|
39
|
-
export type { SentroyClientConfig, ApiResponse, Domain, MailboxUser, Template, LocalizedString, MessageAddress, MessageSummary, MessageDetail, AttachmentInfo, Mailbox, InboxListParams, Attachment, SendParams, SendResult, Bucket, CreateBucketParams, UpdateBucketParams, Media, MediaType, MediaThumbnail, MediaImageMeta, MediaListParams, MediaListResult, UploadMediaParams, } from "./types";
|
|
41
|
+
export type { SentroyClientConfig, ApiResponse, Domain, MailboxUser, Template, LocalizedString, MessageAddress, MessageSummary, MessageDetail, AttachmentInfo, Mailbox, InboxListParams, Attachment, SendParams, SendResult, Bucket, CreateBucketParams, UpdateBucketParams, Media, MediaType, MediaThumbnail, MediaImageMeta, MediaListParams, MediaListResult, UploadMediaParams, StorageQuota, StorageUsage, StorageUsageBucket, StorageUsageByType, } from "./types";
|
|
40
42
|
export { SentroyError } from "./http";
|
|
41
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,qBAAa,OAAO;IAClB,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,KAAK,EAAE,KAAK,CAAA;IAC5B,SAAgB,IAAI,EAAE,IAAI,CAAA;IAC1B,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,KAAK,EAAE,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,qBAAa,OAAO;IAClB,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,KAAK,EAAE,KAAK,CAAA;IAC5B,SAAgB,IAAI,EAAE,IAAI,CAAA;IAC1B,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,KAAK,EAAE,aAAa,CAAA;IACpC,SAAgB,OAAO,EAAE,OAAO,CAAA;IAEhC;;;;;;;;;;;;;;;;;;;OAmBG;gBACS,MAAM,EAAE,mBAAmB;CA6BxC;AAGD,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,OAAO,EACP,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,MAAM,EACN,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ const inbox_1 = require("./resources/inbox");
|
|
|
9
9
|
const send_1 = require("./resources/send");
|
|
10
10
|
const buckets_1 = require("./resources/buckets");
|
|
11
11
|
const media_1 = require("./resources/media");
|
|
12
|
+
const storage_1 = require("./resources/storage");
|
|
12
13
|
class Sentroy {
|
|
13
14
|
domains;
|
|
14
15
|
mailboxes;
|
|
@@ -17,6 +18,7 @@ class Sentroy {
|
|
|
17
18
|
send;
|
|
18
19
|
buckets;
|
|
19
20
|
media;
|
|
21
|
+
storage;
|
|
20
22
|
/**
|
|
21
23
|
* Create a new Sentroy client.
|
|
22
24
|
*
|
|
@@ -53,6 +55,7 @@ class Sentroy {
|
|
|
53
55
|
this.send = new send_1.Send(mailHttp);
|
|
54
56
|
this.buckets = new buckets_1.Buckets(storageHttp);
|
|
55
57
|
this.media = new media_1.MediaResource(storageHttp);
|
|
58
|
+
this.storage = new storage_1.Storage(storageHttp);
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
exports.Sentroy = Sentroy;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AACnC,iDAA6C;AAC7C,qDAAiD;AACjD,qDAAiD;AACjD,6CAAyC;AACzC,2CAAuC;AACvC,iDAA6C;AAC7C,6CAAiD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AACnC,iDAA6C;AAC7C,qDAAiD;AACjD,qDAAiD;AACjD,6CAAyC;AACzC,2CAAuC;AACvC,iDAA6C;AAC7C,6CAAiD;AACjD,iDAA6C;AAG7C,MAAa,OAAO;IACF,OAAO,CAAS;IAChB,SAAS,CAAW;IACpB,SAAS,CAAW;IACpB,KAAK,CAAO;IACZ,IAAI,CAAM;IACV,OAAO,CAAS;IAChB,KAAK,CAAe;IACpB,OAAO,CAAS;IAEhC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,MAA2B;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAEnD,mEAAmE;QACnE,kEAAkE;QAClE,mBAAmB;QACnB,MAAM,QAAQ,GAAG,IAAI,iBAAU,CAC7B,GAAG,IAAI,uBAAuB,IAAI,EAAE,EACpC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,CACf,CAAA;QAED,8DAA8D;QAC9D,MAAM,WAAW,GAAG,IAAI,iBAAU,CAChC,GAAG,IAAI,0BAA0B,IAAI,EAAE,EACvC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,CACf,CAAA;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,QAAQ,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAa,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;CACF;AA3DD,0BA2DC;AAmCD,+BAAqC;AAA5B,oGAAA,YAAY,OAAA"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useMediaList = useMediaList;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
/**
|
|
6
|
+
* Bir bucket'taki media listesini çeken hook. Search, kind filter ve
|
|
7
|
+
* folder filter local-side; SDK'nın list endpoint'i şimdilik bunları
|
|
8
|
+
* server-side desteklemiyor (genelde 100-200 dosyalık küçük scale,
|
|
9
|
+
* client-side OK). Büyük scale'de paginate + server filter eklenir.
|
|
10
|
+
*/
|
|
11
|
+
function useMediaList(args) {
|
|
12
|
+
const { client, bucketSlug, refreshKey = 0 } = args;
|
|
13
|
+
const [data, setData] = (0, react_1.useState)(null);
|
|
14
|
+
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
15
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
16
|
+
(0, react_1.useEffect)(() => {
|
|
17
|
+
if (!bucketSlug) {
|
|
18
|
+
setData(null);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let cancelled = false;
|
|
22
|
+
setLoading(true);
|
|
23
|
+
setError(null);
|
|
24
|
+
client.media
|
|
25
|
+
.list(bucketSlug, { limit: 200 })
|
|
26
|
+
.then((res) => {
|
|
27
|
+
if (cancelled)
|
|
28
|
+
return;
|
|
29
|
+
setData(res);
|
|
30
|
+
})
|
|
31
|
+
.catch((err) => {
|
|
32
|
+
if (cancelled)
|
|
33
|
+
return;
|
|
34
|
+
setError(err instanceof Error ? err.message : "Failed to load media");
|
|
35
|
+
})
|
|
36
|
+
.finally(() => {
|
|
37
|
+
if (!cancelled)
|
|
38
|
+
setLoading(false);
|
|
39
|
+
});
|
|
40
|
+
return () => {
|
|
41
|
+
cancelled = true;
|
|
42
|
+
};
|
|
43
|
+
}, [client, bucketSlug, refreshKey]);
|
|
44
|
+
const refresh = (0, react_1.useCallback)(() => {
|
|
45
|
+
// Caller kendi refreshKey'ini bump'lar; bu sadece convenience.
|
|
46
|
+
setData((d) => d);
|
|
47
|
+
}, []);
|
|
48
|
+
return { data, items: data?.items ?? [], loading, error, refresh };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=use-media-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-media-list.js","sourceRoot":"","sources":["../../../src/react/lib/use-media-list.ts"],"names":[],"mappings":";;AAUA,oCA2CC;AArDD,iCAAwD;AAIxD;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,IAK5B;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,IAAI,CAAA;IACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAyB,IAAI,CAAC,CAAA;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAA;IAEvD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,OAAM;QACR,CAAC;QACD,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,CAAC,KAAK;aACT,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;aAChC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,SAAS;gBAAE,OAAM;YACrB,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,SAAS;gBAAE,OAAM;YACrB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAA;QACvE,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;IAEpC,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC/B,+DAA+D;QAC/D,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAK,EAAc,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACjF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal class name combiner — clsx + twMerge gibi davranır ama
|
|
3
|
+
* dependency yok. Falsy filtrele, dedup yapma. Tema override'larında
|
|
4
|
+
* Tailwind utility çakışmaları için consumer kendi cn'ini kullanırsa
|
|
5
|
+
* `className` prop'u son geldiği için doğal şekilde kazanır.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cn(...args: Array<string | undefined | null | false | 0>): string;
|
|
8
|
+
export declare function formatBytes(bytes: number, decimals?: number): string;
|
|
9
|
+
/** İlk image-like extension veya MIME → "image", "video", "audio", "pdf",
|
|
10
|
+
* "doc" (word/excel/ppt), "archive", "code", "other". */
|
|
11
|
+
export declare function detectKind(file: {
|
|
12
|
+
mimeType?: string | null;
|
|
13
|
+
fileName?: string;
|
|
14
|
+
}): MediaKind;
|
|
15
|
+
export type MediaKind = "image" | "video" | "audio" | "pdf" | "doc" | "archive" | "code" | "other";
|
|
16
|
+
export declare const KIND_LABELS: Record<MediaKind, string>;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/react/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,EAAE,CAChB,GAAG,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,GACpD,MAAM,CAER;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAU/D;AAED;0DAC0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,SAAS,CAsBZ;AAED,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,OAAO,GACP,OAAO,GACP,KAAK,GACL,KAAK,GACL,SAAS,GACT,MAAM,GACN,OAAO,CAAA;AAEX,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CASjD,CAAA"}
|