{"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;// src/components/message/GroupChat.js - ポーリングフォールバック対応版\nimport React,{useState,useEffect,useRef,useCallback,useContext}from'react';import styled from'styled-components';import{GroupChat as GroupChatAPI}from'../../api/api';import{AuthContext}from'../../context/AuthContext';import Button from'../common/Button';import AnonymousNameModal from'./AnonymousNameModal';import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";const Container=styled.div(_templateObject||(_templateObject=_taggedTemplateLiteral([\"\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\"])));const ConnectionStatus=styled.div(_templateObject2||(_templateObject2=_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(_templateObject3||(_templateObject3=_taggedTemplateLiteral([\"\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background: \",\";\\n margin-right: 8px;\\n\"])),props=>props.$connected?'#28a745':'#ffc107');const MembersBar=styled.div(_templateObject4||(_templateObject4=_taggedTemplateLiteral([\"\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 12px;\\n background: var(--background-color);\\n border-radius: var(--border-radius);\\n margin-bottom: 16px;\\n flex-wrap: wrap;\\n\"])));const MemberBadge=styled.span(_templateObject5||(_templateObject5=_taggedTemplateLiteral([\"\\n padding: 4px 12px;\\n background: \",\";\\n color: \",\";\\n border: 1px solid \",\";\\n border-radius: 16px;\\n font-size: 14px;\\n cursor: \",\";\\n\\n &:hover {\\n background: \",\";\\n }\\n\"])),props=>props.$isOwner?'var(--primary-color)':'white',props=>props.$isOwner?'white':'var(--text-color)',props=>props.$isOwner?'var(--primary-color)':'var(--border-color)',props=>props.$clickable?'pointer':'default',props=>props.$clickable?'var(--background-color)':'');const MembersLabel=styled.span(_templateObject6||(_templateObject6=_taggedTemplateLiteral([\"\\n font-weight: bold;\\n color: var(--text-light);\\n font-size: 14px;\\n\"])));const MessageList=styled.div(_templateObject7||(_templateObject7=_taggedTemplateLiteral([\"\\n flex-grow: 1;\\n overflow-y: auto;\\n margin-bottom: 16px;\\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(_templateObject8||(_templateObject8=_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(_templateObject9||(_templateObject9=_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\"])),props=>{if(props.$isOwner&&!props.$sent)return'var(--primary-color)';if(props.$sent)return'#4a9c5d';return'var(--background-color)';},props=>props.$isOwner&&!props.$sent||props.$sent?'white':'var(--text-color)',props=>props.$sending?0.7:1);const MessageInfo=styled.div(_templateObject0||(_templateObject0=_taggedTemplateLiteral([\"\\n font-size: 12px;\\n color: var(--text-light);\\n margin-top: 4px;\\n\"])));const MentionTag=styled.span(_templateObject1||(_templateObject1=_taggedTemplateLiteral([\"\\n background: rgba(255, 255, 255, 0.2);\\n padding: 2px 6px;\\n border-radius: 4px;\\n margin-right: 4px;\\n font-size: 12px;\\n\"])));const MessageForm=styled.form(_templateObject10||(_templateObject10=_taggedTemplateLiteral([\"\\n display: flex;\\n gap: 12px;\\n align-items: flex-end;\\n\\n @media (max-width: 768px) {\\n flex-direction: column;\\n gap: 8px;\\n }\\n\"])));const InputWrapper=styled.div(_templateObject11||(_templateObject11=_taggedTemplateLiteral([\"\\n flex-grow: 1;\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n\"])));const MentionSelect=styled.select(_templateObject12||(_templateObject12=_taggedTemplateLiteral([\"\\n padding: 8px 12px;\\n border: 2px solid var(--border-color);\\n border-radius: var(--border-radius);\\n font-size: 14px;\\n background: white;\\n\\n &:focus {\\n outline: none;\\n border-color: var(--primary-color);\\n }\\n\"])));const MessageInput=styled.textarea(_templateObject13||(_templateObject13=_taggedTemplateLiteral([\"\\n width: 100%;\\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: 60px;\\n\\n &:focus {\\n outline: none;\\n border-color: var(--primary-color);\\n }\\n\"])));const SendButton=styled(Button)(_templateObject14||(_templateObject14=_taggedTemplateLiteral([\"\\n height: fit-content;\\n\"])));const NoMessages=styled.p(_templateObject15||(_templateObject15=_taggedTemplateLiteral([\"\\n text-align: center;\\n font-size: 16px;\\n color: var(--text-light);\\n margin: 48px 0;\\n\"])));const Loading=styled.p(_templateObject16||(_templateObject16=_taggedTemplateLiteral([\"\\n text-align: center;\\n font-size: 16px;\\n color: var(--text-light);\\n margin: 24px 0;\\n\"])));const ErrorText=styled.p(_templateObject17||(_templateObject17=_taggedTemplateLiteral([\"\\n text-align: center;\\n color: var(--error-color);\\n margin: 24px 0;\\n\"])));// 日付フォーマット関数(Firefox対応)\nconst formatDate=dateString=>{if(!dateString)return'';try{// SQLiteのdatetime形式対応\nconst normalized=dateString.replace(' ','T');const date=new Date(normalized);if(isNaN(date.getTime())){return dateString;}return date.toLocaleString('ja-JP');}catch(e){return dateString;}};const GroupChatComponent=_ref=>{let{jobId,jobOwnerId}=_ref;const{currentUser}=useContext(AuthContext);const[membership,setMembership]=useState(null);const[members,setMembers]=useState([]);const[messages,setMessages]=useState([]);const[newMessage,setNewMessage]=useState('');const[mentionUserId,setMentionUserId]=useState('');const[loading,setLoading]=useState(true);const[error,setError]=useState('');const[showNameModal,setShowNameModal]=useState(false);const[isConnected,setIsConnected]=useState(false);const[isOwner,setIsOwner]=useState(false);const[usePolling,setUsePolling]=useState(false);const messageListRef=useRef(null);const wsRef=useRef(null);const pollingIntervalRef=useRef(null);const reconnectAttempts=useRef(0);const maxReconnectAttempts=3;// メンバーシップ確認\nconst checkMembership=useCallback(async()=>{if(!currentUser)return false;try{const response=await GroupChatAPI.getMembership(jobId,currentUser.id);if(response.data.is_member){setMembership(response.data.membership);setIsOwner(response.data.membership.is_owner===1);return true;}else if(response.data.is_owner){setShowNameModal(true);setIsOwner(true);return false;}else{setShowNameModal(true);return false;}}catch(err){console.error('メンバーシップ確認エラー',err);setError('グループチャットの確認に失敗しました');return false;}},[jobId,currentUser]);// メンバー取得\nconst fetchMembers=useCallback(async()=>{if(!currentUser)return;try{const response=await GroupChatAPI.getMembers(jobId,currentUser.id);setMembers(response.data.members);}catch(err){console.error('メンバー取得エラー',err);}},[jobId,currentUser]);// メッセージ取得\nconst fetchMessages=useCallback(async()=>{if(!currentUser)return;try{const response=await GroupChatAPI.getMessages(jobId,currentUser.id);setMessages(response.data.messages);}catch(err){console.error('メッセージ取得エラー',err);}},[jobId,currentUser]);// ポーリング開始\nconst startPolling=useCallback(()=>{console.log('📡 ポーリングモード開始');setUsePolling(true);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;}setUsePolling(false);},[]);// WebSocket接続\nconst connectWebSocket=useCallback(()=>{if(!currentUser||!membership)return;// 再接続回数超過でポーリングに切り替え\nif(reconnectAttempts.current>=maxReconnectAttempts){console.log('🔄 WebSocket再接続上限、ポーリングモードに切り替え');startPolling();return;}try{const protocol=window.location.protocol==='https:'?'wss:':'ws:';const host=window.location.host;const wsUrl=\"\".concat(protocol,\"//\").concat(host,\"/nikko/ws\");console.log('WebSocket接続試行中...',wsUrl);const ws=new WebSocket(wsUrl);wsRef.current=ws;ws.onopen=()=>{console.log('✅ グループチャットWebSocket接続成功');setIsConnected(true);stopPolling();reconnectAttempts.current=0;ws.send(JSON.stringify({type:'join_group_room',job_posting_id:jobId,user_id:currentUser.id,is_owner:isOwner}));};ws.onmessage=event=>{try{const data=JSON.parse(event.data);switch(data.type){case'group_room_joined':console.log('✅ グループルーム参加確認');break;case'group_message_sent':setMessages(prev=>prev.map(msg=>msg.tempId===data.tempId?_objectSpread(_objectSpread({},msg),{},{id:data.message.id,sending:false}):msg));break;case'new_group_message':setMessages(prev=>{const exists=prev.some(msg=>msg.id===data.message.id);if(exists)return prev;return[...prev,data.message];});break;case'group_message_error':setError('メッセージの送信に失敗しました');break;default:break;}}catch(err){console.error('WebSocketメッセージ解析エラー',err);}};ws.onclose=()=>{console.log('🔌 グループチャットWebSocket切断');setIsConnected(false);reconnectAttempts.current+=1;if(reconnectAttempts.current<maxReconnectAttempts){setTimeout(()=>{if(membership)connectWebSocket();},5000);}else{console.log('🔄 再接続上限、ポーリングモードに切り替え');startPolling();}};ws.onerror=error=>{console.error('WebSocketエラー',error);setIsConnected(false);};}catch(err){console.error('❌ WebSocket接続失敗:',err);setIsConnected(false);startPolling();}},[currentUser,membership,jobId,isOwner,startPolling,stopPolling]);// 初期化\nuseEffect(()=>{const initialize=async()=>{setLoading(true);const isMember=await checkMembership();if(isMember){await fetchMembers();await fetchMessages();}setLoading(false);};initialize();},[checkMembership,fetchMembers,fetchMessages]);// WebSocket接続開始\nuseEffect(()=>{if(membership&&!loading){connectWebSocket();}return()=>{if(wsRef.current){wsRef.current.close();}stopPolling();};},[membership,loading,connectWebSocket,stopPolling]);// 自動スクロール\nuseEffect(()=>{if(messageListRef.current){messageListRef.current.scrollTop=messageListRef.current.scrollHeight;}},[messages]);// 参加完了ハンドラ\nconst handleJoinComplete=async anonymousName=>{setShowNameModal(false);setMembership({anonymous_name:anonymousName,is_owner:isOwner?1:0});await fetchMembers();await fetchMessages();};// メッセージ送信\nconst handleSubmit=async e=>{e.preventDefault();if(!newMessage.trim()||!membership)return;const messageContent=newMessage.trim();const tempId=Date.now();const optimisticMessage={id:tempId,tempId:tempId,message:messageContent,sender_id:currentUser.id,sender_name:membership.anonymous_name,sender_is_owner:isOwner?1:0,mentioned_user_id:mentionUserId||null,created_at:new Date().toISOString(),sending:true};setMessages(prev=>[...prev,optimisticMessage]);setNewMessage('');setMentionUserId('');try{var _wsRef$current;if(isConnected&&((_wsRef$current=wsRef.current)===null||_wsRef$current===void 0?void 0:_wsRef$current.readyState)===WebSocket.OPEN){wsRef.current.send(JSON.stringify({type:'group_message',job_posting_id:jobId,sender_id:currentUser.id,content:messageContent,mentioned_user_id:mentionUserId||null,tempId:tempId}));}else{// HTTP APIフォールバック\nawait GroupChatAPI.sendMessage(jobId,{sender_id:currentUser.id,message:messageContent,mentioned_user_id:mentionUserId||null});// 送信完了を反映\nsetMessages(prev=>prev.map(msg=>msg.tempId===tempId?_objectSpread(_objectSpread({},msg),{},{sending:false}):msg));// 最新メッセージを取得\nawait fetchMessages();}}catch(err){console.error('メッセージ送信エラー',err);setMessages(prev=>prev.filter(msg=>msg.tempId!==tempId));setNewMessage(messageContent);setError('メッセージの送信に失敗しました');}};// ニックネーム選択モーダル\nif(showNameModal){return/*#__PURE__*/_jsx(AnonymousNameModal,{jobId:jobId,userId:currentUser===null||currentUser===void 0?void 0:currentUser.id,onJoin:handleJoinComplete,onCancel:()=>setShowNameModal(false)});}if(loading){return/*#__PURE__*/_jsx(Loading,{children:\"\\u8AAD\\u307F\\u8FBC\\u307F\\u4E2D...\"});}if(error&&!membership){return/*#__PURE__*/_jsx(ErrorText,{children:error});}if(!membership){return/*#__PURE__*/_jsx(Loading,{children:\"\\u30B0\\u30EB\\u30FC\\u30D7\\u30C1\\u30E3\\u30C3\\u30C8\\u306B\\u53C2\\u52A0\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\"});}return/*#__PURE__*/_jsxs(Container,{children:[/*#__PURE__*/_jsxs(ConnectionStatus,{$connected:isConnected,children:[/*#__PURE__*/_jsx(StatusIndicator,{$connected:isConnected}),isConnected?'リアルタイム接続中':usePolling?'オフラインモード(自動更新中)':'接続中...']}),/*#__PURE__*/_jsxs(MembersBar,{children:[/*#__PURE__*/_jsx(MembersLabel,{children:\"\\u53C2\\u52A0\\u8005:\"}),members.map(member=>/*#__PURE__*/_jsxs(MemberBadge,{$isOwner:member.is_owner===1,$clickable:isOwner&&member.is_owner!==1,onClick:()=>{if(isOwner&&member.is_owner!==1){setMentionUserId(member.user_id.toString());}},children:[member.anonymous_name,member.is_owner===1&&' (求人主)']},member.id))]}),/*#__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\"}):messages.map(msg=>{var _members$find;return/*#__PURE__*/_jsxs(Message,{$sent:msg.sender_id===currentUser.id,children:[/*#__PURE__*/_jsxs(MessageBubble,{$sent:msg.sender_id===currentUser.id,$isOwner:msg.sender_is_owner===1,$sending:msg.sending,children:[msg.mentioned_user_id&&/*#__PURE__*/_jsxs(MentionTag,{children:[\"@\",((_members$find=members.find(m=>m.user_id===msg.mentioned_user_id))===null||_members$find===void 0?void 0:_members$find.anonymous_name)||'---']}),msg.message]}),/*#__PURE__*/_jsxs(MessageInfo,{children:[msg.sender_name,msg.sender_is_owner===1&&' (求人主)',' • ',formatDate(msg.created_at),msg.sending&&' • 送信中...']})]},msg.id||msg.tempId);})}),/*#__PURE__*/_jsxs(MessageForm,{onSubmit:handleSubmit,children:[/*#__PURE__*/_jsxs(InputWrapper,{children:[isOwner&&members.length>1&&/*#__PURE__*/_jsxs(MentionSelect,{value:mentionUserId,onChange:e=>setMentionUserId(e.target.value),children:[/*#__PURE__*/_jsx(\"option\",{value:\"\",children:\"\\u5168\\u54E1\\u306B\\u9001\\u4FE1\"}),members.filter(m=>m.is_owner!==1).map(m=>/*#__PURE__*/_jsxs(\"option\",{value:m.user_id,children:[\"@\",m.anonymous_name,\" \\u306B\\u9001\\u4FE1\"]},m.user_id))]}),/*#__PURE__*/_jsx(MessageInput,{value:newMessage,onChange:e=>setNewMessage(e.target.value),placeholder:\"\\u30E1\\u30C3\\u30BB\\u30FC\\u30B8\\u3092\\u5165\\u529B...\"})]}),/*#__PURE__*/_jsx(SendButton,{type:\"submit\",disabled:!newMessage.trim(),children:\"\\u9001\\u4FE1\"})]})]});};export default GroupChatComponent;","map":{"version":3,"names":["React","useState","useEffect","useRef","useCallback","useContext","styled","GroupChat","GroupChatAPI","AuthContext","Button","AnonymousNameModal","jsx","_jsx","jsxs","_jsxs","Container","div","_templateObject","_taggedTemplateLiteral","ConnectionStatus","_templateObject2","props","$connected","StatusIndicator","span","_templateObject3","MembersBar","_templateObject4","MemberBadge","_templateObject5","$isOwner","$clickable","MembersLabel","_templateObject6","MessageList","_templateObject7","Message","_templateObject8","$sent","MessageBubble","_templateObject9","$sending","MessageInfo","_templateObject0","MentionTag","_templateObject1","MessageForm","form","_templateObject10","InputWrapper","_templateObject11","MentionSelect","select","_templateObject12","MessageInput","textarea","_templateObject13","SendButton","_templateObject14","NoMessages","p","_templateObject15","Loading","_templateObject16","ErrorText","_templateObject17","formatDate","dateString","normalized","replace","date","Date","isNaN","getTime","toLocaleString","e","GroupChatComponent","_ref","jobId","jobOwnerId","currentUser","membership","setMembership","members","setMembers","messages","setMessages","newMessage","setNewMessage","mentionUserId","setMentionUserId","loading","setLoading","error","setError","showNameModal","setShowNameModal","isConnected","setIsConnected","isOwner","setIsOwner","usePolling","setUsePolling","messageListRef","wsRef","pollingIntervalRef","reconnectAttempts","maxReconnectAttempts","checkMembership","response","getMembership","id","data","is_member","is_owner","err","console","fetchMembers","getMembers","fetchMessages","getMessages","startPolling","log","current","clearInterval","setInterval","stopPolling","connectWebSocket","protocol","window","location","host","wsUrl","concat","ws","WebSocket","onopen","send","JSON","stringify","type","job_posting_id","user_id","onmessage","event","parse","prev","map","msg","tempId","_objectSpread","message","sending","exists","some","onclose","setTimeout","onerror","initialize","isMember","close","scrollTop","scrollHeight","handleJoinComplete","anonymousName","anonymous_name","handleSubmit","preventDefault","trim","messageContent","now","optimisticMessage","sender_id","sender_name","sender_is_owner","mentioned_user_id","created_at","toISOString","_wsRef$current","readyState","OPEN","content","sendMessage","filter","userId","onJoin","onCancel","children","member","onClick","toString","ref","length","_members$find","find","m","onSubmit","value","onChange","target","placeholder","disabled"],"sources":["/home/fanfarm/FanFarm/system/V3fanfarm-ubuntu-local/V3fanfarm-frontend/src/components/message/GroupChat.js"],"sourcesContent":["// src/components/message/GroupChat.js - ポーリングフォールバック対応版\nimport React, { useState, useEffect, useRef, useCallback, useContext } from 'react';\nimport styled from 'styled-components';\nimport { GroupChat as GroupChatAPI } from '../../api/api';\nimport { AuthContext } from '../../context/AuthContext';\nimport Button from '../common/Button';\nimport AnonymousNameModal from './AnonymousNameModal';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\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 MembersBar = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: var(--background-color);\n border-radius: var(--border-radius);\n margin-bottom: 16px;\n flex-wrap: wrap;\n`;\n\nconst MemberBadge = styled.span`\n padding: 4px 12px;\n background: ${props => props.$isOwner ? 'var(--primary-color)' : 'white'};\n color: ${props => props.$isOwner ? 'white' : 'var(--text-color)'};\n border: 1px solid ${props => props.$isOwner ? 'var(--primary-color)' : 'var(--border-color)'};\n border-radius: 16px;\n font-size: 14px;\n cursor: ${props => props.$clickable ? 'pointer' : 'default'};\n\n &:hover {\n background: ${props => props.$clickable ? 'var(--background-color)' : ''};\n }\n`;\n\nconst MembersLabel = styled.span`\n font-weight: bold;\n color: var(--text-light);\n font-size: 14px;\n`;\n\nconst MessageList = styled.div`\n flex-grow: 1;\n overflow-y: auto;\n margin-bottom: 16px;\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 => {\n if (props.$isOwner && !props.$sent) return 'var(--primary-color)';\n if (props.$sent) return '#4a9c5d';\n return 'var(--background-color)';\n }};\n color: ${props => (props.$isOwner && !props.$sent) || props.$sent ? '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`;\n\nconst MessageInfo = styled.div`\n font-size: 12px;\n color: var(--text-light);\n margin-top: 4px;\n`;\n\nconst MentionTag = styled.span`\n background: rgba(255, 255, 255, 0.2);\n padding: 2px 6px;\n border-radius: 4px;\n margin-right: 4px;\n font-size: 12px;\n`;\n\nconst MessageForm = styled.form`\n display: flex;\n gap: 12px;\n align-items: flex-end;\n\n @media (max-width: 768px) {\n flex-direction: column;\n gap: 8px;\n }\n`;\n\nconst InputWrapper = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nconst MentionSelect = styled.select`\n padding: 8px 12px;\n border: 2px solid var(--border-color);\n border-radius: var(--border-radius);\n font-size: 14px;\n background: white;\n\n &:focus {\n outline: none;\n border-color: var(--primary-color);\n }\n`;\n\nconst MessageInput = styled.textarea`\n width: 100%;\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: 60px;\n\n &:focus {\n outline: none;\n border-color: var(--primary-color);\n }\n`;\n\nconst SendButton = styled(Button)`\n height: fit-content;\n`;\n\nconst NoMessages = styled.p`\n text-align: center;\n font-size: 16px;\n color: var(--text-light);\n margin: 48px 0;\n`;\n\nconst Loading = styled.p`\n text-align: center;\n font-size: 16px;\n color: var(--text-light);\n margin: 24px 0;\n`;\n\nconst ErrorText = styled.p`\n text-align: center;\n color: var(--error-color);\n margin: 24px 0;\n`;\n\n// 日付フォーマット関数(Firefox対応)\nconst formatDate = (dateString) => {\n if (!dateString) return '';\n try {\n // SQLiteのdatetime形式対応\n const normalized = dateString.replace(' ', 'T');\n const date = new Date(normalized);\n if (isNaN(date.getTime())) {\n return dateString;\n }\n return date.toLocaleString('ja-JP');\n } catch (e) {\n return dateString;\n }\n};\n\nconst GroupChatComponent = ({ jobId, jobOwnerId }) => {\n const { currentUser } = useContext(AuthContext);\n const [membership, setMembership] = useState(null);\n const [members, setMembers] = useState([]);\n const [messages, setMessages] = useState([]);\n const [newMessage, setNewMessage] = useState('');\n const [mentionUserId, setMentionUserId] = useState('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [showNameModal, setShowNameModal] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [isOwner, setIsOwner] = useState(false);\n const [usePolling, setUsePolling] = useState(false);\n const messageListRef = useRef(null);\n const wsRef = useRef(null);\n const pollingIntervalRef = useRef(null);\n const reconnectAttempts = useRef(0);\n const maxReconnectAttempts = 3;\n\n // メンバーシップ確認\n const checkMembership = useCallback(async () => {\n if (!currentUser) return false;\n\n try {\n const response = await GroupChatAPI.getMembership(jobId, currentUser.id);\n \n if (response.data.is_member) {\n setMembership(response.data.membership);\n setIsOwner(response.data.membership.is_owner === 1);\n return true;\n } else if (response.data.is_owner) {\n setShowNameModal(true);\n setIsOwner(true);\n return false;\n } else {\n setShowNameModal(true);\n return false;\n }\n } catch (err) {\n console.error('メンバーシップ確認エラー', err);\n setError('グループチャットの確認に失敗しました');\n return false;\n }\n }, [jobId, currentUser]);\n\n // メンバー取得\n const fetchMembers = useCallback(async () => {\n if (!currentUser) return;\n\n try {\n const response = await GroupChatAPI.getMembers(jobId, currentUser.id);\n setMembers(response.data.members);\n } catch (err) {\n console.error('メンバー取得エラー', err);\n }\n }, [jobId, currentUser]);\n\n // メッセージ取得\n const fetchMessages = useCallback(async () => {\n if (!currentUser) return;\n\n try {\n const response = await GroupChatAPI.getMessages(jobId, currentUser.id);\n setMessages(response.data.messages);\n } catch (err) {\n console.error('メッセージ取得エラー', err);\n }\n }, [jobId, currentUser]);\n\n // ポーリング開始\n const startPolling = useCallback(() => {\n console.log('📡 ポーリングモード開始');\n setUsePolling(true);\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 setUsePolling(false);\n }, []);\n\n // WebSocket接続\n const connectWebSocket = useCallback(() => {\n if (!currentUser || !membership) return;\n\n // 再接続回数超過でポーリングに切り替え\n if (reconnectAttempts.current >= maxReconnectAttempts) {\n console.log('🔄 WebSocket再接続上限、ポーリングモードに切り替え');\n startPolling();\n return;\n }\n\n try {\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n const host = window.location.host;\n const wsUrl = `${protocol}//${host}/nikko/ws`;\n\n console.log('WebSocket接続試行中...', wsUrl);\n const ws = new WebSocket(wsUrl);\n wsRef.current = ws;\n\n ws.onopen = () => {\n console.log('✅ グループチャットWebSocket接続成功');\n setIsConnected(true);\n stopPolling();\n reconnectAttempts.current = 0;\n\n ws.send(JSON.stringify({\n type: 'join_group_room',\n job_posting_id: jobId,\n user_id: currentUser.id,\n is_owner: isOwner\n }));\n };\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n\n switch (data.type) {\n case 'group_room_joined':\n console.log('✅ グループルーム参加確認');\n break;\n\n case 'group_message_sent':\n setMessages(prev => prev.map(msg =>\n msg.tempId === data.tempId\n ? { ...msg, id: data.message.id, sending: false }\n : msg\n ));\n break;\n\n case 'new_group_message':\n setMessages(prev => {\n const exists = prev.some(msg => msg.id === data.message.id);\n if (exists) return prev;\n return [...prev, data.message];\n });\n break;\n\n case 'group_message_error':\n setError('メッセージの送信に失敗しました');\n break;\n\n default:\n break;\n }\n } catch (err) {\n console.error('WebSocketメッセージ解析エラー', err);\n }\n };\n\n ws.onclose = () => {\n console.log('🔌 グループチャットWebSocket切断');\n setIsConnected(false);\n \n reconnectAttempts.current += 1;\n \n if (reconnectAttempts.current < maxReconnectAttempts) {\n setTimeout(() => {\n if (membership) connectWebSocket();\n }, 5000);\n } else {\n console.log('🔄 再接続上限、ポーリングモードに切り替え');\n startPolling();\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 startPolling();\n }\n }, [currentUser, membership, jobId, isOwner, startPolling, stopPolling]);\n\n // 初期化\n useEffect(() => {\n const initialize = async () => {\n setLoading(true);\n const isMember = await checkMembership();\n \n if (isMember) {\n await fetchMembers();\n await fetchMessages();\n }\n \n setLoading(false);\n };\n\n initialize();\n }, [checkMembership, fetchMembers, fetchMessages]);\n\n // WebSocket接続開始\n useEffect(() => {\n if (membership && !loading) {\n connectWebSocket();\n }\n\n return () => {\n if (wsRef.current) {\n wsRef.current.close();\n }\n stopPolling();\n };\n }, [membership, loading, connectWebSocket, stopPolling]);\n\n // 自動スクロール\n useEffect(() => {\n if (messageListRef.current) {\n messageListRef.current.scrollTop = messageListRef.current.scrollHeight;\n }\n }, [messages]);\n\n // 参加完了ハンドラ\n const handleJoinComplete = async (anonymousName) => {\n setShowNameModal(false);\n setMembership({ anonymous_name: anonymousName, is_owner: isOwner ? 1 : 0 });\n \n await fetchMembers();\n await fetchMessages();\n };\n\n // メッセージ送信\n const handleSubmit = async (e) => {\n e.preventDefault();\n \n if (!newMessage.trim() || !membership) return;\n\n const messageContent = newMessage.trim();\n const tempId = Date.now();\n\n const optimisticMessage = {\n id: tempId,\n tempId: tempId,\n message: messageContent,\n sender_id: currentUser.id,\n sender_name: membership.anonymous_name,\n sender_is_owner: isOwner ? 1 : 0,\n mentioned_user_id: mentionUserId || null,\n created_at: new Date().toISOString(),\n sending: true\n };\n\n setMessages(prev => [...prev, optimisticMessage]);\n setNewMessage('');\n setMentionUserId('');\n\n try {\n if (isConnected && wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(JSON.stringify({\n type: 'group_message',\n job_posting_id: jobId,\n sender_id: currentUser.id,\n content: messageContent,\n mentioned_user_id: mentionUserId || null,\n tempId: tempId\n }));\n } else {\n // HTTP APIフォールバック\n await GroupChatAPI.sendMessage(jobId, {\n sender_id: currentUser.id,\n message: messageContent,\n mentioned_user_id: mentionUserId || null\n });\n \n // 送信完了を反映\n setMessages(prev => prev.map(msg =>\n msg.tempId === tempId\n ? { ...msg, sending: false }\n : msg\n ));\n \n // 最新メッセージを取得\n await fetchMessages();\n }\n } catch (err) {\n console.error('メッセージ送信エラー', err);\n setMessages(prev => prev.filter(msg => msg.tempId !== tempId));\n setNewMessage(messageContent);\n setError('メッセージの送信に失敗しました');\n }\n };\n\n // ニックネーム選択モーダル\n if (showNameModal) {\n return (\n <AnonymousNameModal\n jobId={jobId}\n userId={currentUser?.id}\n onJoin={handleJoinComplete}\n onCancel={() => setShowNameModal(false)}\n />\n );\n }\n\n if (loading) {\n return <Loading>読み込み中...</Loading>;\n }\n\n if (error && !membership) {\n return <ErrorText>{error}</ErrorText>;\n }\n\n if (!membership) {\n return <Loading>グループチャットに参加してください</Loading>;\n }\n\n return (\n <Container>\n <ConnectionStatus $connected={isConnected}>\n <StatusIndicator $connected={isConnected} />\n {isConnected ? 'リアルタイム接続中' : \n usePolling ? 'オフラインモード(自動更新中)' : '接続中...'}\n </ConnectionStatus>\n\n <MembersBar>\n <MembersLabel>参加者:</MembersLabel>\n {members.map((member) => (\n <MemberBadge \n key={member.id} \n $isOwner={member.is_owner === 1}\n $clickable={isOwner && member.is_owner !== 1}\n onClick={() => {\n if (isOwner && member.is_owner !== 1) {\n setMentionUserId(member.user_id.toString());\n }\n }}\n >\n {member.anonymous_name}\n {member.is_owner === 1 && ' (求人主)'}\n </MemberBadge>\n ))}\n </MembersBar>\n\n <MessageList ref={messageListRef}>\n {messages.length === 0 ? (\n <NoMessages>メッセージはまだありません</NoMessages>\n ) : (\n messages.map((msg) => (\n <Message \n key={msg.id || msg.tempId} \n $sent={msg.sender_id === currentUser.id}\n >\n <MessageBubble\n $sent={msg.sender_id === currentUser.id}\n $isOwner={msg.sender_is_owner === 1}\n $sending={msg.sending}\n >\n {msg.mentioned_user_id && (\n <MentionTag>\n @{members.find(m => m.user_id === msg.mentioned_user_id)?.anonymous_name || '---'}\n </MentionTag>\n )}\n {msg.message}\n </MessageBubble>\n <MessageInfo>\n {msg.sender_name}\n {msg.sender_is_owner === 1 && ' (求人主)'}\n {' • '}\n {formatDate(msg.created_at)}\n {msg.sending && ' • 送信中...'}\n </MessageInfo>\n </Message>\n ))\n )}\n </MessageList>\n\n <MessageForm onSubmit={handleSubmit}>\n <InputWrapper>\n {isOwner && members.length > 1 && (\n <MentionSelect\n value={mentionUserId}\n onChange={(e) => setMentionUserId(e.target.value)}\n >\n <option value=\"\">全員に送信</option>\n {members\n .filter(m => m.is_owner !== 1)\n .map(m => (\n <option key={m.user_id} value={m.user_id}>\n @{m.anonymous_name} に送信\n </option>\n ))\n }\n </MentionSelect>\n )}\n <MessageInput\n value={newMessage}\n onChange={(e) => setNewMessage(e.target.value)}\n placeholder=\"メッセージを入力...\"\n />\n </InputWrapper>\n <SendButton type=\"submit\" disabled={!newMessage.trim()}>\n 送信\n </SendButton>\n </MessageForm>\n </Container>\n );\n};\n\nexport default GroupChatComponent;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}