@usechat/react-native 1.0.1 → 1.0.2

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.mjs CHANGED
@@ -1,478 +1,460 @@
1
1
  'use client'
2
- import{createContext as _n,useContext as Gn}from"react";import{StyleSheet as Jn}from"react-native";import{KeyboardProvider as Xn,KeyboardAvoidingView as Qn}from"react-native-keyboard-controller";import{useState as Nn,useEffect as Wn}from"react";import{View as Jt,Text as Me,StyleSheet as Un,ActivityIndicator as Kn}from"react-native";var oe={isInitialized:!1,isInitializing:!1,error:null,initData:null},Bs=M=>{oe={...oe,isInitializing:M,error:M?null:oe.error}},ks=M=>{oe={isInitialized:!0,isInitializing:!1,error:null,initData:M}},Fe=M=>{oe={isInitialized:!1,isInitializing:!1,error:M,initData:null}};var Fo=()=>{if(oe.isInitializing)throw new Error("Chat SDK is initializing. Please wait...");if(oe.error)throw new Error(`Chat initialization failed: ${oe.error}. Please call initChat() with a valid project ID.`);if(!oe.isInitialized)throw new Error("Chat SDK is not initialized. Please call initChat() with a valid project ID before using chat components.")},Gt=()=>({isAuthorized:oe.isInitialized&&!oe.error,isInitialized:oe.isInitialized,isInitializing:oe.isInitializing,hasError:!!oe.error,error:oe.error,initData:oe.initData});function Xt(M,S={}){let{fallback:C,showInitializingState:R=!0}=S;return function(A){let[I,z]=Nn(Gt());if(Wn(()=>{let P=()=>{let v=Gt();z(v)};P();let E=setInterval(P,100);return()=>clearInterval(E)},[]),I.isInitializing&&R)return<Jt style={ue.container}>
3
- <Kn size="large"color="#007AFF"/>
4
- <Me style={ue.text}>Initializing chat...</Me>
5
- </Jt>;if(I.hasError)return<Jt style={ue.container}>
6
- <Me style={ue.errorTitle}>Chat Initialization Failed</Me>
7
- <Me style={ue.errorText}>{I.error}</Me>
8
- <Me style={ue.helpText}>
9
- Please call initChat() with a valid project ID before using chat components.
10
- </Me>
11
- </Jt>;if(!I.isInitialized)return<Jt style={ue.container}>
12
- <Me style={ue.errorTitle}>Chat Not Initialized</Me>
13
- <Me style={ue.errorText}>
14
- Chat SDK has not been initialized. Please call initChat() first.
15
- </Me>
16
- <Me style={ue.helpText}>
17
- Please call initChat() with a valid project ID.
18
- </Me>
19
- </Jt>;if(C){let P=C;return<P/>}try{return Fo(),<M{...A}/>}catch(P){return<Jt style={ue.container}>
20
- <Me style={ue.errorTitle}>Authorization Error</Me>
21
- <Me style={ue.errorText}>
22
- {P instanceof Error?P.message:"Unknown error"}
23
- </Me>
24
- </Jt>}}}var ue=Un.create({container:{flex:1,justifyContent:"center",alignItems:"center",padding:20,backgroundColor:"#f5f5f5"},text:{marginTop:10,fontSize:16,color:"#666",textAlign:"center"},errorTitle:{fontSize:18,fontWeight:"bold",color:"#d32f2f",marginBottom:10,textAlign:"center"},errorText:{fontSize:14,color:"#666",textAlign:"center",marginBottom:15,lineHeight:20},helpText:{fontSize:12,color:"#999",textAlign:"center",lineHeight:16,fontFamily:"monospace"}});function qn(M={}){let{licenseKey:S,attribution:C=!0,environment:R="production"}=M;return R==="development"?{isValid:!0,type:"free",requiresAttribution:!0,message:"Development mode - remember to include attribution in production"}:S?S.startsWith("usechat_")&&S.length>20?{isValid:!0,type:"commercial",requiresAttribution:!1,message:"Commercial license active"}:{isValid:!1,type:"invalid",requiresAttribution:!0,message:"Invalid license key format"}:C?{isValid:!0,type:"free",requiresAttribution:!0,message:"Free license - attribution required"}:{isValid:!1,type:"invalid",requiresAttribution:!0,message:"Commercial license required or attribution must be enabled"}}function $n(){return"Powered by UseChat SDK - https://usechat.dev"}function Yn(M){if(__DEV__){let S=M.isValid?"\u2705":"\u274C";console.log(`${S} UseChat SDK License: ${M.message}`),M.requiresAttribution&&console.log("\u{1F4DD} Attribution required:",$n()),M.isValid||console.warn("\u26A0\uFE0F License violation detected. Please visit https://usechat.dev/licensing for more information.")}}function Ls(M){let S=qn(M);return __DEV__&&Yn(S),S}var Es=_n(null),Zn=({children:M,config:S={}})=>{let C=Ls(S),R={keyboardBehavior:"padding",keyboardVerticalOffset:60,enableReactionDetails:!0,enableMessageActions:!0,enableScrollToBottom:!0,enableTypingIndicator:!0,...S};return<Es.Provider value={{config:R}}>
25
- <Xn>
26
- <Qn behavior={R.keyboardBehavior}style={[er.keyboardContainer]}keyboardVerticalOffset={R.keyboardVerticalOffset}>
2
+ var Me={isInitialized:!1,projectId:null,error:null},ks=M=>{Me={isInitialized:!0,projectId:M,error:null}},Fe=M=>{Me={isInitialized:!1,projectId:null,error:M}};var Bn=()=>({...Me}),Ye=()=>{if(Me.error)throw new Error(`UseChat SDK initialization failed: ${Me.error}
3
+
4
+ Please call initChat() with a valid project ID before using any UseChat components or hooks.
5
+
6
+ Example:
7
+ import { initChat } from '@usechat/react-native';
8
+ await initChat({ projectId: 'your-project-id' });`);if(!Me.isInitialized)throw new Error(`UseChat SDK is not initialized.
9
+
10
+ Please call initChat() with a valid project ID before using any UseChat components or hooks.
11
+
12
+ Example:
13
+ import { initChat } from '@usechat/react-native';
14
+ await initChat({ projectId: 'your-project-id' });`)},Vn=()=>(Ye(),Me.projectId),Dn=()=>Me.isInitialized&&!Me.error;var kn=async M=>{let{projectId:S,apiUrl:C="http://localhost:3000/api/chat/init",debug:R=!1}=M;if(!S){let T="Project ID is required";throw Fe(T),new Error(T)}try{R&&console.log(`[UseChat SDK] Validating projectId: ${S}`);let T=await fetch(C,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:S})});if(R&&console.log(`[Chat SDK] Response status: ${T.status}, ok: ${T.ok}`),!T.ok){let P=`HTTP ${T.status}: ${T.statusText}`;try{let z=await T.json();P=z.error||z.message||P}catch{try{let j=await T.text();j&&(P=`Server error: ${j}`)}catch{P=`Failed to initialize chat (HTTP ${T.status})`}}throw Fe(P),new Error(P)}let A;try{let P=await T.text();if(R&&console.log(`[Chat SDK] Response text: ${P}`),!P){let z="Server returned empty response";throw Fe(z),new Error(z)}A=JSON.parse(P)}catch(P){R&&console.error("[Chat SDK] JSON parse error:",P);let z="Server returned invalid JSON response";throw Fe(z),new Error(z)}if(!A||typeof A!="object"){let P="Server returned invalid response format";throw Fe(P),new Error(P)}let I=A;return R&&console.log(`[UseChat SDK] Successfully initialized with projectId: ${S}`),ks(S),I}catch(T){R&&console.error("[Chat SDK] Init error:",T);let A;throw T instanceof TypeError&&T.message.includes("fetch")?A="Network error: Unable to connect to server. Please check your internet connection.":T instanceof Error?A=T.message:A="Failed to initialize chat: Unknown error",A.includes("Project ID is required")||Fe(A),new Error(A)}};import js,{useState as Ho,useRef as Os,useCallback as Ge}from"react";import{View as We,StyleSheet as Wn}from"react-native";import{createContext as Ln,useContext as En}from"react";import{StyleSheet as jn}from"react-native";import{KeyboardProvider as On,KeyboardAvoidingView as Hn}from"react-native-keyboard-controller";var Ls=Ln(null),Fn=({children:M,config:S={}})=>{let C={keyboardBehavior:"padding",keyboardVerticalOffset:60,enableReactionDetails:!0,enableMessageActions:!0,enableScrollToBottom:!0,enableTypingIndicator:!0,...S};return<Ls.Provider value={{config:C}}>
15
+ <On>
16
+ <Hn behavior={C.keyboardBehavior}style={[Nn.keyboardContainer]}keyboardVerticalOffset={C.keyboardVerticalOffset}>
27
17
  {}
28
18
  {M}
29
- </Qn>
30
- </Xn>
31
- </Es.Provider>},Ho=Xt(Zn),Qt=()=>{let M=Gn(Es);if(!M)throw new Error("useChatConfig must be used within a ChatProvider");return M.config},er=Jn.create({container:{flex:1},keyboardContainer:{flex:1,overflow:"hidden"}});import Os,{useState as Uo,useRef as Fs,useCallback as Ze}from"react";import{View as Ne,StyleSheet as tr}from"react-native";import{useState as No,useCallback as Vt}from"react";var Zt=(M={})=>{let{uploader:S,maxAttachments:C=10,maxFileSize:R=10*1024*1024,allowedTypes:T=["image/*","application/pdf","text/*"],onAttachmentAdd:A,onAttachmentRemove:I,onAttachmentUpload:z}=M,[P,E]=No([]),[v,V]=No(!1),[D,B]=No(0),k=Vt(N=>{if(P.length>=C){console.warn(`Maximum ${C} attachments allowed`);return}if(N.data?.size&&N.data.size>R){console.warn(`File size exceeds ${R/(1024*1024)}MB limit`);return}if(N.data?.type&&!T.some(ie=>ie.endsWith("/*")?N.data.type.startsWith(ie.slice(0,-1)):N.data.type===ie)){console.warn(`File type ${N.data.type} not allowed`);return}let j={...N,id:N.id||`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,uploadStatus:"pending",uploadProgress:0};E(J=>[...J,j]),A&&A(j)},[P.length,C,R,T,A]),L=Vt(N=>{E(j=>j.filter(J=>J.id!==N)),I&&I(N)},[I]),O=Vt(()=>{E([])},[]),F=Vt(async N=>{try{let j;switch(N){case"image":j={type:"image",data:{uri:"mock-image-uri",width:800,height:600,fileName:"image.jpg",fileSize:1024*1024}};break;case"document":j={type:"document",data:{uri:"mock-document-uri",name:"document.pdf",size:2048*1024,mimeType:"application/pdf"}};break;case"location":j={type:"location",data:{coordinates:{latitude:0,longitude:0},address:"Mock Address",timestamp:Date.now()}};break;case"contact":j={type:"contact",data:{id:"contact-1",name:"John Doe",phoneNumbers:["+1234567890"],emails:["john@example.com"]}};break;default:throw new Error(`Unsupported attachment type: ${N}`)}let J={id:`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,type:N,data:j.data,fileName:j.data.fileName||j.data.name,fileSize:j.data.fileSize||j.data.size,mimeType:j.data.mimeType,uploadStatus:"pending",uploadProgress:0};k(J)}catch(j){console.error("Error opening picker:",j)}},[k]),H=Vt(async()=>{if(!S)return console.warn("No uploader provided, skipping upload"),P;if(P.length===0)return[];V(!0),B(0);try{let N=P.map(async(Y,X)=>{try{E(Q=>Q.map(W=>W.id===Y.id?{...W,uploadStatus:"uploading",uploadProgress:0}:W));let le=setInterval(()=>{E(Q=>Q.map(W=>W.id===Y.id?{...W,uploadProgress:Math.min((W.uploadProgress??0)+10,90)}:W))},100),ge=await S.upload(Y.data);clearInterval(le);let ne={...Y,uploadStatus:"completed",uploadProgress:100,data:{...Y.data,url:ge.url,metadata:ge.metadata}};return E(Q=>Q.map(W=>W.id===Y.id?ne:W)),ne}catch(le){return console.error(`Error uploading attachment ${Y.id}:`,le),E(ge=>ge.map(ne=>ne.id===Y.id?{...ne,uploadStatus:"failed",uploadProgress:0}:ne)),{...Y,uploadStatus:"failed",uploadProgress:0}}}),j=await Promise.all(N),ie=j.filter(Y=>Y.uploadStatus==="completed").length/j.length*100;return B(ie),z&&z(j),j}catch(N){return console.error("Error uploading attachments:",N),P}finally{V(!1)}},[P,S,z]);return{attachments:P,openPicker:F,addAttachment:k,removeAttachment:L,clearAttachments:O,uploadAttachments:H,isUploading:v,uploadProgress:D}};import{useState as Wo,useCallback as He}from"react";var js=(M={})=>{let{onSend:S,onFocus:C,initialValue:R="",maxLength:T=1e3}=M,[A,I]=Wo(R),[z,P]=Wo(40),[E,v]=Wo(!1),V=He(H=>{H.length<=T&&I(H)},[T]),D=He(H=>{if(!A.trim()&&(!H||H.length===0))return;let N=A.trim();S&&S(N,H),I(""),P(40)},[A,S]),B=He(()=>{v(!0),C&&C()},[C]),k=He(()=>{v(!1)},[]),L=He(H=>{P(Math.max(40,Math.min(H,120)))},[]),O=He(()=>{I(""),P(40)},[]),F=He(H=>{I(H)},[]);return{message:A,composerHeight:z,isFocused:E,handleTextChange:V,handleSend:D,handleFocus:B,handleBlur:k,handleContentSizeChange:L,clearMessage:O,setMessage:F}};var or=({messages:M,components:S={},renderProps:C={},onMessageSend:R,onReactionAdd:T,onReactionRemove:A,onMessageDelete:I,onActionPress:z,attachmentUploader:P,maxAttachments:E=10,maxFileSize:v=10*1024*1024,allowedFileTypes:V=["image/*","application/pdf","text/*"],enableReactionDetails:D,enableMessageActions:B=!0,enableScrollToBottom:k,enableTypingIndicator:L,isTyping:O=!1,typingUserName:F,isLoading:H=!1,loadingComponent:N})=>{let j=Qt(),[J,ie]=Uo(!1),Y=S.MessageList||Ke,X=S.MessageInput||Ue,le=D??j.enableReactionDetails??!0,ge=B??j.enableMessageActions??!0,ne=k??j.enableScrollToBottom??!0,Q=L??j.enableTypingIndicator??!0,[W,ce]=Uo(null),xe=Fs(null),[fe,re]=Uo(M||[]),pe=Fs((M||[]).length+1);Os.useEffect(()=>{M&&(re(M),pe.current=M.length+1)},[M]),Os.useEffect(()=>{if(W&&xe.current){let U=setTimeout(()=>{xe.current?.focus()},150);return()=>clearTimeout(U)}},[W]);let be=Zt({uploader:P,maxAttachments:E,maxFileSize:v,allowedTypes:V}),Z=js({onSend:(U,$)=>{if(W){let _={id:W.id,text:W.text,senderName:W.senderName,senderId:W.senderId,isMe:W.isMe,timestamp:W.timestamp,type:W.type==="image"?"image":"text",imageData:W.imageData};if($&&$.length>0){let q=$[0],ee={id:pe.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:_,attachments:$,type:q.type==="image"?"image":"text",...q.type==="image"&&q.data&&{imageData:{uri:q.data.uri||"",width:q.data.width||300,height:q.data.height||200,fileName:q.fileName||"image.jpg",fileSize:q.fileSize||0}}};re(ye=>[...ye,ee]),R&&R(ee)}else{let q={id:pe.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:_};re(ee=>[...ee,q]),R&&R(q)}ce(null)}else if($&&$.length>0){let _=$[0],q={id:pe.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",attachments:$,type:_.type==="image"?"image":"text",..._.type==="image"&&_.data&&{imageData:{uri:_.data.uri||"",width:_.data.width||300,height:_.data.height||200,fileName:_.fileName||"image.jpg",fileSize:_.fileSize||0}}};re(ee=>[...ee,q]),R&&R(q)}else{let _={id:pe.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent"};re(q=>[...q,_]),R&&R(_)}be.clearAttachments()},onFocus:()=>{}}),Ie=Ze((U,$)=>{console.log("\u{1F525} Chat - addReaction called with messageId:",U,"and emoji:",$),re(_=>_.map(q=>q.id===U?q.reactions?.find(ye=>ye.emoji===$)?{...q,reactions:q.reactions?.map(ye=>ye.emoji===$?{...ye,count:ye.count+1,users:[...ye.users,"currentUser"]}:ye)}:{...q,reactions:[...q.reactions||[],{emoji:$,count:1,users:["currentUser"]}]}:q)),T&&T(U,$)},[T]),jo=Ze((U,$)=>{re(_=>_.map(q=>q.id===U?{...q,reactions:q.reactions?.map(ee=>ee.emoji===$?{...ee,count:Math.max(0,ee.count-1),users:ee.users.filter(ye=>ye!=="currentUser")}:ee).filter(ee=>ee.count>0)}:q)),A&&A(U,$)},[A]),Oo=Ze(U=>{re($=>$.map(_=>_.id===U?{..._,deleted:!0,text:"",reactions:void 0}:_)),I&&I(U)},[I]),te=Ze(()=>{ce(null)},[]),de=Ze(U=>{ce(U),setTimeout(()=>{xe.current?.focus()},100)},[]),zt=Ze(U=>{if(J)return;let{layout:$}=U.nativeEvent;$.height<=0||ie(!0)},[J]);if(H)return<Ne style={We.container}>
32
- {N||<Ne style={We.loadingContainer}>
19
+ </Hn>
20
+ </On>
21
+ </Ls.Provider>},Eo=Fn,Pt=()=>{let M=En(Ls);if(!M)throw new Error("useChatConfig must be used within a ChatProvider");return M.config},Nn=jn.create({container:{flex:1},keyboardContainer:{flex:1,overflow:"hidden"}});import{useState as jo,useCallback as At}from"react";var zt=(M={})=>{let{uploader:S,maxAttachments:C=10,maxFileSize:R=10*1024*1024,allowedTypes:T=["image/*","application/pdf","text/*"],onAttachmentAdd:A,onAttachmentRemove:I,onAttachmentUpload:P}=M,[z,j]=jo([]),[v,B]=jo(!1),[V,D]=jo(0),k=At(N=>{if(z.length>=C){console.warn(`Maximum ${C} attachments allowed`);return}if(N.data?.size&&N.data.size>R){console.warn(`File size exceeds ${R/(1024*1024)}MB limit`);return}if(N.data?.type&&!T.some(ie=>ie.endsWith("/*")?N.data.type.startsWith(ie.slice(0,-1)):N.data.type===ie)){console.warn(`File type ${N.data.type} not allowed`);return}let E={...N,id:N.id||`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,uploadStatus:"pending",uploadProgress:0};j(J=>[...J,E]),A&&A(E)},[z.length,C,R,T,A]),L=At(N=>{j(E=>E.filter(J=>J.id!==N)),I&&I(N)},[I]),O=At(()=>{j([])},[]),H=At(async N=>{try{let E;switch(N){case"image":E={type:"image",data:{uri:"mock-image-uri",width:800,height:600,fileName:"image.jpg",fileSize:1024*1024}};break;case"document":E={type:"document",data:{uri:"mock-document-uri",name:"document.pdf",size:2048*1024,mimeType:"application/pdf"}};break;case"location":E={type:"location",data:{coordinates:{latitude:0,longitude:0},address:"Mock Address",timestamp:Date.now()}};break;case"contact":E={type:"contact",data:{id:"contact-1",name:"John Doe",phoneNumbers:["+1234567890"],emails:["john@example.com"]}};break;default:throw new Error(`Unsupported attachment type: ${N}`)}let J={id:`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,type:N,data:E.data,fileName:E.data.fileName||E.data.name,fileSize:E.data.fileSize||E.data.size,mimeType:E.data.mimeType,uploadStatus:"pending",uploadProgress:0};k(J)}catch(E){console.error("Error opening picker:",E)}},[k]),F=At(async()=>{if(!S)return console.warn("No uploader provided, skipping upload"),z;if(z.length===0)return[];B(!0),D(0);try{let N=z.map(async(Y,X)=>{try{j(Q=>Q.map(W=>W.id===Y.id?{...W,uploadStatus:"uploading",uploadProgress:0}:W));let le=setInterval(()=>{j(Q=>Q.map(W=>W.id===Y.id?{...W,uploadProgress:Math.min((W.uploadProgress??0)+10,90)}:W))},100),me=await S.upload(Y.data);clearInterval(le);let se={...Y,uploadStatus:"completed",uploadProgress:100,data:{...Y.data,url:me.url,metadata:me.metadata}};return j(Q=>Q.map(W=>W.id===Y.id?se:W)),se}catch(le){return console.error(`Error uploading attachment ${Y.id}:`,le),j(me=>me.map(se=>se.id===Y.id?{...se,uploadStatus:"failed",uploadProgress:0}:se)),{...Y,uploadStatus:"failed",uploadProgress:0}}}),E=await Promise.all(N),ie=E.filter(Y=>Y.uploadStatus==="completed").length/E.length*100;return D(ie),P&&P(E),E}catch(N){return console.error("Error uploading attachments:",N),z}finally{B(!1)}},[z,S,P]);return{attachments:z,openPicker:H,addAttachment:k,removeAttachment:L,clearAttachments:O,uploadAttachments:F,isUploading:v,uploadProgress:V}};import{useState as Oo,useCallback as Ne}from"react";var Es=(M={})=>{let{onSend:S,onFocus:C,initialValue:R="",maxLength:T=1e3}=M,[A,I]=Oo(R),[P,z]=Oo(40),[j,v]=Oo(!1),B=Ne(F=>{F.length<=T&&I(F)},[T]),V=Ne(F=>{if(!A.trim()&&(!F||F.length===0))return;let N=A.trim();S&&S(N,F),I(""),z(40)},[A,S]),D=Ne(()=>{v(!0),C&&C()},[C]),k=Ne(()=>{v(!1)},[]),L=Ne(F=>{z(Math.max(40,Math.min(F,120)))},[]),O=Ne(()=>{I(""),z(40)},[]),H=Ne(F=>{I(F)},[]);return{message:A,composerHeight:P,isFocused:j,handleTextChange:B,handleSend:V,handleFocus:D,handleBlur:k,handleContentSizeChange:L,clearMessage:O,setMessage:H}};var Un=({messages:M,components:S={},renderProps:C={},onMessageSend:R,onReactionAdd:T,onReactionRemove:A,onMessageDelete:I,onActionPress:P,attachmentUploader:z,maxAttachments:j=10,maxFileSize:v=10*1024*1024,allowedFileTypes:B=["image/*","application/pdf","text/*"],enableReactionDetails:V,enableMessageActions:D=!0,enableScrollToBottom:k,enableTypingIndicator:L,isTyping:O=!1,typingUserName:H,isLoading:F=!1,loadingComponent:N})=>{let E=Pt(),[J,ie]=Ho(!1),Y=S.MessageList||Ie,X=S.MessageInput||we,le=V??E.enableReactionDetails??!0,me=D??E.enableMessageActions??!0,se=k??E.enableScrollToBottom??!0,Q=L??E.enableTypingIndicator??!0,[W,ce]=Ho(null),ye=Os(null),[he,ne]=Ho(M||[]),ge=Os((M||[]).length+1);js.useEffect(()=>{M&&(ne(M),ge.current=M.length+1)},[M]),js.useEffect(()=>{if(W&&ye.current){let U=setTimeout(()=>{ye.current?.focus()},150);return()=>clearTimeout(U)}},[W]);let xe=zt({uploader:z,maxAttachments:j,maxFileSize:v,allowedTypes:B}),Z=Es({onSend:(U,$)=>{if(W){let G={id:W.id,text:W.text,senderName:W.senderName,senderId:W.senderId,isMe:W.isMe,timestamp:W.timestamp,type:W.type==="image"?"image":"text",imageData:W.imageData};if($&&$.length>0){let K=$[0],ee={id:ge.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:G,attachments:$,type:K.type==="image"?"image":"text",...K.type==="image"&&K.data&&{imageData:{uri:K.data.uri||"",width:K.data.width||300,height:K.data.height||200,fileName:K.fileName||"image.jpg",fileSize:K.fileSize||0}}};ne(fe=>[...fe,ee]),R&&R(ee)}else{let K={id:ge.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:G};ne(ee=>[...ee,K]),R&&R(K)}ce(null)}else if($&&$.length>0){let G=$[0],K={id:ge.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",attachments:$,type:G.type==="image"?"image":"text",...G.type==="image"&&G.data&&{imageData:{uri:G.data.uri||"",width:G.data.width||300,height:G.data.height||200,fileName:G.fileName||"image.jpg",fileSize:G.fileSize||0}}};ne(ee=>[...ee,K]),R&&R(K)}else{let G={id:ge.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent"};ne(K=>[...K,G]),R&&R(G)}xe.clearAttachments()},onFocus:()=>{}}),Te=Ge((U,$)=>{console.log("\u{1F525} Chat - addReaction called with messageId:",U,"and emoji:",$),ne(G=>G.map(K=>K.id===U?K.reactions?.find(fe=>fe.emoji===$)?{...K,reactions:K.reactions?.map(fe=>fe.emoji===$?{...fe,count:fe.count+1,users:[...fe.users,"currentUser"]}:fe)}:{...K,reactions:[...K.reactions||[],{emoji:$,count:1,users:["currentUser"]}]}:K)),T&&T(U,$)},[T]),ko=Ge((U,$)=>{ne(G=>G.map(K=>K.id===U?{...K,reactions:K.reactions?.map(ee=>ee.emoji===$?{...ee,count:Math.max(0,ee.count-1),users:ee.users.filter(fe=>fe!=="currentUser")}:ee).filter(ee=>ee.count>0)}:K)),A&&A(U,$)},[A]),Lo=Ge(U=>{ne($=>$.map(G=>G.id===U?{...G,deleted:!0,text:"",reactions:void 0}:G)),I&&I(U)},[I]),te=Ge(()=>{ce(null)},[]),de=Ge(U=>{ce(U),setTimeout(()=>{ye.current?.focus()},100)},[]),vt=Ge(U=>{if(J)return;let{layout:$}=U.nativeEvent;$.height<=0||ie(!0)},[J]);if(F)return<We style={Ue.container}>
22
+ {N||<We style={Ue.loadingContainer}>
33
23
  {}
34
- </Ne>}
35
- </Ne>;if(!J)return<Ne style={We.container}>
36
- <Ne style={We.chatContainer}onLayout={zt}>
37
- <Ne style={We.loadingContainer}>{N}</Ne>
38
- </Ne>
39
- </Ne>;let Ds=C.renderInput;return<Ne style={We.container}>
40
- <Ne style={We.fill}>
41
- <Y messages={fe}isTyping={Q?O:!1}typingUserName={F}showScrollToBottom={ne}isReplyActive={!!W}enableMessageActions={ge}enableReactionDetails={le}onReactionAdd={Ie}onReactionRemove={jo}onMessageDelete={Oo}onReplyMessage={de}onActionPress={(U,$)=>{U==="reply"?de($):z?.(U,$)}}/>
24
+ </We>}
25
+ </We>;if(!J)return<We style={Ue.container}>
26
+ <We style={Ue.chatContainer}onLayout={vt}>
27
+ <We style={Ue.loadingContainer}>{N}</We>
28
+ </We>
29
+ </We>;let Ds=C.renderInput;return<We style={Ue.container}>
30
+ <We style={Ue.fill}>
31
+ <Y messages={he}isTyping={Q?O:!1}typingUserName={H}showScrollToBottom={se}isReplyActive={!!W}enableMessageActions={me}enableReactionDetails={le}onReactionAdd={Te}onReactionRemove={ko}onMessageDelete={Lo}onReplyMessage={de}onActionPress={(U,$)=>{U==="reply"?de($):P?.(U,$)}}/>
42
32
 
43
- {Ds?Ds({value:Z.message,onChangeText:Z.handleTextChange,onSend:Z.handleSend,onFocus:Z.handleFocus,height:Z.composerHeight,onContentSizeChange:Z.handleContentSizeChange,replyToMessage:W,onCancelReply:te,attachments:be.attachments,onAttachmentAdd:be.addAttachment,onAttachmentRemove:be.removeAttachment,onAttachmentUpload:be.uploadAttachments}):<X ref={xe}value={Z.message}onChangeText={Z.handleTextChange}onSend={Z.handleSend}onFocus={Z.handleFocus}height={Z.composerHeight}onContentSizeChange={Z.handleContentSizeChange}replyToMessage={W}onCancelReply={te}onAttachmentSend={(U,$)=>{let _=U.type==="image",q={id:pe.current++,text:$?.trim()||"",isMe:!0,timestamp:new Date().toISOString(),status:"sent",type:_?"image":"text",..._&&U.data&&{imageData:{uri:U.data.uri||"",width:U.data.width||300,height:U.data.height||200,fileName:U.data.fileName||U.data.name||"image.jpg",fileSize:U.data.fileSize||U.data.size||0}}};re(ee=>[...ee,q]),R&&R(q),Z.handleTextChange("")}}/>}
33
+ {Ds?Ds({value:Z.message,onChangeText:Z.handleTextChange,onSend:Z.handleSend,onFocus:Z.handleFocus,height:Z.composerHeight,onContentSizeChange:Z.handleContentSizeChange,replyToMessage:W,onCancelReply:te,attachments:xe.attachments,onAttachmentAdd:xe.addAttachment,onAttachmentRemove:xe.removeAttachment,onAttachmentUpload:xe.uploadAttachments}):<X ref={ye}value={Z.message}onChangeText={Z.handleTextChange}onSend={Z.handleSend}onFocus={Z.handleFocus}height={Z.composerHeight}onContentSizeChange={Z.handleContentSizeChange}replyToMessage={W}onCancelReply={te}onAttachmentSend={(U,$)=>{let G=U.type==="image",K={id:ge.current++,text:$?.trim()||"",isMe:!0,timestamp:new Date().toISOString(),status:"sent",type:G?"image":"text",...G&&U.data&&{imageData:{uri:U.data.uri||"",width:U.data.width||300,height:U.data.height||200,fileName:U.data.fileName||U.data.name||"image.jpg",fileSize:U.data.fileSize||U.data.size||0}}};ne(ee=>[...ee,K]),R&&R(K),Z.handleTextChange("")}}/>}
44
34
 
45
35
  {}
46
- </Ne>
36
+ </We>
47
37
 
48
38
  {}
49
- </Ne>},We=tr.create({container:{flex:1},chatContainer:{flex:1,overflow:"hidden"},fill:{flex:1},loadingContainer:{flex:1,justifyContent:"center",alignItems:"center"}}),Ko=or;import{View as Pe,Text as $o,TouchableOpacity as Mo}from"react-native";import{ArrowLeft as Mr,Info as Cr,Phone as Rr,Video as Sr}from"lucide-react-native";import{useContext as ir}from"react";import{createContext as sr,useMemo as nr}from"react";var Dt={colors:{primary:"#3B82F6",secondary:"#34B7F1",background:"#FFFFFF",surface:"#F7F8FA",surfaceSecondary:"#F3F4F6",text:"#111827",textSecondary:"#6B7280",textMuted:"#9CA3AF",border:"#E5E7EB",borderLight:"#F3F4F6",success:"#10B981",error:"#EF4444",warning:"#F59E0B",unread:"#EBF8FF",online:"#10B981",messageBubble:{sent:"#3B82F6",received:"#E5E7EB",sentText:"#FFFFFF",receivedText:"#111827"},gray:{50:"#F9FAFB",100:"#F3F4F6",200:"#E5E7EB",300:"#D1D5DB",400:"#9CA3AF",500:"#6B7280",600:"#4B5563",700:"#374151",800:"#1F2937",900:"#111827"},blue:{50:"#EBF8FF",500:"#3B82F6",600:"#2563EB"},green:{500:"#10B981"}},spacing:{xs:4,sm:8,md:12,lg:16,xl:24,xxl:32},borderRadius:{sm:4,md:8,lg:12,xl:16,full:9999},typography:{fontFamily:"System",fontSize:{xs:12,sm:14,base:16,lg:18,xl:20,xxl:24},fontWeight:{normal:"400",medium:"500",semibold:"600",bold:"700"},lineHeight:{tight:16,normal:20,relaxed:24}}};var qo=sr(Dt),rr=(M,S)=>({colors:{...M.colors,...S.colors},spacing:{...M.spacing,...S.spacing},borderRadius:{...M.borderRadius,...S.borderRadius},typography:{...M.typography,...S.typography}}),ar=({children:M,theme:S})=>{let C=nr(()=>S?rr(Dt,S):Dt,[S]);return<qo.Provider value={C}>{M}</qo.Provider>};var K=()=>{let M=ir(qo);if(!M)throw new Error("useTheme must be used within a ThemeProvider");return M};var Tr=({name:M="George Alan",isOnline:S=!0,onBack:C=()=>{},onVideoCall:R=()=>{},onVoiceCall:T=()=>{},onInfo:A=()=>{}})=>{let I=K();return<Pe style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderBottomWidth:1,borderBottomColor:I.colors.borderLight,backgroundColor:I.colors.background,paddingHorizontal:I.spacing.lg,paddingVertical:I.spacing.md,zIndex:50}}>
39
+ </We>},Ue=Wn.create({container:{flex:1},chatContainer:{flex:1,overflow:"hidden"},fill:{flex:1},loadingContainer:{flex:1,justifyContent:"center",alignItems:"center"}}),Fo=Un;import{View as Pe,Text as Wo,TouchableOpacity as _t}from"react-native";import{ArrowLeft as Gn,Info as _n,Phone as Jn,Video as Xn}from"lucide-react-native";import{useContext as Yn}from"react";import{createContext as Kn,useMemo as qn}from"react";var Bt={colors:{primary:"#3B82F6",secondary:"#34B7F1",background:"#FFFFFF",surface:"#F7F8FA",surfaceSecondary:"#F3F4F6",text:"#111827",textSecondary:"#6B7280",textMuted:"#9CA3AF",border:"#E5E7EB",borderLight:"#F3F4F6",success:"#10B981",error:"#EF4444",warning:"#F59E0B",unread:"#EBF8FF",online:"#10B981",messageBubble:{sent:"#3B82F6",received:"#E5E7EB",sentText:"#FFFFFF",receivedText:"#111827"},gray:{50:"#F9FAFB",100:"#F3F4F6",200:"#E5E7EB",300:"#D1D5DB",400:"#9CA3AF",500:"#6B7280",600:"#4B5563",700:"#374151",800:"#1F2937",900:"#111827"},blue:{50:"#EBF8FF",500:"#3B82F6",600:"#2563EB"},green:{500:"#10B981"}},spacing:{xs:4,sm:8,md:12,lg:16,xl:24,xxl:32},borderRadius:{sm:4,md:8,lg:12,xl:16,full:9999},typography:{fontFamily:"System",fontSize:{xs:12,sm:14,base:16,lg:18,xl:20,xxl:24},fontWeight:{normal:"400",medium:"500",semibold:"600",bold:"700"},lineHeight:{tight:16,normal:20,relaxed:24}}};var No=Kn(Bt),$n=(M,S)=>({colors:{...M.colors,...S.colors},spacing:{...M.spacing,...S.spacing},borderRadius:{...M.borderRadius,...S.borderRadius},typography:{...M.typography,...S.typography}}),Hs=({children:M,theme:S})=>{let C=qn(()=>S?$n(Bt,S):Bt,[S]);return<No.Provider value={C}>{M}</No.Provider>};var q=()=>{let M=Yn(No);if(!M)throw new Error("useTheme must be used within a ThemeProvider");return M};var Qn=({name:M="George Alan",isOnline:S=!0,onBack:C=()=>{},onVideoCall:R=()=>{},onVoiceCall:T=()=>{},onInfo:A=()=>{}})=>{let I=q();return<Pe style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderBottomWidth:1,borderBottomColor:I.colors.borderLight,backgroundColor:I.colors.background,paddingHorizontal:I.spacing.lg,paddingVertical:I.spacing.md,zIndex:50}}>
50
40
  <Pe style={{flex:1,flexDirection:"row",alignItems:"center"}}>
51
- <Mo onPress={C}style={{marginRight:I.spacing.md}}>
52
- <Mr size={24}color={I.colors.gray[700]}/>
53
- </Mo>
41
+ <_t onPress={C}style={{marginRight:I.spacing.md}}>
42
+ <Gn size={24}color={I.colors.gray[700]}/>
43
+ </_t>
54
44
 
55
45
  <Pe style={{flex:1,flexDirection:"row",alignItems:"center"}}>
56
46
  {}
57
47
  <Pe style={{position:"relative",marginRight:I.spacing.md}}>
58
48
  <Pe style={{height:40,width:40,alignItems:"center",justifyContent:"center",borderRadius:I.borderRadius.full,backgroundColor:I.colors.gray[200]}}>
59
- <$o style={{fontSize:I.typography.fontSize.base,color:I.colors.text}}>
49
+ <Wo style={{fontSize:I.typography.fontSize.base,color:I.colors.text}}>
60
50
  👤
61
- </$o>
51
+ </Wo>
62
52
  </Pe>
63
53
  {S&&<Pe style={{position:"absolute",bottom:-2,right:-2,height:12,width:12,borderRadius:I.borderRadius.full,borderWidth:1,borderColor:I.colors.background,backgroundColor:I.colors.online}}/>}
64
54
  </Pe>
65
55
 
66
56
  <Pe style={{flex:1}}>
67
- <$o style={{fontSize:I.typography.fontSize.lg,fontWeight:I.typography.fontWeight.semibold,color:I.colors.text}}>
57
+ <Wo style={{fontSize:I.typography.fontSize.lg,fontWeight:I.typography.fontWeight.semibold,color:I.colors.text}}>
68
58
  {M}
69
- </$o>
70
- <$o style={{fontSize:I.typography.fontSize.sm,color:I.colors.textSecondary}}>
59
+ </Wo>
60
+ <Wo style={{fontSize:I.typography.fontSize.sm,color:I.colors.textSecondary}}>
71
61
  {S?"Online":"Offline"}
72
- </$o>
62
+ </Wo>
73
63
  </Pe>
74
64
  </Pe>
75
65
  </Pe>
76
66
 
77
67
  <Pe style={{flexDirection:"row",alignItems:"center",gap:I.spacing.lg}}>
78
68
  {}
79
- {R&&<Mo onPress={R}>
80
- <Sr size={24}color={I.colors.gray[700]}/>
81
- </Mo>}
82
- {T&&<Mo onPress={T}>
83
- <Rr size={24}color={I.colors.gray[700]}/>
84
- </Mo>}
85
- {A&&<Mo onPress={A}>
86
- <Cr size={24}color={I.colors.gray[700]}/>
87
- </Mo>}
69
+ {R&&<_t onPress={R}>
70
+ <Xn size={24}color={I.colors.gray[700]}/>
71
+ </_t>}
72
+ {T&&<_t onPress={T}>
73
+ <Jn size={24}color={I.colors.gray[700]}/>
74
+ </_t>}
75
+ {A&&<_t onPress={A}>
76
+ <_n size={24}color={I.colors.gray[700]}/>
77
+ </_t>}
88
78
  </Pe>
89
- </Pe>},Yo=Tr;import{useRef as Hr}from"react";import{View as Ot,Text as Ve,Pressable as Nr,TouchableOpacity as Wr}from"react-native";import Bt from"dayjs";import wr from"dayjs/plugin/isToday";import Ir from"dayjs/plugin/isYesterday";Bt.extend(wr);Bt.extend(Ir);var vr=M=>{let S=Bt(M);return S.isToday()?"Today":S.isYesterday()?"Yesterday":S.format("ddd D MMMM")},Pr=M=>Bt(M).format("YYYY-MM-DD"),Hs=M=>{if(M.length===0)return[];let S=[],C=null;return M.forEach((R,T)=>{let A=Pr(R.timestamp);if(C!==A){let z=vr(R.timestamp),P={id:`date-${A}`,listItemType:"date-separator",date:A,displayDate:z};S.push(P),C=A}let I={...R,listItemType:"message"};S.push(I)}),S},_o=M=>Bt(M).format("HH:mm");import{View as Go,Text as Co,Image as Ar}from"react-native";var zr=({replyTo:M,isMyMessage:S})=>{let C=K(),R=(E,v=50)=>E.length<=v?E:E.substring(0,v)+"...",T=S?"rgba(255, 255, 255, 0.3)":C.colors.primary,A=S?"rgba(255, 255, 255, 0.8)":C.colors.primary,I=S?"rgba(255, 255, 255, 0.7)":C.colors.textSecondary,z=S?"rgba(255, 255, 255, 0.1)":C.colors.surfaceSecondary,P=M.type==="image"&&M.imageData;return<Go style={{marginBottom:C.spacing.sm,borderRadius:C.borderRadius.md,padding:C.spacing.sm,backgroundColor:z,borderLeftWidth:4,borderLeftColor:T}}>
90
- <Co style={{fontSize:C.typography.fontSize.xs,fontWeight:C.typography.fontWeight.medium,color:A,marginBottom:C.spacing.xs}}>
79
+ </Pe>},Jt=Qn;import{useRef as Br}from"react";import{View as Lt,Text as Be,Pressable as Vr,TouchableOpacity as Dr}from"react-native";import Vt from"dayjs";import Zn from"dayjs/plugin/isToday";import er from"dayjs/plugin/isYesterday";Vt.extend(Zn);Vt.extend(er);var tr=M=>{let S=Vt(M);return S.isToday()?"Today":S.isYesterday()?"Yesterday":S.format("ddd D MMMM")},or=M=>Vt(M).format("YYYY-MM-DD"),Fs=M=>{if(M.length===0)return[];let S=[],C=null;return M.forEach((R,T)=>{let A=or(R.timestamp);if(C!==A){let P=tr(R.timestamp),z={id:`date-${A}`,listItemType:"date-separator",date:A,displayDate:P};S.push(z),C=A}let I={...R,listItemType:"message"};S.push(I)}),S},Uo=M=>Vt(M).format("HH:mm");import{View as Ko,Text as Xt,Image as Mr}from"react-native";var Cr=({replyTo:M,isMyMessage:S})=>{let C=q(),R=(j,v=50)=>j.length<=v?j:j.substring(0,v)+"...",T=S?"rgba(255, 255, 255, 0.3)":C.colors.primary,A=S?"rgba(255, 255, 255, 0.8)":C.colors.primary,I=S?"rgba(255, 255, 255, 0.7)":C.colors.textSecondary,P=S?"rgba(255, 255, 255, 0.1)":C.colors.surfaceSecondary,z=M.type==="image"&&M.imageData;return<Ko style={{marginBottom:C.spacing.sm,borderRadius:C.borderRadius.md,padding:C.spacing.sm,backgroundColor:P,borderLeftWidth:4,borderLeftColor:T}}>
80
+ <Xt style={{fontSize:C.typography.fontSize.xs,fontWeight:C.typography.fontWeight.medium,color:A,marginBottom:C.spacing.xs}}>
91
81
  {M.isMe?"You":M.senderName||"Sender"}
92
- </Co>
82
+ </Xt>
93
83
 
94
- {P?<Go style={{flexDirection:"row",alignItems:"center"}}>
95
- <Ar source={{uri:M.imageData.uri}}style={{width:40,height:40,borderRadius:C.borderRadius.sm,marginRight:C.spacing.sm}}resizeMode="cover"/>
96
- <Go style={{flex:1}}>
97
- <Co style={{fontSize:C.typography.fontSize.xs,color:I,fontStyle:"italic",marginBottom:C.spacing.xs}}>
84
+ {z?<Ko style={{flexDirection:"row",alignItems:"center"}}>
85
+ <Mr source={{uri:M.imageData.uri}}style={{width:40,height:40,borderRadius:C.borderRadius.sm,marginRight:C.spacing.sm}}resizeMode="cover"/>
86
+ <Ko style={{flex:1}}>
87
+ <Xt style={{fontSize:C.typography.fontSize.xs,color:I,fontStyle:"italic",marginBottom:C.spacing.xs}}>
98
88
  📷 Image
99
- </Co>
100
- {M.text&&M.text.trim()&&<Co style={{fontSize:C.typography.fontSize.sm,color:I,lineHeight:C.typography.lineHeight.tight}}>
89
+ </Xt>
90
+ {M.text&&M.text.trim()&&<Xt style={{fontSize:C.typography.fontSize.sm,color:I,lineHeight:C.typography.lineHeight.tight}}>
101
91
  {R(M.text,30)}
102
- </Co>}
103
- </Go>
104
- </Go>:<Co style={{fontSize:C.typography.fontSize.sm,color:I,lineHeight:C.typography.lineHeight.tight}}>
92
+ </Xt>}
93
+ </Ko>
94
+ </Ko>:<Xt style={{fontSize:C.typography.fontSize.sm,color:I,lineHeight:C.typography.lineHeight.tight}}>
105
95
  {R(M.text)}
106
- </Co>}
107
- </Go>},$e=zr;import{useState as Ns,useCallback as kt}from"react";import{View as Ro,Image as Ws,Pressable as Us,Modal as Vr,Dimensions as Dr,StyleSheet as Br,Text as Lr}from"react-native";var{width:Jo,height:Ks}=Dr.get("window"),Er=({imageData:M,isMe:S,onImagePress:C,onLongPress:R})=>{let T=K(),[A,I]=Ns(!1),[z,P]=Ns(!1),v=kt(()=>{let O=Jo*.6,F=300;if(!M.width||!M.height)return{width:O,height:F};let H=M.width/M.height,N=O,j=N/H;return j>F&&(j=F,N=j*H),{width:Math.round(N),height:Math.round(j)}},[M.width,M.height])(),V=kt(()=>{C?C():I(!0)},[C]),D=kt(()=>{console.error("Failed to load image:",M.uri),P(!0)},[M.uri]),B=kt(()=>{I(!1)},[]),L=kt(()=>{if(!M.width||!M.height)return{width:Jo,height:Ks*.8};let O=M.width/M.height,F=Jo*.9,H=Ks*.8,N=F,j=N/O;return j>H&&(j=H,N=j*O),{width:Math.round(N),height:Math.round(j)}},[M.width,M.height])();return z?<Ro style={[Ae.errorContainer,{width:v.width,height:v.height,backgroundColor:S?T.colors.messageBubble.sent:T.colors.messageBubble.received,borderRadius:T.borderRadius.lg}]}>
108
- <Lr style={[Ae.errorText,{color:S?T.colors.messageBubble.sentText:T.colors.messageBubble.receivedText,fontSize:T.typography.fontSize.sm}]}>
96
+ </Xt>}
97
+ </Ko>},_e=Cr;import{useState as Ns,useCallback as Dt}from"react";import{View as Qt,Image as Ws,Pressable as Us,Modal as Rr,Dimensions as Sr,StyleSheet as Tr,Text as Ir}from"react-native";var{width:qo,height:Ks}=Sr.get("window"),vr=({imageData:M,isMe:S,onImagePress:C,onLongPress:R})=>{let T=q(),[A,I]=Ns(!1),[P,z]=Ns(!1),v=Dt(()=>{let O=qo*.6,H=300;if(!M.width||!M.height)return{width:O,height:H};let F=M.width/M.height,N=O,E=N/F;return E>H&&(E=H,N=E*F),{width:Math.round(N),height:Math.round(E)}},[M.width,M.height])(),B=Dt(()=>{C?C():I(!0)},[C]),V=Dt(()=>{console.error("Failed to load image:",M.uri),z(!0)},[M.uri]),D=Dt(()=>{I(!1)},[]),L=Dt(()=>{if(!M.width||!M.height)return{width:qo,height:Ks*.8};let O=M.width/M.height,H=qo*.9,F=Ks*.8,N=H,E=N/O;return E>F&&(E=F,N=E*O),{width:Math.round(N),height:Math.round(E)}},[M.width,M.height])();return P?<Qt style={[Ae.errorContainer,{width:v.width,height:v.height,backgroundColor:S?T.colors.messageBubble.sent:T.colors.messageBubble.received,borderRadius:T.borderRadius.lg}]}>
98
+ <Ir style={[Ae.errorText,{color:S?T.colors.messageBubble.sentText:T.colors.messageBubble.receivedText,fontSize:T.typography.fontSize.sm}]}>
109
99
  Failed to load image
110
- </Lr>
111
- </Ro>:<>
112
- <Us onPress={V}onLongPress={R}delayLongPress={500}>
113
- <Ro style={[Ae.imageContainer,{borderRadius:T.borderRadius.lg,overflow:"hidden"}]}>
114
- <Ws source={{uri:M.uri}}style={[Ae.image,{width:v.width,height:v.height}]}resizeMode='cover'onError={D}/>
100
+ </Ir>
101
+ </Qt>:<>
102
+ <Us onPress={B}onLongPress={R}delayLongPress={500}>
103
+ <Qt style={[Ae.imageContainer,{borderRadius:T.borderRadius.lg,overflow:"hidden"}]}>
104
+ <Ws source={{uri:M.uri}}style={[Ae.image,{width:v.width,height:v.height}]}resizeMode='cover'onError={V}/>
115
105
 
116
106
  {}
117
- <Ro style={Ae.imageOverlay}/>
118
- </Ro>
107
+ <Qt style={Ae.imageOverlay}/>
108
+ </Qt>
119
109
  </Us>
120
110
 
121
111
  {}
122
- <Vr visible={A}transparent animationType='fade'onRequestClose={B}>
123
- <Us style={Ae.modalContainer}onPress={B}>
124
- <Ro style={Ae.modalContent}>
112
+ <Rr visible={A}transparent animationType='fade'onRequestClose={D}>
113
+ <Us style={Ae.modalContainer}onPress={D}>
114
+ <Qt style={Ae.modalContent}>
125
115
  <Ws source={{uri:M.uri}}style={[Ae.modalImage,{width:L.width,height:L.height,borderRadius:T.borderRadius.lg}]}resizeMode='contain'/>
126
- </Ro>
116
+ </Qt>
127
117
  </Us>
128
- </Vr>
129
- </>},Ae=Br.create({imageContainer:{position:"relative"},image:{backgroundColor:"#f0f0f0"},imageOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"transparent"},errorContainer:{justifyContent:"center",alignItems:"center",borderWidth:1,borderColor:"#e0e0e0"},errorText:{textAlign:"center",fontWeight:"500"},modalContainer:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.9)",justifyContent:"center",alignItems:"center"},modalContent:{justifyContent:"center",alignItems:"center"},modalImage:{backgroundColor:"transparent"}}),Lt=Er;import{View as So,Text as $s,StyleSheet as jr}from"react-native";import{Trash2 as Or}from"lucide-react-native";var Fr=({isMe:M,timestamp:S,senderName:C})=>{let R=K();return<So style={[et.container,{alignSelf:M?"flex-end":"flex-start",maxWidth:"80%"}]}>
130
- <So style={[et.messageBubble,{backgroundColor:R.colors.gray[100],borderColor:R.colors.gray[200]}]}>
131
- <So style={et.content}>
132
- <Or size={16}color={R.colors.gray[500]}/>
133
- <$s style={[et.deletedText,{color:R.colors.gray[500]}]}>
118
+ </Rr>
119
+ </>},Ae=Tr.create({imageContainer:{position:"relative"},image:{backgroundColor:"#f0f0f0"},imageOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"transparent"},errorContainer:{justifyContent:"center",alignItems:"center",borderWidth:1,borderColor:"#e0e0e0"},errorText:{textAlign:"center",fontWeight:"500"},modalContainer:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.9)",justifyContent:"center",alignItems:"center"},modalContent:{justifyContent:"center",alignItems:"center"},modalImage:{backgroundColor:"transparent"}}),Zt=vr;import{View as Mo,Text as $s,StyleSheet as Pr}from"react-native";import{Trash2 as Ar}from"lucide-react-native";var zr=({isMe:M,timestamp:S,senderName:C})=>{let R=q();return<Mo style={[Je.container,{alignSelf:M?"flex-end":"flex-start",maxWidth:"80%"}]}>
120
+ <Mo style={[Je.messageBubble,{backgroundColor:R.colors.gray[100],borderColor:R.colors.gray[200]}]}>
121
+ <Mo style={Je.content}>
122
+ <Ar size={16}color={R.colors.gray[500]}/>
123
+ <$s style={[Je.deletedText,{color:R.colors.gray[500]}]}>
134
124
  This message was deleted
135
125
  </$s>
136
- </So>
137
- </So>
138
- <So style={[et.metadata,{alignSelf:M?"flex-end":"flex-start"}]}>
139
- <$s style={[et.timestamp,{color:R.colors.gray[400]}]}>
126
+ </Mo>
127
+ </Mo>
128
+ <Mo style={[Je.metadata,{alignSelf:M?"flex-end":"flex-start"}]}>
129
+ <$s style={[Je.timestamp,{color:R.colors.gray[400]}]}>
140
130
  {S}
141
131
  </$s>
142
- </So>
143
- </So>},et=jr.create({container:{marginVertical:4,marginHorizontal:15},messageBubble:{borderRadius:18,paddingHorizontal:16,paddingVertical:12,borderWidth:1,borderStyle:"dashed"},content:{flexDirection:"row",alignItems:"center",justifyContent:"center"},deletedText:{fontSize:14,fontStyle:"italic",marginLeft:8},metadata:{marginTop:4,paddingHorizontal:4},timestamp:{fontSize:11}}),Et=Fr;var Ur=({message:M,onLongPress:S,onReactionPress:C})=>{let R=K(),T=Hr(null),A=()=>{T.current?T.current.measureInWindow((P,E,v,V)=>{let D={x:Math.round(P),y:Math.round(E),width:Math.round(v),height:Math.round(V)};S?.(M,D)}):S?.(M)},I=()=>{M.reactions&&M.reactions.length>0&&C?.(M)},z=M.type==="image"&&M.imageData;return M.deleted?<Et isMe={M.isMe}timestamp={_o(M.timestamp)}senderName={M.senderName}/>:<Ot style={{marginBottom:R.spacing.md,alignItems:M.isMe?"flex-end":"flex-start",marginHorizontal:R.spacing.sm}}>
144
- <Nr ref={T}onLongPress={A}delayLongPress={500}style={{maxWidth:z?"75%":"80%",borderRadius:z?R.borderRadius.lg:R.borderRadius.xl,borderBottomRightRadius:M.isMe?4:z?R.borderRadius.lg:R.borderRadius.xl,borderBottomLeftRadius:M.isMe?z?R.borderRadius.lg:R.borderRadius.xl:4,paddingHorizontal:z?0:R.spacing.lg,paddingVertical:z?0:R.spacing.md,backgroundColor:z?"transparent":M.isMe?R.colors.messageBubble.sent:R.colors.messageBubble.received,overflow:"hidden"}}>
145
- {M.replyTo&&<$e replyTo={M.replyTo}isMyMessage={M.isMe}/>}
132
+ </Mo>
133
+ </Mo>},Je=Pr.create({container:{marginVertical:4,marginHorizontal:15},messageBubble:{borderRadius:18,paddingHorizontal:16,paddingVertical:12,borderWidth:1,borderStyle:"dashed"},content:{flexDirection:"row",alignItems:"center",justifyContent:"center"},deletedText:{fontSize:14,fontStyle:"italic",marginLeft:8},metadata:{marginTop:4,paddingHorizontal:4},timestamp:{fontSize:11}}),Co=zr;var kr=({message:M,onLongPress:S,onReactionPress:C})=>{let R=q(),T=Br(null),A=()=>{T.current?T.current.measureInWindow((z,j,v,B)=>{let V={x:Math.round(z),y:Math.round(j),width:Math.round(v),height:Math.round(B)};S?.(M,V)}):S?.(M)},I=()=>{M.reactions&&M.reactions.length>0&&C?.(M)},P=M.type==="image"&&M.imageData;return M.deleted?<Co isMe={M.isMe}timestamp={Uo(M.timestamp)}senderName={M.senderName}/>:<Lt style={{marginBottom:R.spacing.md,alignItems:M.isMe?"flex-end":"flex-start",marginHorizontal:R.spacing.sm}}>
134
+ <Vr ref={T}onLongPress={A}delayLongPress={500}style={{maxWidth:P?"75%":"80%",borderRadius:P?R.borderRadius.lg:R.borderRadius.xl,borderBottomRightRadius:M.isMe?4:P?R.borderRadius.lg:R.borderRadius.xl,borderBottomLeftRadius:M.isMe?P?R.borderRadius.lg:R.borderRadius.xl:4,paddingHorizontal:P?0:R.spacing.lg,paddingVertical:P?0:R.spacing.md,backgroundColor:P?"transparent":M.isMe?R.colors.messageBubble.sent:R.colors.messageBubble.received,overflow:"hidden"}}>
135
+ {M.replyTo&&<_e replyTo={M.replyTo}isMyMessage={M.isMe}/>}
146
136
 
147
- {z?<Lt imageData={M.imageData}isMe={M.isMe}onLongPress={A}/>:<Ve style={{fontSize:R.typography.fontSize.base,color:M.isMe?R.colors.messageBubble.sentText:R.colors.messageBubble.receivedText}}>
137
+ {P?<Zt imageData={M.imageData}isMe={M.isMe}onLongPress={A}/>:<Be style={{fontSize:R.typography.fontSize.base,color:M.isMe?R.colors.messageBubble.sentText:R.colors.messageBubble.receivedText}}>
148
138
  {M.text}
149
- </Ve>}
139
+ </Be>}
150
140
 
151
141
  {}
152
- {z&&M.text&&M.text.trim()&&<Ot style={{paddingHorizontal:R.spacing.lg,paddingVertical:R.spacing.md,backgroundColor:M.isMe?R.colors.messageBubble.sent:R.colors.messageBubble.received,borderRadius:R.borderRadius.lg,marginTop:R.spacing.xs}}>
153
- <Ve style={{fontSize:R.typography.fontSize.base,color:M.isMe?R.colors.messageBubble.sentText:R.colors.messageBubble.receivedText}}>
142
+ {P&&M.text&&M.text.trim()&&<Lt style={{paddingHorizontal:R.spacing.lg,paddingVertical:R.spacing.md,backgroundColor:M.isMe?R.colors.messageBubble.sent:R.colors.messageBubble.received,borderRadius:R.borderRadius.lg,marginTop:R.spacing.xs}}>
143
+ <Be style={{fontSize:R.typography.fontSize.base,color:M.isMe?R.colors.messageBubble.sentText:R.colors.messageBubble.receivedText}}>
154
144
  {M.text}
155
- </Ve>
156
- </Ot>}
157
- </Nr>
145
+ </Be>
146
+ </Lt>}
147
+ </Vr>
158
148
 
159
149
  {}
160
- {M.reactions&&M.reactions.length>0&&<Wr onPress={I}style={{marginTop:R.spacing.xs,flexDirection:"row",alignItems:"center",backgroundColor:R.colors.background,borderRadius:R.borderRadius.full,justifyContent:M.isMe?"flex-end":"flex-start"}}>
161
- {M.reactions.map((P,E)=><Ot key={`${P.emoji}-${E}`}style={{flexDirection:"row",alignItems:"center",padding:R.spacing.xs}}>
162
- <Ve style={{fontSize:R.typography.fontSize.sm}}>
163
- {P.emoji}
164
- </Ve>
165
- {P.count>1&&<Ve style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary,marginLeft:R.spacing.xs,fontWeight:R.typography.fontWeight.medium}}>
166
- {P.count}
167
- </Ve>}
168
- </Ot>)}
169
- </Wr>}
150
+ {M.reactions&&M.reactions.length>0&&<Dr onPress={I}style={{marginTop:R.spacing.xs,flexDirection:"row",alignItems:"center",backgroundColor:R.colors.background,borderRadius:R.borderRadius.full,justifyContent:M.isMe?"flex-end":"flex-start"}}>
151
+ {M.reactions.map((z,j)=><Lt key={`${z.emoji}-${j}`}style={{flexDirection:"row",alignItems:"center",padding:R.spacing.xs}}>
152
+ <Be style={{fontSize:R.typography.fontSize.sm}}>
153
+ {z.emoji}
154
+ </Be>
155
+ {z.count>1&&<Be style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary,marginLeft:R.spacing.xs,fontWeight:R.typography.fontWeight.medium}}>
156
+ {z.count}
157
+ </Be>}
158
+ </Lt>)}
159
+ </Dr>}
170
160
 
171
- <Ot style={{marginHorizontal:R.spacing.sm,marginTop:R.spacing.xs,flexDirection:"row",alignItems:"center",justifyContent:M.isMe?"flex-end":"flex-start"}}>
172
- <Ve style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary}}>
173
- {_o(M.timestamp)}
174
- </Ve>
175
- {M.isMe&&M.status&&<Ot style={{marginLeft:R.spacing.xs}}>
176
- {M.status==="sent"&&<Ve style={{fontSize:R.typography.fontSize.xs,color:R.colors.gray[400]}}>
161
+ <Lt style={{marginHorizontal:R.spacing.sm,marginTop:R.spacing.xs,flexDirection:"row",alignItems:"center",justifyContent:M.isMe?"flex-end":"flex-start"}}>
162
+ <Be style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary}}>
163
+ {Uo(M.timestamp)}
164
+ </Be>
165
+ {M.isMe&&M.status&&<Lt style={{marginLeft:R.spacing.xs}}>
166
+ {M.status==="sent"&&<Be style={{fontSize:R.typography.fontSize.xs,color:R.colors.gray[400]}}>
177
167
 
178
- </Ve>}
179
- {M.status==="delivered"&&<Ve style={{fontSize:R.typography.fontSize.xs,color:R.colors.gray[400]}}>
168
+ </Be>}
169
+ {M.status==="delivered"&&<Be style={{fontSize:R.typography.fontSize.xs,color:R.colors.gray[400]}}>
180
170
  ✓✓
181
- </Ve>}
182
- {M.status==="read"&&<Ve style={{fontSize:R.typography.fontSize.xs,color:R.colors.primary}}>
171
+ </Be>}
172
+ {M.status==="read"&&<Be style={{fontSize:R.typography.fontSize.xs,color:R.colors.primary}}>
183
173
  ✓✓
184
- </Ve>}
185
- </Ot>}
186
- </Ot>
187
- </Ot>},Ft=Ur;import{View as Ce,Text as Mt,TouchableOpacity as Kr,Image as $r}from"react-native";import{X as Yr}from"lucide-react-native";var _r=({replyToMessage:M,onCancel:S})=>{let C=K(),R=(I,z=50)=>I.length<=z?I:I.substring(0,z)+"...",T=!!M.replyTo,A=M.type==="image"&&M.imageData;return<Ce style={{borderBottomWidth:1,borderBottomColor:C.colors.border,backgroundColor:C.colors.surface,paddingHorizontal:C.spacing.lg,paddingVertical:C.spacing.md}}>
174
+ </Be>}
175
+ </Lt>}
176
+ </Lt>
177
+ </Lt>},Ro=kr;import{View as Ce,Text as Xe,TouchableOpacity as Lr,Image as Er}from"react-native";import{X as Or}from"lucide-react-native";var Hr=({replyToMessage:M,onCancel:S})=>{let C=q(),R=(I,P=50)=>I.length<=P?I:I.substring(0,P)+"...",T=!!M.replyTo,A=M.type==="image"&&M.imageData;return<Ce style={{borderBottomWidth:1,borderBottomColor:C.colors.border,backgroundColor:C.colors.surface,paddingHorizontal:C.spacing.lg,paddingVertical:C.spacing.md}}>
188
178
  <Ce style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
189
179
  <Ce style={{flex:1,marginRight:C.spacing.md}}>
190
180
  <Ce style={{flexDirection:"row",alignItems:"center",marginBottom:C.spacing.xs}}>
191
181
  <Ce style={{width:4,backgroundColor:C.colors.primary,borderRadius:C.borderRadius.full,marginRight:C.spacing.md,height:T?48:32}}/>
192
182
  <Ce style={{flex:1}}>
193
- <Mt style={{fontSize:C.typography.fontSize.xs,fontWeight:C.typography.fontWeight.medium,color:C.colors.primary,marginBottom:C.spacing.xs}}>
183
+ <Xe style={{fontSize:C.typography.fontSize.xs,fontWeight:C.typography.fontWeight.medium,color:C.colors.primary,marginBottom:C.spacing.xs}}>
194
184
  Replying to {M.isMe?"yourself":M.senderName||"sender"}
195
185
  {T&&" (reply thread)"}
196
- </Mt>
186
+ </Xe>
197
187
 
198
188
  {}
199
189
  {T&&<Ce style={{marginBottom:C.spacing.sm,padding:C.spacing.sm,backgroundColor:C.colors.surfaceSecondary,borderRadius:C.borderRadius.md,borderLeftWidth:2,borderLeftColor:C.colors.gray[300]}}>
200
- <Mt style={{fontSize:C.typography.fontSize.xs,color:C.colors.textSecondary,marginBottom:C.spacing.xs}}>
190
+ <Xe style={{fontSize:C.typography.fontSize.xs,color:C.colors.textSecondary,marginBottom:C.spacing.xs}}>
201
191
  Originally replying to: {M.replyTo.isMe?"yourself":M.replyTo.senderName||"sender"}
202
- </Mt>
203
- <Mt style={{fontSize:C.typography.fontSize.xs,color:C.colors.textSecondary,lineHeight:C.typography.lineHeight.tight}}>
192
+ </Xe>
193
+ <Xe style={{fontSize:C.typography.fontSize.xs,color:C.colors.textSecondary,lineHeight:C.typography.lineHeight.tight}}>
204
194
  {R(M.replyTo.text,40)}
205
- </Mt>
195
+ </Xe>
206
196
  </Ce>}
207
197
 
208
198
  {A?<Ce style={{flexDirection:"row",alignItems:"center"}}>
209
- <$r source={{uri:M.imageData.uri}}style={{width:32,height:32,borderRadius:C.borderRadius.sm,marginRight:C.spacing.sm}}resizeMode="cover"/>
199
+ <Er source={{uri:M.imageData.uri}}style={{width:32,height:32,borderRadius:C.borderRadius.sm,marginRight:C.spacing.sm}}resizeMode="cover"/>
210
200
  <Ce style={{flex:1}}>
211
- <Mt style={{fontSize:C.typography.fontSize.xs,color:C.colors.gray[600],fontStyle:"italic",marginBottom:C.spacing.xs}}>
201
+ <Xe style={{fontSize:C.typography.fontSize.xs,color:C.colors.gray[600],fontStyle:"italic",marginBottom:C.spacing.xs}}>
212
202
  📷 Image
213
- </Mt>
214
- {M.text&&M.text.trim()&&<Mt style={{fontSize:C.typography.fontSize.sm,color:C.colors.gray[700],lineHeight:C.typography.lineHeight.tight}}>
203
+ </Xe>
204
+ {M.text&&M.text.trim()&&<Xe style={{fontSize:C.typography.fontSize.sm,color:C.colors.gray[700],lineHeight:C.typography.lineHeight.tight}}>
215
205
  {R(M.text,40)}
216
- </Mt>}
206
+ </Xe>}
217
207
  </Ce>
218
- </Ce>:<Mt style={{fontSize:C.typography.fontSize.sm,color:C.colors.gray[700],lineHeight:C.typography.lineHeight.tight}}>
208
+ </Ce>:<Xe style={{fontSize:C.typography.fontSize.sm,color:C.colors.gray[700],lineHeight:C.typography.lineHeight.tight}}>
219
209
  {R(M.text)}
220
- </Mt>}
210
+ </Xe>}
221
211
  </Ce>
222
212
  </Ce>
223
213
  </Ce>
224
214
 
225
- <Kr onPress={S}style={{height:32,width:32,alignItems:"center",justifyContent:"center",borderRadius:C.borderRadius.full,backgroundColor:C.colors.gray[200]}}hitSlop={{top:8,bottom:8,left:8,right:8}}>
226
- <Yr size={16}color={C.colors.textSecondary}/>
227
- </Kr>
215
+ <Lr onPress={S}style={{height:32,width:32,alignItems:"center",justifyContent:"center",borderRadius:C.borderRadius.full,backgroundColor:C.colors.gray[200]}}hitSlop={{top:8,bottom:8,left:8,right:8}}>
216
+ <Or size={16}color={C.colors.textSecondary}/>
217
+ </Lr>
228
218
  </Ce>
229
- </Ce>},Ye=_r;import{useRef as De,useState as Ys,useEffect as Zo}from"react";import{View as Ht,Text as St,TouchableOpacity as Rt,StyleSheet as Xo,Pressable as Zr,ScrollView as Ma,Dimensions as Ca,Animated as me,Image as Ra}from"react-native";import{Reply as Sa,Copy as Ta,Plus as Ia,Trash2 as Pa}from"lucide-react-native";import{useState as Gr,useEffect as Jr}from"react";import Xr from"rn-emoji-keyboard";var Qr=({visible:M,onClose:S,onEmojiSelected:C})=>{let[R,T]=Gr(!1);Jr(()=>{T(!!M)},[M]);let A=z=>{console.log("Selected emoji:",z),C(z.emoji),T(!1),S()},I=()=>{T(!1),S()};return M?<Xr onEmojiSelected={A}open={R}onClose={I}enableSearchBar/>:null},_e=Qr;var Aa=({visible:M,onPress:S,children:C})=>M?<Ht style={se.overlay}>
230
- <Rt style={se.backdrop}onPress={S}activeOpacity={1}/>
219
+ </Ce>},Et=Hr;import{useRef as Ve,useState as Ys,useEffect as Go}from"react";import{View as Ot,Text as Ct,TouchableOpacity as Mt,StyleSheet as $o,Pressable as Kr,ScrollView as $r,Dimensions as Yr,Animated as ue,Image as Gr}from"react-native";import{Reply as _r,Copy as Jr,Plus as Xr,Trash2 as Qr}from"lucide-react-native";import{useState as Fr,useEffect as Nr}from"react";import Wr from"rn-emoji-keyboard";var Ur=({visible:M,onClose:S,onEmojiSelected:C})=>{let[R,T]=Fr(!1);Nr(()=>{T(!!M)},[M]);let A=P=>{console.log("Selected emoji:",P),C(P.emoji),T(!1),S()},I=()=>{T(!1),S()};return M?<Wr onEmojiSelected={A}open={R}onClose={I}enableSearchBar/>:null},Qe=Ur;var Zr=({visible:M,onPress:S,children:C})=>M?<Ot style={oe.overlay}>
220
+ <Mt style={oe.backdrop}onPress={S}activeOpacity={1}/>
231
221
  {C}
232
- </Ht>:null,{width:Ct,height:Qo}=Ca.get("window"),Va=({message:M,positions:S,messagePosition:C,containerRef:R,containerOffset:T,setContainerOffset:A})=>{let I=K(),z=De(new me.Value(C.y)).current,P=De(new me.Value(0)).current,E=De(!1),v=M.type==="image"&&M.imageData;return Zo(()=>{E.current=!1,R.current&&R.current.measureInWindow((V,D,B,k)=>{A({x:V,y:D});let L=C.y-D,O=S.messagePreviewTop-D;z.setValue(L),P.setValue(0),requestAnimationFrame(()=>{me.parallel([me.timing(z,{toValue:O,duration:250,useNativeDriver:!1}),me.timing(P,{toValue:1,duration:250,useNativeDriver:!1})]).start(()=>{E.current=!0})})})},[S.messagePreviewTop,C.y,R]),<me.View style={{position:"absolute",top:z,left:C.x,width:C.width,height:M.replyTo?C.height+10:C.height,zIndex:1e3,opacity:P,maxWidth:v?"75%":"80%",borderRadius:v?I.borderRadius.lg:I.borderRadius.xl,paddingHorizontal:v?0:I.spacing.lg,paddingVertical:v?0:I.spacing.md,backgroundColor:v?"transparent":M.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,overflow:"hidden"}}>
233
- {M.replyTo&&<$e replyTo={M.replyTo}isMyMessage={M.isMe}/>}
222
+ </Ot>:null,{width:Ze,height:Yo}=Yr.get("window"),Ma=({message:M,positions:S,messagePosition:C,containerRef:R,containerOffset:T,setContainerOffset:A})=>{let I=q(),P=Ve(new ue.Value(C.y)).current,z=Ve(new ue.Value(0)).current,j=Ve(!1),v=M.type==="image"&&M.imageData;return Go(()=>{j.current=!1,R.current&&R.current.measureInWindow((B,V,D,k)=>{A({x:B,y:V});let L=C.y-V,O=S.messagePreviewTop-V;P.setValue(L),z.setValue(0),requestAnimationFrame(()=>{ue.parallel([ue.timing(P,{toValue:O,duration:250,useNativeDriver:!1}),ue.timing(z,{toValue:1,duration:250,useNativeDriver:!1})]).start(()=>{j.current=!0})})})},[S.messagePreviewTop,C.y,R]),<ue.View style={{position:"absolute",top:P,left:C.x,width:C.width,height:M.replyTo?C.height+10:C.height,zIndex:1e3,opacity:z,maxWidth:v?"75%":"80%",borderRadius:v?I.borderRadius.lg:I.borderRadius.xl,paddingHorizontal:v?0:I.spacing.lg,paddingVertical:v?0:I.spacing.md,backgroundColor:v?"transparent":M.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,overflow:"hidden"}}>
223
+ {M.replyTo&&<_e replyTo={M.replyTo}isMyMessage={M.isMe}/>}
234
224
 
235
- {v?<Ht>
236
- <Ra source={{uri:M.imageData.uri}}style={{width:C.width,height:C.height,borderRadius:I.borderRadius.lg}}resizeMode='cover'/>
225
+ {v?<Ot>
226
+ <Gr source={{uri:M.imageData.uri}}style={{width:C.width,height:C.height,borderRadius:I.borderRadius.lg}}resizeMode='cover'/>
237
227
  {}
238
- {M.text&&M.text.trim()&&<Ht style={{paddingHorizontal:I.spacing.lg,paddingVertical:I.spacing.md,backgroundColor:M.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,borderRadius:I.borderRadius.lg,marginTop:I.spacing.xs}}>
239
- <St style={{fontSize:I.typography.fontSize.base,color:M.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
228
+ {M.text&&M.text.trim()&&<Ot style={{paddingHorizontal:I.spacing.lg,paddingVertical:I.spacing.md,backgroundColor:M.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,borderRadius:I.borderRadius.lg,marginTop:I.spacing.xs}}>
229
+ <Ct style={{fontSize:I.typography.fontSize.base,color:M.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
240
230
  {M.text}
241
- </St>
242
- </Ht>}
243
- </Ht>:<St style={{fontSize:I.typography.fontSize.base,color:M.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
231
+ </Ct>
232
+ </Ot>}
233
+ </Ot>:<Ct style={{fontSize:I.typography.fontSize.base,color:M.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
244
234
  {M.text}
245
- </St>}
246
- </me.View>},Da=({visible:M,onClose:S,isMyMessage:C,selectedMessage:R,messagePosition:T,onActionPress:A,onEmojiReact:I})=>{let[z,P]=Ys(!1),E=De(null),[v,V]=Ys({x:0,y:0}),D=De(new me.Value(0)).current,B=De(new me.Value(0)).current,k=De(!1),L=De(!1),O=X=>{A(X),S()},F=X=>{I?.(X),S()},H=()=>{P(!0)},N=()=>{P(!1)},j=X=>{I?.(X),P(!1),S()},J=["\u2764\uFE0F","\u{1F602}","\u{1F62E}","\u{1F622}","\u{1F621}","\u{1F44D}"],Y=(()=>{if(!T)return{emojiBar:{top:Qo/2-200,left:Ct/2-160},actionMenu:{top:Qo/2+50,left:Ct/2-100}};let X=320,le=60,ge=200,ne=160,Q=20,W=8,ce,xe,fe,re,pe,be=Qo/2,Z=le+W+T.height+W+ne,Ie=be-Z/2;return xe=Ie,pe=Ie+le+W,re=Ie+le+W+T.height+W,ce=T.x,fe=T.x,ce+X>Ct-Q&&(ce=Ct-X-Q),ce<Q&&(ce=Q),fe+ge>Ct-Q&&(fe=Ct-ge-Q),fe<Q&&(fe=Q),{emojiBar:{top:xe,left:ce},actionMenu:{top:re,left:fe},messagePreviewTop:pe,isNearAverageHeight:!0,isNearTop:!0,isEdgeCase:!0}})();return Zo(()=>{M&&T&&!L.current&&(D.setValue(0),B.setValue(0),setTimeout(()=>{me.sequence([me.timing(D,{toValue:1,duration:200,useNativeDriver:!1}),me.timing(B,{toValue:1,duration:200,useNativeDriver:!1})]).start(()=>{L.current=!0})},50))},[M,T,D,B]),Zo(()=>{M||(k.current=!1,L.current=!1,D.setValue(0),B.setValue(0))},[M,D,B]),M?<>
235
+ </Ct>}
236
+ </ue.View>},Ca=({visible:M,onClose:S,isMyMessage:C,selectedMessage:R,messagePosition:T,onActionPress:A,onEmojiReact:I})=>{let[P,z]=Ys(!1),j=Ve(null),[v,B]=Ys({x:0,y:0}),V=Ve(new ue.Value(0)).current,D=Ve(new ue.Value(0)).current,k=Ve(!1),L=Ve(!1),O=X=>{A(X),S()},H=X=>{I?.(X),S()},F=()=>{z(!0)},N=()=>{z(!1)},E=X=>{I?.(X),z(!1),S()},J=["\u2764\uFE0F","\u{1F602}","\u{1F62E}","\u{1F622}","\u{1F621}","\u{1F44D}"],Y=(()=>{if(!T)return{emojiBar:{top:Yo/2-200,left:Ze/2-160},actionMenu:{top:Yo/2+50,left:Ze/2-100}};let X=320,le=60,me=200,se=160,Q=20,W=8,ce,ye,he,ne,ge,xe=Yo/2,Z=le+W+T.height+W+se,Te=xe-Z/2;return ye=Te,ge=Te+le+W,ne=Te+le+W+T.height+W,ce=T.x,he=T.x,ce+X>Ze-Q&&(ce=Ze-X-Q),ce<Q&&(ce=Q),he+me>Ze-Q&&(he=Ze-me-Q),he<Q&&(he=Q),{emojiBar:{top:ye,left:ce},actionMenu:{top:ne,left:he},messagePreviewTop:ge,isNearAverageHeight:!0,isNearTop:!0,isEdgeCase:!0}})();return Go(()=>{M&&T&&!L.current&&(V.setValue(0),D.setValue(0),setTimeout(()=>{ue.sequence([ue.timing(V,{toValue:1,duration:200,useNativeDriver:!1}),ue.timing(D,{toValue:1,duration:200,useNativeDriver:!1})]).start(()=>{L.current=!0})},50))},[M,T,V,D]),Go(()=>{M||(k.current=!1,L.current=!1,V.setValue(0),D.setValue(0))},[M,V,D]),M?<>
247
237
  {}
248
- <Aa visible={!0}onPress={S}>
249
- <Zr style={se.overlayPressable}onPress={S}/>
250
- </Aa>
238
+ <Zr visible={!0}onPress={S}>
239
+ <Kr style={oe.overlayPressable}onPress={S}/>
240
+ </Zr>
251
241
 
252
- <Ht ref={E}style={{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"}}>
242
+ <Ot ref={j}style={{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"}}>
253
243
  {}
254
- </Ht>
244
+ </Ot>
255
245
 
256
246
  {}
257
- {T&&R&&<Va message={R}positions={Y}messagePosition={T}containerRef={E}containerOffset={v}setContainerOffset={V}/>}
247
+ {T&&R&&<Ma message={R}positions={Y}messagePosition={T}containerRef={j}containerOffset={v}setContainerOffset={B}/>}
258
248
 
259
249
  {}
260
- <me.View style={[se.emojiBar,{position:"absolute",top:Y.emojiBar.top-(v.y||0),left:Y.emojiBar.left,opacity:D,pointerEvents:"auto"}]}>
261
- <Ma horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={se.emojiContainer}>
262
- {J.map((X,le)=><Rt key={le}style={se.emojiButton}onPress={()=>F(X)}>
263
- <St style={se.emojiText}>{X}</St>
264
- </Rt>)}
265
- <Rt style={se.addEmojiButton}onPress={H}>
266
- <Ia size={20}color='#666'/>
267
- </Rt>
268
- </Ma>
269
- </me.View>
250
+ <ue.View style={[oe.emojiBar,{position:"absolute",top:Y.emojiBar.top-(v.y||0),left:Y.emojiBar.left,opacity:V,pointerEvents:"auto"}]}>
251
+ <$r horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={oe.emojiContainer}>
252
+ {J.map((X,le)=><Mt key={le}style={oe.emojiButton}onPress={()=>H(X)}>
253
+ <Ct style={oe.emojiText}>{X}</Ct>
254
+ </Mt>)}
255
+ <Mt style={oe.addEmojiButton}onPress={F}>
256
+ <Xr size={20}color='#666'/>
257
+ </Mt>
258
+ </$r>
259
+ </ue.View>
270
260
 
271
261
  {}
272
- <me.View style={[se.actionMenu,{position:"absolute",top:Y.actionMenu.top-(v.y||0)+(R?.replyTo?10:0),left:Y.actionMenu.left,opacity:B,pointerEvents:"auto"}]}>
273
- <Ht style={se.actionItems}>
262
+ <ue.View style={[oe.actionMenu,{position:"absolute",top:Y.actionMenu.top-(v.y||0)+(R?.replyTo?10:0),left:Y.actionMenu.left,opacity:D,pointerEvents:"auto"}]}>
263
+ <Ot style={oe.actionItems}>
274
264
  {}
275
- <Rt style={se.actionRow}onPress={()=>O("reply")}>
276
- <Sa size={18}color='#333'/>
277
- <St style={se.actionLabel}>Reply</St>
278
- </Rt>
265
+ <Mt style={oe.actionRow}onPress={()=>O("reply")}>
266
+ <_r size={18}color='#333'/>
267
+ <Ct style={oe.actionLabel}>Reply</Ct>
268
+ </Mt>
279
269
 
280
270
  {}
281
- <Rt style={se.actionRow}onPress={()=>O("copy")}>
282
- <Ta size={18}color='#333'/>
283
- <St style={se.actionLabel}>Copy</St>
284
- </Rt>
271
+ <Mt style={oe.actionRow}onPress={()=>O("copy")}>
272
+ <Jr size={18}color='#333'/>
273
+ <Ct style={oe.actionLabel}>Copy</Ct>
274
+ </Mt>
285
275
 
286
276
  {}
287
- {C&&<Rt style={se.actionRow}onPress={()=>O("delete")}>
288
- <Pa size={18}color='#ff4444'/>
289
- <St style={[se.actionLabel,{color:"#ff4444"}]}>
277
+ {C&&<Mt style={oe.actionRow}onPress={()=>O("delete")}>
278
+ <Qr size={18}color='#ff4444'/>
279
+ <Ct style={[oe.actionLabel,{color:"#ff4444"}]}>
290
280
  Delete
291
- </St>
292
- </Rt>}
293
- </Ht>
294
- </me.View>
281
+ </Ct>
282
+ </Mt>}
283
+ </Ot>
284
+ </ue.View>
295
285
 
296
286
  {}
297
- <_e visible={z}onClose={N}onEmojiSelected={j}/>
298
- </>:null},se=Xo.create({spotlightOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0},overlayPressable:{flex:1,backgroundColor:"transparent"},emojiBar:{backgroundColor:"white",borderRadius:25,paddingHorizontal:12,paddingVertical:8,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.25,shadowRadius:12,elevation:12,zIndex:1001,maxWidth:320},emojiContainer:{flexDirection:"row",alignItems:"center",paddingHorizontal:4},emojiButton:{width:36,height:36,borderRadius:18,backgroundColor:"#f8f9fa",justifyContent:"center",alignItems:"center",marginHorizontal:3},emojiText:{fontSize:18},addEmojiButton:{width:36,height:36,borderRadius:18,backgroundColor:"#f8f9fa",justifyContent:"center",alignItems:"center",marginHorizontal:3},actionMenu:{backgroundColor:"white",borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.25,shadowRadius:12,elevation:12,zIndex:1001,minWidth:160,maxWidth:200},actionItems:{paddingVertical:4},actionRow:{flexDirection:"row",alignItems:"center",paddingVertical:12,paddingHorizontal:16,minHeight:44},actionLabel:{fontSize:15,color:"#333",marginLeft:12,fontWeight:"500"},hiddenEmojiInput:{position:"absolute",left:-9999,opacity:0,height:0,width:0},overlay:{...Xo.absoluteFillObject,zIndex:1e3},backdrop:{...Xo.absoluteFillObject,backgroundColor:"rgba(0, 0, 0, 0.8)"}}),Nt=Da;import{useRef as Ba,useEffect as ka,useState as La}from"react";import{View as Be,Text as Re,TouchableOpacity as _s,ScrollView as Ea,StyleSheet as ja}from"react-native";import Oa from"react-native-actions-sheet";var Fa=({visible:M,onClose:S,reactions:C,messageText:R,onAddReaction:T,onRemoveReaction:A})=>{let I=Ba(null),[z,P]=La(!1);ka(()=>{M?I.current?.show():I.current?.hide()},[M]);let v=(()=>{let F=[];return C.forEach(H=>{let N=[{id:"1",name:"You",avatar:"\u{1F464}"},{id:"2",name:"Anna",avatar:"\u{1F469}"},{id:"3",name:"Young Beetle",avatar:"\u{1F697}"},{id:"4",name:"Lele",avatar:"\u{1F3AD}"},{id:"5",name:"Needle",avatar:"\u{1F3E0}"}];for(let j=0;j<Math.min(H.count,N.length);j++)F.push({id:`${H.emoji}-${j}`,name:N[j].name,avatar:N[j].avatar,emoji:H.emoji,timestamp:new Date().toISOString()})}),F})(),V=C.reduce((F,H)=>F+H.count,0),D=F=>{console.log("Remove reaction called with:",F),console.log("onRemoveReaction prop exists:",!!A),console.log("User is current user:",F.name==="You"),F.name==="You"&&A?(console.log("Calling onRemoveReaction with emoji:",F.emoji),A(F.emoji)):console.log("Not calling onRemoveReaction because:",{isCurrentUser:F.name==="You",hasCallback:!!A})},B=()=>{I.current?.hide(),S(),setTimeout(()=>{P(!0)},300)},k=()=>{P(!1)},L=F=>{console.log("Selected emoji from picker:",F),T?.(F),P(!1),S()},O=()=>{I.current?.hide(),S()};return<>
299
- <Oa ref={I}onClose={O}containerStyle={G.container}headerAlwaysVisible={!0}gestureEnabled={!0}closeOnTouchBackdrop={!0}>
287
+ <Qe visible={P}onClose={N}onEmojiSelected={E}/>
288
+ </>:null},oe=$o.create({spotlightOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0},overlayPressable:{flex:1,backgroundColor:"transparent"},emojiBar:{backgroundColor:"white",borderRadius:25,paddingHorizontal:12,paddingVertical:8,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.25,shadowRadius:12,elevation:12,zIndex:1001,maxWidth:320},emojiContainer:{flexDirection:"row",alignItems:"center",paddingHorizontal:4},emojiButton:{width:36,height:36,borderRadius:18,backgroundColor:"#f8f9fa",justifyContent:"center",alignItems:"center",marginHorizontal:3},emojiText:{fontSize:18},addEmojiButton:{width:36,height:36,borderRadius:18,backgroundColor:"#f8f9fa",justifyContent:"center",alignItems:"center",marginHorizontal:3},actionMenu:{backgroundColor:"white",borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.25,shadowRadius:12,elevation:12,zIndex:1001,minWidth:160,maxWidth:200},actionItems:{paddingVertical:4},actionRow:{flexDirection:"row",alignItems:"center",paddingVertical:12,paddingHorizontal:16,minHeight:44},actionLabel:{fontSize:15,color:"#333",marginLeft:12,fontWeight:"500"},hiddenEmojiInput:{position:"absolute",left:-9999,opacity:0,height:0,width:0},overlay:{...$o.absoluteFillObject,zIndex:1e3},backdrop:{...$o.absoluteFillObject,backgroundColor:"rgba(0, 0, 0, 0.8)"}}),So=Ca;import{useRef as Ra,useEffect as Sa,useState as Ta}from"react";import{View as De,Text as Re,TouchableOpacity as Gs,ScrollView as Ia,StyleSheet as va}from"react-native";import Pa from"react-native-actions-sheet";var Aa=({visible:M,onClose:S,reactions:C,messageText:R,onAddReaction:T,onRemoveReaction:A})=>{let I=Ra(null),[P,z]=Ta(!1);Sa(()=>{M?I.current?.show():I.current?.hide()},[M]);let v=(()=>{let H=[];return C.forEach(F=>{let N=[{id:"1",name:"You",avatar:"\u{1F464}"},{id:"2",name:"Anna",avatar:"\u{1F469}"},{id:"3",name:"Young Beetle",avatar:"\u{1F697}"},{id:"4",name:"Lele",avatar:"\u{1F3AD}"},{id:"5",name:"Needle",avatar:"\u{1F3E0}"}];for(let E=0;E<Math.min(F.count,N.length);E++)H.push({id:`${F.emoji}-${E}`,name:N[E].name,avatar:N[E].avatar,emoji:F.emoji,timestamp:new Date().toISOString()})}),H})(),B=C.reduce((H,F)=>H+F.count,0),V=H=>{console.log("Remove reaction called with:",H),console.log("onRemoveReaction prop exists:",!!A),console.log("User is current user:",H.name==="You"),H.name==="You"&&A?(console.log("Calling onRemoveReaction with emoji:",H.emoji),A(H.emoji)):console.log("Not calling onRemoveReaction because:",{isCurrentUser:H.name==="You",hasCallback:!!A})},D=()=>{I.current?.hide(),S(),setTimeout(()=>{z(!0)},300)},k=()=>{z(!1)},L=H=>{console.log("Selected emoji from picker:",H),T?.(H),z(!1),S()},O=()=>{I.current?.hide(),S()};return<>
289
+ <Pa ref={I}onClose={O}containerStyle={_.container}headerAlwaysVisible={!0}gestureEnabled={!0}closeOnTouchBackdrop={!0}>
300
290
  {}
301
- <Be style={G.header}>
302
- <Re style={G.title}>{V} reactions</Re>
303
- <_s onPress={O}style={G.closeButton}>
304
- <Re style={G.closeText}>✕</Re>
305
- </_s>
306
- </Be>
291
+ <De style={_.header}>
292
+ <Re style={_.title}>{B} reactions</Re>
293
+ <Gs onPress={O}style={_.closeButton}>
294
+ <Re style={_.closeText}>✕</Re>
295
+ </Gs>
296
+ </De>
307
297
 
308
298
  {}
309
- <Be style={G.messagePreview}>
310
- <Re style={G.messageText}numberOfLines={2}>
299
+ <De style={_.messagePreview}>
300
+ <Re style={_.messageText}numberOfLines={2}>
311
301
  {R}
312
302
  </Re>
313
- </Be>
303
+ </De>
314
304
 
315
305
  {}
316
- <Be style={G.reactionButtons}>
306
+ <De style={_.reactionButtons}>
317
307
  {}
318
308
 
319
- {C.map((F,H)=><Be key={H}style={G.reactionButton}>
320
- <Re style={G.reactionEmoji}>{F.emoji}</Re>
321
- <Re style={G.reactionCount}>{F.count}</Re>
322
- </Be>)}
323
- </Be>
309
+ {C.map((H,F)=><De key={F}style={_.reactionButton}>
310
+ <Re style={_.reactionEmoji}>{H.emoji}</Re>
311
+ <Re style={_.reactionCount}>{H.count}</Re>
312
+ </De>)}
313
+ </De>
324
314
 
325
315
  {}
326
- <Ea style={G.userReactionsList}showsVerticalScrollIndicator={!1}>
327
- {v.map(F=>{let H=F.name==="You",N=H?_s:Be;return<N key={F.id}style={[G.userReactionItem,H&&G.tappableUserReactionItem]}onPress={H?()=>D(F):void 0}activeOpacity={H?.7:1}>
328
- <Be style={G.userInfo}>
329
- <Re style={G.userAvatar}>{F.avatar}</Re>
330
- <Be style={G.userDetails}>
331
- <Re style={G.userName}>{F.name}</Re>
332
- {H&&<Re style={G.removeText}>Tap to remove</Re>}
333
- </Be>
334
- </Be>
335
- <Be style={G.userReactionEmoji}>
336
- <Re style={G.emojiText}>{F.emoji}</Re>
337
- </Be>
316
+ <Ia style={_.userReactionsList}showsVerticalScrollIndicator={!1}>
317
+ {v.map(H=>{let F=H.name==="You",N=F?Gs:De;return<N key={H.id}style={[_.userReactionItem,F&&_.tappableUserReactionItem]}onPress={F?()=>V(H):void 0}activeOpacity={F?.7:1}>
318
+ <De style={_.userInfo}>
319
+ <Re style={_.userAvatar}>{H.avatar}</Re>
320
+ <De style={_.userDetails}>
321
+ <Re style={_.userName}>{H.name}</Re>
322
+ {F&&<Re style={_.removeText}>Tap to remove</Re>}
323
+ </De>
324
+ </De>
325
+ <De style={_.userReactionEmoji}>
326
+ <Re style={_.emojiText}>{H.emoji}</Re>
327
+ </De>
338
328
  </N>})}
339
- </Ea>
340
- </Oa>
329
+ </Ia>
330
+ </Pa>
341
331
 
342
332
  {}
343
- <_e visible={z}onClose={k}onEmojiSelected={L}/>
344
- </>},G=ja.create({container:{backgroundColor:"white",borderTopLeftRadius:20,borderTopRightRadius:20,paddingTop:20,paddingBottom:40,maxHeight:"70%"},header:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingHorizontal:20,paddingBottom:15,borderBottomWidth:1,borderBottomColor:"#f0f0f0"},title:{fontSize:18,fontWeight:"600",color:"#333"},closeButton:{padding:5},closeText:{fontSize:18,color:"#666",fontWeight:"500"},messagePreview:{paddingHorizontal:20,paddingVertical:15,borderBottomWidth:1,borderBottomColor:"#f0f0f0"},messageText:{fontSize:14,color:"#666",lineHeight:20},reactionButtons:{flexDirection:"row",paddingHorizontal:20,paddingVertical:15,gap:10},addReactionButton:{flexDirection:"row",alignItems:"center",backgroundColor:"#f8f9fa",borderWidth:1,borderColor:"#e9ecef",borderRadius:20,paddingHorizontal:12,paddingVertical:8},addReactionIcon:{fontSize:16,marginRight:4},addReactionText:{fontSize:14,color:"#666",fontWeight:"500"},reactionButton:{flexDirection:"row",alignItems:"center",backgroundColor:"#28a745",borderRadius:20,paddingHorizontal:12,paddingVertical:8},reactionEmoji:{fontSize:16,marginRight:4},reactionCount:{fontSize:14,color:"white",fontWeight:"600"},userReactionsList:{paddingHorizontal:20,paddingTop:10},userReactionItem:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingVertical:12,borderBottomWidth:1,borderBottomColor:"#f8f9fa"},tappableUserReactionItem:{backgroundColor:"#f8f9fa",borderRadius:8,paddingHorizontal:8,marginVertical:2},userInfo:{flexDirection:"row",alignItems:"center",flex:1},userAvatar:{fontSize:24,marginRight:12},userDetails:{flex:1},userName:{fontSize:16,fontWeight:"500",color:"#333"},removeText:{fontSize:12,color:"#dc3545",marginTop:2,fontWeight:"500"},userReactionEmoji:{backgroundColor:"#f8f9fa",borderRadius:16,paddingHorizontal:8,paddingVertical:4},emojiText:{fontSize:16}}),Wt=Fa;import Ha,{forwardRef as Na,useImperativeHandle as Wa}from"react";import{View as To,Text as Gs,TouchableOpacity as Js}from"react-native";import Ua from"react-native-actions-sheet";import{X as Ka}from"lucide-react-native";var Ge=Na(({onOptionSelect:M,options:S},C)=>{let R=Ha.useRef(null);Wa(C,()=>({show:()=>R.current?.show(),hide:()=>R.current?.hide()}));let T=A=>{M(A),R.current?.hide()};return<Ua ref={R}headerAlwaysVisible gestureEnabled={!0}statusBarTranslucent drawUnderStatusBar={!1}containerStyle={{borderTopLeftRadius:20,borderTopRightRadius:20}}>
345
- <To style={{padding:20,width:"100%"}}>
333
+ <Qe visible={P}onClose={k}onEmojiSelected={L}/>
334
+ </>},_=va.create({container:{backgroundColor:"white",borderTopLeftRadius:20,borderTopRightRadius:20,paddingTop:20,paddingBottom:40,maxHeight:"70%"},header:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingHorizontal:20,paddingBottom:15,borderBottomWidth:1,borderBottomColor:"#f0f0f0"},title:{fontSize:18,fontWeight:"600",color:"#333"},closeButton:{padding:5},closeText:{fontSize:18,color:"#666",fontWeight:"500"},messagePreview:{paddingHorizontal:20,paddingVertical:15,borderBottomWidth:1,borderBottomColor:"#f0f0f0"},messageText:{fontSize:14,color:"#666",lineHeight:20},reactionButtons:{flexDirection:"row",paddingHorizontal:20,paddingVertical:15,gap:10},addReactionButton:{flexDirection:"row",alignItems:"center",backgroundColor:"#f8f9fa",borderWidth:1,borderColor:"#e9ecef",borderRadius:20,paddingHorizontal:12,paddingVertical:8},addReactionIcon:{fontSize:16,marginRight:4},addReactionText:{fontSize:14,color:"#666",fontWeight:"500"},reactionButton:{flexDirection:"row",alignItems:"center",backgroundColor:"#28a745",borderRadius:20,paddingHorizontal:12,paddingVertical:8},reactionEmoji:{fontSize:16,marginRight:4},reactionCount:{fontSize:14,color:"white",fontWeight:"600"},userReactionsList:{paddingHorizontal:20,paddingTop:10},userReactionItem:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingVertical:12,borderBottomWidth:1,borderBottomColor:"#f8f9fa"},tappableUserReactionItem:{backgroundColor:"#f8f9fa",borderRadius:8,paddingHorizontal:8,marginVertical:2},userInfo:{flexDirection:"row",alignItems:"center",flex:1},userAvatar:{fontSize:24,marginRight:12},userDetails:{flex:1},userName:{fontSize:16,fontWeight:"500",color:"#333"},removeText:{fontSize:12,color:"#dc3545",marginTop:2,fontWeight:"500"},userReactionEmoji:{backgroundColor:"#f8f9fa",borderRadius:16,paddingHorizontal:8,paddingVertical:4},emojiText:{fontSize:16}}),To=Aa;import za,{forwardRef as Ba,useImperativeHandle as Va}from"react";import{View as Io,Text as _s,TouchableOpacity as Js}from"react-native";import Da from"react-native-actions-sheet";import{X as La}from"lucide-react-native";var Ke=Ba(({onOptionSelect:M,options:S},C)=>{let R=za.useRef(null);Va(C,()=>({show:()=>R.current?.show(),hide:()=>R.current?.hide()}));let T=A=>{M(A),R.current?.hide()};return<Da ref={R}headerAlwaysVisible gestureEnabled={!0}statusBarTranslucent drawUnderStatusBar={!1}containerStyle={{borderTopLeftRadius:20,borderTopRightRadius:20}}>
335
+ <Io style={{padding:20,width:"100%"}}>
346
336
 
347
337
  {}
348
- <To style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:20}}>
349
- <Gs style={{fontSize:18,fontWeight:"600",color:"#1F2937"}}>
338
+ <Io style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:20}}>
339
+ <_s style={{fontSize:18,fontWeight:"600",color:"#1F2937"}}>
350
340
  Share Content
351
- </Gs>
341
+ </_s>
352
342
  <Js onPress={()=>R.current?.hide()}>
353
- <Ka size={24}color="#6B7280"/>
343
+ <La size={24}color="#6B7280"/>
354
344
  </Js>
355
- </To>
345
+ </Io>
356
346
 
357
347
  {}
358
- <To style={{flexDirection:"row",flexWrap:"wrap",justifyContent:"space-between",paddingBottom:20}}>
348
+ <Io style={{flexDirection:"row",flexWrap:"wrap",justifyContent:"space-between",paddingBottom:20}}>
359
349
  {S.map(A=>{let I=A.icon;return<Js key={A.id}style={{width:"30%",aspectRatio:1,marginBottom:20,alignItems:"center",justifyContent:"center"}}onPress={()=>T(A.id)}>
360
- <To style={{width:60,height:60,borderRadius:30,backgroundColor:"#F3F4F6",alignItems:"center",justifyContent:"center",marginBottom:8}}>
350
+ <Io style={{width:60,height:60,borderRadius:30,backgroundColor:"#F3F4F6",alignItems:"center",justifyContent:"center",marginBottom:8}}>
361
351
  <I size={24}color={A.color}/>
362
- </To>
363
- <Gs style={{fontSize:12,color:"#6B7280",textAlign:"center",fontWeight:"500"}}>
352
+ </Io>
353
+ <_s style={{fontSize:12,color:"#6B7280",textAlign:"center",fontWeight:"500"}}>
364
354
  {A.label}
365
- </Gs>
355
+ </_s>
366
356
  </Js>})}
367
- </To>
368
- </To>
369
- </Ua>});Ge.displayName="AttachmentMenu";import{useEffect as qa,useRef as $a}from"react";import{View as Ms,StyleSheet as Ya,Animated as ke}from"react-native";var _a=({isVisible:M})=>{let S=$a(new ke.Value(0)).current;return qa(()=>{if(!M){S.setValue(0);return}let C=ke.loop(ke.sequence([ke.timing(S,{toValue:1,duration:1200,useNativeDriver:!0}),ke.timing(S,{toValue:0,duration:1200,useNativeDriver:!0})]));return C.start(),()=>{C.stop()}},[M,S]),M?<Ms style={Tt.container}>
370
- <Ms style={Tt.bubble}>
371
- <Ms style={Tt.dotsContainer}>
372
- <ke.View style={[Tt.dot,{opacity:S.interpolate({inputRange:[0,.5,1],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[0,.5,1],outputRange:[0,-4,0]})}]}]}/>
373
- <ke.View style={[Tt.dot,{opacity:S.interpolate({inputRange:[.33,.83,1.33],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[.33,.83,1.33],outputRange:[0,-4,0]})}]}]}/>
374
- <ke.View style={[Tt.dot,{opacity:S.interpolate({inputRange:[.66,1.16,1.66],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[.66,1.16,1.66],outputRange:[0,-4,0]})}]}]}/>
375
- </Ms>
376
- </Ms>
377
- </Ms>:null},Tt=Ya.create({container:{paddingHorizontal:15,paddingVertical:5},bubble:{backgroundColor:"#fff",borderRadius:18,paddingHorizontal:12,paddingVertical:8,alignSelf:"flex-start",maxWidth:"80%"},senderNameContainer:{marginBottom:4},senderName:{fontSize:12,color:"#666",fontWeight:"500"},dotsContainer:{flexDirection:"row",alignItems:"center",justifyContent:"center"},dot:{width:6,height:6,borderRadius:3,backgroundColor:"#999",marginHorizontal:3}}),Ut=_a;import Cs from"react";import{Pressable as Ga,Animated as Rs}from"react-native";import{ChevronDown as Ja}from"lucide-react-native";var Xa=({visible:M,onPress:S,isReplyActive:C=!1})=>{let R=K(),T=Cs.useRef(new Rs.Value(0)).current,[A,I]=Cs.useState(!1);return Cs.useEffect(()=>{Rs.timing(T,{toValue:M?1:0,duration:200,useNativeDriver:!0}).start(()=>{I(M)})},[M,T]),!M&&!A?null:<Ga onPress={S}hitSlop={{top:10,bottom:10,left:10,right:10}}>
378
- {({pressed:z})=><Rs.View style={[{position:"absolute",bottom:40,right:R.spacing.lg,zIndex:9999,width:32,height:32,backgroundColor:R.colors.background,borderRadius:R.borderRadius.xl,justifyContent:"center",alignItems:"center",shadowColor:"#000",shadowOffset:{width:0,height:2},shadowOpacity:.25,shadowRadius:3.84,elevation:5,opacity:T,transform:z?[{scale:.95}]:[]}]}>
379
- <Ja size={20}color={R.colors.text}/>
380
- </Rs.View>}
381
- </Ga>},Kt=Xa;import{View as Xs,Text as Qa}from"react-native";var Za=({displayDate:M})=>{let S=K();return<Xs style={{marginVertical:S.spacing.lg,alignItems:"center"}}>
357
+ </Io>
358
+ </Io>
359
+ </Da>});Ke.displayName="AttachmentMenu";import{useEffect as Ea,useRef as ja}from"react";import{View as _o,StyleSheet as Oa,Animated as ke}from"react-native";var Ha=({isVisible:M})=>{let S=ja(new ke.Value(0)).current;return Ea(()=>{if(!M){S.setValue(0);return}let C=ke.loop(ke.sequence([ke.timing(S,{toValue:1,duration:1200,useNativeDriver:!0}),ke.timing(S,{toValue:0,duration:1200,useNativeDriver:!0})]));return C.start(),()=>{C.stop()}},[M,S]),M?<_o style={Rt.container}>
360
+ <_o style={Rt.bubble}>
361
+ <_o style={Rt.dotsContainer}>
362
+ <ke.View style={[Rt.dot,{opacity:S.interpolate({inputRange:[0,.5,1],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[0,.5,1],outputRange:[0,-4,0]})}]}]}/>
363
+ <ke.View style={[Rt.dot,{opacity:S.interpolate({inputRange:[.33,.83,1.33],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[.33,.83,1.33],outputRange:[0,-4,0]})}]}]}/>
364
+ <ke.View style={[Rt.dot,{opacity:S.interpolate({inputRange:[.66,1.16,1.66],outputRange:[.3,1,.3]}),transform:[{translateY:S.interpolate({inputRange:[.66,1.16,1.66],outputRange:[0,-4,0]})}]}]}/>
365
+ </_o>
366
+ </_o>
367
+ </_o>:null},Rt=Oa.create({container:{paddingHorizontal:15,paddingVertical:5},bubble:{backgroundColor:"#fff",borderRadius:18,paddingHorizontal:12,paddingVertical:8,alignSelf:"flex-start",maxWidth:"80%"},senderNameContainer:{marginBottom:4},senderName:{fontSize:12,color:"#666",fontWeight:"500"},dotsContainer:{flexDirection:"row",alignItems:"center",justifyContent:"center"},dot:{width:6,height:6,borderRadius:3,backgroundColor:"#999",marginHorizontal:3}}),St=Ha;import Jo from"react";import{Pressable as Fa,Animated as Xo}from"react-native";import{ChevronDown as Na}from"lucide-react-native";var Wa=({visible:M,onPress:S,isReplyActive:C=!1})=>{let R=q(),T=Jo.useRef(new Xo.Value(0)).current,[A,I]=Jo.useState(!1);return Jo.useEffect(()=>{Xo.timing(T,{toValue:M?1:0,duration:200,useNativeDriver:!0}).start(()=>{I(M)})},[M,T]),!M&&!A?null:<Fa onPress={S}hitSlop={{top:10,bottom:10,left:10,right:10}}>
368
+ {({pressed:P})=><Xo.View style={[{position:"absolute",bottom:40,right:R.spacing.lg,zIndex:9999,width:32,height:32,backgroundColor:R.colors.background,borderRadius:R.borderRadius.xl,justifyContent:"center",alignItems:"center",shadowColor:"#000",shadowOffset:{width:0,height:2},shadowOpacity:.25,shadowRadius:3.84,elevation:5,opacity:T,transform:P?[{scale:.95}]:[]}]}>
369
+ <Na size={20}color={R.colors.text}/>
370
+ </Xo.View>}
371
+ </Fa>},Po=Wa;import{View as Xs,Text as Ua}from"react-native";var Ka=({displayDate:M})=>{let S=q();return<Xs style={{marginVertical:S.spacing.lg,alignItems:"center"}}>
382
372
  <Xs style={{borderRadius:S.borderRadius.full,backgroundColor:S.colors.surfaceSecondary,paddingHorizontal:S.spacing.md,paddingVertical:S.spacing.xs}}>
383
- <Qa style={{fontSize:S.typography.fontSize.xs,color:S.colors.textSecondary,fontWeight:S.typography.fontWeight.medium}}>
373
+ <Ua style={{fontSize:S.typography.fontSize.xs,color:S.colors.textSecondary,fontWeight:S.typography.fontWeight.medium}}>
384
374
  {M}
385
- </Qa>
375
+ </Ua>
386
376
  </Xs>
387
- </Xs>},$t=Za;import Io,{forwardRef as gi,useRef as pi,useImperativeHandle as hi,useCallback as fi}from"react";import{View as Is,TextInput as Mi,TouchableOpacity as Mn,Platform as Cn}from"react-native";import{Plus as Ci,Send as Ri,Mic as Si}from"lucide-react-native";import{useRef as ti,useCallback as Le}from"react";import{Alert as ae}from"react-native";import{Camera as oi,Image as si,MapPin as ni,User as ri,FileText as ai,BarChart3 as ii,Calendar as li}from"lucide-react-native";import*as Ee from"expo-image-picker";import*as Qs from"expo-document-picker";import*as je from"expo-location";import*as Zs from"expo-contacts";import*as wt from"expo-image-manipulator";var ei={maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"},Ss=async(M,S={})=>{try{let C={...ei,...S};console.log("Starting image compression...",{uri:M,options:C});let R=await wt.manipulateAsync(M,[],{});console.log("Original image info:",{width:R.width,height:R.height,uri:R.uri});let T=[];if(C.maxWidth||C.maxHeight){let{width:v,height:V}=R,D=v,B=V;if(C.maxWidth&&v>C.maxWidth){let k=C.maxWidth/v;D=C.maxWidth,B=V*k}if(C.maxHeight&&B>C.maxHeight){let k=C.maxHeight/B;B=C.maxHeight,D=D*k}(D!==v||B!==V)&&(T.push({resize:{width:Math.round(D),height:Math.round(B)}}),console.log("Resizing image:",{from:{width:v,height:V},to:{width:Math.round(D),height:Math.round(B)}}))}let A={compress:C.quality,format:C.format==="png"?wt.SaveFormat.PNG:wt.SaveFormat.JPEG};console.log("Applying compression with options:",A);let I=await wt.manipulateAsync(M,T,A);console.log("Image compression completed:",{originalUri:M,compressedUri:I.uri,finalDimensions:{width:I.width,height:I.height}});let z=Date.now(),P=C.format==="png"?"png":"jpg",E=`compressed_image_${z}.${P}`;return{uri:I.uri,width:I.width,height:I.height,fileName:E}}catch(C){console.error("Error compressing image:",C);let R=C instanceof Error?C.message:"Unknown error";throw new Error(`Failed to compress image: ${R}`)}},Ts=(M,S)=>M>3e3||S>3e3?{maxWidth:1920,maxHeight:1920,quality:.7,format:"jpeg"}:M>1920||S>1920?{maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"}:{quality:.9,format:"jpeg"};var ci=[{id:"photo",label:"Photo",icon:si,color:"#3B82F6"},{id:"camera",label:"Camera",icon:oi,color:"#6B7280"},{id:"location",label:"Location",icon:ni,color:"#10B981"},{id:"contact",label:"Contact",icon:ri,color:"#6B7280"},{id:"document",label:"Document",icon:ai,color:"#3B82F6"},{id:"poll",label:"Poll",icon:ii,color:"#F59E0B"},{id:"event",label:"Event",icon:li,color:"#EF4444"}],It=M=>{let S=ti(null),C=Le(async()=>{console.log("Photo selection initiated");try{console.log("Requesting photo library permissions...");let{status:v}=await Ee.requestMediaLibraryPermissionsAsync();if(console.log("Photo library permission status:",v),v!=="granted"){ae.alert("Permission needed","Please grant photo library access to select images.");return}console.log("Waiting for UI to stabilize..."),await new Promise(D=>setTimeout(()=>D(void 0),300)),console.log("Launching image picker...");let V=await Ee.launchImageLibraryAsync({mediaTypes:"images",allowsEditing:!0,aspect:[4,3],quality:.8,allowsMultipleSelection:!1});if(console.log("Image picker result:",V),!V.canceled&&V.assets&&V.assets.length>0){let D=V.assets[0];console.log("Photo selected successfully:",D.uri);try{console.log("Starting image compression...");let B=Ts(D.width||1920,D.height||1920),k=await Ss(D.uri,B);console.log("Image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:D.fileSize}})}catch(B){console.error("Image compression failed:",B),ae.alert("Compression Error","Failed to compress image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:D.uri,width:D.width,height:D.height,fileSize:D.fileSize,fileName:D.fileName||"image.jpg"}})}}else console.log("Photo selection was canceled by user")}catch(v){console.error("Error in photo selection process:",v),ae.alert("Photo Selection Error","Failed to open photo library. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),R=Le(async()=>{console.log("Camera capture initiated");try{console.log("Requesting camera permissions...");let{status:v}=await Ee.requestCameraPermissionsAsync();if(console.log("Camera permission status:",v),v!=="granted"){ae.alert("Permission needed","Please grant camera access to take photos.");return}console.log("Waiting for UI to stabilize..."),await new Promise(D=>setTimeout(()=>D(void 0),300)),console.log("Launching camera...");let V=await Ee.launchCameraAsync({allowsEditing:!0,aspect:[4,3],quality:.8,mediaTypes:"images"});if(console.log("Camera result:",V),!V.canceled&&V.assets&&V.assets.length>0){let D=V.assets[0];console.log("Photo captured successfully:",D.uri);try{console.log("Starting camera image compression...");let B=Ts(D.width||1920,D.height||1920),k=await Ss(D.uri,B);console.log("Camera image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:D.fileSize}})}catch(B){console.error("Camera image compression failed:",B),ae.alert("Compression Error","Failed to compress captured image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:D.uri,width:D.width,height:D.height,fileSize:D.fileSize,fileName:D.fileName||"camera_photo.jpg"}})}}else console.log("Camera capture was canceled by user")}catch(v){console.error("Error in camera capture process:",v),ae.alert("Camera Error","Failed to open camera. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),T=Le(async()=>{console.log("Location sharing initiated");try{console.log("Requesting location permissions...");let{status:v}=await je.requestForegroundPermissionsAsync();if(console.log("Location permission status:",v),v!=="granted"){ae.alert("Permission needed","Please grant location access to share your location.");return}console.log("Getting current location...");let V=await je.getCurrentPositionAsync({accuracy:je.Accuracy.High});console.log("Getting address from coordinates...");let D=await je.reverseGeocodeAsync({latitude:V.coords.latitude,longitude:V.coords.longitude}),B={coordinates:{latitude:V.coords.latitude,longitude:V.coords.longitude},address:D[0]||null,timestamp:V.timestamp};console.log("Location shared successfully:",B.coordinates),M?.({type:"location",data:B})}catch(v){console.error("Error in location sharing process:",v),ae.alert("Location Error","Failed to get your location. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),A=Le(async()=>{try{let{status:v}=await Zs.requestPermissionsAsync();if(v!=="granted"){ae.alert("Permission needed","Please grant contacts access to share contacts.");return}ae.alert("Contact Sharing","Contact selection feature is coming soon! This would open a contact picker.",[{text:"OK",onPress:()=>console.log("Contact sharing acknowledged")}])}catch(v){console.error("Error accessing contacts:",v),ae.alert("Error","Failed to access contacts. Please try again.")}finally{S.current?.hide()}},[]),I=Le(async()=>{console.log("Document selection initiated");try{console.log("Waiting for UI to stabilize..."),await new Promise(V=>setTimeout(()=>V(void 0),300)),console.log("Launching document picker...");let v=await Qs.getDocumentAsync({type:"*/*",copyToCacheDirectory:!0,multiple:!1});if(console.log("Document picker result:",v),!v.canceled&&v.assets&&v.assets.length>0){let V=v.assets[0];console.log("Document selected successfully:",V.name),M?.({type:"document",data:{uri:V.uri,name:V.name,size:V.size,mimeType:V.mimeType}})}else console.log("Document selection was canceled by user")}catch(v){console.error("Error in document selection process:",v),ae.alert("Document Selection Error","Failed to open document picker. Please try again.",[{text:"OK"}])}},[M]),z=Le(()=>{ae.alert("Create Poll","Poll creation feature is coming soon! This would open a poll creation interface.",[{text:"OK",onPress:()=>console.log("Poll creation acknowledged")}])},[]),P=Le(()=>{ae.alert("Create Event","Event creation feature is coming soon! This would open an event creation interface.",[{text:"OK",onPress:()=>console.log("Event creation acknowledged")}])},[]),E=Le(async v=>{console.log(`Selected attachment option: ${v}`);try{switch(v){case"photo":await C();break;case"camera":await R();break;case"location":await T();break;case"contact":await A();break;case"document":await I();break;case"poll":z();break;case"event":P();break;default:console.warn(`Unknown attachment option: ${v}`)}}catch(V){console.error(`Error handling ${v}:`,V),ae.alert("Error",`Failed to handle ${v}. Please try again.`)}},[C,R,T,A,I,z,P]);return{menuRef:S,handleOptionSelect:E,options:ci}};import Oe,{useRef as di,useCallback as he,createContext as ui,useContext as mi}from"react";var wo=(M={})=>{let{initialValue:S="",initialHeight:C=50,onValueChange:R,onHeightChange:T,onSend:A,onAttachmentSend:I,onReplyCancel:z,onFocus:P,onBlur:E,maxHeight:v=100,minHeight:V=50,maxLength:D=1e3,placeholder:B="Type a message..."}=M,k=di(null),[L,O]=Oe.useState(S),[F,H]=Oe.useState(C),[N,j]=Oe.useState(!1),[J,ie]=Oe.useState(null),[Y,X]=Oe.useState([]),le=Oe.useMemo(()=>({value:L,height:F,isFocused:N,replyToMessage:J,attachments:Y}),[L,F,N,J,Y]),ge=he(te=>{O(te),R?.(te)},[R]),ne=he(te=>{let de=Math.max(V,Math.min(v,te));H(de),T?.(de)},[V,v,T]),Q=he(()=>{j(!0),P?.()},[P]),W=he(()=>{j(!1),E?.()},[E]),ce=he(te=>{let{height:de}=te.nativeEvent.contentSize,zt=Math.max(V,Math.min(v,de+16));ne(zt)},[V,v,ne]),xe=he(()=>{A&&(L||Y.length>0)&&(A(L,Y,J),O(S),X([]),ie(null),H(C))},[A,L,Y,J,S,C]),fe=he(te=>{I?(I(te,L),L&&O(S)):X(de=>[...de,{...te,id:Date.now().toString()}])},[I,L,S]),re=he(te=>{X(de=>[...de,te])},[]),pe=he(te=>{X(de=>de.filter(zt=>zt.id!==te))},[]),be=he(()=>{X([])},[]),Z=he(()=>{ie(null),z?.()},[z]),Ie=he(()=>{k.current?.focus()},[]),jo=Oe.useMemo(()=>({setValue:ge,setHeight:ne,setFocus:j,setReplyToMessage:ie,addAttachment:re,removeAttachment:pe,clearAttachments:be,sendMessage:xe,cancelReply:Z,focusInput:Ie,handleAttachmentSelected:fe,handleContentSizeChange:ce,handleFocus:Q,handleBlur:W}),[ge,ne,j,ie,re,pe,be,xe,Z,Ie,fe,ce,Q,W]),Oo=Oe.useMemo(()=>({textInputRef:k}),[]);return{state:le,actions:jo,refs:Oo}},en=ui(null),Se=()=>{let M=mi(en);if(!M)throw new Error("useMessageInputContext must be used within MessageInputProvider");return M},tn=({children:M,value:S})=><en.Provider value={S}>
388
- {M}
389
- </en.Provider>;var Ue=gi(({value:M,onChangeText:S,onSend:C,onFocus:R,height:T,onContentSizeChange:A,replyToMessage:I,onCancelReply:z,onAttachmentSend:P},E)=>{let v=K(),V=pi(null);hi(E,()=>({focus:()=>{V.current?.focus()}}));let{state:D,actions:B}=wo({initialValue:M,initialHeight:T,onValueChange:S,onHeightChange:A,onSend:C,onAttachmentSend:P,onReplyCancel:z,onFocus:R});Io.useEffect(()=>{M!==D.value&&B.setValue(M)},[M,D.value,B]),Io.useEffect(()=>{T!==D.height&&B.setHeight(T)},[T,D.height,B]),Io.useEffect(()=>{I!==D.replyToMessage&&B.setReplyToMessage(I||null)},[I,D.replyToMessage,B]),Io.useEffect(()=>{if(I&&V.current){let O=setTimeout(()=>{V.current?.focus()},100);return()=>clearTimeout(O)}},[I]);let k=fi(O=>{if(console.log("Attachment selected:",O),P)P(O,M.trim()||void 0),M.trim()&&S("");else switch(O.type){case"image":console.log("Image attachment ready to send:",{uri:O.data.uri,dimensions:{width:O.data.width,height:O.data.height},fileName:O.data.fileName});break;case"document":console.log("Document attachment ready to send:",{name:O.data.name,size:O.data.size});break;case"location":console.log("Location attachment ready to send:",O.data.coordinates);break;case"contact":console.log("Contact attachment ready to send:",O.data);break;default:console.log("Other attachment ready to send:",O)}},[P,M,S]),L=It(k);return<>
390
- {I&&z&&<Ye replyToMessage={I}onCancel={z}/>}
391
- <Is style={{borderTopWidth:1,borderTopColor:v.colors.borderLight,backgroundColor:v.colors.background}}>
392
- <Is style={{flexDirection:"row",alignItems:"center",backgroundColor:v.colors.background,paddingHorizontal:v.spacing.lg,paddingVertical:v.spacing.sm,minHeight:T}}>
377
+ </Xs>},Ao=Ka;import Bo,{forwardRef as si,useRef as ni,useImperativeHandle as ri,useCallback as ai}from"react";import{View as Ms,TextInput as Mi,TouchableOpacity as Mn,Platform as Cn}from"react-native";import{Plus as Ci,Send as Ri,Mic as Si}from"lucide-react-native";import{useRef as $a,useCallback as Le}from"react";import{Alert as re}from"react-native";import{Camera as Ya,Image as Ga,MapPin as _a,User as Ja,FileText as Xa,BarChart3 as Qa,Calendar as Za}from"lucide-react-native";import*as Ee from"expo-image-picker";import*as Qs from"expo-document-picker";import*as je from"expo-location";import*as Zs from"expo-contacts";import*as Tt from"expo-image-manipulator";var qa={maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"},Qo=async(M,S={})=>{try{let C={...qa,...S};console.log("Starting image compression...",{uri:M,options:C});let R=await Tt.manipulateAsync(M,[],{});console.log("Original image info:",{width:R.width,height:R.height,uri:R.uri});let T=[];if(C.maxWidth||C.maxHeight){let{width:v,height:B}=R,V=v,D=B;if(C.maxWidth&&v>C.maxWidth){let k=C.maxWidth/v;V=C.maxWidth,D=B*k}if(C.maxHeight&&D>C.maxHeight){let k=C.maxHeight/D;D=C.maxHeight,V=V*k}(V!==v||D!==B)&&(T.push({resize:{width:Math.round(V),height:Math.round(D)}}),console.log("Resizing image:",{from:{width:v,height:B},to:{width:Math.round(V),height:Math.round(D)}}))}let A={compress:C.quality,format:C.format==="png"?Tt.SaveFormat.PNG:Tt.SaveFormat.JPEG};console.log("Applying compression with options:",A);let I=await Tt.manipulateAsync(M,T,A);console.log("Image compression completed:",{originalUri:M,compressedUri:I.uri,finalDimensions:{width:I.width,height:I.height}});let P=Date.now(),z=C.format==="png"?"png":"jpg",j=`compressed_image_${P}.${z}`;return{uri:I.uri,width:I.width,height:I.height,fileName:j}}catch(C){console.error("Error compressing image:",C);let R=C instanceof Error?C.message:"Unknown error";throw new Error(`Failed to compress image: ${R}`)}},Zo=(M,S)=>M>3e3||S>3e3?{maxWidth:1920,maxHeight:1920,quality:.7,format:"jpeg"}:M>1920||S>1920?{maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"}:{quality:.9,format:"jpeg"};var ei=[{id:"photo",label:"Photo",icon:Ga,color:"#3B82F6"},{id:"camera",label:"Camera",icon:Ya,color:"#6B7280"},{id:"location",label:"Location",icon:_a,color:"#10B981"},{id:"contact",label:"Contact",icon:Ja,color:"#6B7280"},{id:"document",label:"Document",icon:Xa,color:"#3B82F6"},{id:"poll",label:"Poll",icon:Qa,color:"#F59E0B"},{id:"event",label:"Event",icon:Za,color:"#EF4444"}],zo=M=>{let S=$a(null),C=Le(async()=>{console.log("Photo selection initiated");try{console.log("Requesting photo library permissions...");let{status:v}=await Ee.requestMediaLibraryPermissionsAsync();if(console.log("Photo library permission status:",v),v!=="granted"){re.alert("Permission needed","Please grant photo library access to select images.");return}console.log("Waiting for UI to stabilize..."),await new Promise(V=>setTimeout(()=>V(void 0),300)),console.log("Launching image picker...");let B=await Ee.launchImageLibraryAsync({mediaTypes:"images",allowsEditing:!0,aspect:[4,3],quality:.8,allowsMultipleSelection:!1});if(console.log("Image picker result:",B),!B.canceled&&B.assets&&B.assets.length>0){let V=B.assets[0];console.log("Photo selected successfully:",V.uri);try{console.log("Starting image compression...");let D=Zo(V.width||1920,V.height||1920),k=await Qo(V.uri,D);console.log("Image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:V.fileSize}})}catch(D){console.error("Image compression failed:",D),re.alert("Compression Error","Failed to compress image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:V.uri,width:V.width,height:V.height,fileSize:V.fileSize,fileName:V.fileName||"image.jpg"}})}}else console.log("Photo selection was canceled by user")}catch(v){console.error("Error in photo selection process:",v),re.alert("Photo Selection Error","Failed to open photo library. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),R=Le(async()=>{console.log("Camera capture initiated");try{console.log("Requesting camera permissions...");let{status:v}=await Ee.requestCameraPermissionsAsync();if(console.log("Camera permission status:",v),v!=="granted"){re.alert("Permission needed","Please grant camera access to take photos.");return}console.log("Waiting for UI to stabilize..."),await new Promise(V=>setTimeout(()=>V(void 0),300)),console.log("Launching camera...");let B=await Ee.launchCameraAsync({allowsEditing:!0,aspect:[4,3],quality:.8,mediaTypes:"images"});if(console.log("Camera result:",B),!B.canceled&&B.assets&&B.assets.length>0){let V=B.assets[0];console.log("Photo captured successfully:",V.uri);try{console.log("Starting camera image compression...");let D=Zo(V.width||1920,V.height||1920),k=await Qo(V.uri,D);console.log("Camera image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:V.fileSize}})}catch(D){console.error("Camera image compression failed:",D),re.alert("Compression Error","Failed to compress captured image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:V.uri,width:V.width,height:V.height,fileSize:V.fileSize,fileName:V.fileName||"camera_photo.jpg"}})}}else console.log("Camera capture was canceled by user")}catch(v){console.error("Error in camera capture process:",v),re.alert("Camera Error","Failed to open camera. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),T=Le(async()=>{console.log("Location sharing initiated");try{console.log("Requesting location permissions...");let{status:v}=await je.requestForegroundPermissionsAsync();if(console.log("Location permission status:",v),v!=="granted"){re.alert("Permission needed","Please grant location access to share your location.");return}console.log("Getting current location...");let B=await je.getCurrentPositionAsync({accuracy:je.Accuracy.High});console.log("Getting address from coordinates...");let V=await je.reverseGeocodeAsync({latitude:B.coords.latitude,longitude:B.coords.longitude}),D={coordinates:{latitude:B.coords.latitude,longitude:B.coords.longitude},address:V[0]||null,timestamp:B.timestamp};console.log("Location shared successfully:",D.coordinates),M?.({type:"location",data:D})}catch(v){console.error("Error in location sharing process:",v),re.alert("Location Error","Failed to get your location. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),A=Le(async()=>{try{let{status:v}=await Zs.requestPermissionsAsync();if(v!=="granted"){re.alert("Permission needed","Please grant contacts access to share contacts.");return}re.alert("Contact Sharing","Contact selection feature is coming soon! This would open a contact picker.",[{text:"OK",onPress:()=>console.log("Contact sharing acknowledged")}])}catch(v){console.error("Error accessing contacts:",v),re.alert("Error","Failed to access contacts. Please try again.")}finally{S.current?.hide()}},[]),I=Le(async()=>{console.log("Document selection initiated");try{console.log("Waiting for UI to stabilize..."),await new Promise(B=>setTimeout(()=>B(void 0),300)),console.log("Launching document picker...");let v=await Qs.getDocumentAsync({type:"*/*",copyToCacheDirectory:!0,multiple:!1});if(console.log("Document picker result:",v),!v.canceled&&v.assets&&v.assets.length>0){let B=v.assets[0];console.log("Document selected successfully:",B.name),M?.({type:"document",data:{uri:B.uri,name:B.name,size:B.size,mimeType:B.mimeType}})}else console.log("Document selection was canceled by user")}catch(v){console.error("Error in document selection process:",v),re.alert("Document Selection Error","Failed to open document picker. Please try again.",[{text:"OK"}])}},[M]),P=Le(()=>{re.alert("Create Poll","Poll creation feature is coming soon! This would open a poll creation interface.",[{text:"OK",onPress:()=>console.log("Poll creation acknowledged")}])},[]),z=Le(()=>{re.alert("Create Event","Event creation feature is coming soon! This would open an event creation interface.",[{text:"OK",onPress:()=>console.log("Event creation acknowledged")}])},[]),j=Le(async v=>{console.log(`Selected attachment option: ${v}`);try{switch(v){case"photo":await C();break;case"camera":await R();break;case"location":await T();break;case"contact":await A();break;case"document":await I();break;case"poll":P();break;case"event":z();break;default:console.warn(`Unknown attachment option: ${v}`)}}catch(B){console.error(`Error handling ${v}:`,B),re.alert("Error",`Failed to handle ${v}. Please try again.`)}},[C,R,T,A,I,P,z]);return{menuRef:S,handleOptionSelect:j,options:ei}};import Oe,{useRef as ti,useCallback as pe,createContext as oi,useContext as qd}from"react";var Ht=(M={})=>{let{initialValue:S="",initialHeight:C=50,onValueChange:R,onHeightChange:T,onSend:A,onAttachmentSend:I,onReplyCancel:P,onFocus:z,onBlur:j,maxHeight:v=100,minHeight:B=50,maxLength:V=1e3,placeholder:D="Type a message..."}=M,k=ti(null),[L,O]=Oe.useState(S),[H,F]=Oe.useState(C),[N,E]=Oe.useState(!1),[J,ie]=Oe.useState(null),[Y,X]=Oe.useState([]),le=Oe.useMemo(()=>({value:L,height:H,isFocused:N,replyToMessage:J,attachments:Y}),[L,H,N,J,Y]),me=pe(te=>{O(te),R?.(te)},[R]),se=pe(te=>{let de=Math.max(B,Math.min(v,te));F(de),T?.(de)},[B,v,T]),Q=pe(()=>{E(!0),z?.()},[z]),W=pe(()=>{E(!1),j?.()},[j]),ce=pe(te=>{let{height:de}=te.nativeEvent.contentSize,vt=Math.max(B,Math.min(v,de+16));se(vt)},[B,v,se]),ye=pe(()=>{A&&(L||Y.length>0)&&(A(L,Y,J),O(S),X([]),ie(null),F(C))},[A,L,Y,J,S,C]),he=pe(te=>{I?(I(te,L),L&&O(S)):X(de=>[...de,{...te,id:Date.now().toString()}])},[I,L,S]),ne=pe(te=>{X(de=>[...de,te])},[]),ge=pe(te=>{X(de=>de.filter(vt=>vt.id!==te))},[]),xe=pe(()=>{X([])},[]),Z=pe(()=>{ie(null),P?.()},[P]),Te=pe(()=>{k.current?.focus()},[]),ko=Oe.useMemo(()=>({setValue:me,setHeight:se,setFocus:E,setReplyToMessage:ie,addAttachment:ne,removeAttachment:ge,clearAttachments:xe,sendMessage:ye,cancelReply:Z,focusInput:Te,handleAttachmentSelected:he,handleContentSizeChange:ce,handleFocus:Q,handleBlur:W}),[me,se,E,ie,ne,ge,xe,ye,Z,Te,he,ce,Q,W]),Lo=Oe.useMemo(()=>({textInputRef:k}),[]);return{state:le,actions:ko,refs:Lo}},Yd=oi(null);var we=si(({value:M,onChangeText:S,onSend:C,onFocus:R,height:T,onContentSizeChange:A,replyToMessage:I,onCancelReply:P,onAttachmentSend:z},j)=>{let v=q(),B=ni(null);ri(j,()=>({focus:()=>{B.current?.focus()}}));let{state:V,actions:D}=Ht({initialValue:M,initialHeight:T,onValueChange:S,onHeightChange:A,onSend:C,onAttachmentSend:z,onReplyCancel:P,onFocus:R});Bo.useEffect(()=>{M!==V.value&&D.setValue(M)},[M,V.value,D]),Bo.useEffect(()=>{T!==V.height&&D.setHeight(T)},[T,V.height,D]),Bo.useEffect(()=>{I!==V.replyToMessage&&D.setReplyToMessage(I||null)},[I,V.replyToMessage,D]),Bo.useEffect(()=>{if(I&&B.current){let O=setTimeout(()=>{B.current?.focus()},100);return()=>clearTimeout(O)}},[I]);let k=ai(O=>{if(console.log("Attachment selected:",O),z)z(O,M.trim()||void 0),M.trim()&&S("");else switch(O.type){case"image":console.log("Image attachment ready to send:",{uri:O.data.uri,dimensions:{width:O.data.width,height:O.data.height},fileName:O.data.fileName});break;case"document":console.log("Document attachment ready to send:",{name:O.data.name,size:O.data.size});break;case"location":console.log("Location attachment ready to send:",O.data.coordinates);break;case"contact":console.log("Contact attachment ready to send:",O.data);break;default:console.log("Other attachment ready to send:",O)}},[z,M,S]),L=zo(k);return<>
378
+ {I&&P&&<Et replyToMessage={I}onCancel={P}/>}
379
+ <Ms style={{borderTopWidth:1,borderTopColor:v.colors.borderLight,backgroundColor:v.colors.background}}>
380
+ <Ms style={{flexDirection:"row",alignItems:"center",backgroundColor:v.colors.background,paddingHorizontal:v.spacing.lg,paddingVertical:v.spacing.sm,minHeight:T}}>
393
381
  <Mn style={{marginRight:v.spacing.md}}onPress={()=>L.menuRef.current?.show()}>
394
382
  <Ci size={24}color={v.colors.textSecondary}/>
395
383
  </Mn>
396
384
 
397
- <Is style={{flex:1,flexDirection:"row",alignItems:"center",borderRadius:v.borderRadius.full,backgroundColor:v.colors.surfaceSecondary,paddingHorizontal:v.spacing.lg,paddingVertical:6}}>
398
- <Mi ref={V}style={{flex:1,fontSize:v.typography.fontSize.base,maxHeight:70,minHeight:18,paddingTop:Cn.OS==="ios"?6:3,paddingBottom:Cn.OS==="ios"?6:3,color:v.colors.text}}value={M}onChangeText={S}placeholder='Type a message...'placeholderTextColor={v.colors.textMuted}multiline maxLength={1e3}onFocus={R}onContentSizeChange={B.handleContentSizeChange}returnKeyType='default'textAlignVertical='center'/>
399
- </Is>
385
+ <Ms style={{flex:1,flexDirection:"row",alignItems:"center",borderRadius:v.borderRadius.full,backgroundColor:v.colors.surfaceSecondary,paddingHorizontal:v.spacing.lg,paddingVertical:6}}>
386
+ <Mi ref={B}style={{flex:1,fontSize:v.typography.fontSize.base,maxHeight:70,minHeight:18,paddingTop:Cn.OS==="ios"?6:3,paddingBottom:Cn.OS==="ios"?6:3,color:v.colors.text}}value={M}onChangeText={S}placeholder='Type a message...'placeholderTextColor={v.colors.textMuted}multiline maxLength={1e3}onFocus={R}onContentSizeChange={D.handleContentSizeChange}returnKeyType='default'textAlignVertical='center'/>
387
+ </Ms>
400
388
 
401
389
  <Mn onPress={C}style={{marginLeft:v.spacing.md,height:40,width:40,alignItems:"center",justifyContent:"center",borderRadius:v.borderRadius.full,backgroundColor:M.trim()?v.colors.primary:v.colors.gray[300]}}disabled={!M.trim()}>
402
390
  {M.trim()?<Ri size={18}color='white'/>:<Si size={18}color='white'/>}
403
391
  </Mn>
404
- </Is>
405
- </Is>
392
+ </Ms>
393
+ </Ms>
406
394
 
407
- <Ge ref={L.menuRef}onOptionSelect={L.handleOptionSelect}options={L.options}/>
408
- </>});Ue.displayName="MessageInput";import{View as Ti,TextInput as Ii,TouchableOpacity as Rn,Platform as Sn}from"react-native";import{Plus as Pi,Send as Ai,Mic as Vi}from"lucide-react-native";var Tn={Container:({children:M,render:S})=>{let C=Se();return S?S(C):<>{M}</>},ReplyPreview:({render:M})=>{let{state:S,actions:C}=Se();return S.replyToMessage?M?M({state:S,actions:C}):<Ye replyToMessage={S.replyToMessage}onCancel={C.cancelReply}/>:null},TextArea:({render:M})=>{let{state:S,actions:C,refs:R}=Se(),T=K();return M?M({state:S,actions:C,refs:R}):<Ti style={{flex:1,flexDirection:"row",alignItems:"center",borderRadius:T.borderRadius.full,backgroundColor:T.colors.surfaceSecondary,paddingHorizontal:T.spacing.lg,paddingVertical:6}}>
409
- <Ii ref={R.textInputRef}style={{flex:1,fontSize:T.typography.fontSize.base,maxHeight:70,minHeight:18,paddingTop:Sn.OS==="ios"?6:3,paddingBottom:Sn.OS==="ios"?6:3,color:T.colors.text}}value={S.value}onChangeText={C.setValue}placeholder='Type a message...'placeholderTextColor={T.colors.textMuted}multiline maxLength={1e3}onFocus={C.handleFocus}onBlur={C.handleBlur}onContentSizeChange={C.handleContentSizeChange}returnKeyType='default'textAlignVertical='center'/>
410
- </Ti>},AttachmentButton:({render:M})=>{let{actions:S}=Se(),C=K(),R=It(S.handleAttachmentSelected);return M?M({actions:S,attachmentMenu:R}):<Rn style={{marginRight:C.spacing.md}}onPress={()=>R.menuRef.current?.show()}>
411
- <Pi size={24}color={C.colors.textSecondary}/>
412
- </Rn>},SendButton:({render:M})=>{let{state:S,actions:C}=Se(),R=K();return M?M({state:S,actions:C}):<Rn onPress={C.sendMessage}style={{marginLeft:R.spacing.md,height:40,width:40,alignItems:"center",justifyContent:"center",borderRadius:R.borderRadius.full,backgroundColor:S.value&&S.value.toString().trim()||S.attachments.length>0?R.colors.primary:R.colors.gray[300]}}disabled={!S.value&&S.attachments.length===0}>
413
- {S.value&&S.value.toString().trim()||S.attachments.length>0?<Ai size={18}color='white'/>:<Vi size={18}color='white'/>}
414
- </Rn>},AttachmentMenu:({render:M})=>{let{actions:S}=Se(),C=It(S.handleAttachmentSelected);return M?M({actions:S,attachmentMenu:C}):<Ge ref={C.menuRef}onOptionSelect={C.handleOptionSelect}options={C.options}/>}};import Ki,{forwardRef as qi}from"react";import ji,{createContext as Oi,useContext as Fi,useMemo as Hi}from"react";import{useMemo as Di,useCallback as Bi}from"react";function vo(M,S={}){let{initialNumToRender:C=20,maxToRenderPerBatch:R=10,windowSize:T=10}=S,A=Di(()=>Hs(M).reverse(),[M]),I=Bi(z=>z.listItemType==="date-separator"?z.id:z.id.toString(),[]);return{messageItems:A,keyExtractor:I,flatListProps:{initialNumToRender:C,maxToRenderPerBatch:R,windowSize:T,inverted:!0,showsVerticalScrollIndicator:!1,keyboardShouldPersistTaps:"handled",removeClippedSubviews:!1,scrollEventThrottle:16}}}import{useState as ki,useCallback as Je,useRef as wn}from"react";function Po(M={}){let{scrollThreshold:S=50,autoScrollToBottom:C=!0}=M,R=wn(null),[T,A]=ki({isNearBottom:!0,isNearTop:!1,showScrollToBottomButton:!1}),I=wn(0),z=Je(k=>{let{contentOffset:L,contentSize:O,layoutMeasurement:F}=k.nativeEvent,H=L.y,N=Math.abs(H)<S,j=Math.abs(H)>O.height-F.height-S;A({isNearBottom:N,isNearTop:j,showScrollToBottomButton:!N})},[S]),P=Je(k=>{let L=k>I.current;return I.current=k,L},[]),E=Je(()=>{},[]),v=Je((k=!0)=>{R.current&&R.current.scrollToOffset({offset:0,animated:k})},[]),V=Je((k,L=!0)=>{R.current&&R.current.scrollToOffset({offset:k,animated:L})},[]),D=Je((k,L=!0)=>{R.current&&R.current.scrollToIndex({index:k,animated:L})},[]),B=Je(k=>{P(k)&&C&&R.current&&setTimeout(()=>{v()},100)},[P,C,v]);return{flatListRef:R,scrollState:T,handleScroll:z,handleContentSizeChange:E,handleNewMessages:B,scrollToEnd:v,scrollToOffset:V,scrollToIndex:D}}import{useState as Li,useCallback as vs}from"react";function Ao(M={}){let{enableMessageActions:S=!0}=M,[C,R]=Li({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0}),T=vs((z,P)=>{S&&R({actionSheetVisible:!0,selectedMessage:z,messagePosition:P})},[S]),A=vs(()=>{R({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0})},[]),I=vs((z,P)=>{if(!C.selectedMessage)return;let{selectedMessage:E}=C;switch(z){case"reply":P?.onReply?.(E);break;case"copy":if(P?.onCopy)P.onCopy(E);else{let v=E.type==="image"&&E.imageData?E.text||"Image message":E.text;import("./clipboard-O4FPD4J6.mjs").then(({copyToClipboard:V})=>{V(v)}).catch(()=>{console.log("Clipboard functionality not available")})}break;case"delete":P?.onDelete?.(E.id);break;default:P?.onCustomAction?.(z,E);break}A()},[C.selectedMessage,A]);return{actionState:C,handleMessageLongPress:T,handleActionSheetClose:A,handleActionPress:I}}import{useState as In,useCallback as Yt}from"react";function zo(M={}){let{enableReactionDetails:S=!0}=M,[C,R]=In({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),[T,A]=In(null),I=Yt(V=>{S&&V.reactions&&V.reactions.length>0&&(A(V),R({isReactionDetailsVisible:!0,selectedReactions:V.reactions,selectedMessageText:V.text}))},[S]),z=Yt(()=>{R({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),A(null)},[]),P=Yt((V,D)=>{T&&D?.(T.id,V),z()},[T,z]),E=Yt((V,D)=>{T&&D?.(T.id,V),z()},[T,z]),v=Yt((V,D)=>{T&&D?.(T.id,V)},[T]);return{reactionState:C,selectedMessage:T,handleReactionPress:I,handleReactionDetailsClose:z,handleAddReaction:P,handleRemoveReaction:E,handleEmojiReact:v}}import{useState as Ei,useCallback as vn}from"react";function Vo(){let[M,S]=Ei({replyToMessage:null}),C=vn(T=>{S({replyToMessage:T})},[]),R=vn(()=>{S({replyToMessage:null})},[]);return{replyState:M,setReplyToMessage:C,clearReply:R}}var Pn=Oi(null);function Xe(){let M=Fi(Pn);if(!M)throw new Error("useMessageListContext must be used within MessageListProvider");return M}function Pt({children:M,messages:S,config:C={},...R}){let T=vo(S,C),A=Po(C),I=Ao(C),z=zo(C),P=Vo();ji.useEffect(()=>{A.handleNewMessages(S.length)},[S.length,A.handleNewMessages]);let E=Hi(()=>({messageList:T,scroll:A,actions:I,reactions:z,reply:P,config:C,callbacks:R}),[T,A,I,z,P,C,R]);return<Pn.Provider value={E}>
395
+ <Ke ref={L.menuRef}onOptionSelect={L.handleOptionSelect}options={L.options}/>
396
+ </>});we.displayName="MessageInput";import{View as Mu,TextInput as Cu,TouchableOpacity as Ru,Platform as Su}from"react-native";import{Plus as Iu,Send as Pu,Mic as Au}from"lucide-react-native";import Hi,{forwardRef as Fi}from"react";import zi,{createContext as Bi,useContext as Vi,useMemo as Di}from"react";import{useMemo as wi,useCallback as Ii}from"react";function Ft(M,S={}){let{initialNumToRender:C=20,maxToRenderPerBatch:R=10,windowSize:T=10}=S,A=wi(()=>Fs(M).reverse(),[M]),I=Ii(P=>P.listItemType==="date-separator"?P.id:P.id.toString(),[]);return{messageItems:A,keyExtractor:I,flatListProps:{initialNumToRender:C,maxToRenderPerBatch:R,windowSize:T,inverted:!0,showsVerticalScrollIndicator:!1,keyboardShouldPersistTaps:"handled",removeClippedSubviews:!1,scrollEventThrottle:16}}}import{useState as vi,useCallback as qe,useRef as Rn}from"react";function Cs(M={}){let{scrollThreshold:S=50,autoScrollToBottom:C=!0}=M,R=Rn(null),[T,A]=vi({isNearBottom:!0,isNearTop:!1,showScrollToBottomButton:!1}),I=Rn(0),P=qe(k=>{let{contentOffset:L,contentSize:O,layoutMeasurement:H}=k.nativeEvent,F=L.y,N=Math.abs(F)<S,E=Math.abs(F)>O.height-H.height-S;A({isNearBottom:N,isNearTop:E,showScrollToBottomButton:!N})},[S]),z=qe(k=>{let L=k>I.current;return I.current=k,L},[]),j=qe(()=>{},[]),v=qe((k=!0)=>{R.current&&R.current.scrollToOffset({offset:0,animated:k})},[]),B=qe((k,L=!0)=>{R.current&&R.current.scrollToOffset({offset:k,animated:L})},[]),V=qe((k,L=!0)=>{R.current&&R.current.scrollToIndex({index:k,animated:L})},[]),D=qe(k=>{z(k)&&C&&R.current&&setTimeout(()=>{v()},100)},[z,C,v]);return{flatListRef:R,scrollState:T,handleScroll:P,handleContentSizeChange:j,handleNewMessages:D,scrollToEnd:v,scrollToOffset:B,scrollToIndex:V}}import{useState as Pi,useCallback as Rs}from"react";function Nt(M={}){let{enableMessageActions:S=!0}=M,[C,R]=Pi({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0}),T=Rs((P,z)=>{S&&R({actionSheetVisible:!0,selectedMessage:P,messagePosition:z})},[S]),A=Rs(()=>{R({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0})},[]),I=Rs((P,z)=>{if(!C.selectedMessage)return;let{selectedMessage:j}=C;switch(P){case"reply":z?.onReply?.(j);break;case"copy":if(z?.onCopy)z.onCopy(j);else{let v=j.type==="image"&&j.imageData?j.text||"Image message":j.text;import("./clipboard-O4FPD4J6.mjs").then(({copyToClipboard:B})=>{B(v)}).catch(()=>{console.log("Clipboard functionality not available")})}break;case"delete":z?.onDelete?.(j.id);break;default:z?.onCustomAction?.(P,j);break}A()},[C.selectedMessage,A]);return{actionState:C,handleMessageLongPress:T,handleActionSheetClose:A,handleActionPress:I}}import{useState as Sn,useCallback as Wt}from"react";function Ut(M={}){let{enableReactionDetails:S=!0}=M,[C,R]=Sn({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),[T,A]=Sn(null),I=Wt(B=>{S&&B.reactions&&B.reactions.length>0&&(A(B),R({isReactionDetailsVisible:!0,selectedReactions:B.reactions,selectedMessageText:B.text}))},[S]),P=Wt(()=>{R({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),A(null)},[]),z=Wt((B,V)=>{T&&V?.(T.id,B),P()},[T,P]),j=Wt((B,V)=>{T&&V?.(T.id,B),P()},[T,P]),v=Wt((B,V)=>{T&&V?.(T.id,B)},[T]);return{reactionState:C,selectedMessage:T,handleReactionPress:I,handleReactionDetailsClose:P,handleAddReaction:z,handleRemoveReaction:j,handleEmojiReact:v}}import{useState as Ai,useCallback as Tn}from"react";function Ss(){let[M,S]=Ai({replyToMessage:null}),C=Tn(T=>{S({replyToMessage:T})},[]),R=Tn(()=>{S({replyToMessage:null})},[]);return{replyState:M,setReplyToMessage:C,clearReply:R}}var wn=Bi(null);function wt(){let M=Vi(wn);if(!M)throw new Error("useMessageListContext must be used within MessageListProvider");return M}function Kt({children:M,messages:S,config:C={},...R}){let T=Ft(S,C),A=Cs(C),I=Nt(C),P=Ut(C),z=Ss();zi.useEffect(()=>{A.handleNewMessages(S.length)},[S.length,A.handleNewMessages]);let j=Di(()=>({messageList:T,scroll:A,actions:I,reactions:P,reply:z,config:C,callbacks:R}),[T,A,I,P,z,C,R]);return<wn.Provider value={j}>
415
397
  {M}
416
- </Pn.Provider>}import{useCallback as Do}from"react";import{View as Ni,StyleSheet as Wi,FlatList as Ui}from"react-native";var Te={Provider:Pt,Container:({children:M,style:S})=><Ni style={[An.container,S]}>{M}</Ni>,Messages:({renderMessage:M,style:S})=>{let{messageList:C,scroll:R,actions:T,reactions:A,callbacks:I}=Xe(),z=Do(({item:E,index:v})=>M&&E.listItemType!=="date-separator"?M({message:E,index:v})||null:E.listItemType==="date-separator"?<$t date={E.date}displayDate={E.displayDate}/>:<Ft message={E}onLongPress={T.handleMessageLongPress}onReactionPress={A.handleReactionPress}onReactionRemove={I.onReactionRemove}/>,[T.handleMessageLongPress,A.handleReactionPress,I.onReactionRemove,M]),P=Do(E=>{R.handleScroll(E);let{isNearBottom:v,isNearTop:V}=R.scrollState;I.onScrollPositionChange?.(v,V),v&&I.onScrollToBottom?.(),V&&I.onScrollToTop?.()},[R.handleScroll,R.scrollState,I]);return<Ui ref={R.flatListRef}data={C.messageItems}renderItem={z}keyExtractor={C.keyExtractor}contentContainerStyle={[An.contentContainer,S]}onContentSizeChange={R.handleContentSizeChange}onScroll={P}{...C.flatListProps}/>},TypingIndicator:({isVisible:M})=>M?<Ut isVisible={M}/>:null,ScrollButton:({visible:M,isReplyActive:S,onPress:C})=>{let{scroll:R}=Xe();return<Kt visible={M??R.scrollState.showScrollToBottomButton}onPress={C??R.scrollToEnd}isReplyActive={S}/>},ActionSheet:()=>{let{actions:M,reactions:S,reply:C,callbacks:R,config:T}=Xe(),A=Do(z=>{M.handleActionPress(z,{onReply:P=>{C.setReplyToMessage(P),R.onReplyMessage?.(P)},onDelete:R.onMessageDelete,onCustomAction:R.onActionPress})},[M.handleActionPress,C.setReplyToMessage,R]),I=Do(z=>{console.log("\u{1F525} MessageListCompound - handleEmojiReact called with emoji:",z);let P=M.actionState.selectedMessage;console.log("\u{1F525} MessageListCompound - selectedMessage:",P?.id,"callbacks.onReactionAdd exists:",!!R.onReactionAdd),P&&R.onReactionAdd?(console.log("\u{1F525} MessageListCompound - Calling onReactionAdd for message:",P.id,"emoji:",z),R.onReactionAdd(P.id,z)):console.log("\u{1F525} MessageListCompound - NOT calling onReactionAdd. selectedMessage:",!!P,"callback exists:",!!R.onReactionAdd)},[M.actionState.selectedMessage,R.onReactionAdd]);return T.enableMessageActions?<Nt visible={M.actionState.actionSheetVisible}onClose={M.handleActionSheetClose}isMyMessage={M.actionState.selectedMessage?.isMe||!1}selectedMessage={M.actionState.selectedMessage||void 0}messagePosition={M.actionState.messagePosition}onActionPress={A}onEmojiReact={I}/>:null},ReactionDetails:()=>{let{reactions:M,callbacks:S,config:C}=Xe();return C.enableReactionDetails?<Wt visible={M.reactionState.isReactionDetailsVisible}onClose={M.handleReactionDetailsClose}reactions={M.reactionState.selectedReactions}messageText={M.reactionState.selectedMessageText}onRemoveReaction={R=>M.handleRemoveReaction(R,S.onReactionRemove)}/>:null}},An=Wi.create({container:{flex:1},contentContainer:{paddingVertical:16}});var Ke=qi(({messages:M,isTyping:S,showScrollToBottom:C=!1,isReplyActive:R=!1,...T},A)=>{let I={scrollThreshold:T.scrollThreshold,autoScrollToBottom:T.autoScrollToBottom,enableMessageActions:T.enableMessageActions,enableReactionDetails:T.enableReactionDetails},z={onScrollToBottom:T.onScrollToBottom,onScrollToTop:T.onScrollToTop,onScrollPositionChange:T.onScrollPositionChange,onReactionAdd:T.onReactionAdd,onReactionRemove:T.onReactionRemove,onMessageDelete:T.onMessageDelete,onReplyMessage:T.onReplyMessage,onActionPress:T.onActionPress};return Ki.useImperativeHandle(A,()=>({scrollToEnd:(P=!0)=>{},scrollToOffset:(P,E=!0)=>{},scrollToIndex:(P,E=!0)=>{}}),[]),<Pt messages={M}config={I}{...z}>
417
- <Te.Container>
418
- <Te.Messages/>
419
- <Te.TypingIndicator isVisible={S}/>
420
- <Te.ScrollButton visible={C?void 0:!1}isReplyActive={R}/>
421
- <Te.ActionSheet/>
422
- <Te.ReactionDetails/>
423
- </Te.Container>
424
- </Pt>});Ke.displayName="MessageList";import{FlatList as Ji}from"react-native";import{View as _t,Text as Lo,TouchableOpacity as _i}from"react-native";import{View as Ps,Text as $i}from"react-native";var Yi=({avatar:M,isOnline:S=!1,size:C="medium"})=>{let R=K(),T=()=>{switch(C){case"small":return{width:32,height:32};case"large":return{width:64,height:64};default:return{width:48,height:48}}},A=()=>{switch(C){case"small":return R.typography.fontSize.sm;case"large":return R.typography.fontSize.xxl;default:return R.typography.fontSize.lg}},I=()=>{switch(C){case"small":return{width:12,height:12};case"large":return{width:24,height:24};default:return{width:16,height:16}}},z=T(),P=I();return<Ps style={{position:"relative"}}>
398
+ </wn.Provider>}import{useCallback as Vo}from"react";import{View as Li,StyleSheet as Ei,FlatList as Oi}from"react-native";var He={Provider:Kt,Container:({children:M,style:S})=><Li style={[In.container,S]}>{M}</Li>,Messages:({renderMessage:M,style:S})=>{let{messageList:C,scroll:R,actions:T,reactions:A,callbacks:I}=wt(),P=Vo(({item:j,index:v})=>M&&j.listItemType!=="date-separator"?M({message:j,index:v})||null:j.listItemType==="date-separator"?<Ao date={j.date}displayDate={j.displayDate}/>:<Ro message={j}onLongPress={T.handleMessageLongPress}onReactionPress={A.handleReactionPress}onReactionRemove={I.onReactionRemove}/>,[T.handleMessageLongPress,A.handleReactionPress,I.onReactionRemove,M]),z=Vo(j=>{R.handleScroll(j);let{isNearBottom:v,isNearTop:B}=R.scrollState;I.onScrollPositionChange?.(v,B),v&&I.onScrollToBottom?.(),B&&I.onScrollToTop?.()},[R.handleScroll,R.scrollState,I]);return<Oi ref={R.flatListRef}data={C.messageItems}renderItem={P}keyExtractor={C.keyExtractor}contentContainerStyle={[In.contentContainer,S]}onContentSizeChange={R.handleContentSizeChange}onScroll={z}{...C.flatListProps}/>},TypingIndicator:({isVisible:M})=>M?<St isVisible={M}/>:null,ScrollButton:({visible:M,isReplyActive:S,onPress:C})=>{let{scroll:R}=wt();return<Po visible={M??R.scrollState.showScrollToBottomButton}onPress={C??R.scrollToEnd}isReplyActive={S}/>},ActionSheet:()=>{let{actions:M,reactions:S,reply:C,callbacks:R,config:T}=wt(),A=Vo(P=>{M.handleActionPress(P,{onReply:z=>{C.setReplyToMessage(z),R.onReplyMessage?.(z)},onDelete:R.onMessageDelete,onCustomAction:R.onActionPress})},[M.handleActionPress,C.setReplyToMessage,R]),I=Vo(P=>{console.log("\u{1F525} MessageListCompound - handleEmojiReact called with emoji:",P);let z=M.actionState.selectedMessage;console.log("\u{1F525} MessageListCompound - selectedMessage:",z?.id,"callbacks.onReactionAdd exists:",!!R.onReactionAdd),z&&R.onReactionAdd?(console.log("\u{1F525} MessageListCompound - Calling onReactionAdd for message:",z.id,"emoji:",P),R.onReactionAdd(z.id,P)):console.log("\u{1F525} MessageListCompound - NOT calling onReactionAdd. selectedMessage:",!!z,"callback exists:",!!R.onReactionAdd)},[M.actionState.selectedMessage,R.onReactionAdd]);return T.enableMessageActions?<So visible={M.actionState.actionSheetVisible}onClose={M.handleActionSheetClose}isMyMessage={M.actionState.selectedMessage?.isMe||!1}selectedMessage={M.actionState.selectedMessage||void 0}messagePosition={M.actionState.messagePosition}onActionPress={A}onEmojiReact={I}/>:null},ReactionDetails:()=>{let{reactions:M,callbacks:S,config:C}=wt();return C.enableReactionDetails?<To visible={M.reactionState.isReactionDetailsVisible}onClose={M.handleReactionDetailsClose}reactions={M.reactionState.selectedReactions}messageText={M.reactionState.selectedMessageText}onRemoveReaction={R=>M.handleRemoveReaction(R,S.onReactionRemove)}/>:null}},In=Ei.create({container:{flex:1},contentContainer:{paddingVertical:16}});var Ie=Fi(({messages:M,isTyping:S,showScrollToBottom:C=!1,isReplyActive:R=!1,...T},A)=>{let I={scrollThreshold:T.scrollThreshold,autoScrollToBottom:T.autoScrollToBottom,enableMessageActions:T.enableMessageActions,enableReactionDetails:T.enableReactionDetails},P={onScrollToBottom:T.onScrollToBottom,onScrollToTop:T.onScrollToTop,onScrollPositionChange:T.onScrollPositionChange,onReactionAdd:T.onReactionAdd,onReactionRemove:T.onReactionRemove,onMessageDelete:T.onMessageDelete,onReplyMessage:T.onReplyMessage,onActionPress:T.onActionPress};return Hi.useImperativeHandle(A,()=>({scrollToEnd:(z=!0)=>{},scrollToOffset:(z,j=!0)=>{},scrollToIndex:(z,j=!0)=>{}}),[]),<Kt messages={M}config={I}{...P}>
399
+ <He.Container>
400
+ <He.Messages/>
401
+ <He.TypingIndicator isVisible={S}/>
402
+ <He.ScrollButton visible={C?void 0:!1}isReplyActive={R}/>
403
+ <He.ActionSheet/>
404
+ <He.ReactionDetails/>
405
+ </He.Container>
406
+ </Kt>});Ie.displayName="MessageList";import Ni from"react";function ae(M){let S=Ni.forwardRef((R,T)=>(Ye(),<M{...R}ref={T}/>)),C=M.displayName||M.name||"Component";return S.displayName=`RequireAuth(${C})`,S}function be(M){return(...S)=>(Ye(),M(...S))}import{FlatList as $i}from"react-native";import{View as Yt,Text as Do,TouchableOpacity as Ki}from"react-native";import{View as Ts,Text as Wi}from"react-native";var Ui=({avatar:M,isOnline:S=!1,size:C="medium"})=>{let R=q(),T=()=>{switch(C){case"small":return{width:32,height:32};case"large":return{width:64,height:64};default:return{width:48,height:48}}},A=()=>{switch(C){case"small":return R.typography.fontSize.sm;case"large":return R.typography.fontSize.xxl;default:return R.typography.fontSize.lg}},I=()=>{switch(C){case"small":return{width:12,height:12};case"large":return{width:24,height:24};default:return{width:16,height:16}}},P=T(),z=I();return<Ts style={{position:"relative"}}>
425
407
  {}
426
- <Ps style={[z,{borderRadius:R.borderRadius.full,backgroundColor:R.colors.gray[200],alignItems:"center",justifyContent:"center"}]}>
427
- <$i style={{fontSize:A(),color:R.colors.text}}>
408
+ <Ts style={[P,{borderRadius:R.borderRadius.full,backgroundColor:R.colors.gray[200],alignItems:"center",justifyContent:"center"}]}>
409
+ <Wi style={{fontSize:A(),color:R.colors.text}}>
428
410
  {M}
429
- </$i>
430
- </Ps>
411
+ </Wi>
412
+ </Ts>
431
413
 
432
414
  {}
433
- {S&&<Ps style={[P,{position:"absolute",bottom:-2,right:-2,backgroundColor:R.colors.online,borderRadius:R.borderRadius.full,borderWidth:2,borderColor:R.colors.background}]}/>}
434
- </Ps>},Bo=Yi;var Gi=({item:M,onPress:S})=>{let C=K(),R=M.unreadCount&&M.unreadCount>0;return<_i style={{flexDirection:"row",alignItems:"center",paddingHorizontal:C.spacing.lg,paddingVertical:C.spacing.md,borderBottomWidth:1,borderBottomColor:C.colors.borderLight,backgroundColor:R?C.colors.unread:C.colors.background}}onPress={()=>S(M)}>
435
- <_t style={{marginRight:C.spacing.md}}>
436
- <Bo avatar={M.avatar}isOnline={M.isOnline}size="medium"/>
437
- </_t>
415
+ {S&&<Ts style={[z,{position:"absolute",bottom:-2,right:-2,backgroundColor:R.colors.online,borderRadius:R.borderRadius.full,borderWidth:2,borderColor:R.colors.background}]}/>}
416
+ </Ts>},$t=Ui;var qi=({item:M,onPress:S})=>{let C=q(),R=M.unreadCount&&M.unreadCount>0;return<Ki style={{flexDirection:"row",alignItems:"center",paddingHorizontal:C.spacing.lg,paddingVertical:C.spacing.md,borderBottomWidth:1,borderBottomColor:C.colors.borderLight,backgroundColor:R?C.colors.unread:C.colors.background}}onPress={()=>S(M)}>
417
+ <Yt style={{marginRight:C.spacing.md}}>
418
+ <$t avatar={M.avatar}isOnline={M.isOnline}size="medium"/>
419
+ </Yt>
438
420
 
439
- <_t style={{flex:1,marginRight:C.spacing.md}}>
421
+ <Yt style={{flex:1,marginRight:C.spacing.md}}>
440
422
  {}
441
- <_t style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:C.spacing.xs}}>
442
- <Lo style={{fontSize:C.typography.fontSize.base,flex:1,fontWeight:R?C.typography.fontWeight.bold:C.typography.fontWeight.semibold,color:C.colors.text}}>
423
+ <Yt style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:C.spacing.xs}}>
424
+ <Do style={{fontSize:C.typography.fontSize.base,flex:1,fontWeight:R?C.typography.fontWeight.bold:C.typography.fontWeight.semibold,color:C.colors.text}}>
443
425
  {M.name}
444
- </Lo>
445
- <Lo style={{fontSize:C.typography.fontSize.sm,marginLeft:C.spacing.sm,color:R?C.colors.gray[700]:C.colors.textSecondary,fontWeight:R?C.typography.fontWeight.medium:C.typography.fontWeight.normal}}>
426
+ </Do>
427
+ <Do style={{fontSize:C.typography.fontSize.sm,marginLeft:C.spacing.sm,color:R?C.colors.gray[700]:C.colors.textSecondary,fontWeight:R?C.typography.fontWeight.medium:C.typography.fontWeight.normal}}>
446
428
  {M.time}
447
- </Lo>
448
- </_t>
429
+ </Do>
430
+ </Yt>
449
431
 
450
432
  {}
451
- <_t style={{flexDirection:"row",alignItems:"center"}}>
452
- <Lo style={{fontSize:C.typography.fontSize.sm,flex:1,color:R?C.colors.gray[800]:C.colors.textSecondary,fontWeight:R?C.typography.fontWeight.medium:C.typography.fontWeight.normal}}numberOfLines={1}>
433
+ <Yt style={{flexDirection:"row",alignItems:"center"}}>
434
+ <Do style={{fontSize:C.typography.fontSize.sm,flex:1,color:R?C.colors.gray[800]:C.colors.textSecondary,fontWeight:R?C.typography.fontWeight.medium:C.typography.fontWeight.normal}}numberOfLines={1}>
453
435
  {M.message}
454
- </Lo>
455
- {M.unreadCount&&<_t style={{width:20,height:20,backgroundColor:C.colors.primary,borderRadius:C.borderRadius.full,alignItems:"center",justifyContent:"center",marginLeft:C.spacing.sm}}>
456
- <Lo style={{fontSize:C.typography.fontSize.xs,color:"white",fontWeight:C.typography.fontWeight.bold}}>
436
+ </Do>
437
+ {M.unreadCount&&<Yt style={{width:20,height:20,backgroundColor:C.colors.primary,borderRadius:C.borderRadius.full,alignItems:"center",justifyContent:"center",marginLeft:C.spacing.sm}}>
438
+ <Do style={{fontSize:C.typography.fontSize.xs,color:"white",fontWeight:C.typography.fontWeight.bold}}>
457
439
  {M.unreadCount}
458
- </Lo>
459
- </_t>}
460
- </_t>
461
- </_t>
462
- </_i>},Eo=Gi;var Xi=({chats:M,onChatPress:S})=>{let C=({item:R})=><Eo item={R}onPress={S}/>;return<Ji data={M}renderItem={C}keyExtractor={R=>R.id}showsVerticalScrollIndicator={!1}style={{flex:1}}/>},zn=Xt(Xi);import{View as Qi,Text as Zi}from"react-native";var el=({title:M})=>{let S=K();return<Qi style={{backgroundColor:S.colors.background,paddingHorizontal:S.spacing.lg,paddingVertical:S.spacing.lg,borderBottomWidth:1,borderBottomColor:S.colors.borderLight}}>
463
- <Zi style={{fontSize:S.typography.fontSize.xxl,fontWeight:S.typography.fontWeight.bold,color:S.colors.text}}>
440
+ </Do>
441
+ </Yt>}
442
+ </Yt>
443
+ </Yt>
444
+ </Ki>},Gt=qi;var Yi=({chats:M,onChatPress:S})=>{let C=({item:R})=><Gt item={R}onPress={S}/>;return<$i data={M}renderItem={C}keyExtractor={R=>R.id}showsVerticalScrollIndicator={!1}style={{flex:1}}/>},ws=Yi;import{View as Gi,Text as _i}from"react-native";var Ji=({title:M})=>{let S=q();return<Gi style={{backgroundColor:S.colors.background,paddingHorizontal:S.spacing.lg,paddingVertical:S.spacing.lg,borderBottomWidth:1,borderBottomColor:S.colors.borderLight}}>
445
+ <_i style={{fontSize:S.typography.fontSize.xxl,fontWeight:S.typography.fontWeight.bold,color:S.colors.text}}>
464
446
  {M}
465
- </Zi>
466
- </Qi>},Vn=el;import{View as As,TextInput as Ml,TouchableOpacity as Cl}from"react-native";import{Search as Rl,X as Sl}from"lucide-react-native";var Tl=({value:M,onChangeText:S,onClear:C,placeholder:R="Search chats..."})=>{let T=K();return<As style={{backgroundColor:T.colors.background,paddingHorizontal:T.spacing.lg,paddingVertical:T.spacing.md,borderBottomWidth:1,borderBottomColor:T.colors.borderLight}}>
467
- <As style={{position:"relative"}}>
468
- <As style={{position:"absolute",left:T.spacing.md,top:"50%",transform:[{translateY:-10}],zIndex:10}}>
469
- <Rl size={20}color={T.colors.textMuted}/>
470
- </As>
447
+ </_i>
448
+ </Gi>},Is=Ji;import{View as Ps,TextInput as Xi,TouchableOpacity as Qi}from"react-native";import{Search as Zi,X as Ml}from"lucide-react-native";var Cl=({value:M,onChangeText:S,onClear:C,placeholder:R="Search chats..."})=>{let T=q();return<Ps style={{backgroundColor:T.colors.background,paddingHorizontal:T.spacing.lg,paddingVertical:T.spacing.md,borderBottomWidth:1,borderBottomColor:T.colors.borderLight}}>
449
+ <Ps style={{position:"relative"}}>
450
+ <Ps style={{position:"absolute",left:T.spacing.md,top:"50%",transform:[{translateY:-10}],zIndex:10}}>
451
+ <Zi size={20}color={T.colors.textMuted}/>
452
+ </Ps>
471
453
 
472
- <Ml value={M}onChangeText={S}placeholder={R}placeholderTextColor={T.colors.textMuted}style={{backgroundColor:T.colors.surfaceSecondary,borderRadius:T.borderRadius.full,paddingLeft:48,paddingRight:40,paddingVertical:T.spacing.md,color:T.colors.text,fontSize:T.typography.fontSize.base}}autoCapitalize="none"autoCorrect={!1}clearButtonMode="never"/>
454
+ <Xi value={M}onChangeText={S}placeholder={R}placeholderTextColor={T.colors.textMuted}style={{backgroundColor:T.colors.surfaceSecondary,borderRadius:T.borderRadius.full,paddingLeft:48,paddingRight:40,paddingVertical:T.spacing.md,color:T.colors.text,fontSize:T.typography.fontSize.base}}autoCapitalize="none"autoCorrect={!1}clearButtonMode="never"/>
473
455
 
474
- {M.length>0&&<Cl onPress={C}style={{position:"absolute",right:T.spacing.md,top:"50%",transform:[{translateY:-10}]}}hitSlop={{top:10,bottom:10,left:10,right:10}}>
475
- <Sl size={20}color={T.colors.textMuted}/>
476
- </Cl>}
477
- </As>
478
- </As>},Dn=Tl;import{useState as wl,useCallback as At}from"react";import zs from"dayjs";var Qe=zs(),Bn=Qe.subtract(1,"day"),kn=Qe.subtract(2,"day"),Ln=Qe.subtract(3,"day"),Il=[{id:1,text:"Hi! How are you?",isMe:!1,timestamp:Ln.hour(10).minute(30).toISOString(),senderName:"Anna"},{id:2,text:"Hey! Great, thanks! And you?",isMe:!0,timestamp:Ln.hour(10).minute(31).toISOString(),reactions:[{emoji:"\u2764\uFE0F",count:1,users:["anna"]}]},{id:3,text:"Good too! What are we doing tonight?",isMe:!1,timestamp:kn.hour(14).minute(20).toISOString(),senderName:"Anna"},{id:4,text:"Maybe we could go to the movies?",isMe:!0,timestamp:kn.hour(14).minute(25).toISOString(),reactions:[{emoji:"\u{1F44D}",count:2,users:["anna","me"]},{emoji:"\u{1F3AC}",count:1,users:["anna"]}]},{id:5,text:"Good idea! I'll check the showtimes",isMe:!1,timestamp:Bn.hour(9).minute(15).toISOString(),senderName:"Anna"},{id:6,text:"Great! What movies are you interested in?",isMe:!0,timestamp:Bn.hour(9).minute(20).toISOString()},{id:7,text:"Maybe something action or comedy?",isMe:!1,timestamp:Qe.hour(8).minute(30).toISOString(),senderName:"Anna",reactions:[{emoji:"\u{1F602}",count:1,users:["me"]},{emoji:"\u{1F3AD}",count:1,users:["anna"]}]},{id:8,text:"Sounds great! I'll check what's playing",isMe:!0,timestamp:Qe.hour(8).minute(35).toISOString()},{id:9,text:"Perfect! What time should we meet?",isMe:!1,timestamp:Qe.hour(9).minute(10).toISOString(),senderName:"Anna",replyTo:{id:8,text:"Sounds great! I'll check what's playing",senderName:void 0,isMe:!0,type:"text"}},{id:10,text:"How about 7:00 PM? The show is at 8:00 PM",isMe:!0,timestamp:Qe.hour(9).minute(15).toISOString(),reactions:[{emoji:"\u{1F44D}",count:1,users:["anna"]},{emoji:"\u23F0",count:1,users:["me"]}]}],En=M=>{let S=Il.map(v=>v.isMe?v:{...v,senderName:M||v.senderName}),[C,R]=wl(S),T=At((v,V)=>{if(console.log("sendMessage called with text:",v,"and replyTo:",V),!v.trim())return;let D={id:Date.now(),text:v.trim(),isMe:!0,timestamp:zs().toISOString(),status:"sent",replyTo:V};R(B=>[...B,D]),setTimeout(()=>{R(B=>B.map(k=>k.id===D.id?{...k,status:"delivered"}:k))},1e3),setTimeout(()=>{R(B=>B.map(k=>k.id===D.id?{...k,status:"read"}:k))},3e3)},[]),A=At((v,V,D)=>{let B={id:Date.now(),text:V||"",isMe:!0,timestamp:zs().toISOString(),status:"sent",type:"image",imageData:v,replyTo:D};R(k=>[...k,B]),setTimeout(()=>{R(k=>k.map(L=>L.id===B.id?{...L,status:"delivered"}:L))},1e3),setTimeout(()=>{R(k=>k.map(L=>L.id===B.id?{...L,status:"read"}:L))},3e3)},[]),I=At((v,V)=>{R(D=>D.map(B=>B.id===v?{...B,status:V}:B))},[]),z=At((v,V)=>{R(D=>D.map(B=>{if(B.id===v){let k=B.reactions||[],L=k.findIndex(O=>O.emoji===V);if(L>=0){let O=[...k];return O[L]={...O[L],count:O[L].count+1,users:[...O[L].users,"me"]},{...B,reactions:O}}else{let O={emoji:V,count:1,users:["me"]};return{...B,reactions:[...k,O]}}}return B}))},[]),P=At((v,V)=>{console.log("removeReaction 1212121 called with messageId:",v,"and emoji:",V),R(D=>D.map(B=>{if(B.id===v){let k=B.reactions||[],L=k.findIndex(O=>O.emoji===V);if(L>=0){let O=k[L];if(O.count>1){let F=[...k];return F[L]={...O,count:O.count-1,users:O.users.filter(H=>H!=="me")},{...B,reactions:F}}else return{...B,reactions:k.filter(F=>F.emoji!==V)}}}return B}))},[]),E=At(v=>{console.log("deleteMessage called with messageId:",v),R(V=>{let D=V.map(B=>B.id===v?{...B,deleted:!0}:B);return console.log("Message marked as deleted:",v),D})},[]);return{messages:C,sendMessage:T,sendImageMessage:A,updateMessageStatus:I,addReaction:z,deleteMessage:E,removeReaction:P}};import{useState as jn,useCallback as we}from"react";var On=(M={})=>{let[S,C]=jn(M.initialMessages||[]),[R,T]=jn(!1),A=we((k,L)=>{let O={id:Date.now(),text:k,isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:L?{id:L.id,text:L.text,senderName:L.senderName,isMe:L.isMe}:void 0};C(F=>[O,...F])},[]),I=we(k=>{C(L=>[k,...L])},[]),z=we((k,L)=>{C(O=>O.map(F=>F.id===k?{...F,...L}:F))},[]),P=we(k=>{C(L=>L.filter(O=>O.id!==k))},[]),E=we((k,L)=>{C(O=>O.map(F=>{if(F.id!==k)return F;let H=F.reactions||[];if(H.find(j=>j.emoji===L))return{...F,reactions:H.map(j=>j.emoji===L?{...j,count:j.count+1,users:[...j.users,"current-user"]}:j)};{let j={emoji:L,count:1,users:["current-user"]};return{...F,reactions:[...H,j]}}}))},[]),v=we((k,L)=>{C(O=>O.map(F=>{if(F.id!==k)return F;let H=F.reactions||[],N=H.find(j=>j.emoji===L);return N?N.count<=1?{...F,reactions:H.filter(j=>j.emoji!==L)}:{...F,reactions:H.map(j=>j.emoji===L?{...j,count:j.count-1,users:j.users.filter(J=>J!=="current-user")}:j)}:F}))},[]),V=we(k=>{T(k)},[]),D=we(()=>{C(M.initialMessages||[]),T(!1)},[M.initialMessages]),B=we(k=>S.find(L=>L.id===k),[S]);return{messages:S,isTyping:R,sendMessage:A,addReaction:E,removeReaction:v,setMessages:C,addMessage:I,updateMessage:z,deleteMessage:P,setTyping:V,resetChat:D,getMessageById:B}};import{useState as Fn,useCallback as Vs,useRef as vl,useEffect as Pl}from"react";var Hn=(M={})=>{let{typingTimeout:S=3e3,onTypingStart:C,onTypingStop:R}=M,[T,A]=Fn(!1),[I,z]=Fn([]),P=vl(null),E=Vs(()=>{T||(A(!0),C&&C()),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{A(!1),R&&R()},S)},[T,S,C,R]),v=Vs(()=>{A(!1),P.current&&(clearTimeout(P.current),P.current=null),R&&R()},[R]),V=Vs(D=>{z(D)},[]);return Pl(()=>()=>{P.current&&clearTimeout(P.current)},[]),{isTyping:T,typingUsers:I,startTyping:E,stopTyping:v,setTypingUsers:V}};var Al=async M=>{let{projectId:S,apiUrl:C="http://localhost:3000/api/chat/init",debug:R=!1}=M;if(!S){let T="Project ID is required";throw Fe(T),new Error(T)}Bs(!0);try{R&&console.log(`[Chat SDK] Initializing with projectId: ${S}, apiUrl: ${C}`);let T=await fetch(C,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:S})});if(R&&console.log(`[Chat SDK] Response status: ${T.status}, ok: ${T.ok}`),!T.ok){let z=`HTTP ${T.status}: ${T.statusText}`;try{let P=await T.json();z=P.error||P.message||z}catch{try{let E=await T.text();E&&(z=`Server error: ${E}`)}catch{z=`Failed to initialize chat (HTTP ${T.status})`}}throw Fe(z),new Error(z)}let A;try{let z=await T.text();if(R&&console.log(`[Chat SDK] Response text: ${z}`),!z){let P="Server returned empty response";throw Fe(P),new Error(P)}A=JSON.parse(z)}catch(z){R&&console.error("[Chat SDK] JSON parse error:",z);let P="Server returned invalid JSON response";throw Fe(P),new Error(P)}if(!A||typeof A!="object"){let z="Server returned invalid response format";throw Fe(z),new Error(z)}let I=A;return ks(I),I}catch(T){R&&console.error("[Chat SDK] Init error:",T);let A;throw T instanceof TypeError&&T.message.includes("fetch")?A="Network error: Unable to connect to server. Please check your internet connection.":T instanceof Error?A=T.message:A="Failed to initialize chat: Unknown error",A.includes("Project ID is required")||Fe(A),new Error(A)}};export{Ge as AttachmentMenu,Ko as Chat,Bo as ChatAvatar,Vn as ChatHeader,Eo as ChatItem,zn as ChatList,Dn as ChatListSearchBar,Ho as ChatProvider,Yo as ChatScreenHeader,$t as DateSeparator,Et as DeletedMessage,_e as EmojiPicker,Lt as ImageMessage,Nt as MessageActionSheet,Ue as MessageInput,Tn as MessageInputCompound,tn as MessageInputProvider,Ft as MessageItem,Ke as MessageList,Te as MessageListCompound,Pt as MessageListProvider,Wt as ReactionDetailsSheet,$e as ReplyBubble,Ye as ReplyPreview,Kt as ScrollToBottomButton,ar as ThemeProvider,Ut as TypingIndicator,Dt as defaultTheme,Al as initChat,Zt as useAttachments,Qt as useChatConfig,En as useChatMessages,On as useChatSDK,Ao as useMessageActions,wo as useMessageInput,Se as useMessageInputContext,vo as useMessageList,Xe as useMessageListContext,Po as useMessageListScroll,zo as useMessageReactions,Vo as useMessageReply,K as useTheme,Hn as useTypingIndicator};
456
+ {M.length>0&&<Qi onPress={C}style={{position:"absolute",right:T.spacing.md,top:"50%",transform:[{translateY:-10}]}}hitSlop={{top:10,bottom:10,left:10,right:10}}>
457
+ <Ml size={20}color={T.colors.textMuted}/>
458
+ </Qi>}
459
+ </Ps>
460
+ </Ps>},As=Cl;import{useState as Rl,useCallback as It}from"react";import zs from"dayjs";var $e=zs(),vn=$e.subtract(1,"day"),Pn=$e.subtract(2,"day"),An=$e.subtract(3,"day"),Sl=[{id:1,text:"Hi! How are you?",isMe:!1,timestamp:An.hour(10).minute(30).toISOString(),senderName:"Anna"},{id:2,text:"Hey! Great, thanks! And you?",isMe:!0,timestamp:An.hour(10).minute(31).toISOString(),reactions:[{emoji:"\u2764\uFE0F",count:1,users:["anna"]}]},{id:3,text:"Good too! What are we doing tonight?",isMe:!1,timestamp:Pn.hour(14).minute(20).toISOString(),senderName:"Anna"},{id:4,text:"Maybe we could go to the movies?",isMe:!0,timestamp:Pn.hour(14).minute(25).toISOString(),reactions:[{emoji:"\u{1F44D}",count:2,users:["anna","me"]},{emoji:"\u{1F3AC}",count:1,users:["anna"]}]},{id:5,text:"Good idea! I'll check the showtimes",isMe:!1,timestamp:vn.hour(9).minute(15).toISOString(),senderName:"Anna"},{id:6,text:"Great! What movies are you interested in?",isMe:!0,timestamp:vn.hour(9).minute(20).toISOString()},{id:7,text:"Maybe something action or comedy?",isMe:!1,timestamp:$e.hour(8).minute(30).toISOString(),senderName:"Anna",reactions:[{emoji:"\u{1F602}",count:1,users:["me"]},{emoji:"\u{1F3AD}",count:1,users:["anna"]}]},{id:8,text:"Sounds great! I'll check what's playing",isMe:!0,timestamp:$e.hour(8).minute(35).toISOString()},{id:9,text:"Perfect! What time should we meet?",isMe:!1,timestamp:$e.hour(9).minute(10).toISOString(),senderName:"Anna",replyTo:{id:8,text:"Sounds great! I'll check what's playing",senderName:void 0,isMe:!0,type:"text"}},{id:10,text:"How about 7:00 PM? The show is at 8:00 PM",isMe:!0,timestamp:$e.hour(9).minute(15).toISOString(),reactions:[{emoji:"\u{1F44D}",count:1,users:["anna"]},{emoji:"\u23F0",count:1,users:["me"]}]}],Bs=M=>{let S=Sl.map(v=>v.isMe?v:{...v,senderName:M||v.senderName}),[C,R]=Rl(S),T=It((v,B)=>{if(console.log("sendMessage called with text:",v,"and replyTo:",B),!v.trim())return;let V={id:Date.now(),text:v.trim(),isMe:!0,timestamp:zs().toISOString(),status:"sent",replyTo:B};R(D=>[...D,V]),setTimeout(()=>{R(D=>D.map(k=>k.id===V.id?{...k,status:"delivered"}:k))},1e3),setTimeout(()=>{R(D=>D.map(k=>k.id===V.id?{...k,status:"read"}:k))},3e3)},[]),A=It((v,B,V)=>{let D={id:Date.now(),text:B||"",isMe:!0,timestamp:zs().toISOString(),status:"sent",type:"image",imageData:v,replyTo:V};R(k=>[...k,D]),setTimeout(()=>{R(k=>k.map(L=>L.id===D.id?{...L,status:"delivered"}:L))},1e3),setTimeout(()=>{R(k=>k.map(L=>L.id===D.id?{...L,status:"read"}:L))},3e3)},[]),I=It((v,B)=>{R(V=>V.map(D=>D.id===v?{...D,status:B}:D))},[]),P=It((v,B)=>{R(V=>V.map(D=>{if(D.id===v){let k=D.reactions||[],L=k.findIndex(O=>O.emoji===B);if(L>=0){let O=[...k];return O[L]={...O[L],count:O[L].count+1,users:[...O[L].users,"me"]},{...D,reactions:O}}else{let O={emoji:B,count:1,users:["me"]};return{...D,reactions:[...k,O]}}}return D}))},[]),z=It((v,B)=>{console.log("removeReaction 1212121 called with messageId:",v,"and emoji:",B),R(V=>V.map(D=>{if(D.id===v){let k=D.reactions||[],L=k.findIndex(O=>O.emoji===B);if(L>=0){let O=k[L];if(O.count>1){let H=[...k];return H[L]={...O,count:O.count-1,users:O.users.filter(F=>F!=="me")},{...D,reactions:H}}else return{...D,reactions:k.filter(H=>H.emoji!==B)}}}return D}))},[]),j=It(v=>{console.log("deleteMessage called with messageId:",v),R(B=>{let V=B.map(D=>D.id===v?{...D,deleted:!0}:D);return console.log("Message marked as deleted:",v),V})},[]);return{messages:C,sendMessage:T,sendImageMessage:A,updateMessageStatus:I,addReaction:P,deleteMessage:j,removeReaction:z}};import{useState as zn,useCallback as Se}from"react";var Vs=(M={})=>{Ye();let[S,C]=zn(M.initialMessages||[]),[R,T]=zn(!1),A=Se((k,L)=>{let O={id:Date.now(),text:k,isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:L?{id:L.id,text:L.text,senderName:L.senderName,isMe:L.isMe}:void 0};C(H=>[O,...H])},[]),I=Se(k=>{C(L=>[k,...L])},[]),P=Se((k,L)=>{C(O=>O.map(H=>H.id===k?{...H,...L}:H))},[]),z=Se(k=>{C(L=>L.filter(O=>O.id!==k))},[]),j=Se((k,L)=>{C(O=>O.map(H=>{if(H.id!==k)return H;let F=H.reactions||[];if(F.find(E=>E.emoji===L))return{...H,reactions:F.map(E=>E.emoji===L?{...E,count:E.count+1,users:[...E.users,"current-user"]}:E)};{let E={emoji:L,count:1,users:["current-user"]};return{...H,reactions:[...F,E]}}}))},[]),v=Se((k,L)=>{C(O=>O.map(H=>{if(H.id!==k)return H;let F=H.reactions||[],N=F.find(E=>E.emoji===L);return N?N.count<=1?{...H,reactions:F.filter(E=>E.emoji!==L)}:{...H,reactions:F.map(E=>E.emoji===L?{...E,count:E.count-1,users:E.users.filter(J=>J!=="current-user")}:E)}:H}))},[]),B=Se(k=>{T(k)},[]),V=Se(()=>{C(M.initialMessages||[]),T(!1)},[M.initialMessages]),D=Se(k=>S.find(L=>L.id===k),[S]);return{messages:S,isTyping:R,sendMessage:A,addReaction:j,removeReaction:v,setMessages:C,addMessage:I,updateMessage:P,deleteMessage:z,setTyping:B,resetChat:V,getMessageById:D}};import{useState as bg,useCallback as Mg,useRef as Cg,useEffect as Rg}from"react";var qg=ae(Fo),$g=ae(Eo),Yg=be(Pt),_g=ae(Ie),Jg=ae(we),Qg=ae(Jt),ep=ae(St),op=ae(ws),sp=ae(Gt),np=ae(Is),rp=ae(As),lp=ae($t),cp=ae(Ke),mp=ae(Hs),gp=be(q),xp=be(Vs),bp=be(Bs),Mp=be(Ft),Cp=be(Nt),Rp=be(Ut),Sp=be(zt),wp=be(Ht);export{cp as AttachmentMenu,qg as Chat,lp as ChatAvatar,np as ChatHeader,sp as ChatItem,op as ChatList,rp as ChatListSearchBar,$g as ChatProvider,Qg as ChatScreenHeader,Jg as MessageInput,_g as MessageList,mp as ThemeProvider,ep as TypingIndicator,Bt as defaultTheme,Bn as getAuthState,Vn as getProjectId,kn as initChat,Dn as isInitialized,Sp as useAttachments,Yg as useChatConfig,bp as useChatMessages,xp as useChatSDK,Cp as useMessageActions,wp as useMessageInput,Mp as useMessageList,Rp as useMessageReactions,gp as useTheme};