@messenger-box/slack-ui-browser 10.0.3-alpha.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +21 -0
  3. package/lib/components/Home/Channels.js +62 -0
  4. package/lib/components/Home/Channels.js.map +1 -0
  5. package/lib/components/Home/DirectChannels.js +92 -0
  6. package/lib/components/Home/DirectChannels.js.map +1 -0
  7. package/lib/components/Home/InviteMembers.js +70 -0
  8. package/lib/components/Home/InviteMembers.js.map +1 -0
  9. package/lib/components/Home/Teams.js +62 -0
  10. package/lib/components/Home/Teams.js.map +1 -0
  11. package/lib/components/Home/TopCommonSlider.js +35 -0
  12. package/lib/components/Home/TopCommonSlider.js.map +1 -0
  13. package/lib/compute.js +223 -0
  14. package/lib/compute.js.map +1 -0
  15. package/lib/constants/routes.js +63 -0
  16. package/lib/constants/routes.js.map +1 -0
  17. package/lib/hooks/useOptimizedChannelsQueries.js +107 -0
  18. package/lib/hooks/useOptimizedChannelsQueries.js.map +1 -0
  19. package/lib/hooks/useRouteState.js +193 -0
  20. package/lib/hooks/useRouteState.js.map +1 -0
  21. package/lib/index.js +1 -0
  22. package/lib/index.js.map +1 -0
  23. package/lib/machines/routeMachine.js +804 -0
  24. package/lib/machines/routeMachine.js.map +1 -0
  25. package/lib/module.js +3 -0
  26. package/lib/module.js.map +1 -0
  27. package/lib/queries/slackuiQueries.js +144 -0
  28. package/lib/queries/slackuiQueries.js.map +1 -0
  29. package/lib/routes.json +260 -0
  30. package/lib/screens/Home/HomeScreen.js +664 -0
  31. package/lib/screens/Home/HomeScreen.js.map +1 -0
  32. package/lib/screens/Home/index.js +1 -0
  33. package/lib/screens/Home/index.js.map +1 -0
  34. package/package.json +52 -0
  35. package/rollup.config.mjs +41 -0
  36. package/src/components/Home/Channels.tsx +135 -0
  37. package/src/components/Home/DirectChannels.tsx +185 -0
  38. package/src/components/Home/InviteMembers.tsx +134 -0
  39. package/src/components/Home/Teams.tsx +129 -0
  40. package/src/components/Home/TopCommonSlider.tsx +70 -0
  41. package/src/components/Home/index.ts +5 -0
  42. package/src/components/index.ts +1 -0
  43. package/src/compute.ts +156 -0
  44. package/src/constants/index.ts +1 -0
  45. package/src/constants/routes.ts +92 -0
  46. package/src/hooks/index.ts +3 -0
  47. package/src/hooks/useOptimizedChannelsQueries.ts +165 -0
  48. package/src/hooks/useRouteState.ts +253 -0
  49. package/src/icons.ts +137 -0
  50. package/src/index.ts +11 -0
  51. package/src/machines/index.ts +9 -0
  52. package/src/machines/routeMachine.ts +682 -0
  53. package/src/module.tsx +6 -0
  54. package/src/queries/index.ts +1 -0
  55. package/src/queries/slackuiQueries.ts +227 -0
  56. package/src/screens/Home/HomeScreen.tsx +1308 -0
  57. package/src/screens/Home/index.ts +4 -0
  58. package/src/screens/NewChannel/NewChannelScreen.tsx +188 -0
  59. package/src/screens/NewChannel/index.ts +2 -0
  60. package/src/screens/index.ts +1 -0
  61. package/tsconfig.json +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { createContext, useMemo, useState, useCallback, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { useLocation, useNavigate, useParams, Outlet } from '@remix-run/react';\nimport { RoomType, ApplicationRoles } from 'common';\nimport { \n FiEdit, FiHash, FiLock, FiUser, FiX, FiMessageSquare, \n FiUsers, FiUserPlus, FiMail, FiShare2, FiBell, FiBookmark, FiSearch,\n FiAlertCircle, FiCheck\n} from '../../icons';\nimport { FiFile } from '@react-icons/all-files/fi/FiFile.js';\nimport { TopCommonSlider, Teams, Channels, DirectChannels, InviteMembers } from '../../components/Home';\nimport { useOptimizedChannelsQueries } from '../../hooks/useOptimizedChannelsQueries';\nimport { useRouteState } from '../../hooks/useRouteState';\nimport { slackUiRoutePaths, SLACK_UI_ROUTES } from '../../constants/routes';\nimport { RouteState } from '../../machines/routeMachine';\nimport { \n useAddChannelMutation, \n useAddDirectChannelMutation, \n useCreateTeamMutation,\n useSendOrganizationInvitationMutation,\n useGetOrganizationMembersQuery,\n useOrganizationSharableLinkQuery,\n useGetOrganizationDetailQuery,\n} from '../../queries/slackuiQueries';\n\n// Create a context to control refetching across child components\nexport const RefetchContext = createContext({\n shouldRefetch: false,\n setRefetchStatus: (status: boolean) => {},\n});\n\n// Create a context to share optimized channel data across child components\nexport const ChannelsDataContext = createContext<{\n channelsData: any[];\n directChannelsData: any[];\n loading: boolean;\n error: any;\n refetchChannels: () => void;\n hasChannels: boolean;\n hasDirectChannels: boolean;\n}>({\n channelsData: [],\n directChannelsData: [],\n loading: false,\n error: null,\n refetchChannels: () => {},\n hasChannels: false,\n hasDirectChannels: false,\n});\n\nconst HomeScreen: React.FC = () => {\n const currentUser: any = useSelector(userSelector);\n const location = useLocation();\n const navigate = useNavigate();\n const [shouldRefetch, setShouldRefetch] = useState(false);\n const orgSlug = location.pathname.split('/')[2];\n\n // Use optimized channels queries hook\n const {\n channelsData,\n directChannelsData,\n loading,\n error,\n refetchChannels,\n hasChannels,\n hasDirectChannels,\n } = useOptimizedChannelsQueries({\n orgName: orgSlug,\n enabled: !!orgSlug,\n });\n\n // Memoize the refetch context value\n const refetchContextValue = useMemo(\n () => ({\n shouldRefetch,\n setRefetchStatus: setShouldRefetch,\n }),\n [shouldRefetch],\n );\n\n // Memoize the channels data context value\n const channelsDataContextValue = useMemo(\n () => ({\n channelsData,\n directChannelsData,\n loading,\n error,\n refetchChannels,\n hasChannels,\n hasDirectChannels,\n }),\n [channelsData, directChannelsData, loading, error, refetchChannels, hasChannels, hasDirectChannels],\n );\n\n // Refetch on mount\n useEffect(() => {\n if (orgSlug) {\n refetchChannels();\n }\n }, [orgSlug]);\n\n // Navigate to new message/channel creation\n const handleNewMessage = useCallback(() => {\n navigate(slackUiRoutePaths.messageNew(orgSlug));\n }, [navigate, orgSlug]);\n\n // Loading state\n if (!currentUser) {\n return (\n <div className=\"flex items-center justify-center h-full bg-white\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-blue-500\"></div>\n </div>\n );\n }\n\n if (!orgSlug) {\n return (\n <div className=\"flex items-center justify-center h-full bg-white\">\n <p className=\"text-gray-500\">No Organization found</p>\n </div>\n );\n }\n\n return (\n <RefetchContext.Provider value={refetchContextValue}>\n <ChannelsDataContext.Provider value={channelsDataContextValue}>\n <div className=\"flex h-full bg-white\">\n {/* Left Sidebar - Channels List */}\n <div className=\"w-72 flex-shrink-0 border-r border-gray-200 flex flex-col h-full overflow-hidden\">\n {/* Sidebar Header */}\n <div className=\"p-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900 truncate\">\n {orgSlug}\n </h2>\n </div>\n \n {/* Scrollable Sidebar Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Top Common Slider */}\n <TopCommonSlider />\n \n <hr className=\"border-gray-200 my-2\" />\n \n {/* Teams Section */}\n <Teams \n teams={[]}\n loading={false}\n error={null}\n onRefetch={() => {}}\n />\n \n <hr className=\"border-gray-200 my-2\" />\n \n {/* Channels Section */}\n <Channels \n channels={channelsData}\n loading={loading}\n error={error}\n onRefetch={refetchChannels}\n currentUser={currentUser}\n />\n \n <hr className=\"border-gray-200 my-2\" />\n \n {/* Direct Messages Section */}\n <DirectChannels \n directChannels={directChannelsData}\n loading={loading}\n error={error}\n onRefetch={refetchChannels}\n currentUser={currentUser}\n />\n \n <hr className=\"border-gray-200 my-2\" />\n \n {/* Invite Members Section */}\n <InviteMembers \n organizationName={orgSlug}\n />\n </div>\n\n {/* Floating Action Button in Sidebar */}\n <div className=\"p-4 border-t border-gray-200\">\n <button\n onClick={handleNewMessage}\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors\"\n >\n <FiEdit className=\"w-4 h-4\" />\n <span>New Message</span>\n </button>\n </div>\n </div>\n\n {/* Right Panel - Message/Content Area */}\n <div className=\"flex-1 flex flex-col h-full overflow-hidden\">\n <MessagePanel \n orgSlug={orgSlug}\n currentUser={currentUser}\n channelsData={channelsData}\n directChannelsData={directChannelsData}\n />\n </div>\n </div>\n </ChannelsDataContext.Provider>\n </RefetchContext.Provider>\n );\n};\n\n// Message Panel Component - handles route-based content\ninterface MessagePanelProps {\n orgSlug: string;\n currentUser: any;\n channelsData: any[];\n directChannelsData: any[];\n}\n\nconst MessagePanel: React.FC<MessagePanelProps> = ({ orgSlug, currentUser, channelsData, directChannelsData }) => {\n // Use XState-based route state management\n const routeState = useRouteState(orgSlug);\n \n const {\n currentState,\n channelName,\n teamName,\n isHome,\n isChannelView,\n isChannelNew,\n isMessageView,\n isMessageNew,\n isTeamView,\n isTeamNew,\n isThreads,\n isActivity,\n isDrafts,\n isSaved,\n isFiles,\n isSearch,\n isInvite,\n isInviteContacts,\n isInviteEmail,\n isInviteLink,\n navigateToHome,\n navigateToChannel,\n navigateToChannelNew,\n navigateToMessage,\n navigateToMessageNew,\n } = routeState;\n\n // Find the selected channel/dm\n const selectedChannel = useMemo(() => {\n if (isChannelView && channelName) {\n return channelsData.find((ch: any) => ch.title === channelName || ch.name === channelName);\n }\n if (isMessageView && channelName) {\n return directChannelsData.find((dm: any) => \n dm.title === channelName || \n dm.name === channelName ||\n dm.displayName?.includes(channelName)\n );\n }\n return null;\n }, [isChannelView, isMessageView, channelName, channelsData, directChannelsData]);\n\n // New Channel Screen\n if (isChannelNew) {\n return (\n <NewChannelPanel \n orgSlug={orgSlug} \n onClose={navigateToHome} \n />\n );\n }\n\n // New Message Screen\n if (isMessageNew) {\n return (\n <NewMessagePanel \n orgSlug={orgSlug} \n currentUser={currentUser}\n onClose={navigateToHome} \n />\n );\n }\n\n // New Team Screen\n if (isTeamNew) {\n return (\n <GenericPanel \n title=\"Create a Team\"\n icon={<FiUsers className=\"w-12 h-12 text-blue-600\" />}\n description=\"Teams help organize groups of people working together\"\n orgSlug={orgSlug}\n onClose={navigateToHome}\n >\n <NewTeamForm orgSlug={orgSlug} onClose={navigateToHome} />\n </GenericPanel>\n );\n }\n\n // Team view\n if (isTeamView && teamName) {\n return (\n <GenericPanel \n title={`Team: ${teamName}`}\n icon={<FiUsers className=\"w-12 h-12 text-blue-600\" />}\n description=\"Team details and members\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Threads view\n if (isThreads) {\n return (\n <GenericPanel \n title=\"Threads\"\n icon={<FiMessageSquare className=\"w-12 h-12 text-blue-600\" />}\n description=\"Your thread replies will appear here\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Invite Contacts view\n if (isInviteContacts) {\n return (\n <GenericPanel \n title=\"Invite from Contacts\"\n icon={<FiUserPlus className=\"w-12 h-12 text-blue-600\" />}\n description=\"Select contacts to invite to your workspace\"\n orgSlug={orgSlug}\n onClose={() => routeState.navigateToInvite()}\n >\n <InviteContactsForm orgSlug={orgSlug} />\n </GenericPanel>\n );\n }\n\n // Invite Email view\n if (isInviteEmail) {\n return (\n <GenericPanel \n title=\"Invite by Email\"\n icon={<FiMail className=\"w-12 h-12 text-blue-600\" />}\n description=\"Send email invitations to join your workspace\"\n orgSlug={orgSlug}\n onClose={() => routeState.navigateToInvite()}\n >\n <InviteEmailForm orgSlug={orgSlug} />\n </GenericPanel>\n );\n }\n\n // Invite Link view\n if (isInviteLink) {\n return (\n <GenericPanel \n title=\"Invite Link\"\n icon={<FiShare2 className=\"w-12 h-12 text-blue-600\" />}\n description=\"Share this link to invite people to your workspace\"\n orgSlug={orgSlug}\n onClose={() => routeState.navigateToInvite()}\n >\n <InviteLinkForm orgSlug={orgSlug} />\n </GenericPanel>\n );\n }\n\n // Invite view (main)\n if (isInvite) {\n return (\n <InvitePanel orgSlug={orgSlug} routeState={routeState} />\n );\n }\n\n // Activity view\n if (isActivity) {\n return (\n <GenericPanel \n title=\"Activity\"\n icon={<FiBell className=\"w-12 h-12 text-blue-600\" />}\n description=\"Your recent activity and notifications\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Drafts view\n if (isDrafts) {\n return (\n <GenericPanel \n title=\"Drafts\"\n icon={<FiEdit className=\"w-12 h-12 text-blue-600\" />}\n description=\"Your unsent message drafts\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Saved view\n if (isSaved) {\n return (\n <GenericPanel \n title=\"Saved Items\"\n icon={<FiBookmark className=\"w-12 h-12 text-blue-600\" />}\n description=\"Messages and files you've saved for later\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Files view\n if (isFiles) {\n return (\n <GenericPanel \n title=\"Files\"\n icon={<FiFile className=\"w-12 h-12 text-blue-600\" />}\n description=\"Files shared in your workspace\"\n orgSlug={orgSlug}\n />\n );\n }\n\n // Search view\n if (isSearch) {\n return (\n <GenericPanel \n title=\"Search\"\n icon={<FiSearch className=\"w-12 h-12 text-blue-600\" />}\n description=\"Search messages, files, and channels\"\n orgSlug={orgSlug}\n >\n <SearchForm orgSlug={orgSlug} />\n </GenericPanel>\n );\n }\n\n // Channel or DM selected - show messaging view\n if (selectedChannel) {\n return (\n <ChannelMessagingView \n channel={selectedChannel}\n currentUser={currentUser}\n isDirectMessage={isMessageView}\n />\n );\n }\n\n // Default - Welcome screen\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-gray-500 p-8\">\n <div className=\"w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mb-6\">\n <FiMessageSquare className=\"w-12 h-12 text-blue-600\" />\n </div>\n <h3 className=\"text-xl font-semibold text-gray-900 mb-2\">Welcome to {orgSlug}</h3>\n <p className=\"text-center text-gray-600 mb-6 max-w-md\">\n Select a channel or direct message from the sidebar to start chatting, \n or create a new conversation.\n </p>\n <div className=\"flex gap-3\">\n <button\n onClick={navigateToChannelNew}\n className=\"flex items-center gap-2 px-4 py-2 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <FiHash className=\"w-4 h-4\" />\n <span>Create Channel</span>\n </button>\n <button\n onClick={navigateToMessageNew}\n className=\"flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n <FiEdit className=\"w-4 h-4\" />\n <span>New Message</span>\n </button>\n </div>\n </div>\n );\n};\n\n// New Channel Panel\ninterface NewChannelPanelProps {\n orgSlug: string;\n onClose: () => void;\n onSuccess?: () => void;\n}\n\nconst NewChannelPanel: React.FC<NewChannelPanelProps> = ({ orgSlug, onClose, onSuccess }) => {\n const [channelName, setChannelName] = useState('');\n const [description, setDescription] = useState('');\n const [isPrivate, setIsPrivate] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const navigate = useNavigate();\n\n const [createChannel, { loading: isLoading }] = useAddChannelMutation({\n onCompleted: (data: any) => {\n if (data?.createChannel) {\n const createdChannel = data.createChannel;\n // Navigate to the new channel\n navigate(slackUiRoutePaths.channel(orgSlug, createdChannel.title || createdChannel.name));\n onSuccess?.();\n }\n },\n onError: (err: any) => {\n console.error('Error creating channel:', err);\n setError(err.message || 'Failed to create channel. Please try again.');\n },\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!channelName.trim()) return;\n \n setError(null);\n \n createChannel({\n variables: {\n name: channelName.toLowerCase().replace(/\\s+/g, '-'),\n description: description || undefined,\n type: isPrivate ? RoomType.Private : RoomType.Public,\n },\n });\n };\n\n return (\n <div className=\"flex-1 flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">Create a Channel</h2>\n <button onClick={onClose} className=\"p-2 hover:bg-gray-100 rounded-full\">\n <FiX className=\"w-5 h-5 text-gray-500\" />\n </button>\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"flex-1 overflow-y-auto p-6 space-y-6\">\n {/* Channel Type */}\n <div className=\"space-y-3\">\n <label className=\"block text-sm font-medium text-gray-700\">Channel Type</label>\n <div className=\"flex gap-4\">\n <button\n type=\"button\"\n onClick={() => setIsPrivate(false)}\n className={`flex-1 flex items-center gap-3 p-4 rounded-lg border-2 transition-colors ${\n !isPrivate ? 'border-blue-500 bg-blue-50' : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <FiHash className={`w-5 h-5 ${!isPrivate ? 'text-blue-600' : 'text-gray-400'}`} />\n <div className=\"text-left\">\n <div className={`font-medium ${!isPrivate ? 'text-blue-700' : 'text-gray-700'}`}>Public</div>\n <div className=\"text-xs text-gray-500\">Anyone can join</div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => setIsPrivate(true)}\n className={`flex-1 flex items-center gap-3 p-4 rounded-lg border-2 transition-colors ${\n isPrivate ? 'border-blue-500 bg-blue-50' : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <FiLock className={`w-5 h-5 ${isPrivate ? 'text-blue-600' : 'text-gray-400'}`} />\n <div className=\"text-left\">\n <div className={`font-medium ${isPrivate ? 'text-blue-700' : 'text-gray-700'}`}>Private</div>\n <div className=\"text-xs text-gray-500\">Invite only</div>\n </div>\n </button>\n </div>\n </div>\n\n {/* Channel Name */}\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700\">Name</label>\n <div className=\"relative\">\n <span className=\"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\">\n {isPrivate ? <FiLock className=\"w-4 h-4\" /> : <FiHash className=\"w-4 h-4\" />}\n </span>\n <input\n type=\"text\"\n value={channelName}\n onChange={(e) => setChannelName(e.target.value.toLowerCase().replace(/\\s+/g, '-'))}\n placeholder=\"e.g. marketing\"\n className=\"w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {/* Description */}\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700\">\n Description <span className=\"text-gray-400\">(optional)</span>\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What's this channel about?\"\n rows={3}\n className=\"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\"\n />\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"flex items-center gap-2 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700\">\n <FiAlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span className=\"text-sm\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={!channelName.trim() || isLoading}\n className=\"w-full py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isLoading ? 'Creating...' : 'Create Channel'}\n </button>\n </form>\n </div>\n );\n};\n\n// New Message Panel\ninterface NewMessagePanelProps {\n orgSlug: string;\n currentUser: any;\n onClose: () => void;\n onSuccess?: () => void;\n}\n\nconst NewMessagePanel: React.FC<NewMessagePanelProps> = ({ orgSlug, currentUser, onClose, onSuccess }) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedUsers, setSelectedUsers] = useState<any[]>([]);\n const [error, setError] = useState<string | null>(null);\n const navigate = useNavigate();\n\n // Fetch organization members for user search\n const { data: membersData, loading: membersLoading } = useGetOrganizationMembersQuery({\n variables: { orgName: orgSlug },\n skip: !orgSlug,\n });\n\n const [createDirectChannel, { loading: isLoading }] = useAddDirectChannelMutation({\n onCompleted: (data: any) => {\n if (data?.createDirectChannel) {\n const channel = data.createDirectChannel;\n // Navigate to the direct message\n navigate(slackUiRoutePaths.message(orgSlug, channel.title || channel.name || channel.id));\n onSuccess?.();\n }\n },\n onError: (err: any) => {\n console.error('Error creating direct channel:', err);\n setError(err.message || 'Failed to start conversation. Please try again.');\n },\n });\n\n // Filter members based on search query\n const filteredMembers = useMemo(() => {\n if (!membersData?.getOrganizationMembers?.data) return [];\n const members = membersData.getOrganizationMembers.data;\n \n // Filter out current user and already selected users\n const availableMembers = members.filter((member: any) => \n member.id !== currentUser?.id && \n !selectedUsers.some(u => u.id === member.id)\n );\n\n if (!searchQuery.trim()) return availableMembers;\n \n const query = searchQuery.toLowerCase();\n return availableMembers.filter((member: any) => \n member.username?.toLowerCase().includes(query) ||\n member.email?.toLowerCase().includes(query) ||\n member.name?.toLowerCase().includes(query)\n );\n }, [membersData, searchQuery, selectedUsers, currentUser]);\n\n const handleSelectUser = (user: any) => {\n setSelectedUsers([...selectedUsers, user]);\n setSearchQuery('');\n };\n\n const handleStartConversation = () => {\n if (selectedUsers.length === 0) return;\n \n setError(null);\n \n // Get receiver IDs\n const receiverIds = selectedUsers.map(u => u.id);\n \n // Create display name from usernames\n const displayName = selectedUsers.length === 1 \n ? selectedUsers[0].username \n : selectedUsers.map(u => u.username).join(', ');\n\n createDirectChannel({\n variables: {\n receiver: receiverIds,\n displayName: displayName,\n channelOptions: { schemeAdmin: false },\n },\n });\n };\n\n return (\n <div className=\"flex-1 flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">New Message</h2>\n <button onClick={onClose} className=\"p-2 hover:bg-gray-100 rounded-full\">\n <FiX className=\"w-5 h-5 text-gray-500\" />\n </button>\n </div>\n\n {/* To Field */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-gray-500\">To:</span>\n <div className=\"flex-1 flex flex-wrap gap-2\">\n {selectedUsers.map((user, idx) => (\n <span key={idx} className=\"inline-flex items-center gap-1 px-2 py-1 bg-blue-100 text-blue-700 rounded-full text-sm\">\n {user.username || user.email}\n <button onClick={() => setSelectedUsers(selectedUsers.filter((_, i) => i !== idx))}>\n <FiX className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search for people...\"\n className=\"flex-1 min-w-[200px] outline-none\"\n />\n </div>\n </div>\n </div>\n\n {/* User Search Results */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {membersLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-blue-500\"></div>\n </div>\n ) : filteredMembers.length > 0 ? (\n <div className=\"space-y-2\">\n {filteredMembers.map((member: any) => (\n <button\n key={member.id}\n onClick={() => handleSelectUser(member)}\n className=\"w-full flex items-center gap-3 p-3 rounded-lg hover:bg-gray-100 transition-colors text-left\"\n >\n <div className=\"w-10 h-10 bg-gray-300 rounded-full flex items-center justify-center\">\n <FiUser className=\"w-5 h-5 text-gray-600\" />\n </div>\n <div>\n <div className=\"font-medium text-gray-900\">{member.username || member.name}</div>\n {member.email && (\n <div className=\"text-sm text-gray-500\">{member.email}</div>\n )}\n </div>\n </button>\n ))}\n </div>\n ) : searchQuery ? (\n <div className=\"text-center text-gray-500 py-8\">\n <FiUser className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" />\n <p>No members found matching \"{searchQuery}\"</p>\n </div>\n ) : (\n <div className=\"text-center text-gray-500 py-8\">\n <FiUser className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" />\n <p>Search for people to start a conversation</p>\n </div>\n )}\n \n {/* Error Message */}\n {error && (\n <div className=\"mt-4 flex items-center gap-2 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700\">\n <FiAlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span className=\"text-sm\">{error}</span>\n </div>\n )}\n </div>\n\n {/* Start Button */}\n {selectedUsers.length > 0 && (\n <div className=\"p-4 border-t border-gray-200\">\n <button\n onClick={handleStartConversation}\n disabled={isLoading}\n className={`w-full py-3 rounded-lg font-medium transition-colors ${\n isLoading \n ? 'bg-gray-400 text-gray-200 cursor-not-allowed' \n : 'bg-blue-600 text-white hover:bg-blue-700'\n }`}\n >\n {isLoading ? 'Creating...' : 'Start Conversation'}\n </button>\n </div>\n )}\n </div>\n );\n};\n\n// Generic Panel Component - reusable panel with header\ninterface GenericPanelProps {\n title: string;\n icon: React.ReactNode;\n description: string;\n orgSlug: string;\n onClose?: () => void;\n children?: React.ReactNode;\n}\n\nconst GenericPanel: React.FC<GenericPanelProps> = ({ title, icon, description, orgSlug, onClose, children }) => {\n return (\n <div className=\"flex-1 flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">{title}</h2>\n {onClose && (\n <button onClick={onClose} className=\"p-2 hover:bg-gray-100 rounded-full\">\n <FiX className=\"w-5 h-5 text-gray-500\" />\n </button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {children ? (\n children\n ) : (\n <div className=\"flex flex-col items-center justify-center h-full text-center\">\n <div className=\"w-24 h-24 bg-blue-100 rounded-full flex items-center justify-center mb-6\">\n {icon}\n </div>\n <h3 className=\"text-xl font-semibold text-gray-900 mb-2\">{title}</h3>\n <p className=\"text-gray-600 max-w-md\">{description}</p>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// Invite Panel Component\ninterface InvitePanelProps {\n orgSlug: string;\n routeState: ReturnType<typeof useRouteState>;\n}\n\nconst InvitePanel: React.FC<InvitePanelProps> = ({ orgSlug, routeState }) => {\n return (\n <div className=\"flex-1 flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">Invite People</h2>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"max-w-md mx-auto space-y-4\">\n <p className=\"text-gray-600 text-center mb-6\">\n Choose how you'd like to invite people to {orgSlug}\n </p>\n \n <button\n onClick={() => routeState.navigateToInviteContacts()}\n className=\"w-full flex items-center gap-4 p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div className=\"w-10 h-10 bg-blue-100 rounded-full flex items-center justify-center\">\n <FiUserPlus className=\"w-5 h-5 text-blue-600\" />\n </div>\n <div className=\"text-left\">\n <div className=\"font-medium text-gray-900\">From Contacts</div>\n <div className=\"text-sm text-gray-500\">Invite from your contact list</div>\n </div>\n </button>\n \n <button\n onClick={() => routeState.navigateToInviteEmail()}\n className=\"w-full flex items-center gap-4 p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div className=\"w-10 h-10 bg-green-100 rounded-full flex items-center justify-center\">\n <FiMail className=\"w-5 h-5 text-green-600\" />\n </div>\n <div className=\"text-left\">\n <div className=\"font-medium text-gray-900\">By Email</div>\n <div className=\"text-sm text-gray-500\">Send email invitations</div>\n </div>\n </button>\n \n <button\n onClick={() => routeState.navigateToInviteLink()}\n className=\"w-full flex items-center gap-4 p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div className=\"w-10 h-10 bg-purple-100 rounded-full flex items-center justify-center\">\n <FiShare2 className=\"w-5 h-5 text-purple-600\" />\n </div>\n <div className=\"text-left\">\n <div className=\"font-medium text-gray-900\">Share Link</div>\n <div className=\"text-sm text-gray-500\">Copy and share an invite link</div>\n </div>\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n// New Team Form Component\ninterface NewTeamFormProps {\n orgSlug: string;\n onClose: () => void;\n}\n\nconst NewTeamForm: React.FC<NewTeamFormProps> = ({ orgSlug, onClose }) => {\n const [teamName, setTeamName] = useState('');\n const [description, setDescription] = useState('');\n const [formError, setFormError] = useState<string | null>(null);\n const navigate = useNavigate();\n\n const [createTeam, { loading, error }] = useCreateTeamMutation({\n context: {\n headers: {\n orgname: orgSlug,\n },\n },\n onCompleted: (data) => {\n if (data?.createTeam) {\n const teamSlug = data.createTeam.name || teamName.toLowerCase().replace(/\\s+/g, '-');\n navigate(slackUiRoutePaths.team(orgSlug, teamSlug));\n }\n },\n onError: (err) => {\n console.error('Error creating team:', err);\n setFormError(err.message || 'Failed to create team. Please try again.');\n },\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!teamName.trim()) return;\n\n setFormError(null);\n createTeam({\n variables: {\n orgName: orgSlug,\n request: {\n name: teamName.trim().toLowerCase().replace(/\\s+/g, '-'),\n title: teamName.trim(),\n description: description.trim() || undefined,\n },\n },\n });\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700\">Team Name</label>\n <input\n type=\"text\"\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Engineering\"\n className=\"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n \n <div className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700\">\n Description <span className=\"text-gray-400\">(optional)</span>\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What's this team about?\"\n rows={3}\n className=\"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\"\n />\n </div>\n \n {/* Error Message */}\n {(formError || error) && (\n <div className=\"flex items-center gap-2 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700\">\n <FiAlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span className=\"text-sm\">{formError || error?.message || 'An error occurred'}</span>\n </div>\n )}\n \n <button\n type=\"submit\"\n disabled={!teamName.trim() || loading}\n className={`w-full py-3 rounded-lg font-medium transition-colors ${\n loading \n ? 'bg-gray-400 text-gray-200 cursor-not-allowed' \n : 'bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed'\n }`}\n >\n {loading ? 'Creating...' : 'Create Team'}\n </button>\n </form>\n );\n};\n\n// Invite Contacts Form Component\ninterface InviteContactsFormProps {\n orgSlug: string;\n}\n\nconst InviteContactsForm: React.FC<InviteContactsFormProps> = ({ orgSlug }) => {\n const [searchQuery, setSearchQuery] = useState('');\n \n return (\n <div className=\"space-y-4\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search contacts...\"\n className=\"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <div className=\"text-center text-gray-500 py-8\">\n <FiUsers className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" />\n <p>Search for contacts to invite</p>\n </div>\n </div>\n );\n};\n\n// Invite Email Form Component\ninterface InviteEmailFormProps {\n orgSlug: string;\n}\n\nconst InviteEmailForm: React.FC<InviteEmailFormProps> = ({ orgSlug }) => {\n const [email, setEmail] = useState('');\n const [emails, setEmails] = useState<string[]>([]);\n const [formError, setFormError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n // Fetch org details to get the org ID\n const { data: orgData } = useGetOrganizationDetailQuery({\n variables: { where: { name: orgSlug } },\n skip: !orgSlug,\n });\n const orgId = orgData?.getOrganizationDetail?.id;\n\n const [sendInvitation, { loading, error }] = useSendOrganizationInvitationMutation({\n onCompleted: (data) => {\n if (data?.sendOrganizationInvitation) {\n setSuccessMessage(`Invitation${emails.length > 1 ? 's' : ''} sent successfully!`);\n setEmails([]);\n setEmail('');\n // Clear success message after 3 seconds\n setTimeout(() => setSuccessMessage(null), 3000);\n }\n },\n onError: (err) => {\n console.error('Error sending invitation:', err);\n setFormError(err.message || 'Failed to send invitation. Please try again.');\n },\n });\n\n const handleAddEmail = () => {\n const trimmedEmail = email.trim().toLowerCase();\n if (trimmedEmail && !emails.includes(trimmedEmail) && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmedEmail)) {\n setEmails([...emails, trimmedEmail]);\n setEmail('');\n setFormError(null);\n } else if (trimmedEmail && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmedEmail)) {\n setFormError('Please enter a valid email address');\n }\n };\n\n const handleSendInvitations = async () => {\n if (emails.length === 0) return;\n \n if (!orgId) {\n setFormError('Organization not found. Please try again.');\n return;\n }\n\n setFormError(null);\n setSuccessMessage(null);\n\n // Send invitations for each email\n for (const emailAddr of emails) {\n await sendInvitation({\n variables: {\n request: {\n email: emailAddr,\n orgId: orgId,\n orgName: orgSlug,\n role: ApplicationRoles.Member,\n },\n },\n });\n }\n };\n \n return (\n <div className=\"space-y-4\">\n <div className=\"flex gap-2\">\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Enter email address\"\n className=\"flex-1 px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n onKeyDown={(e) => e.key === 'Enter' && (e.preventDefault(), handleAddEmail())}\n />\n <button\n type=\"button\"\n onClick={handleAddEmail}\n className=\"px-4 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n Add\n </button>\n </div>\n \n {emails.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {emails.map((e, idx) => (\n <span key={idx} className=\"inline-flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-700 rounded-full text-sm\">\n {e}\n <button onClick={() => setEmails(emails.filter((_, i) => i !== idx))}>\n <FiX className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n\n {/* Error Message */}\n {(formError || error) && (\n <div className=\"flex items-center gap-2 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700\">\n <FiAlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span className=\"text-sm\">{formError || error?.message || 'An error occurred'}</span>\n </div>\n )}\n\n {/* Success Message */}\n {successMessage && (\n <div className=\"flex items-center gap-2 p-3 bg-green-50 border border-green-200 rounded-lg text-green-700\">\n <FiCheck className=\"w-5 h-5 flex-shrink-0\" />\n <span className=\"text-sm\">{successMessage}</span>\n </div>\n )}\n \n <button\n type=\"button\"\n onClick={handleSendInvitations}\n disabled={emails.length === 0 || loading}\n className={`w-full py-3 rounded-lg font-medium transition-colors ${\n loading \n ? 'bg-gray-400 text-gray-200 cursor-not-allowed' \n : 'bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed'\n }`}\n >\n {loading ? 'Sending...' : 'Send Invitations'}\n </button>\n </div>\n );\n};\n\n// Invite Link Form Component\ninterface InviteLinkFormProps {\n orgSlug: string;\n}\n\nconst InviteLinkForm: React.FC<InviteLinkFormProps> = ({ orgSlug }) => {\n const inviteLink = `${window.location.origin}/o/${orgSlug}/join`;\n const [copied, setCopied] = useState(false);\n \n const handleCopy = () => {\n navigator.clipboard.writeText(inviteLink);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n \n return (\n <div className=\"space-y-4\">\n <p className=\"text-gray-600 text-sm\">\n Share this link with anyone you'd like to invite to {orgSlug}\n </p>\n \n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={inviteLink}\n readOnly\n className=\"flex-1 px-4 py-3 border border-gray-300 rounded-lg bg-gray-50 text-gray-600\"\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"px-4 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n </div>\n </div>\n );\n};\n\n// Search Form Component\ninterface SearchFormProps {\n orgSlug: string;\n}\n\nconst SearchForm: React.FC<SearchFormProps> = ({ orgSlug }) => {\n const [searchQuery, setSearchQuery] = useState('');\n \n return (\n <div className=\"space-y-4\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search messages, files, and channels...\"\n className=\"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <div className=\"text-center text-gray-500 py-8\">\n <FiSearch className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" />\n <p>Enter a search term to find messages, files, and channels</p>\n </div>\n </div>\n );\n};\n\n// Channel Messaging View\ninterface ChannelMessagingViewProps {\n channel: any;\n currentUser: any;\n isDirectMessage: boolean;\n}\n\nconst ChannelMessagingView: React.FC<ChannelMessagingViewProps> = ({ channel, currentUser, isDirectMessage }) => {\n const [message, setMessage] = useState('');\n\n const handleSendMessage = (e: React.FormEvent) => {\n e.preventDefault();\n if (!message.trim()) return;\n // TODO: Call sendMessage mutation\n console.log('Sending message:', message);\n setMessage('');\n };\n\n const channelTitle = channel?.title || channel?.name || channel?.displayName || 'Channel';\n\n return (\n <div className=\"flex-1 flex flex-col h-full\">\n {/* Channel Header */}\n <div className=\"flex items-center px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center gap-3\">\n {isDirectMessage ? (\n <div className=\"w-8 h-8 bg-gray-300 rounded-full flex items-center justify-center\">\n <FiUser className=\"w-4 h-4 text-gray-600\" />\n </div>\n ) : (\n <span className=\"text-gray-400\">\n {channel?.type === 'PRIVATE' ? <FiLock className=\"w-5 h-5\" /> : <FiHash className=\"w-5 h-5\" />}\n </span>\n )}\n <div>\n <h2 className=\"font-semibold text-gray-900\">{channelTitle}</h2>\n {channel?.description && (\n <p className=\"text-sm text-gray-500 truncate\">{channel.description}</p>\n )}\n </div>\n </div>\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"text-center text-gray-500 py-8\">\n <p className=\"text-sm\">This is the start of your conversation in <strong>{channelTitle}</strong></p>\n </div>\n {/* Messages will be rendered here */}\n </div>\n\n {/* Message Input */}\n <form onSubmit={handleSendMessage} className=\"p-4 border-t border-gray-200\">\n <div className=\"flex items-center gap-3\">\n <input\n type=\"text\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder={`Message ${isDirectMessage ? '' : '#'}${channelTitle}`}\n className=\"flex-1 px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <button\n type=\"submit\"\n disabled={!message.trim()}\n className=\"px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Send\n </button>\n </div>\n </form>\n </div>\n );\n};\n\nexport default React.memo(HomeScreen);\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export{ChannelsDataContext,default as HomeScreen,RefetchContext,default}from'./HomeScreen.js';//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@messenger-box/slack-ui-browser",
3
+ "version": "10.0.3-alpha.176",
4
+ "description": "Slack ui ref browser package",
5
+ "license": "ISC",
6
+ "author": "CDMBase LLC",
7
+ "type": "module",
8
+ "main": "lib/index.js",
9
+ "module": "lib/index.js",
10
+ "typings": "lib/index.d.ts",
11
+ "scripts": {
12
+ "build": "npm run build:clean && npm run build:lib",
13
+ "build:clean": "rimraf lib",
14
+ "build:lib": "rollup -c rollup.config.mjs",
15
+ "build:lib:watch": "npm run build:lib -- --watch",
16
+ "jest": "./node_modules/.bin/jest",
17
+ "prepublish": "npm run build",
18
+ "test": "cross-env ENV_FILE=../../config/test/test.env jest",
19
+ "test:debug": "npm test -- --runInBand",
20
+ "test:watch": "npm test -- --watch",
21
+ "watch": "npm run build:lib:watch",
22
+ "watch-ts": "tsc --watch"
23
+ },
24
+ "dependencies": {
25
+ "@messenger-box/platform-browser": "10.0.3-alpha.176"
26
+ },
27
+ "peerDependencies": {
28
+ "@adminide-stack/core": "*",
29
+ "@adminide-stack/user-auth0-client": "*",
30
+ "@apollo/client": "*",
31
+ "@cdm-logger/client": "*",
32
+ "@common-stack/client-core": "*",
33
+ "@common-stack/client-react": "*",
34
+ "@common-stack/core": "*",
35
+ "@remix-run/react": "*",
36
+ "common": "10.0.3-alpha.172",
37
+ "i18next": "*",
38
+ "lodash-es": "*",
39
+ "react": "*",
40
+ "react-dom": "*",
41
+ "react-i18next": "*",
42
+ "react-icons": "*",
43
+ "react-redux": "*"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "typescript": {
49
+ "definition": "lib/index.d.ts"
50
+ },
51
+ "gitHead": "84a07ebd139b990117922b12e5295d86dd8d9ffe"
52
+ }
@@ -0,0 +1,41 @@
1
+ import { createRollupConfig } from '../../../rollup.config.base.mjs';
2
+ import resolve from '@rollup/plugin-node-resolve';
3
+
4
+ const additionalPlugins = [
5
+ resolve({
6
+ extensions: ['.js', '.json', '.jsx', '.ts', '.tsx'],
7
+ }),
8
+ ];
9
+
10
+ // Use the createRollupConfig function to merge the base and specific configurations
11
+ export default (commandLineArgs) => {
12
+ const isWatchMode = commandLineArgs.watch;
13
+ return [
14
+ createRollupConfig(
15
+ {
16
+ input: ['src/index.ts'],
17
+ plugins: [
18
+ ...additionalPlugins,
19
+ ],
20
+ output: [
21
+ {
22
+ dir: 'lib',
23
+ format: 'es',
24
+ name: 'slack-ui-browser',
25
+ compact: true,
26
+ exports: 'named',
27
+ sourcemap: true,
28
+ preserveModules: true,
29
+ chunkFileNames: '[name]-[hash].[format].js',
30
+ globals: { react: 'React' },
31
+ },
32
+ ],
33
+ },
34
+ {
35
+ isWatchMode,
36
+ generateRoutesJSON: true,
37
+ useEsbuild: true,
38
+ },
39
+ ),
40
+ ];
41
+ };
@@ -0,0 +1,135 @@
1
+ import React, { useState, useMemo, useCallback } from 'react';
2
+ import { Link, useLocation, useNavigate } from '@remix-run/react';
3
+ import { FiChevronDown, FiChevronRight, FiPlus, FiSearch, FiHash, FiRefreshCw } from '../../icons';
4
+ import { useTranslation } from 'react-i18next';
5
+
6
+ interface ChannelsProps {
7
+ channels?: any[];
8
+ loading?: boolean;
9
+ error?: any;
10
+ onRefetch?: () => void;
11
+ currentUser?: any;
12
+ }
13
+
14
+ export const Channels: React.FC<ChannelsProps> = ({
15
+ channels = [],
16
+ loading = false,
17
+ error = null,
18
+ onRefetch,
19
+ currentUser
20
+ }) => {
21
+ const { t } = useTranslation();
22
+ const location = useLocation();
23
+ const navigate = useNavigate();
24
+ const [isExpanded, setIsExpanded] = useState(true);
25
+ const orgSlug = location.pathname.split('/')[2];
26
+
27
+ // Filter to get only public/channel type (not direct messages)
28
+ const publicChannels = useMemo(() => {
29
+ return channels
30
+ .filter((channel: any) => channel.type !== 'DIRECT')
31
+ .slice(0, 10);
32
+ }, [channels]);
33
+
34
+ const handleRefetch = useCallback(() => {
35
+ onRefetch?.();
36
+ }, [onRefetch]);
37
+
38
+ const ListEmptyComponent = () => {
39
+ if (error) {
40
+ return (
41
+ <div className="p-3">
42
+ <div className="p-2 bg-red-50 rounded">
43
+ <p className="text-red-600 text-sm mb-2 font-medium">
44
+ Channel service is temporarily unavailable.
45
+ </p>
46
+ <button
47
+ onClick={handleRefetch}
48
+ className="flex items-center gap-1 text-blue-600 text-sm font-medium hover:underline"
49
+ >
50
+ <FiRefreshCw className="w-4 h-4" />
51
+ Retry
52
+ </button>
53
+ </div>
54
+ </div>
55
+ );
56
+ }
57
+
58
+ return (
59
+ <div className="flex flex-col items-center py-4 px-3">
60
+ <div className="p-3 mb-2 rounded-full bg-gray-100">
61
+ <FiHash className="w-5 h-5 text-gray-500" />
62
+ </div>
63
+ <p className="text-gray-500 text-sm text-center">No channels available</p>
64
+ </div>
65
+ );
66
+ };
67
+
68
+ return (
69
+ <div className="py-2">
70
+ {/* Section Header */}
71
+ <button
72
+ onClick={() => setIsExpanded(!isExpanded)}
73
+ className="w-full flex items-center justify-between px-4 py-2 hover:bg-gray-50"
74
+ >
75
+ <span className="font-semibold text-gray-900">
76
+ {t('messenger_box_browser.PUBLIC_CHANNELS', 'Channels')}
77
+ </span>
78
+ {isExpanded ? (
79
+ <FiChevronDown className="w-4 h-4 text-gray-600" />
80
+ ) : (
81
+ <FiChevronRight className="w-4 h-4 text-gray-600" />
82
+ )}
83
+ </button>
84
+
85
+ {/* Channels List */}
86
+ {isExpanded && (
87
+ <div className="mt-1">
88
+ {loading ? (
89
+ <div className="flex items-center justify-center py-4">
90
+ <div className="animate-spin rounded-full h-5 w-5 border-t-2 border-b-2 border-blue-500"></div>
91
+ </div>
92
+ ) : publicChannels.length > 0 ? (
93
+ <>
94
+ {publicChannels.map((channel: any) => (
95
+ <Link
96
+ key={channel.id}
97
+ to={`/o/${orgSlug}/home/channel/${channel.title}`}
98
+ state={{ channel, currentUser }}
99
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 transition-colors"
100
+ >
101
+ <span className="text-gray-500 text-base flex-shrink-0">#</span>
102
+ <span className="text-gray-900 text-sm truncate">{channel.title}</span>
103
+ </Link>
104
+ ))}
105
+
106
+ {/* Browse all channels */}
107
+ {channels.length > 10 && (
108
+ <button
109
+ onClick={() => navigate(`/o/${orgSlug}/home/channels`)}
110
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 text-gray-500"
111
+ >
112
+ <FiSearch className="w-4 h-4" />
113
+ <span className="text-sm">Browse all Channels</span>
114
+ </button>
115
+ )}
116
+ </>
117
+ ) : (
118
+ <ListEmptyComponent />
119
+ )}
120
+
121
+ {/* Add Channel */}
122
+ <button
123
+ onClick={() => navigate(`/o/${orgSlug}/home/channels/new`)}
124
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 text-gray-500"
125
+ >
126
+ <FiPlus className="w-4 h-4" />
127
+ <span className="text-sm">Add Channels</span>
128
+ </button>
129
+ </div>
130
+ )}
131
+ </div>
132
+ );
133
+ };
134
+
135
+ export default React.memo(Channels);
@@ -0,0 +1,185 @@
1
+ import React, { useState, useMemo, useCallback } from 'react';
2
+ import { Link, useLocation, useNavigate } from '@remix-run/react';
3
+ import { FiChevronDown, FiChevronRight, FiPlus, FiSearch, FiRefreshCw, FiUser } from '../../icons';
4
+ import { useTranslation } from 'react-i18next';
5
+
6
+ // Helper to get the other user's display name from a direct channel
7
+ const getDirectChannelDisplayName = (channel: any, currentUserId: string) => {
8
+ if (!channel.displayName) return channel.title || 'Direct Message';
9
+
10
+ const parts = channel.displayName.split('_');
11
+ if (parts.length === 2) {
12
+ const [first, second] = parts;
13
+ const firstParts = first.split('-');
14
+ const secondParts = second.split('-');
15
+
16
+ if (firstParts[0] !== currentUserId) {
17
+ return firstParts[1] || first;
18
+ }
19
+ return secondParts[1] || second;
20
+ }
21
+
22
+ return channel.displayName;
23
+ };
24
+
25
+ // Helper to get initials from a name
26
+ const getInitials = (name: string) => {
27
+ if (!name) return '?';
28
+ return name
29
+ .split(' ')
30
+ .map(n => n[0])
31
+ .join('')
32
+ .toUpperCase()
33
+ .slice(0, 2);
34
+ };
35
+
36
+ interface DirectChannelsProps {
37
+ directChannels?: any[];
38
+ loading?: boolean;
39
+ error?: any;
40
+ onRefetch?: () => void;
41
+ currentUser?: any;
42
+ }
43
+
44
+ export const DirectChannels: React.FC<DirectChannelsProps> = ({
45
+ directChannels = [],
46
+ loading = false,
47
+ error = null,
48
+ onRefetch,
49
+ currentUser
50
+ }) => {
51
+ const { t } = useTranslation();
52
+ const location = useLocation();
53
+ const navigate = useNavigate();
54
+ const [isExpanded, setIsExpanded] = useState(true);
55
+ const orgSlug = location.pathname.split('/')[2];
56
+
57
+ // Limit to 20 direct channels
58
+ const limitedDirectChannels = useMemo(() => {
59
+ return directChannels.slice(0, 20);
60
+ }, [directChannels]);
61
+
62
+ const handleNewDirectMessage = useCallback(() => {
63
+ navigate(`/o/${orgSlug}/home/messages/new`);
64
+ }, [navigate, orgSlug]);
65
+
66
+ const handleRefetch = useCallback(() => {
67
+ onRefetch?.();
68
+ }, [onRefetch]);
69
+
70
+ const getChannelRoute = useCallback((channel: any) => {
71
+ const displayName = getDirectChannelDisplayName(channel, currentUser?.id);
72
+ return `/o/${orgSlug}/home/message/${displayName}`;
73
+ }, [orgSlug, currentUser?.id]);
74
+
75
+ const ListEmptyComponent = () => {
76
+ if (error) {
77
+ return (
78
+ <div className="p-3">
79
+ <div className="p-2 bg-red-50 rounded">
80
+ <p className="text-red-600 text-sm mb-2 font-medium">
81
+ Unable to load direct messages.
82
+ </p>
83
+ <button
84
+ onClick={handleRefetch}
85
+ className="flex items-center gap-1 text-blue-600 text-sm font-medium hover:underline"
86
+ >
87
+ <FiRefreshCw className="w-4 h-4" />
88
+ Retry
89
+ </button>
90
+ </div>
91
+ </div>
92
+ );
93
+ }
94
+
95
+ return (
96
+ <div className="flex flex-col items-center py-4 px-3">
97
+ <div className="p-3 mb-2 rounded-full bg-gray-100">
98
+ <FiUser className="w-5 h-5 text-gray-500" />
99
+ </div>
100
+ <p className="text-gray-500 text-sm text-center">No direct messages yet</p>
101
+ </div>
102
+ );
103
+ };
104
+
105
+ return (
106
+ <div className="py-2">
107
+ {/* Section Header */}
108
+ <button
109
+ onClick={() => setIsExpanded(!isExpanded)}
110
+ className="w-full flex items-center justify-between px-4 py-2 hover:bg-gray-50"
111
+ >
112
+ <span className="font-semibold text-gray-900">
113
+ {t('messenger_box_browser.DIRECT_MESSAGES', 'Direct Messages')}
114
+ </span>
115
+ {isExpanded ? (
116
+ <FiChevronDown className="w-4 h-4 text-gray-600" />
117
+ ) : (
118
+ <FiChevronRight className="w-4 h-4 text-gray-600" />
119
+ )}
120
+ </button>
121
+
122
+ {/* Direct Channels List */}
123
+ {isExpanded && (
124
+ <div className="mt-1">
125
+ {loading ? (
126
+ <div className="flex items-center justify-center py-4">
127
+ <div className="animate-spin rounded-full h-5 w-5 border-t-2 border-b-2 border-blue-500"></div>
128
+ </div>
129
+ ) : limitedDirectChannels.length > 0 ? (
130
+ <>
131
+ {limitedDirectChannels.map((channel: any) => {
132
+ const displayName = getDirectChannelDisplayName(channel, currentUser?.id);
133
+ const memberCount = channel.displayName?.split(',').length || 1;
134
+
135
+ return (
136
+ <Link
137
+ key={channel.id}
138
+ to={getChannelRoute(channel)}
139
+ state={{ channel, currentUser }}
140
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 transition-colors"
141
+ >
142
+ {memberCount > 1 ? (
143
+ <span className="w-6 h-6 flex items-center justify-center bg-gray-200 rounded-full text-xs text-gray-700 flex-shrink-0">
144
+ {memberCount}
145
+ </span>
146
+ ) : (
147
+ <span className="w-6 h-6 flex items-center justify-center bg-blue-100 rounded-full text-xs text-blue-700 flex-shrink-0">
148
+ {getInitials(displayName)}
149
+ </span>
150
+ )}
151
+ <span className="text-gray-900 text-sm truncate">{displayName}</span>
152
+ </Link>
153
+ );
154
+ })}
155
+
156
+ {/* Browse all messages */}
157
+ {directChannels.length > 20 && (
158
+ <button
159
+ onClick={() => navigate(`/o/${orgSlug}/home/messages`)}
160
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 text-gray-500"
161
+ >
162
+ <FiSearch className="w-4 h-4" />
163
+ <span className="text-sm">Browse all Messages</span>
164
+ </button>
165
+ )}
166
+ </>
167
+ ) : (
168
+ <ListEmptyComponent />
169
+ )}
170
+
171
+ {/* New Direct Message */}
172
+ <button
173
+ onClick={handleNewDirectMessage}
174
+ className="w-full flex items-center gap-3 px-4 py-2 hover:bg-gray-50 text-gray-500"
175
+ >
176
+ <FiPlus className="w-4 h-4" />
177
+ <span className="text-sm">New Message</span>
178
+ </button>
179
+ </div>
180
+ )}
181
+ </div>
182
+ );
183
+ };
184
+
185
+ export default React.memo(DirectChannels);