@messenger-box/platform-mobile 10.0.3-alpha.77 → 10.0.3-alpha.80
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 +4 -0
- package/lib/compute.js.map +1 -1
- package/lib/module.js.map +1 -1
- package/lib/queries/inboxQueries.js.map +1 -1
- package/lib/screens/inbox/DialogMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/Inbox.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
- package/lib/screens/inbox/components/DialogItem.js.map +1 -1
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
- package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -1
- package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
- package/lib/screens/inbox/config/config.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
- package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -1
- package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -1
- package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.0.3-alpha.80](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.79...v10.0.3-alpha.80) (2025-09-20)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @messenger-box/platform-mobile
|
|
9
|
+
|
|
6
10
|
## [10.0.3-alpha.77](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.76...v10.0.3-alpha.77) (2025-09-19)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @messenger-box/platform-mobile
|
package/lib/compute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const inboxPageStore: IRouteModule[] = [\n {\n key: 'message',\n path: '/message',\n name: 'Message',\n exact: true,\n component: () => import('./screens/inbox/DialogMessages'),\n props: {\n initialParams: { channelId: null, role: null, isShowThreadMessage: true },\n options: {\n headerShown: true,\n title: 'Inbox',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n {\n key: 'thread',\n path: '/thread',\n name: 'Thread',\n exact: true,\n component: () => import('./screens/inbox/DialogThreads'),\n props: {\n initialParams: { channelId: null, postParentId: null, role: null },\n options: {\n headerShown: true,\n title: 'Thread',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n {\n key: 'threadmessage',\n path: '/threadmessage',\n name: 'ThreadMessage',\n exact: true,\n component: () => import('./screens/inbox/DialogThreadMessages'),\n props: {\n initialParams: { channelId: null, postParentId: null, isPostParentIdThread: null, role: null },\n options: {\n headerShown: true,\n title: 'Inbox',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n];\n\nconst selectedRoutes = ['message', 'thread', 'threadmessage'];\n\nconst filteredRoutes = getFilteredRoutes(inboxPageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"uFAGO,MAAM,iBAAiC,CAAC;AAAA,EAC7C,
|
|
1
|
+
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const inboxPageStore: IRouteModule[] = [\n {\n key: 'message',\n path: '/message',\n name: 'Message',\n exact: true,\n component: () => import('./screens/inbox/DialogMessages'),\n props: {\n initialParams: { channelId: null, role: null, isShowThreadMessage: true },\n options: {\n headerShown: true,\n title: 'Inbox',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n {\n key: 'thread',\n path: '/thread',\n name: 'Thread',\n exact: true,\n component: () => import('./screens/inbox/DialogThreads'),\n props: {\n initialParams: { channelId: null, postParentId: null, role: null },\n options: {\n headerShown: true,\n title: 'Thread',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n {\n key: 'threadmessage',\n path: '/threadmessage',\n name: 'ThreadMessage',\n exact: true,\n component: () => import('./screens/inbox/DialogThreadMessages'),\n props: {\n initialParams: { channelId: null, postParentId: null, isPostParentIdThread: null, role: null },\n options: {\n headerShown: true,\n title: 'Inbox',\n headerBackTitleVisible: false,\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n];\n\nconst selectedRoutes = ['message', 'thread', 'threadmessage'];\n\nconst filteredRoutes = getFilteredRoutes(inboxPageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"uFAGO,MAAM,iBAAiC,CAAC;AAAA,EAC7C,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,MAAM,OAAO,mCAAA,CAAA;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM,IAAA;AAAA,MACN,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,MACP,sBAAA,EAAwB,KAAA;AAAA,MACxB,cAAA,EAAgB,KAAA;AAAA,MAChB,YAAA,EAAc;AAAA;AAChB;AAEJ,CAAA,EAAG;AAAA,EACD,GAAA,EAAK,QAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,MAAM,OAAO,kCAAA,CAAA;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,QAAA;AAAA,MACP,sBAAA,EAAwB,KAAA;AAAA,MACxB,cAAA,EAAgB,KAAA;AAAA,MAChB,YAAA,EAAc;AAAA;AAChB;AAEJ,CAAA,EAAG;AAAA,EACD,GAAA,EAAK,eAAA;AAAA,EACL,IAAA,EAAM,gBAAA;AAAA,EACN,IAAA,EAAM,eAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,MAAM,OAAO,yCAAA,CAAA;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,oBAAA,EAAsB,IAAA;AAAA,MACtB,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,MACP,sBAAA,EAAwB,KAAA;AAAA,MACxB,cAAA,EAAgB,KAAA;AAAA,MAChB,YAAA,EAAc;AAAA;AAChB;AAEJ,CAAC;AACD,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAW,QAAA,EAAU,eAAe,CAAA;AAC5D,MAAM,cAAA,GAAiB,iBAAA,CAAkB,cAAA,EAAgB,cAAc"}
|
package/lib/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { schema, typePolicies, dataIdFromObject } from '@messenger-box/platform-client';\nimport {filteredRoutes} from './compute';\n\nexport default new Feature({\n dataIdFromObject,\n clientStateParams: { typeDefs: schema, typePolicies },\n routeConfig: filteredRoutes as any,\n});\n"],"names":[],"mappings":"6KAIA,qBAAe,IAAI,
|
|
1
|
+
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { schema, typePolicies, dataIdFromObject } from '@messenger-box/platform-client';\nimport {filteredRoutes} from './compute';\n\nexport default new Feature({\n dataIdFromObject,\n clientStateParams: { typeDefs: schema, typePolicies },\n routeConfig: filteredRoutes as any,\n});\n"],"names":[],"mappings":"6KAIA,qBAAe,IAAI,OAAA,CAAQ;AAAA,EACzB,gBAAA;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,QAAA,EAAU,MAAA;AAAA,IACV;AAAA,GACF;AAAA,EACA,WAAA,EAAa;AACf,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inboxQueries.js","sources":["../../src/queries/inboxQueries.ts"],"sourcesContent":["// Imports from common/graphql\nimport {\n useGetChannelsByUserWithServiceChannelsQuery,\n useGetChannelsByUserQuery,\n OnChatMessageAddedDocument,\n OnThreadCreatedUpdatedDocument,\n useViewChannelDetailQuery,\n useThreadMessagesQuery,\n useSupportServiceChannelsQuery,\n useSendThreadMessageMutation,\n useMessagesQuery,\n useSendMessagesMutation,\n useAddDirectChannelMutation,\n MessagesDocument,\n useSendExpoNotificationOnPostMutation,\n useOnThreadCreatedUpdatedSubscription,\n useOnChatMessageAddedSubscription,\n useOnThreadChatMessageAddedSubscription,\n useCreatePostThreadMutation,\n useGetPostThreadLazyQuery,\n} from 'common/graphql';\nimport { useCallback } from 'react';\n\n// ====== CHANNEL QUERIES ======\n\n/**\n * Hook for fetching channels by user including service channels\n * @param options - Query options\n * @returns Query result with data, loading state, refetch and fetchMore functions\n */\nexport const useChannelsQuery = (options: any = {}) => {\n return useGetChannelsByUserQuery({\n ...options,\n fetchPolicy: 'cache-and-network',\n //nextFetchPolicy: 'network-only',\n });\n};\n\n/**\n * Hook for fetching service channels\n * @param options - Query options\n * @returns Query result with data, loading state and refetch function\n */\nexport const useServiceChannelsQuery = (options: any = {}) => {\n return useSupportServiceChannelsQuery({\n ...options,\n fetchPolicy: 'cache-and-network',\n });\n};\n\n/**\n * Hook for fetching channel details\n * @param channelId - ID of the channel to fetch\n * @param options - Additional query options\n * @returns Query result with channel details\n */\nexport const useChannelDetailQuery = (channelId: string, options: any = {}) => {\n return useViewChannelDetailQuery({\n variables: { channelId },\n ...options,\n });\n};\n\n// ====== THREAD QUERIES ======\n\n/**\n * Direct export of the thread messages query hook\n */\nexport { useThreadMessagesQuery };\n\n/**\n * Direct export of the messages query hook\n */\nexport { useMessagesQuery };\n\n/**\n * Hook for fetching thread messages with default options\n * @param variables - Query variables including channelId, role, and limit\n * @param options - Additional query options\n * @returns Query result with thread messages data\n */\nexport const useThreadMessagesQueryWithOptions = (variables: any, options: any = {}) => {\n return useThreadMessagesQuery({\n variables,\n fetchPolicy: 'cache-and-network',\n refetchWritePolicy: 'overwrite',\n nextFetchPolicy: 'network-only',\n ...options,\n });\n};\n\n// ====== MESSAGE QUERIES ======\n\n/**\n * Hook for fetching channel messages\n * @param variables - Query variables including channelId, parentId, and pagination params\n * @param options - Additional query options\n * @returns Query result for messages\n */\nexport const useChannelMessagesQuery = (variables: any = {}, options: any = {}) => {\n return useMessagesQuery({\n variables,\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'cache-first',\n refetchWritePolicy: 'merge',\n ...options,\n });\n};\n\n/**\n * Hook for sending messages in a channel\n * @returns Mutation function and result\n */\nexport const useSendChannelMessage = () => {\n return useSendMessagesMutation();\n};\n\n/**\n * Hook for adding a direct channel\n * @returns Mutation function and result\n */\nexport const useAddDirectChannel = () => {\n return useAddDirectChannelMutation();\n};\n\n/**\n * Messages document for queries\n */\nexport const MESSAGES_DOCUMENT = MessagesDocument;\n\n// ====== MUTATIONS ======\n\n/**\n * Hook for sending thread messages\n * @returns Mutation function and result\n */\nexport const useSendThreadMessage = () => {\n return useSendThreadMessageMutation();\n};\n\n/**\n * Hook for sending expo notifications\n * @returns Mutation function and result\n */\nexport const useSendExpoNotification = () => {\n return useSendExpoNotificationOnPostMutation();\n};\n\n/**\n * Hook for creating a post thread\n * @param options - Mutation options\n * @returns Mutation function and result\n */\nexport const useCreatePostThread = (options: any = {}) => {\n return useCreatePostThreadMutation(options);\n};\n\n// ====== SUBSCRIPTION DOCUMENTS ======\n\n/**\n * Document for chat message added subscription\n */\nexport const CHAT_MESSAGE_ADDED = OnChatMessageAddedDocument;\n\n/**\n * Document for thread created/updated subscription\n */\nexport const THREAD_CREATED_UPDATED = OnThreadCreatedUpdatedDocument;\n\n/**\n * Hook for subscribing to thread creation and updates\n * @returns Subscription result for thread creation/update events\n */\nexport const useThreadCreatedUpdatedSubscription = (options: any = {}) => {\n return useOnThreadCreatedUpdatedSubscription({\n ...options,\n });\n};\n\n/**\n * Hook for subscribing to chat message additions\n * @param options - Subscription options including variables like channelId\n * @returns Subscription result for new chat messages\n */\nexport const useChatMessageAddedSubscription = (options: any = {}) => {\n return useOnChatMessageAddedSubscription({\n ...options,\n });\n};\n\n/**\n * Hook for subscribing to thread chat message additions\n * @param options - Subscription options including variables like channelId and threadId\n * @returns Subscription result for new thread chat messages\n */\nexport const useThreadChatMessageAddedSubscription = (options: any = {}) => {\n return useOnThreadChatMessageAddedSubscription({\n ...options,\n });\n};\n\n// ====== LAZY QUERIES ======\n\n/**\n * Hook for lazily fetching a post thread\n * @param options - Lazy query options\n * @returns Lazy query function and result\n */\nexport const useGetPostThreadLazy = (options: any = {}) => {\n return useGetPostThreadLazyQuery({\n fetchPolicy: 'cache-and-network',\n ...options,\n });\n};\n\n// ====== CUSTOM QUERY HOOKS ======\n\n/**\n * Custom hook that combines channels and provides refresh functionality\n */\nexport const useInboxChannels = () => {\n const queryResult = useChannelsQuery();\n\n const refresh = useCallback(() => {\n return queryResult.refetch();\n }, [queryResult.refetch]);\n\n const loadMore = useCallback(\n (page: number) => {\n if (queryResult.loading || !queryResult.data) return;\n\n return queryResult.fetchMore({\n variables: { page },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n // supportServiceChannels: [\n // ...(prev.supportServiceChannels || []),\n // ...(fetchMoreResult.supportServiceChannels || []),\n // ],\n };\n },\n });\n },\n [queryResult.fetchMore, queryResult.loading, queryResult.data],\n );\n\n return {\n ...queryResult,\n refresh,\n loadMore,\n };\n};\n\n/**\n * Custom hook for thread message operations\n */\nexport const useThreadOperations = (channelId: string, options: any = {}) => {\n const queryResult = useThreadMessagesQueryWithOptions({ channelId, ...options.variables }, options.queryOptions);\n\n const [sendMessage, sendMessageResult] = useSendThreadMessage();\n\n const refresh = useCallback(() => {\n return queryResult.refetch();\n }, [queryResult.refetch]);\n\n const fetchMoreMessages = useCallback(\n (variables: any) => {\n return queryResult.fetchMore({\n variables,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult?.threadMessages?.data) return prev;\n\n return {\n ...prev,\n threadMessages: {\n ...prev.threadMessages,\n data: [...fetchMoreResult.threadMessages.data, ...(prev.threadMessages?.data || [])],\n },\n };\n },\n });\n },\n [queryResult.fetchMore],\n );\n\n return {\n data: queryResult.data,\n loading: queryResult.loading,\n error: queryResult.error,\n refresh,\n fetchMoreMessages,\n sendMessage,\n sendMessageResult,\n };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqCO,MAAM,qBAAwB,GAAA,CAAC,SAAmB,EAAA,OAAA,GAAe,EAAO,KAAA;AAC7E,EAAA,OAAO,yBAA0B,CAAA,cAAA,CAAA;AAAA,IAC/B,SAAW,EAAA;AAAA,MACT;AAAA;AACF,GAAA,EACG,OACJ,CAAA,CAAA;AACH;AAoBO,MAAM,iCAAoC,GAAA,CAAC,SAAgB,EAAA,OAAA,GAAe,EAAO,KAAA;AACtF,EAAA,OAAO,sBAAuB,CAAA,cAAA,CAAA;AAAA,IAC5B,SAAA;AAAA,IACA,WAAa,EAAA,mBAAA;AAAA,IACb,kBAAoB,EAAA,WAAA;AAAA,IACpB,eAAiB,EAAA;AAAA,GAAA,EACd,OACJ,CAAA,CAAA;AACH;AAUO,MAAM,0BAA0B,CAAC,SAAA,GAAiB,EAAI,EAAA,OAAA,GAAe,EAAO,KAAA;AACjF,EAAA,OAAO,gBAAiB,CAAA,cAAA,CAAA;AAAA,IACtB,SAAA;AAAA,IACA,WAAa,EAAA,mBAAA;AAAA,IACb,eAAiB,EAAA,aAAA;AAAA,IACjB,kBAAoB,EAAA;AAAA,GAAA,EACjB,OACJ,CAAA,CAAA;AACH;AAMO,MAAM,wBAAwB,MAAM;AACzC,EAAA,OAAO,uBAAwB,EAAA;AACjC;AAMO,MAAM,sBAAsB,MAAM;AACvC,EAAA,OAAO,2BAA4B,EAAA;AACrC;AAKO,MAAM,iBAAoB,GAAA;AAQ1B,MAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,4BAA6B,EAAA;AACtC;AAMO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,OAAO,qCAAsC,EAAA;AAC/C;AAOO,MAAM,mBAAsB,GAAA,CAAC,OAAe,GAAA,EAAO,KAAA;AACxD,EAAA,OAAO,4BAA4B,OAAO,CAAA;AAC5C;AAOO,MAAM,kBAAqB,GAAA;AAK3B,MAAM,sBAAyB,GAAA;AAM/B,MAAM,mCAAsC,GAAA,CAAC,OAAe,GAAA,EAAO,KAAA;AACxE,EAAO,OAAA,qCAAA,CAAsC,mBACxC,OACJ,CAAA,CAAA;AACH;AA+BO,MAAM,oBAAuB,GAAA,CAAC,OAAe,GAAA,EAAO,KAAA;AACzD,EAAA,OAAO,yBAA0B,CAAA,cAAA,CAAA;AAAA,IAC/B,WAAa,EAAA;AAAA,GAAA,EACV,OACJ,CAAA,CAAA;AACH"}
|
|
1
|
+
{"version":3,"file":"inboxQueries.js","sources":["../../src/queries/inboxQueries.ts"],"sourcesContent":["// Imports from common/graphql\nimport {\n useGetChannelsByUserWithServiceChannelsQuery,\n useGetChannelsByUserQuery,\n OnChatMessageAddedDocument,\n OnThreadCreatedUpdatedDocument,\n useViewChannelDetailQuery,\n useThreadMessagesQuery,\n useSupportServiceChannelsQuery,\n useSendThreadMessageMutation,\n useMessagesQuery,\n useSendMessagesMutation,\n useAddDirectChannelMutation,\n MessagesDocument,\n useSendExpoNotificationOnPostMutation,\n useOnThreadCreatedUpdatedSubscription,\n useOnChatMessageAddedSubscription,\n useOnThreadChatMessageAddedSubscription,\n useCreatePostThreadMutation,\n useGetPostThreadLazyQuery,\n} from 'common/graphql';\nimport { useCallback } from 'react';\n\n// ====== CHANNEL QUERIES ======\n\n/**\n * Hook for fetching channels by user including service channels\n * @param options - Query options\n * @returns Query result with data, loading state, refetch and fetchMore functions\n */\nexport const useChannelsQuery = (options: any = {}) => {\n return useGetChannelsByUserQuery({\n ...options,\n fetchPolicy: 'cache-and-network',\n //nextFetchPolicy: 'network-only',\n });\n};\n\n/**\n * Hook for fetching service channels\n * @param options - Query options\n * @returns Query result with data, loading state and refetch function\n */\nexport const useServiceChannelsQuery = (options: any = {}) => {\n return useSupportServiceChannelsQuery({\n ...options,\n fetchPolicy: 'cache-and-network',\n });\n};\n\n/**\n * Hook for fetching channel details\n * @param channelId - ID of the channel to fetch\n * @param options - Additional query options\n * @returns Query result with channel details\n */\nexport const useChannelDetailQuery = (channelId: string, options: any = {}) => {\n return useViewChannelDetailQuery({\n variables: { channelId },\n ...options,\n });\n};\n\n// ====== THREAD QUERIES ======\n\n/**\n * Direct export of the thread messages query hook\n */\nexport { useThreadMessagesQuery };\n\n/**\n * Direct export of the messages query hook\n */\nexport { useMessagesQuery };\n\n/**\n * Hook for fetching thread messages with default options\n * @param variables - Query variables including channelId, role, and limit\n * @param options - Additional query options\n * @returns Query result with thread messages data\n */\nexport const useThreadMessagesQueryWithOptions = (variables: any, options: any = {}) => {\n return useThreadMessagesQuery({\n variables,\n fetchPolicy: 'cache-and-network',\n refetchWritePolicy: 'overwrite',\n nextFetchPolicy: 'network-only',\n ...options,\n });\n};\n\n// ====== MESSAGE QUERIES ======\n\n/**\n * Hook for fetching channel messages\n * @param variables - Query variables including channelId, parentId, and pagination params\n * @param options - Additional query options\n * @returns Query result for messages\n */\nexport const useChannelMessagesQuery = (variables: any = {}, options: any = {}) => {\n return useMessagesQuery({\n variables,\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'cache-first',\n refetchWritePolicy: 'merge',\n ...options,\n });\n};\n\n/**\n * Hook for sending messages in a channel\n * @returns Mutation function and result\n */\nexport const useSendChannelMessage = () => {\n return useSendMessagesMutation();\n};\n\n/**\n * Hook for adding a direct channel\n * @returns Mutation function and result\n */\nexport const useAddDirectChannel = () => {\n return useAddDirectChannelMutation();\n};\n\n/**\n * Messages document for queries\n */\nexport const MESSAGES_DOCUMENT = MessagesDocument;\n\n// ====== MUTATIONS ======\n\n/**\n * Hook for sending thread messages\n * @returns Mutation function and result\n */\nexport const useSendThreadMessage = () => {\n return useSendThreadMessageMutation();\n};\n\n/**\n * Hook for sending expo notifications\n * @returns Mutation function and result\n */\nexport const useSendExpoNotification = () => {\n return useSendExpoNotificationOnPostMutation();\n};\n\n/**\n * Hook for creating a post thread\n * @param options - Mutation options\n * @returns Mutation function and result\n */\nexport const useCreatePostThread = (options: any = {}) => {\n return useCreatePostThreadMutation(options);\n};\n\n// ====== SUBSCRIPTION DOCUMENTS ======\n\n/**\n * Document for chat message added subscription\n */\nexport const CHAT_MESSAGE_ADDED = OnChatMessageAddedDocument;\n\n/**\n * Document for thread created/updated subscription\n */\nexport const THREAD_CREATED_UPDATED = OnThreadCreatedUpdatedDocument;\n\n/**\n * Hook for subscribing to thread creation and updates\n * @returns Subscription result for thread creation/update events\n */\nexport const useThreadCreatedUpdatedSubscription = (options: any = {}) => {\n return useOnThreadCreatedUpdatedSubscription({\n ...options,\n });\n};\n\n/**\n * Hook for subscribing to chat message additions\n * @param options - Subscription options including variables like channelId\n * @returns Subscription result for new chat messages\n */\nexport const useChatMessageAddedSubscription = (options: any = {}) => {\n return useOnChatMessageAddedSubscription({\n ...options,\n });\n};\n\n/**\n * Hook for subscribing to thread chat message additions\n * @param options - Subscription options including variables like channelId and threadId\n * @returns Subscription result for new thread chat messages\n */\nexport const useThreadChatMessageAddedSubscription = (options: any = {}) => {\n return useOnThreadChatMessageAddedSubscription({\n ...options,\n });\n};\n\n// ====== LAZY QUERIES ======\n\n/**\n * Hook for lazily fetching a post thread\n * @param options - Lazy query options\n * @returns Lazy query function and result\n */\nexport const useGetPostThreadLazy = (options: any = {}) => {\n return useGetPostThreadLazyQuery({\n fetchPolicy: 'cache-and-network',\n ...options,\n });\n};\n\n// ====== CUSTOM QUERY HOOKS ======\n\n/**\n * Custom hook that combines channels and provides refresh functionality\n */\nexport const useInboxChannels = () => {\n const queryResult = useChannelsQuery();\n\n const refresh = useCallback(() => {\n return queryResult.refetch();\n }, [queryResult.refetch]);\n\n const loadMore = useCallback(\n (page: number) => {\n if (queryResult.loading || !queryResult.data) return;\n\n return queryResult.fetchMore({\n variables: { page },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n // supportServiceChannels: [\n // ...(prev.supportServiceChannels || []),\n // ...(fetchMoreResult.supportServiceChannels || []),\n // ],\n };\n },\n });\n },\n [queryResult.fetchMore, queryResult.loading, queryResult.data],\n );\n\n return {\n ...queryResult,\n refresh,\n loadMore,\n };\n};\n\n/**\n * Custom hook for thread message operations\n */\nexport const useThreadOperations = (channelId: string, options: any = {}) => {\n const queryResult = useThreadMessagesQueryWithOptions({ channelId, ...options.variables }, options.queryOptions);\n\n const [sendMessage, sendMessageResult] = useSendThreadMessage();\n\n const refresh = useCallback(() => {\n return queryResult.refetch();\n }, [queryResult.refetch]);\n\n const fetchMoreMessages = useCallback(\n (variables: any) => {\n return queryResult.fetchMore({\n variables,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult?.threadMessages?.data) return prev;\n\n return {\n ...prev,\n threadMessages: {\n ...prev.threadMessages,\n data: [...fetchMoreResult.threadMessages.data, ...(prev.threadMessages?.data || [])],\n },\n };\n },\n });\n },\n [queryResult.fetchMore],\n );\n\n return {\n data: queryResult.data,\n loading: queryResult.loading,\n error: queryResult.error,\n refresh,\n fetchMoreMessages,\n sendMessage,\n sendMessageResult,\n };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqCO,MAAM,qBAAA,GAAwB,CAAC,SAAA,EAAmB,OAAA,GAAe,EAAC,KAAM;AAC7E,EAAA,OAAO,yBAAA,CAA0B,cAAA,CAAA;AAAA,IAC/B,SAAA,EAAW;AAAA,MACT;AAAA;AACF,GAAA,EACG,OAAA,CACJ,CAAA;AACH;AAoBO,MAAM,iCAAA,GAAoC,CAAC,SAAA,EAAgB,OAAA,GAAe,EAAC,KAAM;AACtF,EAAA,OAAO,sBAAA,CAAuB,cAAA,CAAA;AAAA,IAC5B,SAAA;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,IACb,kBAAA,EAAoB,WAAA;AAAA,IACpB,eAAA,EAAiB;AAAA,GAAA,EACd,OAAA,CACJ,CAAA;AACH;AAUO,MAAM,0BAA0B,CAAC,SAAA,GAAiB,EAAC,EAAG,OAAA,GAAe,EAAC,KAAM;AACjF,EAAA,OAAO,gBAAA,CAAiB,cAAA,CAAA;AAAA,IACtB,SAAA;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,IACb,eAAA,EAAiB,aAAA;AAAA,IACjB,kBAAA,EAAoB;AAAA,GAAA,EACjB,OAAA,CACJ,CAAA;AACH;AAMO,MAAM,wBAAwB,MAAM;AACzC,EAAA,OAAO,uBAAA,EAAwB;AACjC;AAMO,MAAM,sBAAsB,MAAM;AACvC,EAAA,OAAO,2BAAA,EAA4B;AACrC;AAKO,MAAM,iBAAA,GAAoB;AAQ1B,MAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,4BAAA,EAA6B;AACtC;AAMO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,OAAO,qCAAA,EAAsC;AAC/C;AAOO,MAAM,mBAAA,GAAsB,CAAC,OAAA,GAAe,EAAC,KAAM;AACxD,EAAA,OAAO,4BAA4B,OAAO,CAAA;AAC5C;AAOO,MAAM,kBAAA,GAAqB;AAK3B,MAAM,sBAAA,GAAyB;AAM/B,MAAM,mCAAA,GAAsC,CAAC,OAAA,GAAe,EAAC,KAAM;AACxE,EAAA,OAAO,qCAAA,CAAsC,mBACxC,OAAA,CACJ,CAAA;AACH;AA+BO,MAAM,oBAAA,GAAuB,CAAC,OAAA,GAAe,EAAC,KAAM;AACzD,EAAA,OAAO,yBAAA,CAA0B,cAAA,CAAA;AAAA,IAC/B,WAAA,EAAa;AAAA,GAAA,EACV,OAAA,CACJ,CAAA;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogMessages.js","sources":["../../../src/screens/inbox/DialogMessages.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box } from '@admin-layout/gluestack-ui-mobile';\nimport { ConversationView } from './containers/ConversationView';\nimport { navigationRef } from '@common-stack/client-react';\n\nexport function DialogMessages({ channelId, role, isShowThreadMessage = true, ...rest }) {\n const currentRoute = navigationRef.isReady() ? navigationRef?.getCurrentRoute() : null;\n return (\n // <Box bg={'white'} flex={1} pt={5}>\n <Box className=\"bg-white flex-1\">\n <ConversationView\n {...rest}\n channelId={currentRoute?.params?.channelId ?? channelId}\n role={role}\n isShowThreadMessage={isShowThreadMessage}\n />\n </Box>\n );\n}\n\nexport default DialogMessages;\n"],"names":["_a","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,eAAe,EAK5B
|
|
1
|
+
{"version":3,"file":"DialogMessages.js","sources":["../../../src/screens/inbox/DialogMessages.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box } from '@admin-layout/gluestack-ui-mobile';\nimport { ConversationView } from './containers/ConversationView';\nimport { navigationRef } from '@common-stack/client-react';\n\nexport function DialogMessages({ channelId, role, isShowThreadMessage = true, ...rest }) {\n const currentRoute = navigationRef.isReady() ? navigationRef?.getCurrentRoute() : null;\n return (\n // <Box bg={'white'} flex={1} pt={5}>\n <Box className=\"bg-white flex-1\">\n <ConversationView\n {...rest}\n channelId={currentRoute?.params?.channelId ?? channelId}\n role={role}\n isShowThreadMessage={isShowThreadMessage}\n />\n </Box>\n );\n}\n\nexport default DialogMessages;\n"],"names":["_a","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,eAAe,EAAA,EAK5B;AAL4B,EAAA,IAAA,EAAA,GAAA,EAAA,EAC7B;AAAA,IAAA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,mBAAA,GAAsB;AAAA,GAPxB,GAI+B,EAAA,EAI1B,IAAA,GAAA,SAAA,CAJ0B,EAAA,EAI1B;AAAA,IAHH,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAPF,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA;AAUE,EAAA,MAAM,eAAe,aAAA,CAAc,OAAA,MAAYD,GAAAA,GAAA,aAAA,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAe,eAAA,EAAA,GAAoB,IAAA;AAClF,EAAA,uBAEE,KAAA,CAAA,aAAA,CAAC,OAAI,SAAA,EAAU,iBAAA,EAAA,sCACN,gBAAA,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAAqB,IAAA,CAAA,EAArB,EAA2B,SAAA,EAAA,CAAW,EAAA,GAAA,CAAAC,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,MAAA,KAAd,gBAAAA,GAAAA,CAAsB,SAAA,KAAtB,YAAmC,SAAA,EAAW,IAAA,EAAY,sBAA0C,CAC/I,CAAA;AAER"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogThreadMessages.js","sources":["../../../src/screens/inbox/DialogThreadMessages.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { ThreadConversationView } from './containers/ThreadConversationView';\nimport { ThreadsView } from './containers/ThreadsView';\nimport { useChannelDetailQuery, useSendThreadMessage } from '../../queries/inboxQueries';\nimport { useFocusEffect } from '@react-navigation/native';\n// import { useSelector } from 'react-redux';\nimport colors from 'tailwindcss/colors';\n\nexport function DialogThreadMessages({ channelId, postParentId, isPostParentIdThread, role }) {\n const { data, loading: channelLoading, refetch } = useChannelDetailQuery(channelId?.toString(), {});\n\n const [sendThreadMessage] = useSendThreadMessage();\n const [loading, setLoading] = React.useState<boolean>(true);\n const [channel, setChannel] = React.useState<any>(null);\n const [parentId, setParentId] = React.useState<any>(postParentId);\n\n const refetchChannelDetail = React.useCallback(\n (id: string) => {\n return refetch({ id: id?.toString() });\n },\n [channelId],\n );\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n if (channelId) refetch({ id: channelId?.toString() });\n return () => {};\n }, [channelId]),\n );\n\n React.useEffect(() => {\n setParentId(postParentId);\n }, [postParentId]);\n\n React.useEffect(() => {\n if (data?.viewChannelDetail) {\n setChannel(data?.viewChannelDetail);\n setLoading(false);\n }\n }, [data]);\n\n // React.useEffect(() => {\n // async function sendInitialMessage(channel: any) {\n // const content = `Welcome to ${channel?.title}`;\n // const createdBy = channel?.creator?.id;\n // await sendThreadMessage({\n // variables: {\n // channelId,\n // threadMessageInput: {\n // content,\n // role,\n // },\n // responderId: createdBy,\n // },\n // update: (cache, { data, errors }: any) => {\n // if (!data) {\n // return;\n // }\n // setParentId(data?.sendThreadMessage?.lastMessage?.id);\n // },\n // });\n // }\n // if ((!parentId || parentId == 0) && channel) {\n // sendInitialMessage(channel);\n // }\n\n // if (parentId) setLoading(false);\n // }, [parentId, channel]);\n\n return (\n <Box className=\"bg-white flex-1\">\n {/* {loading && !parentId ? ( */}\n {loading ? (\n <Spinner color={colors.blue[500]} />\n ) : (\n <ThreadConversationView\n channelId={channelId}\n postParentId={parentId}\n isPostParentIdThread={isPostParentIdThread}\n role={role}\n />\n )}\n </Box>\n );\n}\n\nexport default DialogThreadMessages;\n"],"names":[],"mappings":"wVAQO,SAAS,
|
|
1
|
+
{"version":3,"file":"DialogThreadMessages.js","sources":["../../../src/screens/inbox/DialogThreadMessages.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { ThreadConversationView } from './containers/ThreadConversationView';\nimport { ThreadsView } from './containers/ThreadsView';\nimport { useChannelDetailQuery, useSendThreadMessage } from '../../queries/inboxQueries';\nimport { useFocusEffect } from '@react-navigation/native';\n// import { useSelector } from 'react-redux';\nimport colors from 'tailwindcss/colors';\n\nexport function DialogThreadMessages({ channelId, postParentId, isPostParentIdThread, role }) {\n const { data, loading: channelLoading, refetch } = useChannelDetailQuery(channelId?.toString(), {});\n\n const [sendThreadMessage] = useSendThreadMessage();\n const [loading, setLoading] = React.useState<boolean>(true);\n const [channel, setChannel] = React.useState<any>(null);\n const [parentId, setParentId] = React.useState<any>(postParentId);\n\n const refetchChannelDetail = React.useCallback(\n (id: string) => {\n return refetch({ id: id?.toString() });\n },\n [channelId],\n );\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n if (channelId) refetch({ id: channelId?.toString() });\n return () => {};\n }, [channelId]),\n );\n\n React.useEffect(() => {\n setParentId(postParentId);\n }, [postParentId]);\n\n React.useEffect(() => {\n if (data?.viewChannelDetail) {\n setChannel(data?.viewChannelDetail);\n setLoading(false);\n }\n }, [data]);\n\n // React.useEffect(() => {\n // async function sendInitialMessage(channel: any) {\n // const content = `Welcome to ${channel?.title}`;\n // const createdBy = channel?.creator?.id;\n // await sendThreadMessage({\n // variables: {\n // channelId,\n // threadMessageInput: {\n // content,\n // role,\n // },\n // responderId: createdBy,\n // },\n // update: (cache, { data, errors }: any) => {\n // if (!data) {\n // return;\n // }\n // setParentId(data?.sendThreadMessage?.lastMessage?.id);\n // },\n // });\n // }\n // if ((!parentId || parentId == 0) && channel) {\n // sendInitialMessage(channel);\n // }\n\n // if (parentId) setLoading(false);\n // }, [parentId, channel]);\n\n return (\n <Box className=\"bg-white flex-1\">\n {/* {loading && !parentId ? ( */}\n {loading ? (\n <Spinner color={colors.blue[500]} />\n ) : (\n <ThreadConversationView\n channelId={channelId}\n postParentId={parentId}\n isPostParentIdThread={isPostParentIdThread}\n role={role}\n />\n )}\n </Box>\n );\n}\n\nexport default DialogThreadMessages;\n"],"names":[],"mappings":"wVAQO,SAAS,oBAAA,CAAqB;AAAA,EACnC,SAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAAG;AACD,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT;AAAA,GACF,GAAI,qBAAA,CAAsB,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,QAAA,EAAA,EAAY,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,oBAAA,EAAqB;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,KAAA,CAAM,SAAkB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,KAAA,CAAM,SAAc,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,KAAA,CAAM,SAAc,YAAY,CAAA;AAChE,EAA6B,KAAA,CAAM,WAAA,CAAY,CAAC,EAAA,KAAe;AAC7D,IAAA,OAAO,OAAA,CAAQ;AAAA,MACb,IAAI,EAAA,IAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAI,QAAA;AAAA,KACT,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAS,CAAC;AACd,EAAA,cAAA,CAAe,KAAA,CAAM,YAAY,MAAM;AAErC,IAAA,IAAI,SAAA;AAAW,MAAA,OAAA,CAAQ;AAAA,QACrB,IAAI,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,QAAA;AAAA,OAChB,CAAA;AACD,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAC,CAAA;AACf,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,YAAY,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACjB,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,6BAAM,iBAAA,EAAmB;AAC3B,MAAA,UAAA,CAAW,6BAAM,iBAAiB,CAAA;AAClC,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AA8BT,EAAA,2CAAQ,GAAA,EAAA,EAAI,SAAA,EAAU,qBAEX,OAAA,mBAAU,KAAA,CAAA,aAAA,CAAC,WAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,GAAA,CAAA,EAAM,CAAA,uCAAM,sBAAA,EAAA,EAAuB,SAAA,EAAsB,cAAc,QAAA,EAAU,oBAAA,EAA4C,MAAY,CACpL,CAAA;AACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogThreads.js","sources":["../../../src/screens/inbox/DialogThreads.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { ThreadConversationView } from './containers/ThreadConversationView';\nimport { ThreadsView } from './containers/ThreadsView';\nimport { useChannelDetailQuery, useThreadMessagesQueryWithOptions } from '../../queries/inboxQueries';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { useSelector } from 'react-redux';\nimport { config } from './config';\nimport colors from 'tailwindcss/colors';\nimport { useSafeDialogThreadsMachine } from './hooks/useSafeDialogThreadsMachine';\nimport { Actions, BaseState } from './workflow/dialog-threads-xstate';\nconst { MESSAGES_PER_PAGE } = config;\n\nexport function DialogThreads({ channelId, postParentId, role }) {\n // Use the XState machine for state management\n const [state, send] = useSafeDialogThreadsMachine();\n const { context, value } = state;\n const { channelsDetail, loading, error } = context;\n\n // Fetch channel details\n const {\n data: channelData,\n loading: channelLoading,\n refetch: channelRefetch,\n } = useChannelDetailQuery(channelId?.toString(), {});\n\n // Fetch thread messages\n const {\n data: threadsData,\n loading: threadLoading,\n error: threadsError,\n refetch: threadsRefetch,\n subscribeToMore: threadsSubscribeToMore,\n } = useThreadMessagesQueryWithOptions({\n variables: {\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n },\n });\n console.log('threadsData', threadsData?.threadMessages?.totalCount);\n console.log('channelid', channelId);\n // Initialize the machine with props\n React.useEffect(() => {\n send({\n type: Actions.INITIALIZE,\n data: { channelId, postParentId, role },\n });\n }, [channelId, postParentId, role]);\n\n // Update channel detail in state when data changes\n React.useEffect(() => {\n if (channelData?.viewChannelDetail) {\n send({\n type: Actions.SET_CHANNEL_DETAIL,\n data: { channelsDetail: channelData.viewChannelDetail },\n });\n }\n }, [channelData]);\n\n // Update thread data in state when data changes\n React.useEffect(() => {\n if (threadsData) {\n send({\n type: Actions.SET_THREADS,\n data: { threadData: threadsData?.threadMessages?.data || [] },\n });\n }\n }, [threadsData]);\n\n // Handle errors\n React.useEffect(() => {\n if (threadsError) {\n send({\n type: Actions.ERROR,\n data: { error: threadsError },\n });\n }\n }, [threadsError]);\n\n const refetchChannelDetail = React.useCallback(\n (id: string) => {\n return channelRefetch({ id: id?.toString() });\n },\n [channelId],\n );\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n if (channelId) refetchChannelDetail(channelId);\n return () => {};\n }, []),\n );\n\n return (\n <>\n {state.matches(BaseState.LoadingChannel) || channelLoading ? (\n <Spinner color={colors.blue[500]} />\n ) : (\n <>\n <Box className=\"flex-1 bg-gray-200 dark:border-gray-500 dark:bg-gray-500\">\n <ThreadsView\n data={threadsData}\n loading={threadLoading || state.matches(BaseState.LoadingThreads)}\n refetch={threadsRefetch}\n subscribeToMore={threadsSubscribeToMore}\n error={error || threadsError}\n channelId={channelId}\n role={role}\n channelsDetail={channelsDetail}\n refetchChannelDetail={refetchChannelDetail}\n />\n </Box>\n </>\n )}\n </>\n );\n}\n\nexport default DialogThreads;\n"],"names":["_a"],"mappings":"4gBAWA,MAAM;AAAA,EACJ;AACF,
|
|
1
|
+
{"version":3,"file":"DialogThreads.js","sources":["../../../src/screens/inbox/DialogThreads.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Spinner, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { ThreadConversationView } from './containers/ThreadConversationView';\nimport { ThreadsView } from './containers/ThreadsView';\nimport { useChannelDetailQuery, useThreadMessagesQueryWithOptions } from '../../queries/inboxQueries';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { useSelector } from 'react-redux';\nimport { config } from './config';\nimport colors from 'tailwindcss/colors';\nimport { useSafeDialogThreadsMachine } from './hooks/useSafeDialogThreadsMachine';\nimport { Actions, BaseState } from './workflow/dialog-threads-xstate';\nconst { MESSAGES_PER_PAGE } = config;\n\nexport function DialogThreads({ channelId, postParentId, role }) {\n // Use the XState machine for state management\n const [state, send] = useSafeDialogThreadsMachine();\n const { context, value } = state;\n const { channelsDetail, loading, error } = context;\n\n // Fetch channel details\n const {\n data: channelData,\n loading: channelLoading,\n refetch: channelRefetch,\n } = useChannelDetailQuery(channelId?.toString(), {});\n\n // Fetch thread messages\n const {\n data: threadsData,\n loading: threadLoading,\n error: threadsError,\n refetch: threadsRefetch,\n subscribeToMore: threadsSubscribeToMore,\n } = useThreadMessagesQueryWithOptions({\n variables: {\n channelId: channelId?.toString(),\n role: role?.toString(),\n limit: MESSAGES_PER_PAGE,\n repliesLimit2: 5,\n },\n });\n console.log('threadsData', threadsData?.threadMessages?.totalCount);\n console.log('channelid', channelId);\n // Initialize the machine with props\n React.useEffect(() => {\n send({\n type: Actions.INITIALIZE,\n data: { channelId, postParentId, role },\n });\n }, [channelId, postParentId, role]);\n\n // Update channel detail in state when data changes\n React.useEffect(() => {\n if (channelData?.viewChannelDetail) {\n send({\n type: Actions.SET_CHANNEL_DETAIL,\n data: { channelsDetail: channelData.viewChannelDetail },\n });\n }\n }, [channelData]);\n\n // Update thread data in state when data changes\n React.useEffect(() => {\n if (threadsData) {\n send({\n type: Actions.SET_THREADS,\n data: { threadData: threadsData?.threadMessages?.data || [] },\n });\n }\n }, [threadsData]);\n\n // Handle errors\n React.useEffect(() => {\n if (threadsError) {\n send({\n type: Actions.ERROR,\n data: { error: threadsError },\n });\n }\n }, [threadsError]);\n\n const refetchChannelDetail = React.useCallback(\n (id: string) => {\n return channelRefetch({ id: id?.toString() });\n },\n [channelId],\n );\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n if (channelId) refetchChannelDetail(channelId);\n return () => {};\n }, []),\n );\n\n return (\n <>\n {state.matches(BaseState.LoadingChannel) || channelLoading ? (\n <Spinner color={colors.blue[500]} />\n ) : (\n <>\n <Box className=\"flex-1 bg-gray-200 dark:border-gray-500 dark:bg-gray-500\">\n <ThreadsView\n data={threadsData}\n loading={threadLoading || state.matches(BaseState.LoadingThreads)}\n refetch={threadsRefetch}\n subscribeToMore={threadsSubscribeToMore}\n error={error || threadsError}\n channelId={channelId}\n role={role}\n channelsDetail={channelsDetail}\n refetchChannelDetail={refetchChannelDetail}\n />\n </Box>\n </>\n )}\n </>\n );\n}\n\nexport default DialogThreads;\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inbox.js","sources":["../../../src/screens/inbox/Inbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Text } from '@admin-layout/gluestack-ui-mobile';\n\nimport { Dialogs } from './containers/Dialogs';\n// import { SupportServiceDialogs } from './containers/SupportServiceDialogs';\n\nexport const Inbox = (props: any) => {\n const { channelFilters, channelRole, supportServices } = props;\n return (\n <Box className=\"flex-1 bg-white\">\n {/* {supportServices && (\n <SupportServiceDialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />\n )} */}\n <Dialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Inbox.js","sources":["../../../src/screens/inbox/Inbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Box, Text } from '@admin-layout/gluestack-ui-mobile';\n\nimport { Dialogs } from './containers/Dialogs';\n// import { SupportServiceDialogs } from './containers/SupportServiceDialogs';\n\nexport const Inbox = (props: any) => {\n const { channelFilters, channelRole, supportServices } = props;\n return (\n <Box className=\"flex-1 bg-white\">\n {/* {supportServices && (\n <SupportServiceDialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />\n )} */}\n <Dialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKO,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAe;AACnC,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,uBAAO,KAAA,CAAA,aAAA,CAAC,OAAI,SAAA,EAAU,iBAAA,EAAA,sCAIX,OAAA,EAAA,cAAA,CAAA,EAAQ,cAAA,EAAgC,WAAA,EAAA,EAA8B,KAAA,CAAO,CAClF,CAAA;AACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","sources":["../../../../../src/screens/inbox/components/CachedImage/consts.ts"],"sourcesContent":["import * as FileSystem from 'expo-file-system';\n\n// Make sure cache directory path ends with a slash\nexport const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}/image-cache/`;\n// export const IMAGE_CACHE_FOLDER = `${FileSystem.documentDirectory}images/`\nexport default IMAGE_CACHE_FOLDER;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"consts.js","sources":["../../../../../src/screens/inbox/components/CachedImage/consts.ts"],"sourcesContent":["import * as FileSystem from 'expo-file-system';\n\n// Make sure cache directory path ends with a slash\nexport const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}/image-cache/`;\n// export const IMAGE_CACHE_FOLDER = `${FileSystem.documentDirectory}images/`\nexport default IMAGE_CACHE_FOLDER;\n"],"names":[],"mappings":"4CAGO,MAAM,kBAAA,GAAqB,GAAG,UAAA,CAAW,cAAA,CAAA,aAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/screens/inbox/components/CachedImage/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, useMemo, useCallback } from 'react';\nimport { Image, View, Text } from 'react-native';\n// import { Image } from \"react-native\"\nimport * as FileSystem from 'expo-file-system';\n\nimport * as CONST from './consts';\n\n// Global download tracking to prevent duplicate downloads\nconst downloadTracker = new Map();\n\n// Ensure the cache directory exists\nconst ensureCacheDirectory = async () => {\n try {\n const dirInfo = await FileSystem.getInfoAsync(CONST.IMAGE_CACHE_FOLDER);\n if (!dirInfo.exists) {\n // console.log('Creating cache directory:', CONST.IMAGE_CACHE_FOLDER);\n await FileSystem.makeDirectoryAsync(CONST.IMAGE_CACHE_FOLDER, { intermediates: true });\n }\n return true;\n } catch (error) {\n // console.error('Failed to create cache directory:', error);\n return false;\n }\n};\n\n// Validate and sanitize the image URL\nconst validateImageUri = (uri: string): string | null => {\n if (!uri) return null;\n\n // Trim whitespace\n uri = uri.trim();\n\n // Check if it's a valid URL format\n try {\n new URL(uri);\n } catch (e) {\n // console.log('Invalid URL format:', uri);\n return null;\n }\n\n // Add more validation as needed for your specific case\n return uri;\n};\n\nconst CachedImage = React.memo(\n (props: any) => {\n const { source, cacheKey, placeholderContent, style, resizeMode, alt, ...restProps } = props;\n const { uri: originalUri, headers, expiresIn = 86400 } = source;\n\n // Validate and sanitize the URI\n const uri = validateImageUri(originalUri);\n const fileURI = `${CONST.IMAGE_CACHE_FOLDER}${cacheKey}`;\n\n const [imgUri, setImgUri] = useState<string | null>(null);\n const [loadError, setLoadError] = useState<boolean>(false);\n const [useFallbackUri, setUseFallbackUri] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n const componentIsMounted = useRef(true);\n const hasAttemptedLoad = useRef(false);\n const requestOption = headers ? { headers } : {};\n\n // Create a memoized download callback\n const downloadCallback = useCallback(\n (downloadProgress: any) => {\n if (componentIsMounted.current === false) {\n downloadTracker.delete(cacheKey);\n downloadResumableRef.current?.pauseAsync();\n FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n },\n [fileURI, cacheKey],\n );\n\n // Create a memoized download resumable\n const downloadResumableRef = useRef(\n uri ? FileSystem.createDownloadResumable(uri, fileURI, requestOption, downloadCallback) : null,\n );\n\n // Memoized load image function to avoid recreating on every render\n const loadImage = useCallback(async () => {\n if (!uri || hasAttemptedLoad.current) return;\n\n hasAttemptedLoad.current = true;\n setIsLoading(true);\n\n try {\n // Check if this image is already being downloaded\n if (downloadTracker.has(cacheKey)) {\n // Wait for the existing download to complete\n await downloadTracker.get(cacheKey);\n if (componentIsMounted.current) {\n setImgUri(fileURI);\n setIsLoading(false);\n }\n return;\n }\n\n // Use the cached image if it exists\n const metadata: any = await FileSystem.getInfoAsync(fileURI);\n const expired = expiresIn && new Date().getTime() / 1000 - metadata?.modificationTime > expiresIn;\n\n if (!metadata.exists || metadata?.size === 0 || expired) {\n if (!componentIsMounted.current) return;\n\n if (expired && metadata.exists) {\n await FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n\n if (!uri) {\n setLoadError(true);\n setIsLoading(false);\n return;\n }\n\n if (!downloadResumableRef.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n return;\n }\n\n try {\n // Record this download in the global tracker\n const downloadPromise = downloadResumableRef.current.downloadAsync();\n downloadTracker.set(cacheKey, downloadPromise);\n\n const response: any = await downloadPromise;\n\n // Remove from tracker when done\n downloadTracker.delete(cacheKey);\n\n if (componentIsMounted.current) {\n if (response && response.status === 200) {\n setImgUri(fileURI);\n } else {\n setUseFallbackUri(true);\n setImgUri(uri);\n FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n setIsLoading(false);\n }\n } catch (downloadError) {\n downloadTracker.delete(cacheKey);\n if (componentIsMounted.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n }\n }\n } else {\n // Use cached version\n setImgUri(fileURI);\n setIsLoading(false);\n }\n } catch (err) {\n if (componentIsMounted.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n }\n }\n }, [uri, fileURI, cacheKey, expiresIn]);\n\n // Setup effect\n useEffect(() => {\n const setup = async () => {\n const directoryExists = await ensureCacheDirectory();\n if (directoryExists && uri) {\n loadImage();\n } else {\n setLoadError(true);\n setIsLoading(false);\n }\n };\n\n setup();\n\n return () => {\n componentIsMounted.current = false;\n };\n }, [uri, loadImage]);\n\n // Default placeholder\n const defaultPlaceholder = useMemo(\n () => (\n <View\n style={[\n {\n width: '100%',\n height: '100%',\n backgroundColor: '#e1e1e1',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 3,\n },\n style,\n ]}\n >\n <Text>Image not available</Text>\n </View>\n ),\n [style],\n );\n\n // Show placeholder while loading or if there's an error\n if (isLoading || loadError || !imgUri) {\n return placeholderContent || defaultPlaceholder;\n }\n\n // Actual image component\n return (\n <Image\n {...restProps}\n style={style}\n source={{\n ...source,\n uri: useFallbackUri ? uri : imgUri,\n }}\n resizeMode={resizeMode}\n onError={(e) => {\n if (useFallbackUri) {\n setLoadError(true);\n setImgUri(null);\n } else {\n setUseFallbackUri(true);\n setImgUri(uri);\n }\n }}\n />\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison function for memoization\n return (\n prevProps.cacheKey === nextProps.cacheKey &&\n prevProps.source.uri === nextProps.source.uri &&\n prevProps.style === nextProps.style\n );\n },\n);\n\nexport const CacheManager = {\n addToCache: async ({ file, key }: any) => {\n await ensureCacheDirectory();\n await FileSystem.copyAsync({\n from: file,\n to: `${CONST.IMAGE_CACHE_FOLDER}${key}`,\n });\n const uri = await CacheManager.getCachedUri({ key });\n return uri;\n },\n\n getCachedUri: async ({ key }: any) => {\n const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`);\n return uri;\n },\n\n downloadAsync: async ({ uri, key, options }: any) => {\n await ensureCacheDirectory();\n return await FileSystem.downloadAsync(uri, `${CONST.IMAGE_CACHE_FOLDER}${key}`, options);\n },\n\n clearCache: async () => {\n try {\n await FileSystem.deleteAsync(CONST.IMAGE_CACHE_FOLDER, { idempotent: true });\n await ensureCacheDirectory();\n } catch (error) {\n console.error('Error clearing cache:', error);\n }\n },\n};\n\nexport default CachedImage;\n"],"names":["CONST.IMAGE_CACHE_FOLDER","React","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/screens/inbox/components/CachedImage/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, useMemo, useCallback } from 'react';\nimport { Image, View, Text } from 'react-native';\n// import { Image } from \"react-native\"\nimport * as FileSystem from 'expo-file-system';\n\nimport * as CONST from './consts';\n\n// Global download tracking to prevent duplicate downloads\nconst downloadTracker = new Map();\n\n// Ensure the cache directory exists\nconst ensureCacheDirectory = async () => {\n try {\n const dirInfo = await FileSystem.getInfoAsync(CONST.IMAGE_CACHE_FOLDER);\n if (!dirInfo.exists) {\n // console.log('Creating cache directory:', CONST.IMAGE_CACHE_FOLDER);\n await FileSystem.makeDirectoryAsync(CONST.IMAGE_CACHE_FOLDER, { intermediates: true });\n }\n return true;\n } catch (error) {\n // console.error('Failed to create cache directory:', error);\n return false;\n }\n};\n\n// Validate and sanitize the image URL\nconst validateImageUri = (uri: string): string | null => {\n if (!uri) return null;\n\n // Trim whitespace\n uri = uri.trim();\n\n // Check if it's a valid URL format\n try {\n new URL(uri);\n } catch (e) {\n // console.log('Invalid URL format:', uri);\n return null;\n }\n\n // Add more validation as needed for your specific case\n return uri;\n};\n\nconst CachedImage = React.memo(\n (props: any) => {\n const { source, cacheKey, placeholderContent, style, resizeMode, alt, ...restProps } = props;\n const { uri: originalUri, headers, expiresIn = 86400 } = source;\n\n // Validate and sanitize the URI\n const uri = validateImageUri(originalUri);\n const fileURI = `${CONST.IMAGE_CACHE_FOLDER}${cacheKey}`;\n\n const [imgUri, setImgUri] = useState<string | null>(null);\n const [loadError, setLoadError] = useState<boolean>(false);\n const [useFallbackUri, setUseFallbackUri] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n const componentIsMounted = useRef(true);\n const hasAttemptedLoad = useRef(false);\n const requestOption = headers ? { headers } : {};\n\n // Create a memoized download callback\n const downloadCallback = useCallback(\n (downloadProgress: any) => {\n if (componentIsMounted.current === false) {\n downloadTracker.delete(cacheKey);\n downloadResumableRef.current?.pauseAsync();\n FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n },\n [fileURI, cacheKey],\n );\n\n // Create a memoized download resumable\n const downloadResumableRef = useRef(\n uri ? FileSystem.createDownloadResumable(uri, fileURI, requestOption, downloadCallback) : null,\n );\n\n // Memoized load image function to avoid recreating on every render\n const loadImage = useCallback(async () => {\n if (!uri || hasAttemptedLoad.current) return;\n\n hasAttemptedLoad.current = true;\n setIsLoading(true);\n\n try {\n // Check if this image is already being downloaded\n if (downloadTracker.has(cacheKey)) {\n // Wait for the existing download to complete\n await downloadTracker.get(cacheKey);\n if (componentIsMounted.current) {\n setImgUri(fileURI);\n setIsLoading(false);\n }\n return;\n }\n\n // Use the cached image if it exists\n const metadata: any = await FileSystem.getInfoAsync(fileURI);\n const expired = expiresIn && new Date().getTime() / 1000 - metadata?.modificationTime > expiresIn;\n\n if (!metadata.exists || metadata?.size === 0 || expired) {\n if (!componentIsMounted.current) return;\n\n if (expired && metadata.exists) {\n await FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n\n if (!uri) {\n setLoadError(true);\n setIsLoading(false);\n return;\n }\n\n if (!downloadResumableRef.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n return;\n }\n\n try {\n // Record this download in the global tracker\n const downloadPromise = downloadResumableRef.current.downloadAsync();\n downloadTracker.set(cacheKey, downloadPromise);\n\n const response: any = await downloadPromise;\n\n // Remove from tracker when done\n downloadTracker.delete(cacheKey);\n\n if (componentIsMounted.current) {\n if (response && response.status === 200) {\n setImgUri(fileURI);\n } else {\n setUseFallbackUri(true);\n setImgUri(uri);\n FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n setIsLoading(false);\n }\n } catch (downloadError) {\n downloadTracker.delete(cacheKey);\n if (componentIsMounted.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n }\n }\n } else {\n // Use cached version\n setImgUri(fileURI);\n setIsLoading(false);\n }\n } catch (err) {\n if (componentIsMounted.current) {\n setUseFallbackUri(true);\n setImgUri(uri);\n setIsLoading(false);\n }\n }\n }, [uri, fileURI, cacheKey, expiresIn]);\n\n // Setup effect\n useEffect(() => {\n const setup = async () => {\n const directoryExists = await ensureCacheDirectory();\n if (directoryExists && uri) {\n loadImage();\n } else {\n setLoadError(true);\n setIsLoading(false);\n }\n };\n\n setup();\n\n return () => {\n componentIsMounted.current = false;\n };\n }, [uri, loadImage]);\n\n // Default placeholder\n const defaultPlaceholder = useMemo(\n () => (\n <View\n style={[\n {\n width: '100%',\n height: '100%',\n backgroundColor: '#e1e1e1',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 3,\n },\n style,\n ]}\n >\n <Text>Image not available</Text>\n </View>\n ),\n [style],\n );\n\n // Show placeholder while loading or if there's an error\n if (isLoading || loadError || !imgUri) {\n return placeholderContent || defaultPlaceholder;\n }\n\n // Actual image component\n return (\n <Image\n {...restProps}\n style={style}\n source={{\n ...source,\n uri: useFallbackUri ? uri : imgUri,\n }}\n resizeMode={resizeMode}\n onError={(e) => {\n if (useFallbackUri) {\n setLoadError(true);\n setImgUri(null);\n } else {\n setUseFallbackUri(true);\n setImgUri(uri);\n }\n }}\n />\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison function for memoization\n return (\n prevProps.cacheKey === nextProps.cacheKey &&\n prevProps.source.uri === nextProps.source.uri &&\n prevProps.style === nextProps.style\n );\n },\n);\n\nexport const CacheManager = {\n addToCache: async ({ file, key }: any) => {\n await ensureCacheDirectory();\n await FileSystem.copyAsync({\n from: file,\n to: `${CONST.IMAGE_CACHE_FOLDER}${key}`,\n });\n const uri = await CacheManager.getCachedUri({ key });\n return uri;\n },\n\n getCachedUri: async ({ key }: any) => {\n const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`);\n return uri;\n },\n\n downloadAsync: async ({ uri, key, options }: any) => {\n await ensureCacheDirectory();\n return await FileSystem.downloadAsync(uri, `${CONST.IMAGE_CACHE_FOLDER}${key}`, options);\n },\n\n clearCache: async () => {\n try {\n await FileSystem.deleteAsync(CONST.IMAGE_CACHE_FOLDER, { idempotent: true });\n await ensureCacheDirectory();\n } catch (error) {\n console.error('Error clearing cache:', error);\n }\n },\n};\n\nexport default CachedImage;\n"],"names":["CONST.IMAGE_CACHE_FOLDER","React","_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogItem.js","sources":["../../../../src/screens/inbox/components/DialogItem.tsx"],"sourcesContent":["import React, { useMemo, useState, useCallback, useRef, useEffect } from 'react';\nimport {\n Text,\n Pressable,\n HStack,\n Box,\n AvatarGroup,\n Avatar,\n AvatarFallbackText,\n AvatarImage,\n AvatarBadge,\n} from '@admin-layout/gluestack-ui-mobile';\nimport { format, isToday, isYesterday } from 'date-fns';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { IChannel, IUserAccount, RoomType } from 'common';\nimport { startCase } from 'lodash-es';\nimport colors from 'tailwindcss/colors';\n\n// Helper function to safely create a Date object\nconst safeDate = (dateValue: any): Date | null => {\n if (!dateValue) return null;\n\n try {\n const date = new Date(dateValue);\n if (isNaN(date.getTime())) {\n console.warn('Invalid date value detected:', dateValue);\n return null;\n }\n return date;\n } catch (error) {\n console.warn('Error creating date from value:', dateValue, error);\n return null;\n }\n};\n\nconst createdAtText = (value: string): string => {\n if (!value) return '';\n const date = safeDate(value);\n if (!date) return '';\n\n if (isToday(date)) return 'Today';\n if (isYesterday(date)) return 'Yesterday';\n return format(date, 'MMM dd, yyyy');\n};\n\nexport interface IDialogListChannel extends IChannel {\n users: IUserAccount[];\n}\n\nexport interface IDialogItemProps {\n currentUser?: any;\n channel?: any;\n onOpen: (id: any, title: any, postParentId?: any) => void;\n}\n\ninterface LastMessageComponentProps {\n title: string;\n lastMessage: any;\n isServiceChannel?: boolean;\n}\n\n// LastMessage component that works for both direct and service channels\nconst LastMessageComponent: React.FC<LastMessageComponentProps> = ({\n title,\n lastMessage,\n isServiceChannel = false,\n}) => {\n const count = 30;\n const channelTitle = title?.slice(0, count) + (title?.length > count ? '...' : '') || '';\n\n let displayMessage = 'No messages yet';\n\n if (lastMessage) {\n const hasFileAttachments = lastMessage.files?.data?.length > 0;\n const isImageMessage =\n lastMessage.message?.includes('<img') ||\n lastMessage.message?.includes('[Image]') ||\n lastMessage.message?.includes('![') ||\n (/\\.(jpeg|jpg|gif|png|bmp|webp)/i.test(lastMessage.message || '') &&\n ((lastMessage.message || '').includes('http') || (lastMessage.message || '').includes('/images/')));\n\n if (hasFileAttachments) {\n displayMessage = '📎 File attachment';\n } else if (isImageMessage) {\n displayMessage = '[Image]';\n } else if (lastMessage.message && lastMessage.message.trim() !== '') {\n displayMessage = lastMessage.message;\n } else {\n displayMessage = '(Empty message)';\n }\n }\n\n const displayDate = lastMessage?.createdAt\n ? createdAtText(lastMessage.createdAt)\n : lastMessage?.updatedAt\n ? createdAtText(lastMessage.updatedAt)\n : '';\n\n return (\n <HStack space={'sm'} className=\"flex-1 justify-between\">\n <Box className=\"flex-[0.8]\">\n <Text color={colors.gray[600]} className=\"text-base text-wrap flex-wrap font-semibold\">\n {channelTitle}\n </Text>\n <Text color={colors.gray[600]} numberOfLines={1}>\n {displayMessage}\n </Text>\n </Box>\n\n <Box className=\"flex-[0.2]\">\n <Text color={colors.gray[500]}>{displayDate}</Text>\n </Box>\n </HStack>\n );\n};\n\nexport const DialogItemComponent: React.FC<IDialogItemProps> = function DialogItem({ currentUser, channel, onOpen }) {\n const isMountedRef = useRef(true);\n const [title, setTitle] = useState('');\n const [subscriptionsTimestamp, setSubscriptionsTimestamp] = useState(Date.now());\n\n const isServiceChannel = channel?.type === RoomType.Service;\n\n // Use channel.lastMessage instead of computing it\n const lastMessage = channel?.lastMessage;\n\n // Service channel specific calculations\n const creatorAndMembersId = useMemo(() => {\n if (!isServiceChannel || !channel?.members) return null;\n const membersIds: any =\n channel?.members\n ?.filter((m: any) => m !== null && m?.user?.id !== currentUser?.id)\n ?.map((mu: any) => mu?.user?.id) ?? [];\n const creatorId: any = channel?.creator?.id;\n const mergedIds: any = [].concat(membersIds, creatorId) ?? [];\n return mergedIds?.filter((m: any, pos: any) => mergedIds?.indexOf(m) === pos) ?? [];\n }, [isServiceChannel, channel, currentUser]);\n\n const postParentId = useMemo(() => {\n if (!isServiceChannel || !creatorAndMembersId?.length) return null;\n return creatorAndMembersId?.length && creatorAndMembersId?.includes(currentUser?.id)\n ? null\n : lastMessage?.parentId\n ? lastMessage?.parentId\n : lastMessage?.id ?? 0;\n }, [isServiceChannel, creatorAndMembersId, lastMessage, currentUser]);\n\n // Channel members computation for direct channels\n const channelMembers = useMemo(() => {\n if (isServiceChannel) return [];\n return (\n channel?.members\n ?.filter((ch: any) => ch?.user?.id !== currentUser?.id && ch?.user?.__typename === 'UserAccount')\n ?.map((m: any) => m?.user) ?? []\n );\n }, [isServiceChannel, currentUser?.id, channel?.members]);\n\n // Set title when channel members change (for direct channels)\n useEffect(() => {\n if (!isServiceChannel && channelMembers.length > 0 && isMountedRef.current) {\n const titleString =\n channelMembers\n ?.map((u: any) => `${u?.givenName || ''} ${u?.familyName || ''}`.trim())\n ?.filter(Boolean)\n ?.join(', ') || '';\n setTitle(titleString);\n } else if (isServiceChannel && channel?.title) {\n setTitle(channel.title);\n }\n }, [isServiceChannel, channelMembers, channel?.title]);\n\n // Compute display title\n const displayTitle = useMemo(() => {\n const length = 30;\n const titleToUse = isServiceChannel ? channel?.title || '' : title;\n return titleToUse.length > length ? titleToUse.substring(0, length - 3) + '...' : titleToUse;\n }, [isServiceChannel, channel?.title, title]);\n\n // Set mounted state on mount/unmount\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Focus effect handling\n useFocusEffect(\n useCallback(() => {\n if (!channel?.id) return;\n\n console.log(`DialogItem focused for ${isServiceChannel ? 'service' : 'direct'} channel:`, channel?.id);\n\n if (isServiceChannel) {\n setSubscriptionsTimestamp(Date.now());\n }\n }, [channel?.id, isServiceChannel]),\n );\n\n // Handle press based on channel type\n const handlePress = useCallback(() => {\n if (isServiceChannel) {\n onOpen(channel?.id, displayTitle, postParentId);\n } else {\n onOpen(channel?.id, displayTitle);\n }\n }, [isServiceChannel, channel?.id, displayTitle, postParentId, onOpen]);\n\n // Render avatar based on channel type\n const renderAvatar = () => {\n if (isServiceChannel) {\n return (\n <Avatar\n key={'service-channels-key-' + channel?.id}\n size={'sm'}\n className=\"bg-transparent top-0 right-0 z-[1]\"\n >\n <AvatarFallbackText>{startCase(channel?.creator?.username?.charAt(0))}</AvatarFallbackText>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: channel?.creator?.picture,\n }}\n />\n </Avatar>\n );\n }\n\n return (\n <AvatarGroup>\n {channelMembers &&\n channelMembers?.length > 0 &&\n channelMembers?.slice(0, 1)?.map((ch: any, i: number) => (\n <Avatar\n key={'dialogs-list-' + i}\n size={'sm'}\n className={`bg-transparent top-[${i === 1 ? '4' : '0'}] right-[${\n i === 1 ? '-2' : '0'\n }] z-[${i === 1 ? 5 : 1}]`}\n >\n <AvatarFallbackText>{startCase(ch?.username?.charAt(0))}</AvatarFallbackText>\n {channelMembers?.length > 1 && (\n <AvatarBadge\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: '#e5e7eb',\n borderRadius: 5,\n }}\n className=\"items-center justify-center bg-gray-200 rounded-md\"\n >\n <Text style={{ fontSize: 12, fontWeight: 'bold', color: '#000' }}>\n {channelMembers?.length}\n </Text>\n </AvatarBadge>\n )}\n {channelMembers?.length === 1 && (\n <>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: ch?.picture,\n }}\n />\n <AvatarBadge style={{ width: 10, height: 10 }} />\n </>\n )}\n </Avatar>\n ))}\n </AvatarGroup>\n );\n };\n\n return (\n <Pressable\n onPress={handlePress}\n className=\"flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700\"\n style={{\n borderBottomWidth: 1,\n borderColor: '#e5e7eb',\n marginVertical: 0,\n paddingHorizontal: isServiceChannel ? 2 : 10,\n }}\n >\n <HStack space={'md'} className=\"flex-1 w-[100%] py-3 items-center\">\n <Box className=\"flex-[0.1] items-start pl-3\">{renderAvatar()}</Box>\n <Box className=\"flex-1\">\n <LastMessageComponent\n key={\n isServiceChannel\n ? `service-channel-${channel?.id}-${subscriptionsTimestamp}`\n : `last-msg-${lastMessage?.id || 'none'}-${channelMembers.length}`\n }\n title={displayTitle}\n lastMessage={lastMessage}\n isServiceChannel={isServiceChannel}\n />\n </Box>\n </HStack>\n </Pressable>\n );\n};\n\nexport const DialogItem = React.memo(DialogItemComponent);\n"],"names":["React","DialogItem","_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DialogItem.js","sources":["../../../../src/screens/inbox/components/DialogItem.tsx"],"sourcesContent":["import React, { useMemo, useState, useCallback, useRef, useEffect } from 'react';\nimport {\n Text,\n Pressable,\n HStack,\n Box,\n AvatarGroup,\n Avatar,\n AvatarFallbackText,\n AvatarImage,\n AvatarBadge,\n} from '@admin-layout/gluestack-ui-mobile';\nimport { format, isToday, isYesterday } from 'date-fns';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { IChannel, IUserAccount, RoomType } from 'common';\nimport { startCase } from 'lodash-es';\nimport colors from 'tailwindcss/colors';\n\n// Helper function to safely create a Date object\nconst safeDate = (dateValue: any): Date | null => {\n if (!dateValue) return null;\n\n try {\n const date = new Date(dateValue);\n if (isNaN(date.getTime())) {\n console.warn('Invalid date value detected:', dateValue);\n return null;\n }\n return date;\n } catch (error) {\n console.warn('Error creating date from value:', dateValue, error);\n return null;\n }\n};\n\nconst createdAtText = (value: string): string => {\n if (!value) return '';\n const date = safeDate(value);\n if (!date) return '';\n\n if (isToday(date)) return 'Today';\n if (isYesterday(date)) return 'Yesterday';\n return format(date, 'MMM dd, yyyy');\n};\n\nexport interface IDialogListChannel extends IChannel {\n users: IUserAccount[];\n}\n\nexport interface IDialogItemProps {\n currentUser?: any;\n channel?: any;\n onOpen: (id: any, title: any, postParentId?: any) => void;\n}\n\ninterface LastMessageComponentProps {\n title: string;\n lastMessage: any;\n isServiceChannel?: boolean;\n}\n\n// LastMessage component that works for both direct and service channels\nconst LastMessageComponent: React.FC<LastMessageComponentProps> = ({\n title,\n lastMessage,\n isServiceChannel = false,\n}) => {\n const count = 30;\n const channelTitle = title?.slice(0, count) + (title?.length > count ? '...' : '') || '';\n\n let displayMessage = 'No messages yet';\n\n if (lastMessage) {\n const hasFileAttachments = lastMessage.files?.data?.length > 0;\n const isImageMessage =\n lastMessage.message?.includes('<img') ||\n lastMessage.message?.includes('[Image]') ||\n lastMessage.message?.includes('![') ||\n (/\\.(jpeg|jpg|gif|png|bmp|webp)/i.test(lastMessage.message || '') &&\n ((lastMessage.message || '').includes('http') || (lastMessage.message || '').includes('/images/')));\n\n if (hasFileAttachments) {\n displayMessage = '📎 File attachment';\n } else if (isImageMessage) {\n displayMessage = '[Image]';\n } else if (lastMessage.message && lastMessage.message.trim() !== '') {\n displayMessage = lastMessage.message;\n } else {\n displayMessage = '(Empty message)';\n }\n }\n\n const displayDate = lastMessage?.createdAt\n ? createdAtText(lastMessage.createdAt)\n : lastMessage?.updatedAt\n ? createdAtText(lastMessage.updatedAt)\n : '';\n\n return (\n <HStack space={'sm'} className=\"flex-1 justify-between\">\n <Box className=\"flex-[0.8]\">\n <Text color={colors.gray[600]} className=\"text-base text-wrap flex-wrap font-semibold\">\n {channelTitle}\n </Text>\n <Text color={colors.gray[600]} numberOfLines={1}>\n {displayMessage}\n </Text>\n </Box>\n\n <Box className=\"flex-[0.2]\">\n <Text color={colors.gray[500]}>{displayDate}</Text>\n </Box>\n </HStack>\n );\n};\n\nexport const DialogItemComponent: React.FC<IDialogItemProps> = function DialogItem({ currentUser, channel, onOpen }) {\n const isMountedRef = useRef(true);\n const [title, setTitle] = useState('');\n const [subscriptionsTimestamp, setSubscriptionsTimestamp] = useState(Date.now());\n\n const isServiceChannel = channel?.type === RoomType.Service;\n\n // Use channel.lastMessage instead of computing it\n const lastMessage = channel?.lastMessage;\n\n // Service channel specific calculations\n const creatorAndMembersId = useMemo(() => {\n if (!isServiceChannel || !channel?.members) return null;\n const membersIds: any =\n channel?.members\n ?.filter((m: any) => m !== null && m?.user?.id !== currentUser?.id)\n ?.map((mu: any) => mu?.user?.id) ?? [];\n const creatorId: any = channel?.creator?.id;\n const mergedIds: any = [].concat(membersIds, creatorId) ?? [];\n return mergedIds?.filter((m: any, pos: any) => mergedIds?.indexOf(m) === pos) ?? [];\n }, [isServiceChannel, channel, currentUser]);\n\n const postParentId = useMemo(() => {\n if (!isServiceChannel || !creatorAndMembersId?.length) return null;\n return creatorAndMembersId?.length && creatorAndMembersId?.includes(currentUser?.id)\n ? null\n : lastMessage?.parentId\n ? lastMessage?.parentId\n : lastMessage?.id ?? 0;\n }, [isServiceChannel, creatorAndMembersId, lastMessage, currentUser]);\n\n // Channel members computation for direct channels\n const channelMembers = useMemo(() => {\n if (isServiceChannel) return [];\n return (\n channel?.members\n ?.filter((ch: any) => ch?.user?.id !== currentUser?.id && ch?.user?.__typename === 'UserAccount')\n ?.map((m: any) => m?.user) ?? []\n );\n }, [isServiceChannel, currentUser?.id, channel?.members]);\n\n // Set title when channel members change (for direct channels)\n useEffect(() => {\n if (!isServiceChannel && channelMembers.length > 0 && isMountedRef.current) {\n const titleString =\n channelMembers\n ?.map((u: any) => `${u?.givenName || ''} ${u?.familyName || ''}`.trim())\n ?.filter(Boolean)\n ?.join(', ') || '';\n setTitle(titleString);\n } else if (isServiceChannel && channel?.title) {\n setTitle(channel.title);\n }\n }, [isServiceChannel, channelMembers, channel?.title]);\n\n // Compute display title\n const displayTitle = useMemo(() => {\n const length = 30;\n const titleToUse = isServiceChannel ? channel?.title || '' : title;\n return titleToUse.length > length ? titleToUse.substring(0, length - 3) + '...' : titleToUse;\n }, [isServiceChannel, channel?.title, title]);\n\n // Set mounted state on mount/unmount\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Focus effect handling\n useFocusEffect(\n useCallback(() => {\n if (!channel?.id) return;\n\n console.log(`DialogItem focused for ${isServiceChannel ? 'service' : 'direct'} channel:`, channel?.id);\n\n if (isServiceChannel) {\n setSubscriptionsTimestamp(Date.now());\n }\n }, [channel?.id, isServiceChannel]),\n );\n\n // Handle press based on channel type\n const handlePress = useCallback(() => {\n if (isServiceChannel) {\n onOpen(channel?.id, displayTitle, postParentId);\n } else {\n onOpen(channel?.id, displayTitle);\n }\n }, [isServiceChannel, channel?.id, displayTitle, postParentId, onOpen]);\n\n // Render avatar based on channel type\n const renderAvatar = () => {\n if (isServiceChannel) {\n return (\n <Avatar\n key={'service-channels-key-' + channel?.id}\n size={'sm'}\n className=\"bg-transparent top-0 right-0 z-[1]\"\n >\n <AvatarFallbackText>{startCase(channel?.creator?.username?.charAt(0))}</AvatarFallbackText>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: channel?.creator?.picture,\n }}\n />\n </Avatar>\n );\n }\n\n return (\n <AvatarGroup>\n {channelMembers &&\n channelMembers?.length > 0 &&\n channelMembers?.slice(0, 1)?.map((ch: any, i: number) => (\n <Avatar\n key={'dialogs-list-' + i}\n size={'sm'}\n className={`bg-transparent top-[${i === 1 ? '4' : '0'}] right-[${\n i === 1 ? '-2' : '0'\n }] z-[${i === 1 ? 5 : 1}]`}\n >\n <AvatarFallbackText>{startCase(ch?.username?.charAt(0))}</AvatarFallbackText>\n {channelMembers?.length > 1 && (\n <AvatarBadge\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: '#e5e7eb',\n borderRadius: 5,\n }}\n className=\"items-center justify-center bg-gray-200 rounded-md\"\n >\n <Text style={{ fontSize: 12, fontWeight: 'bold', color: '#000' }}>\n {channelMembers?.length}\n </Text>\n </AvatarBadge>\n )}\n {channelMembers?.length === 1 && (\n <>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: ch?.picture,\n }}\n />\n <AvatarBadge style={{ width: 10, height: 10 }} />\n </>\n )}\n </Avatar>\n ))}\n </AvatarGroup>\n );\n };\n\n return (\n <Pressable\n onPress={handlePress}\n className=\"flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700\"\n style={{\n borderBottomWidth: 1,\n borderColor: '#e5e7eb',\n marginVertical: 0,\n paddingHorizontal: isServiceChannel ? 2 : 10,\n }}\n >\n <HStack space={'md'} className=\"flex-1 w-[100%] py-3 items-center\">\n <Box className=\"flex-[0.1] items-start pl-3\">{renderAvatar()}</Box>\n <Box className=\"flex-1\">\n <LastMessageComponent\n key={\n isServiceChannel\n ? `service-channel-${channel?.id}-${subscriptionsTimestamp}`\n : `last-msg-${lastMessage?.id || 'none'}-${channelMembers.length}`\n }\n title={displayTitle}\n lastMessage={lastMessage}\n isServiceChannel={isServiceChannel}\n />\n </Box>\n </HStack>\n </Pressable>\n );\n};\n\nexport const DialogItem = React.memo(DialogItemComponent);\n"],"names":["React","DialogItem","_a","_b"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GiftedChatInboxComponent.js","sources":["../../../../src/screens/inbox/components/GiftedChatInboxComponent.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from 'react';\nimport { Platform, View, KeyboardAvoidingView, TouchableOpacity, TextInput, ScrollView, Animated } from 'react-native';\nimport { Spinner, Box, Image, HStack, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GiftedChat, Send } from 'react-native-gifted-chat';\nimport { Ionicons, MaterialCommunityIcons, MaterialIcons } from '@expo/vector-icons';\nimport colors from 'tailwindcss/colors';\n// If you have a SlackMessage component, import it:\n// import SlackMessage from './SlackMessage';\n\nexport interface GiftedChatInboxComponentProps {\n messages: any[];\n onSend: (messages: any[]) => void;\n text: string;\n onInputTextChanged: (text: string) => void;\n user: any;\n images: any[];\n onSelectImages: () => void;\n onRemoveImage: (index: number) => void;\n selectedImage: string;\n setSelectedImage: (img: string) => void;\n isUploadingImage: boolean;\n loading: boolean;\n errorMessage: string;\n notificationType?: string;\n onCloseError?: () => void;\n inputToolbarHeight?: number;\n bottomMargin?: number;\n renderMessageText?: any;\n renderActions?: any;\n renderAccessory?: any;\n renderMessage?: any;\n renderInputToolbar?: any;\n renderChatFooter?: any;\n renderLoadEarlier?: any;\n loadEarlier?: boolean;\n isLoadingEarlier?: boolean;\n totalCount?: number;\n channelMessagesLength?: number;\n keyboardVerticalOffset?: number;\n placeholder?: string;\n listViewProps?: any;\n wrapInSafeArea?: boolean;\n minComposerHeight?: number;\n maxComposerHeight?: number;\n renderFooter?: any;\n lightboxProps?: any;\n infiniteScroll?: boolean;\n alwaysShowSend?: boolean;\n minInputToolbarHeight?: number;\n textInputProps?: any;\n messagesContainerStyle?: any;\n renderHeader?: any;\n [key: string]: any;\n}\n\n// Helper to get the current ref if it's an object\nfunction getRefCurrent(ref: React.ForwardedRef<any>) {\n if (ref && typeof ref === 'object' && 'current' in ref) {\n return ref.current;\n }\n return null;\n}\n\nexport const GiftedChatInboxComponent = forwardRef<any, GiftedChatInboxComponentProps>((props, ref) => {\n const {\n messages,\n onSend,\n text,\n onInputTextChanged,\n user,\n images,\n setImages,\n onSelectImages,\n onRemoveImage,\n selectedImage,\n setSelectedImage,\n isUploadingImage,\n loading,\n errorMessage,\n notificationType = 'error',\n onCloseError,\n inputToolbarHeight = 56,\n bottomMargin = 0,\n renderMessageText,\n renderActions,\n renderAccessory,\n renderMessage,\n renderInputToolbar,\n renderChatFooter,\n renderLoadEarlier,\n loadEarlier,\n isLoadingEarlier,\n keyboardVerticalOffset = Platform.OS === 'ios' ? 64 : 0,\n placeholder = 'Jot something down',\n listViewProps,\n wrapInSafeArea = true,\n minComposerHeight = 36,\n maxComposerHeight = 100,\n renderFooter,\n lightboxProps = {\n underlayColor: 'transparent',\n springConfig: { tension: 90000, friction: 90000 },\n disabled: true,\n },\n infiniteScroll = false,\n alwaysShowSend = true,\n minInputToolbarHeight = 30,\n textInputProps = {\n multiline: true,\n returnKeyType: 'default',\n enablesReturnKeyAutomatically: true,\n placeholderTextColor: colors.gray[400],\n },\n messagesContainerStyle = { paddingTop: 8 },\n renderHeader,\n ...rest\n } = props;\n\n // Error Notification\n const renderErrorNotification = () => {\n if (!errorMessage) return null;\n return (\n <Animated.View\n style={{\n position: 'absolute',\n top: 10,\n left: 10,\n right: 10,\n backgroundColor: notificationType === 'error' ? '#f44336' : '#ff9800',\n padding: 15,\n borderRadius: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 3.84,\n elevation: 5,\n zIndex: 1000,\n }}\n >\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n <View>\n <Text style={{ color: 'white', fontWeight: 'bold' }}>\n {notificationType === 'error' ? 'Error' : 'Warning'}\n </Text>\n </View>\n <View>\n <TouchableOpacity onPress={onCloseError}>\n <Ionicons name=\"close\" size={20} color=\"white\" />\n </TouchableOpacity>\n </View>\n </View>\n <Text style={{ color: 'white', marginTop: 5 }}>{errorMessage}</Text>\n </Animated.View>\n );\n };\n\n const renderInputToolbarDefault = useCallback(\n (props) => (\n <View style={{ backgroundColor: '#fff', paddingBottom: 4, paddingTop: 4 }}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: 44,\n maxHeight: 56,\n backgroundColor: '#fff',\n borderRadius: 22,\n marginHorizontal: 8,\n paddingHorizontal: 8,\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n }}\n >\n <TouchableOpacity\n onPress={onSelectImages}\n style={{\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 8,\n }}\n >\n <MaterialIcons name=\"add\" size={24} color=\"#888\" />\n </TouchableOpacity>\n <TextInput\n ref={ref}\n style={{\n flex: 1,\n //minHeight: 36,\n maxHeight: 44,\n backgroundColor: 'transparent',\n color: '#444',\n paddingHorizontal: 8,\n paddingVertical: 0,\n alignSelf: 'center',\n textAlignVertical: 'center',\n }}\n placeholder={placeholder || 'Jot something down'}\n placeholderTextColor={colors.gray[400]}\n multiline\n value={text}\n onChangeText={onInputTextChanged}\n />\n <TouchableOpacity\n onPress={() => onSend([{ text: text }])}\n // disabled={(!messageText.trim() && images.length === 0) || isUploadingImage || loading}\n disabled={false}\n style={{\n marginLeft: 8,\n // opacity: (!messageText.trim() && images.length === 0) || isUploadingImage || loading ? 0.5 : 1,\n opacity: !text.trim() && images.length === 0 ? 0.5 : 1,\n }}\n >\n <MaterialCommunityIcons\n name=\"send-circle\"\n size={32}\n color={!text.trim() && images.length === 0 ? colors.gray[400] : colors.blue[500]}\n // color={\n // (!messageText.trim() && images.length === 0) || isUploadingImage || loading\n // ? colors.gray[400]\n // : colors.blue[500]\n // }\n />\n </TouchableOpacity>\n </View>\n {/* Selected Images Row */}\n {images && images.length > 0 && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={{ marginTop: 4, marginLeft: 8 }}\n >\n {images.map((img, index) => (\n <View\n key={`image-preview-${index}`}\n style={{\n width: 48,\n height: 48,\n marginRight: 8,\n borderRadius: 6,\n overflow: 'hidden',\n position: 'relative',\n backgroundColor: colors.gray[200],\n }}\n >\n <Image\n source={{ uri: img.uri || img.url }}\n style={{ width: '100%', height: '100%' }}\n alt={`selected image ${index + 1}`}\n />\n <TouchableOpacity\n onPress={() => {\n onRemoveImage(index);\n }}\n style={{\n position: 'absolute',\n top: 2,\n right: 2,\n backgroundColor: 'rgba(0,0,0,0.6)',\n borderRadius: 10,\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Ionicons name=\"close\" size={14} color=\"white\" />\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n )}\n </View>\n ),\n [onSelectImages, text, images, isUploadingImage, loading, onSend, onRemoveImage, placeholder, ref],\n );\n\n const renderAccessoryDefault = useCallback(() => {\n if (!images.length) return null;\n return (\n <Box style={{ position: 'relative', height: 70, backgroundColor: 'transparent', justifyContent: 'center' }}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={{\n flexDirection: 'row',\n paddingLeft: 15,\n paddingRight: 5,\n }}\n contentContainerStyle={{\n alignItems: 'center',\n height: '100%',\n }}\n >\n {images.map((img, index) => (\n <View\n key={`image-preview-${index}`}\n style={{\n width: 40,\n height: 40,\n marginRight: 15,\n borderRadius: 4,\n backgroundColor: colors.gray[200],\n overflow: 'hidden',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n position: 'relative',\n zIndex: 10,\n }}\n >\n <Image\n source={{ uri: img.uri || img.url }}\n style={{ width: '100%', height: '100%' }}\n alt={`selected image ${index + 1}`}\n />\n {/* Cross button at top right */}\n <TouchableOpacity\n onPress={() => {\n const newImages = [...images];\n newImages.splice(index, 1);\n setImages(newImages);\n if (newImages.length === 0) {\n setSelectedImage('');\n const inputRef = getRefCurrent(ref);\n if (inputRef && typeof inputRef.focus === 'function') {\n inputRef.focus();\n }\n }\n }}\n style={{\n position: 'absolute',\n top: -1,\n right: -1,\n backgroundColor: 'rgba(0,0,0,0.6)',\n borderRadius: 12,\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n }}\n >\n <Ionicons name=\"close\" size={16} color=\"white\" />\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n </Box>\n );\n }, [images, setImages, setSelectedImage, ref]);\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, justifyContent: 'flex-end', backgroundColor: '#fff' }}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={keyboardVerticalOffset}\n >\n <View\n style={{\n flex: 1,\n backgroundColor: '#fff',\n position: 'relative',\n marginBottom: bottomMargin,\n }}\n >\n {renderErrorNotification()}\n {loading && <Spinner color={colors.blue[500]} />}\n <GiftedChat\n ref={ref}\n wrapInSafeArea={wrapInSafeArea}\n messages={messages}\n onSend={onSend}\n text={text}\n onInputTextChanged={onInputTextChanged}\n user={user}\n renderMessageText={renderMessageText}\n renderActions={renderActions || null}\n renderAccessory={renderAccessory || renderAccessoryDefault}\n renderMessage={renderMessage}\n renderInputToolbar={renderInputToolbar || renderInputToolbarDefault}\n renderLoading={props.renderLoading || null}\n renderChatFooter={renderChatFooter}\n renderLoadEarlier={renderLoadEarlier}\n listViewProps={listViewProps}\n loadEarlier={loadEarlier}\n isLoadingEarlier={isLoadingEarlier}\n bottomOffset={props.bottomOffset || 0}\n isKeyboardInternallyHandled={props.isKeyboardInternallyHandled || false}\n renderFooter={() => (renderFooter ? renderFooter() : null)}\n minComposerHeight={minComposerHeight}\n maxComposerHeight={maxComposerHeight}\n placeholder={placeholder || 'Jot something down'}\n lightboxProps={lightboxProps}\n infiniteScroll={infiniteScroll}\n alwaysShowSend={alwaysShowSend}\n minInputToolbarHeight={minInputToolbarHeight}\n textInputProps={textInputProps}\n messagesContainerStyle={messagesContainerStyle}\n isTyping={props.isTyping || false}\n renderChatEmpty={props.renderChatEmpty || null}\n {...rest}\n />\n </View>\n </KeyboardAvoidingView>\n );\n});\n\nexport default GiftedChatInboxComponent;\n"],"names":["React","props"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GiftedChatInboxComponent.js","sources":["../../../../src/screens/inbox/components/GiftedChatInboxComponent.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from 'react';\nimport { Platform, View, KeyboardAvoidingView, TouchableOpacity, TextInput, ScrollView, Animated } from 'react-native';\nimport { Spinner, Box, Image, HStack, Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GiftedChat, Send } from 'react-native-gifted-chat';\nimport { Ionicons, MaterialCommunityIcons, MaterialIcons } from '@expo/vector-icons';\nimport colors from 'tailwindcss/colors';\n// If you have a SlackMessage component, import it:\n// import SlackMessage from './SlackMessage';\n\nexport interface GiftedChatInboxComponentProps {\n messages: any[];\n onSend: (messages: any[]) => void;\n text: string;\n onInputTextChanged: (text: string) => void;\n user: any;\n images: any[];\n onSelectImages: () => void;\n onRemoveImage: (index: number) => void;\n selectedImage: string;\n setSelectedImage: (img: string) => void;\n isUploadingImage: boolean;\n loading: boolean;\n errorMessage: string;\n notificationType?: string;\n onCloseError?: () => void;\n inputToolbarHeight?: number;\n bottomMargin?: number;\n renderMessageText?: any;\n renderActions?: any;\n renderAccessory?: any;\n renderMessage?: any;\n renderInputToolbar?: any;\n renderChatFooter?: any;\n renderLoadEarlier?: any;\n loadEarlier?: boolean;\n isLoadingEarlier?: boolean;\n totalCount?: number;\n channelMessagesLength?: number;\n keyboardVerticalOffset?: number;\n placeholder?: string;\n listViewProps?: any;\n wrapInSafeArea?: boolean;\n minComposerHeight?: number;\n maxComposerHeight?: number;\n renderFooter?: any;\n lightboxProps?: any;\n infiniteScroll?: boolean;\n alwaysShowSend?: boolean;\n minInputToolbarHeight?: number;\n textInputProps?: any;\n messagesContainerStyle?: any;\n renderHeader?: any;\n [key: string]: any;\n}\n\n// Helper to get the current ref if it's an object\nfunction getRefCurrent(ref: React.ForwardedRef<any>) {\n if (ref && typeof ref === 'object' && 'current' in ref) {\n return ref.current;\n }\n return null;\n}\n\nexport const GiftedChatInboxComponent = forwardRef<any, GiftedChatInboxComponentProps>((props, ref) => {\n const {\n messages,\n onSend,\n text,\n onInputTextChanged,\n user,\n images,\n setImages,\n onSelectImages,\n onRemoveImage,\n selectedImage,\n setSelectedImage,\n isUploadingImage,\n loading,\n errorMessage,\n notificationType = 'error',\n onCloseError,\n inputToolbarHeight = 56,\n bottomMargin = 0,\n renderMessageText,\n renderActions,\n renderAccessory,\n renderMessage,\n renderInputToolbar,\n renderChatFooter,\n renderLoadEarlier,\n loadEarlier,\n isLoadingEarlier,\n keyboardVerticalOffset = Platform.OS === 'ios' ? 64 : 0,\n placeholder = 'Jot something down',\n listViewProps,\n wrapInSafeArea = true,\n minComposerHeight = 36,\n maxComposerHeight = 100,\n renderFooter,\n lightboxProps = {\n underlayColor: 'transparent',\n springConfig: { tension: 90000, friction: 90000 },\n disabled: true,\n },\n infiniteScroll = false,\n alwaysShowSend = true,\n minInputToolbarHeight = 30,\n textInputProps = {\n multiline: true,\n returnKeyType: 'default',\n enablesReturnKeyAutomatically: true,\n placeholderTextColor: colors.gray[400],\n },\n messagesContainerStyle = { paddingTop: 8 },\n renderHeader,\n ...rest\n } = props;\n\n // Error Notification\n const renderErrorNotification = () => {\n if (!errorMessage) return null;\n return (\n <Animated.View\n style={{\n position: 'absolute',\n top: 10,\n left: 10,\n right: 10,\n backgroundColor: notificationType === 'error' ? '#f44336' : '#ff9800',\n padding: 15,\n borderRadius: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 3.84,\n elevation: 5,\n zIndex: 1000,\n }}\n >\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n <View>\n <Text style={{ color: 'white', fontWeight: 'bold' }}>\n {notificationType === 'error' ? 'Error' : 'Warning'}\n </Text>\n </View>\n <View>\n <TouchableOpacity onPress={onCloseError}>\n <Ionicons name=\"close\" size={20} color=\"white\" />\n </TouchableOpacity>\n </View>\n </View>\n <Text style={{ color: 'white', marginTop: 5 }}>{errorMessage}</Text>\n </Animated.View>\n );\n };\n\n const renderInputToolbarDefault = useCallback(\n (props) => (\n <View style={{ backgroundColor: '#fff', paddingBottom: 4, paddingTop: 4 }}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: 44,\n maxHeight: 56,\n backgroundColor: '#fff',\n borderRadius: 22,\n marginHorizontal: 8,\n paddingHorizontal: 8,\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n }}\n >\n <TouchableOpacity\n onPress={onSelectImages}\n style={{\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 8,\n }}\n >\n <MaterialIcons name=\"add\" size={24} color=\"#888\" />\n </TouchableOpacity>\n <TextInput\n ref={ref}\n style={{\n flex: 1,\n //minHeight: 36,\n maxHeight: 44,\n backgroundColor: 'transparent',\n color: '#444',\n paddingHorizontal: 8,\n paddingVertical: 0,\n alignSelf: 'center',\n textAlignVertical: 'center',\n }}\n placeholder={placeholder || 'Jot something down'}\n placeholderTextColor={colors.gray[400]}\n multiline\n value={text}\n onChangeText={onInputTextChanged}\n />\n <TouchableOpacity\n onPress={() => onSend([{ text: text }])}\n // disabled={(!messageText.trim() && images.length === 0) || isUploadingImage || loading}\n disabled={false}\n style={{\n marginLeft: 8,\n // opacity: (!messageText.trim() && images.length === 0) || isUploadingImage || loading ? 0.5 : 1,\n opacity: !text.trim() && images.length === 0 ? 0.5 : 1,\n }}\n >\n <MaterialCommunityIcons\n name=\"send-circle\"\n size={32}\n color={!text.trim() && images.length === 0 ? colors.gray[400] : colors.blue[500]}\n // color={\n // (!messageText.trim() && images.length === 0) || isUploadingImage || loading\n // ? colors.gray[400]\n // : colors.blue[500]\n // }\n />\n </TouchableOpacity>\n </View>\n {/* Selected Images Row */}\n {images && images.length > 0 && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={{ marginTop: 4, marginLeft: 8 }}\n >\n {images.map((img, index) => (\n <View\n key={`image-preview-${index}`}\n style={{\n width: 48,\n height: 48,\n marginRight: 8,\n borderRadius: 6,\n overflow: 'hidden',\n position: 'relative',\n backgroundColor: colors.gray[200],\n }}\n >\n <Image\n source={{ uri: img.uri || img.url }}\n style={{ width: '100%', height: '100%' }}\n alt={`selected image ${index + 1}`}\n />\n <TouchableOpacity\n onPress={() => {\n onRemoveImage(index);\n }}\n style={{\n position: 'absolute',\n top: 2,\n right: 2,\n backgroundColor: 'rgba(0,0,0,0.6)',\n borderRadius: 10,\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Ionicons name=\"close\" size={14} color=\"white\" />\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n )}\n </View>\n ),\n [onSelectImages, text, images, isUploadingImage, loading, onSend, onRemoveImage, placeholder, ref],\n );\n\n const renderAccessoryDefault = useCallback(() => {\n if (!images.length) return null;\n return (\n <Box style={{ position: 'relative', height: 70, backgroundColor: 'transparent', justifyContent: 'center' }}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={{\n flexDirection: 'row',\n paddingLeft: 15,\n paddingRight: 5,\n }}\n contentContainerStyle={{\n alignItems: 'center',\n height: '100%',\n }}\n >\n {images.map((img, index) => (\n <View\n key={`image-preview-${index}`}\n style={{\n width: 40,\n height: 40,\n marginRight: 15,\n borderRadius: 4,\n backgroundColor: colors.gray[200],\n overflow: 'hidden',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n position: 'relative',\n zIndex: 10,\n }}\n >\n <Image\n source={{ uri: img.uri || img.url }}\n style={{ width: '100%', height: '100%' }}\n alt={`selected image ${index + 1}`}\n />\n {/* Cross button at top right */}\n <TouchableOpacity\n onPress={() => {\n const newImages = [...images];\n newImages.splice(index, 1);\n setImages(newImages);\n if (newImages.length === 0) {\n setSelectedImage('');\n const inputRef = getRefCurrent(ref);\n if (inputRef && typeof inputRef.focus === 'function') {\n inputRef.focus();\n }\n }\n }}\n style={{\n position: 'absolute',\n top: -1,\n right: -1,\n backgroundColor: 'rgba(0,0,0,0.6)',\n borderRadius: 12,\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n }}\n >\n <Ionicons name=\"close\" size={16} color=\"white\" />\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n </Box>\n );\n }, [images, setImages, setSelectedImage, ref]);\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, justifyContent: 'flex-end', backgroundColor: '#fff' }}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={keyboardVerticalOffset}\n >\n <View\n style={{\n flex: 1,\n backgroundColor: '#fff',\n position: 'relative',\n marginBottom: bottomMargin,\n }}\n >\n {renderErrorNotification()}\n {loading && <Spinner color={colors.blue[500]} />}\n <GiftedChat\n ref={ref}\n wrapInSafeArea={wrapInSafeArea}\n messages={messages}\n onSend={onSend}\n text={text}\n onInputTextChanged={onInputTextChanged}\n user={user}\n renderMessageText={renderMessageText}\n renderActions={renderActions || null}\n renderAccessory={renderAccessory || renderAccessoryDefault}\n renderMessage={renderMessage}\n renderInputToolbar={renderInputToolbar || renderInputToolbarDefault}\n renderLoading={props.renderLoading || null}\n renderChatFooter={renderChatFooter}\n renderLoadEarlier={renderLoadEarlier}\n listViewProps={listViewProps}\n loadEarlier={loadEarlier}\n isLoadingEarlier={isLoadingEarlier}\n bottomOffset={props.bottomOffset || 0}\n isKeyboardInternallyHandled={props.isKeyboardInternallyHandled || false}\n renderFooter={() => (renderFooter ? renderFooter() : null)}\n minComposerHeight={minComposerHeight}\n maxComposerHeight={maxComposerHeight}\n placeholder={placeholder || 'Jot something down'}\n lightboxProps={lightboxProps}\n infiniteScroll={infiniteScroll}\n alwaysShowSend={alwaysShowSend}\n minInputToolbarHeight={minInputToolbarHeight}\n textInputProps={textInputProps}\n messagesContainerStyle={messagesContainerStyle}\n isTyping={props.isTyping || false}\n renderChatEmpty={props.renderChatEmpty || null}\n {...rest}\n />\n </View>\n </KeyboardAvoidingView>\n );\n});\n\nexport default GiftedChatInboxComponent;\n"],"names":["React","props"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageViewerModal.js","sources":["../../../../../src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport {Alert, Modal, StyleSheet, Text, Pressable, View,SafeAreaView,StatusBar} from 'react-native';\n\nconst ImageViewerModal = ({children,isVisible=false,setVisible,modalContent=null}:any) => {\n \n return (\n <Modal\n animationType=\"slide\"\n // transparent={true}\n visible={isVisible}\n presentationStyle={'fullScreen'}\n style={{flex:1}}\n onRequestClose={() => {\n setVisible(false);\n }}>\n <View style={styles.container}> \n <View style={styles.headerView}>\n {/* <View><Text></Text></View>\n <View><Text></Text></View> */}\n <View style={{alignSelf:'flex-end',paddingRight:5}} > \n <Pressable\n style={[styles.button, styles.buttonClose]}\n onPress={() => setVisible(false)}>\n <Text style={styles.headerTextStyle}>X</Text>\n </Pressable></View>\n </View>\n <View style={styles.centeredView}>\n {modalContent ? modalContent : children}\n </View>\n <View style={styles.footerView}>\n\n </View>\n </View>\n </Modal>\n );\n};\n\nconst styles = StyleSheet.create({\n container:{\n flex:1,\n },\n headerView:{\n width:'100%',\n alignItems: 'center',\n justifyContent:'space-between',\n // backgroundColor:'rgba(r, g, b, a)',\n backgroundColor:'#000',\n paddingTop:50,\n paddingBottom:10,\n },\n centeredView: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'white',\n\n borderRadius: 20,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n footerView:{\n minHeight:100,\n backgroundColor:'#000'\n },\n modalView: {\n flex:1,\n backgroundColor: 'white',\n borderRadius: 20,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n button: {\n borderRadius: 20,\n padding: 10,\n elevation: 2,\n },\n buttonOpen: {\n backgroundColor: '#F194FF',\n },\n buttonClose: {\n backgroundColor: 'transparent',\n },\n textStyle: {\n color: 'white',\n fontWeight: 'bold',\n textAlign: 'center',\n },\n headerTextStyle:{\n color: '#fff',\n // fontWeight: 'bold',\n textAlign: 'center',\n fontSize:20,\n },\n modalText: {\n marginBottom: 15,\n textAlign: 'center',\n },\n});\n\nexport default ImageViewerModal;"],"names":["React"],"mappings":"kGAEA,MAAM,mBAAmB,CAAC;AAAA,EACxB,QAAA;AAAA,EACA,
|
|
1
|
+
{"version":3,"file":"ImageViewerModal.js","sources":["../../../../../src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport {Alert, Modal, StyleSheet, Text, Pressable, View,SafeAreaView,StatusBar} from 'react-native';\n\nconst ImageViewerModal = ({children,isVisible=false,setVisible,modalContent=null}:any) => {\n \n return (\n <Modal\n animationType=\"slide\"\n // transparent={true}\n visible={isVisible}\n presentationStyle={'fullScreen'}\n style={{flex:1}}\n onRequestClose={() => {\n setVisible(false);\n }}>\n <View style={styles.container}> \n <View style={styles.headerView}>\n {/* <View><Text></Text></View>\n <View><Text></Text></View> */}\n <View style={{alignSelf:'flex-end',paddingRight:5}} > \n <Pressable\n style={[styles.button, styles.buttonClose]}\n onPress={() => setVisible(false)}>\n <Text style={styles.headerTextStyle}>X</Text>\n </Pressable></View>\n </View>\n <View style={styles.centeredView}>\n {modalContent ? modalContent : children}\n </View>\n <View style={styles.footerView}>\n\n </View>\n </View>\n </Modal>\n );\n};\n\nconst styles = StyleSheet.create({\n container:{\n flex:1,\n },\n headerView:{\n width:'100%',\n alignItems: 'center',\n justifyContent:'space-between',\n // backgroundColor:'rgba(r, g, b, a)',\n backgroundColor:'#000',\n paddingTop:50,\n paddingBottom:10,\n },\n centeredView: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'white',\n\n borderRadius: 20,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n footerView:{\n minHeight:100,\n backgroundColor:'#000'\n },\n modalView: {\n flex:1,\n backgroundColor: 'white',\n borderRadius: 20,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n button: {\n borderRadius: 20,\n padding: 10,\n elevation: 2,\n },\n buttonOpen: {\n backgroundColor: '#F194FF',\n },\n buttonClose: {\n backgroundColor: 'transparent',\n },\n textStyle: {\n color: 'white',\n fontWeight: 'bold',\n textAlign: 'center',\n },\n headerTextStyle:{\n color: '#fff',\n // fontWeight: 'bold',\n textAlign: 'center',\n fontSize:20,\n },\n modalText: {\n marginBottom: 15,\n textAlign: 'center',\n },\n});\n\nexport default ImageViewerModal;"],"names":["React"],"mappings":"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"}
|