@usechat/react-native 1.0.13 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +128 -1
- package/dist/index.d.ts +128 -1
- package/dist/index.js +318 -314
- package/dist/index.mjs +367 -363
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,459 +1,463 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
var
|
|
2
|
+
var ke={isInitialized:!1,projectId:null,error:null},Ys=C=>{ke={isInitialized:!0,projectId:C,error:null}},Je=C=>{ke={isInitialized:!1,projectId:null,error:C}};var Un=()=>({...ke}),St=()=>{if(ke.error)throw new Error(`UseChat SDK initialization failed: ${ke.error}
|
|
3
3
|
|
|
4
4
|
Please call initChat() with a valid project ID before using any UseChat components or hooks.
|
|
5
5
|
|
|
6
6
|
Example:
|
|
7
7
|
import { initChat } from '@usechat/react-native';
|
|
8
|
-
await initChat({ projectId: 'your-project-id' });`);if(!
|
|
8
|
+
await initChat({ projectId: 'your-project-id' });`);if(!ke.isInitialized)throw new Error(`UseChat SDK is not initialized.
|
|
9
9
|
|
|
10
10
|
Please call initChat() with a valid project ID before using any UseChat components or hooks.
|
|
11
11
|
|
|
12
12
|
Example:
|
|
13
13
|
import { initChat } from '@usechat/react-native';
|
|
14
|
-
await initChat({ projectId: 'your-project-id' });`)},
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
await initChat({ projectId: 'your-project-id' });`)},Kn=()=>(St(),ke.projectId),qn=()=>ke.isInitialized&&!ke.error;var $n=async C=>{let{projectId:T,apiUrl:R="http://localhost:3000/api/chat/init",debug:M=!1}=C;if(!T){let S="Project ID is required";throw Je(S),new Error(S)}try{M&&console.log(`[UseChat SDK] Validating projectId: ${T}`);let S=await fetch(R,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:T})});if(M&&console.log(`[Chat SDK] Response status: ${S.status}, ok: ${S.ok}`),!S.ok){let P=`HTTP ${S.status}: ${S.statusText}`;try{let z=await S.json();P=z.error||z.message||P}catch{try{let E=await S.text();E&&(P=`Server error: ${E}`)}catch{P=`Failed to initialize chat (HTTP ${S.status})`}}throw Je(P),new Error(P)}let A;try{let P=await S.text();if(M&&console.log(`[Chat SDK] Response text: ${P}`),!P){let z="Server returned empty response";throw Je(z),new Error(z)}A=JSON.parse(P)}catch(P){M&&console.error("[Chat SDK] JSON parse error:",P);let z="Server returned invalid JSON response";throw Je(z),new Error(z)}if(!A||typeof A!="object"){let P="Server returned invalid response format";throw Je(P),new Error(P)}let I=A;return M&&console.log(`[UseChat SDK] Successfully initialized with projectId: ${T}`),Ys(T),I}catch(S){M&&console.error("[Chat SDK] Init error:",S);let A;throw S instanceof TypeError&&S.message.includes("fetch")?A="Network error: Unable to connect to server. Please check your internet connection.":S instanceof Error?A=S.message:A="Failed to initialize chat: Unknown error",A.includes("Project ID is required")||Je(A),new Error(A)}};import Qs,{useState as Qo,useRef as en,useCallback as wt}from"react";import{View as Ze,StyleSheet as Sa}from"react-native";import{createContext as Xn,useContext as Zn}from"react";import{StyleSheet as Qn}from"react-native";import{KeyboardProvider as Ca,KeyboardAvoidingView as Ma}from"react-native-keyboard-controller";import{createContext as _n,useContext as _s,useState as Jn,useCallback as Gs}from"react";var Yn={"input.placeholder":"Type a message...","search.placeholder":"Search chats...","status.online":"Online","status.offline":"Offline","status.typing":"typing...","message.deleted":"This message was deleted","message.sending":"Sending...","message.sent":"Sent","message.delivered":"Delivered","message.read":"Read","message.failed":"Failed to send","action.reply":"Reply","action.copy":"Copy","action.delete":"Delete","action.cancel":"Cancel","action.send":"Send","action.clear":"Clear","action.clearAll":"Clear All","attachment.add":"Add attachment","attachment.remove":"Remove","attachment.clear":"Clear","attachment.attachments":"Attachments:","accessibility.back":"Go back","accessibility.send":"Send message","accessibility.attach":"Add attachment","accessibility.emoji":"Add emoji","accessibility.videoCall":"Start video call","accessibility.voiceCall":"Start voice call","accessibility.info":"Chat info","accessibility.search":"Search chats","accessibility.typing":"Someone is typing","error.fileTooLarge":"File is too large","error.invalidFileType":"Invalid file type","error.maxAttachments":"Maximum attachments reached","error.networkError":"Network error occurred","time.justNow":"Just now","time.minutesAgo":"{{count}} min ago","time.hoursAgo":"{{count}}h ago","time.daysAgo":"{{count}}d ago","time.weeksAgo":"{{count}}w ago","time.monthsAgo":"{{count}}mo ago","time.yearsAgo":"{{count}}y ago"},Gn={"input.placeholder":"Napisz wiadomo\u015B\u0107...","search.placeholder":"Szukaj czat\xF3w...","status.online":"Online","status.offline":"Offline","status.typing":"pisze...","message.deleted":"Ta wiadomo\u015B\u0107 zosta\u0142a usuni\u0119ta","message.sending":"Wysy\u0142anie...","message.sent":"Wys\u0142ano","message.delivered":"Dostarczono","message.read":"Przeczytano","message.failed":"Nie uda\u0142o si\u0119 wys\u0142a\u0107","action.reply":"Odpowiedz","action.copy":"Kopiuj","action.delete":"Usu\u0144","action.cancel":"Anuluj","action.send":"Wy\u015Blij","action.clear":"Wyczy\u015B\u0107","action.clearAll":"Wyczy\u015B\u0107 wszystko","attachment.add":"Dodaj za\u0142\u0105cznik","attachment.remove":"Usu\u0144","attachment.clear":"Wyczy\u015B\u0107","attachment.attachments":"Za\u0142\u0105czniki:","accessibility.back":"Wr\xF3\u0107","accessibility.send":"Wy\u015Blij wiadomo\u015B\u0107","accessibility.attach":"Dodaj za\u0142\u0105cznik","accessibility.emoji":"Dodaj emoji","accessibility.videoCall":"Rozpocznij wideorozmow\u0119","accessibility.voiceCall":"Rozpocznij rozmow\u0119 g\u0142osow\u0105","accessibility.info":"Informacje o czacie","accessibility.search":"Szukaj czat\xF3w","accessibility.typing":"Kto\u015B pisze","error.fileTooLarge":"Plik jest za du\u017Cy","error.invalidFileType":"Nieprawid\u0142owy typ pliku","error.maxAttachments":"Osi\u0105gni\u0119to maksymaln\u0105 liczb\u0119 za\u0142\u0105cznik\xF3w","error.networkError":"Wyst\u0105pi\u0142 b\u0142\u0105d sieci","time.justNow":"W\u0142a\u015Bnie teraz","time.minutesAgo":"{{count}} min temu","time.hoursAgo":"{{count}}h temu","time.daysAgo":"{{count}}d temu","time.weeksAgo":"{{count}}t temu","time.monthsAgo":"{{count}}mies temu","time.yearsAgo":"{{count}}l temu"},So={en:Yn,pl:Gn},Ot=C=>So[C]||So.en,wo=C=>C==="en"||C==="pl";var _o=_n(void 0),Io=({children:C,locale:T="en",fallbackLocale:R="en"})=>{let[M,S]=Jn(T),A=Gs((z,E={})=>{let k=Ot(M)[z];return!k&&M!==R&&(k=Ot(R)[z]),k?k.replace(/\{\{(\w+)\}\}/g,(D,V)=>E[V]?.toString()||D):(console.warn(`Translation missing for key: ${z} in locale: ${M}`),z)},[M,R]),I=Gs(z=>{wo(z)?S(z):(console.warn(`Unsupported locale: ${z}. Falling back to 'en'`),S("en"))},[]),P={t:A,locale:M,setLocale:I};return<_o.Provider value={P}>
|
|
15
|
+
{C}
|
|
16
|
+
</_o.Provider>},Js=()=>{let C=_s(_o);if(!C)throw new Error("useTranslation must be used within an I18nProvider");return C},Pe=()=>{let C=_s(_o);return C?C.t:T=>T};var Xs=Xn(null),Ra=({children:C,config:T={},locale:R="en"})=>{let M={keyboardBehavior:"padding",keyboardVerticalOffset:60,enableReactionDetails:!0,enableMessageActions:!0,enableScrollToBottom:!0,enableTypingIndicator:!0,...T};return<Io locale={R}>
|
|
17
|
+
<Xs.Provider value={{config:M}}>
|
|
18
|
+
<Ca>
|
|
19
|
+
<Ma behavior={M.keyboardBehavior}style={[Ta.keyboardContainer]}keyboardVerticalOffset={M.keyboardVerticalOffset}>
|
|
20
|
+
{}
|
|
21
|
+
{C}
|
|
22
|
+
</Ma>
|
|
23
|
+
</Ca>
|
|
24
|
+
</Xs.Provider>
|
|
25
|
+
</Io>},Jo=Ra,Ft=()=>{let C=Zn(Xs);if(!C)throw new Error("useChatConfig must be used within a ChatProvider");return C.config},Ta=Qn.create({container:{flex:1},keyboardContainer:{flex:1,overflow:"hidden"}});import{useState as Xo,useCallback as Ht}from"react";var Nt=(C={})=>{let{uploader:T,maxAttachments:R=10,maxFileSize:M=10*1024*1024,allowedTypes:S=["image/*","application/pdf","text/*"],onAttachmentAdd:A,onAttachmentRemove:I,onAttachmentUpload:P}=C,[z,E]=Xo([]),[v,k]=Xo(!1),[D,V]=Xo(0),B=Ht(N=>{if(z.length>=R){console.warn(`Maximum ${R} attachments allowed`);return}if(N.data?.size&&N.data.size>M){console.warn(`File size exceeds ${M/(1024*1024)}MB limit`);return}if(N.data?.type&&!S.some(re=>re.endsWith("/*")?N.data.type.startsWith(re.slice(0,-1)):N.data.type===re)){console.warn(`File type ${N.data.type} not allowed`);return}let O={...N,id:N.id||`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,uploadStatus:"pending",uploadProgress:0};E(_=>[..._,O]),A&&A(O)},[z.length,R,M,S,A]),L=Ht(N=>{E(O=>O.filter(_=>_.id!==N)),I&&I(N)},[I]),F=Ht(()=>{E([])},[]),j=Ht(async N=>{try{let O;switch(N){case"image":O={type:"image",data:{uri:"mock-image-uri",width:800,height:600,fileName:"image.jpg",fileSize:1024*1024}};break;case"document":O={type:"document",data:{uri:"mock-document-uri",name:"document.pdf",size:2048*1024,mimeType:"application/pdf"}};break;case"location":O={type:"location",data:{coordinates:{latitude:0,longitude:0},address:"Mock Address",timestamp:Date.now()}};break;case"contact":O={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 _={id:`att_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,type:N,data:O.data,fileName:O.data.fileName||O.data.name,fileSize:O.data.fileSize||O.data.size,mimeType:O.data.mimeType,uploadStatus:"pending",uploadProgress:0};B(_)}catch(O){console.error("Error opening picker:",O)}},[B]),H=Ht(async()=>{if(!T)return console.warn("No uploader provided, skipping upload"),z;if(z.length===0)return[];k(!0),V(0);try{let N=z.map(async(J,Ce)=>{try{E(we=>we.map(W=>W.id===J.id?{...W,uploadStatus:"uploading",uploadProgress:0}:W));let Z=setInterval(()=>{E(we=>we.map(W=>W.id===J.id?{...W,uploadProgress:Math.min((W.uploadProgress??0)+10,90)}:W))},100),ae=await T.upload(J.data);clearInterval(Z);let oe={...J,uploadStatus:"completed",uploadProgress:100,data:{...J.data,url:ae.url,metadata:ae.metadata}};return E(we=>we.map(W=>W.id===J.id?oe:W)),oe}catch(Z){return console.error(`Error uploading attachment ${J.id}:`,Z),E(ae=>ae.map(oe=>oe.id===J.id?{...oe,uploadStatus:"failed",uploadProgress:0}:oe)),{...J,uploadStatus:"failed",uploadProgress:0}}}),O=await Promise.all(N),re=O.filter(J=>J.uploadStatus==="completed").length/O.length*100;return V(re),P&&P(O),O}catch(N){return console.error("Error uploading attachments:",N),z}finally{k(!1)}},[z,T,P]);return{attachments:z,openPicker:j,addAttachment:B,removeAttachment:L,clearAttachments:F,uploadAttachments:H,isUploading:v,uploadProgress:D}};import{useState as Zo,useCallback as Xe}from"react";var Zs=(C={})=>{let{onSend:T,onFocus:R,initialValue:M="",maxLength:S=1e3}=C,[A,I]=Zo(M),[P,z]=Zo(40),[E,v]=Zo(!1),k=Xe(H=>{H.length<=S&&I(H)},[S]),D=Xe(H=>{if(!A.trim()&&(!H||H.length===0))return;let N=A.trim();T&&T(N,H),I(""),z(40)},[A,T]),V=Xe(()=>{v(!0),R&&R()},[R]),B=Xe(()=>{v(!1)},[]),L=Xe(H=>{z(Math.max(40,Math.min(H,120)))},[]),F=Xe(()=>{I(""),z(40)},[]),j=Xe(H=>{I(H)},[]);return{message:A,composerHeight:P,isFocused:E,handleTextChange:k,handleSend:D,handleFocus:V,handleBlur:B,handleContentSizeChange:L,clearMessage:F,setMessage:j}};var wa=({messages:C,components:T={},renderProps:R={},onMessageSend:M,onReactionAdd:S,onReactionRemove:A,onMessageDelete:I,onActionPress:P,attachmentUploader:z,maxAttachments:E=10,maxFileSize:v=10*1024*1024,allowedFileTypes:k=["image/*","application/pdf","text/*"],enableReactionDetails:D,enableMessageActions:V=!0,enableScrollToBottom:B,enableTypingIndicator:L,isTyping:F=!1,typingUserName:j,isLoading:H=!1,loadingComponent:N})=>{let O=Ft(),[_,re]=Qo(!1),J=T.MessageList||Oe,Ce=T.MessageInput||Ee,Z=D??O.enableReactionDetails??!0,ae=V??O.enableMessageActions??!0,oe=B??O.enableScrollToBottom??!0,we=L??O.enableTypingIndicator??!0,[W,Ie]=Qo(null),Me=en(null),[Ge,Q]=Qo(C||[]),ve=en((C||[]).length+1);Qs.useEffect(()=>{C&&(Q(C),ve.current=C.length+1)},[C]),Qs.useEffect(()=>{if(W&&Me.current){let U=setTimeout(()=>{Me.current?.focus()},150);return()=>clearTimeout(U)}},[W]);let ze=Nt({uploader:z,maxAttachments:E,maxFileSize:v,allowedTypes:k}),ee=Zs({onSend:(U,$)=>{if(W){let Y={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],te={id:ve.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:Y,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}}};Q(Ve=>[...Ve,te]),M&&M(te)}else{let K={id:ve.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:Y};Q(te=>[...te,K]),M&&M(K)}Ie(null)}else if($&&$.length>0){let Y=$[0],K={id:ve.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent",attachments:$,type:Y.type==="image"?"image":"text",...Y.type==="image"&&Y.data&&{imageData:{uri:Y.data.uri||"",width:Y.data.width||300,height:Y.data.height||200,fileName:Y.fileName||"image.jpg",fileSize:Y.fileSize||0}}};Q(te=>[...te,K]),M&&M(K)}else{let Y={id:ve.current++,text:U.trim(),isMe:!0,timestamp:new Date().toISOString(),status:"sent"};Q(K=>[...K,Y]),M&&M(Y)}ze.clearAttachments()},onFocus:()=>{}}),Tt=wt((U,$)=>{console.log("\u{1F525} Chat - addReaction called with messageId:",U,"and emoji:",$),Q(Y=>Y.map(K=>K.id===U?K.reactions?.find(Ve=>Ve.emoji===$)?{...K,reactions:K.reactions?.map(Ve=>Ve.emoji===$?{...Ve,count:Ve.count+1,users:[...Ve.users,"currentUser"]}:Ve)}:{...K,reactions:[...K.reactions||[],{emoji:$,count:1,users:["currentUser"]}]}:K)),S&&S(U,$)},[S]),_e=wt((U,$)=>{Q(Y=>Y.map(K=>K.id===U?{...K,reactions:K.reactions?.map(te=>te.emoji===$?{...te,count:Math.max(0,te.count-1),users:te.users.filter(Ve=>Ve!=="currentUser")}:te).filter(te=>te.count>0)}:K)),A&&A(U,$)},[A]),Go=wt(U=>{Q($=>$.map(Y=>Y.id===U?{...Y,deleted:!0,text:"",reactions:void 0}:Y)),I&&I(U)},[I]),se=wt(()=>{Ie(null)},[]),Te=wt(U=>{Ie(U),setTimeout(()=>{Me.current?.focus()},100)},[]),Et=wt(U=>{if(_)return;let{layout:$}=U.nativeEvent;$.height<=0||re(!0)},[_]);if(H)return<Ze style={Qe.container}>
|
|
26
|
+
{N||<Ze style={Qe.loadingContainer}>
|
|
23
27
|
{}
|
|
24
|
-
</
|
|
25
|
-
</
|
|
26
|
-
<
|
|
27
|
-
<
|
|
28
|
-
</
|
|
29
|
-
</
|
|
30
|
-
<
|
|
31
|
-
<
|
|
28
|
+
</Ze>}
|
|
29
|
+
</Ze>;if(!_)return<Ze style={Qe.container}>
|
|
30
|
+
<Ze style={Qe.chatContainer}onLayout={Et}>
|
|
31
|
+
<Ze style={Qe.loadingContainer}>{N}</Ze>
|
|
32
|
+
</Ze>
|
|
33
|
+
</Ze>;let $s=R.renderInput;return<Ze style={Qe.container}>
|
|
34
|
+
<Ze style={Qe.fill}>
|
|
35
|
+
<J messages={Ge}isTyping={we?F:!1}typingUserName={j}showScrollToBottom={oe}isReplyActive={!!W}enableMessageActions={ae}enableReactionDetails={Z}onReactionAdd={Tt}onReactionRemove={_e}onMessageDelete={Go}onReplyMessage={Te}onActionPress={(U,$)=>{U==="reply"?Te($):P?.(U,$)}}/>
|
|
32
36
|
|
|
33
|
-
{
|
|
37
|
+
{$s?$s({value:ee.message,onChangeText:ee.handleTextChange,onSend:ee.handleSend,onFocus:ee.handleFocus,height:ee.composerHeight,onContentSizeChange:ee.handleContentSizeChange,replyToMessage:W,onCancelReply:se,attachments:ze.attachments,onAttachmentAdd:ze.addAttachment,onAttachmentRemove:ze.removeAttachment,onAttachmentUpload:ze.uploadAttachments}):<Ce ref={Me}value={ee.message}onChangeText={ee.handleTextChange}onSend={ee.handleSend}onFocus={ee.handleFocus}height={ee.composerHeight}onContentSizeChange={ee.handleContentSizeChange}replyToMessage={W}onCancelReply={se}onAttachmentSend={(U,$)=>{let Y=U.type==="image",K={id:ve.current++,text:$?.trim()||"",isMe:!0,timestamp:new Date().toISOString(),status:"sent",type:Y?"image":"text",...Y&&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}}};Q(te=>[...te,K]),M&&M(K),ee.handleTextChange("")}}/>}
|
|
34
38
|
|
|
35
39
|
{}
|
|
36
|
-
</
|
|
40
|
+
</Ze>
|
|
37
41
|
|
|
38
42
|
{}
|
|
39
|
-
</
|
|
40
|
-
<
|
|
41
|
-
<
|
|
42
|
-
<
|
|
43
|
-
</
|
|
43
|
+
</Ze>},Qe=Sa.create({container:{flex:1},chatContainer:{flex:1,overflow:"hidden"},fill:{flex:1},loadingContainer:{flex:1,justifyContent:"center",alignItems:"center"}}),es=wa;import{View as Fe,Text as Cs,TouchableOpacity as Po}from"react-native";import{ArrowLeft as Va,Info as Ba,Phone as Da,Video as La}from"lucide-react-native";import{useContext as Aa}from"react";import{createContext as Ia,useMemo as va}from"react";var Wt={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 ts=Ia(Wt),Pa=(C,T)=>({colors:{...C.colors,...T.colors},spacing:{...C.spacing,...T.spacing},borderRadius:{...C.borderRadius,...T.borderRadius},typography:{...C.typography,...T.typography}}),tn=({children:C,theme:T})=>{let R=va(()=>T?Pa(Wt,T):Wt,[T]);return<ts.Provider value={R}>{C}</ts.Provider>};var q=()=>{let C=Aa(ts);if(!C)throw new Error("useTheme must be used within a ThemeProvider");return C};var ja=({name:C="George Alan",isOnline:T=!0,onBack:R=()=>{},onVideoCall:M=()=>{},onVoiceCall:S=()=>{},onInfo:A=()=>{}})=>{let I=q(),P=Pe();return<Fe 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}}>
|
|
44
|
+
<Fe style={{flex:1,flexDirection:"row",alignItems:"center"}}>
|
|
45
|
+
<Po onPress={R}style={{marginRight:I.spacing.md}}>
|
|
46
|
+
<Va size={24}color={I.colors.gray[700]}/>
|
|
47
|
+
</Po>
|
|
44
48
|
|
|
45
|
-
<
|
|
49
|
+
<Fe style={{flex:1,flexDirection:"row",alignItems:"center"}}>
|
|
46
50
|
{}
|
|
47
|
-
<
|
|
48
|
-
<
|
|
49
|
-
<
|
|
51
|
+
<Fe style={{position:"relative",marginRight:I.spacing.md}}>
|
|
52
|
+
<Fe style={{height:40,width:40,alignItems:"center",justifyContent:"center",borderRadius:I.borderRadius.full,backgroundColor:I.colors.gray[200]}}>
|
|
53
|
+
<Cs style={{fontSize:I.typography.fontSize.base,color:I.colors.text}}>
|
|
50
54
|
👤
|
|
51
|
-
</
|
|
52
|
-
</
|
|
53
|
-
{T&&<
|
|
54
|
-
</
|
|
55
|
+
</Cs>
|
|
56
|
+
</Fe>
|
|
57
|
+
{T&&<Fe 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}}/>}
|
|
58
|
+
</Fe>
|
|
55
59
|
|
|
56
|
-
<
|
|
57
|
-
<
|
|
58
|
-
{
|
|
59
|
-
</
|
|
60
|
-
<
|
|
61
|
-
{T?"
|
|
62
|
-
</
|
|
63
|
-
</
|
|
64
|
-
</
|
|
65
|
-
</
|
|
60
|
+
<Fe style={{flex:1}}>
|
|
61
|
+
<Cs style={{fontSize:I.typography.fontSize.lg,fontWeight:I.typography.fontWeight.semibold,color:I.colors.text}}>
|
|
62
|
+
{C}
|
|
63
|
+
</Cs>
|
|
64
|
+
<Cs style={{fontSize:I.typography.fontSize.sm,color:I.colors.textSecondary}}>
|
|
65
|
+
{P(T?"status.online":"status.offline")}
|
|
66
|
+
</Cs>
|
|
67
|
+
</Fe>
|
|
68
|
+
</Fe>
|
|
69
|
+
</Fe>
|
|
66
70
|
|
|
67
|
-
<
|
|
71
|
+
<Fe style={{flexDirection:"row",alignItems:"center",gap:I.spacing.lg}}>
|
|
68
72
|
{}
|
|
69
|
-
{
|
|
70
|
-
<
|
|
71
|
-
</
|
|
72
|
-
{S&&<
|
|
73
|
-
<
|
|
74
|
-
</
|
|
75
|
-
{A&&<
|
|
76
|
-
<
|
|
77
|
-
</
|
|
78
|
-
</
|
|
79
|
-
</
|
|
80
|
-
|
|
81
|
-
{
|
|
82
|
-
|
|
73
|
+
{M&&<Po onPress={M}>
|
|
74
|
+
<La size={24}color={I.colors.gray[700]}/>
|
|
75
|
+
</Po>}
|
|
76
|
+
{S&&<Po onPress={S}>
|
|
77
|
+
<Da size={24}color={I.colors.gray[700]}/>
|
|
78
|
+
</Po>}
|
|
79
|
+
{A&&<Po onPress={A}>
|
|
80
|
+
<Ba size={24}color={I.colors.gray[700]}/>
|
|
81
|
+
</Po>}
|
|
82
|
+
</Fe>
|
|
83
|
+
</Fe>},Ao=ja;import{useRef as Xa}from"react";import{View as $t,Text as Ne,Pressable as Za,TouchableOpacity as Qa}from"react-native";import Ut from"dayjs";import Ea from"dayjs/plugin/isToday";import Oa from"dayjs/plugin/isYesterday";Ut.extend(Ea);Ut.extend(Oa);var Fa=C=>{let T=Ut(C);return T.isToday()?"Today":T.isYesterday()?"Yesterday":T.format("ddd D MMMM")},Ha=C=>Ut(C).format("YYYY-MM-DD"),on=C=>{if(C.length===0)return[];let T=[],R=null;return C.forEach((M,S)=>{let A=Ha(M.timestamp);if(R!==A){let P=Fa(M.timestamp),z={id:`date-${A}`,listItemType:"date-separator",date:A,displayDate:P};T.push(z),R=A}let I={...M,listItemType:"message"};T.push(I)}),T},Ms=C=>Ut(C).format("HH:mm");import{View as Rs,Text as Vo,Image as Na}from"react-native";var Wa=({replyTo:C,isMyMessage:T})=>{let R=q(),M=(E,v=50)=>E.length<=v?E:E.substring(0,v)+"...",S=T?"rgba(255, 255, 255, 0.3)":R.colors.primary,A=T?"rgba(255, 255, 255, 0.8)":R.colors.primary,I=T?"rgba(255, 255, 255, 0.7)":R.colors.textSecondary,P=T?"rgba(255, 255, 255, 0.1)":R.colors.surfaceSecondary,z=C.type==="image"&&C.imageData;return<Rs style={{marginBottom:R.spacing.sm,borderRadius:R.borderRadius.md,padding:R.spacing.sm,backgroundColor:P,borderLeftWidth:4,borderLeftColor:S}}>
|
|
84
|
+
<Vo style={{fontSize:R.typography.fontSize.xs,fontWeight:R.typography.fontWeight.medium,color:A,marginBottom:R.spacing.xs}}>
|
|
85
|
+
{C.isMe?"You":C.senderName||"Sender"}
|
|
86
|
+
</Vo>
|
|
83
87
|
|
|
84
|
-
{
|
|
85
|
-
<
|
|
86
|
-
<
|
|
87
|
-
|
|
88
|
+
{z?<Rs style={{flexDirection:"row",alignItems:"center"}}>
|
|
89
|
+
<Na source={{uri:C.imageData.uri}}style={{width:40,height:40,borderRadius:R.borderRadius.sm,marginRight:R.spacing.sm}}resizeMode="cover"/>
|
|
90
|
+
<Rs style={{flex:1}}>
|
|
91
|
+
<Vo style={{fontSize:R.typography.fontSize.xs,color:I,fontStyle:"italic",marginBottom:R.spacing.xs}}>
|
|
88
92
|
📷 Image
|
|
89
|
-
|
|
90
|
-
{
|
|
91
|
-
{C
|
|
92
|
-
|
|
93
|
-
</
|
|
94
|
-
</
|
|
95
|
-
{C
|
|
96
|
-
|
|
97
|
-
</
|
|
98
|
-
<$
|
|
93
|
+
</Vo>
|
|
94
|
+
{C.text&&C.text.trim()&&<Vo style={{fontSize:R.typography.fontSize.sm,color:I,lineHeight:R.typography.lineHeight.tight}}>
|
|
95
|
+
{M(C.text,30)}
|
|
96
|
+
</Vo>}
|
|
97
|
+
</Rs>
|
|
98
|
+
</Rs>:<Vo style={{fontSize:R.typography.fontSize.sm,color:I,lineHeight:R.typography.lineHeight.tight}}>
|
|
99
|
+
{M(C.text)}
|
|
100
|
+
</Vo>}
|
|
101
|
+
</Rs>},It=Wa;import{useState as sn,useCallback as Kt}from"react";import{View as Bo,Image as Cn,Pressable as Mn,Modal as Ua,Dimensions as Ka,StyleSheet as qa,Text as $a}from"react-native";var{width:Ts,height:Rn}=Ka.get("window"),Ya=({imageData:C,isMe:T,onImagePress:R,onLongPress:M})=>{let S=q(),[A,I]=sn(!1),[P,z]=sn(!1),v=Kt(()=>{let F=Ts*.6,j=300;if(!C.width||!C.height)return{width:F,height:j};let H=C.width/C.height,N=F,O=N/H;return O>j&&(O=j,N=O*H),{width:Math.round(N),height:Math.round(O)}},[C.width,C.height])(),k=Kt(()=>{R?R():I(!0)},[R]),D=Kt(()=>{console.error("Failed to load image:",C.uri),z(!0)},[C.uri]),V=Kt(()=>{I(!1)},[]),L=Kt(()=>{if(!C.width||!C.height)return{width:Ts,height:Rn*.8};let F=C.width/C.height,j=Ts*.9,H=Rn*.8,N=j,O=N/F;return O>H&&(O=H,N=O*F),{width:Math.round(N),height:Math.round(O)}},[C.width,C.height])();return P?<Bo style={[He.errorContainer,{width:v.width,height:v.height,backgroundColor:T?S.colors.messageBubble.sent:S.colors.messageBubble.received,borderRadius:S.borderRadius.lg}]}>
|
|
102
|
+
<$a style={[He.errorText,{color:T?S.colors.messageBubble.sentText:S.colors.messageBubble.receivedText,fontSize:S.typography.fontSize.sm}]}>
|
|
99
103
|
Failed to load image
|
|
100
|
-
</$
|
|
101
|
-
</
|
|
102
|
-
<
|
|
103
|
-
<
|
|
104
|
-
<
|
|
104
|
+
</$a>
|
|
105
|
+
</Bo>:<>
|
|
106
|
+
<Mn onPress={k}onLongPress={M}delayLongPress={500}>
|
|
107
|
+
<Bo style={[He.imageContainer,{borderRadius:S.borderRadius.lg,overflow:"hidden"}]}>
|
|
108
|
+
<Cn source={{uri:C.uri}}style={[He.image,{width:v.width,height:v.height}]}resizeMode='cover'onError={D}/>
|
|
105
109
|
|
|
106
110
|
{}
|
|
107
|
-
<
|
|
108
|
-
</
|
|
109
|
-
</
|
|
111
|
+
<Bo style={He.imageOverlay}/>
|
|
112
|
+
</Bo>
|
|
113
|
+
</Mn>
|
|
110
114
|
|
|
111
115
|
{}
|
|
112
|
-
<
|
|
113
|
-
<
|
|
114
|
-
<
|
|
115
|
-
<
|
|
116
|
-
</
|
|
117
|
-
</
|
|
118
|
-
</
|
|
119
|
-
</>},
|
|
120
|
-
<
|
|
121
|
-
<
|
|
122
|
-
<
|
|
123
|
-
<
|
|
124
|
-
|
|
125
|
-
</
|
|
126
|
-
</
|
|
127
|
-
</
|
|
128
|
-
<
|
|
129
|
-
<
|
|
116
|
+
<Ua visible={A}transparent animationType='fade'onRequestClose={V}>
|
|
117
|
+
<Mn style={He.modalContainer}onPress={V}>
|
|
118
|
+
<Bo style={He.modalContent}>
|
|
119
|
+
<Cn source={{uri:C.uri}}style={[He.modalImage,{width:L.width,height:L.height,borderRadius:S.borderRadius.lg}]}resizeMode='contain'/>
|
|
120
|
+
</Bo>
|
|
121
|
+
</Mn>
|
|
122
|
+
</Ua>
|
|
123
|
+
</>},He=qa.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"}}),Do=Ya;import{View as Lo,Text as Tn,StyleSheet as Ga}from"react-native";import{Trash2 as _a}from"lucide-react-native";var Ja=({isMe:C,timestamp:T,senderName:R})=>{let M=q(),S=Pe();return<Lo style={[vt.container,{alignSelf:C?"flex-end":"flex-start",maxWidth:"80%"}]}>
|
|
124
|
+
<Lo style={[vt.messageBubble,{backgroundColor:M.colors.gray[100],borderColor:M.colors.gray[200]}]}>
|
|
125
|
+
<Lo style={vt.content}>
|
|
126
|
+
<_a size={16}color={M.colors.gray[500]}/>
|
|
127
|
+
<Tn style={[vt.deletedText,{color:M.colors.gray[500]}]}>
|
|
128
|
+
{S("message.deleted")}
|
|
129
|
+
</Tn>
|
|
130
|
+
</Lo>
|
|
131
|
+
</Lo>
|
|
132
|
+
<Lo style={[vt.metadata,{alignSelf:C?"flex-end":"flex-start"}]}>
|
|
133
|
+
<Tn style={[vt.timestamp,{color:M.colors.gray[400]}]}>
|
|
130
134
|
{T}
|
|
131
|
-
</
|
|
132
|
-
</
|
|
133
|
-
</
|
|
134
|
-
<
|
|
135
|
-
{
|
|
135
|
+
</Tn>
|
|
136
|
+
</Lo>
|
|
137
|
+
</Lo>},vt=Ga.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}}),Eo=Ja;var er=({message:C,onLongPress:T,onReactionPress:R})=>{let M=q(),S=Xa(null),A=()=>{S.current?S.current.measureInWindow((z,E,v,k)=>{let D={x:Math.round(z),y:Math.round(E),width:Math.round(v),height:Math.round(k)};T?.(C,D)}):T?.(C)},I=()=>{C.reactions&&C.reactions.length>0&&R?.(C)},P=C.type==="image"&&C.imageData;return C.deleted?<Eo isMe={C.isMe}timestamp={Ms(C.timestamp)}senderName={C.senderName}/>:<$t style={{marginBottom:M.spacing.md,alignItems:C.isMe?"flex-end":"flex-start",marginHorizontal:M.spacing.sm}}>
|
|
138
|
+
<Za ref={S}onLongPress={A}delayLongPress={500}style={{maxWidth:P?"75%":"80%",borderRadius:P?M.borderRadius.lg:M.borderRadius.xl,borderBottomRightRadius:C.isMe?4:P?M.borderRadius.lg:M.borderRadius.xl,borderBottomLeftRadius:C.isMe?P?M.borderRadius.lg:M.borderRadius.xl:4,paddingHorizontal:P?0:M.spacing.lg,paddingVertical:P?0:M.spacing.md,backgroundColor:P?"transparent":C.isMe?M.colors.messageBubble.sent:M.colors.messageBubble.received,overflow:"hidden"}}>
|
|
139
|
+
{C.replyTo&&<It replyTo={C.replyTo}isMyMessage={C.isMe}/>}
|
|
136
140
|
|
|
137
|
-
{P?<
|
|
138
|
-
{
|
|
139
|
-
</
|
|
141
|
+
{P?<Do imageData={C.imageData}isMe={C.isMe}onLongPress={A}/>:<Ne style={{fontSize:M.typography.fontSize.base,color:C.isMe?M.colors.messageBubble.sentText:M.colors.messageBubble.receivedText}}>
|
|
142
|
+
{C.text}
|
|
143
|
+
</Ne>}
|
|
140
144
|
|
|
141
145
|
{}
|
|
142
|
-
{P&&
|
|
143
|
-
<
|
|
144
|
-
{
|
|
145
|
-
</
|
|
146
|
-
|
|
147
|
-
</
|
|
146
|
+
{P&&C.text&&C.text.trim()&&<$t style={{paddingHorizontal:M.spacing.lg,paddingVertical:M.spacing.md,backgroundColor:C.isMe?M.colors.messageBubble.sent:M.colors.messageBubble.received,borderRadius:M.borderRadius.lg,marginTop:M.spacing.xs}}>
|
|
147
|
+
<Ne style={{fontSize:M.typography.fontSize.base,color:C.isMe?M.colors.messageBubble.sentText:M.colors.messageBubble.receivedText}}>
|
|
148
|
+
{C.text}
|
|
149
|
+
</Ne>
|
|
150
|
+
</$t>}
|
|
151
|
+
</Za>
|
|
148
152
|
|
|
149
153
|
{}
|
|
150
|
-
{
|
|
151
|
-
{
|
|
152
|
-
<
|
|
153
|
-
{
|
|
154
|
-
</
|
|
155
|
-
{
|
|
156
|
-
{
|
|
157
|
-
</
|
|
158
|
-
|
|
159
|
-
</
|
|
154
|
+
{C.reactions&&C.reactions.length>0&&<Qa onPress={I}style={{marginTop:M.spacing.xs,flexDirection:"row",alignItems:"center",backgroundColor:M.colors.background,borderRadius:M.borderRadius.full,justifyContent:C.isMe?"flex-end":"flex-start"}}>
|
|
155
|
+
{C.reactions.map((z,E)=><$t key={`${z.emoji}-${E}`}style={{flexDirection:"row",alignItems:"center",padding:M.spacing.xs}}>
|
|
156
|
+
<Ne style={{fontSize:M.typography.fontSize.sm}}>
|
|
157
|
+
{z.emoji}
|
|
158
|
+
</Ne>
|
|
159
|
+
{z.count>1&&<Ne style={{fontSize:M.typography.fontSize.xs,color:M.colors.textSecondary,marginLeft:M.spacing.xs,fontWeight:M.typography.fontWeight.medium}}>
|
|
160
|
+
{z.count}
|
|
161
|
+
</Ne>}
|
|
162
|
+
</$t>)}
|
|
163
|
+
</Qa>}
|
|
160
164
|
|
|
161
|
-
|
|
162
|
-
<
|
|
163
|
-
{
|
|
164
|
-
</
|
|
165
|
-
{
|
|
166
|
-
{
|
|
165
|
+
<$t style={{marginHorizontal:M.spacing.sm,marginTop:M.spacing.xs,flexDirection:"row",alignItems:"center",justifyContent:C.isMe?"flex-end":"flex-start"}}>
|
|
166
|
+
<Ne style={{fontSize:M.typography.fontSize.xs,color:M.colors.textSecondary}}>
|
|
167
|
+
{Ms(C.timestamp)}
|
|
168
|
+
</Ne>
|
|
169
|
+
{C.isMe&&C.status&&<$t style={{marginLeft:M.spacing.xs}}>
|
|
170
|
+
{C.status==="sent"&&<Ne style={{fontSize:M.typography.fontSize.xs,color:M.colors.gray[400]}}>
|
|
167
171
|
✓
|
|
168
|
-
</
|
|
169
|
-
{
|
|
172
|
+
</Ne>}
|
|
173
|
+
{C.status==="delivered"&&<Ne style={{fontSize:M.typography.fontSize.xs,color:M.colors.gray[400]}}>
|
|
170
174
|
✓✓
|
|
171
|
-
</
|
|
172
|
-
{
|
|
175
|
+
</Ne>}
|
|
176
|
+
{C.status==="read"&&<Ne style={{fontSize:M.typography.fontSize.xs,color:M.colors.primary}}>
|
|
173
177
|
✓✓
|
|
174
|
-
</
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
<
|
|
179
|
-
<
|
|
180
|
-
<
|
|
181
|
-
<
|
|
182
|
-
<
|
|
183
|
-
<
|
|
184
|
-
Replying to {
|
|
178
|
+
</Ne>}
|
|
179
|
+
</$t>}
|
|
180
|
+
</$t>
|
|
181
|
+
</$t>},Oo=er;import{View as De,Text as Pt,TouchableOpacity as Cr,Image as Mr}from"react-native";import{X as Rr}from"lucide-react-native";var Tr=({replyToMessage:C,onCancel:T})=>{let R=q(),M=(I,P=50)=>I.length<=P?I:I.substring(0,P)+"...",S=!!C.replyTo,A=C.type==="image"&&C.imageData;return<De style={{borderBottomWidth:1,borderBottomColor:R.colors.border,backgroundColor:R.colors.surface,paddingHorizontal:R.spacing.lg,paddingVertical:R.spacing.md}}>
|
|
182
|
+
<De style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
|
|
183
|
+
<De style={{flex:1,marginRight:R.spacing.md}}>
|
|
184
|
+
<De style={{flexDirection:"row",alignItems:"center",marginBottom:R.spacing.xs}}>
|
|
185
|
+
<De style={{width:4,backgroundColor:R.colors.primary,borderRadius:R.borderRadius.full,marginRight:R.spacing.md,height:S?48:32}}/>
|
|
186
|
+
<De style={{flex:1}}>
|
|
187
|
+
<Pt style={{fontSize:R.typography.fontSize.xs,fontWeight:R.typography.fontWeight.medium,color:R.colors.primary,marginBottom:R.spacing.xs}}>
|
|
188
|
+
Replying to {C.isMe?"yourself":C.senderName||"sender"}
|
|
185
189
|
{S&&" (reply thread)"}
|
|
186
|
-
</
|
|
190
|
+
</Pt>
|
|
187
191
|
|
|
188
192
|
{}
|
|
189
|
-
{S&&<
|
|
190
|
-
<
|
|
191
|
-
Originally replying to: {
|
|
192
|
-
</
|
|
193
|
-
<
|
|
194
|
-
{C
|
|
195
|
-
</
|
|
196
|
-
</
|
|
193
|
+
{S&&<De style={{marginBottom:R.spacing.sm,padding:R.spacing.sm,backgroundColor:R.colors.surfaceSecondary,borderRadius:R.borderRadius.md,borderLeftWidth:2,borderLeftColor:R.colors.gray[300]}}>
|
|
194
|
+
<Pt style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary,marginBottom:R.spacing.xs}}>
|
|
195
|
+
Originally replying to: {C.replyTo.isMe?"yourself":C.replyTo.senderName||"sender"}
|
|
196
|
+
</Pt>
|
|
197
|
+
<Pt style={{fontSize:R.typography.fontSize.xs,color:R.colors.textSecondary,lineHeight:R.typography.lineHeight.tight}}>
|
|
198
|
+
{M(C.replyTo.text,40)}
|
|
199
|
+
</Pt>
|
|
200
|
+
</De>}
|
|
197
201
|
|
|
198
|
-
{A?<
|
|
199
|
-
<
|
|
200
|
-
<
|
|
201
|
-
<
|
|
202
|
+
{A?<De style={{flexDirection:"row",alignItems:"center"}}>
|
|
203
|
+
<Mr source={{uri:C.imageData.uri}}style={{width:32,height:32,borderRadius:R.borderRadius.sm,marginRight:R.spacing.sm}}resizeMode="cover"/>
|
|
204
|
+
<De style={{flex:1}}>
|
|
205
|
+
<Pt style={{fontSize:R.typography.fontSize.xs,color:R.colors.gray[600],fontStyle:"italic",marginBottom:R.spacing.xs}}>
|
|
202
206
|
📷 Image
|
|
203
|
-
</
|
|
204
|
-
{
|
|
205
|
-
{C
|
|
206
|
-
</
|
|
207
|
-
</
|
|
208
|
-
</
|
|
209
|
-
{C
|
|
210
|
-
</
|
|
211
|
-
</
|
|
212
|
-
</
|
|
213
|
-
</
|
|
207
|
+
</Pt>
|
|
208
|
+
{C.text&&C.text.trim()&&<Pt style={{fontSize:R.typography.fontSize.sm,color:R.colors.gray[700],lineHeight:R.typography.lineHeight.tight}}>
|
|
209
|
+
{M(C.text,40)}
|
|
210
|
+
</Pt>}
|
|
211
|
+
</De>
|
|
212
|
+
</De>:<Pt style={{fontSize:R.typography.fontSize.sm,color:R.colors.gray[700],lineHeight:R.typography.lineHeight.tight}}>
|
|
213
|
+
{M(C.text)}
|
|
214
|
+
</Pt>}
|
|
215
|
+
</De>
|
|
216
|
+
</De>
|
|
217
|
+
</De>
|
|
214
218
|
|
|
215
|
-
<
|
|
216
|
-
<
|
|
217
|
-
</
|
|
218
|
-
</
|
|
219
|
-
</
|
|
220
|
-
<
|
|
219
|
+
<Cr onPress={T}style={{height:32,width:32,alignItems:"center",justifyContent:"center",borderRadius:R.borderRadius.full,backgroundColor:R.colors.gray[200]}}hitSlop={{top:8,bottom:8,left:8,right:8}}>
|
|
220
|
+
<Rr size={16}color={R.colors.textSecondary}/>
|
|
221
|
+
</Cr>
|
|
222
|
+
</De>
|
|
223
|
+
</De>},Yt=Tr;import{useRef as We,useState as Sn,useEffect as Is}from"react";import{View as Gt,Text as Bt,TouchableOpacity as Vt,StyleSheet as Ss,Pressable as Pr,ScrollView as Ar,Dimensions as zr,Animated as Se,Image as Vr}from"react-native";import{Reply as Br,Copy as Dr,Plus as Lr,Trash2 as Er}from"lucide-react-native";import{useState as Sr,useEffect as wr}from"react";import Ir from"rn-emoji-keyboard";var vr=({visible:C,onClose:T,onEmojiSelected:R})=>{let[M,S]=Sr(!1);wr(()=>{S(!!C)},[C]);let A=P=>{console.log("Selected emoji:",P),R(P.emoji),S(!1),T()},I=()=>{S(!1),T()};return C?<Ir onEmojiSelected={A}open={M}onClose={I}enableSearchBar/>:null},At=vr;var Or=({visible:C,onPress:T,children:R})=>C?<Gt style={ne.overlay}>
|
|
224
|
+
<Vt style={ne.backdrop}onPress={T}activeOpacity={1}/>
|
|
221
225
|
{R}
|
|
222
|
-
</
|
|
223
|
-
{
|
|
226
|
+
</Gt>:null,{width:zt,height:ws}=zr.get("window"),Fr=({message:C,positions:T,messagePosition:R,containerRef:M,containerOffset:S,setContainerOffset:A})=>{let I=q(),P=We(new Se.Value(R.y)).current,z=We(new Se.Value(0)).current,E=We(!1),v=C.type==="image"&&C.imageData;return Is(()=>{E.current=!1,M.current&&M.current.measureInWindow((k,D,V,B)=>{A({x:k,y:D});let L=R.y-D,F=T.messagePreviewTop-D;P.setValue(L),z.setValue(0),requestAnimationFrame(()=>{Se.parallel([Se.timing(P,{toValue:F,duration:250,useNativeDriver:!1}),Se.timing(z,{toValue:1,duration:250,useNativeDriver:!1})]).start(()=>{E.current=!0})})})},[T.messagePreviewTop,R.y,M]),<Se.View style={{position:"absolute",top:P,left:R.x,width:R.width,height:C.replyTo?R.height+10:R.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":C.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,overflow:"hidden"}}>
|
|
227
|
+
{C.replyTo&&<It replyTo={C.replyTo}isMyMessage={C.isMe}/>}
|
|
224
228
|
|
|
225
|
-
{v?<
|
|
226
|
-
<
|
|
229
|
+
{v?<Gt>
|
|
230
|
+
<Vr source={{uri:C.imageData.uri}}style={{width:R.width,height:R.height,borderRadius:I.borderRadius.lg}}resizeMode='cover'/>
|
|
227
231
|
{}
|
|
228
|
-
{
|
|
229
|
-
<
|
|
230
|
-
{
|
|
231
|
-
</
|
|
232
|
-
</
|
|
233
|
-
</
|
|
234
|
-
{
|
|
235
|
-
</
|
|
236
|
-
</
|
|
232
|
+
{C.text&&C.text.trim()&&<Gt style={{paddingHorizontal:I.spacing.lg,paddingVertical:I.spacing.md,backgroundColor:C.isMe?I.colors.messageBubble.sent:I.colors.messageBubble.received,borderRadius:I.borderRadius.lg,marginTop:I.spacing.xs}}>
|
|
233
|
+
<Bt style={{fontSize:I.typography.fontSize.base,color:C.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
|
|
234
|
+
{C.text}
|
|
235
|
+
</Bt>
|
|
236
|
+
</Gt>}
|
|
237
|
+
</Gt>:<Bt style={{fontSize:I.typography.fontSize.base,color:C.isMe?I.colors.messageBubble.sentText:I.colors.messageBubble.receivedText}}>
|
|
238
|
+
{C.text}
|
|
239
|
+
</Bt>}
|
|
240
|
+
</Se.View>},Hr=({visible:C,onClose:T,isMyMessage:R,selectedMessage:M,messagePosition:S,onActionPress:A,onEmojiReact:I})=>{let P=Pe(),[z,E]=Sn(!1),v=We(null),[k,D]=Sn({x:0,y:0}),V=We(new Se.Value(0)).current,B=We(new Se.Value(0)).current,L=We(!1),F=We(!1),j=Z=>{A(Z),T()},H=Z=>{I?.(Z),T()},N=()=>{E(!0)},O=()=>{E(!1)},_=Z=>{I?.(Z),E(!1),T()},re=["\u2764\uFE0F","\u{1F602}","\u{1F62E}","\u{1F622}","\u{1F621}","\u{1F44D}"],Ce=(()=>{if(!S)return{emojiBar:{top:ws/2-200,left:zt/2-160},actionMenu:{top:ws/2+50,left:zt/2-100}};let Z=320,ae=60,oe=200,we=160,W=20,Ie=8,Me,Ge,Q,ve,ze,ee=ws/2,Tt=ae+Ie+S.height+Ie+we,_e=ee-Tt/2;return Ge=_e,ze=_e+ae+Ie,ve=_e+ae+Ie+S.height+Ie,Me=S.x,Q=S.x,Me+Z>zt-W&&(Me=zt-Z-W),Me<W&&(Me=W),Q+oe>zt-W&&(Q=zt-oe-W),Q<W&&(Q=W),{emojiBar:{top:Ge,left:Me},actionMenu:{top:ve,left:Q},messagePreviewTop:ze,isNearAverageHeight:!0,isNearTop:!0,isEdgeCase:!0}})();return Is(()=>{C&&S&&!F.current&&(V.setValue(0),B.setValue(0),setTimeout(()=>{Se.sequence([Se.timing(V,{toValue:1,duration:200,useNativeDriver:!1}),Se.timing(B,{toValue:1,duration:200,useNativeDriver:!1})]).start(()=>{F.current=!0})},50))},[C,S,V,B]),Is(()=>{C||(L.current=!1,F.current=!1,V.setValue(0),B.setValue(0))},[C,V,B]),C?<>
|
|
237
241
|
{}
|
|
238
|
-
<
|
|
239
|
-
<
|
|
240
|
-
</
|
|
242
|
+
<Or visible={!0}onPress={T}>
|
|
243
|
+
<Pr style={ne.overlayPressable}onPress={T}/>
|
|
244
|
+
</Or>
|
|
241
245
|
|
|
242
|
-
<
|
|
246
|
+
<Gt ref={v}style={{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"}}>
|
|
243
247
|
{}
|
|
244
|
-
</
|
|
248
|
+
</Gt>
|
|
245
249
|
|
|
246
250
|
{}
|
|
247
|
-
{S&&
|
|
251
|
+
{S&&M&&<Fr message={M}positions={Ce}messagePosition={S}containerRef={v}containerOffset={k}setContainerOffset={D}/>}
|
|
248
252
|
|
|
249
253
|
{}
|
|
250
|
-
<
|
|
251
|
-
<
|
|
252
|
-
{
|
|
253
|
-
<
|
|
254
|
-
</
|
|
255
|
-
<
|
|
256
|
-
<
|
|
257
|
-
</
|
|
258
|
-
</
|
|
259
|
-
</
|
|
254
|
+
<Se.View style={[ne.emojiBar,{position:"absolute",top:Ce.emojiBar.top-(k.y||0),left:Ce.emojiBar.left,opacity:V,pointerEvents:"auto"}]}>
|
|
255
|
+
<Ar horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={ne.emojiContainer}>
|
|
256
|
+
{re.map((Z,ae)=><Vt key={ae}style={ne.emojiButton}onPress={()=>H(Z)}>
|
|
257
|
+
<Bt style={ne.emojiText}>{Z}</Bt>
|
|
258
|
+
</Vt>)}
|
|
259
|
+
<Vt style={ne.addEmojiButton}onPress={N}>
|
|
260
|
+
<Lr size={20}color='#666'/>
|
|
261
|
+
</Vt>
|
|
262
|
+
</Ar>
|
|
263
|
+
</Se.View>
|
|
260
264
|
|
|
261
265
|
{}
|
|
262
|
-
<
|
|
263
|
-
<
|
|
266
|
+
<Se.View style={[ne.actionMenu,{position:"absolute",top:Ce.actionMenu.top-(k.y||0)+(M?.replyTo?10:0),left:Ce.actionMenu.left,opacity:B,pointerEvents:"auto"}]}>
|
|
267
|
+
<Gt style={ne.actionItems}>
|
|
264
268
|
{}
|
|
265
|
-
<
|
|
266
|
-
<
|
|
267
|
-
<
|
|
268
|
-
</
|
|
269
|
+
<Vt style={ne.actionRow}onPress={()=>j("reply")}>
|
|
270
|
+
<Br size={18}color='#333'/>
|
|
271
|
+
<Bt style={ne.actionLabel}>{P("action.reply")}</Bt>
|
|
272
|
+
</Vt>
|
|
269
273
|
|
|
270
274
|
{}
|
|
271
|
-
<
|
|
272
|
-
<
|
|
273
|
-
<
|
|
274
|
-
</
|
|
275
|
+
<Vt style={ne.actionRow}onPress={()=>j("copy")}>
|
|
276
|
+
<Dr size={18}color='#333'/>
|
|
277
|
+
<Bt style={ne.actionLabel}>{P("action.copy")}</Bt>
|
|
278
|
+
</Vt>
|
|
275
279
|
|
|
276
280
|
{}
|
|
277
|
-
{R&&<
|
|
278
|
-
<
|
|
279
|
-
<
|
|
280
|
-
|
|
281
|
-
</
|
|
282
|
-
</
|
|
283
|
-
</
|
|
284
|
-
</
|
|
281
|
+
{R&&<Vt style={ne.actionRow}onPress={()=>j("delete")}>
|
|
282
|
+
<Er size={18}color='#ff4444'/>
|
|
283
|
+
<Bt style={[ne.actionLabel,{color:"#ff4444"}]}>
|
|
284
|
+
{P("action.delete")}
|
|
285
|
+
</Bt>
|
|
286
|
+
</Vt>}
|
|
287
|
+
</Gt>
|
|
288
|
+
</Se.View>
|
|
285
289
|
|
|
286
290
|
{}
|
|
287
|
-
<
|
|
288
|
-
</>:null},
|
|
289
|
-
<$
|
|
291
|
+
<At visible={z}onClose={O}onEmojiSelected={_}/>
|
|
292
|
+
</>:null},ne=Ss.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:{...Ss.absoluteFillObject,zIndex:1e3},backdrop:{...Ss.absoluteFillObject,backgroundColor:"rgba(0, 0, 0, 0.8)"}}),Fo=Hr;import{useRef as Nr,useEffect as Wr,useState as Ur}from"react";import{View as Ue,Text as Le,TouchableOpacity as In,ScrollView as Kr,StyleSheet as qr}from"react-native";import $r from"react-native-actions-sheet";var Yr=({visible:C,onClose:T,reactions:R,messageText:M,onAddReaction:S,onRemoveReaction:A})=>{let I=Nr(null),[P,z]=Ur(!1);Wr(()=>{C?I.current?.show():I.current?.hide()},[C]);let v=(()=>{let j=[];return R.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 O=0;O<Math.min(H.count,N.length);O++)j.push({id:`${H.emoji}-${O}`,name:N[O].name,avatar:N[O].avatar,emoji:H.emoji,timestamp:new Date().toISOString()})}),j})(),k=R.reduce((j,H)=>j+H.count,0),D=j=>{console.log("Remove reaction called with:",j),console.log("onRemoveReaction prop exists:",!!A),console.log("User is current user:",j.name==="You"),j.name==="You"&&A?(console.log("Calling onRemoveReaction with emoji:",j.emoji),A(j.emoji)):console.log("Not calling onRemoveReaction because:",{isCurrentUser:j.name==="You",hasCallback:!!A})},V=()=>{I.current?.hide(),T(),setTimeout(()=>{z(!0)},300)},B=()=>{z(!1)},L=j=>{console.log("Selected emoji from picker:",j),S?.(j),z(!1),T()},F=()=>{I.current?.hide(),T()};return<>
|
|
293
|
+
<$r ref={I}onClose={F}containerStyle={G.container}headerAlwaysVisible={!0}gestureEnabled={!0}closeOnTouchBackdrop={!0}>
|
|
290
294
|
{}
|
|
291
|
-
<
|
|
292
|
-
<
|
|
293
|
-
<
|
|
294
|
-
<
|
|
295
|
-
</
|
|
296
|
-
</
|
|
295
|
+
<Ue style={G.header}>
|
|
296
|
+
<Le style={G.title}>{k} reactions</Le>
|
|
297
|
+
<In onPress={F}style={G.closeButton}>
|
|
298
|
+
<Le style={G.closeText}>✕</Le>
|
|
299
|
+
</In>
|
|
300
|
+
</Ue>
|
|
297
301
|
|
|
298
302
|
{}
|
|
299
|
-
<
|
|
300
|
-
<
|
|
301
|
-
{
|
|
302
|
-
</
|
|
303
|
-
</
|
|
303
|
+
<Ue style={G.messagePreview}>
|
|
304
|
+
<Le style={G.messageText}numberOfLines={2}>
|
|
305
|
+
{M}
|
|
306
|
+
</Le>
|
|
307
|
+
</Ue>
|
|
304
308
|
|
|
305
309
|
{}
|
|
306
|
-
<
|
|
310
|
+
<Ue style={G.reactionButtons}>
|
|
307
311
|
{}
|
|
308
312
|
|
|
309
|
-
{R.map((
|
|
310
|
-
<
|
|
311
|
-
<
|
|
312
|
-
</
|
|
313
|
-
</
|
|
313
|
+
{R.map((j,H)=><Ue key={H}style={G.reactionButton}>
|
|
314
|
+
<Le style={G.reactionEmoji}>{j.emoji}</Le>
|
|
315
|
+
<Le style={G.reactionCount}>{j.count}</Le>
|
|
316
|
+
</Ue>)}
|
|
317
|
+
</Ue>
|
|
314
318
|
|
|
315
319
|
{}
|
|
316
|
-
<
|
|
317
|
-
{v.map(
|
|
318
|
-
<
|
|
319
|
-
<
|
|
320
|
-
<
|
|
321
|
-
<
|
|
322
|
-
{H&&<
|
|
323
|
-
</
|
|
324
|
-
</
|
|
325
|
-
<
|
|
326
|
-
<
|
|
327
|
-
</
|
|
320
|
+
<Kr style={G.userReactionsList}showsVerticalScrollIndicator={!1}>
|
|
321
|
+
{v.map(j=>{let H=j.name==="You",N=H?In:Ue;return<N key={j.id}style={[G.userReactionItem,H&&G.tappableUserReactionItem]}onPress={H?()=>D(j):void 0}activeOpacity={H?.7:1}>
|
|
322
|
+
<Ue style={G.userInfo}>
|
|
323
|
+
<Le style={G.userAvatar}>{j.avatar}</Le>
|
|
324
|
+
<Ue style={G.userDetails}>
|
|
325
|
+
<Le style={G.userName}>{j.name}</Le>
|
|
326
|
+
{H&&<Le style={G.removeText}>Tap to remove</Le>}
|
|
327
|
+
</Ue>
|
|
328
|
+
</Ue>
|
|
329
|
+
<Ue style={G.userReactionEmoji}>
|
|
330
|
+
<Le style={G.emojiText}>{j.emoji}</Le>
|
|
331
|
+
</Ue>
|
|
328
332
|
</N>})}
|
|
329
|
-
</
|
|
330
|
-
</$
|
|
333
|
+
</Kr>
|
|
334
|
+
</$r>
|
|
331
335
|
|
|
332
336
|
{}
|
|
333
|
-
<
|
|
334
|
-
</>},
|
|
335
|
-
<
|
|
337
|
+
<At visible={P}onClose={B}onEmojiSelected={L}/>
|
|
338
|
+
</>},G=qr.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}}),Ho=Yr;import Gr,{forwardRef as _r,useImperativeHandle as Jr}from"react";import{View as No,Text as Pn,TouchableOpacity as An}from"react-native";import Xr from"react-native-actions-sheet";import{X as Zr}from"lucide-react-native";var Ct=_r(({onOptionSelect:C,options:T},R)=>{let M=Gr.useRef(null);Jr(R,()=>({show:()=>M.current?.show(),hide:()=>M.current?.hide()}));let S=A=>{C(A),M.current?.hide()};return<Xr ref={M}headerAlwaysVisible gestureEnabled={!0}statusBarTranslucent drawUnderStatusBar={!1}containerStyle={{borderTopLeftRadius:20,borderTopRightRadius:20}}>
|
|
339
|
+
<No style={{padding:20,width:"100%"}}>
|
|
336
340
|
|
|
337
341
|
{}
|
|
338
|
-
<
|
|
339
|
-
<
|
|
342
|
+
<No style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:20}}>
|
|
343
|
+
<Pn style={{fontSize:18,fontWeight:"600",color:"#1F2937"}}>
|
|
340
344
|
Share Content
|
|
341
|
-
</
|
|
342
|
-
<
|
|
343
|
-
<
|
|
344
|
-
</
|
|
345
|
-
</
|
|
345
|
+
</Pn>
|
|
346
|
+
<An onPress={()=>M.current?.hide()}>
|
|
347
|
+
<Zr size={24}color="#6B7280"/>
|
|
348
|
+
</An>
|
|
349
|
+
</No>
|
|
346
350
|
|
|
347
351
|
{}
|
|
348
|
-
<
|
|
349
|
-
{T.map(A=>{let I=A.icon;return<
|
|
350
|
-
<
|
|
352
|
+
<No style={{flexDirection:"row",flexWrap:"wrap",justifyContent:"space-between",paddingBottom:20}}>
|
|
353
|
+
{T.map(A=>{let I=A.icon;return<An key={A.id}style={{width:"30%",aspectRatio:1,marginBottom:20,alignItems:"center",justifyContent:"center"}}onPress={()=>S(A.id)}>
|
|
354
|
+
<No style={{width:60,height:60,borderRadius:30,backgroundColor:"#F3F4F6",alignItems:"center",justifyContent:"center",marginBottom:8}}>
|
|
351
355
|
<I size={24}color={A.color}/>
|
|
352
|
-
</
|
|
353
|
-
<
|
|
356
|
+
</No>
|
|
357
|
+
<Pn style={{fontSize:12,color:"#6B7280",textAlign:"center",fontWeight:"500"}}>
|
|
354
358
|
{A.label}
|
|
355
|
-
</
|
|
356
|
-
</
|
|
357
|
-
</
|
|
358
|
-
</
|
|
359
|
-
</
|
|
360
|
-
<
|
|
361
|
-
<
|
|
362
|
-
<
|
|
363
|
-
<
|
|
364
|
-
<
|
|
365
|
-
</
|
|
366
|
-
</
|
|
367
|
-
</
|
|
368
|
-
{({pressed:P})=><
|
|
369
|
-
<
|
|
370
|
-
</
|
|
371
|
-
</
|
|
372
|
-
<
|
|
373
|
-
<
|
|
374
|
-
{
|
|
375
|
-
</
|
|
376
|
-
</
|
|
377
|
-
</Us>},Ro=Sa;import So,{forwardRef as ja,useRef as Oa,useImperativeHandle as Fa,useCallback as Ha}from"react";import{View as Go,TextInput as Na,TouchableOpacity as Ks,Platform as qs}from"react-native";import{Plus as Wa,Send as Ua,Mic as Ka}from"lucide-react-native";import{useRef as Ia,useCallback as Le}from"react";import{Alert as Q}from"react-native";import{Camera as va,Image as Pa,MapPin as Aa,User as za,FileText as Ba,BarChart3 as Va,Calendar as Da}from"lucide-react-native";var wa={maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"},$o=async(M,T={})=>{try{let R;try{R=await import("expo-image-manipulator")}catch(V){console.log("expo-image-manipulator not available, returning original image info:",V);let z=`image_${Date.now()}.jpg`;return{uri:M,width:1920,height:1920,fileName:z}}let C={...wa,...T};console.log("Starting image compression...",{uri:M,options:C});let S=await R.manipulateAsync(M,[],{});console.log("Original image info:",{width:S.width,height:S.height,uri:S.uri});let A=[];if(C.maxWidth||C.maxHeight){let{width:V,height:D}=S,z=V,L=D;if(C.maxWidth&&V>C.maxWidth){let k=C.maxWidth/V;z=C.maxWidth,L=D*k}if(C.maxHeight&&L>C.maxHeight){let k=C.maxHeight/L;L=C.maxHeight,z=z*k}(z!==V||L!==D)&&(A.push({resize:{width:Math.round(z),height:Math.round(L)}}),console.log("Resizing image:",{from:{width:V,height:D},to:{width:Math.round(z),height:Math.round(L)}}))}let I={compress:C.quality,format:C.format==="png"?R.SaveFormat?.PNG:R.SaveFormat?.JPEG};console.log("Applying compression with options:",I);let P=await R.manipulateAsync(M,A,I);console.log("Image compression completed:",{originalUri:M,compressedUri:P.uri,finalDimensions:{width:P.width,height:P.height}});let B=Date.now(),E=C.format==="png"?"png":"jpg",v=`compressed_image_${B}.${E}`;return{uri:P.uri,width:P.width,height:P.height,fileName:v}}catch(R){console.error("Error compressing image:",R);let C=R instanceof Error?R.message:"Unknown error";throw new Error(`Failed to compress image: ${C}`)}},Yo=(M,T)=>M>3e3||T>3e3?{maxWidth:1920,maxHeight:1920,quality:.7,format:"jpeg"}:M>1920||T>1920?{maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"}:{quality:.9,format:"jpeg"};var ka=[{id:"photo",label:"Photo",icon:Pa,color:"#3B82F6"},{id:"camera",label:"Camera",icon:va,color:"#6B7280"},{id:"location",label:"Location",icon:Aa,color:"#10B981"},{id:"contact",label:"Contact",icon:za,color:"#6B7280"},{id:"document",label:"Document",icon:Ba,color:"#3B82F6"},{id:"poll",label:"Poll",icon:Va,color:"#F59E0B"},{id:"event",label:"Event",icon:Da,color:"#EF4444"}],To=M=>{let T=Ia(null),R=Le(async()=>{console.log("Photo selection initiated");try{let v;try{v=await import("expo-image-picker")}catch(z){console.log("expo-image-picker not available:",z),Q.alert("Feature Not Available","Photo selection requires expo-image-picker to be installed. Please install expo-image-picker to use this feature.",[{text:"OK"}]);return}console.log("Requesting photo library permissions...");let{status:V}=await v.requestMediaLibraryPermissionsAsync();if(console.log("Photo library permission status:",V),V!=="granted"){Q.alert("Permission needed","Please grant photo library access to select images.");return}console.log("Waiting for UI to stabilize..."),await new Promise(z=>setTimeout(()=>z(void 0),300)),console.log("Launching image picker...");let D=await v.launchImageLibraryAsync({mediaTypes:"images",allowsEditing:!0,aspect:[4,3],quality:.8,allowsMultipleSelection:!1});if(console.log("Image picker result:",D),!D.canceled&&D.assets&&D.assets.length>0){let z=D.assets[0];console.log("Photo selected successfully:",z.uri);try{console.log("Starting image compression...");let L=Yo(z.width||1920,z.height||1920),k=await $o(z.uri,L);console.log("Image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:z.fileSize}})}catch(L){console.error("Image compression failed:",L),Q.alert("Compression Error","Failed to compress image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:z.uri,width:z.width,height:z.height,fileSize:z.fileSize,fileName:z.fileName||"image.jpg"}})}}else console.log("Photo selection was canceled by user")}catch(v){console.error("Error in photo selection process:",v),Q.alert("Photo Selection Error","Failed to open photo library. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),C=Le(async()=>{console.log("Camera capture initiated");try{let v;try{v=await import("expo-image-picker")}catch(z){console.log("expo-image-picker not available:",z),Q.alert("Feature Not Available","Camera capture requires expo-image-picker to be installed. Please install expo-image-picker to use this feature.",[{text:"OK"}]);return}console.log("Requesting camera permissions...");let{status:V}=await v.requestCameraPermissionsAsync();if(console.log("Camera permission status:",V),V!=="granted"){Q.alert("Permission needed","Please grant camera access to take photos.");return}console.log("Waiting for UI to stabilize..."),await new Promise(z=>setTimeout(()=>z(void 0),300)),console.log("Launching camera...");let D=await v.launchCameraAsync({allowsEditing:!0,aspect:[4,3],quality:.8,mediaTypes:"images"});if(console.log("Camera result:",D),!D.canceled&&D.assets&&D.assets.length>0){let z=D.assets[0];console.log("Photo captured successfully:",z.uri);try{console.log("Starting camera image compression...");let L=Yo(z.width||1920,z.height||1920),k=await $o(z.uri,L);console.log("Camera image compression completed:",k),M?.({type:"image",data:{...k,originalFileSize:z.fileSize}})}catch(L){console.error("Camera image compression failed:",L),Q.alert("Compression Error","Failed to compress captured image. Sending original image.",[{text:"OK"}]),M?.({type:"image",data:{uri:z.uri,width:z.width,height:z.height,fileSize:z.fileSize,fileName:z.fileName||"camera_photo.jpg"}})}}else console.log("Camera capture was canceled by user")}catch(v){console.error("Error in camera capture process:",v),Q.alert("Camera Error","Failed to open camera. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),S=Le(async()=>{console.log("Location sharing initiated");try{let v;try{v=await import("expo-location")}catch(k){console.log("expo-location not available:",k),Q.alert("Feature Not Available","Location sharing requires expo-location to be installed. Please install expo-location to use this feature.",[{text:"OK"}]);return}console.log("Requesting location permissions...");let{status:V}=await v.requestForegroundPermissionsAsync();if(console.log("Location permission status:",V),V!=="granted"){Q.alert("Permission needed","Please grant location access to share your location.");return}console.log("Getting current location...");let D=await v.getCurrentPositionAsync({accuracy:v.Accuracy.High});console.log("Getting address from coordinates...");let z=await v.reverseGeocodeAsync({latitude:D.coords.latitude,longitude:D.coords.longitude}),L={coordinates:{latitude:D.coords.latitude,longitude:D.coords.longitude},address:z[0]||null,timestamp:D.timestamp};console.log("Location shared successfully:",L.coordinates),M?.({type:"location",data:L})}catch(v){console.error("Error in location sharing process:",v),Q.alert("Location Error","Failed to get your location. Please try again or check your device permissions.",[{text:"OK"}])}},[M]),A=Le(async()=>{try{let v;try{v=await import("expo-contacts")}catch(D){console.log("expo-contacts not available:",D),Q.alert("Feature Not Available","Contact sharing requires expo-contacts to be installed. Please install expo-contacts to use this feature.",[{text:"OK"}]);return}let{status:V}=await v.requestPermissionsAsync();if(V!=="granted"){Q.alert("Permission needed","Please grant contacts access to share contacts.");return}Q.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),Q.alert("Error","Failed to access contacts. Please try again.")}finally{T.current?.hide()}},[]),I=Le(async()=>{console.log("Document selection initiated");try{let v;try{v=await import("expo-document-picker")}catch(D){console.log("expo-document-picker not available:",D),Q.alert("Feature Not Available","Document selection requires expo-document-picker to be installed. Please install expo-document-picker to use this feature.",[{text:"OK"}]);return}console.log("Waiting for UI to stabilize..."),await new Promise(D=>setTimeout(()=>D(void 0),300)),console.log("Launching document picker...");let V=await v.getDocumentAsync({type:"*/*",copyToCacheDirectory:!0,multiple:!1});if(console.log("Document picker result:",V),!V.canceled&&V.assets&&V.assets.length>0){let D=V.assets[0];console.log("Document selected successfully:",D.name),M?.({type:"document",data:{uri:D.uri,name:D.name,size:D.size,mimeType:D.mimeType}})}else console.log("Document selection was canceled by user")}catch(v){console.error("Error in document selection process:",v),Q.alert("Document Selection Error","Failed to open document picker. Please try again.",[{text:"OK"}])}},[M]),P=Le(()=>{Q.alert("Create Poll","Poll creation feature is coming soon! This would open a poll creation interface.",[{text:"OK",onPress:()=>console.log("Poll creation acknowledged")}])},[]),B=Le(()=>{Q.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 R();break;case"camera":await C();break;case"location":await S();break;case"contact":await A();break;case"document":await I();break;case"poll":P();break;case"event":B();break;default:console.warn(`Unknown attachment option: ${v}`)}}catch(V){console.error(`Error handling ${v}:`,V),Q.alert("Error",`Failed to handle ${v}. Please try again.`)}},[R,C,S,A,I,P,B]);return{menuRef:T,handleOptionSelect:E,options:ka}};import Ee,{useRef as La,useCallback as pe,createContext as Ea,useContext as hd}from"react";var kt=(M={})=>{let{initialValue:T="",initialHeight:R=50,onValueChange:C,onHeightChange:S,onSend:A,onAttachmentSend:I,onReplyCancel:P,onFocus:B,onBlur:E,maxHeight:v=100,minHeight:V=50,maxLength:D=1e3,placeholder:z="Type a message..."}=M,L=La(null),[k,O]=Ee.useState(T),[F,H]=Ee.useState(R),[N,j]=Ee.useState(!1),[J,ie]=Ee.useState(null),[Y,X]=Ee.useState([]),le=Ee.useMemo(()=>({value:k,height:F,isFocused:N,replyToMessage:J,attachments:Y}),[k,F,N,J,Y]),me=pe(oe=>{O(oe),C?.(oe)},[C]),re=pe(oe=>{let de=Math.max(V,Math.min(v,oe));H(de),S?.(de)},[V,v,S]),Z=pe(()=>{j(!0),B?.()},[B]),W=pe(()=>{j(!1),E?.()},[E]),ce=pe(oe=>{let{height:de}=oe.nativeEvent.contentSize,Tt=Math.max(V,Math.min(v,de+16));re(Tt)},[V,v,re]),ye=pe(()=>{A&&(k||Y.length>0)&&(A(k,Y,J),O(T),X([]),ie(null),H(R))},[A,k,Y,J,T,R]),he=pe(oe=>{I?(I(oe,k),k&&O(T)):X(de=>[...de,{...oe,id:Date.now().toString()}])},[I,k,T]),ne=pe(oe=>{X(de=>[...de,oe])},[]),ge=pe(oe=>{X(de=>de.filter(Tt=>Tt.id!==oe))},[]),xe=pe(()=>{X([])},[]),ee=pe(()=>{ie(null),P?.()},[P]),Se=pe(()=>{L.current?.focus()},[]),vo=Ee.useMemo(()=>({setValue:me,setHeight:re,setFocus:j,setReplyToMessage:ie,addAttachment:ne,removeAttachment:ge,clearAttachments:xe,sendMessage:ye,cancelReply:ee,focusInput:Se,handleAttachmentSelected:he,handleContentSizeChange:ce,handleFocus:Z,handleBlur:W}),[me,re,j,ie,ne,ge,xe,ye,ee,Se,he,ce,Z,W]),Po=Ee.useMemo(()=>({textInputRef:L}),[]);return{state:le,actions:vo,refs:Po}},yd=Ea(null);var we=ja(({value:M,onChangeText:T,onSend:R,onFocus:C,height:S,onContentSizeChange:A,replyToMessage:I,onCancelReply:P,onAttachmentSend:B},E)=>{let v=q(),V=Oa(null);Fa(E,()=>({focus:()=>{V.current?.focus()}}));let{state:D,actions:z}=kt({initialValue:M,initialHeight:S,onValueChange:T,onHeightChange:A,onSend:R,onAttachmentSend:B,onReplyCancel:P,onFocus:C});So.useEffect(()=>{M!==D.value&&z.setValue(M)},[M,D.value,z]),So.useEffect(()=>{S!==D.height&&z.setHeight(S)},[S,D.height,z]),So.useEffect(()=>{I!==D.replyToMessage&&z.setReplyToMessage(I||null)},[I,D.replyToMessage,z]),So.useEffect(()=>{if(I&&V.current){let O=setTimeout(()=>{V.current?.focus()},100);return()=>clearTimeout(O)}},[I]);let L=Ha(O=>{if(console.log("Attachment selected:",O),B)B(O,M.trim()||void 0),M.trim()&&T("");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)}},[B,M,T]),k=To(L);return<>
|
|
378
|
-
{I&&P&&<
|
|
379
|
-
<
|
|
380
|
-
<
|
|
381
|
-
<
|
|
382
|
-
<
|
|
383
|
-
</
|
|
359
|
+
</Pn>
|
|
360
|
+
</An>})}
|
|
361
|
+
</No>
|
|
362
|
+
</No>
|
|
363
|
+
</Xr>});Ct.displayName="AttachmentMenu";import{useEffect as Qr,useRef as ei}from"react";import{View as Ps,StyleSheet as ti,Animated as Ke}from"react-native";var oi=({isVisible:C})=>{let T=ei(new Ke.Value(0)).current;return Qr(()=>{if(!C){T.setValue(0);return}let R=Ke.loop(Ke.sequence([Ke.timing(T,{toValue:1,duration:1200,useNativeDriver:!0}),Ke.timing(T,{toValue:0,duration:1200,useNativeDriver:!0})]));return R.start(),()=>{R.stop()}},[C,T]),C?<Ps style={kt.container}>
|
|
364
|
+
<Ps style={kt.bubble}>
|
|
365
|
+
<Ps style={kt.dotsContainer}>
|
|
366
|
+
<Ke.View style={[kt.dot,{opacity:T.interpolate({inputRange:[0,.5,1],outputRange:[.3,1,.3]}),transform:[{translateY:T.interpolate({inputRange:[0,.5,1],outputRange:[0,-4,0]})}]}]}/>
|
|
367
|
+
<Ke.View style={[kt.dot,{opacity:T.interpolate({inputRange:[.33,.83,1.33],outputRange:[.3,1,.3]}),transform:[{translateY:T.interpolate({inputRange:[.33,.83,1.33],outputRange:[0,-4,0]})}]}]}/>
|
|
368
|
+
<Ke.View style={[kt.dot,{opacity:T.interpolate({inputRange:[.66,1.16,1.66],outputRange:[.3,1,.3]}),transform:[{translateY:T.interpolate({inputRange:[.66,1.16,1.66],outputRange:[0,-4,0]})}]}]}/>
|
|
369
|
+
</Ps>
|
|
370
|
+
</Ps>
|
|
371
|
+
</Ps>:null},kt=ti.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}}),Dt=oi;import As from"react";import{Pressable as Ci,Animated as zs}from"react-native";import{ChevronDown as Mi}from"lucide-react-native";var Ri=({visible:C,onPress:T,isReplyActive:R=!1})=>{let M=q(),S=As.useRef(new zs.Value(0)).current,[A,I]=As.useState(!1);return As.useEffect(()=>{zs.timing(S,{toValue:C?1:0,duration:200,useNativeDriver:!0}).start(()=>{I(C)})},[C,S]),!C&&!A?null:<Ci onPress={T}hitSlop={{top:10,bottom:10,left:10,right:10}}>
|
|
372
|
+
{({pressed:P})=><zs.View style={[{position:"absolute",bottom:40,right:M.spacing.lg,zIndex:9999,width:32,height:32,backgroundColor:M.colors.background,borderRadius:M.borderRadius.xl,justifyContent:"center",alignItems:"center",shadowColor:"#000",shadowOffset:{width:0,height:2},shadowOpacity:.25,shadowRadius:3.84,elevation:5,opacity:S,transform:P?[{scale:.95}]:[]}]}>
|
|
373
|
+
<Mi size={20}color={M.colors.text}/>
|
|
374
|
+
</zs.View>}
|
|
375
|
+
</Ci>},Wo=Ri;import{View as Vn,Text as Ti}from"react-native";var Si=({displayDate:C})=>{let T=q();return<Vn style={{marginVertical:T.spacing.lg,alignItems:"center"}}>
|
|
376
|
+
<Vn style={{borderRadius:T.borderRadius.full,backgroundColor:T.colors.surfaceSecondary,paddingHorizontal:T.spacing.md,paddingVertical:T.spacing.xs}}>
|
|
377
|
+
<Ti style={{fontSize:T.typography.fontSize.xs,color:T.colors.textSecondary,fontWeight:T.typography.fontWeight.medium}}>
|
|
378
|
+
{C}
|
|
379
|
+
</Ti>
|
|
380
|
+
</Vn>
|
|
381
|
+
</Vn>},Uo=Si;import qo,{forwardRef as Ei,useRef as Oi,useImperativeHandle as Fi,useCallback as Hi}from"react";import{View as Ds,TextInput as Ni,TouchableOpacity as Bn,Platform as kn}from"react-native";import{Plus as Wi,Send as Ui,Mic as Ki}from"lucide-react-native";import{useRef as Ii,useCallback as qe}from"react";import{Alert as X}from"react-native";import{Camera as vi,Image as Pi,MapPin as Ai,User as zi,FileText as Vi,BarChart3 as Bi,Calendar as ki}from"lucide-react-native";var wi={maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"},Vs=async(C,T={})=>{try{let R;try{R=await import("expo-image-manipulator")}catch(k){console.log("expo-image-manipulator not available, returning original image info:",k);let V=`image_${Date.now()}.jpg`;return{uri:C,width:1920,height:1920,fileName:V}}let M={...wi,...T};console.log("Starting image compression...",{uri:C,options:M});let S=await R.manipulateAsync(C,[],{});console.log("Original image info:",{width:S.width,height:S.height,uri:S.uri});let A=[];if(M.maxWidth||M.maxHeight){let{width:k,height:D}=S,V=k,B=D;if(M.maxWidth&&k>M.maxWidth){let L=M.maxWidth/k;V=M.maxWidth,B=D*L}if(M.maxHeight&&B>M.maxHeight){let L=M.maxHeight/B;B=M.maxHeight,V=V*L}(V!==k||B!==D)&&(A.push({resize:{width:Math.round(V),height:Math.round(B)}}),console.log("Resizing image:",{from:{width:k,height:D},to:{width:Math.round(V),height:Math.round(B)}}))}let I={compress:M.quality,format:M.format==="png"?R.SaveFormat?.PNG:R.SaveFormat?.JPEG};console.log("Applying compression with options:",I);let P=await R.manipulateAsync(C,A,I);console.log("Image compression completed:",{originalUri:C,compressedUri:P.uri,finalDimensions:{width:P.width,height:P.height}});let z=Date.now(),E=M.format==="png"?"png":"jpg",v=`compressed_image_${z}.${E}`;return{uri:P.uri,width:P.width,height:P.height,fileName:v}}catch(R){console.error("Error compressing image:",R);let M=R instanceof Error?R.message:"Unknown error";throw new Error(`Failed to compress image: ${M}`)}},Bs=(C,T)=>C>3e3||T>3e3?{maxWidth:1920,maxHeight:1920,quality:.7,format:"jpeg"}:C>1920||T>1920?{maxWidth:1920,maxHeight:1920,quality:.8,format:"jpeg"}:{quality:.9,format:"jpeg"};var Di=[{id:"photo",label:"Photo",icon:Pi,color:"#3B82F6"},{id:"camera",label:"Camera",icon:vi,color:"#6B7280"},{id:"location",label:"Location",icon:Ai,color:"#10B981"},{id:"contact",label:"Contact",icon:zi,color:"#6B7280"},{id:"document",label:"Document",icon:Vi,color:"#3B82F6"},{id:"poll",label:"Poll",icon:Bi,color:"#F59E0B"},{id:"event",label:"Event",icon:ki,color:"#EF4444"}],Ko=C=>{let T=Ii(null),R=qe(async()=>{console.log("Photo selection initiated");try{let v;try{v=await import("expo-image-picker")}catch(V){console.log("expo-image-picker not available:",V),X.alert("Feature Not Available","Photo selection requires expo-image-picker to be installed. Please install expo-image-picker to use this feature.",[{text:"OK"}]);return}console.log("Requesting photo library permissions...");let{status:k}=await v.requestMediaLibraryPermissionsAsync();if(console.log("Photo library permission status:",k),k!=="granted"){X.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 D=await v.launchImageLibraryAsync({mediaTypes:"images",allowsEditing:!0,aspect:[4,3],quality:.8,allowsMultipleSelection:!1});if(console.log("Image picker result:",D),!D.canceled&&D.assets&&D.assets.length>0){let V=D.assets[0];console.log("Photo selected successfully:",V.uri);try{console.log("Starting image compression...");let B=Bs(V.width||1920,V.height||1920),L=await Vs(V.uri,B);console.log("Image compression completed:",L),C?.({type:"image",data:{...L,originalFileSize:V.fileSize}})}catch(B){console.error("Image compression failed:",B),X.alert("Compression Error","Failed to compress image. Sending original image.",[{text:"OK"}]),C?.({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),X.alert("Photo Selection Error","Failed to open photo library. Please try again or check your device permissions.",[{text:"OK"}])}},[C]),M=qe(async()=>{console.log("Camera capture initiated");try{let v;try{v=await import("expo-image-picker")}catch(V){console.log("expo-image-picker not available:",V),X.alert("Feature Not Available","Camera capture requires expo-image-picker to be installed. Please install expo-image-picker to use this feature.",[{text:"OK"}]);return}console.log("Requesting camera permissions...");let{status:k}=await v.requestCameraPermissionsAsync();if(console.log("Camera permission status:",k),k!=="granted"){X.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 D=await v.launchCameraAsync({allowsEditing:!0,aspect:[4,3],quality:.8,mediaTypes:"images"});if(console.log("Camera result:",D),!D.canceled&&D.assets&&D.assets.length>0){let V=D.assets[0];console.log("Photo captured successfully:",V.uri);try{console.log("Starting camera image compression...");let B=Bs(V.width||1920,V.height||1920),L=await Vs(V.uri,B);console.log("Camera image compression completed:",L),C?.({type:"image",data:{...L,originalFileSize:V.fileSize}})}catch(B){console.error("Camera image compression failed:",B),X.alert("Compression Error","Failed to compress captured image. Sending original image.",[{text:"OK"}]),C?.({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),X.alert("Camera Error","Failed to open camera. Please try again or check your device permissions.",[{text:"OK"}])}},[C]),S=qe(async()=>{console.log("Location sharing initiated");try{let v;try{v=await import("expo-location")}catch(L){console.log("expo-location not available:",L),X.alert("Feature Not Available","Location sharing requires expo-location to be installed. Please install expo-location to use this feature.",[{text:"OK"}]);return}console.log("Requesting location permissions...");let{status:k}=await v.requestForegroundPermissionsAsync();if(console.log("Location permission status:",k),k!=="granted"){X.alert("Permission needed","Please grant location access to share your location.");return}console.log("Getting current location...");let D=await v.getCurrentPositionAsync({accuracy:v.Accuracy.High});console.log("Getting address from coordinates...");let V=await v.reverseGeocodeAsync({latitude:D.coords.latitude,longitude:D.coords.longitude}),B={coordinates:{latitude:D.coords.latitude,longitude:D.coords.longitude},address:V[0]||null,timestamp:D.timestamp};console.log("Location shared successfully:",B.coordinates),C?.({type:"location",data:B})}catch(v){console.error("Error in location sharing process:",v),X.alert("Location Error","Failed to get your location. Please try again or check your device permissions.",[{text:"OK"}])}},[C]),A=qe(async()=>{try{let v;try{v=await import("expo-contacts")}catch(D){console.log("expo-contacts not available:",D),X.alert("Feature Not Available","Contact sharing requires expo-contacts to be installed. Please install expo-contacts to use this feature.",[{text:"OK"}]);return}let{status:k}=await v.requestPermissionsAsync();if(k!=="granted"){X.alert("Permission needed","Please grant contacts access to share contacts.");return}X.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),X.alert("Error","Failed to access contacts. Please try again.")}finally{T.current?.hide()}},[]),I=qe(async()=>{console.log("Document selection initiated");try{let v;try{v=await import("expo-document-picker")}catch(D){console.log("expo-document-picker not available:",D),X.alert("Feature Not Available","Document selection requires expo-document-picker to be installed. Please install expo-document-picker to use this feature.",[{text:"OK"}]);return}console.log("Waiting for UI to stabilize..."),await new Promise(D=>setTimeout(()=>D(void 0),300)),console.log("Launching document picker...");let k=await v.getDocumentAsync({type:"*/*",copyToCacheDirectory:!0,multiple:!1});if(console.log("Document picker result:",k),!k.canceled&&k.assets&&k.assets.length>0){let D=k.assets[0];console.log("Document selected successfully:",D.name),C?.({type:"document",data:{uri:D.uri,name:D.name,size:D.size,mimeType:D.mimeType}})}else console.log("Document selection was canceled by user")}catch(v){console.error("Error in document selection process:",v),X.alert("Document Selection Error","Failed to open document picker. Please try again.",[{text:"OK"}])}},[C]),P=qe(()=>{X.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=qe(()=>{X.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=qe(async v=>{console.log(`Selected attachment option: ${v}`);try{switch(v){case"photo":await R();break;case"camera":await M();break;case"location":await S();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(k){console.error(`Error handling ${v}:`,k),X.alert("Error",`Failed to handle ${v}. Please try again.`)}},[R,M,S,A,I,P,z]);return{menuRef:T,handleOptionSelect:E,options:Di}};import $e,{useRef as Li,useCallback as Ae,createContext as ji,useContext as Pu}from"react";var _t=(C={})=>{let{initialValue:T="",initialHeight:R=50,onValueChange:M,onHeightChange:S,onSend:A,onAttachmentSend:I,onReplyCancel:P,onFocus:z,onBlur:E,maxHeight:v=100,minHeight:k=50,maxLength:D=1e3,placeholder:V="Type a message..."}=C,B=Li(null),[L,F]=$e.useState(T),[j,H]=$e.useState(R),[N,O]=$e.useState(!1),[_,re]=$e.useState(null),[J,Ce]=$e.useState([]),Z=$e.useMemo(()=>({value:L,height:j,isFocused:N,replyToMessage:_,attachments:J}),[L,j,N,_,J]),ae=Ae(se=>{F(se),M?.(se)},[M]),oe=Ae(se=>{let Te=Math.max(k,Math.min(v,se));H(Te),S?.(Te)},[k,v,S]),we=Ae(()=>{O(!0),z?.()},[z]),W=Ae(()=>{O(!1),E?.()},[E]),Ie=Ae(se=>{let{height:Te}=se.nativeEvent.contentSize,Et=Math.max(k,Math.min(v,Te+16));oe(Et)},[k,v,oe]),Me=Ae(()=>{A&&(L||J.length>0)&&(A(L,J,_),F(T),Ce([]),re(null),H(R))},[A,L,J,_,T,R]),Ge=Ae(se=>{I?(I(se,L),L&&F(T)):Ce(Te=>[...Te,{...se,id:Date.now().toString()}])},[I,L,T]),Q=Ae(se=>{Ce(Te=>[...Te,se])},[]),ve=Ae(se=>{Ce(Te=>Te.filter(Et=>Et.id!==se))},[]),ze=Ae(()=>{Ce([])},[]),ee=Ae(()=>{re(null),P?.()},[P]),Tt=Ae(()=>{B.current?.focus()},[]),_e=$e.useMemo(()=>({setValue:ae,setHeight:oe,setFocus:O,setReplyToMessage:re,addAttachment:Q,removeAttachment:ve,clearAttachments:ze,sendMessage:Me,cancelReply:ee,focusInput:Tt,handleAttachmentSelected:Ge,handleContentSizeChange:Ie,handleFocus:we,handleBlur:W}),[ae,oe,O,re,Q,ve,ze,Me,ee,Tt,Ge,Ie,we,W]),Go=$e.useMemo(()=>({textInputRef:B}),[]);return{state:Z,actions:_e,refs:Go}},zu=ji(null);var Ee=Ei(({value:C,onChangeText:T,onSend:R,onFocus:M,height:S,onContentSizeChange:A,replyToMessage:I,onCancelReply:P,onAttachmentSend:z},E)=>{let v=q(),k=Pe(),D=Oi(null);Fi(E,()=>({focus:()=>{D.current?.focus()}}));let{state:V,actions:B}=_t({initialValue:C,initialHeight:S,onValueChange:T,onHeightChange:A,onSend:R,onAttachmentSend:z,onReplyCancel:P,onFocus:M});qo.useEffect(()=>{C!==V.value&&B.setValue(C)},[C,V.value,B]),qo.useEffect(()=>{S!==V.height&&B.setHeight(S)},[S,V.height,B]),qo.useEffect(()=>{I!==V.replyToMessage&&B.setReplyToMessage(I||null)},[I,V.replyToMessage,B]),qo.useEffect(()=>{if(I&&D.current){let j=setTimeout(()=>{D.current?.focus()},100);return()=>clearTimeout(j)}},[I]);let L=Hi(j=>{if(console.log("Attachment selected:",j),z)z(j,C.trim()||void 0),C.trim()&&T("");else switch(j.type){case"image":console.log("Image attachment ready to send:",{uri:j.data.uri,dimensions:{width:j.data.width,height:j.data.height},fileName:j.data.fileName});break;case"document":console.log("Document attachment ready to send:",{name:j.data.name,size:j.data.size});break;case"location":console.log("Location attachment ready to send:",j.data.coordinates);break;case"contact":console.log("Contact attachment ready to send:",j.data);break;default:console.log("Other attachment ready to send:",j)}},[z,C,T]),F=Ko(L);return<>
|
|
382
|
+
{I&&P&&<Yt replyToMessage={I}onCancel={P}/>}
|
|
383
|
+
<Ds style={{borderTopWidth:1,borderTopColor:v.colors.borderLight,backgroundColor:v.colors.background}}>
|
|
384
|
+
<Ds style={{flexDirection:"row",alignItems:"center",backgroundColor:v.colors.background,paddingHorizontal:v.spacing.lg,paddingVertical:v.spacing.sm,minHeight:S}}>
|
|
385
|
+
<Bn style={{marginRight:v.spacing.md}}onPress={()=>F.menuRef.current?.show()}>
|
|
386
|
+
<Wi size={24}color={v.colors.textSecondary}/>
|
|
387
|
+
</Bn>
|
|
384
388
|
|
|
385
|
-
<
|
|
386
|
-
<
|
|
387
|
-
</
|
|
389
|
+
<Ds style={{flex:1,flexDirection:"row",alignItems:"center",borderRadius:v.borderRadius.full,backgroundColor:v.colors.surfaceSecondary,paddingHorizontal:v.spacing.lg,paddingVertical:6}}>
|
|
390
|
+
<Ni ref={D}style={{flex:1,fontSize:v.typography.fontSize.base,maxHeight:70,minHeight:18,paddingTop:kn.OS==="ios"?6:3,paddingBottom:kn.OS==="ios"?6:3,color:v.colors.text}}value={C}onChangeText={T}placeholder={k("input.placeholder")}placeholderTextColor={v.colors.textMuted}multiline maxLength={1e3}onFocus={M}onContentSizeChange={B.handleContentSizeChange}returnKeyType='default'textAlignVertical='center'/>
|
|
391
|
+
</Ds>
|
|
388
392
|
|
|
389
|
-
<
|
|
390
|
-
{
|
|
391
|
-
</
|
|
392
|
-
</
|
|
393
|
-
</
|
|
393
|
+
<Bn onPress={R}style={{marginLeft:v.spacing.md,height:40,width:40,alignItems:"center",justifyContent:"center",borderRadius:v.borderRadius.full,backgroundColor:C.trim()?v.colors.primary:v.colors.gray[300]}}disabled={!C.trim()}>
|
|
394
|
+
{C.trim()?<Ui size={18}color='white'/>:<Ki size={18}color='white'/>}
|
|
395
|
+
</Bn>
|
|
396
|
+
</Ds>
|
|
397
|
+
</Ds>
|
|
394
398
|
|
|
395
|
-
<
|
|
396
|
-
</>});
|
|
397
|
-
{
|
|
398
|
-
</
|
|
399
|
-
<
|
|
400
|
-
<
|
|
401
|
-
<
|
|
402
|
-
<
|
|
403
|
-
<
|
|
404
|
-
<
|
|
405
|
-
</
|
|
406
|
-
</
|
|
407
|
-
{
|
|
408
|
-
<
|
|
399
|
+
<Ct ref={F.menuRef}onOptionSelect={F.handleOptionSelect}options={F.options}/>
|
|
400
|
+
</>});Ee.displayName="MessageInput";import{View as Uu,TextInput as Ku,TouchableOpacity as $u,Platform as Yu}from"react-native";import{Plus as _u,Send as Ju,Mic as Xu}from"lucide-react-native";import Tl,{forwardRef as Sl}from"react";import Xi,{createContext as Zi,useContext as Qi,useMemo as el}from"react";import{useMemo as $i,useCallback as Yi}from"react";function Jt(C,T={}){let{initialNumToRender:R=20,maxToRenderPerBatch:M=10,windowSize:S=10}=T,A=$i(()=>on(C).reverse(),[C]),I=Yi(P=>P.listItemType==="date-separator"?P.id:P.id.toString(),[]);return{messageItems:A,keyExtractor:I,flatListProps:{initialNumToRender:R,maxToRenderPerBatch:M,windowSize:S,inverted:!0,showsVerticalScrollIndicator:!1,keyboardShouldPersistTaps:"handled",removeClippedSubviews:!1,scrollEventThrottle:16}}}import{useState as Gi,useCallback as Mt,useRef as Dn}from"react";function Ls(C={}){let{scrollThreshold:T=50,autoScrollToBottom:R=!0}=C,M=Dn(null),[S,A]=Gi({isNearBottom:!0,isNearTop:!1,showScrollToBottomButton:!1}),I=Dn(0),P=Mt(B=>{let{contentOffset:L,contentSize:F,layoutMeasurement:j}=B.nativeEvent,H=L.y,N=Math.abs(H)<T,O=Math.abs(H)>F.height-j.height-T;A({isNearBottom:N,isNearTop:O,showScrollToBottomButton:!N})},[T]),z=Mt(B=>{let L=B>I.current;return I.current=B,L},[]),E=Mt(()=>{},[]),v=Mt((B=!0)=>{M.current&&M.current.scrollToOffset({offset:0,animated:B})},[]),k=Mt((B,L=!0)=>{M.current&&M.current.scrollToOffset({offset:B,animated:L})},[]),D=Mt((B,L=!0)=>{M.current&&M.current.scrollToIndex({index:B,animated:L})},[]),V=Mt(B=>{z(B)&&R&&M.current&&setTimeout(()=>{v()},100)},[z,R,v]);return{flatListRef:M,scrollState:S,handleScroll:P,handleContentSizeChange:E,handleNewMessages:V,scrollToEnd:v,scrollToOffset:k,scrollToIndex:D}}import{useState as _i,useCallback as js}from"react";function Xt(C={}){let{enableMessageActions:T=!0}=C,[R,M]=_i({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0}),S=js((P,z)=>{T&&M({actionSheetVisible:!0,selectedMessage:P,messagePosition:z})},[T]),A=js(()=>{M({actionSheetVisible:!1,selectedMessage:null,messagePosition:void 0})},[]),I=js((P,z)=>{if(!R.selectedMessage)return;let{selectedMessage:E}=R;switch(P){case"reply":z?.onReply?.(E);break;case"copy":if(z?.onCopy)z.onCopy(E);else{let v=E.type==="image"&&E.imageData?E.text||"Image message":E.text;import("./clipboard-O4FPD4J6.mjs").then(({copyToClipboard:k})=>{k(v)}).catch(()=>{console.log("Clipboard functionality not available")})}break;case"delete":z?.onDelete?.(E.id);break;default:z?.onCustomAction?.(P,E);break}A()},[R.selectedMessage,A]);return{actionState:R,handleMessageLongPress:S,handleActionSheetClose:A,handleActionPress:I}}import{useState as Ln,useCallback as Zt}from"react";function Qt(C={}){let{enableReactionDetails:T=!0}=C,[R,M]=Ln({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),[S,A]=Ln(null),I=Zt(k=>{T&&k.reactions&&k.reactions.length>0&&(A(k),M({isReactionDetailsVisible:!0,selectedReactions:k.reactions,selectedMessageText:k.text}))},[T]),P=Zt(()=>{M({isReactionDetailsVisible:!1,selectedReactions:[],selectedMessageText:""}),A(null)},[]),z=Zt((k,D)=>{S&&D?.(S.id,k),P()},[S,P]),E=Zt((k,D)=>{S&&D?.(S.id,k),P()},[S,P]),v=Zt((k,D)=>{S&&D?.(S.id,k)},[S]);return{reactionState:R,selectedMessage:S,handleReactionPress:I,handleReactionDetailsClose:P,handleAddReaction:z,handleRemoveReaction:E,handleEmojiReact:v}}import{useState as Ji,useCallback as jn}from"react";function Es(){let[C,T]=Ji({replyToMessage:null}),R=jn(S=>{T({replyToMessage:S})},[]),M=jn(()=>{T({replyToMessage:null})},[]);return{replyState:C,setReplyToMessage:R,clearReply:M}}var En=Zi(null);function Lt(){let C=Qi(En);if(!C)throw new Error("useMessageListContext must be used within MessageListProvider");return C}function Co({children:C,messages:T,config:R={},...M}){let S=Jt(T,R),A=Ls(R),I=Xt(R),P=Qt(R),z=Es();Xi.useEffect(()=>{A.handleNewMessages(T.length)},[T.length,A.handleNewMessages]);let E=el(()=>({messageList:S,scroll:A,actions:I,reactions:P,reply:z,config:R,callbacks:M}),[S,A,I,P,z,R,M]);return<En.Provider value={E}>
|
|
401
|
+
{C}
|
|
402
|
+
</En.Provider>}import{useCallback as $o}from"react";import{View as Cl,StyleSheet as Ml,FlatList as Rl}from"react-native";var Ye={Provider:Co,Container:({children:C,style:T})=><Cl style={[On.container,T]}>{C}</Cl>,Messages:({renderMessage:C,style:T})=>{let{messageList:R,scroll:M,actions:S,reactions:A,callbacks:I}=Lt(),P=$o(({item:E,index:v})=>C&&E.listItemType!=="date-separator"?C({message:E,index:v})||null:E.listItemType==="date-separator"?<Uo date={E.date}displayDate={E.displayDate}/>:<Oo message={E}onLongPress={S.handleMessageLongPress}onReactionPress={A.handleReactionPress}onReactionRemove={I.onReactionRemove}/>,[S.handleMessageLongPress,A.handleReactionPress,I.onReactionRemove,C]),z=$o(E=>{M.handleScroll(E);let{isNearBottom:v,isNearTop:k}=M.scrollState;I.onScrollPositionChange?.(v,k),v&&I.onScrollToBottom?.(),k&&I.onScrollToTop?.()},[M.handleScroll,M.scrollState,I]);return<Rl ref={M.flatListRef}data={R.messageItems}renderItem={P}keyExtractor={R.keyExtractor}contentContainerStyle={[On.contentContainer,T]}onContentSizeChange={M.handleContentSizeChange}onScroll={z}{...R.flatListProps}/>},TypingIndicator:({isVisible:C})=>C?<Dt isVisible={C}/>:null,ScrollButton:({visible:C,isReplyActive:T,onPress:R})=>{let{scroll:M}=Lt();return<Wo visible={C??M.scrollState.showScrollToBottomButton}onPress={R??M.scrollToEnd}isReplyActive={T}/>},ActionSheet:()=>{let{actions:C,reactions:T,reply:R,callbacks:M,config:S}=Lt(),A=$o(P=>{C.handleActionPress(P,{onReply:z=>{R.setReplyToMessage(z),M.onReplyMessage?.(z)},onDelete:M.onMessageDelete,onCustomAction:M.onActionPress})},[C.handleActionPress,R.setReplyToMessage,M]),I=$o(P=>{console.log("\u{1F525} MessageListCompound - handleEmojiReact called with emoji:",P);let z=C.actionState.selectedMessage;console.log("\u{1F525} MessageListCompound - selectedMessage:",z?.id,"callbacks.onReactionAdd exists:",!!M.onReactionAdd),z&&M.onReactionAdd?(console.log("\u{1F525} MessageListCompound - Calling onReactionAdd for message:",z.id,"emoji:",P),M.onReactionAdd(z.id,P)):console.log("\u{1F525} MessageListCompound - NOT calling onReactionAdd. selectedMessage:",!!z,"callback exists:",!!M.onReactionAdd)},[C.actionState.selectedMessage,M.onReactionAdd]);return S.enableMessageActions?<Fo visible={C.actionState.actionSheetVisible}onClose={C.handleActionSheetClose}isMyMessage={C.actionState.selectedMessage?.isMe||!1}selectedMessage={C.actionState.selectedMessage||void 0}messagePosition={C.actionState.messagePosition}onActionPress={A}onEmojiReact={I}/>:null},ReactionDetails:()=>{let{reactions:C,callbacks:T,config:R}=Lt();return R.enableReactionDetails?<Ho visible={C.reactionState.isReactionDetailsVisible}onClose={C.handleReactionDetailsClose}reactions={C.reactionState.selectedReactions}messageText={C.reactionState.selectedMessageText}onRemoveReaction={M=>C.handleRemoveReaction(M,T.onReactionRemove)}/>:null}},On=Ml.create({container:{flex:1},contentContainer:{paddingVertical:16}});var Oe=Sl(({messages:C,isTyping:T,showScrollToBottom:R=!1,isReplyActive:M=!1,...S},A)=>{let I={scrollThreshold:S.scrollThreshold,autoScrollToBottom:S.autoScrollToBottom,enableMessageActions:S.enableMessageActions,enableReactionDetails:S.enableReactionDetails},P={onScrollToBottom:S.onScrollToBottom,onScrollToTop:S.onScrollToTop,onScrollPositionChange:S.onScrollPositionChange,onReactionAdd:S.onReactionAdd,onReactionRemove:S.onReactionRemove,onMessageDelete:S.onMessageDelete,onReplyMessage:S.onReplyMessage,onActionPress:S.onActionPress};return Tl.useImperativeHandle(A,()=>({scrollToEnd:(z=!0)=>{},scrollToOffset:(z,E=!0)=>{},scrollToIndex:(z,E=!0)=>{}}),[]),<Co messages={C}config={I}{...P}>
|
|
403
|
+
<Ye.Container>
|
|
404
|
+
<Ye.Messages/>
|
|
405
|
+
<Ye.TypingIndicator isVisible={T}/>
|
|
406
|
+
<Ye.ScrollButton visible={R?void 0:!1}isReplyActive={M}/>
|
|
407
|
+
<Ye.ActionSheet/>
|
|
408
|
+
<Ye.ReactionDetails/>
|
|
409
|
+
</Ye.Container>
|
|
410
|
+
</Co>});Oe.displayName="MessageList";import wl from"react";function Re(C){let T=wl.forwardRef((M,S)=>(St(),<C{...M}ref={S}/>)),R=C.displayName||C.name||"Component";return T.displayName=`RequireAuth(${R})`,T}function Be(C){return(...T)=>(St(),C(...T))}import{FlatList as Dl,RefreshControl as Ll}from"react-native";import{View as Ro,Text as Yo,TouchableOpacity as Vl}from"react-native";import{View as Os,Image as Il,Text as Pl}from"react-native";var Al=({avatar:C,isOnline:T=!1,size:R="medium"})=>{let M=q(),S=()=>{switch(R){case"small":return{width:32,height:32};case"large":return{width:64,height:64};default:return{width:48,height:48}}},A=()=>{switch(R){case"small":return{width:12,height:12};case"large":return{width:24,height:24};default:return{width:16,height:16}}},I=S(),P=A(),E=(()=>{switch(R){case"small":return 14;case"large":return 28;default:return 20}})();return<Os style={{position:"relative"}}>
|
|
411
|
+
{C&&C.trim()!==""?<Il source={{uri:C}}style={[I,{borderRadius:M.borderRadius.full}]}resizeMode="cover"/>:<Os style={[I,{borderRadius:M.borderRadius.full,backgroundColor:M.colors.primary,justifyContent:"center",alignItems:"center"}]}>
|
|
412
|
+
<Pl style={{color:M.colors.background,fontSize:E,fontWeight:"600"}}>
|
|
409
413
|
👤
|
|
410
|
-
</
|
|
411
|
-
</
|
|
414
|
+
</Pl>
|
|
415
|
+
</Os>}
|
|
412
416
|
|
|
413
417
|
{}
|
|
414
|
-
{T&&<
|
|
415
|
-
</
|
|
416
|
-
<
|
|
417
|
-
<
|
|
418
|
-
</
|
|
418
|
+
{T&&<Os style={[P,{position:"absolute",bottom:-2,right:-2,backgroundColor:M.colors.online,borderRadius:M.borderRadius.full,borderWidth:2,borderColor:M.colors.background}]}/>}
|
|
419
|
+
</Os>},Mo=Al;var Bl=({item:C,onPress:T})=>{let R=q(),M=C.unreadCount&&C.unreadCount>0;return<Vl style={{flexDirection:"row",alignItems:"center",paddingHorizontal:R.spacing.lg,paddingVertical:R.spacing.md,borderBottomWidth:1,borderBottomColor:R.colors.borderLight,backgroundColor:M?R.colors.unread:R.colors.background}}onPress={()=>T(C)}>
|
|
420
|
+
<Ro style={{marginRight:R.spacing.md}}>
|
|
421
|
+
<Mo avatar={C.avatar}isOnline={C.isOnline}size="medium"/>
|
|
422
|
+
</Ro>
|
|
419
423
|
|
|
420
|
-
<
|
|
424
|
+
<Ro style={{flex:1,marginRight:R.spacing.md}}>
|
|
421
425
|
{}
|
|
422
|
-
<
|
|
423
|
-
<
|
|
424
|
-
{
|
|
425
|
-
</
|
|
426
|
-
<
|
|
427
|
-
{
|
|
428
|
-
</
|
|
429
|
-
</
|
|
426
|
+
<Ro style={{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:R.spacing.xs}}>
|
|
427
|
+
<Yo style={{fontSize:R.typography.fontSize.base,flex:1,fontWeight:M?R.typography.fontWeight.bold:R.typography.fontWeight.semibold,color:R.colors.text}}>
|
|
428
|
+
{C.name}
|
|
429
|
+
</Yo>
|
|
430
|
+
<Yo style={{fontSize:R.typography.fontSize.sm,marginLeft:R.spacing.sm,color:M?R.colors.gray[700]:R.colors.textSecondary,fontWeight:M?R.typography.fontWeight.medium:R.typography.fontWeight.normal}}>
|
|
431
|
+
{C.time}
|
|
432
|
+
</Yo>
|
|
433
|
+
</Ro>
|
|
430
434
|
|
|
431
435
|
{}
|
|
432
|
-
<
|
|
433
|
-
<
|
|
434
|
-
{
|
|
435
|
-
</
|
|
436
|
-
{
|
|
437
|
-
<
|
|
438
|
-
{
|
|
439
|
-
</
|
|
440
|
-
</
|
|
441
|
-
</
|
|
442
|
-
</
|
|
443
|
-
</
|
|
444
|
-
<
|
|
445
|
-
{
|
|
446
|
-
</
|
|
447
|
-
</
|
|
448
|
-
<
|
|
449
|
-
<
|
|
450
|
-
<
|
|
451
|
-
</
|
|
436
|
+
<Ro style={{flexDirection:"row",alignItems:"center"}}>
|
|
437
|
+
<Yo style={{fontSize:R.typography.fontSize.sm,flex:1,color:M?R.colors.gray[800]:R.colors.textSecondary,fontWeight:M?R.typography.fontWeight.medium:R.typography.fontWeight.normal}}numberOfLines={1}>
|
|
438
|
+
{C.message}
|
|
439
|
+
</Yo>
|
|
440
|
+
{C.unreadCount&&<Ro style={{width:20,height:20,backgroundColor:R.colors.primary,borderRadius:R.borderRadius.full,alignItems:"center",justifyContent:"center",marginLeft:R.spacing.sm}}>
|
|
441
|
+
<Yo style={{fontSize:R.typography.fontSize.xs,color:"white",fontWeight:R.typography.fontWeight.bold}}>
|
|
442
|
+
{C.unreadCount}
|
|
443
|
+
</Yo>
|
|
444
|
+
</Ro>}
|
|
445
|
+
</Ro>
|
|
446
|
+
</Ro>
|
|
447
|
+
</Vl>},To=Bl;var jl=({chats:C,onChatPress:T,onRefresh:R,refreshing:M=!1})=>{let S=({item:A})=><To item={A}onPress={T}/>;return<Dl data={C}renderItem={S}keyExtractor={A=>A.id}showsVerticalScrollIndicator={!1}style={{flex:1}}refreshControl={R?<Ll refreshing={M}onRefresh={R}tintColor="#007AFF"colors={["#007AFF"]}/>:void 0}/>},Fs=jl;import{View as El,Text as Ol}from"react-native";var Fl=({title:C})=>{let T=q();return<El style={{backgroundColor:T.colors.background,paddingHorizontal:T.spacing.lg,paddingVertical:T.spacing.lg,borderBottomWidth:1,borderBottomColor:T.colors.borderLight}}>
|
|
448
|
+
<Ol style={{fontSize:T.typography.fontSize.xxl,fontWeight:T.typography.fontWeight.bold,color:T.colors.text}}>
|
|
449
|
+
{C}
|
|
450
|
+
</Ol>
|
|
451
|
+
</El>},Hs=Fl;import{View as Ns,TextInput as Hl,TouchableOpacity as Nl}from"react-native";import{Search as Wl,X as Ul}from"lucide-react-native";var Kl=({value:C,onChangeText:T,onClear:R,placeholder:M})=>{let S=q(),I=Pe()("search.placeholder");return<Ns style={{backgroundColor:S.colors.background,paddingHorizontal:S.spacing.lg,paddingVertical:S.spacing.md,borderBottomWidth:1,borderBottomColor:S.colors.borderLight}}>
|
|
452
|
+
<Ns style={{position:"relative"}}>
|
|
453
|
+
<Ns style={{position:"absolute",left:S.spacing.md,top:"50%",transform:[{translateY:-10}],zIndex:10}}>
|
|
454
|
+
<Wl size={20}color={S.colors.textMuted}/>
|
|
455
|
+
</Ns>
|
|
452
456
|
|
|
453
|
-
<
|
|
457
|
+
<Hl value={C}onChangeText={T}placeholder={M||I}placeholderTextColor={S.colors.textMuted}style={{backgroundColor:S.colors.surfaceSecondary,borderRadius:S.borderRadius.full,paddingLeft:48,paddingRight:40,paddingVertical:S.spacing.md,color:S.colors.text,fontSize:S.typography.fontSize.base}}autoCapitalize="none"autoCorrect={!1}clearButtonMode="never"/>
|
|
454
458
|
|
|
455
|
-
{
|
|
456
|
-
<
|
|
457
|
-
</
|
|
458
|
-
</
|
|
459
|
-
</
|
|
459
|
+
{C.length>0&&<Nl onPress={R}style={{position:"absolute",right:S.spacing.md,top:"50%",transform:[{translateY:-10}]}}hitSlop={{top:10,bottom:10,left:10,right:10}}>
|
|
460
|
+
<Ul size={20}color={S.colors.textMuted}/>
|
|
461
|
+
</Nl>}
|
|
462
|
+
</Ns>
|
|
463
|
+
</Ns>},Ws=Kl;import{useState as ql,useCallback as jt}from"react";import Us from"dayjs";var Rt=Us(),Fn=Rt.subtract(1,"day"),Hn=Rt.subtract(2,"day"),Nn=Rt.subtract(3,"day"),$l=[{id:1,text:"Hi! How are you?",isMe:!1,timestamp:Nn.hour(10).minute(30).toISOString(),senderName:"Anna"},{id:2,text:"Hey! Great, thanks! And you?",isMe:!0,timestamp:Nn.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:Hn.hour(14).minute(20).toISOString(),senderName:"Anna"},{id:4,text:"Maybe we could go to the movies?",isMe:!0,timestamp:Hn.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:Fn.hour(9).minute(15).toISOString(),senderName:"Anna"},{id:6,text:"Great! What movies are you interested in?",isMe:!0,timestamp:Fn.hour(9).minute(20).toISOString()},{id:7,text:"Maybe something action or comedy?",isMe:!1,timestamp:Rt.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:Rt.hour(8).minute(35).toISOString()},{id:9,text:"Perfect! What time should we meet?",isMe:!1,timestamp:Rt.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:Rt.hour(9).minute(15).toISOString(),reactions:[{emoji:"\u{1F44D}",count:1,users:["anna"]},{emoji:"\u23F0",count:1,users:["me"]}]}],Ks=C=>{let T=$l.map(v=>v.isMe?v:{...v,senderName:C||v.senderName}),[R,M]=ql(T),S=jt((v,k)=>{if(console.log("sendMessage called with text:",v,"and replyTo:",k),!v.trim())return;let D={id:Date.now(),text:v.trim(),isMe:!0,timestamp:Us().toISOString(),status:"sent",replyTo:k};M(V=>[...V,D]),setTimeout(()=>{M(V=>V.map(B=>B.id===D.id?{...B,status:"delivered"}:B))},1e3),setTimeout(()=>{M(V=>V.map(B=>B.id===D.id?{...B,status:"read"}:B))},3e3)},[]),A=jt((v,k,D)=>{let V={id:Date.now(),text:k||"",isMe:!0,timestamp:Us().toISOString(),status:"sent",type:"image",imageData:v,replyTo:D};M(B=>[...B,V]),setTimeout(()=>{M(B=>B.map(L=>L.id===V.id?{...L,status:"delivered"}:L))},1e3),setTimeout(()=>{M(B=>B.map(L=>L.id===V.id?{...L,status:"read"}:L))},3e3)},[]),I=jt((v,k)=>{M(D=>D.map(V=>V.id===v?{...V,status:k}:V))},[]),P=jt((v,k)=>{M(D=>D.map(V=>{if(V.id===v){let B=V.reactions||[],L=B.findIndex(F=>F.emoji===k);if(L>=0){let F=[...B];return F[L]={...F[L],count:F[L].count+1,users:[...F[L].users,"me"]},{...V,reactions:F}}else{let F={emoji:k,count:1,users:["me"]};return{...V,reactions:[...B,F]}}}return V}))},[]),z=jt((v,k)=>{console.log("removeReaction 1212121 called with messageId:",v,"and emoji:",k),M(D=>D.map(V=>{if(V.id===v){let B=V.reactions||[],L=B.findIndex(F=>F.emoji===k);if(L>=0){let F=B[L];if(F.count>1){let j=[...B];return j[L]={...F,count:F.count-1,users:F.users.filter(H=>H!=="me")},{...V,reactions:j}}else return{...V,reactions:B.filter(j=>j.emoji!==k)}}}return V}))},[]),E=jt(v=>{console.log("deleteMessage called with messageId:",v),M(k=>{let D=k.map(V=>V.id===v?{...V,deleted:!0}:V);return console.log("Message marked as deleted:",v),D})},[]);return{messages:R,sendMessage:S,sendImageMessage:A,updateMessageStatus:I,addReaction:P,deleteMessage:E,removeReaction:z}};import{useState as Wn,useCallback as je}from"react";var qs=(C={})=>{St();let[T,R]=Wn(C.initialMessages||[]),[M,S]=Wn(!1),A=je((B,L)=>{let F={id:Date.now(),text:B,isMe:!0,timestamp:new Date().toISOString(),status:"sent",replyTo:L?{id:L.id,text:L.text,senderName:L.senderName,isMe:L.isMe}:void 0};R(j=>[F,...j])},[]),I=je(B=>{R(L=>[B,...L])},[]),P=je((B,L)=>{R(F=>F.map(j=>j.id===B?{...j,...L}:j))},[]),z=je(B=>{R(L=>L.filter(F=>F.id!==B))},[]),E=je((B,L)=>{R(F=>F.map(j=>{if(j.id!==B)return j;let H=j.reactions||[];if(H.find(O=>O.emoji===L))return{...j,reactions:H.map(O=>O.emoji===L?{...O,count:O.count+1,users:[...O.users,"current-user"]}:O)};{let O={emoji:L,count:1,users:["current-user"]};return{...j,reactions:[...H,O]}}}))},[]),v=je((B,L)=>{R(F=>F.map(j=>{if(j.id!==B)return j;let H=j.reactions||[],N=H.find(O=>O.emoji===L);return N?N.count<=1?{...j,reactions:H.filter(O=>O.emoji!==L)}:{...j,reactions:H.map(O=>O.emoji===L?{...O,count:O.count-1,users:O.users.filter(_=>_!=="current-user")}:O)}:j}))},[]),k=je(B=>{S(B)},[]),D=je(()=>{R(C.initialMessages||[]),S(!1)},[C.initialMessages]),V=je(B=>T.find(L=>L.id===B),[T]);return{messages:T,isTyping:M,sendMessage:A,addReaction:E,removeReaction:v,setMessages:R,addMessage:I,updateMessage:P,deleteMessage:z,setTyping:k,resetChat:D,getMessageById:V}};import{useState as Wp,useCallback as Up,useRef as Kp,useEffect as qp}from"react";var gg=Re(es),hg=Re(Jo),fg=Be(Ft),xg=Re(Oe),bg=Re(Ee),Mg=Re(Ao),Tg=Re(Dt),wg=Re(Fs),Ig=Re(To),vg=Re(Hs),Pg=Re(Ws),Vg=Re(Mo),Bg=Re(Ct),Lg=Re(tn),jg=Be(q),Ng=Be(qs),Wg=Be(Ks),Ug=Be(Jt),Kg=Be(Xt),qg=Be(Qt),$g=Be(Nt),Gg=Be(_t);export{Bg as AttachmentMenu,gg as Chat,Vg as ChatAvatar,vg as ChatHeader,Ig as ChatItem,wg as ChatList,Pg as ChatListSearchBar,hg as ChatProvider,Mg as ChatScreenHeader,Io as I18nProvider,bg as MessageInput,xg as MessageList,Lg as ThemeProvider,Tg as TypingIndicator,Wt as defaultTheme,So as defaultTranslations,Un as getAuthState,Kn as getProjectId,Ot as getTranslation,$n as initChat,qn as isInitialized,wo as isSupportedLocale,$g as useAttachments,fg as useChatConfig,Wg as useChatMessages,Ng as useChatSDK,Kg as useMessageActions,Gg as useMessageInput,Ug as useMessageList,qg as useMessageReactions,jg as useTheme,Js as useTranslation,Pe as useTranslationFunction};
|