{"ast":null,"code":"import _objectSpread from\"/home/fanfarm/FanFarm/system/V3fanfarm-ubuntu-local/V3fanfarm-frontend/node_modules/@babel/runtime/helpers/esm/objectSpread2.js\";import _taggedTemplateLiteral from\"/home/fanfarm/FanFarm/system/V3fanfarm-ubuntu-local/V3fanfarm-frontend/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js\";var _templateObject,_templateObject2,_templateObject3,_templateObject4,_templateObject5,_templateObject6,_templateObject7,_templateObject8,_templateObject9,_templateObject0,_templateObject1,_templateObject10,_templateObject11,_templateObject12,_templateObject13,_templateObject14,_templateObject15,_templateObject16,_templateObject17,_templateObject18,_templateObject19,_templateObject20,_templateObject21;// src/components/message/MessageBoard.js - タブ機能統合版\nimport React,{useState,useEffect,useContext,useRef,useCallback}from'react';import{useParams,useNavigate,useSearchParams}from'react-router-dom';import styled from'styled-components';import{Messages,Applications}from'../../api/api';import{AuthContext}from'../../context/AuthContext';import Button from'../common/Button';import Card from'../common/Card';import MessageTabs from'./MessageTabs';import GroupChatComponent from'./GroupChat';import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";const MessageBoardContainer=styled.div(_templateObject||(_templateObject=_taggedTemplateLiteral([\"\\n max-width: 800px;\\n margin: 40px auto;\\n padding: 0 24px;\\n\"])));const Title=styled.h1(_templateObject2||(_templateObject2=_taggedTemplateLiteral([\"\\n text-align: center;\\n margin-bottom: 32px;\\n color: var(--primary-color);\\n\"])));const ConnectionStatus=styled.div(_templateObject3||(_templateObject3=_taggedTemplateLiteral([\"\\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: \",\";\\n color: \",\";\\n border: 1px solid \",\";\\n\"])),props=>props.$connected?'#e8f5e8':'#fff3cd',props=>props.$connected?'#155724':'#856404',props=>props.$connected?'#c3e6c3':'#ffeaa7');const StatusIndicator=styled.span(_templateObject4||(_templateObject4=_taggedTemplateLiteral([\"\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background: \",\";\\n margin-right: 8px;\\n\"])),props=>props.$connected?'#28a745':'#ffc107');const JobInfoCard=styled(Card)(_templateObject5||(_templateObject5=_taggedTemplateLiteral([\"\\n margin-bottom: 24px;\\n\"])));const JobTitle=styled.h2(_templateObject6||(_templateObject6=_taggedTemplateLiteral([\"\\n font-size: 24px;\\n margin-bottom: 16px;\\n color: var(--primary-color);\\n\"])));const JobDetailItem=styled.p(_templateObject7||(_templateObject7=_taggedTemplateLiteral([\"\\n margin-bottom: 8px;\\n font-size: 16px;\\n\"])));const JobLabel=styled.span(_templateObject8||(_templateObject8=_taggedTemplateLiteral([\"\\n font-weight: 700;\\n margin-right: 8px;\\n\"])));const MessageContainer=styled(Card)(_templateObject9||(_templateObject9=_taggedTemplateLiteral([\"\\n min-height: 400px;\\n display: flex;\\n flex-direction: column;\\n\"])));const MessageList=styled.div(_templateObject0||(_templateObject0=_taggedTemplateLiteral([\"\\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\"])));const Message=styled.div(_templateObject1||(_templateObject1=_taggedTemplateLiteral([\"\\n margin-bottom: 16px;\\n display: flex;\\n flex-direction: column;\\n align-items: \",\";\\n\"])),props=>props.$sent?'flex-end':'flex-start');const MessageBubble=styled.div(_templateObject10||(_templateObject10=_taggedTemplateLiteral([\"\\n background-color: \",\";\\n color: \",\";\\n padding: 12px 16px;\\n border-radius: 18px;\\n max-width: 70%;\\n word-break: break-word;\\n opacity: \",\";\\n position: relative;\\n\"])),props=>props.$sent?'var(--primary-color)':'var(--background-color)',props=>props.$sent?'var(--white)':'var(--text-color)',props=>props.$sending?0.7:1);const SendingIndicator=styled.div(_templateObject11||(_templateObject11=_taggedTemplateLiteral([\"\\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\"])));const MessageInfo=styled.div(_templateObject12||(_templateObject12=_taggedTemplateLiteral([\"\\n font-size: 12px;\\n color: var(--text-light);\\n margin-top: 4px;\\n\"])));const MessageForm=styled.form(_templateObject13||(_templateObject13=_taggedTemplateLiteral([\"\\n display: flex;\\n gap: 16px;\\n\\n @media (max-width: 768px) {\\n flex-direction: column;\\n gap: 8px;\\n }\\n\"])));const MessageInput=styled.textarea(_templateObject14||(_templateObject14=_taggedTemplateLiteral([\"\\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\"])));const SendButton=styled(Button)(_templateObject15||(_templateObject15=_taggedTemplateLiteral([\"\\n align-self: flex-end;\\n\"])));const NoMessages=styled.p(_templateObject16||(_templateObject16=_taggedTemplateLiteral([\"\\n text-align: center;\\n font-size: 18px;\\n color: var(--text-light);\\n margin: 48px 0;\\n\"])));const Loading=styled.p(_templateObject17||(_templateObject17=_taggedTemplateLiteral([\"\\n text-align: center;\\n font-size: 18px;\\n color: var(--text-light);\\n margin: 48px 0;\\n\"])));const Error=styled.p(_templateObject18||(_templateObject18=_taggedTemplateLiteral([\"\\n text-align: center;\\n font-size: 18px;\\n color: var(--error-color);\\n margin: 48px 0;\\n\"])));const BackButton=styled(Button)(_templateObject19||(_templateObject19=_taggedTemplateLiteral([\"\\n margin-top: 24px;\\n\"])));const ParticipantInfo=styled.div(_templateObject20||(_templateObject20=_taggedTemplateLiteral([\"\\n margin-top: 12px;\\n padding-top: 12px;\\n border-top: 1px solid var(--border-color);\\n\"])));const TabContentContainer=styled.div(_templateObject21||(_templateObject21=_taggedTemplateLiteral([\"\\n min-height: 500px;\\n\"])));const MessageBoard=()=>{var _applicationDetails$a;const{id}=useParams();const[searchParams]=useSearchParams();const{currentUser}=useContext(AuthContext);const navigate=useNavigate();// タブ状態(URLパラメータまたはデフォルト)\nconst initialTab=searchParams.get('tab')||'group';const[activeTab,setActiveTab]=useState(initialTab);const[application,setApplication]=useState(null);const[applicationDetails,setApplicationDetails]=useState(null);const[messages,setMessages]=useState([]);const[newMessage,setNewMessage]=useState('');const[loading,setLoading]=useState(true);const[error,setError]=useState('');const[isConnected,setIsConnected]=useState(false);const[isReconnecting,setIsReconnecting]=useState(false);const messageListRef=useRef(null);const wsRef=useRef(null);const reconnectTimeoutRef=useRef(null);const pollingIntervalRef=useRef(null);// メッセージ取得関数(useCallbackで安定化)\nconst fetchMessages=useCallback(async()=>{if(!id)return;try{const response=await Messages.getByApplication(id);setMessages(response.data);}catch(err){console.error('メッセージの更新に失敗しました',err);}},[id]);// ポーリング開始関数(useCallbackで安定化)\nconst startPolling=useCallback(()=>{console.log('ポーリングモード開始');if(pollingIntervalRef.current){clearInterval(pollingIntervalRef.current);}pollingIntervalRef.current=setInterval(async()=>{try{await fetchMessages();}catch(err){console.error('ポーリング取得エラー:',err);}},3000);},[fetchMessages]);// ポーリング停止関数\nconst stopPolling=useCallback(()=>{if(pollingIntervalRef.current){clearInterval(pollingIntervalRef.current);pollingIntervalRef.current=null;}},[]);// WebSocket接続関数\nconst connectWebSocket=useCallback(()=>{if(!id||!currentUser)return;stopPolling();try{console.log('WebSocket接続試行中...');const wsUrl=process.env.NODE_ENV==='development'?'wss://'+window.location.host+'/nikko/fanfarm/ws':\"wss://\".concat(window.location.host,\"/nikko/fanfarm/ws\");console.log('WebSocket URL:',wsUrl);const ws=new WebSocket(wsUrl);wsRef.current=ws;ws.onopen=()=>{console.log('✅ WebSocket接続成功');setIsConnected(true);setIsReconnecting(false);const joinMessage={type:'join_room',application_id:id,user_id:currentUser.id};console.log('ルーム参加メッセージ送信:',joinMessage);ws.send(JSON.stringify(joinMessage));};ws.onmessage=event=>{try{console.log('📨 WebSocketメッセージ受信:',event.data);const data=JSON.parse(event.data);switch(data.type){case'connection_confirmed':console.log('✅ 接続確認受信');break;case'room_joined':console.log('✅ ルーム参加確認:',data.room);break;case'message_sent':console.log('✅ メッセージ送信確認受信:',data.message);setMessages(prev=>prev.map(msg=>msg.tempId===data.tempId?_objectSpread(_objectSpread({},msg),{},{id:data.message.id,sending:false,created_at:data.message.created_at}):msg));break;case'new_message':console.log('💬 新着メッセージ受信:',data.message);const isOwnMessage=data.message.sender_id===currentUser.id;if(isOwnMessage){console.log('🔄 自分のメッセージなので楽観的UI更新を確定');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?_objectSpread(_objectSpread({},msg),{},{id:data.message.id,sending:false,created_at:data.message.created_at}):msg));}else{console.log('👥 他の人のメッセージを追加');setMessages(prev=>{const exists=prev.some(msg=>msg.id===data.message.id);if(exists){console.log('重複メッセージをスキップ');return prev;}const newMsg=_objectSpread(_objectSpread({},data.message),{},{message:data.message.message||data.message.content,name:data.message.sender_name||'Unknown User'});console.log('メッセージを追加:',newMsg);return[...prev,newMsg];});}break;case'message_error':console.error('❌ メッセージエラー:',data.error);setError('メッセージの送信に失敗しました');break;default:console.log('未知のメッセージタイプ:',data.type);}}catch(err){console.error('❌ WebSocketメッセージ解析エラー:',err);}};ws.onclose=event=>{console.log('🔌 WebSocket接続終了:',event.code,event.reason);setIsConnected(false);if(!isReconnecting){console.log('🔄 5秒後に再接続を試行します...');setIsReconnecting(true);reconnectTimeoutRef.current=setTimeout(()=>{connectWebSocket();},5000);}};ws.onerror=error=>{console.error('❌ WebSocketエラー:',error);setIsConnected(false);};}catch(err){console.error('❌ WebSocket接続失敗:',err);setIsConnected(false);console.log('🔄 WebSocket失敗、ポーリングモードに切り替え');startPolling();}},[id,currentUser,isReconnecting,stopPolling,startPolling]);// 初期データ取得\nuseEffect(()=>{const fetchData=async()=>{if(!id)return;try{setLoading(true);try{const detailsResponse=await Applications.getApplicationDetails(id);setApplicationDetails(detailsResponse.data);setApplication(detailsResponse.data.application);if(detailsResponse.data.messages){setMessages(detailsResponse.data.messages);}else{await fetchMessages();}}catch(detailsErr){console.log('詳細取得失敗、通常の取得方法にフォールバック',detailsErr);const applicationResponse=await Applications.getById(id);setApplication(applicationResponse.data);await fetchMessages();}setLoading(false);}catch(err){console.error('データ取得エラー:',err);setError('情報の取得に失敗しました');setLoading(false);}};fetchData();},[id,fetchMessages]);// WebSocket接続の開始(個別メッセージタブの場合のみ)\nuseEffect(()=>{if(!loading&¤tUser&&id&&activeTab==='individual'){console.log('🚀 個別メッセージ用WebSocket接続を開始します');connectWebSocket();}return()=>{if(wsRef.current){console.log('🧹 WebSocket接続をクリーンアップ');wsRef.current.close();}if(reconnectTimeoutRef.current){clearTimeout(reconnectTimeoutRef.current);}stopPolling();};},[loading,currentUser,id,activeTab,connectWebSocket,stopPolling]);// メッセージリストの自動スクロール\nuseEffect(()=>{if(messageListRef.current){messageListRef.current.scrollTop=messageListRef.current.scrollHeight;}},[messages]);const handleSubmit=async e=>{e.preventDefault();if(!newMessage.trim())return;const messageContent=newMessage.trim();const tempId=Date.now();console.log('📤 メッセージ送信開始:',messageContent);const optimisticMessage={id:tempId,tempId:tempId,message:messageContent,sender_id:currentUser.id,name:currentUser.name,created_at:new Date().toISOString(),sending:true};setMessages(prev=>[...prev,optimisticMessage]);setNewMessage('');try{if(isConnected&&wsRef.current&&wsRef.current.readyState===WebSocket.OPEN){const wsMessage={type:'message',application_id:parseInt(id),sender_id:currentUser.id,content:messageContent,tempId:tempId};console.log('📡 WebSocket経由でメッセージ送信:',wsMessage);wsRef.current.send(JSON.stringify(wsMessage));setTimeout(()=>{setMessages(prev=>prev.map(msg=>msg.tempId===tempId?_objectSpread(_objectSpread({},msg),{},{sending:false}):msg));},1000);}else{console.log('🔄 HTTP API経由でメッセージ送信(WebSocket未接続)');await Messages.send(id,{sender_id:currentUser.id,message:messageContent});await fetchMessages();}}catch(err){console.error('❌ メッセージ送信エラー:',err);setError('メッセージの送信に失敗しました');setMessages(prev=>prev.filter(msg=>msg.tempId!==tempId));setNewMessage(messageContent);}};const handleBack=()=>{navigate('/profile');};const handleTabChange=tab=>{setActiveTab(tab);};if(loading){return/*#__PURE__*/_jsx(MessageBoardContainer,{children:/*#__PURE__*/_jsx(Loading,{children:\"\\u8AAD\\u307F\\u8FBC\\u307F\\u4E2D...\"})});}if(error&&!application){return/*#__PURE__*/_jsxs(MessageBoardContainer,{children:[/*#__PURE__*/_jsx(Error,{children:error}),/*#__PURE__*/_jsx(BackButton,{$secondary:true,onClick:handleBack,children:\"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"})]});}if(!application){return/*#__PURE__*/_jsxs(MessageBoardContainer,{children:[/*#__PURE__*/_jsx(Error,{children:\"\\u5FDC\\u52DF\\u60C5\\u5831\\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F\"}),/*#__PURE__*/_jsx(BackButton,{$secondary:true,onClick:handleBack,children:\"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"})]});}const isFarmer=currentUser.user_type==='farmer';const jobPostingId=application.job_posting_id;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;return/*#__PURE__*/_jsxs(MessageBoardContainer,{children:[/*#__PURE__*/_jsx(Title,{children:\"\\u30E1\\u30C3\\u30BB\\u30FC\\u30B8\"}),/*#__PURE__*/_jsxs(JobInfoCard,{children:[/*#__PURE__*/_jsx(JobTitle,{children:application.company_name}),/*#__PURE__*/_jsxs(JobDetailItem,{children:[/*#__PURE__*/_jsx(JobLabel,{children:\"\\u52E4\\u52D9\\u5730:\"}),application.location]}),/*#__PURE__*/_jsxs(JobDetailItem,{children:[/*#__PURE__*/_jsx(JobLabel,{children:\"\\u5FDC\\u52DF\\u72B6\\u6CC1:\"}),application.status==='pending'?'応募中':application.status==='accepted'?'採用':application.status==='cancelled'?'応募取消':application.status]}),isFarmer&&applicationDetails&&/*#__PURE__*/_jsxs(ParticipantInfo,{children:[/*#__PURE__*/_jsxs(JobDetailItem,{children:[/*#__PURE__*/_jsx(JobLabel,{children:\"\\u5FDC\\u52DF\\u8005:\"}),applicationDetails.application.applicant_name||'応募者']}),applicationDetails.application.applicant_email&&/*#__PURE__*/_jsxs(JobDetailItem,{children:[/*#__PURE__*/_jsx(JobLabel,{children:\"\\u9023\\u7D61\\u5148:\"}),applicationDetails.application.applicant_email,applicationDetails.application.applicant_phone&&\" / \".concat(applicationDetails.application.applicant_phone)]})]}),!isFarmer&&application.contact&&/*#__PURE__*/_jsx(ParticipantInfo,{children:/*#__PURE__*/_jsxs(JobDetailItem,{children:[/*#__PURE__*/_jsx(JobLabel,{children:\"\\u9023\\u7D61\\u5148:\"}),application.contact]})})]}),/*#__PURE__*/_jsx(MessageTabs,{activeTab:activeTab,onTabChange:handleTabChange}),/*#__PURE__*/_jsx(TabContentContainer,{children:activeTab==='group'?/*#__PURE__*//* グループチャット */_jsx(GroupChatComponent,{jobId:jobPostingId,jobOwnerId:jobOwnerId}):/*#__PURE__*//* 個別メッセージ(既存機能) */_jsxs(_Fragment,{children:[/*#__PURE__*/_jsxs(ConnectionStatus,{$connected:isConnected,children:[/*#__PURE__*/_jsx(StatusIndicator,{$connected:isConnected}),isConnected?'リアルタイム接続中':isReconnecting?'再接続中...':'オフラインモード(ポーリング)']}),/*#__PURE__*/_jsxs(MessageContainer,{children:[/*#__PURE__*/_jsx(MessageList,{ref:messageListRef,children:messages.length===0?/*#__PURE__*/_jsx(NoMessages,{children:\"\\u30E1\\u30C3\\u30BB\\u30FC\\u30B8\\u306F\\u307E\\u3060\\u3042\\u308A\\u307E\\u305B\\u3093\\u3002\"}):messages.map(message=>/*#__PURE__*/_jsxs(Message,{$sent:message.sender_id===currentUser.id,children:[/*#__PURE__*/_jsxs(MessageBubble,{$sent:message.sender_id===currentUser.id,$sending:message.sending,children:[message.sending&&/*#__PURE__*/_jsx(SendingIndicator,{}),message.message]}),/*#__PURE__*/_jsxs(MessageInfo,{children:[message.name,\" \\u2022 \",new Date(message.created_at).toLocaleString('ja-JP'),message.sending&&' • 送信中...']})]},message.id||message.tempId))}),/*#__PURE__*/_jsxs(MessageForm,{onSubmit:handleSubmit,children:[/*#__PURE__*/_jsx(MessageInput,{value:newMessage,onChange:e=>setNewMessage(e.target.value),placeholder:isConnected?\"メッセージを入力してください\":\"オフラインモード(送信まで時間がかかります)\",disabled:loading}),/*#__PURE__*/_jsx(SendButton,{type:\"submit\",disabled:!newMessage.trim()||loading,children:\"\\u9001\\u4FE1\"})]})]})]})}),/*#__PURE__*/_jsx(BackButton,{$secondary:true,onClick:handleBack,children:\"\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u306B\\u623B\\u308B\"})]});};export default MessageBoard;","map":{"version":3,"names":["React","useState","useEffect","useContext","useRef","useCallback","useParams","useNavigate","useSearchParams","styled","Messages","Applications","AuthContext","Button","Card","MessageTabs","GroupChatComponent","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","MessageBoardContainer","div","_templateObject","_taggedTemplateLiteral","Title","h1","_templateObject2","ConnectionStatus","_templateObject3","props","$connected","StatusIndicator","span","_templateObject4","JobInfoCard","_templateObject5","JobTitle","h2","_templateObject6","JobDetailItem","p","_templateObject7","JobLabel","_templateObject8","MessageContainer","_templateObject9","MessageList","_templateObject0","Message","_templateObject1","$sent","MessageBubble","_templateObject10","$sending","SendingIndicator","_templateObject11","MessageInfo","_templateObject12","MessageForm","form","_templateObject13","MessageInput","textarea","_templateObject14","SendButton","_templateObject15","NoMessages","_templateObject16","Loading","_templateObject17","Error","_templateObject18","BackButton","_templateObject19","ParticipantInfo","_templateObject20","TabContentContainer","_templateObject21","MessageBoard","_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","concat","ws","WebSocket","onopen","joinMessage","type","application_id","user_id","send","JSON","stringify","onmessage","event","parse","room","message","prev","map","msg","tempId","_objectSpread","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","$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"],"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/fanfarm/ws'\n : `wss://${window.location.host}/nikko/fanfarm/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":[]}