@messenger-box/platform-mobile 10.0.3-alpha.40 → 10.0.3-alpha.46
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/CHANGELOG.md +8 -0
- package/lib/compute.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/queries/inboxQueries.js +77 -0
- package/lib/queries/inboxQueries.js.map +1 -0
- package/lib/routes.json +2 -3
- package/lib/screens/inbox/DialogThreadMessages.js +3 -7
- package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js +3 -7
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/components/DialogsListItem.js +47 -46
- package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js +313 -0
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +72 -57
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +115 -14
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
- package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
- package/lib/screens/inbox/containers/ConversationView.js +640 -493
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +100 -181
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +659 -245
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadsView.js +3 -3
- package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
- package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
- package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
- package/package.json +4 -4
- package/src/index.ts +2 -0
- package/src/queries/inboxQueries.ts +298 -0
- package/src/queries/index.d.ts +2 -0
- package/src/queries/index.ts +1 -0
- package/src/screens/inbox/DialogThreadMessages.tsx +3 -11
- package/src/screens/inbox/DialogThreads.tsx +3 -7
- package/src/screens/inbox/components/Actionsheet.tsx +30 -0
- package/src/screens/inbox/components/DialogsListItem.tsx +89 -148
- package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
- package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
- package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +202 -221
- package/src/screens/inbox/components/SlackInput.tsx +23 -0
- package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +216 -30
- package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
- package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +6 -7
- package/src/screens/inbox/containers/ConversationView.tsx +1109 -669
- package/src/screens/inbox/containers/Dialogs.tsx +198 -342
- package/src/screens/inbox/containers/SupportServiceDialogs.tsx +2 -2
- package/src/screens/inbox/containers/ThreadConversationView.tsx +1141 -402
- package/src/screens/inbox/containers/ThreadsView.tsx +5 -5
- package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
- package/src/screens/inbox/machines/threadsMachine.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadsView.js","sources":["../../../../src/screens/inbox/containers/ThreadsView.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useEffect, useState } from 'react';\nimport { FlatList, Box, Heading, Input, Text, Icon, Center, Spinner, Button } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useNavigation, useRoute, useIsFocused, useFocusEffect } from '@react-navigation/native';\nimport { orderBy, uniqBy, startCase } from 'lodash-es';\nimport {\n useThreadMessagesQuery,\n OnThreadCreatedUpdatedDocument as THREAD_CHAT_ADDED,\n useOnThreadCreatedUpdatedSubscription,\n} from 'common/graphql';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { CHANGE_SETTINGS_ACTION } from '@admin-layout/client';\nimport { ThreadViewItem } from '../components/ThreadsViewItem';\nimport { config } from '../config';\nimport { Actions } from '../workflow/dialog-threads-xstate';\nconst { MESSAGES_PER_PAGE } = config;\n\nexport interface ThreadsViewProps {\n data: any;\n loading: boolean;\n refetch: any;\n subscribeToMore: any;\n error: any;\n channelId?: string;\n role?: string;\n channelsDetail?: any;\n refetchChannelDetail: (id: any) => Promise<any>;\n}\n\ninterface IThreadSubscriptionHandlerProps {\n subscribeToNewMessages: () => any;\n channelId: string | undefined;\n}\n\nconst ThreadsViewComponent = ({\n data,\n loading: threadLoading,\n refetch,\n subscribeToMore,\n error,\n channelId,\n role,\n channelsDetail,\n refetchChannelDetail,\n}: ThreadsViewProps) => {\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const dispatch = useDispatch();\n const navigation = useNavigation<any>();\n const isFocused = useIsFocused();\n const [refreshing, setRefresh] = useState<boolean>(false);\n\n // Use thread subscription for real-time updates\n const { data: threadCreatedUpdated } = useOnThreadCreatedUpdatedSubscription({\n variables: { channelId: channelId?.toString() },\n });\n\n // Subscribe to thread updates\n const subscribeToNewMessages = useCallback(() => {\n return subscribeToMore({\n document: THREAD_CHAT_ADDED,\n variables: { channelId: channelId?.toString() },\n updateQuery: (prev: any, { subscriptionData }: any) => {\n if (!subscriptionData.data) return prev;\n\n const newThread = subscriptionData.data.threadCreatedUpdated.data;\n if (!newThread) return prev;\n\n const threads = prev.threadMessages.data || [];\n const index = threads.findIndex((t: any) => t.id === newThread.id);\n\n let updatedThreads;\n if (index > -1) {\n // Update existing thread\n updatedThreads = [...threads];\n updatedThreads[index] = newThread;\n } else {\n // Add new thread\n updatedThreads = [newThread, ...threads];\n }\n\n return {\n ...prev,\n threadMessages: {\n ...prev.threadMessages,\n data: uniqBy(updatedThreads, 'id'),\n },\n };\n },\n });\n }, [channelId, subscribeToMore]);\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n navigation?.setOptions({ title: params?.title ?? 'Thread' });\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n });\n\n // Setup subscription\n const unsubscribe = subscribeToNewMessages();\n\n return () => {\n // Unsubscribe on cleanup\n if (unsubscribe) unsubscribe();\n };\n }, []),\n );\n\n // Effect for thread updates from subscription\n React.useEffect(() => {\n if (threadCreatedUpdated?.threadCreatedUpdated?.data) {\n // The subscription handler will handle updates\n }\n }, [threadCreatedUpdated]);\n\n const threads = React.useMemo(() => {\n if (data?.threadMessages?.data?.length == 0) return [];\n const threadsFiltered = data?.threadMessages?.data\n ? uniqBy([...data?.threadMessages?.data], ({ id }: any) => id)\n : [];\n return orderBy(threadsFiltered, ['updatedAt'], ['desc']) || [];\n }, [data]);\n\n const threadReplies = React.useMemo(() => {\n if (!threads?.length) return null;\n return threads?.map((t: any) => t?.replies)?.flat(1) || [];\n }, [threads]);\n\n const handleSelectThread = useCallback((id: any, title: any, postParentId: any) => {\n navigation.navigate(config.THREAD_MESSEGE_PATH as any, {\n channelId: id,\n role: role?.toString(),\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n setRefresh(true);\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n }).finally(() => {\n setRefresh(false);\n });\n }, []);\n\n const fetchMoreThreads = useCallback(() => {\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n });\n }, []);\n\n if (error) {\n return (\n <Box style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text>Error loading threads. {error.message}</Text>\n <Button onPress={handleRefresh} style={{ marginTop: 4 }}>\n <Text>Try Again</Text>\n </Button>\n </Box>\n );\n }\n\n return (\n <Box style={{ flex: 1 }}>\n {threadLoading && !threads?.length ? (\n <Center style={{ flex: 1 }}>\n <Spinner size=\"large\" />\n </Center>\n ) : threads?.length === 0 ? (\n <Box style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text>No threads found</Text>\n </Box>\n ) : (\n <FlatList\n data={threads}\n keyExtractor={(item) => item.id.toString()}\n renderItem={({ item }) => (\n <ThreadViewItem\n {...item}\n onPress={handleSelectThread}\n channelId={channelId}\n channelsDetail={channelsDetail}\n />\n )}\n refreshing={refreshing}\n onRefresh={handleRefresh}\n onEndReached={fetchMoreThreads}\n onEndReachedThreshold={0.5}\n contentContainerStyle={{ padding: 16 }}\n ItemSeparatorComponent={() => <Box style={{ height: 3 }} />}\n />\n )}\n <SubscriptionHandler subscribeToNewMessages={subscribeToNewMessages} channelId={channelId} />\n </Box>\n );\n};\n\n// Component to handle subscription logic\nconst SubscriptionHandler = ({ subscribeToNewMessages, channelId }: IThreadSubscriptionHandlerProps) => {\n useEffect(() => {\n const unsubscribe = subscribeToNewMessages();\n return () => {\n if (unsubscribe) unsubscribe();\n };\n }, [channelId]);\n\n return null;\n};\n\nexport const ThreadsView = ThreadsViewComponent;\n"],"names":["THREAD_CHAT_ADDED","threads","React"],"mappings":";;;;;;;;;;;;;;;;;;;AAYA,MAAM;AAAA,EACJ;AACF,CAAI,GAAA,MAAA;AAgBJ,MAAM,uBAAuB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,OAAS,EAAA,aAAA;AAAA,EACT,OAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAwB,KAAA;AACtB,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,QAAc,EAAA;AAClB,EAAa,YAAY,YAAY;AACrC,EAAiB,WAAY;AAC7B,EAAA,MAAM,aAAa,aAAmB,EAAA;AACtC,EAAkB,YAAa;AAC/B,EAAA,MAAM,CAAC,UAAA,EAAY,UAAU,CAAA,GAAI,SAAkB,KAAK,CAAA;AAGxD,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA;AAAA,MACJ,qCAAsC,CAAA;AAAA,IACxC,SAAW,EAAA;AAAA,MACT,WAAW,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,QAAA;AAAA;AACxB,GACD,CAAA;AAGD,EAAM,MAAA,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,QAAU,EAAAA,8BAAA;AAAA,MACV,SAAW,EAAA;AAAA,QACT,WAAW,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,QAAA;AAAA,OACxB;AAAA,MACA,WAAA,EAAa,CAAC,IAAW,EAAA;AAAA,QACvB;AAAA,OACS,KAAA;AACT,QAAA,IAAI,CAAC,gBAAiB,CAAA,IAAA;AAAM,UAAO,OAAA,IAAA;AACnC,QAAM,MAAA,SAAA,GAAY,gBAAiB,CAAA,IAAA,CAAK,oBAAqB,CAAA,IAAA;AAC7D,QAAA,IAAI,CAAC,SAAA;AAAW,UAAO,OAAA,IAAA;AACvB,QAAA,MAAMC,QAAU,GAAA,IAAA,CAAK,cAAe,CAAA,IAAA,IAAQ,EAAC;AAC7C,QAAM,MAAA,KAAA,GAAQA,SAAQ,SAAU,CAAA,CAAC,MAAW,CAAE,CAAA,EAAA,KAAO,UAAU,EAAE,CAAA;AACjE,QAAI,IAAA,cAAA;AACJ,QAAA,IAAI,QAAQ,EAAI,EAAA;AAEd,UAAiB,cAAA,GAAA,CAAC,GAAGA,QAAO,CAAA;AAC5B,UAAA,cAAA,CAAe,KAAS,CAAA,GAAA,SAAA;AAAA,SACnB,MAAA;AAEL,UAAiB,cAAA,GAAA,CAAC,SAAW,EAAA,GAAGA,QAAO,CAAA;AAAA;AAEzC,QAAA,OAAO,iCACF,IADE,CAAA,EAAA;AAAA,UAEL,cAAA,EAAgB,aACX,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,cADM,CAAA,EAAA;AAAA,YAEd,IAAA,EAAM,MAAO,CAAA,cAAA,EAAgB,IAAI;AAAA,WACnC;AAAA,SACF,CAAA;AAAA;AACF,KACD,CAAA;AAAA,GACA,EAAA,CAAC,SAAW,EAAA,eAAe,CAAC,CAAA;AAC/B,EAAe,cAAA,CAAAC,cAAA,CAAM,YAAY,MAAM;AA7FzC,IAAA,IAAA,EAAA;AA+FI,IAAA,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,UAAW,CAAA;AAAA,MACrB,KAAA,EAAA,CAAO,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,KAAA,KAAR,IAAiB,GAAA,EAAA,GAAA;AAAA,KAC1B,CAAA;AACA,IAAQ,OAAA,CAAA;AAAA,MACN,WAAW,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,QAAA,EAAA;AAAA,MACtB,MAAM,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,QAAA,EAAA;AAAA,MACZ,KAAO,EAAA,iBAAA;AAAA,MACP,aAAe,EAAA;AAAA,KAChB,CAAA;AAGD,IAAA,MAAM,cAAc,sBAAuB,EAAA;AAC3C,IAAA,OAAO,MAAM;AAEX,MAAI,IAAA,WAAA;AAAa,QAAY,WAAA,EAAA;AAAA,KAC/B;AAAA,GACF,EAAG,EAAE,CAAC,CAAA;AAGN,EAAAA,cAAA,CAAM,UAAU,MAAM;AAlHxB,IAAA,IAAA,EAAA;AAmHI,IAAI,IAAA,CAAA,EAAA,GAAA,oBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAsB,oBAAtB,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAA4C,IAAM,EAAA;AAEtD,GACF,EAAG,CAAC,oBAAoB,CAAC,CAAA;AACzB,EAAM,MAAA,OAAA,GAAUA,cAAM,CAAA,OAAA,CAAQ,MAAM;AAvHtC,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwHI,IAAA,IAAA,CAAA,CAAI,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,cAAA,KAAN,IAAsB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,KAAtB,mBAA4B,MAAU,KAAA,CAAA;AAAG,MAAA,OAAO,EAAC;AACrD,IAAA,MAAM,eAAkB,GAAA,CAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,cAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,IAAO,IAAA,MAAA,CAAO,CAAC,GAAA,CAAG,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,cAAA,KAAN,IAAsB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAI,GAAG,CAAC;AAAA,MAC5F;AAAA,KACF,KAAW,EAAE,CAAA,GAAI,EAAC;AAClB,IAAO,OAAA,OAAA,CAAQ,iBAAiB,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,CAAA,IAAK,EAAC;AAAA,GAC/D,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAsBA,cAAM,CAAA,OAAA,CAAQ,MAAM;AA9H5C,IAAA,IAAA,EAAA;AA+HI,IAAA,IAAI,EAAC,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,MAAA,CAAA;AAAQ,MAAO,OAAA,IAAA;AAC7B,IAAO,OAAA,CAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAI,CAAC,CAAA,KAAW,uBAAG,OAA5B,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsC,IAAK,CAAA,CAAA,CAAA,KAAM,EAAC;AAAA,GAC3D,EAAG,CAAC,OAAO,CAAC;AACZ,EAAA,MAAM,kBAAqB,GAAA,WAAA,CAAY,CAAC,EAAA,EAAS,OAAY,YAAsB,KAAA;AACjF,IAAW,UAAA,CAAA,QAAA,CAAS,OAAO,mBAA4B,EAAA;AAAA,MACrD,SAAW,EAAA,EAAA;AAAA,MACX,MAAM,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,QAAA,EAAA;AAAA,MACZ,KAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAQ,OAAA,CAAA;AAAA,MACN,WAAW,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,QAAA,EAAA;AAAA,MACtB,MAAM,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,QAAA,EAAA;AAAA,MACZ,KAAO,EAAA,iBAAA;AAAA,MACP,aAAe,EAAA;AAAA,KAChB,CAAE,CAAA,OAAA,CAAQ,MAAM;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,KACjB,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAQ,OAAA,CAAA;AAAA,MACN,WAAW,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,QAAA,EAAA;AAAA,MACtB,MAAM,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,QAAA,EAAA;AAAA,MACZ,KAAO,EAAA,iBAAA;AAAA,MACP,aAAe,EAAA;AAAA,KAChB,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AACL,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,OAAI,KAAO,EAAA;AAAA,MACjB,IAAM,EAAA,CAAA;AAAA,MACN,cAAgB,EAAA,QAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd,EAAA,kBACaA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK,yBAAwB,EAAA,KAAA,CAAM,OAAQ,CAAA,kBAC3CA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,OAAS,EAAA,aAAA,EAAe,KAAO,EAAA;AAAA,MAC/C,SAAW,EAAA;AAAA,KAEC,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,IAAA,EAAA,WAAS,CACnB,CACJ,CAAA;AAAA;AAEV,EAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,OAAI,KAAO,EAAA;AAAA,IACjB,IAAM,EAAA;AAAA,OAEG,aAAiB,IAAA,EAAC,mCAAS,MAAS,CAAA,mBAAAA,cAAA,CAAA,aAAA,CAAC,UAAO,KAAO,EAAA;AAAA,IAC1D,IAAM,EAAA;AAAA,GAEQ,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,CAC1B,CAAY,GAAA,CAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,MAAW,MAAA,CAAA,mBAAKA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,KAAO,EAAA;AAAA,IAC1D,IAAM,EAAA,CAAA;AAAA,IACN,cAAgB,EAAA,QAAA;AAAA,IAChB,UAAY,EAAA;AAAA,uBAEGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK,kBAAgB,CAC1B,oBAAUA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,IAAM,EAAA,OAAA,EAAS,cAAc,CAAQ,IAAA,KAAA,IAAA,CAAK,GAAG,QAAS,EAAA,EAAG,YAAY,CAAC;AAAA,IACnG;AAAA,wBACKA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAAmB,IAAnB,CAAA,EAAA,EAAyB,SAAS,kBAAoB,EAAA,SAAA,EAAsB,cAAgC,EAAA,CAAA,CAAA,EAAI,YAAwB,SAAW,EAAA,aAAA,EAAe,cAAc,gBAAkB,EAAA,qBAAA,EAAuB,KAAK,qBAAuB,EAAA;AAAA,IAC1P,OAAS,EAAA;AAAA,GACR,EAAA,sBAAA,EAAwB,sBAAMA,cAAA,CAAA,aAAA,CAAC,OAAI,KAAO,EAAA;AAAA,IAC3C,MAAQ,EAAA;AAAA,KACP,CAAI,EAAA,CAAA,+CACE,mBAAoB,EAAA,EAAA,sBAAA,EAAgD,WAAsB,CAC/F,CAAA;AACR,CAAA;AAGA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,sBAAA;AAAA,EACA;AACF,CAAuC,KAAA;AACrC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,cAAc,sBAAuB,EAAA;AAC3C,IAAA,OAAO,MAAM;AACX,MAAI,IAAA,WAAA;AAAa,QAAY,WAAA,EAAA;AAAA,KAC/B;AAAA,GACF,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAO,OAAA,IAAA;AACT,CAAA;AACO,MAAM,WAAc,GAAA"}
|
|
1
|
+
{"version":3,"file":"ThreadsView.js","sources":["../../../../src/screens/inbox/containers/ThreadsView.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useEffect, useState } from 'react';\nimport { FlatList, Box, Heading, Input, Text, Icon, Center, Spinner, Button } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useNavigation, useRoute, useIsFocused, useFocusEffect } from '@react-navigation/native';\nimport { orderBy, uniqBy, startCase } from 'lodash-es';\nimport {\n useThreadMessagesQuery,\n THREAD_CREATED_UPDATED,\n useThreadCreatedUpdatedSubscription,\n} from '../../../queries/inboxQueries';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { CHANGE_SETTINGS_ACTION } from '@admin-layout/client';\nimport { ThreadViewItem } from '../components/ThreadsViewItem';\nimport { config } from '../config';\nimport { Actions } from '../workflow/dialog-threads-xstate';\nconst { MESSAGES_PER_PAGE } = config;\n\nexport interface ThreadsViewProps {\n data: any;\n loading: boolean;\n refetch: any;\n subscribeToMore: any;\n error: any;\n channelId?: string;\n role?: string;\n channelsDetail?: any;\n refetchChannelDetail: (id: any) => Promise<any>;\n}\n\ninterface IThreadSubscriptionHandlerProps {\n subscribeToNewMessages: () => any;\n channelId: string | undefined;\n}\n\nconst ThreadsViewComponent = ({\n data,\n loading: threadLoading,\n refetch,\n subscribeToMore,\n error,\n channelId,\n role,\n channelsDetail,\n refetchChannelDetail,\n}: ThreadsViewProps) => {\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const dispatch = useDispatch();\n const navigation = useNavigation<any>();\n const isFocused = useIsFocused();\n const [refreshing, setRefresh] = useState<boolean>(false);\n\n // Use thread subscription for real-time updates\n const { data: threadCreatedUpdated } = useThreadCreatedUpdatedSubscription({\n variables: { channelId: channelId?.toString() },\n });\n\n // Subscribe to thread updates\n const subscribeToNewMessages = useCallback(() => {\n return subscribeToMore({\n document: THREAD_CREATED_UPDATED,\n variables: { channelId: channelId?.toString() },\n updateQuery: (prev: any, { subscriptionData }: any) => {\n if (!subscriptionData.data) return prev;\n\n const newThread = subscriptionData.data.threadCreatedUpdated.data;\n if (!newThread) return prev;\n\n const threads = prev.threadMessages.data || [];\n const index = threads.findIndex((t: any) => t.id === newThread.id);\n\n let updatedThreads;\n if (index > -1) {\n // Update existing thread\n updatedThreads = [...threads];\n updatedThreads[index] = newThread;\n } else {\n // Add new thread\n updatedThreads = [newThread, ...threads];\n }\n\n return {\n ...prev,\n threadMessages: {\n ...prev.threadMessages,\n data: uniqBy(updatedThreads, 'id'),\n },\n };\n },\n });\n }, [channelId, subscribeToMore]);\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n navigation?.setOptions({ title: params?.title ?? 'Thread' });\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n });\n\n // Setup subscription\n const unsubscribe = subscribeToNewMessages();\n\n return () => {\n // Unsubscribe on cleanup\n if (unsubscribe) unsubscribe();\n };\n }, []),\n );\n\n // Effect for thread updates from subscription\n React.useEffect(() => {\n if (threadCreatedUpdated?.threadCreatedUpdated?.data) {\n // The subscription handler will handle updates\n }\n }, [threadCreatedUpdated]);\n\n const threads = React.useMemo(() => {\n if (data?.threadMessages?.data?.length == 0) return [];\n const threadsFiltered = data?.threadMessages?.data\n ? uniqBy([...data?.threadMessages?.data], ({ id }: any) => id)\n : [];\n return orderBy(threadsFiltered, ['updatedAt'], ['desc']) || [];\n }, [data]);\n\n const threadReplies = React.useMemo(() => {\n if (!threads?.length) return null;\n return threads?.map((t: any) => t?.replies)?.flat(1) || [];\n }, [threads]);\n\n const handleSelectThread = useCallback((id: any, title: any, postParentId: any) => {\n navigation.navigate(config.THREAD_MESSEGE_PATH as any, {\n channelId: id,\n role: role?.toString(),\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n setRefresh(true);\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n }).finally(() => {\n setRefresh(false);\n });\n }, []);\n\n const fetchMoreThreads = useCallback(() => {\n refetch({\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n });\n }, []);\n\n if (error) {\n return (\n <Box style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text>Error loading threads. {error.message}</Text>\n <Button onPress={handleRefresh} style={{ marginTop: 4 }}>\n <Text>Try Again</Text>\n </Button>\n </Box>\n );\n }\n\n return (\n <Box style={{ flex: 1 }}>\n {threadLoading && !threads?.length ? (\n <Center style={{ flex: 1 }}>\n <Spinner size=\"large\" />\n </Center>\n ) : threads?.length === 0 ? (\n <Box style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text>No threads found</Text>\n </Box>\n ) : (\n <FlatList\n data={threads}\n keyExtractor={(item) => item.id.toString()}\n renderItem={({ item }) => (\n <ThreadViewItem\n {...item}\n onPress={handleSelectThread}\n channelId={channelId}\n channelsDetail={channelsDetail}\n />\n )}\n refreshing={refreshing}\n onRefresh={handleRefresh}\n onEndReached={fetchMoreThreads}\n onEndReachedThreshold={0.5}\n contentContainerStyle={{ padding: 16 }}\n ItemSeparatorComponent={() => <Box style={{ height: 3 }} />}\n />\n )}\n <SubscriptionHandler subscribeToNewMessages={subscribeToNewMessages} channelId={channelId} />\n </Box>\n );\n};\n\n// Component to handle subscription logic\nconst SubscriptionHandler = ({ subscribeToNewMessages, channelId }: IThreadSubscriptionHandlerProps) => {\n useEffect(() => {\n const unsubscribe = subscribeToNewMessages();\n return () => {\n if (unsubscribe) unsubscribe();\n };\n }, [channelId]);\n\n return null;\n};\n\nexport const ThreadsView = ThreadsViewComponent;\n"],"names":["threads","React"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {useCallback}from'react';function useInboxMessages({
|
|
2
|
+
useQueryHook,
|
|
3
|
+
queryVariables,
|
|
4
|
+
subscriptionDocument,
|
|
5
|
+
subscriptionVariables,
|
|
6
|
+
updateQuery,
|
|
7
|
+
onError
|
|
8
|
+
}) {
|
|
9
|
+
const {
|
|
10
|
+
data,
|
|
11
|
+
loading,
|
|
12
|
+
error,
|
|
13
|
+
refetch,
|
|
14
|
+
subscribeToMore
|
|
15
|
+
} = useQueryHook(queryVariables);
|
|
16
|
+
const subscribe = useCallback(() => {
|
|
17
|
+
return subscribeToMore({
|
|
18
|
+
document: subscriptionDocument,
|
|
19
|
+
variables: subscriptionVariables,
|
|
20
|
+
updateQuery,
|
|
21
|
+
onError
|
|
22
|
+
});
|
|
23
|
+
}, [subscribeToMore, subscriptionDocument, subscriptionVariables, updateQuery, onError]);
|
|
24
|
+
return {
|
|
25
|
+
data,
|
|
26
|
+
loading,
|
|
27
|
+
error,
|
|
28
|
+
refetch,
|
|
29
|
+
subscribe
|
|
30
|
+
};
|
|
31
|
+
}export{useInboxMessages};//# sourceMappingURL=useInboxMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInboxMessages.js","sources":["../../../../src/screens/inbox/hooks/useInboxMessages.ts"],"sourcesContent":["import { useCallback } from 'react';\n\n/**\n * useInboxMessages - a generic hook for fetching and subscribing to messages\n *\n * @param useQueryHook - Apollo query hook (e.g., useChannelMessagesQuery)\n * @param queryVariables - variables for the query\n * @param subscriptionDocument - GraphQL subscription document\n * @param subscriptionVariables - variables for the subscription\n * @param updateQuery - Apollo updateQuery function (optional)\n * @param onError - error handler (optional)\n * @returns { data, loading, error, refetch, subscribe }\n */\nexport function useInboxMessages({\n useQueryHook,\n queryVariables,\n subscriptionDocument,\n subscriptionVariables,\n updateQuery,\n onError,\n}) {\n const { data, loading, error, refetch, subscribeToMore } = useQueryHook(queryVariables);\n\n const subscribe = useCallback(() => {\n return subscribeToMore({\n document: subscriptionDocument,\n variables: subscriptionVariables,\n updateQuery,\n onError,\n });\n }, [subscribeToMore, subscriptionDocument, subscriptionVariables, updateQuery, onError]);\n\n return { data, loading, error, refetch, subscribe };\n}\n"],"names":[],"mappings":"gCAaO,SAAS,gBAAiB,CAAA;AAAA,EAC/B,YAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAG,EAAA;AACD,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,aAAa,cAAc,CAAA;AAC/B,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,QAAU,EAAA,oBAAA;AAAA,MACV,SAAW,EAAA,qBAAA;AAAA,MACX,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,KACA,CAAC,eAAA,EAAiB,sBAAsB,qBAAuB,EAAA,WAAA,EAAa,OAAO,CAAC,CAAA;AACvF,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@messenger-box/platform-mobile",
|
|
3
|
-
"version": "10.0.3-alpha.
|
|
3
|
+
"version": "10.0.3-alpha.46",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"watch-ts": "tsc --watch"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@messenger-box/core": "10.0.3-alpha.
|
|
26
|
-
"@messenger-box/platform-client": "10.0.3-alpha.
|
|
25
|
+
"@messenger-box/core": "10.0.3-alpha.46",
|
|
26
|
+
"@messenger-box/platform-client": "10.0.3-alpha.46",
|
|
27
27
|
"base-64": "1.0.0",
|
|
28
28
|
"react-native-gifted-chat": "1.0.4"
|
|
29
29
|
},
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"typescript": {
|
|
44
44
|
"definition": "lib/index.d.ts"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "5bc321d4000aa9d26ae0bdad9461598851b75174"
|
|
47
47
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import PlatformModule from './module';
|
|
2
2
|
|
|
3
3
|
import { Feature } from '@common-stack/client-react';
|
|
4
|
+
// import * as inboxQueries from './queries/inboxQueries';
|
|
4
5
|
|
|
5
6
|
export default new Feature(PlatformModule);
|
|
6
7
|
// export * from './navigation';
|
|
7
8
|
export * from './screens';
|
|
9
|
+
// export { inboxQueries };
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// Imports from common/graphql
|
|
2
|
+
import {
|
|
3
|
+
useGetChannelsByUserWithServiceChannelsQuery,
|
|
4
|
+
OnChatMessageAddedDocument,
|
|
5
|
+
OnThreadCreatedUpdatedDocument,
|
|
6
|
+
useViewChannelDetailQuery,
|
|
7
|
+
useThreadMessagesQuery,
|
|
8
|
+
useSupportServiceChannelsQuery,
|
|
9
|
+
useSendThreadMessageMutation,
|
|
10
|
+
useMessagesQuery,
|
|
11
|
+
useSendMessagesMutation,
|
|
12
|
+
useAddDirectChannelMutation,
|
|
13
|
+
MessagesDocument,
|
|
14
|
+
useSendExpoNotificationOnPostMutation,
|
|
15
|
+
useOnThreadCreatedUpdatedSubscription,
|
|
16
|
+
useOnChatMessageAddedSubscription,
|
|
17
|
+
useOnThreadChatMessageAddedSubscription,
|
|
18
|
+
useCreatePostThreadMutation,
|
|
19
|
+
useGetPostThreadLazyQuery,
|
|
20
|
+
} from 'common/graphql';
|
|
21
|
+
import { useCallback } from 'react';
|
|
22
|
+
|
|
23
|
+
// ====== CHANNEL QUERIES ======
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Hook for fetching channels by user including service channels
|
|
27
|
+
* @param options - Query options
|
|
28
|
+
* @returns Query result with data, loading state, refetch and fetchMore functions
|
|
29
|
+
*/
|
|
30
|
+
export const useChannelsQuery = (options: any = {}) => {
|
|
31
|
+
return useGetChannelsByUserWithServiceChannelsQuery({
|
|
32
|
+
...options,
|
|
33
|
+
fetchPolicy: 'cache-and-network',
|
|
34
|
+
nextFetchPolicy: 'network-only',
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Hook for fetching service channels
|
|
40
|
+
* @param options - Query options
|
|
41
|
+
* @returns Query result with data, loading state and refetch function
|
|
42
|
+
*/
|
|
43
|
+
export const useServiceChannelsQuery = (options: any = {}) => {
|
|
44
|
+
return useSupportServiceChannelsQuery({
|
|
45
|
+
...options,
|
|
46
|
+
fetchPolicy: 'cache-and-network',
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Hook for fetching channel details
|
|
52
|
+
* @param channelId - ID of the channel to fetch
|
|
53
|
+
* @param options - Additional query options
|
|
54
|
+
* @returns Query result with channel details
|
|
55
|
+
*/
|
|
56
|
+
export const useChannelDetailQuery = (channelId: string, options: any = {}) => {
|
|
57
|
+
return useViewChannelDetailQuery({
|
|
58
|
+
variables: { channelId },
|
|
59
|
+
...options,
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// ====== THREAD QUERIES ======
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Direct export of the thread messages query hook
|
|
67
|
+
*/
|
|
68
|
+
export { useThreadMessagesQuery };
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Direct export of the messages query hook
|
|
72
|
+
*/
|
|
73
|
+
export { useMessagesQuery };
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Hook for fetching thread messages with default options
|
|
77
|
+
* @param variables - Query variables including channelId, role, and limit
|
|
78
|
+
* @param options - Additional query options
|
|
79
|
+
* @returns Query result with thread messages data
|
|
80
|
+
*/
|
|
81
|
+
export const useThreadMessagesQueryWithOptions = (variables: any, options: any = {}) => {
|
|
82
|
+
return useThreadMessagesQuery({
|
|
83
|
+
variables,
|
|
84
|
+
fetchPolicy: 'cache-and-network',
|
|
85
|
+
refetchWritePolicy: 'overwrite',
|
|
86
|
+
nextFetchPolicy: 'network-only',
|
|
87
|
+
...options,
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// ====== MESSAGE QUERIES ======
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Hook for fetching channel messages
|
|
95
|
+
* @param variables - Query variables including channelId, parentId, and pagination params
|
|
96
|
+
* @param options - Additional query options
|
|
97
|
+
* @returns Query result for messages
|
|
98
|
+
*/
|
|
99
|
+
export const useChannelMessagesQuery = (variables: any = {}, options: any = {}) => {
|
|
100
|
+
return useMessagesQuery({
|
|
101
|
+
variables,
|
|
102
|
+
fetchPolicy: 'cache-and-network',
|
|
103
|
+
nextFetchPolicy: 'cache-first',
|
|
104
|
+
refetchWritePolicy: 'merge',
|
|
105
|
+
...options,
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Hook for sending messages in a channel
|
|
111
|
+
* @returns Mutation function and result
|
|
112
|
+
*/
|
|
113
|
+
export const useSendChannelMessage = () => {
|
|
114
|
+
return useSendMessagesMutation();
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Hook for adding a direct channel
|
|
119
|
+
* @returns Mutation function and result
|
|
120
|
+
*/
|
|
121
|
+
export const useAddDirectChannel = () => {
|
|
122
|
+
return useAddDirectChannelMutation();
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Messages document for queries
|
|
127
|
+
*/
|
|
128
|
+
export const MESSAGES_DOCUMENT = MessagesDocument;
|
|
129
|
+
|
|
130
|
+
// ====== MUTATIONS ======
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Hook for sending thread messages
|
|
134
|
+
* @returns Mutation function and result
|
|
135
|
+
*/
|
|
136
|
+
export const useSendThreadMessage = () => {
|
|
137
|
+
return useSendThreadMessageMutation();
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Hook for sending expo notifications
|
|
142
|
+
* @returns Mutation function and result
|
|
143
|
+
*/
|
|
144
|
+
export const useSendExpoNotification = () => {
|
|
145
|
+
return useSendExpoNotificationOnPostMutation();
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Hook for creating a post thread
|
|
150
|
+
* @param options - Mutation options
|
|
151
|
+
* @returns Mutation function and result
|
|
152
|
+
*/
|
|
153
|
+
export const useCreatePostThread = (options: any = {}) => {
|
|
154
|
+
return useCreatePostThreadMutation(options);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// ====== SUBSCRIPTION DOCUMENTS ======
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Document for chat message added subscription
|
|
161
|
+
*/
|
|
162
|
+
export const CHAT_MESSAGE_ADDED = OnChatMessageAddedDocument;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Document for thread created/updated subscription
|
|
166
|
+
*/
|
|
167
|
+
export const THREAD_CREATED_UPDATED = OnThreadCreatedUpdatedDocument;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Hook for subscribing to thread creation and updates
|
|
171
|
+
* @returns Subscription result for thread creation/update events
|
|
172
|
+
*/
|
|
173
|
+
export const useThreadCreatedUpdatedSubscription = (options: any = {}) => {
|
|
174
|
+
return useOnThreadCreatedUpdatedSubscription({
|
|
175
|
+
...options,
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Hook for subscribing to chat message additions
|
|
181
|
+
* @param options - Subscription options including variables like channelId
|
|
182
|
+
* @returns Subscription result for new chat messages
|
|
183
|
+
*/
|
|
184
|
+
export const useChatMessageAddedSubscription = (options: any = {}) => {
|
|
185
|
+
return useOnChatMessageAddedSubscription({
|
|
186
|
+
...options,
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Hook for subscribing to thread chat message additions
|
|
192
|
+
* @param options - Subscription options including variables like channelId and threadId
|
|
193
|
+
* @returns Subscription result for new thread chat messages
|
|
194
|
+
*/
|
|
195
|
+
export const useThreadChatMessageAddedSubscription = (options: any = {}) => {
|
|
196
|
+
return useOnThreadChatMessageAddedSubscription({
|
|
197
|
+
...options,
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// ====== LAZY QUERIES ======
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Hook for lazily fetching a post thread
|
|
205
|
+
* @param options - Lazy query options
|
|
206
|
+
* @returns Lazy query function and result
|
|
207
|
+
*/
|
|
208
|
+
export const useGetPostThreadLazy = (options: any = {}) => {
|
|
209
|
+
return useGetPostThreadLazyQuery({
|
|
210
|
+
fetchPolicy: 'cache-and-network',
|
|
211
|
+
...options,
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
// ====== CUSTOM QUERY HOOKS ======
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Custom hook that combines channels and provides refresh functionality
|
|
219
|
+
*/
|
|
220
|
+
export const useInboxChannels = () => {
|
|
221
|
+
const queryResult = useChannelsQuery();
|
|
222
|
+
|
|
223
|
+
const refresh = useCallback(() => {
|
|
224
|
+
return queryResult.refetch();
|
|
225
|
+
}, [queryResult.refetch]);
|
|
226
|
+
|
|
227
|
+
const loadMore = useCallback(
|
|
228
|
+
(page: number) => {
|
|
229
|
+
if (queryResult.loading || !queryResult.data) return;
|
|
230
|
+
|
|
231
|
+
return queryResult.fetchMore({
|
|
232
|
+
variables: { page },
|
|
233
|
+
updateQuery: (prev, { fetchMoreResult }) => {
|
|
234
|
+
if (!fetchMoreResult) return prev;
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
...fetchMoreResult,
|
|
238
|
+
channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],
|
|
239
|
+
supportServiceChannels: [
|
|
240
|
+
...(prev.supportServiceChannels || []),
|
|
241
|
+
...(fetchMoreResult.supportServiceChannels || []),
|
|
242
|
+
],
|
|
243
|
+
};
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
[queryResult.fetchMore, queryResult.loading, queryResult.data],
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
...queryResult,
|
|
252
|
+
refresh,
|
|
253
|
+
loadMore,
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Custom hook for thread message operations
|
|
259
|
+
*/
|
|
260
|
+
export const useThreadOperations = (channelId: string, options: any = {}) => {
|
|
261
|
+
const queryResult = useThreadMessagesQueryWithOptions({ channelId, ...options.variables }, options.queryOptions);
|
|
262
|
+
|
|
263
|
+
const [sendMessage, sendMessageResult] = useSendThreadMessage();
|
|
264
|
+
|
|
265
|
+
const refresh = useCallback(() => {
|
|
266
|
+
return queryResult.refetch();
|
|
267
|
+
}, [queryResult.refetch]);
|
|
268
|
+
|
|
269
|
+
const fetchMoreMessages = useCallback(
|
|
270
|
+
(variables: any) => {
|
|
271
|
+
return queryResult.fetchMore({
|
|
272
|
+
variables,
|
|
273
|
+
updateQuery: (prev, { fetchMoreResult }) => {
|
|
274
|
+
if (!fetchMoreResult?.threadMessages?.data) return prev;
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
...prev,
|
|
278
|
+
threadMessages: {
|
|
279
|
+
...prev.threadMessages,
|
|
280
|
+
data: [...fetchMoreResult.threadMessages.data, ...(prev.threadMessages?.data || [])],
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
},
|
|
286
|
+
[queryResult.fetchMore],
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
data: queryResult.data,
|
|
291
|
+
loading: queryResult.loading,
|
|
292
|
+
error: queryResult.error,
|
|
293
|
+
refresh,
|
|
294
|
+
fetchMoreMessages,
|
|
295
|
+
sendMessage,
|
|
296
|
+
sendMessageResult,
|
|
297
|
+
};
|
|
298
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './inboxQueries';
|
|
@@ -2,23 +2,15 @@ import * as React from 'react';
|
|
|
2
2
|
import { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';
|
|
3
3
|
import { ThreadConversationView } from './containers/ThreadConversationView';
|
|
4
4
|
import { ThreadsView } from './containers/ThreadsView';
|
|
5
|
-
import {
|
|
5
|
+
import { useChannelDetailQuery, useSendThreadMessage } from '../../queries/inboxQueries';
|
|
6
6
|
import { useFocusEffect } from '@react-navigation/native';
|
|
7
7
|
// import { useSelector } from 'react-redux';
|
|
8
8
|
import colors from 'tailwindcss/colors';
|
|
9
9
|
|
|
10
10
|
export function DialogThreadMessages({ channelId, postParentId, isPostParentIdThread, role }) {
|
|
11
|
-
const {
|
|
12
|
-
data,
|
|
13
|
-
loading: channelLoading,
|
|
14
|
-
refetch,
|
|
15
|
-
} = useViewChannelDetailQuery({
|
|
16
|
-
variables: {
|
|
17
|
-
id: channelId?.toString(),
|
|
18
|
-
},
|
|
19
|
-
});
|
|
11
|
+
const { data, loading: channelLoading, refetch } = useChannelDetailQuery(channelId?.toString(), {});
|
|
20
12
|
|
|
21
|
-
const [sendThreadMessage] =
|
|
13
|
+
const [sendThreadMessage] = useSendThreadMessage();
|
|
22
14
|
const [loading, setLoading] = React.useState<boolean>(true);
|
|
23
15
|
const [channel, setChannel] = React.useState<any>(null);
|
|
24
16
|
const [parentId, setParentId] = React.useState<any>(postParentId);
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';
|
|
3
3
|
import { ThreadConversationView } from './containers/ThreadConversationView';
|
|
4
4
|
import { ThreadsView } from './containers/ThreadsView';
|
|
5
|
-
import {
|
|
5
|
+
import { useChannelDetailQuery, useThreadMessagesQueryWithOptions } from '../../queries/inboxQueries';
|
|
6
6
|
import { useFocusEffect } from '@react-navigation/native';
|
|
7
7
|
import { useSelector } from 'react-redux';
|
|
8
8
|
import { config } from './config';
|
|
@@ -22,11 +22,7 @@ export function DialogThreads({ channelId, postParentId, role }) {
|
|
|
22
22
|
data: channelData,
|
|
23
23
|
loading: channelLoading,
|
|
24
24
|
refetch: channelRefetch,
|
|
25
|
-
} =
|
|
26
|
-
variables: {
|
|
27
|
-
id: channelId?.toString(),
|
|
28
|
-
},
|
|
29
|
-
});
|
|
25
|
+
} = useChannelDetailQuery(channelId?.toString(), {});
|
|
30
26
|
|
|
31
27
|
// Fetch thread messages
|
|
32
28
|
const {
|
|
@@ -35,7 +31,7 @@ export function DialogThreads({ channelId, postParentId, role }) {
|
|
|
35
31
|
error: threadsError,
|
|
36
32
|
refetch: threadsRefetch,
|
|
37
33
|
subscribeToMore: threadsSubscribeToMore,
|
|
38
|
-
} =
|
|
34
|
+
} = useThreadMessagesQueryWithOptions({
|
|
39
35
|
variables: {
|
|
40
36
|
channelId: channelId?.toString(),
|
|
41
37
|
role: role?.toString(),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Modal, TouchableOpacity, View, StyleSheet } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export const Actionsheet = ({ isOpen, onCancel, children }) => {
|
|
5
|
+
if (!isOpen) return null;
|
|
6
|
+
return (
|
|
7
|
+
<Modal visible={isOpen} transparent animationType="slide" onRequestClose={onCancel}>
|
|
8
|
+
<TouchableOpacity style={styles.overlay} activeOpacity={1} onPress={onCancel}>
|
|
9
|
+
<View style={styles.sheet} onStartShouldSetResponder={() => true}>
|
|
10
|
+
{children}
|
|
11
|
+
</View>
|
|
12
|
+
</TouchableOpacity>
|
|
13
|
+
</Modal>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const styles = StyleSheet.create({
|
|
18
|
+
overlay: {
|
|
19
|
+
flex: 1,
|
|
20
|
+
backgroundColor: 'rgba(0,0,0,0.3)',
|
|
21
|
+
justifyContent: 'flex-end',
|
|
22
|
+
},
|
|
23
|
+
sheet: {
|
|
24
|
+
backgroundColor: '#fff',
|
|
25
|
+
borderTopLeftRadius: 16,
|
|
26
|
+
borderTopRightRadius: 16,
|
|
27
|
+
padding: 16,
|
|
28
|
+
minHeight: 100,
|
|
29
|
+
},
|
|
30
|
+
});
|