PageSourceSearch

https://clozure.net/assets/SocialMediaMediaLibrary-BmmQi4q0.js

js clozure.net collected 2026-09-24 14:26:15 UTC 8,821 bytes, 1 lines download raw bytes

1import{p as _,r as d,j as e,L as X}from"./react-vendor-Ca39dfnS.js";import{a as Y,u as g}from"./query-vendor-CZuItqE6.js";import{u as Z,A as ee,q as se,K as ae,B as n,f as te,g as ie,h as F,i as G,D as L,y as k,z as M,E as V,G as q,L as p,I as re,T as z,R as $,U as B,V as R,W as K,X as m,v,w as f,a5 as ne,C as le,a as de,b as oe,e as ce,c as me,d as ue}from"./main-BAUbw78W.js";import{aE as pe,bD as he,S as xe,aV as je,bE as ge,aJ as ve,aG as fe,h as ye}from"./ui-vendor-BsCBchWs.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./chart-vendor-DTBERZQl.js";function be(y){return new Promise((t,i)=>{const c=new FileReader;c.onerror=()=>i(new Error("Failed to read file")),c.onload=()=>{const l=c.result;if(typeof l!="string")return i(new Error("Unexpected file reader result"));const o="base64,",u=l.indexOf(o);if(u===-1)return i(new Error("Invalid data URL"));t(l.slice(u+o.length))},c.readAsDataURL(y)})}function Ee(){const t=_().businessId,{toast:i}=Z(),[c,l]=d.useState(!1),[o,u]=d.useState(null),[b,N]=d.useState(""),[J,h]=d.useState(!1),[x,w]=d.useState("pollinations"),[C,S]=d.useState(""),[P,D]=d.useState("1024x1024"),{data:E=[],isLoading:Q}=Y({queryKey:["/api/businesses",t,"social-media","assets"],enabled:!!t}),j=d.useMemo(()=>{const s=[],a=[];for(const r of E||[])String(r.contentType||"").toLowerCase().startsWith("video/")?a.push(r):s.push(r);return{imgs:s,vids:a}},[E]),T=g({mutationFn:async s=>await f(`/api/businesses/${t}/social-media/assets`,{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/businesses",t,"social-media","assets"]}),i({title:"Uploaded",description:"Media asset saved to library"}),l(!1),u(null),N("")},onError:s=>{i({title:"Error",description:s.message||"Failed to upload asset",variant:"destructive"})}}),A=g({mutationFn:async s=>await f(`/api/businesses/${t}/social-media/assets/generate`,{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/businesses",t,"social-media","assets"]}),i({title:"Generated",description:"Image saved to media library"}),h(!1),S(""),w("pollinations"),D("1024x1024")},onError:s=>{i({title:"Error",description:s.message||"Failed to generate image",variant:"destructive"})}}),I=g({mutationFn:async s=>await f(`/api/businesses/${t}/social-media/assets/${s}`,{method:"DELETE"}),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/businesses",t,"social-media","assets"]}),i({title:"Deleted",description:"Asset removed"})},onError:s=>{i({title:"Error",description:s.message||"Failed to delete asset",variant:"destructive"})}}),H=async()=>{if(t){if(!o){i({title:"Error",description:"Please choose a file",variant:"destructive"});return}try{const s=await be(o);await T.mutateAsync({contentType:o.type||"application/octet-stream",filename:o.name,dataBase64:s,prompt:b||null})}catch(s){i({title:"Error",description:s?.message||"Upload failed",variant:"destructive"})}}},W=async()=>{if(!t)return;const s=C.trim();if(!s){i({title:"Error",description:"Prompt is required",variant:"destructive"});return}await A.mutateAsync({provider:x,prompt:s,...x==="openai"?{openaiSize:P}:{}})};if(!t)return e.jsx("div",{className:"p-6",children:e.jsxs(ee,{"data-testid":"alert-error",children:[e.jsx(pe,{className:"h-4 w-4"}),e.jsx(se,{children:"Business ID is required"})]})});const O=s=>Q?e.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[...Array(6)].map((a,r)=>e.jsx(ne,{className:"h-56 w-full"},r))}):!s||s.length===0?e.jsx("div",{className:"text-sm text-muted-foreground",children:"No assets yet."}):e.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:s.map(a=>{const r=`/api/social-media/assets/${a.id}`,U=String(a.contentType||"").toLowerCase().startsWith("video/");return e.jsxs(le,{className:"overflow-hidden","data-testid":`card-asset-${a.id}`,children:[e.jsxs(de,{className:"pb-3",children:[e.jsxs(oe,{className:"text-sm flex items-center justify-between gap-2",children:[e.jsx("span",{className:"truncate",children:a.filename||a.id}),e.jsx(ce,{variant:"secondary",children:U?"video":"image"})]}),e.jsx(me,{className:"text-xs truncate",children:a.contentType})]}),e.jsxs(ue,{className:"space-y-3",children:[e.jsx("div",{className:"border rounded-md overflow-hidden bg-muted",children:U?e.jsx("video",{controls:!0,className:"w-full h-40 object-cover",src:r}):e.jsx("img",{className:"w-full h-40 object-cover",src:r,alt:a.filename||a.id})}),a.prompt?e.jsx("div",{className:"text-xs text-muted-foreground line-clamp-2",children:a.prompt}):null,e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx(n,{asChild:!0,variant:"outline",size:"sm",children:e.jsxs("a",{href:r,target:"_blank",rel:"noreferrer",children:[e.jsx(fe,{className:"mr-2 h-4 w-4"}),"Open"]})}),e.jsxs(n,{variant:"destructive",size:"sm",onClick:()=>I.mutate(a.id),disabled:I.isPending,"data-testid":`button-delete-asset-${a.id}`,children:[e.jsx(ye,{className:"mr-2 h-4 w-4"}),"Delete"]})]})]})]},a.id)})});return e.jsx("div",{className:"flex-1 overflow-auto p-6","data-testid":"page-social-media-media-library",children:e.jsxs("div",{className:"max-w-7xl mx-auto 
1space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsx("div",{children:e.jsx(ae,{department:"COMMUNICATIONS_PR",title:"Media Library",subtitle:"Store and reuse images/videos across social posts",compact:!0})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(n,{asChild:!0,variant:"outline",children:e.jsxs(X,{href:`/business/${t}/social-media/dashboard`,children:[e.jsx(he,{className:"mr-2 h-4 w-4"}),"Dashboard"]})}),e.jsxs(n,{onClick:()=>h(!0),variant:"outline","data-testid":"button-generate",children:[e.jsx(xe,{className:"mr-2 h-4 w-4"}),"Generate"]}),e.jsxs(n,{onClick:()=>l(!0),"data-testid":"button-upload",children:[e.jsx(je,{className:"mr-2 h-4 w-4"}),"Upload"]})]})]}),e.jsxs(te,{defaultValue:"images",className:"space-y-4",children:[e.jsxs(ie,{children:[e.jsxs(F,{value:"images",className:"gap-2","data-testid":"tab-images",children:[e.jsx(ge,{className:"h-4 w-4"}),"Images (",j.imgs.length,")"]}),e.jsxs(F,{value:"videos",className:"gap-2","data-testid":"tab-videos",children:[e.jsx(ve,{className:"h-4 w-4"}),"Videos (",j.vids.length,")"]})]}),e.jsx(G,{value:"images",className:"space-y-4",children:O(j.imgs)}),e.jsx(G,{value:"videos",className:"space-y-4",children:O(j.vids)})]}),e.jsx(L,{open:c,onOpenChange:l,children:e.jsxs(k,{className:"max-w-lg",children:[e.jsxs(M,{children:[e.jsx(V,{children:"Upload media"}),e.jsx(q,{children:"Upload an image or video to use in social posts"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"file",children:"File"}),e.jsx(re,{id:"file",type:"file",accept:"image/*,video/*",onChange:s=>u(s.target.files?.[0]||null)})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"prompt",children:"Prompt / Notes (optional)"}),e.jsx(z,{id:"prompt",value:b,onChange:s=>N(s.target.value),placeholder:"Describe what this asset is for..."})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(n,{variant:"outline",onClick:()=>l(!1),children:"Cancel"}),e.jsx(n,{onClick:H,disabled:T.isPending,"data-testid":"button-confirm-upload",children:"Upload"})]})]})]})}),e.jsx(L,{open:J,onOpenChange:h,children:e.jsxs(k,{className:"max-w-lg",children:[e.jsxs(M,{children:[e.jsx(V,{children:"Generate image"}),e.jsx(q,{children:"Generate a new image with Pollinations (free, no API key), OpenAI, or Google and save it to your library"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:"Provider"}),e.jsxs($,{value:x,onValueChange:s=>w(s),children:[e.jsx(B,{children:e.jsx(R,{placeholder:"Select provider"})}),e.jsxs(K,{children:[e.jsx(m,{value:"pollinations",children:"Pollinations (Free)"}),e.jsx(m,{value:"openai",children:"OpenAI"}),e.jsx(m,{value:"google",children:"Google (Nano Banana)"})]})]})]}),x==="openai"?e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:"Size"}),e.jsxs($,{value:P,onValueChange:s=>D(s),children:[e.jsx(B,{children:e.jsx(R,{placeholder:"Size"})}),e.jsxs(K,{children:[e.jsx(m,{value:"256x256",children:"256x256"}),e.jsx(m,{value:"512x512",children:"512x512"}),e.jsx(m,{value:"1024x1024",children:"1024x1024"})]})]})]}):null,e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:"Prompt"}),e.jsx(z,{value:C,onChange:s=>S(s.target.value),placeholder:"Describe the image you want to generate...",rows:5})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(n,{variant:"outline",onClick:()=>h(!1),children:"Cancel"}),e.jsx(n,{onClick:W,disabled:A.isPending,"data-testid":"button-confirm-generate",children:"Generate"})]})]})]})})]})})}export{Ee as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.