@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/compute.js +2 -3
  3. package/lib/index.js.map +1 -1
  4. package/lib/queries/inboxQueries.js +77 -0
  5. package/lib/queries/inboxQueries.js.map +1 -0
  6. package/lib/routes.json +2 -3
  7. package/lib/screens/inbox/DialogThreadMessages.js +3 -7
  8. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  9. package/lib/screens/inbox/DialogThreads.js +3 -7
  10. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  11. package/lib/screens/inbox/components/DialogsListItem.js +47 -46
  12. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  13. package/lib/screens/inbox/components/GiftedChatInboxComponent.js +313 -0
  14. package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
  15. package/lib/screens/inbox/components/ServiceDialogsListItem.js +72 -57
  16. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  17. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +115 -14
  18. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  19. package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
  20. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  21. package/lib/screens/inbox/containers/ConversationView.js +640 -493
  22. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  23. package/lib/screens/inbox/containers/Dialogs.js +100 -181
  24. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  25. package/lib/screens/inbox/containers/ThreadConversationView.js +659 -245
  26. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  27. package/lib/screens/inbox/containers/ThreadsView.js +3 -3
  28. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  29. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  30. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  31. package/package.json +4 -4
  32. package/src/index.ts +2 -0
  33. package/src/queries/inboxQueries.ts +298 -0
  34. package/src/queries/index.d.ts +2 -0
  35. package/src/queries/index.ts +1 -0
  36. package/src/screens/inbox/DialogThreadMessages.tsx +3 -11
  37. package/src/screens/inbox/DialogThreads.tsx +3 -7
  38. package/src/screens/inbox/components/Actionsheet.tsx +30 -0
  39. package/src/screens/inbox/components/DialogsListItem.tsx +89 -148
  40. package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
  41. package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
  42. package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
  43. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +202 -221
  44. package/src/screens/inbox/components/SlackInput.tsx +23 -0
  45. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +216 -30
  46. package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
  47. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +6 -7
  48. package/src/screens/inbox/containers/ConversationView.tsx +1109 -669
  49. package/src/screens/inbox/containers/Dialogs.tsx +198 -342
  50. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +2 -2
  51. package/src/screens/inbox/containers/ThreadConversationView.tsx +1141 -402
  52. package/src/screens/inbox/containers/ThreadsView.tsx +5 -5
  53. package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
  54. 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.40",
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.40",
26
- "@messenger-box/platform-client": "10.0.3-alpha.40",
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": "9bcf95cbd1dfac789e71d3031fd44b8cf7add6ce"
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,2 @@
1
+ // This file ensures TypeScript recognizes the module
2
+ export * from './inboxQueries';
@@ -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 { useViewChannelDetailQuery, useSendThreadMessageMutation } from 'common/graphql';
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] = useSendThreadMessageMutation();
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 { useViewChannelDetailQuery, useThreadMessagesQuery } from 'common/graphql';
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
- } = useViewChannelDetailQuery({
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
- } = useThreadMessagesQuery({
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
+ });