Newer
Older
FanFarm / system / V3fanfarm-ubuntu-local / V3fanfarm-frontend / node_modules / .cache / babel-loader / 63059994107cd22178ecfce71a235021b92aa4680b00432a317269ba86d31808.json
@Fanfarm User Fanfarm User on 18 Dec 69 KB add all
{"ast":null,"code":"var _jsxFileName = \"/home/fanfarm/FanFarm/system/V3fanfarm-ubuntu-local/V3fanfarm-frontend/src/components/message/MessageBoard.js\",\n  _s = $RefreshSig$();\n// src/components/message/MessageBoard.js - タブ機能統合版\nimport React, { useState, useEffect, useContext, useRef, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { Messages, Applications } from '../../api/api';\nimport { AuthContext } from '../../context/AuthContext';\nimport Button from '../common/Button';\nimport Card from '../common/Card';\nimport MessageTabs from './MessageTabs';\nimport GroupChatComponent from './GroupChat';\nimport { jsxDEV as _jsxDEV, Fragment as _Fragment } from \"react/jsx-dev-runtime\";\nconst MessageBoardContainer = styled.div`\n  max-width: 800px;\n  margin: 40px auto;\n  padding: 0 24px;\n`;\n_c = MessageBoardContainer;\nconst Title = styled.h1`\n  text-align: center;\n  margin-bottom: 32px;\n  color: var(--primary-color);\n`;\n_c2 = Title;\nconst ConnectionStatus = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 8px 16px;\n  margin-bottom: 16px;\n  border-radius: var(--border-radius);\n  font-size: 14px;\n  background: ${props => props.$connected ? '#e8f5e8' : '#fff3cd'};\n  color: ${props => props.$connected ? '#155724' : '#856404'};\n  border: 1px solid ${props => props.$connected ? '#c3e6c3' : '#ffeaa7'};\n`;\n_c3 = ConnectionStatus;\nconst StatusIndicator = styled.span`\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: ${props => props.$connected ? '#28a745' : '#ffc107'};\n  margin-right: 8px;\n`;\n_c4 = StatusIndicator;\nconst JobInfoCard = styled(Card)`\n  margin-bottom: 24px;\n`;\n_c5 = JobInfoCard;\nconst JobTitle = styled.h2`\n  font-size: 24px;\n  margin-bottom: 16px;\n  color: var(--primary-color);\n`;\n_c6 = JobTitle;\nconst JobDetailItem = styled.p`\n  margin-bottom: 8px;\n  font-size: 16px;\n`;\n_c7 = JobDetailItem;\nconst JobLabel = styled.span`\n  font-weight: 700;\n  margin-right: 8px;\n`;\n_c8 = JobLabel;\nconst MessageContainer = styled(Card)`\n  min-height: 400px;\n  display: flex;\n  flex-direction: column;\n`;\n_c9 = MessageContainer;\nconst MessageList = styled.div`\n  flex-grow: 1;\n  overflow-y: auto;\n  margin-bottom: 24px;\n  max-height: 400px;\n  padding-right: 8px;\n\n  &::-webkit-scrollbar {\n    width: 6px;\n  }\n\n  &::-webkit-scrollbar-track {\n    background: var(--background-color);\n    border-radius: 4px;\n  }\n\n  &::-webkit-scrollbar-thumb {\n    background: var(--border-color);\n    border-radius: 4px;\n  }\n`;\n_c0 = MessageList;\nconst Message = styled.div`\n  margin-bottom: 16px;\n  display: flex;\n  flex-direction: column;\n  align-items: ${props => props.$sent ? 'flex-end' : 'flex-start'};\n`;\n_c1 = Message;\nconst MessageBubble = styled.div`\n  background-color: ${props => props.$sent ? 'var(--primary-color)' : 'var(--background-color)'};\n  color: ${props => props.$sent ? 'var(--white)' : 'var(--text-color)'};\n  padding: 12px 16px;\n  border-radius: 18px;\n  max-width: 70%;\n  word-break: break-word;\n  opacity: ${props => props.$sending ? 0.7 : 1};\n  position: relative;\n`;\n_c10 = MessageBubble;\nconst SendingIndicator = styled.div`\n  position: absolute;\n  top: -8px;\n  right: -8px;\n  width: 16px;\n  height: 16px;\n  border: 2px solid var(--primary-color);\n  border-top: 2px solid transparent;\n  border-radius: 50%;\n  animation: spin 1s linear infinite;\n\n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n`;\n_c11 = SendingIndicator;\nconst MessageInfo = styled.div`\n  font-size: 12px;\n  color: var(--text-light);\n  margin-top: 4px;\n`;\n_c12 = MessageInfo;\nconst MessageForm = styled.form`\n  display: flex;\n  gap: 16px;\n\n  @media (max-width: 768px) {\n    flex-direction: column;\n    gap: 8px;\n  }\n`;\n_c13 = MessageForm;\nconst MessageInput = styled.textarea`\n  flex-grow: 1;\n  padding: 12px 16px;\n  font-size: 16px;\n  border: 2px solid var(--border-color);\n  border-radius: var(--border-radius);\n  resize: none;\n  min-height: 80px;\n\n  &:focus {\n    outline: none;\n    border-color: var(--primary-color);\n  }\n\n  &:disabled {\n    background-color: var(--background-color);\n    cursor: not-allowed;\n  }\n`;\n_c14 = MessageInput;\nconst SendButton = styled(Button)`\n  align-self: flex-end;\n`;\n_c15 = SendButton;\nconst NoMessages = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--text-light);\n  margin: 48px 0;\n`;\n_c16 = NoMessages;\nconst Loading = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--text-light);\n  margin: 48px 0;\n`;\n_c17 = Loading;\nconst Error = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--error-color);\n  margin: 48px 0;\n`;\n_c18 = Error;\nconst BackButton = styled(Button)`\n  margin-top: 24px;\n`;\n_c19 = BackButton;\nconst ParticipantInfo = styled.div`\n  margin-top: 12px;\n  padding-top: 12px;\n  border-top: 1px solid var(--border-color);\n`;\n_c20 = ParticipantInfo;\nconst TabContentContainer = styled.div`\n  min-height: 500px;\n`;\n_c21 = TabContentContainer;\nconst MessageBoard = () => {\n  _s();\n  var _applicationDetails$a;\n  const {\n    id\n  } = useParams();\n  const [searchParams] = useSearchParams();\n  const {\n    currentUser\n  } = useContext(AuthContext);\n  const navigate = useNavigate();\n\n  // タブ状態(URLパラメータまたはデフォルト)\n  const initialTab = searchParams.get('tab') || 'group';\n  const [activeTab, setActiveTab] = useState(initialTab);\n  const [application, setApplication] = useState(null);\n  const [applicationDetails, setApplicationDetails] = useState(null);\n  const [messages, setMessages] = useState([]);\n  const [newMessage, setNewMessage] = useState('');\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState('');\n  const [isConnected, setIsConnected] = useState(false);\n  const [isReconnecting, setIsReconnecting] = useState(false);\n  const messageListRef = useRef(null);\n  const wsRef = useRef(null);\n  const reconnectTimeoutRef = useRef(null);\n  const pollingIntervalRef = useRef(null);\n\n  // メッセージ取得関数(useCallbackで安定化)\n  const fetchMessages = useCallback(async () => {\n    if (!id) return;\n    try {\n      const response = await Messages.getByApplication(id);\n      setMessages(response.data);\n    } catch (err) {\n      console.error('メッセージの更新に失敗しました', err);\n    }\n  }, [id]);\n\n  // ポーリング開始関数(useCallbackで安定化)\n  const startPolling = useCallback(() => {\n    console.log('ポーリングモード開始');\n    if (pollingIntervalRef.current) {\n      clearInterval(pollingIntervalRef.current);\n    }\n    pollingIntervalRef.current = setInterval(async () => {\n      try {\n        await fetchMessages();\n      } catch (err) {\n        console.error('ポーリング取得エラー:', err);\n      }\n    }, 3000);\n  }, [fetchMessages]);\n\n  // ポーリング停止関数\n  const stopPolling = useCallback(() => {\n    if (pollingIntervalRef.current) {\n      clearInterval(pollingIntervalRef.current);\n      pollingIntervalRef.current = null;\n    }\n  }, []);\n\n  // WebSocket接続関数\n  const connectWebSocket = useCallback(() => {\n    if (!id || !currentUser) return;\n    stopPolling();\n    try {\n      console.log('WebSocket接続試行中...');\n      const wsUrl = process.env.NODE_ENV === 'development' ? 'wss://' + window.location.host + '/nikko/ws' : `wss://${window.location.host}/nikko/ws`;\n      console.log('WebSocket URL:', wsUrl);\n      const ws = new WebSocket(wsUrl);\n      wsRef.current = ws;\n      ws.onopen = () => {\n        console.log('✅ WebSocket接続成功');\n        setIsConnected(true);\n        setIsReconnecting(false);\n        const joinMessage = {\n          type: 'join_room',\n          application_id: id,\n          user_id: currentUser.id\n        };\n        console.log('ルーム参加メッセージ送信:', joinMessage);\n        ws.send(JSON.stringify(joinMessage));\n      };\n      ws.onmessage = event => {\n        try {\n          console.log('📨 WebSocketメッセージ受信:', event.data);\n          const data = JSON.parse(event.data);\n          switch (data.type) {\n            case 'connection_confirmed':\n              console.log('✅ 接続確認受信');\n              break;\n            case 'room_joined':\n              console.log('✅ ルーム参加確認:', data.room);\n              break;\n            case 'message_sent':\n              console.log('✅ メッセージ送信確認受信:', data.message);\n              setMessages(prev => prev.map(msg => msg.tempId === data.tempId ? {\n                ...msg,\n                id: data.message.id,\n                sending: false,\n                created_at: data.message.created_at\n              } : msg));\n              break;\n            case 'new_message':\n              console.log('💬 新着メッセージ受信:', data.message);\n              const isOwnMessage = data.message.sender_id === currentUser.id;\n              if (isOwnMessage) {\n                console.log('🔄 自分のメッセージなので楽観的UI更新を確定');\n                setMessages(prev => prev.map(msg => msg.sending && msg.sender_id === currentUser.id && Math.abs(new Date(msg.created_at).getTime() - new Date(data.message.created_at).getTime()) < 5000 ? {\n                  ...msg,\n                  id: data.message.id,\n                  sending: false,\n                  created_at: data.message.created_at\n                } : msg));\n              } else {\n                console.log('👥 他の人のメッセージを追加');\n                setMessages(prev => {\n                  const exists = prev.some(msg => msg.id === data.message.id);\n                  if (exists) {\n                    console.log('重複メッセージをスキップ');\n                    return prev;\n                  }\n                  const newMsg = {\n                    ...data.message,\n                    message: data.message.message || data.message.content,\n                    name: data.message.sender_name || 'Unknown User'\n                  };\n                  console.log('メッセージを追加:', newMsg);\n                  return [...prev, newMsg];\n                });\n              }\n              break;\n            case 'message_error':\n              console.error('❌ メッセージエラー:', data.error);\n              setError('メッセージの送信に失敗しました');\n              break;\n            default:\n              console.log('未知のメッセージタイプ:', data.type);\n          }\n        } catch (err) {\n          console.error('❌ WebSocketメッセージ解析エラー:', err);\n        }\n      };\n      ws.onclose = event => {\n        console.log('🔌 WebSocket接続終了:', event.code, event.reason);\n        setIsConnected(false);\n        if (!isReconnecting) {\n          console.log('🔄 5秒後に再接続を試行します...');\n          setIsReconnecting(true);\n          reconnectTimeoutRef.current = setTimeout(() => {\n            connectWebSocket();\n          }, 5000);\n        }\n      };\n      ws.onerror = error => {\n        console.error('❌ WebSocketエラー:', error);\n        setIsConnected(false);\n      };\n    } catch (err) {\n      console.error('❌ WebSocket接続失敗:', err);\n      setIsConnected(false);\n      console.log('🔄 WebSocket失敗、ポーリングモードに切り替え');\n      startPolling();\n    }\n  }, [id, currentUser, isReconnecting, stopPolling, startPolling]);\n\n  // 初期データ取得\n  useEffect(() => {\n    const fetchData = async () => {\n      if (!id) return;\n      try {\n        setLoading(true);\n        try {\n          const detailsResponse = await Applications.getApplicationDetails(id);\n          setApplicationDetails(detailsResponse.data);\n          setApplication(detailsResponse.data.application);\n          if (detailsResponse.data.messages) {\n            setMessages(detailsResponse.data.messages);\n          } else {\n            await fetchMessages();\n          }\n        } catch (detailsErr) {\n          console.log('詳細取得失敗、通常の取得方法にフォールバック', detailsErr);\n          const applicationResponse = await Applications.getById(id);\n          setApplication(applicationResponse.data);\n          await fetchMessages();\n        }\n        setLoading(false);\n      } catch (err) {\n        console.error('データ取得エラー:', err);\n        setError('情報の取得に失敗しました');\n        setLoading(false);\n      }\n    };\n    fetchData();\n  }, [id, fetchMessages]);\n\n  // WebSocket接続の開始(個別メッセージタブの場合のみ)\n  useEffect(() => {\n    if (!loading && currentUser && id && activeTab === 'individual') {\n      console.log('🚀 個別メッセージ用WebSocket接続を開始します');\n      connectWebSocket();\n    }\n    return () => {\n      if (wsRef.current) {\n        console.log('🧹 WebSocket接続をクリーンアップ');\n        wsRef.current.close();\n      }\n      if (reconnectTimeoutRef.current) {\n        clearTimeout(reconnectTimeoutRef.current);\n      }\n      stopPolling();\n    };\n  }, [loading, currentUser, id, activeTab, connectWebSocket, stopPolling]);\n\n  // メッセージリストの自動スクロール\n  useEffect(() => {\n    if (messageListRef.current) {\n      messageListRef.current.scrollTop = messageListRef.current.scrollHeight;\n    }\n  }, [messages]);\n  const handleSubmit = async e => {\n    e.preventDefault();\n    if (!newMessage.trim()) return;\n    const messageContent = newMessage.trim();\n    const tempId = Date.now();\n    console.log('📤 メッセージ送信開始:', messageContent);\n    const optimisticMessage = {\n      id: tempId,\n      tempId: tempId,\n      message: messageContent,\n      sender_id: currentUser.id,\n      name: currentUser.name,\n      created_at: new Date().toISOString(),\n      sending: true\n    };\n    setMessages(prev => [...prev, optimisticMessage]);\n    setNewMessage('');\n    try {\n      if (isConnected && wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {\n        const wsMessage = {\n          type: 'message',\n          application_id: parseInt(id),\n          sender_id: currentUser.id,\n          content: messageContent,\n          tempId: tempId\n        };\n        console.log('📡 WebSocket経由でメッセージ送信:', wsMessage);\n        wsRef.current.send(JSON.stringify(wsMessage));\n        setTimeout(() => {\n          setMessages(prev => prev.map(msg => msg.tempId === tempId ? {\n            ...msg,\n            sending: false\n          } : msg));\n        }, 1000);\n      } else {\n        console.log('🔄 HTTP API経由でメッセージ送信(WebSocket未接続)');\n        await Messages.send(id, {\n          sender_id: currentUser.id,\n          message: messageContent\n        });\n        await fetchMessages();\n      }\n    } catch (err) {\n      console.error('❌ メッセージ送信エラー:', err);\n      setError('メッセージの送信に失敗しました');\n      setMessages(prev => prev.filter(msg => msg.tempId !== tempId));\n      setNewMessage(messageContent);\n    }\n  };\n  const handleBack = () => {\n    navigate('/profile');\n  };\n  const handleTabChange = tab => {\n    setActiveTab(tab);\n  };\n  if (loading) {\n    return /*#__PURE__*/_jsxDEV(MessageBoardContainer, {\n      children: /*#__PURE__*/_jsxDEV(Loading, {\n        children: \"\\u8AAD\\u307F\\u8FBC\\u307F\\u4E2D...\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 540,\n        columnNumber: 9\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 539,\n      columnNumber: 7\n    }, this);\n  }\n  if (error && !application) {\n    return /*#__PURE__*/_jsxDEV(MessageBoardContainer, {\n      children: [/*#__PURE__*/_jsxDEV(Error, {\n        children: error\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 548,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(BackButton, {\n        $secondary: true,\n        onClick: handleBack,\n        children: \"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 549,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 547,\n      columnNumber: 7\n    }, this);\n  }\n  if (!application) {\n    return /*#__PURE__*/_jsxDEV(MessageBoardContainer, {\n      children: [/*#__PURE__*/_jsxDEV(Error, {\n        children: \"\\u5FDC\\u52DF\\u60C5\\u5831\\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 559,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(BackButton, {\n        $secondary: true,\n        onClick: handleBack,\n        children: \"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 560,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 558,\n      columnNumber: 7\n    }, this);\n  }\n  const isFarmer = currentUser.user_type === 'farmer';\n  const jobPostingId = application.job_posting_id;\n  const jobOwnerId = applicationDetails === null || applicationDetails === void 0 ? void 0 : (_applicationDetails$a = applicationDetails.application) === null || _applicationDetails$a === void 0 ? void 0 : _applicationDetails$a.job_owner_id;\n  return /*#__PURE__*/_jsxDEV(MessageBoardContainer, {\n    children: [/*#__PURE__*/_jsxDEV(Title, {\n      children: \"\\u30E1\\u30C3\\u30BB\\u30FC\\u30B8\"\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 573,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(JobInfoCard, {\n      children: [/*#__PURE__*/_jsxDEV(JobTitle, {\n        children: application.company_name\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 576,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(JobDetailItem, {\n        children: [/*#__PURE__*/_jsxDEV(JobLabel, {\n          children: \"\\u52E4\\u52D9\\u5730:\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 578,\n          columnNumber: 11\n        }, this), application.location]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 577,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(JobDetailItem, {\n        children: [/*#__PURE__*/_jsxDEV(JobLabel, {\n          children: \"\\u5FDC\\u52DF\\u72B6\\u6CC1:\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 582,\n          columnNumber: 11\n        }, this), application.status === 'pending' ? '応募中' : application.status === 'accepted' ? '採用' : application.status === 'cancelled' ? '応募取消' : application.status]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 581,\n        columnNumber: 9\n      }, this), isFarmer && applicationDetails && /*#__PURE__*/_jsxDEV(ParticipantInfo, {\n        children: [/*#__PURE__*/_jsxDEV(JobDetailItem, {\n          children: [/*#__PURE__*/_jsxDEV(JobLabel, {\n            children: \"\\u5FDC\\u52DF\\u8005:\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 592,\n            columnNumber: 15\n          }, this), applicationDetails.application.applicant_name || '応募者']\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 591,\n          columnNumber: 13\n        }, this), applicationDetails.application.applicant_email && /*#__PURE__*/_jsxDEV(JobDetailItem, {\n          children: [/*#__PURE__*/_jsxDEV(JobLabel, {\n            children: \"\\u9023\\u7D61\\u5148:\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 597,\n            columnNumber: 17\n          }, this), applicationDetails.application.applicant_email, applicationDetails.application.applicant_phone && ` / ${applicationDetails.application.applicant_phone}`]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 596,\n          columnNumber: 15\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 590,\n        columnNumber: 11\n      }, this), !isFarmer && application.contact && /*#__PURE__*/_jsxDEV(ParticipantInfo, {\n        children: /*#__PURE__*/_jsxDEV(JobDetailItem, {\n          children: [/*#__PURE__*/_jsxDEV(JobLabel, {\n            children: \"\\u9023\\u7D61\\u5148:\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 608,\n            columnNumber: 15\n          }, this), application.contact]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 607,\n          columnNumber: 13\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 606,\n        columnNumber: 11\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 575,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(MessageTabs, {\n      activeTab: activeTab,\n      onTabChange: handleTabChange\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 616,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(TabContentContainer, {\n      children: activeTab === 'group' ?\n      /*#__PURE__*/\n      /* グループチャット */\n      _jsxDEV(GroupChatComponent, {\n        jobId: jobPostingId,\n        jobOwnerId: jobOwnerId\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 621,\n        columnNumber: 11\n      }, this) :\n      /*#__PURE__*/\n      /* 個別メッセージ(既存機能) */\n      _jsxDEV(_Fragment, {\n        children: [/*#__PURE__*/_jsxDEV(ConnectionStatus, {\n          $connected: isConnected,\n          children: [/*#__PURE__*/_jsxDEV(StatusIndicator, {\n            $connected: isConnected\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 629,\n            columnNumber: 15\n          }, this), isConnected ? 'リアルタイム接続中' : isReconnecting ? '再接続中...' : 'オフラインモード(ポーリング)']\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 628,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(MessageContainer, {\n          children: [/*#__PURE__*/_jsxDEV(MessageList, {\n            ref: messageListRef,\n            children: messages.length === 0 ? /*#__PURE__*/_jsxDEV(NoMessages, {\n              children: \"\\u30E1\\u30C3\\u30BB\\u30FC\\u30B8\\u306F\\u307E\\u3060\\u3042\\u308A\\u307E\\u305B\\u3093\\u3002\"\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 637,\n              columnNumber: 19\n            }, this) : messages.map(message => /*#__PURE__*/_jsxDEV(Message, {\n              $sent: message.sender_id === currentUser.id,\n              children: [/*#__PURE__*/_jsxDEV(MessageBubble, {\n                $sent: message.sender_id === currentUser.id,\n                $sending: message.sending,\n                children: [message.sending && /*#__PURE__*/_jsxDEV(SendingIndicator, {}, void 0, false, {\n                  fileName: _jsxFileName,\n                  lineNumber: 642,\n                  columnNumber: 45\n                }, this), message.message]\n              }, void 0, true, {\n                fileName: _jsxFileName,\n                lineNumber: 641,\n                columnNumber: 23\n              }, this), /*#__PURE__*/_jsxDEV(MessageInfo, {\n                children: [message.name, \" \\u2022 \", new Date(message.created_at).toLocaleString('ja-JP'), message.sending && ' • 送信中...']\n              }, void 0, true, {\n                fileName: _jsxFileName,\n                lineNumber: 645,\n                columnNumber: 23\n              }, this)]\n            }, message.id || message.tempId, true, {\n              fileName: _jsxFileName,\n              lineNumber: 640,\n              columnNumber: 21\n            }, this))\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 635,\n            columnNumber: 15\n          }, this), /*#__PURE__*/_jsxDEV(MessageForm, {\n            onSubmit: handleSubmit,\n            children: [/*#__PURE__*/_jsxDEV(MessageInput, {\n              value: newMessage,\n              onChange: e => setNewMessage(e.target.value),\n              placeholder: isConnected ? \"メッセージを入力してください\" : \"オフラインモード(送信まで時間がかかります)\",\n              disabled: loading\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 655,\n              columnNumber: 17\n            }, this), /*#__PURE__*/_jsxDEV(SendButton, {\n              type: \"submit\",\n              disabled: !newMessage.trim() || loading,\n              children: \"\\u9001\\u4FE1\"\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 661,\n              columnNumber: 17\n            }, this)]\n          }, void 0, true, {\n            fileName: _jsxFileName,\n            lineNumber: 654,\n            columnNumber: 15\n          }, this)]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 634,\n          columnNumber: 13\n        }, this)]\n      }, void 0, true)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 618,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(BackButton, {\n      $secondary: true,\n      onClick: handleBack,\n      children: \"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 670,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 572,\n    columnNumber: 5\n  }, this);\n};\n_s(MessageBoard, \"+reuykxyqkmuApnTs4dCwIjV++k=\", false, function () {\n  return [useParams, useSearchParams, useNavigate];\n});\n_c22 = MessageBoard;\nexport default MessageBoard;\nvar _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c0, _c1, _c10, _c11, _c12, _c13, _c14, _c15, _c16, _c17, _c18, _c19, _c20, _c21, _c22;\n$RefreshReg$(_c, \"MessageBoardContainer\");\n$RefreshReg$(_c2, \"Title\");\n$RefreshReg$(_c3, \"ConnectionStatus\");\n$RefreshReg$(_c4, \"StatusIndicator\");\n$RefreshReg$(_c5, \"JobInfoCard\");\n$RefreshReg$(_c6, \"JobTitle\");\n$RefreshReg$(_c7, \"JobDetailItem\");\n$RefreshReg$(_c8, \"JobLabel\");\n$RefreshReg$(_c9, \"MessageContainer\");\n$RefreshReg$(_c0, \"MessageList\");\n$RefreshReg$(_c1, \"Message\");\n$RefreshReg$(_c10, \"MessageBubble\");\n$RefreshReg$(_c11, \"SendingIndicator\");\n$RefreshReg$(_c12, \"MessageInfo\");\n$RefreshReg$(_c13, \"MessageForm\");\n$RefreshReg$(_c14, \"MessageInput\");\n$RefreshReg$(_c15, \"SendButton\");\n$RefreshReg$(_c16, \"NoMessages\");\n$RefreshReg$(_c17, \"Loading\");\n$RefreshReg$(_c18, \"Error\");\n$RefreshReg$(_c19, \"BackButton\");\n$RefreshReg$(_c20, \"ParticipantInfo\");\n$RefreshReg$(_c21, \"TabContentContainer\");\n$RefreshReg$(_c22, \"MessageBoard\");","map":{"version":3,"names":["React","useState","useEffect","useContext","useRef","useCallback","useParams","useNavigate","useSearchParams","styled","Messages","Applications","AuthContext","Button","Card","MessageTabs","GroupChatComponent","jsxDEV","_jsxDEV","Fragment","_Fragment","MessageBoardContainer","div","_c","Title","h1","_c2","ConnectionStatus","props","$connected","_c3","StatusIndicator","span","_c4","JobInfoCard","_c5","JobTitle","h2","_c6","JobDetailItem","p","_c7","JobLabel","_c8","MessageContainer","_c9","MessageList","_c0","Message","$sent","_c1","MessageBubble","$sending","_c10","SendingIndicator","_c11","MessageInfo","_c12","MessageForm","form","_c13","MessageInput","textarea","_c14","SendButton","_c15","NoMessages","_c16","Loading","_c17","Error","_c18","BackButton","_c19","ParticipantInfo","_c20","TabContentContainer","_c21","MessageBoard","_s","_applicationDetails$a","id","searchParams","currentUser","navigate","initialTab","get","activeTab","setActiveTab","application","setApplication","applicationDetails","setApplicationDetails","messages","setMessages","newMessage","setNewMessage","loading","setLoading","error","setError","isConnected","setIsConnected","isReconnecting","setIsReconnecting","messageListRef","wsRef","reconnectTimeoutRef","pollingIntervalRef","fetchMessages","response","getByApplication","data","err","console","startPolling","log","current","clearInterval","setInterval","stopPolling","connectWebSocket","wsUrl","process","env","NODE_ENV","window","location","host","ws","WebSocket","onopen","joinMessage","type","application_id","user_id","send","JSON","stringify","onmessage","event","parse","room","message","prev","map","msg","tempId","sending","created_at","isOwnMessage","sender_id","Math","abs","Date","getTime","exists","some","newMsg","content","name","sender_name","onclose","code","reason","setTimeout","onerror","fetchData","detailsResponse","getApplicationDetails","detailsErr","applicationResponse","getById","close","clearTimeout","scrollTop","scrollHeight","handleSubmit","e","preventDefault","trim","messageContent","now","optimisticMessage","toISOString","readyState","OPEN","wsMessage","parseInt","filter","handleBack","handleTabChange","tab","children","fileName","_jsxFileName","lineNumber","columnNumber","$secondary","onClick","isFarmer","user_type","jobPostingId","job_posting_id","jobOwnerId","job_owner_id","company_name","status","applicant_name","applicant_email","applicant_phone","contact","onTabChange","jobId","ref","length","toLocaleString","onSubmit","value","onChange","target","placeholder","disabled","_c22","$RefreshReg$"],"sources":["/home/fanfarm/FanFarm/system/V3fanfarm-ubuntu-local/V3fanfarm-frontend/src/components/message/MessageBoard.js"],"sourcesContent":["// src/components/message/MessageBoard.js - タブ機能統合版\nimport React, { useState, useEffect, useContext, useRef, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { Messages, Applications } from '../../api/api';\nimport { AuthContext } from '../../context/AuthContext';\nimport Button from '../common/Button';\nimport Card from '../common/Card';\nimport MessageTabs from './MessageTabs';\nimport GroupChatComponent from './GroupChat';\n\nconst MessageBoardContainer = styled.div`\n  max-width: 800px;\n  margin: 40px auto;\n  padding: 0 24px;\n`;\n\nconst Title = styled.h1`\n  text-align: center;\n  margin-bottom: 32px;\n  color: var(--primary-color);\n`;\n\nconst ConnectionStatus = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 8px 16px;\n  margin-bottom: 16px;\n  border-radius: var(--border-radius);\n  font-size: 14px;\n  background: ${props => props.$connected ? '#e8f5e8' : '#fff3cd'};\n  color: ${props => props.$connected ? '#155724' : '#856404'};\n  border: 1px solid ${props => props.$connected ? '#c3e6c3' : '#ffeaa7'};\n`;\n\nconst StatusIndicator = styled.span`\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: ${props => props.$connected ? '#28a745' : '#ffc107'};\n  margin-right: 8px;\n`;\n\nconst JobInfoCard = styled(Card)`\n  margin-bottom: 24px;\n`;\n\nconst JobTitle = styled.h2`\n  font-size: 24px;\n  margin-bottom: 16px;\n  color: var(--primary-color);\n`;\n\nconst JobDetailItem = styled.p`\n  margin-bottom: 8px;\n  font-size: 16px;\n`;\n\nconst JobLabel = styled.span`\n  font-weight: 700;\n  margin-right: 8px;\n`;\n\nconst MessageContainer = styled(Card)`\n  min-height: 400px;\n  display: flex;\n  flex-direction: column;\n`;\n\nconst MessageList = styled.div`\n  flex-grow: 1;\n  overflow-y: auto;\n  margin-bottom: 24px;\n  max-height: 400px;\n  padding-right: 8px;\n\n  &::-webkit-scrollbar {\n    width: 6px;\n  }\n\n  &::-webkit-scrollbar-track {\n    background: var(--background-color);\n    border-radius: 4px;\n  }\n\n  &::-webkit-scrollbar-thumb {\n    background: var(--border-color);\n    border-radius: 4px;\n  }\n`;\n\nconst Message = styled.div`\n  margin-bottom: 16px;\n  display: flex;\n  flex-direction: column;\n  align-items: ${props => props.$sent ? 'flex-end' : 'flex-start'};\n`;\n\nconst MessageBubble = styled.div`\n  background-color: ${props => props.$sent ? 'var(--primary-color)' : 'var(--background-color)'};\n  color: ${props => props.$sent ? 'var(--white)' : 'var(--text-color)'};\n  padding: 12px 16px;\n  border-radius: 18px;\n  max-width: 70%;\n  word-break: break-word;\n  opacity: ${props => props.$sending ? 0.7 : 1};\n  position: relative;\n`;\n\nconst SendingIndicator = styled.div`\n  position: absolute;\n  top: -8px;\n  right: -8px;\n  width: 16px;\n  height: 16px;\n  border: 2px solid var(--primary-color);\n  border-top: 2px solid transparent;\n  border-radius: 50%;\n  animation: spin 1s linear infinite;\n\n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n`;\n\nconst MessageInfo = styled.div`\n  font-size: 12px;\n  color: var(--text-light);\n  margin-top: 4px;\n`;\n\nconst MessageForm = styled.form`\n  display: flex;\n  gap: 16px;\n\n  @media (max-width: 768px) {\n    flex-direction: column;\n    gap: 8px;\n  }\n`;\n\nconst MessageInput = styled.textarea`\n  flex-grow: 1;\n  padding: 12px 16px;\n  font-size: 16px;\n  border: 2px solid var(--border-color);\n  border-radius: var(--border-radius);\n  resize: none;\n  min-height: 80px;\n\n  &:focus {\n    outline: none;\n    border-color: var(--primary-color);\n  }\n\n  &:disabled {\n    background-color: var(--background-color);\n    cursor: not-allowed;\n  }\n`;\n\nconst SendButton = styled(Button)`\n  align-self: flex-end;\n`;\n\nconst NoMessages = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--text-light);\n  margin: 48px 0;\n`;\n\nconst Loading = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--text-light);\n  margin: 48px 0;\n`;\n\nconst Error = styled.p`\n  text-align: center;\n  font-size: 18px;\n  color: var(--error-color);\n  margin: 48px 0;\n`;\n\nconst BackButton = styled(Button)`\n  margin-top: 24px;\n`;\n\nconst ParticipantInfo = styled.div`\n  margin-top: 12px;\n  padding-top: 12px;\n  border-top: 1px solid var(--border-color);\n`;\n\nconst TabContentContainer = styled.div`\n  min-height: 500px;\n`;\n\nconst MessageBoard = () => {\n  const { id } = useParams();\n  const [searchParams] = useSearchParams();\n  const { currentUser } = useContext(AuthContext);\n  const navigate = useNavigate();\n  \n  // タブ状態(URLパラメータまたはデフォルト)\n  const initialTab = searchParams.get('tab') || 'group';\n  const [activeTab, setActiveTab] = useState(initialTab);\n  \n  const [application, setApplication] = useState(null);\n  const [applicationDetails, setApplicationDetails] = useState(null);\n  const [messages, setMessages] = useState([]);\n  const [newMessage, setNewMessage] = useState('');\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState('');\n  const [isConnected, setIsConnected] = useState(false);\n  const [isReconnecting, setIsReconnecting] = useState(false);\n  const messageListRef = useRef(null);\n  const wsRef = useRef(null);\n  const reconnectTimeoutRef = useRef(null);\n  const pollingIntervalRef = useRef(null);\n\n  // メッセージ取得関数(useCallbackで安定化)\n  const fetchMessages = useCallback(async () => {\n    if (!id) return;\n    \n    try {\n      const response = await Messages.getByApplication(id);\n      setMessages(response.data);\n    } catch (err) {\n      console.error('メッセージの更新に失敗しました', err);\n    }\n  }, [id]);\n\n  // ポーリング開始関数(useCallbackで安定化)\n  const startPolling = useCallback(() => {\n    console.log('ポーリングモード開始');\n    \n    if (pollingIntervalRef.current) {\n      clearInterval(pollingIntervalRef.current);\n    }\n    \n    pollingIntervalRef.current = setInterval(async () => {\n      try {\n        await fetchMessages();\n      } catch (err) {\n        console.error('ポーリング取得エラー:', err);\n      }\n    }, 3000);\n  }, [fetchMessages]);\n\n  // ポーリング停止関数\n  const stopPolling = useCallback(() => {\n    if (pollingIntervalRef.current) {\n      clearInterval(pollingIntervalRef.current);\n      pollingIntervalRef.current = null;\n    }\n  }, []);\n\n  // WebSocket接続関数\n  const connectWebSocket = useCallback(() => {\n    if (!id || !currentUser) return;\n\n    stopPolling();\n\n    try {\n      console.log('WebSocket接続試行中...');\n      \n      const wsUrl = process.env.NODE_ENV === 'development' \n        ? 'wss://' + window.location.host + '/nikko/ws'\n        : `wss://${window.location.host}/nikko/ws`;\n      \n      console.log('WebSocket URL:', wsUrl);\n      \n      const ws = new WebSocket(wsUrl);\n      wsRef.current = ws;\n\n      ws.onopen = () => {\n        console.log('✅ WebSocket接続成功');\n        setIsConnected(true);\n        setIsReconnecting(false);\n        \n        const joinMessage = {\n          type: 'join_room',\n          application_id: id,\n          user_id: currentUser.id\n        };\n        console.log('ルーム参加メッセージ送信:', joinMessage);\n        ws.send(JSON.stringify(joinMessage));\n      };\n\n      ws.onmessage = (event) => {\n        try {\n          console.log('📨 WebSocketメッセージ受信:', event.data);\n          const data = JSON.parse(event.data);\n          \n          switch (data.type) {\n            case 'connection_confirmed':\n              console.log('✅ 接続確認受信');\n              break;\n              \n            case 'room_joined':\n              console.log('✅ ルーム参加確認:', data.room);\n              break;\n              \n            case 'message_sent':\n              console.log('✅ メッセージ送信確認受信:', data.message);\n              setMessages(prev => prev.map(msg => \n                msg.tempId === data.tempId \n                  ? { \n                      ...msg, \n                      id: data.message.id, \n                      sending: false,\n                      created_at: data.message.created_at\n                    }\n                  : msg\n              ));\n              break;\n              \n            case 'new_message':\n              console.log('💬 新着メッセージ受信:', data.message);\n              \n              const isOwnMessage = data.message.sender_id === currentUser.id;\n              \n              if (isOwnMessage) {\n                console.log('🔄 自分のメッセージなので楽観的UI更新を確定');\n                setMessages(prev => prev.map(msg => \n                  msg.sending && msg.sender_id === currentUser.id && \n                  Math.abs(new Date(msg.created_at).getTime() - new Date(data.message.created_at).getTime()) < 5000\n                    ? { \n                        ...msg, \n                        id: data.message.id, \n                        sending: false,\n                        created_at: data.message.created_at\n                      }\n                    : msg\n                ));\n              } else {\n                console.log('👥 他の人のメッセージを追加');\n                setMessages(prev => {\n                  const exists = prev.some(msg => msg.id === data.message.id);\n                  if (exists) {\n                    console.log('重複メッセージをスキップ');\n                    return prev;\n                  }\n                  \n                  const newMsg = {\n                    ...data.message,\n                    message: data.message.message || data.message.content,\n                    name: data.message.sender_name || 'Unknown User'\n                  };\n                  \n                  console.log('メッセージを追加:', newMsg);\n                  return [...prev, newMsg];\n                });\n              }\n              break;\n              \n            case 'message_error':\n              console.error('❌ メッセージエラー:', data.error);\n              setError('メッセージの送信に失敗しました');\n              break;\n              \n            default:\n              console.log('未知のメッセージタイプ:', data.type);\n          }\n        } catch (err) {\n          console.error('❌ WebSocketメッセージ解析エラー:', err);\n        }\n      };\n\n      ws.onclose = (event) => {\n        console.log('🔌 WebSocket接続終了:', event.code, event.reason);\n        setIsConnected(false);\n        \n        if (!isReconnecting) {\n          console.log('🔄 5秒後に再接続を試行します...');\n          setIsReconnecting(true);\n          reconnectTimeoutRef.current = setTimeout(() => {\n            connectWebSocket();\n          }, 5000);\n        }\n      };\n\n      ws.onerror = (error) => {\n        console.error('❌ WebSocketエラー:', error);\n        setIsConnected(false);\n      };\n\n    } catch (err) {\n      console.error('❌ WebSocket接続失敗:', err);\n      setIsConnected(false);\n      \n      console.log('🔄 WebSocket失敗、ポーリングモードに切り替え');\n      startPolling();\n    }\n  }, [id, currentUser, isReconnecting, stopPolling, startPolling]);\n\n  // 初期データ取得\n  useEffect(() => {\n    const fetchData = async () => {\n      if (!id) return;\n      \n      try {\n        setLoading(true);\n        \n        try {\n          const detailsResponse = await Applications.getApplicationDetails(id);\n          setApplicationDetails(detailsResponse.data);\n          setApplication(detailsResponse.data.application);\n          \n          if (detailsResponse.data.messages) {\n            setMessages(detailsResponse.data.messages);\n          } else {\n            await fetchMessages();\n          }\n        } catch (detailsErr) {\n          console.log('詳細取得失敗、通常の取得方法にフォールバック', detailsErr);\n          const applicationResponse = await Applications.getById(id);\n          setApplication(applicationResponse.data);\n          await fetchMessages();\n        }\n        \n        setLoading(false);\n        \n      } catch (err) {\n        console.error('データ取得エラー:', err);\n        setError('情報の取得に失敗しました');\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n  }, [id, fetchMessages]);\n\n  // WebSocket接続の開始(個別メッセージタブの場合のみ)\n  useEffect(() => {\n    if (!loading && currentUser && id && activeTab === 'individual') {\n      console.log('🚀 個別メッセージ用WebSocket接続を開始します');\n      connectWebSocket();\n    }\n    \n    return () => {\n      if (wsRef.current) {\n        console.log('🧹 WebSocket接続をクリーンアップ');\n        wsRef.current.close();\n      }\n      if (reconnectTimeoutRef.current) {\n        clearTimeout(reconnectTimeoutRef.current);\n      }\n      stopPolling();\n    };\n  }, [loading, currentUser, id, activeTab, connectWebSocket, stopPolling]);\n  \n  // メッセージリストの自動スクロール\n  useEffect(() => {\n    if (messageListRef.current) {\n      messageListRef.current.scrollTop = messageListRef.current.scrollHeight;\n    }\n  }, [messages]);\n\n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    \n    if (!newMessage.trim()) return;\n    \n    const messageContent = newMessage.trim();\n    const tempId = Date.now();\n    \n    console.log('📤 メッセージ送信開始:', messageContent);\n    \n    const optimisticMessage = {\n      id: tempId,\n      tempId: tempId,\n      message: messageContent,\n      sender_id: currentUser.id,\n      name: currentUser.name,\n      created_at: new Date().toISOString(),\n      sending: true\n    };\n    \n    setMessages(prev => [...prev, optimisticMessage]);\n    setNewMessage('');\n    \n    try {\n      if (isConnected && wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {\n        const wsMessage = {\n          type: 'message',\n          application_id: parseInt(id),\n          sender_id: currentUser.id,\n          content: messageContent,\n          tempId: tempId\n        };\n        \n        console.log('📡 WebSocket経由でメッセージ送信:', wsMessage);\n        wsRef.current.send(JSON.stringify(wsMessage));\n        \n        setTimeout(() => {\n          setMessages(prev => prev.map(msg => \n            msg.tempId === tempId \n              ? { ...msg, sending: false }\n              : msg\n          ));\n        }, 1000);\n        \n      } else {\n        console.log('🔄 HTTP API経由でメッセージ送信(WebSocket未接続)');\n        \n        await Messages.send(id, {\n          sender_id: currentUser.id,\n          message: messageContent\n        });\n        \n        await fetchMessages();\n      }\n      \n    } catch (err) {\n      console.error('❌ メッセージ送信エラー:', err);\n      setError('メッセージの送信に失敗しました');\n      \n      setMessages(prev => prev.filter(msg => msg.tempId !== tempId));\n      setNewMessage(messageContent);\n    }\n  };\n\n  const handleBack = () => {\n    navigate('/profile');\n  };\n\n  const handleTabChange = (tab) => {\n    setActiveTab(tab);\n  };\n\n  if (loading) {\n    return (\n      <MessageBoardContainer>\n        <Loading>読み込み中...</Loading>\n      </MessageBoardContainer>\n    );\n  }\n\n  if (error && !application) {\n    return (\n      <MessageBoardContainer>\n        <Error>{error}</Error>\n        <BackButton $secondary onClick={handleBack}>\n          プロフィールに戻る\n        </BackButton>\n      </MessageBoardContainer>\n    );\n  }\n\n  if (!application) {\n    return (\n      <MessageBoardContainer>\n        <Error>応募情報が見つかりませんでした</Error>\n        <BackButton $secondary onClick={handleBack}>\n          プロフィールに戻る\n        </BackButton>\n      </MessageBoardContainer>\n    );\n  }\n\n  const isFarmer = currentUser.user_type === 'farmer';\n  const jobPostingId = application.job_posting_id;\n  const jobOwnerId = applicationDetails?.application?.job_owner_id;\n\n  return (\n    <MessageBoardContainer>\n      <Title>メッセージ</Title>\n      \n      <JobInfoCard>\n        <JobTitle>{application.company_name}</JobTitle>\n        <JobDetailItem>\n          <JobLabel>勤務地:</JobLabel>\n          {application.location}\n        </JobDetailItem>\n        <JobDetailItem>\n          <JobLabel>応募状況:</JobLabel>\n          {application.status === 'pending' ? '応募中' : \n           application.status === 'accepted' ? '採用' : \n           application.status === 'cancelled' ? '応募取消' : \n           application.status}\n        </JobDetailItem>\n        \n        {isFarmer && applicationDetails && (\n          <ParticipantInfo>\n            <JobDetailItem>\n              <JobLabel>応募者:</JobLabel>\n              {applicationDetails.application.applicant_name || '応募者'}\n            </JobDetailItem>\n            {applicationDetails.application.applicant_email && (\n              <JobDetailItem>\n                <JobLabel>連絡先:</JobLabel>\n                {applicationDetails.application.applicant_email}\n                {applicationDetails.application.applicant_phone && ` / ${applicationDetails.application.applicant_phone}`}\n              </JobDetailItem>\n            )}\n          </ParticipantInfo>\n        )}\n        \n        {!isFarmer && application.contact && (\n          <ParticipantInfo>\n            <JobDetailItem>\n              <JobLabel>連絡先:</JobLabel>\n              {application.contact}\n            </JobDetailItem>\n          </ParticipantInfo>\n        )}\n      </JobInfoCard>\n\n      {/* タブ切り替え */}\n      <MessageTabs activeTab={activeTab} onTabChange={handleTabChange} />\n\n      <TabContentContainer>\n        {activeTab === 'group' ? (\n          /* グループチャット */\n          <GroupChatComponent \n            jobId={jobPostingId} \n            jobOwnerId={jobOwnerId}\n          />\n        ) : (\n          /* 個別メッセージ(既存機能) */\n          <>\n            <ConnectionStatus $connected={isConnected}>\n              <StatusIndicator $connected={isConnected} />\n              {isConnected ? 'リアルタイム接続中' : \n               isReconnecting ? '再接続中...' : 'オフラインモード(ポーリング)'}\n            </ConnectionStatus>\n            \n            <MessageContainer>\n              <MessageList ref={messageListRef}>\n                {messages.length === 0 ? (\n                  <NoMessages>メッセージはまだありません。</NoMessages>\n                ) : (\n                  messages.map((message) => (\n                    <Message key={message.id || message.tempId} $sent={message.sender_id === currentUser.id}>\n                      <MessageBubble $sent={message.sender_id === currentUser.id} $sending={message.sending}>\n                        {message.sending && <SendingIndicator />}\n                        {message.message}\n                      </MessageBubble>\n                      <MessageInfo>\n                        {message.name} • {new Date(message.created_at).toLocaleString('ja-JP')}\n                        {message.sending && ' • 送信中...'}\n                      </MessageInfo>\n                    </Message>\n                  ))\n                )}\n              </MessageList>\n              \n              <MessageForm onSubmit={handleSubmit}>\n                <MessageInput\n                  value={newMessage}\n                  onChange={(e) => setNewMessage(e.target.value)}\n                  placeholder={isConnected ? \"メッセージを入力してください\" : \"オフラインモード(送信まで時間がかかります)\"}\n                  disabled={loading}\n                />\n                <SendButton type=\"submit\" disabled={!newMessage.trim() || loading}>\n                  送信\n                </SendButton>\n              </MessageForm>\n            </MessageContainer>\n          </>\n        )}\n      </TabContentContainer>\n      \n      <BackButton $secondary onClick={handleBack}>\n        プロフィールに戻る\n      </BackButton>\n    </MessageBoardContainer>\n  );\n};\n\nexport default MessageBoard;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}