1import{_ as F}from"./UiCheckbox-GWATp8YO.js";import{_ as U,d as c,e as o,k as d,h as K,o as a,b as u,p as x,F as D,t as w,w as h,B,i as V,l as O,y as Q,f as G,z as J,c as p,r as L,G as W,m as X,s as Y,a as Z,n as $}from"./app-ziVVN7Ui.js";import{b as H,_ as M,a as ee}from"./NotificationsDialog-B-HySxra.js";import{_ as te}from"./UiLoadingArea-ChMFTNhz.js";import{_ as ne}from"./UiHeader-DjeFbFcA.js";import{t as se}from"./plans-5Z0CL0ZH.js";import{c as ie}from"./infiniteScroll-CPdT8YSK.js";import"./PhoneCountryInput-DwytQcYu.js";import"./UiInput-TqYDLgrn.js";import"./UiSeparatorGroup-iBxe6IAG.js";import"./useStripeAppearance-Cu4stl4q.js";import"./useStripePayment-qrcf4evR.js";import"./color-thief-CsnTZYaX.js";import"./UiRadio-xvaEvAUk.js";import"./UiStep-DHVKADiV.js";import"./UiGiftCard-Byfuvn2u.js";import"./UiTabs-C3i0ymqQ.js";const oe={props:{image:String,badge:String}},le={class:"relative flex w-fit"},ae={key:0,class:"absolute -bottom-1 right-0 outline outline-3 rounded-full outline-white"};function re(e,t,i,r,n,s){const g=K;return a(),c("div",le,[o(g,{class:"size-10",image:i.image},null,8,["image"]),i.badge?(a(),c("div",ae,[o(g,{class:"size-4",image:i.badge},null,8,["image"])])):d("",!0)])}const E=U(oe,[["render",re]]);function ue(e){const t=(e||"").replace(/<\/p>\s*<p>/g,` 2`).replace(/<[^>]*>/g,""),i=document.createElement("textarea");return i.innerHTML=t,i.value.trim()}function S(e){return/\S/.test((e||"").replace(/<[^>]*>/g,"").replace(/ /g," "))}const k="â¤ï¸",I=new Set;function P(e){return(e.reactions||[]).find(t=>t.emoji===k)}function ce(e,t,i){return i?t.count>1?e.map(r=>r===t?{...r,count:r.count-1,reacted_by_me:!1}:r):e.filter(r=>r!==t):t?e.map(r=>r===t?{...r,count:r.count+1,reacted_by_me:!0}:r):[...e,{emoji:k,count:1,reacted_by_me:!0}]}function de(e,t){if(I.has(e))return{reactions:t,settled:Promise.resolve(t)};const i=t||[],r=i.find(_=>_.emoji===k),n=!!r?.reacted_by_me,s=ce(i,r,n);I.add(e);const g=`/api/announcements/${e}/reactions`,f=(n?axios.delete(`${g}/${encodeURIComponent(k)}`):axios.post(g,{emoji:k})).then(()=>s).catch(()=>i).finally(()=>I.delete(e));return{reactions:s,settled:f}}const me={components:{AnnouncementAvatar:E},props:{announcement:{type:Object,required:!0},businessAvatar:String,showBusiness:Boolean,showThread:{type:Boolean,default:!0},editInDialog:{type:Boolean,default:!1},canOpenClient:{type:Boolean,default:!1}},emits:["open-thread","edit","delete","open-client","toggle-like","updated"],data(){return{editing:!1,editComposer:"",saving:!1,menuOpen:!1}},computed:{businessName(){return this.showBusiness?this.announcement.business?.name:null},showThreadButton(){return this.showThread&&!this.announcement.parent_id},authorClickable(){return this.canOpenClient&&!this.announcement.author.is_staff&&!!this.announcement.author.id},liked(){return!!P(this.announcement)?.reacted_by_me},likeCount(){return P(this.announcement)?.count||0},editHasText(){return S(this.editComposer)},actions(){const e=[];return this.announcement.can_edit&&e.push({title:"Edit",selectable:!1,click:this.startEdit}),e.push({title:"Copy message",selectable:!1,click:this.copy}),this.announcement.can_delete&&(e.push({type:"separator"}),e.push({title:"Delete message",selectable:!1,click:()=>this.$emit("delete")})),e}},methods:{onAuthorClick(e){this.authorClickable&&(e.stopPropagation(),this.$emit("open-client",this.announcement.author))},onClick(e){!this.showThreadButton||this.editing||e.target.closest("button, a, [contenteditable]")||window.getSelection()?.toString()||this.$emit("open-thread")},startEdit(){if(this.editInDialog){this.$emit("edit");return}this.editComposer=this.announcement.body,this.editing=!0},cancelEdit(){this.editing=!1,this.editComposer=""},saveEdit(){!this.editHasText||this.saving||(this.saving=!0,axios.put(`/api/announcements/${this.announcement.id}`,{body:this.editComposer}).then(({data:e})=>{this.$emit("updated",e.data.body),this.cancelEdit()}).finally(()=>{this.saving=!1}))},copy(){navigator.clipboard.writeText(ue(this.announcement.body)),window.toast({title:"Copied",description:"Message copied to clipboard."})}}},he={class:"flex items-start gap-4"},pe={class:"flex-1 min-w-0"},ge={class:"flex items-center gap-2"},fe={class:"text-sm text-neutral-900/50 truncate"},_e={class:"text-sm text-neutral-900/50 shrink-0"},ye={key:0,class:"flex flex-col gap-2 mt-2"},be={class:"flex justify-end gap-2"},ve=["innerHTML"],xe={key:0,class:"pl-[44px] mt-2 flex items-center gap-1 -mb-1"},ke={key:0,class:"text-sm font-medium"},Ae={key:0,class:"text-sm font-medium"};function Ce(e,t,i,r,n,s){const g=E,A=V,f=J,_=H,y=O,v=Q,C=G;return a(),c("div",{class:x(["group py-5 lg:py-7 relative",{"cursor-pointer":s.showThreadButton&&!n.editing}]),onClick:t[4]||(t[4]=(...m)=>s.onClick&&s.onClick(...m))},[u("div",he,[o(g,{image:i.announcement.author.is_staff?i.businessAvatar:i.announcement.author.avatar,badge:i.announcement.author.is_staff?i.announcement.author.avatar:null,class:x({"cursor-pointer":s.authorClickable}),onClick:s.onAuthorClick},null,8,["image","badge","class","onClick"]),u("div",pe,[u("div",ge,[o(A,{title:i.announcement.author.name,class:x({"cursor-pointer hover:underline underline-offset-2":s.authorClickable}),onClick:s.onAuthorClick},null,8,["title","class","onClick"]),s.businessName?(a(),c(D,{key:0},[o(f),u("span",fe,w(s.businessName),1)],64)):d("",!0),o(f),u("span",_e,w(i.announcement.created_at_human),1)]),n.editing?(a(),c("div",ye,[o(_,{modelValue:n.editComposer,"onUpdate:modelValue":t[0]||(t[0]=m=>n.editComposer=m),variant:"inline",autofocus:!0},null,8,["modelValue"]),u("div",be,[o(y,{title:"Cancel",size:"s",theme:"secondary",onClick:s.cancelEdit},null,8,["onClick"]),o(y,{title:"Save",size:"s",loading:n.saving,disabled:!s.editHasText,onClick:s.saveEdit},null,8,["loading","disabled","onClick"])])])):(a(),c("div",{key:1,class:"text-sm mt-2 break-words tiptap !gap-2 max-w-screen-lg",innerHTML:i.announcement.body},null,8,ve))]),n.editing?d("",!0):(a(),c("div",{key:0,class:x(["lg:opacity-0 lg:group-hover:opacity-100 absolute right-0 top-2",{"!opacity-100":n.menuOpen}])},[o(v,{options:s.actions,"select-class":"!w-44 !mt-1",onOpened:t[1]||(t[1]=m=>n.menuOpen=m)},{toggle:h(()=>[o(y,{icon:"more",theme:"ghost",size:"s"})]),_:1},8,["options"])],2))]),i.announcement.parent_id?d("",!0):(a(),c("div",xe,[u("div",{onClick:t[2]||(t[2]=B(m=>e.$emit("toggle-like"),["stop"])),class:x(["flex items-center gap-1 py-1 px-2 hover:bg-neutral-900/5 rounded-full cursor-pointer h-7",s.liked?"text-red-500 hover:bg-red-500/10":"text-neutral-900/50 hover:text-neutral-900/80"])},[o(C,{name:s.liked?"heart":"heart-3",size:"18"},null,8,["name"]),s.likeCount?(a(),c("span",ke,w(s.likeCount),1)):d("",!0)],2),u("div",{onClick:t[3]||(t[3]=B(m=>e.$emit("open-thread"),["stop"])),class:"flex items-center gap-1 py-1 px-2 hover:bg-neutral-900/5 text-neutral-900/50 hover:text-neutral-900/80 rounded-full cursor-pointer h-7"},[o(C,{name:"chat-3-line",size:"18"}),i.announcement.replies_count?(a(),c("span",Ae,w(i.announcement.replies_count),1)):d("",!0)])]))],2)}const z=U(me,[["render",Ce]]),Te={components:{AnnouncementAvatar:E,AnnouncementItem:z,ClientDialog:M},props:{auth:{type:Object,required:!0},currentPlanLookupKey:{type:String,default:null}},data(){return{loaded:!1,isIosApp:W(),upgradeDialog:!1,announcements:[],permissions:{is_staff:!1,can_post:!1}
2,nextPageUrl:null,loadingMore:!1,composer:"",composerDialog:!1,editingAnnouncement:null,posting:!1,notifyEmail:!1,announcementToDelete:null,deletingAnnouncement:!1,threadDialog:!1,threadAnnouncement:null,threadReplies:[],threadLoading:!1,replyComposer:"",replyPosting:!1,selectedClient:null}},computed:{emailNotificationsAvailable(){return["pro","business"].includes(se(this.currentPlanLookupKey))},businessAvatar(){return this.auth?.business?.avatar||null},viewerAvatar(){return this.permissions.is_staff?this.businessAvatar:this.auth.user?.avatar},viewerBadge(){return this.permissions.is_staff?this.auth.user?.avatar:null},composerHasText(){return S(this.composer)},replyHasText(){return S(this.replyComposer)},emptySubtitle(){return this.permissions.can_post?"Post the first announcement to your clients.":this.businessId?"Announcements from this business will appear here.":"Announcements from the businesses you book with will appear here."},businessId(){return this.auth?.business?.id||null}},created(){this.infiniteScroll=ie(()=>this.$refs.scrollTrigger,()=>this.loadMore())},mounted(){this.loadFeed()},beforeUnmount(){this.infiniteScroll.destroy()},watch:{"$route.query.thread":{immediate:!0,handler(e){const t=e?Number(e):null;if(!t){this.threadDialog&&this.closeThread();return}this.threadAnnouncement?.id!==t&&this.openThreadFromNotification(t)}}},methods:{avatarFor(e){return e?.business?.avatar||this.businessAvatar},onNotifyEmail(e){this.emailNotificationsAvailable?this.notifyEmail=e:this.upgradeDialog=!0},loadFeed(){const e=this.businessId?`/api/businesses/${this.businessId}/announcements`:"/api/announcements";axios.get(e).then(({data:t})=>{this.announcements=t.data,this.permissions=t.meta.permissions,this.nextPageUrl=t.links?.next||null}).finally(()=>{this.loaded=!0,this.$nextTick(()=>this.infiniteScroll.setup())})},loadMore(){!this.nextPageUrl||this.loadingMore||(this.loadingMore=!0,axios.get(this.nextPageUrl).then(({data:e})=>{const t=new Set(this.announcements.map(i=>i.id));this.announcements=[...this.announcements,...e.data.filter(i=>!t.has(i.id))],this.nextPageUrl=e.links?.next||null,this.$nextTick(()=>this.infiniteScroll.setup())}).finally(()=>{this.loadingMore=!1}))},openComposer(){this.editingAnnouncement&&(this.editingAnnouncement=null,this.composer=""),this.notifyEmail=!1,this.composerDialog=!0},editAnnouncement(e){this.editingAnnouncement=e,this.composer=e.body,this.composerDialog=!0},postAnnouncement(){if(!this.composerHasText||this.posting)return;const e=this.editingAnnouncement;this.posting=!0,(e?axios.put(`/api/announcements/${e.id}`,{body:this.composer}):axios.post(`/api/businesses/${this.businessId}/announcements`,{body:this.composer,notify_clients:this.notifyEmail&&this.emailNotificationsAvailable})).then(({data:i})=>{e?(e.body=i.data.body,this.editingAnnouncement=null):(this.announcements=[i.data,...this.announcements],this.notifyEmail=!1),this.composer="",this.composerDialog=!1}).finally(()=>{this.posting=!1})},openThread(e){this.threadAnnouncement=e,this.threadReplies=[],this.threadLoading=!0,this.threadDialog=!0,this.setThreadQuery(e.id),axios.get(`/api/announcements/${e.id}`).then(({data:t})=>{this.threadReplies=t.data.replies||[]}).finally(()=>{this.threadLoading=!1})},openThreadFromNotification(e){const t=this.announcements.find(i=>i.id===e);if(t){this.openThread(t);return}this.threadAnnouncement=null,this.threadReplies=[],this.threadLoading=!0,this.threadDialog=!0,this.setThreadQuery(e),axios.get(`/api/announcements/${e}`).then(({data:i})=>{this.threadAnnouncement=i.data,this.threadReplies=i.data.replies||[]}).catch(()=>{this.closeThread()}).finally(()=>{this.threadLoading=!1})},closeThread(){this.threadDialog=!1,this.threadAnnouncement=null,this.threadReplies=[],this.replyComposer="",this.setThreadQuery(null)},setThreadQuery(e){(this.$route.query.thread??null)!=e&&this.$router.replace({query:{...this.$route.query,thread:e??void 0}})},openClient(e){axios.get(`/api/clients/${e.id}`).then(({data:t})=>{this.selectedClient=t.data})},postReply(){if(!this.threadAnnouncement||!this.replyHasText||this.replyPosting)return;this.replyPosting=!0;const e=this.threadAnnouncement.business?.id||this.businessId;axios.post(`/api/businesses/${e}/announcements`,{body:this.replyComposer,parent_id:this.threadAnnouncement.id}).then(({data:t})=>{this.threadReplies.push(t.data),this.replyComposer="",this.threadAnnouncement.replies_count+=1}).finally(()=>{this.replyPosting=!1})},toggleReaction(e){const{reactions:t,settled:i}=de(e.id,e.reactions);e.reactions=t,i.then(r=>{e.reactions=r})},deleteAnnouncement(e){this.announcementToDelete=e},confirmDeleteAnnouncement(){const e=this.announcementToDelete;this.deletingAnnouncement=!0,axios.delete(`/api/announcements/${e.id}`).then(()=>{e.parent_id?(this.threadReplies=this.threadReplies.filter(t=>t.id!==e.id),this.threadAnnouncement&&(this.threadAnnouncement.replies_count-=1)):(this.announcements=this.announcements.filter(t=>t.id!==e.id),this.threadAnnouncement?.id===e.id&&this.closeThread()),this.announcementToDelete=null}).finally(()=>{this.deletingAnnouncement=!1})}}},we={class:"flex flex-col"},De={class:"flex flex-col pb-6 divide-y divide-neutral-900/5"},Ee={ref:"scrollTrigger",class:"h-2 w-full"},Ie={key:1,class:"flex flex-col flex-1 min-h-0 -mt-6 lg:-mt-8"},Se={class:"flex-1 min-h-0 overflow-y-auto flex flex-col"},Ue={class:"divide-y divide-neutral-900/5"},Ne={class:"shrink-0 flex gap-4 items-start pt-2"},Re={class:"flex-1 flex justify-end translate-y-1 -mr-1"},Be={class:"flex flex-col -mt-14"},Le={class:"flex items-start gap-4"},Pe={class:"w-full flex flex-col gap-2"},Ve={class:"flex items-center justify-end gap-4"},Oe={key:0},He={key:1};function Me(e,t,i,r,n,s){const g=ee,A=ne,f=te,_=E,y=X,v=z,C=Z,m=O,N=H,T=Y,j=M,R=V,q=F;return a(),c("div",we,[o(A,{title:"Announcements"},{actions:h(()=>[o(g)]),_:1}),n.loaded?d("",!0):(a(),p(f,{key:0,class:"flex-1"})),n.loaded?(a(),c(D,{key:1},[n.permissions.can_post?(a(),c("div",{key:0,class:"border-b py-6 border-neutral-900/10 flex items-center gap-4 text-neutral-900/60 hover:text-neutral-900 cursor-text mb-3",onClick:t[0]||(t[0]=(...l)=>s.openComposer&&s.openComposer(...l))},[o(_,{image:s.viewerAvatar,badge:s.viewerBadge},null,8,["image","badge"]),t[11]||(t[11]=u("span",{class:"text-sm font-medium"},"Share something with your clients...",-1))])):d("",!0),n.announcements.length===0?(a(),p(y,{key:1,icon:"3d-message",title:"No announcements yet",class:"flex-1",subtitle:s.emptySubtitle},null,8,["subtitle"])):d("",!0),u("div",De,[(a(!0),c(D,null,L(n.announcements,l=>(a(),p(v,{key:l.id,announcement:l,"business-avatar":s.avatarFor(l),"show-business":!s.businessId,"edit-in-dialog":!0,onOpenThread:b=>s.openThread(l),onEdit:b=>s.editAnnouncement(l),onDelete:b=>s.deleteAnnouncement(l),onToggleLike:b=>s.toggleReaction(l)},null,8,["announcement","business-avatar","show-business","onOpenThread","onEdit","onDelete","onToggleLike"]))),128))]),u("div",Ee,null,512),n.loadingMore?(a(),p(f,{key:2,class:"py-2"})):d("",!0)],64)):d("",!0),o(T,{open:n.threadDialog,title:"Replies",position:"right","close-button":!0,"dismiss-button":!1,"full-height":!0,"onUpdate:open":s.closeThread},{default:h(()=>[n.threadAnnouncement?(a(),c("div",Ie,[u("div",Se,[o(v,{announcement:n.threadAnnouncement,"business-avatar":s.avatarFor(n.threadAnnouncement),"show-business":!s.businessId,"show-thread":!1,"edit-in-dialog":!0,onEdit:t[1]||(t[1]=l=>s.editAnnouncement(n.threadAnnouncement)),onDelete:t[2]||(t[2]=l=>s.deleteAnnouncement(n.threadAnnouncement)),onToggleLike:t[3]||(t[3]=l=>s.toggleReaction(n.threadAnnouncement))},null,8,["announcement","business-avatar","show-business"]),o(C,{class:"my-2"}),n.threadLoading?(a(),p(f,{key:0,class:"py-2"})):n.threadReplies.length===0?(a(),p(y,{key:1,icon:"3d-message",title:"No replies yet",subtitle:"Be the first to reply.",class:"flex-1",size:"s"})):d("",!0),u("div",Ue,[(a(!0),c(D,null,L(n.threadReplies,l=>(a(),p(v,{key:l.id,announcement:l,"business-avatar":s.avatarFor(n.threadAnnouncement),"can-open-client":n.permissions.is_staff,onOpenClient:s.openClient,onDelete:b=>s.deleteAnnouncement(l),onUpdated:b=>l.body=b},null,8,["announcement","business-avatar","can-open-client","onOpenClient","onDelete","onUpdated"]))),128))])]),u("div",Ne,[o(_,{class:"mt-1.5",image:s.viewerAvatar,badge:s.viewerBadge},null,8,["image","badge"]),o(N,{placeholder:"Reply...",variant:"inline",disabled:n.replyPosting,links:!0,modelValue:n.replyComposer,"onUpdate:modelValue":t[4]||(t[4]=l=>n.replyComposer=l)},{footer:h(()=>[u("div",Re,[o(m,{icon:"send-plane-2",size:"s","fully-rounded":!0,class:"mt-auto",theme:s.replyHasText?"primary":"ghost",loading:n.replyPosting,disabled:!s.replyHasText,onClick:s.postReply},null,8,["theme","loading","disabled","onClick"])])]),_:1},8,["disabled","modelValue"])])])):(a(),p(f,{key:0,class:"py-2"}))]),_:1},8,["open","onUpdate:open"]),o(j,{client:n.selectedClient,auth:i.auth,"onUpdate:client":t[5]||(t[5]=l=>n.selectedClient=l),"onClose:client":t[6]||(t[6]=l=>n.selectedClient=null)},null,8,["client","auth"]),o(T,{open:n.composerDialog,"close-button":!0,"dismiss-button":!1,position:"center-bottom-l","onUpdate:open":t[8]||(t[8]=l
2=>n.composerDialog=l)},{"footer-append":h(()=>[u("div",Ve,[!n.editingAnnouncement&&(s.emailNotificationsAvailable||i.currentPlanLookupKey)?(a(),p(q,{key:0,"model-value":s.emailNotificationsAvailable&&n.notifyEmail,"onUpdate:modelValue":s.onNotifyEmail},{default:h(()=>[o(R,{title:"Notify via email"})]),_:1},8,["model-value","onUpdate:modelValue"])):d("",!0),o(m,{title:n.editingAnnouncement?"Save":"Post",loading:n.posting,disabled:!s.composerHasText||n.posting,onClick:s.postAnnouncement},null,8,["title","loading","disabled","onClick"])])]),default:h(()=>[u("div",Be,[u("div",Le,[o(_,{image:s.viewerAvatar,badge:s.viewerBadge},null,8,["image","badge"]),u("div",Pe,[o(R,{title:i.auth.user?.name},null,8,["title"]),o(N,{placeholder:"Share something with your clients...",variant:"inline",autofocus:!0,disabled:n.posting,links:!0,"input-class":"!border-transparent","editor-class":"!p-0 !min-h-0 *:!gap-2",modelValue:n.composer,"onUpdate:modelValue":t[7]||(t[7]=l=>n.composer=l)},null,8,["disabled","modelValue"])])])])]),_:1},8,["open"]),o(T,{title:"Delete message?",open:!!n.announcementToDelete,"onUpdate:open":t[9]||(t[9]=l=>n.announcementToDelete=null)},{subtitle:h(()=>[n.announcementToDelete?.replies_count?(a(),c("span",Oe,"This message and all its replies will be permanently deleted.")):(a(),c("span",He,"This message will be permanently deleted."))]),"footer-append":h(()=>[o(m,{title:"Delete",theme:"danger",loading:n.deletingAnnouncement,onClick:s.confirmDeleteAnnouncement},null,8,["loading","onClick"])]),_:1},8,["open"]),o(T,{open:n.upgradeDialog,"close-button":!0,"dismiss-button":!1,"onUpdate:open":t[10]||(t[10]=l=>n.upgradeDialog=l)},{default:h(()=>[o(y,{icon:"3d-mail",title:n.isIosApp?"Email notifications not included":"Upgrade to notify via email",subtitle:"Land your announcements in every client's inbox, not just the app.",class:"-mt-12 w-full px-6"},{default:h(()=>[n.isIosApp?d("",!0):(a(),p(m,{key:0,href:"/settings/billing","fully-rounded":!0},{default:h(()=>[...t[12]||(t[12]=[$(" View plans ",-1)])]),_:1}))]),_:1},8,["title"])]),_:1},8,["open"])])}const it=U(Te,[["render",Me]]);export{it 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.