softchatjs-react-native
Version:
React native UI SDK for softchatjs-core. Create a free account at: https://www.softchatjs.com
1 lines • 9.52 kB
Source Map (JSON)
{"version":3,"sources":["../../src/contexts/MessageStateContext.tsx","../../src/constants/defaultUser.ts"],"sourcesContent":["import React, {\r\n createContext,\r\n useState,\r\n useContext,\r\n} from \"react\";\r\nimport {\r\n SetState,\r\n} from \"../types\";\r\nimport { Audio, AVPlaybackStatus } from 'expo-av';\r\nimport { Emoticon, Message, SendMessageGenerics, Media, UserMeta, Conversation, ConversationListItem } from \"softchatjs-core\";\r\nimport defaultUser from \"../constants/defaultUser\";\r\n\r\ntype MessageStateContext = {\r\n globalTextMessage: string,\r\n setGlobalTextMessage: SetState<string>,\r\n stickers: Emoticon[],\r\n setStickers: SetState<Emoticon[]>,\r\n pendingMessages: Array<Partial<Message>>,\r\n addNewPendingMessages: (message: Partial<Message>) => void;\r\n removePendingMessage: (messageId: string) => void;\r\n updatePendingMessage: (messageId: string, message: Message) => void;\r\n playVoiceMessage: (media: Media) => void;\r\n pauseVoiceMessage: () => void;\r\n resumeVoiceMessage: () => void;\r\n audioState: \"playing\" | \"paused\" | \"loading\" | null,\r\n unload: () => void;\r\n sound: Audio.Sound | null,\r\n activeVoiceMessage: Media | null,\r\n avPlayBackStatus: AVPlaybackStatus & { positionMillis: number } | null,\r\n userMeta: UserMeta,\r\n setUserMeta: SetState<UserMeta>,\r\n conversationList: Array<ConversationListItem>,\r\n setConversationList: SetState<Array<ConversationListItem>>\r\n};\r\n\r\nconst initialMessageStateContext: MessageStateContext = {\r\n globalTextMessage: '',\r\n setGlobalTextMessage: () => {},\r\n stickers: [],\r\n setStickers: () => {},\r\n pendingMessages: [],\r\n addNewPendingMessages: (message: Partial<Message>) => {},\r\n removePendingMessage: (messageId: string) => {},\r\n updatePendingMessage: (messageId: string, message: Message) => {},\r\n playVoiceMessage: (media: Media) => {},\r\n pauseVoiceMessage: () => {},\r\n resumeVoiceMessage: () => {},\r\n audioState: null,\r\n unload: () => {},\r\n sound: null,\r\n activeVoiceMessage: null,\r\n avPlayBackStatus: null,\r\n userMeta: defaultUser,\r\n setUserMeta: () => {},\r\n conversationList: [],\r\n setConversationList: () => {}\r\n}\r\n\r\nexport default initialMessageStateContext;\r\n\r\nconst MessageStateContext = createContext<MessageStateContext>(\r\n initialMessageStateContext\r\n);\r\n\r\nexport const useMessageState = () => useContext(MessageStateContext);\r\n\r\nexport const MessageStateProvider = ({ children }: { children: JSX.Element }) => {\r\n \r\n const [conversationList, setConversationList] = useState<Array<ConversationListItem>>([]);\r\n const [ globalTextMessage, setGlobalTextMessage ] = useState('');\r\n const [ stickers, setStickers ] = useState<Emoticon[]>([]);\r\n const [ pendingMessages, setPendingMessages ] = useState<Array<Partial<Message>>>([]);\r\n const [sound, setSound] = useState<Audio.Sound | null>(null);\r\n const [ audioState, setAudioState ] = useState<\"playing\" | \"paused\" | \"loading\" | null>(null);\r\n const [ activeVoiceMessage, setActiveVoiceMessage ] = useState<Media | null>(null);\r\n const [ avPlayBackStatus, setAvPlayBackStatus ] = useState<AVPlaybackStatus & { positionMillis: number } | null>(null);\r\n const [ userMeta, setUserMeta ] = useState<UserMeta>(defaultUser);\r\n\r\n const addNewPendingMessages = (message: Partial<Message>) => {\r\n setPendingMessages((prev) => {\r\n return [ ...prev, message ]\r\n });\r\n }\r\n\r\n const removePendingMessage = (messageId: string) => {\r\n setPendingMessages((prev) => {\r\n const filtered = prev.filter(m => m.messageId !== messageId)\r\n return filtered\r\n });\r\n }\r\n\r\n const updatePendingMessage = (messageId: string, updatedMessage: Message) => {\r\n const clonedMessage = JSON.parse(JSON.stringify(updatedMessage));\r\n \r\n setPendingMessages((prev) =>\r\n prev.map((message) =>\r\n message.messageId === messageId ? { ...message, ...clonedMessage } : message\r\n )\r\n );\r\n };\r\n \r\n const onPlaybackStatusUpdate = (data: AVPlaybackStatus & { didJustFinish: boolean , positionMillis: number}) => {\r\n console.log(data)\r\n setAvPlayBackStatus(data)\r\n if(data?.didJustFinish){\r\n setAudioState(null);\r\n unload();\r\n }\r\n };\r\n \r\n const playVoiceMessage = async (media: Media) => {\r\n if (activeVoiceMessage !== null && media.mediaId !== activeVoiceMessage?.mediaId) {\r\n return unload()\r\n }\r\n \r\n setActiveVoiceMessage(media);\r\n setAudioState(\"loading\");\r\n \r\n try {\r\n console.log('Loading Sound');\r\n console.log(media.mediaUrl)\r\n const { sound: avSound } = await Audio.Sound.createAsync({ uri: media.mediaUrl }, {}, onPlaybackStatusUpdate);\r\n setSound(avSound);\r\n console.log('Playing Sound');\r\n setAudioState(\"playing\");\r\n await avSound.playAsync();\r\n } catch (error) {\r\n console.error(\"Error loading audio: \", error);\r\n setAudioState(null); \r\n }\r\n };\r\n\r\n const pauseVoiceMessage = async () => {\r\n await sound?.pauseAsync();\r\n setAudioState(\"paused\")\r\n }\r\n\r\n const resumeVoiceMessage = async () => {\r\n if(audioState === \"paused\"){\r\n await sound?.playAsync();\r\n setAudioState(\"playing\")\r\n }\r\n }\r\n\r\n const unload = () => {\r\n console.log('Unloading Sound');\r\n sound?.stopAsync();\r\n sound?.unloadAsync();\r\n setSound(null);\r\n setActiveVoiceMessage(null);\r\n setAudioState(null)\r\n }\r\n\r\n return (\r\n <MessageStateContext.Provider\r\n value={{\r\n globalTextMessage,\r\n setGlobalTextMessage,\r\n stickers,\r\n setStickers,\r\n pendingMessages, \r\n addNewPendingMessages,\r\n removePendingMessage,\r\n updatePendingMessage,\r\n playVoiceMessage,\r\n pauseVoiceMessage,\r\n resumeVoiceMessage,\r\n audioState,\r\n unload,\r\n sound,\r\n activeVoiceMessage,\r\n avPlayBackStatus,\r\n userMeta,\r\n setUserMeta,\r\n conversationList,\r\n setConversationList\r\n }}\r\n >\r\n {children}\r\n </MessageStateContext.Provider>\r\n );\r\n};\r\n","export default {\r\n id: \"\",\r\n uid: \"\",\r\n username: \"\",\r\n firstname: \"\",\r\n lastname: \"\",\r\n profileUrl: \"\",\r\n color: \"\",\r\n custom: {}\r\n}\r\n"],"mappings":"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","names":[]}