{"version":3,"sources":["services/platformSetting.js","services/pushNotification.js","services/read.js","services/report.js","services/role.js","services/room.js","services/setting.js","services/tags.js","services/user.js","plugin/wrap-comp.js","assets sync /^/.//.*$","assets/usdt.png","assets/user-avatar1.jpg","assets/user-avatar2.jpg","assets/user-avatar3.jpg","assets/user-avatar4.jpg","assets/wx.png","assets/bubble sync /^/.//.*$","const.js","plugin/sentry.js","store/auth.js","store/global.js","hook/useApi.js","plugin/ws.js","plugin/apollo.js","hook/useLogout.js","plugin/styled.js","store/client.js","store/room.js","store/roomMsg.js","store/subscribe.js","store/index.js","hook/useBrowser.js","components/Layout/CenterLayout.js","hook/useTrackingCode.js","views/GlobalClient.js","hook/useMe.js","hook/useRecMessage.js","hook/useRoom.js","hook/useEventListener.js","hook/useIframe.js","components/CSRoomClient/FullBg.js","hook/useRWD.js","components/CSRoomClient/Container.js","hook/useOrder.js","components/CountdownButton/index.js","components/Drawer/ClientDrawerWrap.js","views/Client/components/OrderList.js","components/ChatRoomContent/ContentWrap.js","hook/useFile.js","components/ChatRoomContent/Carousel.js","components/Icon/DoubleCheckIcon.js","components/Icon/SoundMuteIcon.js","components/Icon/index.js","components/Avatar/AvatarFetch.js","components/ChatRoomHeader/ClientHeader.js","views/Client/components/FullRoomLoading.js","components/ChatRoomContent/CSForm.js","views/Client/components/BeforeEnter.js","views/Client/components/RedirectVerifyModel.js","hook/useRoomMessage.js","hook/useBeep.js","components/ChatRoomContent/ScrollDownBtn.js","components/ChatRoomContent/index.js","hook/useDragDropFiles.js","components/InputTextArea.js","components/ChatRoomInputBar/index.js","hook/useCrypto.js","components/Msg/MsgControlItem.js","components/Msg/MsgWrap.js","components/Msg/index.js","components/Msg/MsgText/index.js","components/Msg/MsgSystem/PayList/Icons/index.js","components/Msg/MsgSystem/PayList/Icons/wx.png","components/Msg/MsgSystem/PayList/Icons/alipay.png","components/Msg/MsgSystem/PayList/Icons/bank.png","components/Msg/MsgSystem/PayList/index.js","components/Drawer/ClientOrderDetailDrawer.js","components/Msg/MsgSystem/Oder/index.js","components/Msg/MsgSystem/index.js","components/Msg/MsgImage/index.js","components/Msg/MsgBubble/index.js","components/MsgList/index.js","components/Msg/MsgInfoWrap.js","components/ResetHtmlWrap.js","views/Client/components/ConnectCSBtn.js","views/Client/components/CusFaqMsg.js","views/Client/components/CusUserMsg.js","views/Client/components/QueueInfo.js","views/Client/components/DepositToken.js","views/Client/components/UploadProofDrawer.js","components/Countdown.js","views/Client/components/QuickMsgTab.js","views/Client/CSRoom.js","views/Client/index.js","ClientApp.js","router/client.js","index.js","plugin/theme.js","services/menuList.js","assets/cs-avatar.jpg","services/index.js","hook/useCopy.js","services/Fragment.js","utils/timeFormat.js","utils/storage.js","utils/hardCode.js","utils/errorCode.js","utils/filter.js","utils/url.js","assets/alipay.svg","assets/wxUrl.svg","assets/bank.png","assets/ecnyUrl.svg","services/message.js","assets/order.png","components/ChatRoomInputBar/FrontDrop.js","assets/alipay-process.jpg","assets/wx-process.jpg","assets/bubble/icon-money.png","assets/bubble/icon-next.png","assets/proof-example.jpg","hook/useAlertMessage.js","services sync nonrecursive //.js$","services/CSRoom.js","services/Client.js","services/adTracking.js","services/canned.js","services/csForm.js","services/csRoomClientSetting.js","services/customer.js","services/faq.js","services/greeting.js","services/groupRoom.js","services/hotsDenys.js","services/login.js","services/monitor.js","services/origin.js","services/others.js"],"names":["LIST_PLATFORM_SETTING","gql","GET_PLATFORM_SETTING","UPDATE_PLATFORM_SETTING","LIST_PLATFORM_MORE_INFO","UPDATE_PLATFORM_MORE_INFO","LIST_CS_QUEUE_QUS","CREATED_CS_QUEUE_QUS","UPDATE_CS_QUEUE_QUS","DELETE_CS_QUEUE_QUS","LIST_PUSH","CREATE_PUSH","CANCEL_PUSH","UPDATE_IN_ROOM","UPDATE_LAST_READ_MSG","REPORT_COMMON_USER","REPORT_CONSULTING_ROOM","REPORT_CONSULTING_ROOM_SERVICE","REPORT_CONSULTING_ROOM_SERVICE_AREA","REPORT_STATISTICS_CONSULTING_ROOM_AREA","REPORT_CUSTOMER_SERVICE","LIST_ROLE","COMMENT_MENU","GET_ROLE","CREATED_ROLE","UPDATE_ROLE","DELETE_ROLE","LIST_USER_ROLE","CREATE_USER_ROLE","DELETE_USER_ROLE","LIST_DIRECT_ROOM","COMMENT_USER_ROOMS","UPDATE_ROOM","DELETE_ROOM","UPDATE_ROOM_REMARK","CS_DETAIL_FIELD_LESS","MY_ROOM_LIST","MY_INVITATION_ROOM_LIST","UPDATE_USER_ROOM","GET_ROOM","ACCEPT_INVITE","DELETE_INVITE","INVITE_GROUP","LEAVE_GROUP","GET_USER_SETTING","UPDATE_USER_SETTING","LIST_TAGS","GET_TAG","CREATE_TAG","UPDATE_TAG","DELETE_TAG","USER","SPINACH_COMMON_USER","LIST_USER","INVITE_LIST_USER","GET_USER","GET_USER_SPINACH_INFO","CREATED_USER","UPDATE_USER","DELETE_USER","LIST_USER_WHITE","CREATE_USER_WHITE","UPDATE_USER_WHITE","DELETE_USER_WHITE","LIST_USER_DEVICE","UPDATE_USER_DEVICE","DELETE_USER_DEVICE","LIST_USER_FRIEND","DELETE_USER_FRIEND","UPDATE_USER_PASS","theme","require","MainTheme","mapObj","prefix","styleObjFun","reduce","acc","cur","AButtonVariant","styled","variant","variants","val","color","white","black","bg","borderColor","Button","space","background","border","ATagVariant","ACardVariant","shadow","Space","flexbox","Row","layout","Col","Divider","Box","div","position","typography","bgColor","borderCr","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","fullDomain","includes","window","location","host","MAIN_DOMAIN","filterSubDomain","document","domain","IS_CLIENT","process","IS_MOBILE","test","navigator","userAgent","CLIENT_API_DOMAIN","REACT_APP_DOMAIN_ENABLE","REACT_APP_NEW_DOMAIN","CLIENT_API_URL","CLIENT_WS_URL","HTTP_URI","REACT_APP_API_ORIGIN","REACT_APP_WS_ORIGIN","WS_URI","API_JUMP_URL","sentryCaptureErr","errorTitle","extraObj","details","level","Sentry","scope","forEach","key","setExtra","setLevel","authStorageKey","initialState","meInfo","getStorage","authRoutesInfo","authRoutesKey","authSlice","createSlice","name","reducers","setMeInfo","state","payload","setStorage","setAuthRoutesInfo","setAuthRoutesKey","resetAuth","actions","globalStorageKey","isLogin","token","loginInfo","loading","menuList","visibleDrawer","visible","beepEnabled","beepAudioSrc","globalSlice","setIsLogin","setLoginInfo","setLogout","deviceUID","storage","setGLoading","setMenuList","setVisibleDrawer","setBeepEnabled","setBeepAudioSrc","useQueryApi","options","useState","setLoading","useQuery","skip","context","defaultOptions","refetch","fetchData","useCallback","variables","a","data","error","errors","onSuccess","onError","useMutationApi","callback","_options","useMutation","mutate","result","mutateWrap","res","message","isFunction","useFetch","getToken","getDeviceId","fetchApi","url","cusHeaders","headers","method","body","resType","fetch","cache","Authorization","response","status","json","errorJson","returnType","blob","console","log","originalClose","SubscriptionClient","prototype","close","this","client","onopen","onclose","onerror","onmessage","args","apply","wsClient","reconnect","wsLink","WebSocketLink","authMiddleware","ApolloLink","operation","forward","Math","random","toString","substring","setContext","httpLink","createUploadLink","uri","credentials","splitLink","split","query","definition","getMainDefinition","kind","createErrorLink","ErrorLink","graphQLErrors","networkError","extras","getContext","CusApolloProvider","children","props","onErrorMsg","useAlertMessage","logoutProcess","dispatch","useDispatch","removeStorage","useLogoutProcess","ApolloClient","link","from","InMemoryCache","typePolicies","Query","fields","listMenu","merge","authority","MsgInvite","keyFields","ListUserRoomResp","ConsultingRoomOrigin","RoomConsultingDetail","createApolloClient","operationName","isShowGeneralError","getError","err","errCode","JSON","stringify","isLogoutErrorCode","isSendSentryErrorCode","traceID","getErrorMessage","onLine","ApolloProvider","CusThemeProvider","clientSlice","clientUserInfo","isLoading","gLoading","csRoomSetting","csRoomForm","csRoomQueueList","renew","setClientUserInfo","setIsLoading","setCSRoomSetting","setCSRoomSettingBeepEnabled","setCsRoomForm","setCSRoomQueueList","setRenew","resetClient","roomSlice","currentInRoomID","currentRoomID","roomDetail","roomUsersMap","csTotalUnRead","redPoint","setCurrentInRoomID","setRoomDetail","room","roomID","setRoomUsersMap","setCsTotalUnRead","setRedPoint","roomMsgSlice","roomMsg","lastReadID","hasMoreMsg","currPreRoomIdx","currPreRoomID","setRoomMsg","setLastReadID","setHasMoreMsg","setCurrPreRoomIdx","setCurrPreRoomID","resetRoomMsg","roomMsgTotal","recMsg","wsStatusInfo","setRecMsg","setWsStatusInfo","store","configureStore","reducer","global","auth","subscribe","AGENT","fullScreenHandle","href","createElement","target","click","useBrowser","browser","useMemo","indexOf","BrowserType","documentMode","StyleMedia","browserWarningModel","okCallback","warning","title","content","Title","onClick","style","cursor","okText","centered","onOk","checkIsOldBrowser","accessWarningModal","confirm","cancelText","checkIsAccessAllow","onCancel","isStorageAccessAllow","BoxWrap","CenterLayout","handleResize","vh","innerHeight","getElementById","setProperty","useEffect","addEventListener","removeEventListener","display","alignItems","justifyContent","width","useTrackingCode","trackingCodeAppendHandle","codStr","divEl","innerHTML","childNodes","node","nodeType","newScript","src","async","head","appendChild","func","apiType","LIST_AD_TRACKING","fetchAdTrackings","filter","isClient","listAdTracking","adTrackings","el","adTrackingCode","enabled","GlobalClient","wsStatusNotify","useSelector","csRoomSettingHandle","setting","header","banner","settingData","headerLogoURL","isEnabled","logoURL","headerBgColor","backgroundColor","contentLogoURL","contentLogoEnabled","contentLogoPosition","bgImgURL","backgroundImageURL","boxBgColor","boxBackgroundColor","boxBgImgURL","boxBackgroundImageURL","bannerImgURL","imageURL","bannerLinkURL","linkUrl","beepURL","showBeepBtn","queueEnabled","autoCreatedCSEnable","enterDirectlyEnabled","redirectVerifyEnabled","icon","oldLink","rel","removeChild","handleBrowserTabStyle","avatarURL","fetchCSRoomSettingAndForm","GET_CS_ROOM_SETTING_AND_FORM","getConsultingRoomClientSetting","getConsultingRoomForm","queueList","listConsultingRoomQuestion","consultingRoomQuestions","form","formSettingData","formDataList","formData","isVerificationCode","csRoomFormHandle","reason","onConnecting","onConnected","onReconnecting","onReconnected","onDisconnected","wsStatusHandle","processInit","asyncLocalStorage","getItem","userInfo","redirectURLHandle","redirectURL","paramsSymbol","URL_SEARCH","search","urlSearchParams","URLSearchParams","set","jumpLoading","jumpHandle","isJump","tokenParams","csRoomUrlParams","fetchUrl","sourceDomain","resIsJump","setItem","spinning","useMe","isSystemType","accountType","AccountTypeKeys","isMonitorType","authorityKeysHandle","arr","concat","Array","isArray","next","GET_ME","fetchMeHandler","Me","menu","authKeys","REC_MSG_COMMON_CONTENT_TYPE","ReceiveMsgContentType","useRecMessage","msgID","meID","hi","join","leave","roomUpdate","bizSystem","typing","userOnlineInfo","lastRead","system","bubble","msgStatusRetract","csRoomStatusActive","csRoomStatusProcessing","csRoomStatusDeactivated","userOrder","payList","systemText","orderStatusCancel","orderStatusPending","orderStatusApproving","msgCommonType","returnCallback","settingIDProcess","settingID","recID","roomUpdateHandle","consultingDetail","csStatusTypeMap","RoomStatusKeys","userID","systemHandle","type","msgSystemTypeMap","MsgSystemType","orderStatus","orderStatusMap","OrderStatusKeys","contentTypeHandleMap","typeHandle","contentType","MsgStatusKeys","propTypes","PropTypes","existInRoomUser","userRoom","some","u","deletedAt","ownerUser","ownerUserID","userRooms","find","ur","user","roomFormate","extraInfo","isExistInRoom","isPinned","isPinnedRoom","ownerUserData","csType","createdUsersMap","headerAvatarURL","usersMap","useEventListener","eventName","handler","savedHandler","useRef","current","eventListener","event","msgType","isInIframe","frames","length","parent","useIframe","parentURL","postMsgToParent","postData","postMessage","postUnRead","num","postToBack","recParentListener","origin","CSRoomFullBg","bgImgUrl","height","backgroundSize","backgroundPosition","backgroundRepeat","overflow","backgroundImage","isWebview","useragent","regex","RegExp","Boolean","match","useRWD","size","setSize","handleRWD","innerWidth","isMobileSize","isMobileDevice","LogoHeaderWrap","borderSize","secondary","LogoHeader","alt","BannerWrap","Banner","imgURL","Container","chatRoomHeader","chatRoomContent","chatRoomContentCourse","useReducer","x","forceUpdate","showLogoHeader","showBanner","wrapStyle","chatRoomHeaderStyle","borderTopRightRadius","borderTopLeftRadius","boxShadow","flexDirection","borderRadius","useOrder","onCancelSuccess","cancelDeposit","_","params","orderNo","in","cancelDepositConfirm","expireDeposit","consultingOrder","CountdownButton","p","counter","setCounter","showCount","setShowCount","_onClick","timer","setTimeout","clearTimeout","disabled","PopupC","onMaskClick","fontSize","padding","CloseOutlined","overflowY","ClientDrawerWrap","ref","setVisible","Comp","compProps","bodyStyle","onClose","placement","useImperativeHandle","forwardRef","dateTimeRange","setDateRanges","defaultSearchDataFormat","formatSearchDateTime","start","end","dateRange","toMoment","toDate","statusOptions","currKey","push","label","value","OrderList","clientDrawerWrapRef","list","setList","count","setCount","createdAtGTE","createdAtLTE","statusIn","searchData","setSearchData","selectorVal","dateInputVal","setDateInputVal","datePickerValue","setDatePickerValue","visibleStatusPopup","setVisibleStatusPopup","visibleDatePopup","setVisibleDatePopup","visibleDatePickerView","setVisibleDatePickerView","actionLoading","listOrder","orders","_list","item","fetchPendingOrder","pagination","perPage","page","onChangeDateRangeBtn","rangeVal","dateRanges","_searchData","onChangeDatePickerView","index","_v","pb","whiteSpace","mr","px","py","description","mb","Text","ellipsis","marginRight","ConsultingOrderTypeKeys","PayTypeImg","payType","orderURL","ml","strong","PayType","formatDateTime","createdAt","fontWeight","amount","margin","gutter","span","block","textAlign","showCheckMark","defaultValue","onChange","v","marginTop","idx","Fragment","formatDateStr","RightOutlined","renderLabel","labelRenderer","compareRangeDateStrSize","formatSearchDate","ContentWrap","flex","borderBottomRightRadius","borderBottomLeftRadius","useFile","getFileUrl","file","URL","createObjectURL","getBase64Image","img","canvas","drawImage","ext","lastIndexOf","toLowerCase","toDataURL","getDownloadFile","fileUrl","objectURL","resData","getDownloadFiles","avatarsInfo","Promise","all","checkBlobStr","str","checkIsFileImage","changeFileToUrl","File","changeUrlToFile","reject","Image","onload","btof","setAttribute","timestamp","Date","getTime","fileName","dataArr","byteString","atob","u8Arr","Uint8Array","i","charCodeAt","endings","getBase64","reader","FileReader","readAsDataURL","Carousel","logoList","carouselStyle","right","left","top","bottom","effect","autoplay","dots","DoubleCheckSvg","viewBox","xmlSpace","fill","d","DoubleCheckIcon","Icon","component","SoundMuteSvg","SoundMuteIcon","primary","AvatarFetch","setSrc","getDownloadFileHandle","Avatar","active","UserOutlined","ClientHeader","showBackBtn","backUrl","backToHandle","rightExtra","HeaderWrap","LeftOutlined","CustomerServiceOutlined","CsAvatarUrl","shape","SoundFilled","FullscreenOutlined","DownOutlined","comp","headerHeight","React","memo","FullRoomLoading","CSForm","formTitle","showVerificationCode","isReadType","cusFormCom","updateQsHandel","submitHandle","updateContentHandle","itemIdx","tempFormDataList","cloneDeep","fieldTypeVerify","CSFormFieldVerifyType","rule","rules","required","validator","Number","verifyTypeHandle","verifyType","inputRender","Item","placeholder","ItemIdx","inputValue","tempContent","onChangeInput","radioRender","Group","clickIdx","items","it","onChangeRadio","checkboxRender","checked","onChangeCheckbox","fieldTypeRender","CSFormFieldType","captchaInputEl","captchaRef","captchaCode","setCaptchaCode","validateStatus","help","captchaError","setCaptchaError","array","temp","floor","useForm","clickSubmit","validateFields","fieldTypeInit","m","checkIdx","initCSForm","initValueObj","setFieldsValue","marginBottom","charNum","refresh","BeforeEnter","setQueueQsID","onfinish","queueForm","submitQueueForm","queueFormRender","cusType","qus","Option","question","isShowQueue","RedirectVerifyModel","step","setStep","step1Timer","step2Timer","zIndex","indicator","LoadingOutlined","spin","pt","useRoomMessage","currUserRooms","currHistoryRooms","MeID","onWarningMsg","historyRooms","reverse","curr","lastReadMessageID","setRoomMsgHandle","msgList","msg","handleType","INITIAL","PUSH","pre","UNSHIFT","UPDATE","AFRESH","cusMsg","CusMsgContentType","RESET","pushCusMsg","render","now","POST_MSG","postMsg","postSystemMsg","MsgContentTypeKeys","RoomTypeKey","fetchRoomMsg","LIST_MSG","fetchRoomMsgHandle","setMsgType","offsetType","limit","listMessage","messages","meta","total","updateLastMsg","fetchInRoomMsgHandle","messageID","filterEfficientMsg","loadMoreMsg","efficientMsg","moreMsg","offsetID","loadPreRoomMsg","preRoomID","recLastReadIDHandle","lastReads","recOtherSideMsgHandle","tags","MsgFromTags","pushMsg","lastMessageID","BEEP_FILE_KEY","BEEP_ENABLED_KEY","BEEP_CLIENT_ENABLED_KEY","useBeep","updateData","updateLoading","fetchBeepFile","PlatformSetting","getPlatformSetting","updateBeepFile","beepClientEnabled","setClientBeepEnabled","fetchBeepEnabled","call","updateBeepEnabled","playPromise","audioObj","playAudioPromise","play","then","catch","ScrollDownBtn","show","hasNewMsg","dot","offset","EndMsg","showEndMsg","ChatContent","roomMsgLength","controlHeader","controlFooter","bgImg","isSogou","elHeight","setElHeight","roomContentEl","setRoomContentEl","wrapBoxRef","setWrapBoxRef","infiniteScrollNode","setInfiniteScrollNode","scrollToBtnShow","setScrollToBtnShow","setHasNewMsg","sogouBrowserScrollTop","getScrollableTarget","outerDivHeight","clientHeight","getElementsByClassName","resizeObserver","ResizeObserver","entries","requestAnimationFrame","contentRect","observeTimeID","hight","loadMoreMsgHandle","loadPreRoomMsgHandel","getWrapBoxRef","scrollNodeTo","currScrollTop","scrollTo","getInfiniteScrollEl","setHasNewMsgHandle","lastScrollTop","initSetHasMoreMsg","offsetHeight","observe","scrollableTarget","dataLength","endMessage","hasMore","loader","inverse","onScroll","scroll","scrollTop","stopEventDefault","preventDefault","stopPropagation","checkIsDragIn","dataTransfer","DragInDrop","useDragDropFiles","onSetDropFiles","onSetDragInFiles","onSetDragOutFiles","dropElRef","setDropElRef","dragCounter","isDragging","setDrag","handleDragIn","handleDragOut","handleDrag","handleDrop","files","clearData","InputTextArea","PreviewFileModal","lazy","lazyRetry","InputPayment","BtnEmojiPicker","BtnUploadFile","InputBar","paymentInputSubmit","paymentBtnLoading","showFrontDrop","onChangeInputValue","frontDropControl","showPaymentCancelBtn","paymentChannelListBtn","showUploadBtn","showEmojiBtn","setInputValue","showPaymentInput","setShowPaymentInput","inputChangeHandle","pushTextHandle","text","stripHtmlTag","isEncrypt","pushFileHandle","upload","showEmojiBox","setShowEmojiBox","previewFileModal","setPreviewFileModal","dropFilesHandle","_files","isImage","pasteHandle","clipboardData","fallback","showCancelBtn","onSubmit","onCloseInput","FrontDrop","onPressEnter","onPaste","bordered","onFocus","letterSpacing","mt","onClickEmoji","emoji","native","postFile","SendOutlined","CryptoJS","subStrToken","enc","Utf8","parse","useCrypto","encryptBase64Handle","encrypted","AES","encrypt","mode","ECB","encryptHexHandle","ciphertext","encryptStrHandle","secretKey","base64","hex","decryptBase64","cipherStr","decrypted","decrypt","decryptHex","hexStr","Hex","Base64Str","Base64","decryptStr","pad","NoPadding","decryptStrHandle","MsgControlItem","MsgWrap","showName","isShowMsgStatus","isSend","isRead","isRetract","isError","avatar","danger","CheckOutlined","checkRender","marginLeft","MGM_TYPE","Msg","originalMsg","updateMsg","setMsgWrapNode","setIsRetract","setMsg","isSystem","isSelf","default","avatarURLHandle","setIsError","UPDATE_MSG","updateMsgStatus","retractLoading","isTextEncrypt","postMsgHandle","isText","encryptTextObj","postDefaultObj","String","resMsg","encryptPostData","errorMsg","errorLevel","sentryErrorData","resError","tokenKey","originMsg","encryptMsg","resentErr","resentError","resentParams","successResData","aliasName","n","isOther","username","cloneElement","fileURL","MsgText","__html","replace","wordBreak","dangerouslySetInnerHTML","imgType","IconsWrap","className","Icons","paddingTop","PayList","deposit","400000","400002","402001","500002","postDeposit","borderBottom","channelID","mx","ClientOrderDetailDrawer","orderDetailDrawerWrapRef","_consultingOrder","InfoItem","isBlue","my","BankCardContent","bankName","bankCode","branchName","cardNo","accountName","onClickAlipay","onClickWx","_cardNo","AliCardContent","QRcodeContent","qUrl","account","RedirectContent","Oder","payMethod","orderAmount","expiredAt","bank","qrcode","redirect","alipayDrawerWrapRef","wxDrawerWrapRef","setStatus","orderContentRender","PayMethod","getNow","alipayProcessUrl","wxProcessUrl","MsgSystem","systemType","MsgImage","layoutMap","BASELINE","HORIZONTAL","VERTICAL","MsgBubble","hero","footer","onOrderDetail","compMap","box","separator","weight","button","action","iconAlign","postBackMap","actionTypeMap","MESSAGE","POSTBACK","URI","IconComp","renderIconComp","direction","Contents","contents","ContentComp","Bubble","BubbleComp","MsgList","msgSystemRender","msgControlRender","showUserText","msgFileRender","msgTextRender","msgBubbleRender","MsgInfoStyle","isMobile","MsgInfoWrap","ResetHtml","ResetHtmlWrap","html","ConnectCSBtn","connectCS","CusFaqMsg","faqList","preData","clickFaq","asked","wrap","faq","parentID","CusUserMsg","txt","QueueInfo","DepositToken","setCode","GET_WEB_DEPOSIT_TOKEN","handleFetchData","getWebToken","UploadProofDrawer","payDeposit","uploadLdg","setUploadLdg","setFile","setUrl","CloudUploadOutlined","beforeUpload","info","showUploadList","accept","PlusOutlined","Countdown","onFinish","wrapProps","textArr","valueStyle","h","QuickMsgTab","flexWrap","overflowX","paddingBottom","hasTypingTimeoutID","CSRoom","isQueue","createdCSRoomHandle","fetchRoomInfo","setConnectWS","operatingProcessDone","inputBarRef","chatRoomContentRef","uploadProofDrawerRef","clientOrderDetailDrawerRef","isDepositRoomType","roomType","CSRoomTypeKey","setExpiredAt","paidDeposit","_payDeposit","pushMsgHandle","playBeep","beepObj","Audio","greetingAndFaq","GET_GREETING_AND_FAQ","fetchGreetingAndFaq","source","greetingList","listConsultingGreeting","ConsultingGreetings","listFrequentlyQuestion","frequentlyQuestions","FAQ_COUNT","countFAQ","fetchFaqList","LIST_FAQ_DETAIL","fetchFaqListHandle","frequentlyQuestion","POST_TYPING","postTyping","lazyTyping","setInterval","clearInterval","removeItem","gogoRetry","connectCSBtnRender","faqContentRender","greetingHandle","afterSendSec","operatingProcess","handleDepositRoomInit","pendingOrder","ChatRoomContent","depositToken","ChatRoomInputBar","Client","reqUrl","csRoomRef","connectWS","showCSRoom","setShowCSRoom","initLoading","setInitLoading","CSFormData","setCSFormData","queueQsID","setIsQueue","getRoomContext","fetchRoom","getRoomLoading","getRoom","updateInRoom","updateInRoomHandle","onCompleted","useRoom","resetUserInfo","org","tempList","handle","queueHandle","roomStatus","afterCreatedRoomHandle","CREATED_CS_ROOM","createConsultationRoom","createdCSRoom","accessDomain","omitTypenameHandle","questionID","CREATED_CS_DEPOSIT_ROOM","createUserDepositRoom","createCSDepositRoom","createCSDepositRoomHandle","realName","depositAmount","jobID","useSubscription","RECEIVE_MSG","userAuth","onSubscriptionData","subData","subscriptionData","receiveMessage","iniProcess","autoContact","FullBg","connectAndFetchRoomData","clientRoutes","path","element","to","ClientApp","routing","useRoutes","Root","environment","dsn","integrations","BrowserTracing","tracesSampleRate","release","ignoreErrors","success","AntTheme","GET_MENU_LIST","currFolderFiles","getModuleFiles","APIs","allAPI","apiFuncs","ele","defaultAPIName","copyText","clipboard","writeText","CopyBtn","useCopy","createImage","copyMediaToClipboard","pngBlob","write","ClipboardItem","convertToPng","imgBlob","ctx","toBlob","copyImg","extension","pop","CS_DETAIL_FIELD","CS_SETTING_FIELD","CS_GREETING_FIELD","CS_FORM_FIELD","CS_ORIGIN_FIELD","MSG_SYSTEM","MSG_BUBBLE","SPINACH_FIELD","utc","moment","extend","dateFormat","timeFormat","formatTime","s","unix","format","dataStr","dateArr","startOf","endOf","isAdd","subtractRange","0","1","subtract","2","3","4","addRange","add","d1Str","d2Str","date1","date2","isBefore","isSame","encode","encodeURIComponent","decodeToJson","decodeURIComponent","decode","storageList","errorInfo","businessSystemMsgLog","localStorage","showBearer","Unknown","Manager","CustomerService","CommonUser","Tourist","System","Monitor","Direct","Consulting","Invite","Active","Deactivated","Processing","Deposit","Voice","Join","Leave","LastRead","Hi","Geo","Typing","RoomUpdate","UserOnlineInfo","BusinessSystemNotification","Initial","Retract","Edit","UserOrder","AutoReplay","wx","alipay","describe","ecny","sub_alipay","wxUrl","alipayUrl","bankUrl","ecnyUrl","Pending","Waiting","Canceled","Succeeded","Failed","Denied","Expired","Urging","Input","Radio","Checkbox","Email","Age","QQ","WeChat","IE","Edge","Firefox","Sogou","Opera","Chrome","Safari","Netscape","UC","errorCodes","400001","400003","400106","401001","401002","401003","401004","401005","403000","403001","403002","404001","405001","408001","409000","409001","500000","500001","omitTypename","undefined","object","slice","trim","componentImport","componentName","hasRefreshed","sessionStorage","reload","handleDecode","URL_PARAMS","URL_SEARCH_PARAMS","fromEntries","contact","toUpperCase","MSG_REQUIRED","POST_TEMP_MSG","opacity","onSuccessMsg","config","showContent","destroy","WS_ALERT_MSG_KEY","duration","LIST_CS_ROOM","LIST_MY_CS_ROOM","CREATED_CS_CONTACT","BATCH_DEACTIVATED_CS_ROOM","LIST_DEACTIVATED_CS_ROOM","JOIN_CS_ROOM","PULL_IN_CS_ROOM","DOWNLOAD_CS_ROOM_REPORT","GET_ROOM_DETAIL","listPaymentChannel","listPendingOrder","AD_TRACKING_FIELD","GET_AD_TRACKING","CREATE_AD_TRACKING","UPDATE_AD_TRACKING","DELETE_AD_TRACKING","LIST_CANNED","CREATE_CANNED_RES_CAT","UPDATE_CANNED_RES_CAT","DELETE_CANNED_RES_CAT","CREATE_CANNED_RES","UPDATE_CANNED_RES","DELETE_CANNED_RES","GET_CS_FORM","CREATE_CS_FORM","UPDATE_CS_FORM","DELETE_CS_FORM","GET_CS_ROOM_SETTING","LIST_CS_ROOM_SETTING","CREATE_CS_ROOM_SETTING","UPDATE_CS_ROOM_SETTING","LIST_CONTACT_CUS_SVS","GET_CONTACT_CUS_SVS","CREATED_CONTACT_CUS_SVS","UPDATE_CONTACT_CUS_SVS","DELETE_CONTACT_CUS_SVS","LIST_FAQ_KEYS","CREATE_FAQ","UPDATE_FAQ","DELETE_FAQ","LIST_CS_GREETING","CREATE_CS_GREETING","UPDATE_CS_GREETING","DELETE_CS_GREETING","LIST_GROUP_ROOM","CREATE_GROUP","HOSTS_DENY_FIELD","LIST_HOSTS_DENY","CREATE_HOSTS_DENY","UPDATE_HOSTS_DENY","DELETE_HOSTS_DENY","POST_LOGIN","POST_LOGOUT","LIST_USER_LOGIN_INFO","LIST_MONITOR_CS_ROOM","LIST_CS_ROOM_ORIGIN","CREATE_CS_ROOM_ORIGIN","UPDATE_CS_ROOM_ORIGIN","DELETE_CS_ROOM_ORIGIN","LIST_SPINACH_PLATFORM","CREATE_SPINACH_PLATFORM","UPDATE_SPINACH_PLATFORM","DELETE_SPINACH_PLATFORM","MERCHANT_FIELDS","LIST_MERCHANT","CREATE_MERCHANT","UPDATE_MERCHANT","DELETE_MERCHANT","CREATED_UPLOAD_URL","NEW_CREATE_UPLOAD","GET_RED_POINT"],"mappings":"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","file":"static/js/main.c867a258.chunk.js","sourcesContent":["import { gql } from '@apollo/client';\n\n/**\n * 後台設定\n */\nexport const LIST_PLATFORM_SETTING = gql`\n query listPlatformSetting($filter: PlatformSettingFilterInput) {\n listPlatformSetting(filter: $filter) {\n PlatformSettings {\n key\n value\n displayName\n sequence\n isDisplayWeb\n }\n }\n }\n`;\nexport const GET_PLATFORM_SETTING = gql`\n query getPlatformSetting($filter: PlatformSettingFilterInput) {\n getPlatformSetting(filter: $filter) {\n key\n value\n updaterUserID\n updatedAt\n }\n }\n`;\nexport const UPDATE_PLATFORM_SETTING = gql`\n mutation updatePlatformSetting(\n $filter: PlatformSettingFilterInput!\n $in: PlatformSettingUpdateInput!\n ) {\n updatePlatformSetting(filter: $filter, in: $in) {\n key\n value\n updaterUserID\n updatedAt\n }\n }\n`;\n\n/**\n * 更多資訊管理\n */\nexport const LIST_PLATFORM_MORE_INFO = gql`\n query listPlatformMoreInformation($filter: MoreInformationFilterInput) {\n listPlatformMoreInformation(filter: $filter) {\n moreInformation {\n title\n type\n content\n isEnabled\n }\n }\n }\n`;\nexport const UPDATE_PLATFORM_MORE_INFO = gql`\n mutation updatePlatformMoreInformation(\n $in: PlatformMoreInformationUpdateInput!\n ) {\n updatePlatformMoreInformation(in: $in) {\n moreInformation {\n title\n type\n content\n isEnabled\n }\n }\n }\n`;\n\n/**\n * 諮詢排隊問題列表\n */\nexport const LIST_CS_QUEUE_QUS = gql`\n query listConsultingRoomQuestion($filter: ConsultingRoomQuestionFilterInput) {\n listConsultingRoomQuestion(filter: $filter) {\n consultingRoomQuestions {\n id\n question\n maxProcessingCount\n createdAt\n }\n }\n }\n`;\n\nexport const CREATED_CS_QUEUE_QUS = gql`\n mutation createConsultingRoomQuestion(\n $in: ConsultingRoomQuestionCreateInput!\n ) {\n createConsultingRoomQuestion(in: $in) {\n id\n question\n maxProcessingCount\n createdAt\n }\n }\n`;\n\nexport const UPDATE_CS_QUEUE_QUS = gql`\n mutation updateConsultingRoomQuestion(\n $filter: ConsultingRoomQuestionFilterInput!\n $in: ConsultingRoomQuestionUpdateInput!\n ) {\n updateConsultingRoomQuestion(filter: $filter, in: $in) {\n id\n question\n maxProcessingCount\n createdAt\n }\n }\n`;\n\nexport const DELETE_CS_QUEUE_QUS = gql`\n mutation deleteConsultingRoomQuestion(\n $filter: ConsultingRoomQuestionFilterInput!\n ) {\n deleteConsultingRoomQuestion(filter: $filter)\n }\n`;\n","/**\n * 推送相關\n */\nimport { gql } from '@apollo/client';\n\nexport const LIST_PUSH = gql`\n query listPushNotification(\n $filter: PushNotificationFilterInput!\n $pagination: PaginationInput\n ) {\n listPushNotification(filter: $filter, pagination: $pagination) {\n pushNotifications {\n id\n createdAt\n title\n content\n target\n isScheduled\n scheduledTime\n status\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const CREATE_PUSH = gql`\n mutation createPushNotification($in: PushNotificationCreateInput!) {\n createPushNotification(in: $in)\n }\n`;\nexport const CANCEL_PUSH = gql`\n mutation cancelPushNotification($filter: PushNotificationFilterInput!) {\n cancelPushNotification(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\n\n// 更新目前進入的房間的未讀訊息\nexport const UPDATE_IN_ROOM = gql`\n mutation updateInRoomID($roomID: Uint64!) {\n updateInRoomID(roomID: $roomID)\n }\n`;\n\n// 更新最後在聊天室讀取的訊息\nexport const UPDATE_LAST_READ_MSG = gql`\n mutation updateLastReadMessageID($roomID: Uint64!, $messageID: String!) {\n updateLastReadMessageID(roomID: $roomID, messageID: $messageID)\n }\n`;\n","/**\n * 報表系統\n */\n\nimport { gql } from '@apollo/client';\n\n/**\n * 會員統計報表\n * */\nexport const REPORT_COMMON_USER = gql`\n query reportCommonUser(\n $baseFilter: BaseFilterInput\n $pagination: PaginationInput\n ) {\n # 使用者每日統計\n listUserDailySummary(\n filter: { baseFilter: $baseFilter }\n pagination: $pagination\n ) {\n userDailySummaries {\n date\n registerCountOfCommonUser # 會員註冊數\n onlineCountOfCommonUser # 會員在線數\n createdAt\n }\n meta {\n registerCountTotalOfCommonUser # 會員註冊數總數\n onlineCountTotalOfCommonUser # 會員在線數\n total\n }\n }\n # 房間每日統計\n listRoomDailySummary(filter: { baseFilter: $baseFilter }) {\n roomDailySummaries {\n date\n createdAt\n createGroupCount # 群組創建數\n }\n meta {\n createGroupCountTotal # 創建群組總數\n total\n }\n }\n }\n`;\n\n/**\n * 諮詢房統計\n */\nexport const REPORT_CONSULTING_ROOM = gql`\n query listConsultationRoomSummary($filter: RoomSummaryFilterInput!) {\n listConsultationRoomSummary(filter: $filter) {\n consultationRoomSummaries {\n date\n countOfCommonUser\n countOfTouristUser\n }\n }\n }\n`;\n\n/**\n * 客服統計報表\n * */\nexport const REPORT_CONSULTING_ROOM_SERVICE = gql`\n query reportConsultingRoom($filter: RoomDailySummaryFilterInput!) {\n # 房間每日統計\n listRoomDailySummary(filter: $filter) {\n roomDailySummaries {\n date\n createdAt\n createConsultationCountOfCommonUser # 新增諮詢室會員數量(進線會員)\n createConsultationCountOfTourist #新增諮詢室遊客數量\n createConsultationCount # 創建諮詢室數量\n validConsultationCount # 有效諮詢數\n averageResponseSecond # 平均首次回應時間\n averageConversationSecond # 平均對話時長\n }\n meta {\n createGroupCountTotal # 創建群組總數\n createConsultationCountOfCommonUserTotal # 新增諮詢室會員數量\n createConsultationCountTotal #創建諮詢室數量\n validConsultationCountTotal # 有效諮詢數\n averageResponseSecondTotal # 平均首次回應時長\n averageConversationSecondTotal # 平均對話時長\n total\n }\n }\n }\n`;\n\n/**\n * 客服統計報表 + 各地排行\n * */\nexport const REPORT_CONSULTING_ROOM_SERVICE_AREA = gql`\n query reportConsultingRoom(\n $roomServiceFilter: RoomDailySummaryFilterInput!\n $roomAreaFilter: ConsultingRoomFilterInput!\n ) {\n # 房間每日統計\n listRoomDailySummary(filter: $roomServiceFilter) {\n roomDailySummaries {\n date\n createdAt\n createConsultationCountOfCommonUser # 新增諮詢室會員數量(進線會員)\n createConsultationCountOfTourist #新增諮詢室遊客數量\n createConsultationCount # 創建諮詢室數量\n validConsultationCount # 有效諮詢數\n averageResponseSecond # 平均首次回應時間\n averageConversationSecond # 平均對話時長\n faqCount # FAQ數\n invalidFaqCount # 無效FAQ數\n }\n meta {\n createGroupCountTotal # 創建群組總數\n createConsultationCountOfCommonUserTotal # 新增諮詢室會員數量\n validConsultationCountTotal # 有效諮詢數\n averageResponseSecondTotal # 平均首次回應時長\n averageConversationSecondTotal # 平均對話時長\n total\n }\n }\n # 各地排行\n statisticsConsultationRoomArea(filter: $roomAreaFilter) {\n statistics {\n administrativeArea\n count\n }\n }\n }\n`;\n\n/**\n * 各地排行\n */\nexport const REPORT_STATISTICS_CONSULTING_ROOM_AREA = gql`\n query statisticsConsultationRoomArea($filter: ConsultingRoomFilterInput) {\n statisticsConsultationRoomArea(filter: $filter) {\n statistics {\n administrativeArea\n count\n }\n }\n }\n`;\n\n/**\n * 客服個人報表\n * */\nexport const REPORT_CUSTOMER_SERVICE = gql`\n query listCustomerServiceSummary(\n $filter: CustomerServiceSummaryFilterInput!\n $pagination: PaginationInput\n ) {\n listCustomerServiceSummary(filter: $filter, pagination: $pagination) {\n customerServiceSummaries {\n user {\n id\n username\n }\n firstEntryCount # 首位客服\n entryCount # 進入房間數\n validConsultationCount # 有效諮詢數\n casesClosedCount # 結案數\n averageResponseSecond # 平均回應時長 (秒)\n averageConversationSecond # 平均對話時間 (秒)\n averageResponseByItemSecond # 平均逐條回應時間 (秒)\n loginSecond # 登錄時長\n onlineSecond # 在線時間\n stealthSecond # 隱身時間\n }\n meta {\n total\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport { COMMENT_MENU } from './menuList';\n/**\n * 員工系統 - 角色列表 Manager\n */\n\n// 角色列表\nexport const LIST_ROLE = gql`\n ${COMMENT_MENU}\n query listRole($filter: RoleFilterInput!, $pagination: PaginationInput) {\n listRole(filter: $filter, pagination: $pagination) {\n meta {\n total\n }\n roles {\n id\n name\n authority {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n }\n }\n }\n supportAccountType\n createdAt\n createUserID\n updatedAt\n updateUserID\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 角色明細\nexport const GET_ROLE = gql`\n ${COMMENT_MENU}\n query getRole($filter: RoleFilterInput!) {\n getRole(filter: $filter) {\n id\n name\n authority {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n }\n }\n }\n }\n supportAccountType\n createdAt\n createUserID\n updatedAt\n updateUserID\n }\n }\n`;\n\n// 新增角色\nexport const CREATED_ROLE = gql`\n mutation createRole($in: RoleCreateInput!) {\n createRole(in: $in)\n }\n`;\n\n// 更新角色\nexport const UPDATE_ROLE = gql`\n mutation updateRole($filter: RoleFilterInput!, $in: RoleUpdateInput!) {\n updateRole(filter: $filter, in: $in)\n }\n`;\n\n// 刪除角色\nexport const DELETE_ROLE = gql`\n mutation deleteRole($filter: RoleFilterInput!) {\n deleteRole(filter: $filter)\n }\n`;\n\n/**\n * 使用者角色 相關處理\n */\n\n// 組合api (使用者 角色 + 所有角色列表)\nexport const LIST_USER_ROLE = gql`\n query listUserRole(\n $userRoles: UserRoleFilterInput!\n $listRole: RoleFilterInput!\n ) {\n listUserRole(filter: $userRoles) {\n userRoles {\n id\n userID\n roleID\n isAdmin\n createUserID\n updateUserID\n createdAt\n updatedAt\n role {\n id\n name\n supportAccountType\n createdAt\n createUserID\n updatedAt\n updateUserID\n }\n }\n meta {\n total\n }\n }\n # 角色列表\n listRole(filter: $listRole) {\n roles {\n id\n name\n }\n }\n }\n`;\n\n// 使用者 新增角色\nexport const CREATE_USER_ROLE = gql`\n mutation createUserRole($in: UserRoleCreateInput!) {\n createUserRole(in: $in)\n }\n`;\n\n// 使用者 刪除角色\nexport const DELETE_USER_ROLE = gql`\n mutation deleteUserRole($filter: UserRoleFilterInput!) {\n deleteUserRole(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { COMMENT_USER_ROOMS, CS_DETAIL_FIELD_LESS } from './Fragment';\n\n// 聊天室列表(私聊)\nexport const LIST_DIRECT_ROOM = gql`\n ${COMMENT_USER_ROOMS}\n query listRoom($filter: RoomFilterInput!, $pagination: PaginationInput) {\n listRoom(filter: $filter, pagination: $pagination) {\n rooms {\n id\n uid\n type\n createdAt\n updatedAt\n userRooms {\n ...userRoomsFields\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 更新 聊天室\nexport const UPDATE_ROOM = gql`\n mutation updateRoom($filter: RoomFilterInput!, $in: RoomUpdateInput!) {\n updateRoom(filter: $filter, in: $in) {\n id\n uid\n type\n createdAt\n updatedAt\n }\n }\n`;\n\n// 刪除 聊天室 (*刪除但會繼續連接使用者,除非使用者離開)\nexport const DELETE_ROOM = gql`\n mutation deleteRoom($filter: RoomFilterInput!) {\n deleteRoom(filter: $filter)\n }\n`;\n\nexport const UPDATE_ROOM_REMARK = gql`\n ${CS_DETAIL_FIELD_LESS}\n mutation updateConsultingRoomRemark($in: UpdateConsultingRoomRemarkInput!) {\n updateConsultingRoomRemark(in: $in) {\n ...consultingDetailLessField\n }\n }\n`;\n\n// ----------------------------------------------------------\n\n// 我的聊天室\nexport const MY_ROOM_LIST = gql`\n ${COMMENT_USER_ROOMS}\n query listUserRoom(\n $filter: UserRoomFilterInput!\n $pagination: PaginationInput\n ) {\n # 我的聊天室\n listUserRoom(filter: $filter, pagination: $pagination) {\n userRooms {\n id\n # userID\n # roomID\n isOperator\n lastReadMessageID\n room {\n id\n name\n type\n status\n ipAddress\n country\n administrativeArea\n deviceOS\n isPublic\n ownerUserID\n createdAt\n updatedAt\n }\n userRooms {\n ...userRoomsFields\n }\n user {\n id\n username\n }\n }\n }\n }\n`;\n\n// 我的待加入聊天室\nexport const MY_INVITATION_ROOM_LIST = gql`\n ${COMMENT_USER_ROOMS}\n query listUserInvitation(\n $filter: UserInvitationFilterInput!\n $pagination: PaginationInput\n ) {\n listUserInvitation(filter: $filter, pagination: $pagination) {\n userInvitations {\n id\n type\n inviteeUserID\n inviterUserID\n createdAt\n room {\n id\n name\n type\n isPublic\n ownerUserID\n createdAt\n updatedAt\n userRooms {\n ...userRoomsFields\n }\n }\n }\n }\n }\n`;\n\n// 更新 我的聊天室\nexport const UPDATE_USER_ROOM = gql`\n mutation updateUserRoom(\n $filter: UserRoomFilterInput!\n $in: UserRoomUpdateInput!\n ) {\n updateUserRoom(filter: $filter, in: $in) {\n id\n }\n }\n`;\n\n// ----------------------------------------------------------\n\n// room detail\nexport const GET_ROOM = gql`\n ${COMMENT_USER_ROOMS}\n query getRoom($filter: RoomFilterInput!) {\n getRoom(filter: $filter) {\n id\n type\n createdAt\n updatedAt\n # groupDetail {\n # roomID\n # imageURL\n # name\n # isPublic\n # inviteLevel\n # strangerLevel\n # strangerPassword\n # ownerUserID\n # }\n consultingDetail {\n roomID\n deactivatedAt\n deactivatedUserID\n ipAddress\n country\n administrativeArea\n sourceDomain\n accessDomain\n question\n deviceOS\n ownerUserID\n csUserID\n status\n type\n historyRooms\n remark\n userOrder {\n orderNo\n amount\n payType\n currency\n status\n createdAt\n }\n formData {\n id\n type\n label\n content {\n value\n items {\n label\n value\n }\n }\n rule {\n require\n verifyType\n }\n }\n }\n userRooms {\n ...userRoomsFields\n }\n # userInvitations {\n # id\n # inviteeUserID\n # inviteeUser {\n # ...userRoomFields\n # }\n # inviterUser {\n # ...userRoomFields\n # }\n # }\n }\n }\n`;\n\n// ----------------------------------------------------------\n\n// 接受邀請\nexport const ACCEPT_INVITE = gql`\n mutation acceptInvite($invitationID: Uint64!) {\n acceptInvite(invitationID: $invitationID)\n }\n`;\n\n// 刪除邀請 || 拒絕邀請\nexport const DELETE_INVITE = gql`\n mutation deleteUserInvitation($filter: UserInvitationFilterInput!) {\n deleteUserInvitation(filter: $filter)\n }\n`;\n\n// 邀請XXX進入 群組聊天室\nexport const INVITE_GROUP = gql`\n mutation inviteGroup($in: inviteRoomInput!) {\n inviteGroup(in: $in)\n }\n`;\n\n// 離開 群組聊天室\nexport const LEAVE_GROUP = gql`\n mutation leaveGroup($roomID: Uint64!) {\n leaveGroup(roomID: $roomID)\n }\n`;\n","import { gql } from '@apollo/client';\n\n// 一對一 get\nexport const GET_USER_SETTING = gql`\n query getUserSetting($filter: UserSettingFilterInput!) {\n getUserSetting(filter: $filter) {\n id\n userID\n autoAddFriendEnabled\n allowStrangeMessageEnabled\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const UPDATE_USER_SETTING = gql`\n mutation updateUserSetting(\n $filter: UserSettingFilterInput!\n $in: UserSettingUpdateInput!\n ) {\n updateUserSetting(filter: $filter, in: $in) {\n id\n userID\n autoAddFriendEnabled\n allowStrangeMessageEnabled\n isStealth\n createdAt\n updatedAt\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\n// 標籤列表\nexport const LIST_TAGS = gql`\n query listTag($filter: TagFilterInput!) {\n listTag(filter: $filter) {\n tags {\n id\n name\n RGBHex\n isEnable\n createdAt\n updatedAt\n createUserID\n updateUserID\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 標籤明細\nexport const GET_TAG = gql`\n query getTag($filter: TagFilterInput!) {\n getTag(filter: $filter) {\n id\n name\n RGBHex\n isEnable\n createdAt\n updatedAt\n createUserID\n updateUserID\n }\n }\n`;\n\n// 新增標籤\nexport const CREATE_TAG = gql`\n mutation createTag($in: TagCreateInput!) {\n createTag(in: $in)\n }\n`;\n\n// 更新標籤\nexport const UPDATE_TAG = gql`\n mutation updateTag($filter: TagFilterInput!, $in: TagUpdateInput!) {\n updateTag(filter: $filter, in: $in)\n }\n`;\n\n// 刪除標籤\nexport const DELETE_TAG = gql`\n mutation deleteTag($filter: TagFilterInput!) {\n deleteTag(filter: $filter)\n }\n`;\n","/**\n * user\n * - 白名單管理\n * - 裝置管理\n * - 好友管理\n * */\nimport { gql } from '@apollo/client';\n\nconst USER = gql`\n fragment userFields on User {\n id\n spinachUserID\n spinachPlatformKey\n accountType\n merchantID\n merchantType\n status\n username\n aliasName\n email\n area\n notes\n avatarURL\n authCode\n isDelete\n isOnline\n consultingCount\n createdAt\n updatedAt\n updateUserID\n setting {\n id\n isStealth\n allowLoginStartAt\n allowLoginEndAt\n }\n }\n`;\n\nconst SPINACH_COMMON_USER = gql`\n fragment spinachCommonUserDetailFields on SpinachCommonUserDetail {\n status\n payLevel\n riskControlLevel\n platform\n rechargeTime\n registerAt\n lastLoginAt\n lastLoginIP\n nowLoginIP\n }\n`;\n\nexport const LIST_USER = gql`\n ${USER}\n query listUser($filter: UserFilterInput!, $pagination: PaginationInput) {\n listUser(filter: $filter, pagination: $pagination) {\n users {\n ...userFields\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 邀請 (會員 + 員工) 列表\nexport const INVITE_LIST_USER = gql`\n query listUser(\n $Manager: UserFilterInput!\n $CommonUser: UserFilterInput!\n $pagination: PaginationInput\n ) {\n manager: listUser(filter: $Manager, pagination: $pagination) {\n users {\n id\n accountType\n status\n username\n aliasName\n email\n avatarURL\n authCode\n }\n }\n commonUser: listUser(filter: $CommonUser, pagination: $pagination) {\n users {\n id\n accountType\n status\n username\n aliasName\n email\n avatarURL\n authCode\n }\n }\n }\n`;\n\n// 員工&會員 明細\nexport const GET_USER = gql`\n ${USER}\n ${SPINACH_COMMON_USER}\n query getUser($filter: UserFilterInput!) {\n getUser(filter: $filter) {\n ...userFields\n spinachCommonUserDetail {\n ...spinachCommonUserDetailFields\n }\n }\n }\n`;\n\n// 員工&會員 明細\nexport const GET_USER_SPINACH_INFO = gql`\n ${SPINACH_COMMON_USER}\n query getUser($filter: UserFilterInput!) {\n getUser(filter: $filter) {\n id\n spinachUserID\n spinachPlatformKey\n accountType\n spinachCommonUserDetail {\n ...spinachCommonUserDetailFields\n }\n }\n }\n`;\n\nexport const CREATED_USER = gql`\n ${USER}\n mutation createUser($in: CreateUserReqInput!) {\n createUser(in: $in) {\n user {\n ...userFields\n }\n }\n }\n`;\n\nexport const UPDATE_USER = gql`\n mutation updateUser($filter: UserFilterInput!, $in: UserUpdateInput!) {\n updateUser(filter: $filter, in: $in)\n }\n`;\n\nexport const DELETE_USER = gql`\n mutation deleteUser($filter: UserFilterInput!) {\n deleteUser(filter: $filter)\n }\n`;\n\n/**\n * 白名單管理\n */\nexport const LIST_USER_WHITE = gql`\n query listUserWhitelist($filter: UserWhitelistFilterInput!) {\n listUserWhitelist(filter: $filter) {\n userWhitelists {\n id\n userID\n ipAddress\n createdAt\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const CREATE_USER_WHITE = gql`\n mutation createUserWhitelist($in: UserWhitelistCreateInput!) {\n createUserWhitelist(in: $in)\n }\n`;\n\nexport const UPDATE_USER_WHITE = gql`\n mutation updateUserWhitelist(\n $filter: UserWhitelistFilterInput!\n $in: UserWhitelistUpdateInput!\n ) {\n updateUserWhitelist(filter: $filter, in: $in)\n }\n`;\n\nexport const DELETE_USER_WHITE = gql`\n mutation deleteUserWhitelist($filter: UserWhitelistFilterInput!) {\n deleteUserWhitelist(filter: $filter)\n }\n`;\n\n/**\n * 裝置管理\n */\nexport const LIST_USER_DEVICE = gql`\n query listUserDevice($filter: UserDeviceFilterInput!) {\n listUserDevice(filter: $filter) {\n userDevices {\n id\n userID\n deviceUID\n isBind\n createdAt\n updatedAt\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const UPDATE_USER_DEVICE = gql`\n mutation updateUserDevice(\n $filter: UserDeviceFilterInput!\n $in: UserDeviceUpdateInput!\n ) {\n updateUserDevice(filter: $filter, in: $in)\n }\n`;\n\nexport const DELETE_USER_DEVICE = gql`\n mutation deleteUserDevice($filter: UserDeviceFilterInput!) {\n deleteUserDevice(filter: $filter)\n }\n`;\n\n/**\n * 好友管理\n */\nexport const LIST_USER_FRIEND = gql`\n query listUserFriend($filter: UserFriendFilterInput!) {\n listUserFriend(filter: $filter) {\n userFriends {\n id\n userID\n friendUserID\n createdAt\n friend {\n id\n username\n avatarURL\n }\n }\n }\n }\n`;\n\nexport const DELETE_USER_FRIEND = gql`\n mutation deleteUserFriend($filter: UserFriendFilterInput!) {\n deleteUserFriend(filter: $filter)\n }\n`;\n\n/*\n * 更新密碼\n */\nexport const UPDATE_USER_PASS = gql`\n mutation updateUserPassword($in: UserUpdatePasswordInput!) {\n updateUserPassword(in: $in)\n }\n`;\n","import styled from 'styled-components';\r\nimport {\r\n Button as AButton,\r\n Row as ARow,\r\n Col as ACol,\r\n Tag as ATag,\r\n Card as ACard,\r\n Space as ASpace,\r\n Divider as ADivider,\r\n} from 'antd';\r\nimport {\r\n variant,\r\n color,\r\n background,\r\n space,\r\n border,\r\n flexbox,\r\n layout,\r\n position,\r\n typography,\r\n shadow,\r\n} from 'styled-system'; // 定義元件的個別樣式用\r\nconst { theme } = require('@/plugin/theme');\r\n\r\n/**\r\n * 擴充 主題樣式\r\n */\r\nconst MainTheme = [\r\n 'primary',\r\n 'primary-light',\r\n 'secondary',\r\n 'secondary-light',\r\n 'success',\r\n 'warning',\r\n 'danger',\r\n 'info',\r\n];\r\nconst mapObj = (prefix, styleObjFun) => {\r\n return MainTheme.reduce(\r\n // eslint-disable-next-line no-sequences\r\n (acc, cur) => ((acc[`${prefix}${cur}`] = styleObjFun(cur)), acc),\r\n {},\r\n );\r\n};\r\n\r\n// Button\r\nconst btnGeneralObj = val => {\r\n let color = theme.white;\r\n if ('secondary-light' === val) color = val.black;\r\n return {\r\n color,\r\n bg: theme[val],\r\n borderColor: theme[val],\r\n };\r\n};\r\nconst btnOutlineObj = val => ({\r\n color: theme[val],\r\n bg: theme.white,\r\n borderColor: theme[val],\r\n});\r\nconst AButtonVariant = styled(AButton)(\r\n variant({\r\n variants: {\r\n ...mapObj('', btnGeneralObj),\r\n ...mapObj('outline-', btnOutlineObj),\r\n },\r\n }),\r\n);\r\nconst Button = styled(AButtonVariant)`\r\n ${color}\r\n ${space}\r\n ${background}\r\n ${border}\r\n`;\r\n\r\n// Tags\r\nconst tagGeneralObj = val => ({\r\n color: val.white,\r\n bg: theme[val],\r\n borderColor: theme[val],\r\n});\r\nconst tagOutlineObj = val => ({\r\n color: theme[val],\r\n borderColor: theme[val],\r\n bg: theme[`${val}-light`],\r\n});\r\nconst ATagVariant = styled(ATag)(\r\n variant({\r\n variants: {\r\n ...mapObj('', tagGeneralObj),\r\n ...mapObj('outline-', tagOutlineObj),\r\n },\r\n }),\r\n);\r\nconst Tag = styled(ATagVariant)`\r\n ${border}\r\n`;\r\n\r\n// Card\r\nconst cardGeneralObj = val => ({\r\n color: val.white,\r\n bg: theme[val],\r\n borderColor: theme[val],\r\n});\r\n\r\nconst ACardVariant = styled(ACard)(\r\n variant({\r\n variants: {\r\n ...mapObj('', cardGeneralObj),\r\n shadow: {\r\n 'box-shadow': `0px 0px 4px 0px rgb(71 95 123 / 20%)`,\r\n },\r\n 'shadow-lg': {\r\n 'box-shadow': `0px 0px 24px 0px rgb(71 95 123 / 20%)`,\r\n },\r\n },\r\n }),\r\n);\r\nconst Card = styled(ACardVariant)`\r\n ${border}\r\n ${space}\r\n ${color}\r\n`;\r\n\r\n/**\r\n * 擴充 其他\r\n */\r\nconst Space = styled(ASpace)`\r\n ${space}\r\n ${flexbox}\r\n`;\r\nconst Row = styled(ARow)`\r\n ${space}\r\n ${layout}\r\n ${flexbox}\r\n`;\r\nconst Col = styled(ACol)`\r\n ${space}\r\n ${layout}\r\n ${flexbox}\r\n`;\r\nconst Divider = styled(ADivider)`\r\n ${space}\r\n`;\r\n\r\nconst Box = styled.div`\r\n box-sizing: border-box;\r\n ${space}\r\n ${layout}\r\n ${flexbox}\r\n ${position}\r\n ${border}\r\n ${background}\r\n ${typography}\r\n ${shadow}\r\n ${({ color, bgColor, borderCr, theme }) => {\r\n return `\r\n ${bgColor ? `background-color: ${theme[bgColor] || bgColor};` : ''}\r\n ${color ? `color: ${theme[color] || color};` : ''}\r\n ${borderCr ? `border-color: ${theme[borderCr] || borderCr};` : ''}\r\n `;\r\n }}\r\n`;\r\n\r\nexport { Button, Row, Col, Space, Tag, Divider, Card, Box };\r\n","var map = {\n\t\"./alipay-process.jpg\": 426,\n\t\"./alipay.svg\": 413,\n\t\"./bank.png\": 415,\n\t\"./bubble/icon-money.png\": 586,\n\t\"./bubble/icon-next.png\": 587,\n\t\"./cs-avatar.jpg\": 242,\n\t\"./ecnyUrl.svg\": 416,\n\t\"./order.png\": 423,\n\t\"./proof-example.jpg\": 588,\n\t\"./usdt.png\": 1255,\n\t\"./user-avatar1.jpg\": 1256,\n\t\"./user-avatar2.jpg\": 1257,\n\t\"./user-avatar3.jpg\": 1258,\n\t\"./user-avatar4.jpg\": 1259,\n\t\"./wx-process.jpg\": 427,\n\t\"./wx.png\": 1260,\n\t\"./wxUrl.svg\": 414\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1254;","export default __webpack_public_path__ + \"static/media/usdt.f31b6180.png\";","export default \"data:image/jpeg;base64,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\"","export default \"data:image/jpeg;base64,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\"","export default __webpack_public_path__ + \"static/media/user-avatar3.025418b7.jpg\";","export default \"data:image/jpeg;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUdwTAC8DAy/FwC6DQe9EgK8DQa+EQW8EgW9EAW9EQ2/GAG8Df///wCxAA6/GAC2AQC6BSbDLZDglACoAGDUZ0rNUDjIP8bwybXqt/X89tHy06XmqHrZft713+r568ogWlcAAAALdFJOUwBYmU65p+Qe9XXXRGxVkAAAB/tJREFUeNrtnQt3oywQhrtnu1lbIogXTOLl///M7xWMTSIgKhrdz+menm1uPL4Zh2FA/PjQ2d+/f7++vj4/P0+nU0ADuqIFQfD9/Y2mAQCMD3d7gP7Gx6wKffIAvQel8bo/f/6Qzqj8Wc/Q2lNzgBlGv0MHZBs2CprsBvr3799wKbIxA9KvX78O6PdCI8SQDRvw/iXoYFfQcBqyeXv17AN6FWh0ORuMdNrY99M7HtBrQW8qQxrMnw7oNaHhJWRX1rj1Ab0W9JzkLurZSpnTLOgn7ObP3UFH60F/fn6OfRtjLJTGpIGW3S28G/6/EDSAx0NHD9DhHVphh3doFuKhLUG7KR0tqvTpdHKPFQqIUpqlWRzHl8vldrc8z/EnHizLNBOCEtLS+w4pAJ4CzSlNsx/oCj8ddBGXaSmEIHQh6KiFphOUztIWOr9J5kelG+hllQ5o4IgLl82yDGTX6/U8ZHVdF0WB1ytH96h0QIKPIKAjoQt3aJEJFVGIR70D8kGDNZT26CKN0pTSoQDXSJVmKRz3PN7g60D3290MQ4fyC87SnUHvTWkZlTn8+DzP4N9Ip3yFkWFoyqkXaEbYatCJF6Xj1ZRuzr8scwlwLlZVFefcC7cNOgmTTOwNen9KK+KzV8Pxe+E2Qyf+oc8NtFgSehGlzwsqjc8VXJwXMHgIWkRmsEPocCFowfcEzWRBAAmxMVeuqgGy89XydiReM4dhWugG29JqVdVDep7Xh46GoKtBH1gbGp+IQbWpvSZmMYbxtgkL2RU+E99WmqYmbjw1x61foSPZrdihWTgIze3QZVqiFY9KR05KZ1Zojki8otJQCI+YGkPwTpIE7ojfWiZ4c5MeJgnOCvw2Hbx62eQB2DhoLrgLtBwRRkPQzem+CehaQSdN1XQ9pRuHLmMTdNeZAQvnorZGo2q+yklwwi3h1hroMja2RAmgJVBog1YV9ebbKNMNQLsqHa2ntKrpWzo8+GiCkSN+wtA0RAcNcPEafJalvoNWJveLE6Al0iA0op4Vuq7qZmpmJegwcVJ6CNqb0mgGHZ49GQJrWZZ5nttKM3I+oH/weKS4FOpZHBuTtc0J3OOhC2foWw/69gBdpu0MGbqYaFdKS7cePeX4BL3ECFxVH5upI9kQfnP8gwmeYUjHeVdNdu8g3wANai4NqWILzXYE7UtpSxI8pcJbxupUgahwZUTAfmUQjo7zBO2q7tYFfVloZAQttGihz71qZlVvDBpKs2a4+AN97VHX21EaMVFBILo5FovxMhyYepe9x9kSdL0p6NoJur7WE6G9hDyVDE6bRcBbVKptGUFuDrruoBnbodKO0PahuGtsLkvLONy9E7Vw96D5DqH57pRWw61pqw0evRlNzj8x0E2aYt8y0Bd/0MwFOtyb0qp0BKec1sytquZ784sE2jJ2v8JkKwsNzX7f/EPrFm1plE63pnTkUuolZFobVI5YtXWZDEMXIfpFBZVa4Sl0n9qpBTzVL/lpoEkDffULLST1rdKc4vlFQqcZsjzt3IMbNF1M6cqm9HWy0qqMOyGAoG18uukrVtW9/iF1czSmqQX1sS8L9/XziFOgL0tCR9H2lA5nQ6vlsGP7xabyYli4oKaXTNBNc5Ia56L+7Zy/ZE4+oU1LRARvoakBWiltgw5Xh26VDgeUTrN0utLtak1KHUfRyvAuy+S0ch5tgRiJEbAQE6u6MiXoL1FPD80ktDbaT4QGMhf5zQydidqwjMQVegmlQW2Dnq90uwiZc8tak5c+D25nnx6YOfRyhE5GQNdLQl+KJZW+vFtplVvjWZfYp/qthZTGx6orxFxX9e4Tmu8N+r5GhmmT9z70/FX4+g+/LQR92yP0okrnt3HQbc0pH4BGZLQsjPNStRlxyci95pS/GZo9FRKclM6HAki1KaX76xIgqnZQLS8HzZaAjst4NDTtQ99WhS7j8n+g9OPM4vV8RWrbHQkex5/wYyQ0l6JQ6wmWgO7Xa8ZAX5t8PCI4NSOMRDAO7aCBzemC0GwyNKh/lBarKj0aWvVzRREDC6Pmbh+B8NkiFiGaes+ZtGvxHaBzCR0X/L60QQ8tCw/+ofNp0J3S1KA025jSIMykKbzBS4i1q2b9hg6HbpywDto4WR0RlRhsBRqu8AMdsn0oTe5bkBC3pZV4pZdJxHGzW7oSmeul0831yolvaJfZLbPSTtRLKE0mKD3K1HY7XgKf69z4fFNb7viEjqJDaQs3YzNH5iMWqXgxtaXUzqC9Kc1WhO6i5OR1IyrSuS5x2xB0ckC7Bmw5JsBgZ0IHKfOzZNyFwX7ElvOw06GtV+BuVOkkfAd0l6kq9PZ6nqu+eIn4+HhspjxpJWiV1nIuyrjEEPV6doMu3gwdyg0s7krrpJ6itMvWc/O8Gx07U50FxvPw1/Ru+L+6aAfPJsnTCUDMlw0HQeC0i9v8bKSDFplIH6i54PK63VBNEHeLVGX8McVpt/3yZirNHpUWSunyRelwhNJkxB6Q84Pg4y6i7Q6jIbvDtXs14mDaLSAMSo/bA9IPdPhUT2uomzw/6s7aDpowK/S7lFZid2MT9VQLzanBPeRumxM2Y130wAYv35q4g+ySJ21TxbSXsjYHTRyV3uIdUawVuLn7T7/Ftgo9qPSxe/0BbYE+7n1xQNuhjzvnHNAW6OO+Wwe0Hfq41eABbYc+7vl5QNuhd3nz3QN6Rej+rbvXvuVq0JQY595vfGXogAQeoIPVqQeh/wPZZehke0ufMQAAAABJRU5ErkJggg==\"","var map = {\n\t\"./icon-money.png\": 586,\n\t\"./icon-next.png\": 587\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1286;","import { filterSubDomain } from '@/utils';\nconst currDomain = () => {\n return ['localhost', 'bochat.dev.web'].includes(document.domain)\n ? 'dev.api'\n : document.domain;\n};\n\nconst fullDomain = () => {\n return ['localhost', 'bochat.dev.web'].includes(window.location.host)\n ? 'dev.api'\n : window.location.host;\n};\n\n// 愈發測試用\n// const MAIN_DOMAIN = 'iyes.dev'; // 只保留一級域名\nconst MAIN_DOMAIN = filterSubDomain(currDomain()); // 只保留一級域名\n\nexport const IS_CLIENT = process.env.REACT_APP_NAME === 'CLIENT';\nexport const IS_MOBILE = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); // P判斷是PC , Mobile ?\n\n\n\n// client\nexport const CLIENT_API_DOMAIN = process.env.REACT_APP_DOMAIN_ENABLE?`https://${fullDomain()}/bgql`:process.env.REACT_APP_NEW_DOMAIN?`https://${process.env.REACT_APP_NEW_DOMAIN}/bgql`:`${process.env.REACT_APP_API_URL_PREFIX}${MAIN_DOMAIN}`;\nexport const CLIENT_API_URL = process.env.REACT_APP_DOMAIN_ENABLE?`https://${fullDomain()}/bgql${process.env.REACT_APP_API_FILE}`:process.env.REACT_APP_NEW_DOMAIN?`https://${process.env.REACT_APP_NEW_DOMAIN}/bgql${process.env.REACT_APP_API_FILE}`:`${process.env.REACT_APP_API_URL_PREFIX}${MAIN_DOMAIN}${process.env.REACT_APP_API_FILE}`; // 配置的二級域名 + 一級域名\nexport const CLIENT_WS_URL = process.env.REACT_APP_DOMAIN_ENABLE?`wss://${fullDomain()}/bws${process.env.REACT_APP_API_FILE}`:process.env.REACT_APP_NEW_DOMAIN?`wss://${process.env.REACT_APP_NEW_DOMAIN}/bws${process.env.REACT_APP_API_FILE}`:`${process.env.REACT_APP_WS_URL_PREFIX}${MAIN_DOMAIN}${process.env.REACT_APP_API_FILE}`; // 配置的二級域名 + 一級域名\n// admin\nexport const ADMIN_API_URL = `${process.env.REACT_APP_API_ORIGIN}${process.env.REACT_APP_API_FILE}`;\nexport const ADMIN_WS_URL = `${process.env.REACT_APP_WS_ORIGIN}${process.env.REACT_APP_API_FILE}`;\n\n// connect\nexport const HTTP_URI = IS_CLIENT ? CLIENT_API_URL : ADMIN_API_URL;\nexport const WS_URI = IS_CLIENT ? CLIENT_WS_URL : ADMIN_WS_URL;\n\n// api\nexport const API_JUMP_URL = process.env.REACT_APP_DOMAIN_ENABLE?`https://${fullDomain()}/bj/apis/v1/cs_url`:process.env.REACT_APP_NEW_DOMAIN?`https://${process.env.REACT_APP_NEW_DOMAIN}/bj/apis/v1/cs_url`:`${process.env.REACT_APP_API_URL_PREFIX}${MAIN_DOMAIN}/bj/apis/v1/cs_url`;\n\n// other\n","import * as Sentry from '@sentry/react';\nimport { BrowserTracing } from '@sentry/tracing';\n\n/**\n * level >> ['log', 'info', 'warn', 'error', 'debug', 'assert']\n * https://github.com/getsentry/sentry-electron/issues/90#issuecomment-425552746\n */\n\nexport const initSentry = () => {\n Sentry.init({\n environment: process.env.REACT_APP_SENTRY_ENV,\n dsn: 'https://8745fa511f0443989c38589ae0dd8e0e@o28588.ingest.sentry.io/5860240',\n integrations: [new BrowserTracing()],\n tracesSampleRate: 1.0,\n release: process.env.REACT_APP_VERSION,\n ignoreErrors: [\n 'ReferenceError',\n 'window.bannerNight',\n 'Failed to fetch',\n 'ResizeObserver loop',\n 'fullwide',\n 'Loading chunk',\n ],\n });\n};\n\nexport const sentryCaptureErr = (\n errorTitle = '',\n extraObj = { details: 'This is some extra information' },\n level = 'error',\n) => {\n Sentry.withScope(scope => {\n Object.keys(extraObj).forEach(key => {\n scope.setExtra(key, extraObj[key]);\n });\n scope.setLevel(level);\n Sentry.captureMessage(errorTitle);\n });\n};\n\nexport const testErrorBtn = () => {\n const throwMessage = () => {\n Sentry.captureMessage('[TEST] This is a log5 message', 'log');\n // Sentry.captureMessage('this is a info message', 'info');\n // Sentry.captureMessage('this is a warn message', 'warn');\n // Sentry.captureMessage('this is a error message', 'error');\n // Sentry.captureMessage('this is a debug message', 'debug');\n // Sentry.captureMessage('this is a assert message', 'assert');\n };\n\n return ;\n};\n","import { createSlice } from '@reduxjs/toolkit';\nimport { getStorage, setStorage } from '@/utils';\n\n/**\n * 存放權限相關\n * meInfo = {}\n * authRoutesInfo = [] // server 取得可看見的權限清單\n */\n\nconst authStorageKey = {\n meInfo: 'meInfo',\n authRoutesInfo: 'authRoutesInfo',\n authRoutesKey: 'authRoutesKey',\n};\n\nconst initialState = {\n meInfo: getStorage(authStorageKey.meInfo) || {},\n authRoutesInfo: getStorage(authStorageKey.authRoutesInfo) || [],\n authRoutesKey: getStorage(authStorageKey.authRoutesKey) || [],\n};\n\nexport const authSlice = createSlice({\n name: 'auth',\n initialState,\n reducers: {\n setMeInfo: (state, { payload }) => {\n setStorage(authStorageKey.meInfo, payload);\n state.meInfo = payload;\n },\n\n setAuthRoutesInfo: (state, { payload }) => {\n setStorage(authStorageKey.authRoutesInfo, payload);\n state.authRoutesInfo = payload;\n },\n\n setAuthRoutesKey: (state, { payload }) => {\n setStorage(authStorageKey.authRoutesKey, payload);\n state.authRoutesKey = payload;\n },\n\n // 移除暫存在 redux auth.js 裡面的內容\n resetAuth: state => {\n setStorage(authStorageKey.meInfo, null);\n setStorage(authStorageKey.authRoutesInfo, null);\n setStorage(authStorageKey.authRoutesKey, null);\n state.meInfo = {};\n state.authRoutesInfo = [];\n state.authRoutesKey = [];\n },\n },\n});\n\nexport const { setMeInfo, setAuthRoutesInfo, setAuthRoutesKey, resetAuth } =\n authSlice.actions;\nexport default authSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\nimport { getStorage, setStorage } from '@/utils';\n\n/**\n * 存放全局相關\n */\n\nconst globalStorageKey = {\n loginInfo: 'loginInfo',\n errorInfo: 'errorInfo',\n};\n\nconst initialState = {\n isLogin: getStorage(globalStorageKey.loginInfo)?.token ? true : false,\n loginInfo: getStorage(globalStorageKey.loginInfo) || {},\n loading: false,\n menuList: [],\n // controller\n visibleDrawer: { name: '', visible: false },\n beepEnabled: false,\n beepAudioSrc: '',\n};\n\nexport const globalSlice = createSlice({\n name: 'global',\n initialState,\n reducers: {\n setIsLogin: (state, { payload }) => {\n state.isLogin = payload;\n },\n\n setLoginInfo: (state, { payload }) => {\n setStorage(globalStorageKey.loginInfo, payload);\n state.loginInfo = payload;\n },\n\n setLogout: state => {\n // 保留 deviceUID\n const deviceUID = getStorage(globalStorageKey.loginInfo)?.deviceUID || '';\n const storage = deviceUID ? { deviceUID } : null;\n setStorage(globalStorageKey.loginInfo, storage);\n state.isLogin = false;\n },\n\n setGLoading: (state, { payload }) => {\n state.loading = payload;\n },\n\n setMenuList: (state, { payload }) => {\n state.menuList = payload;\n },\n\n setVisibleDrawer: (state, { payload }) => {\n state.visibleDrawer = payload;\n },\n setBeepEnabled: (state, { payload }) => {\n state.beepEnabled = payload;\n },\n setBeepAudioSrc: (state, { payload }) => {\n state.beepAudioSrc = payload;\n },\n },\n});\n\nexport const {\n setIsLogin,\n setLoginInfo,\n setLogout,\n setGLoading,\n setMenuList,\n setVisibleDrawer,\n setBeepEnabled,\n setBeepAudioSrc,\n} = globalSlice.actions;\nexport default globalSlice.reducer;\n","import { useState, useCallback } from 'react';\r\nimport { useQuery, useMutation } from '@apollo/client';\r\nimport apiType, { defaultOptions } from '@/services';\r\nimport { getToken, getDeviceId, isFunction } from '@/utils';\r\n\r\n/**\r\n * 不主動呼叫 , refetch 不會改變內建 loading 狀態\r\n * onCompleted bug > https://github.com/apollographql/react-apollo/issues/3943\r\n * @param {*} gql\r\n * @returns\r\n */\r\nconst useQueryApi = (gql, options = {}) => {\r\n if (!gql) throw new Error('gql is required');\r\n const [loading, setLoading] = useState(false);\r\n const { refetch } = useQuery(gql, {\r\n skip: true,\r\n ...options,\r\n context: { ...defaultOptions, ...options.context },\r\n });\r\n const fetchData = useCallback(\r\n async variables => {\r\n try {\r\n setLoading(true);\r\n const { data, errors: error } = await refetch(variables);\r\n options?.onSuccess && options.onSuccess(data);\r\n return { data, error };\r\n } catch (error) {\r\n // console.log('useQueryApi err message: ', JSON.stringify(error));\r\n options?.onError && options.onError(error);\r\n return { data: null, error };\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [refetch],\r\n );\r\n return { fetchData, loading };\r\n};\r\n\r\n/**\r\n * @param {*} gql apiType ( can use apiType to find )\r\n * @param {*} isShowGeneralError 是否要走通用error彈窗\r\n * @param {*} callback 要自訂error callback的話用這個\r\n */\r\nconst useMutationApi = (gql, options = {}, callback = {}) => {\r\n if (!gql) throw new Error('gql is required');\r\n const {\r\n onSuccess = () => {},\r\n onError = () => {},\r\n context,\r\n ..._options\r\n } = options;\r\n const [mutate, result] = useMutation(gql, {\r\n skip: true,\r\n ..._options,\r\n context: { ...defaultOptions, ...context },\r\n });\r\n\r\n const mutateWrap = useCallback(\r\n async variables => {\r\n try {\r\n const res = await mutate({ variables });\r\n if (res.errors) throw new Error(res.errors);\r\n onSuccess(res, { ...variables });\r\n return [null, res];\r\n } catch (errors) {\r\n // 檢查自定義 callback\r\n const { message } = errors;\r\n if (isFunction(callback[message])) callback[message]();\r\n onError(errors);\r\n return [errors, null];\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [mutate],\r\n );\r\n return [mutateWrap, result];\r\n};\r\n\r\nconst useFetch = () => {\r\n const token = getToken(true);\r\n const deviceUID = getDeviceId();\r\n const [loading, setLoading] = useState(false);\r\n\r\n const fetchApi = useCallback(\r\n async (\r\n url,\r\n {\r\n cusHeaders = null,\r\n headers = {},\r\n method = 'GET',\r\n body = null,\r\n resType = 'json',\r\n } = {},\r\n ) => {\r\n setLoading(true);\r\n try {\r\n const response = await fetch(url, {\r\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\r\n method,\r\n body,\r\n headers: cusHeaders || {\r\n 'X-Device-ID': deviceUID,\r\n Authorization: token,\r\n ...headers,\r\n },\r\n });\r\n if (response.status !== 200) {\r\n const errorJson = await response.json();\r\n return { error: errorJson };\r\n }\r\n const returnType = {\r\n blob: res => res.blob(),\r\n json: res => res.json(),\r\n };\r\n return {\r\n data: returnType[resType]\r\n ? await returnType[resType](response)\r\n : response,\r\n };\r\n } catch (error) {\r\n console.log('getFetch error', error);\r\n return { error };\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [deviceUID, token],\r\n );\r\n\r\n return { fetchApi, loading };\r\n};\r\n\r\nexport { useQueryApi, useMutationApi, apiType, useFetch };\r\n","import { SubscriptionClient } from 'subscriptions-transport-ws'; // 使用 subscription\nimport { WebSocketLink } from '@apollo/client/link/ws';\nimport { WS_URI } from '@/const';\n// import { sentryCaptureErr } from './sentry';\n\n// 執行 close\nconst originalClose = SubscriptionClient.prototype.close;\nSubscriptionClient.prototype.close = function close(...args) {\n if (this.client) {\n this.client.onopen = null;\n this.client.onclose = null;\n this.client.onerror = null;\n this.client.onmessage = null;\n }\n originalClose.apply(this, args);\n};\nexport const wsClient = new SubscriptionClient(WS_URI, {\n reconnect: true,\n});\nexport const wsLink = new WebSocketLink(wsClient);\n\nexport const wsStatusHandle = (callback = () => {}) => {\n wsClient.onError(error => {\n callback({ status: 'onError' });\n // sentryCaptureErr(error);\n wsClient.client &&\n (wsClient.client.onclose = function (e) {\n callback({\n status: 'onClose',\n data: { code: e.code || '', reason: e.reason },\n });\n // sentryCaptureErr('ws onClose', { code: e.code || '', reason: e.reason });\n });\n });\n\n wsClient.onConnecting(e => {\n console.log('onConnecting', e);\n callback({ status: 'onConnecting', data: e });\n });\n wsClient.onConnected(e => {\n console.log('onConnected', e);\n callback({ status: 'onConnected', data: e });\n });\n wsClient.onReconnecting(e => {\n console.log('onReconnecting', e);\n callback({ status: 'onReconnecting', data: e });\n });\n wsClient.onReconnected(e => {\n console.log('onReconnected', e);\n callback({ status: 'onReconnected', data: e });\n });\n wsClient.onDisconnected(e => {\n console.log('onDisconnected', e);\n callback({ status: 'onDisconnected', data: e });\n });\n};\n","import {\n ApolloClient,\n ApolloLink,\n InMemoryCache,\n split,\n from,\n} from '@apollo/client';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { onError as ErrorLink } from '@apollo/client/link/error';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { createUploadLink } from 'apollo-upload-client'; // 使用graph上傳資料\nimport { IS_CLIENT, HTTP_URI } from '@/const';\nimport { sentryCaptureErr } from '@/plugin/sentry';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport { useLogoutProcess } from '@/hook/useLogout';\nimport {\n getToken,\n getDeviceId,\n isLogoutErrorCode,\n isSendSentryErrorCode,\n getErrorMessage,\n} from '@/utils';\nimport { wsLink } from './ws';\n\n/**\n * authMiddleware\n */\nconst traceID = () => Math.random().toString(36).substring(2, 9);\n\nconst authMiddleware = new ApolloLink((operation, forward) => {\n // 處理 app & client header\n let headers = {};\n headers = {\n Authorization: IS_CLIENT\n ? `${getToken(true, 'clientUserInfo')}`\n : `${getToken(true)}`,\n 'X-Device-ID': IS_CLIENT\n ? `${getDeviceId('clientUserInfo')}`\n : `${getDeviceId()}`,\n 'X-Trace-ID': traceID(),\n };\n operation.setContext({ headers: { ...headers } });\n return forward(operation);\n});\n\n/**\n * http 連線處理\n */\nconst httpLink = createUploadLink({\n uri: HTTP_URI,\n credentials: 'include', // TODO 不確定\n});\n\n// 這裡區分 query 的時候要用哪種模式 wsLink 與 httpLink\n// 由 apollo 提供的 getMainDefinition 去判斷\nconst splitLink = split(\n ({ query }) => {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n },\n wsLink,\n httpLink,\n);\n\n/**\n * 建立連線\n * */\n\nconst createErrorLink = onError => {\n return new ErrorLink(({ graphQLErrors, networkError, operation }) => {\n onError({\n graphQLErrors,\n networkError,\n extras: operation?.getContext(),\n operation,\n });\n });\n};\n\nconst createApolloClient = ({ onError }) => {\n return new ApolloClient({\n link: from([authMiddleware, createErrorLink(onError), splitLink]),\n cache: new InMemoryCache({\n typePolicies: {\n Query: {\n fields: {\n listMenu: {\n merge(existing = [], incoming = []) {\n return incoming;\n },\n },\n authority: {\n merge(existing = [], incoming = []) {\n return incoming;\n },\n },\n },\n },\n MsgInvite: { keyFields: ['inviteeUserIDs'] },\n ListUserRoomResp: { keyFields: ['userRooms'] },\n ConsultingRoomOrigin: { keyFields: ['id', 'customerServices'] },\n RoomConsultingDetail: { keyFields: ['roomID'] },\n },\n }),\n });\n};\n\nconst CusApolloProvider = ({ children, ...props }) => {\n const { onErrorMsg } = useAlertMessage();\n const { logoutProcess } = useLogoutProcess();\n\n const handleApiError = ({\n graphQLErrors,\n networkError,\n operation,\n extras,\n }) => {\n const { operationName, variables } = operation;\n const headers = operation.getContext().headers;\n const { isShowGeneralError = true, getError = () => {} } = extras || {};\n if (graphQLErrors) {\n graphQLErrors.forEach(err => {\n const errCode = err?.message || '';\n console.log('errCode', errCode);\n console.log('variables', variables);\n console.log('operationName', operationName);\n console.log('errStr', JSON.stringify(err || ''));\n\n // 需要登出的錯誤\n if (isLogoutErrorCode(errCode)) logoutProcess();\n // 需要送sentry的錯誤\n if (isSendSentryErrorCode(errCode)) {\n // sentry capture\n sentryCaptureErr(\n `SendSentryErrorCode[${errCode}]-${networkError?.name || ''}`,\n {\n networkError: networkError ? JSON.stringify(networkError) : '',\n graphQLErrors: JSON.stringify(err || ''),\n operationName,\n traceID: headers['X-Trace-ID'],\n variables: JSON.stringify(variables),\n },\n );\n }\n if (isShowGeneralError) onErrorMsg(getErrorMessage(errCode));\n // 將錯誤碼和原來的處理方式傳回使用api的組件\n getError(errCode);\n });\n } else if (networkError) {\n let errorTitle = `${networkError}`;\n // network offline\n if (typeof window !== 'undefined' && !window.navigator.onLine) {\n errorTitle = '网路连线不稳';\n }\n onErrorMsg(errorTitle);\n // sentry capture\n // sentryCaptureErr(\n // `${networkError}-${process.env.REACT_APP_NAME}`,\n // {\n // traceID: headers['X-Trace-ID'],\n // graphQLErrors: JSON.stringify(graphQLErrors || ''),\n // operationName,\n // variables: JSON.stringify(variables),\n // });\n }\n };\n\n const client = createApolloClient({ onError: handleApiError });\n\n return (\n \n {children}\n \n );\n};\n\nexport { CusApolloProvider };\n","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { resetAuth } from '@/store/auth';\nimport { setIsLogin, setLogout, setGLoading } from '@/store/global';\nimport { useMutationApi, apiType } from '@/hook/useApi';\nimport { removeStorage } from '@/utils';\n\nconst useLogout = () => {\n const dispatch = useDispatch();\n\n /**\n * 登出\n */\n const [logoutFetch] = useMutationApi(apiType.POST_LOGOUT);\n const fetchLogout = useCallback(async () => {\n dispatch(setGLoading(true));\n const [err] = await logoutFetch();\n if (err) return [err, null];\n\n // 登出成功處理\n dispatch(setLogout());\n dispatch(resetAuth());\n dispatch(setGLoading(false));\n dispatch(setIsLogin(false));\n removeStorage('businessSystemMsgLog');\n }, [dispatch, logoutFetch]);\n\n return { fetchLogout };\n};\n\n// 專給 apollo 登出使用\nexport const useLogoutProcess = () => {\n const dispatch = useDispatch();\n const logoutProcess = useCallback(() => {\n dispatch(setLogout());\n dispatch(resetAuth());\n dispatch(setGLoading(false));\n dispatch(setIsLogin(false));\n removeStorage('businessSystemMsgLog');\n }, [dispatch]);\n return { logoutProcess };\n};\n\nexport default useLogout;\n","import { ThemeProvider } from 'styled-components';\nconst { theme } = require('@/plugin/theme');\n\nconst CusThemeProvider = ({ children, ...props }) => {\n return (\n \n {children}\n \n );\n};\n\nexport { CusThemeProvider };\n","import { createSlice } from '@reduxjs/toolkit';\nimport { removeStorage, setStorage } from '@/utils';\n\nconst initialState = {\n clientUserInfo: {}, // 遊客相關資訊\n isLogin: false,\n isLoading: false,\n gLoading: true,\n csRoomSetting: {},\n csRoomForm: {},\n csRoomQueueList: [],\n renew: false, // 重新拉取房間 msgList\n};\n\nexport const clientSlice = createSlice({\n name: 'client',\n initialState,\n reducers: {\n setClientUserInfo: (state, { payload }) => {\n state.clientUserInfo = payload;\n setStorage('clientUserInfo', payload);\n },\n\n setIsLogin: (state, { payload }) => {\n state.isLogin = payload;\n },\n\n setIsLoading: (state, { payload }) => {\n state.isLoading = payload;\n },\n setGLoading: (state, { payload }) => {\n state.gLoading = payload;\n },\n\n setCSRoomSetting: (state, { payload }) => {\n state.csRoomSetting = payload;\n },\n setCSRoomSettingBeepEnabled: state => {\n state.csRoomSetting = {\n ...state.csRoomSetting,\n beepEnabled: !state.csRoomSetting.beepEnabled,\n };\n },\n setCsRoomForm: (state, { payload }) => {\n state.csRoomForm = payload;\n },\n setCSRoomQueueList: (state, { payload }) => {\n state.csRoomQueueList = payload;\n },\n setRenew: (state, { payload }) => {\n state.renew = payload;\n },\n\n resetClient: state => {\n removeStorage('clientUserInfo');\n state.clientUserInfo = {};\n state.isLogin = false;\n state.isLoading = false;\n state.renew = false;\n },\n },\n});\n\nexport const {\n setClientUserInfo,\n setIsLogin,\n setIsLoading,\n setGLoading,\n setCSRoomSetting,\n setCSRoomSettingBeepEnabled,\n setCsRoomForm,\n setCSRoomQueueList,\n resetClient,\n setRenew,\n} = clientSlice.actions;\nexport default clientSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\n\n/**\n * 房間相關\n */\nconst initialState = {\n currentInRoomID: 0, // 當前打inRoom 的房間\n currentRoomID: 0,\n roomDetail: null,\n roomUsersMap: {},\n\n // 其他\n csTotalUnRead: 0, // 諮詢房未讀訊息總數\n redPoint: {},\n};\n\nexport const roomSlice = createSlice({\n name: 'room',\n initialState,\n reducers: {\n setCurrentInRoomID: (state, { payload }) => {\n state.currentInRoomID = payload;\n },\n setRoomDetail: (state, { payload }) => {\n state.roomDetail = payload;\n state.currentRoomID = payload?.room.roomID || 0;\n },\n setRoomUsersMap: (state, { payload }) => {\n state.roomUsersMap = payload;\n },\n // 其他\n setCsTotalUnRead: (state, { payload }) => {\n state.csTotalUnRead = payload;\n },\n setRedPoint: (state, { payload }) => {\n state.redPoint = payload;\n },\n },\n});\n\nexport const {\n setCurrentInRoomID,\n setRoomDetail,\n setRoomUsersMap,\n setCsTotalUnRead,\n setRedPoint,\n} = roomSlice.actions;\nexport default roomSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\n\n/**\n * 房間訊息相關\n */\nconst initialState = {\n roomMsg: [],\n // roomMsgTotal: 0,\n lastReadID: 0,\n hasMoreMsg: true,\n currPreRoomIdx: 0,\n currPreRoomID: 0,\n};\n\nexport const roomMsgSlice = createSlice({\n name: 'roomMsg',\n initialState,\n reducers: {\n setRoomMsg: (state, { payload }) => {\n state.roomMsg = payload;\n },\n // setRoomMsgTotal: (state, { payload }) => {\n // state.roomMsgTotal = payload;\n // },\n setLastReadID: (state, { payload }) => {\n state.lastReadID = payload;\n },\n setHasMoreMsg: (state, { payload }) => {\n state.hasMoreMsg = payload;\n },\n setCurrPreRoomIdx: (state, { payload }) => {\n state.currPreRoomIdx = payload;\n },\n setCurrPreRoomID: (state, { payload }) => {\n state.currPreRoomID = payload;\n },\n resetRoomMsg: state => {\n state.roomMsg = [];\n state.roomMsgTotal = 0;\n state.lastReadID = 0;\n state.hasMoreMsg = true;\n state.currPreRoomIdx = 0;\n state.currPreRoomID = 0;\n },\n },\n});\n\nexport const {\n setRoomMsg,\n // setRoomMsgTotal,\n setLastReadID,\n setHasMoreMsg,\n setCurrPreRoomIdx,\n setCurrPreRoomID,\n resetRoomMsg,\n} = roomMsgSlice.actions;\nexport default roomMsgSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\n/**\n * 存放 訂閱內容 ws狀態\n */\nconst initialState = {\n recMsg: null,\n wsStatusInfo: { status: '', data: {} },\n};\n\nexport const authSlice = createSlice({\n name: 'subscribe',\n initialState,\n reducers: {\n setRecMsg: (state, { payload }) => {\n // console.log('recMsg===', payload);\n state.recMsg = payload;\n },\n setWsStatusInfo: (state, { payload }) => {\n state.wsStatusInfo = payload;\n },\n },\n});\n\nexport const { setRecMsg, setWsStatusInfo } = authSlice.actions;\nexport default authSlice.reducer;\n","import { configureStore } from '@reduxjs/toolkit';\nimport global from './global';\nimport auth from './auth';\nimport client from './client';\nimport room from './room';\nimport roomMsg from './roomMsg';\nimport subscribe from './subscribe';\n\n// 創建 store\nconst configureAppStore = () => {\n const store = configureStore({\n reducer: {\n global,\n auth,\n client,\n room,\n roomMsg,\n subscribe,\n },\n });\n return store;\n};\n\nconst store = configureAppStore();\nexport default store;\n","/* eslint-disable no-use-before-define */\nimport { useMemo, useCallback } from 'react';\nimport { Modal, Typography } from 'antd';\nimport { BrowserType, isStorageAccessAllow } from '@/utils';\nexport { BrowserType };\n\n// const SOGOU_DOWNLOAD_URL = 'https://ie.sogou.com/';\nconst CHROME_DOWNLOAD_URL = 'https://www.google.com/intl/zh-CN/chrome/';\n\n// 搜狗\n// Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0\n// 獵豹\n// Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36\n// IE\n// Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; McAfee; rv:11.0) like Gecko\n// UC\n// Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X; zh-CN) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16G102 UCBrowser/13.9.8.1767 Mobile AliApp(TUnionSDK/0.1.20.4)\n\nconst AGENT = window.navigator.userAgent;\nconst checkBrowser = () => {\n if (\n AGENT.indexOf(BrowserType['IE']) > 0 ||\n AGENT.indexOf('Trident/') > 0 ||\n !!document.documentMode\n )\n return 'IE';\n if (AGENT.indexOf(BrowserType['Edge']) > 0 || !!window.StyleMedia) {\n return BrowserType['Edge'];\n }\n if (AGENT.indexOf(BrowserType['Firefox']) >= 0) return BrowserType['Firefox'];\n if (AGENT.indexOf(BrowserType['Opera']) >= 0) return BrowserType['Opera'];\n if (AGENT.indexOf(BrowserType['Sogou']) >= 0) return BrowserType['Sogou'];\n if (AGENT.indexOf(BrowserType['Chrome']) >= 0) return BrowserType['Chrome'];\n if (AGENT.indexOf(BrowserType['Safari']) >= 0) return BrowserType['Safari'];\n if (AGENT.indexOf(BrowserType['Netscape']) >= 0)\n return BrowserType['Netscape'];\n if (AGENT.indexOf(BrowserType['UC']) >= 0) return BrowserType['UC'];\n const text = 'no mapping browser';\n console.log(text, AGENT);\n return '';\n};\n\nexport const fullScreenHandle = (href = '') => {\n let a = document.createElement('a');\n a.href = href || window.location.href;\n a.target = '_blank';\n a.click();\n};\n\nfunction useBrowser() {\n const browser = useMemo(() => checkBrowser(), []);\n\n /**\n * 推薦下載瀏覽器\n * */\n const browserWarningModel = useCallback(okCallback => {\n Modal.warning({\n title: '注意',\n content: (\n <>\n 当前浏览器过旧!\n
\n 为达到最好的体验品质,请更換浏览器。\n fullScreenHandle(CHROME_DOWNLOAD_URL)}\n style={{ color: '#6993FF', cursor: 'pointer' }}>\n 立即下载 Chrome 浏览器\n \n \n ),\n okText: '已下载',\n centered: true,\n onOk: close => (okCallback ? okCallback(close) : close()),\n });\n }, []);\n\n // 檢查是否為IE\n const checkIsOldBrowser = useCallback(\n okCallback => {\n browser === 'IE'\n ? browserWarningModel(okCallback)\n : okCallback && okCallback();\n },\n [browser, browserWarningModel],\n );\n\n /**\n * cookie access 權限檢查 (不允許就另開全螢幕)\n */\n const accessWarningModal = useCallback(() => {\n Modal.confirm({\n content: (\n <>\n 请允许 Cookie 存取!\n

\n 为达到最好的服务品质\n
\n {'请至浏览器设定 > 隐私权 > 允许第三方 Cookie 存取或关闭阻挡\b第三方'}\n Cookie 设定。\n
\n 设定完成后请重新整理页面。\n

\n \n ),\n okText: '已开启权限',\n cancelText: '不允许存取',\n centered: true,\n onOk: close => {\n checkIsAccessAllow(close);\n },\n onCancel: () => {\n // 不允許存取就開啟新頁面\n fullScreenHandle();\n checkIsAccessAllow();\n },\n });\n }, [checkIsAccessAllow]);\n\n const checkIsAccessAllow = useCallback(\n okCallback => {\n isStorageAccessAllow()\n ? okCallback && okCallback()\n : accessWarningModal(okCallback);\n },\n [accessWarningModal],\n );\n\n return { browser, checkIsOldBrowser, checkIsAccessAllow };\n}\n\nexport default useBrowser;\n","import styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { Box } from '@WRAP_COMP';\nimport { Outlet } from 'react-router-dom';\nimport { useEffect } from 'react';\n\nconst BoxWrap = styled(Box)`\n height: 100vh;\n height: calc(var(--vh, 1vh) * 100);\n`;\nfunction CenterLayout({ children }) {\n const handleResize = () => {\n let vh = window.innerHeight * 0.01;\n document\n .getElementById('CenterLayout')\n .style.setProperty('--vh', `${vh}px`);\n };\n\n useEffect(() => {\n handleResize()\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return (\n \n {children || }\n \n );\n}\n\nCenterLayout.propTypes = {\n bg: PropTypes.string,\n pd: PropTypes.string,\n center: PropTypes.bool,\n};\n\nexport default CenterLayout;\n","import { useQueryApi, apiType } from '@/hook/useApi';\nimport { sentryCaptureErr } from '@/plugin/sentry';\n\nfunction useTrackingCode() {\n // const srcReg = /src=['\"]?([^'\"]*)['\"]?/i;\n // const trackingCodeType = {\n // [AdTrackingType['Google']]: codStr => {\n // const divEl = document.createElement('div');\n // divEl.innerHTML = codStr;\n // divEl.childNodes.forEach(node => {\n // if (node.nodeType === 1) {\n // const newScript = document.createElement('script');\n // node.src && (newScript.src = node.src);\n // node.src && (newScript.async = true);\n // node.innerHTML && (newScript.innerHTML = node.innerHTML);\n // document.head.appendChild(newScript);\n // }\n // });\n // },\n // [AdTrackingType['CNZZ']]: codStr => {\n // const divEl = document.createElement('div');\n // divEl.innerHTML = codStr;\n // console.log('childNodes', divEl.childNodes);\n // // const script = document.createElement('script');\n // // script.src =\n // // 'https://s4.cnzz.com/z_stat.php?id=1281137078&web_id=1281137078';\n // // document.body.appendChild(script);\n // },\n\n // [AdTrackingType['Baidu']]: codStr => {\n // const script = document.createElement('script');\n // script.src = codStr;\n // document.head.appendChild(script);\n // },\n // };\n\n const trackingCodeAppendHandle = codStr => {\n try {\n const divEl = document.createElement('div');\n divEl.innerHTML = codStr;\n divEl.childNodes.forEach(node => {\n if (node.nodeType === 1) {\n const newScript = document.createElement('script');\n node.src && (newScript.src = node.src);\n node.src && (newScript.async = true);\n node.innerHTML && (newScript.innerHTML = node.innerHTML);\n document.head.appendChild(newScript);\n }\n });\n } catch (error) {\n sentryCaptureErr(error, { func: 'trackingCodeAppendHandle' });\n }\n };\n\n const { fetchData } = useQueryApi(apiType.LIST_AD_TRACKING, {\n context: { isShowGeneralError: false },\n });\n const fetchAdTrackings = async () => {\n const { error, data } = await fetchData({\n filter: { isClient: true },\n });\n if (error) return;\n const adTrackings = data?.listAdTracking?.adTrackings || [];\n adTrackings.forEach(el => trackingCodeAppendHandle(el.adTrackingCode));\n };\n\n return { fetchAdTrackings };\n}\n\nexport default useTrackingCode;\n","import React, { useEffect, useCallback, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Outlet } from 'react-router-dom';\nimport { API_JUMP_URL } from '@/const';\nimport { Spin } from 'antd';\nimport { wsStatusHandle } from '@/plugin/ws';\nimport {\n setClientUserInfo,\n setCSRoomSetting,\n setCsRoomForm,\n setCSRoomQueueList,\n} from '@/store/client';\nimport { setWsStatusInfo } from '@/store/subscribe';\nimport { useQueryApi, apiType, useFetch } from '@/hook/useApi';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport useBrowser from '@/hook/useBrowser';\nimport CenterLayout from '@/components/Layout/CenterLayout';\nimport { asyncLocalStorage, csRoomUrlParams } from '@/utils';\nimport useTrackingCode from '@/hook/useTrackingCode';\n\nconst enabled = val => val === 'Yes';\n\nconst handleBrowserTabStyle = ({ title, icon }) => {\n document.title = title;\n if (icon) {\n const oldLink = document.getElementById('favicon-link');\n const link = document.createElement('link');\n link.id = 'favicon-link';\n link.rel = 'shortcut icon';\n link.href = icon;\n\n oldLink && document.head.removeChild(oldLink);\n document.head.appendChild(link);\n }\n};\n\nfunction GlobalClient() {\n const dispatch = useDispatch();\n\n const [loading, setLoading] = useState(true);\n\n /**\n * ws 狀態\n */\n const { wsStatusNotify } = useAlertMessage();\n const { wsStatusInfo } = useSelector(({ subscribe }) => subscribe);\n useEffect(() => {\n wsStatusNotify(wsStatusInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [wsStatusInfo]);\n\n /**\n * 諮前表單處理\n */\n const csRoomFormHandle = form => {\n const formSettingData = {\n title: form.title || '',\n formDataList: form.formData || [],\n isVerificationCode: form.isVerificationCode === 'Yes',\n isEnabled: form.isEnabled === 'Yes',\n };\n dispatch(setCsRoomForm(formSettingData));\n };\n\n /**\n * 諮詢房設定處理\n */\n const csRoomSettingHandle = setting => {\n const { header = {}, content = {}, banner = {} } = setting;\n\n const settingData = {\n headerLogoURL: enabled(header.isEnabled) ? header.logoURL || '' : '',\n headerBgColor: header.backgroundColor || '',\n contentLogoURL: enabled(header.contentLogoEnabled)\n ? header.contentLogoURL || []\n : [],\n contentLogoPosition: header.contentLogoPosition,\n\n bgImgURL: content.backgroundImageURL || '',\n bgColor: content.backgroundColor || '',\n boxBgColor: content.boxBackgroundColor || '',\n boxBgImgURL: content.boxBackgroundImageURL || '',\n\n bannerImgURL: enabled(banner.isEnabled) ? banner.imageURL || '' : '',\n bannerLinkURL: banner.linkUrl || '',\n\n beepURL: setting.beepURL || '',\n showBeepBtn: enabled(setting.beepEnabled),\n beepEnabled: enabled(setting.beepEnabled),\n queueEnabled: enabled(setting.queueEnabled),\n autoCreatedCSEnable: enabled(setting.enterDirectlyEnabled),\n redirectVerifyEnabled: enabled(setting.redirectVerifyEnabled),\n };\n handleBrowserTabStyle({\n title: setting.header.title,\n icon: setting.header.avatarURL,\n });\n dispatch(setCSRoomSetting(settingData));\n };\n\n /**\n * 排隊進線問題處理\n */\n const csRoomQueueQsListHandle = list => {\n dispatch(setCSRoomQueueList(list));\n };\n\n /**\n * 取得 諮詢房設定 + 詢前表單\n */\n const { fetchData: fetchCSRoomSettingAndForm } = useQueryApi(\n apiType.GET_CS_ROOM_SETTING_AND_FORM,\n {\n context: { isShowGeneralError: false },\n onSuccess: data => {\n try {\n const {\n getConsultingRoomClientSetting,\n getConsultingRoomForm,\n listConsultingRoomQuestion: { consultingRoomQuestions: queueList },\n } = data;\n csRoomSettingHandle(getConsultingRoomClientSetting || {});\n csRoomFormHandle(getConsultingRoomForm);\n csRoomQueueQsListHandle(queueList);\n\n wsStatusHandle(({ status, data }) => {\n dispatch(setWsStatusInfo({ status, data }));\n });\n\n setLoading(false);\n } catch (error) {\n console.log('fetchCSRoomSettingAndFormHandel', error);\n }\n },\n },\n );\n\n /**\n * 檢查 local 資訊\n */\n const processInit = async () => {\n let userInfo = await asyncLocalStorage.getItem('clientUserInfo');\n dispatch(setClientUserInfo(userInfo || {}));\n fetchCSRoomSettingAndForm(); // setting 資料\n };\n\n /**\n * 埋碼處理\n */\n const { fetchAdTrackings } = useTrackingCode();\n\n /**\n * 跳轉處理\n */\n const redirectURLHandle = useCallback((url = '', { token = '' }) => {\n let redirectURL = '';\n let paramsSymbol = url.indexOf('?') > 0 ? '&' : '?';\n const URL_SEARCH = window.location.search;\n try {\n if (URL_SEARCH) {\n // 將 token 以及其他 params 重新組合 url (因為其他客服會有不同 params)\n let urlSearchParams = new URLSearchParams(URL_SEARCH);\n urlSearchParams.set('token', token); // 賦值最新 token\n redirectURL = `${url}${paramsSymbol}${urlSearchParams.toString()}`;\n } else {\n redirectURL = `${url}${paramsSymbol}token=${token}`;\n }\n let a = document.createElement('a');\n a.href = redirectURL;\n a.target = '_self';\n a.click();\n } catch (error) {\n console.log('redirectURLHandle error', error);\n }\n }, []);\n\n const { fetchApi, loading: jumpLoading } = useFetch();\n const jumpHandle = async () => {\n try {\n let isJump = false;\n let tokenParams = '';\n\n // jump api url 組合\n tokenParams = csRoomUrlParams.token\n ? csRoomUrlParams.token\n : (await asyncLocalStorage.getItem('jumpToken')) || '';\n\n const fetchUrl = `${API_JUMP_URL}?token=${tokenParams}&sd=${csRoomUrlParams.sourceDomain}`;\n const { error, data } = await fetchApi(fetchUrl, {\n headers: { 'content-type': 'application/json' },\n });\n if (error) return isJump;\n const { isJump: resIsJump = false, token = '', url = '' } = data;\n await asyncLocalStorage.setItem('jumpToken', token); // local 上的 token\n if (resIsJump) redirectURLHandle(url, { token });\n isJump = resIsJump;\n return isJump;\n } catch (error) {\n console.log('jumpHandle error', error);\n }\n };\n\n // 瀏覽器檢查\n const { checkIsOldBrowser, checkIsAccessAllow } = useBrowser();\n useEffect(() => {\n const initCheck = () => {\n fetchAdTrackings();\n checkIsOldBrowser(close => {\n close && close();\n checkIsAccessAllow(async close => {\n close && close();\n const isJump = await jumpHandle();\n if (!isJump) processInit();\n });\n });\n };\n initCheck();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n \n {jumpLoading || loading ? (\n \n ) : (\n \n )}\n \n );\n}\n\nexport default GlobalClient;\n","import { useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setMeInfo, setAuthRoutesInfo, setAuthRoutesKey } from '@/store/auth';\nimport { useQueryApi, apiType } from '@/hook/useApi';\nimport { AccountTypeKeys } from '@/utils';\n\n/**\n * @returns {Function} fetchMeHandler\n */\nconst useMe = () => {\n const { meInfo, authRoutesKey, authRoutesInfo } = useSelector(\n ({ auth }) => auth,\n );\n const isSystemType = meInfo.accountType === AccountTypeKeys['System'];\n const isMonitorType = meInfo.accountType === AccountTypeKeys['Monitor'];\n\n /**\n * 根據 arr 組出 keys\n * @param {Array} arr\n * @returns {Array} keys\n */\n const authorityKeysHandle = useCallback(arr => {\n return arr.reduce((acc, cur) => {\n return acc.concat(\n Array.isArray(cur.next)\n ? [...authorityKeysHandle(cur.next), cur.key]\n : cur.key,\n );\n }, []);\n }, []);\n\n /**\n * 取得 me 資訊\n * @returns {Object} { data 使用者資訊, error 錯誤訊息 }\n */\n const dispatch = useDispatch();\n const { fetchData } = useQueryApi(apiType.GET_ME);\n const fetchMeHandler = useCallback(async () => {\n const { data, error } = await fetchData();\n if (error) return { error };\n const { menu = [], ...meInfo } = data.Me;\n const authKeys = authorityKeysHandle(menu);\n dispatch(setMeInfo(meInfo));\n dispatch(setAuthRoutesInfo(menu));\n dispatch(setAuthRoutesKey(authKeys));\n return { data: { ...data.Me, authKeys } };\n }, [authorityKeysHandle, dispatch, fetchData]);\n\n return {\n meInfo,\n authRoutesKey,\n authRoutesInfo,\n isSystemType,\n isMonitorType,\n fetchMeHandler,\n authorityKeysHandle,\n };\n};\nexport default useMe;\n","import { useEffect, useCallback, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport {\n ReceiveMsgContentType,\n RoomStatusKeys,\n MsgStatusKeys,\n MsgSystemType,\n OrderStatusKeys,\n} from '@/utils';\n\n// 一般訊息類\nconst REC_MSG_COMMON_CONTENT_TYPE = [\n ReceiveMsgContentType['Text'],\n ReceiveMsgContentType['File'],\n ReceiveMsgContentType['Voice'],\n ReceiveMsgContentType['Join'],\n ReceiveMsgContentType['Leave'],\n ReceiveMsgContentType['Invite'],\n ReceiveMsgContentType['Bubble'],\n];\n\n/**\n * 接收ws 訊息 各種 type || 自定義狀態 處理\n * @param.msgID {Number} 自訂判斷 沒設定就直接回傳對應狀態,有設定就比對 roomID 回傳\n * @param.roomID {Number} 自訂判斷 沒設定就直接回傳對應狀態,有設定就比對 roomID 回傳\n */\nfunction useRecMessage({\n msgID = 0,\n roomID = 0,\n meID = 0,\n\n // contentType\n hi = () => {},\n join = () => {},\n leave = () => {},\n roomUpdate = () => {},\n bizSystem = () => {},\n typing = () => {},\n userOnlineInfo = () => {},\n lastRead = () => {},\n system = () => {},\n bubble = () => {},\n\n // msg Status\n msgStatusRetract = () => {},\n\n // csRoom Status\n csRoomStatusActive = () => {},\n csRoomStatusProcessing = () => {},\n csRoomStatusDeactivated = () => {},\n\n // system\n userOrder = () => {},\n payList = () => {},\n systemText = () => {},\n\n // order\n orderStatusCancel = () => {},\n orderStatusPending = () => {},\n orderStatusApproving = () => {},\n\n // 自定義 type\n msgCommonType = () => {},\n returnCallback = () => {},\n} = {}) {\n const { recMsg } = useSelector(({ subscribe }) => subscribe);\n const settingIDProcess = useCallback(async (settingID, recID, callback) => {\n if (!callback) return;\n settingID ? settingID === recID && callback() : callback();\n }, []);\n\n const roomUpdateHandle = useCallback(\n recMsg => {\n roomUpdate(recMsg);\n const { status } = recMsg.roomUpdate.consultingDetail;\n const csStatusTypeMap = {\n [RoomStatusKeys['Active']]: csRoomStatusActive,\n [RoomStatusKeys['Processing']]: csRoomStatusProcessing,\n [RoomStatusKeys['Deactivated']]: csRoomStatusDeactivated,\n };\n settingIDProcess(meID, recMsg.from.userID, () =>\n csStatusTypeMap[status]?.(recMsg),\n );\n },\n [\n roomUpdate,\n csRoomStatusActive,\n csRoomStatusProcessing,\n csRoomStatusDeactivated,\n meID,\n settingIDProcess,\n ],\n );\n\n const systemHandle = useCallback(\n recMsg => {\n system(recMsg);\n const { type, content } = recMsg.system;\n const userOrderHandle = ({ orderStatus }) => {\n userOrder(recMsg);\n const orderStatusMap = {\n [OrderStatusKeys['Canceled'].key]: orderStatusCancel, // 取消訂單\n [OrderStatusKeys['Pending'].key]: orderStatusPending, // 進行中訂單\n [OrderStatusKeys['Waiting'].key]: orderStatusApproving, // 審核中訂單\n };\n settingIDProcess(msgID, recMsg.id, () =>\n orderStatusMap[orderStatus]?.(recMsg),\n );\n };\n const payListHandle = () => payList(recMsg);\n const systemTextHandle = () => systemText(recMsg);\n const msgSystemTypeMap = {\n [MsgSystemType['UserOrder']]: userOrderHandle,\n [MsgSystemType['PayList']]: payListHandle,\n [MsgSystemType['Text']]: systemTextHandle,\n };\n msgSystemTypeMap[type] && msgSystemTypeMap[type](content);\n },\n [\n msgID,\n system,\n payList,\n systemText,\n userOrder,\n orderStatusCancel,\n orderStatusPending,\n orderStatusApproving,\n settingIDProcess,\n ],\n );\n\n const contentTypeHandleMap = useMemo(\n () => ({\n [ReceiveMsgContentType['Hi']]: hi,\n [ReceiveMsgContentType['Join']]: join,\n [ReceiveMsgContentType['Leave']]: leave,\n [ReceiveMsgContentType['Typing']]: typing,\n [ReceiveMsgContentType['UserOnlineInfo']]: userOnlineInfo,\n [ReceiveMsgContentType['BusinessSystemNotification']]: bizSystem,\n [ReceiveMsgContentType['LastRead']]: lastRead,\n [ReceiveMsgContentType['RoomUpdate']]: roomUpdateHandle,\n [ReceiveMsgContentType['System']]: systemHandle,\n [ReceiveMsgContentType['Bubble']]: bubble,\n }),\n [\n bizSystem,\n hi,\n join,\n leave,\n typing,\n userOnlineInfo,\n lastRead,\n roomUpdateHandle,\n systemHandle,\n bubble,\n ],\n );\n\n const typeHandle = useCallback(\n recMsg => {\n /**\n * contentType\n */\n const { contentType, status } = recMsg;\n settingIDProcess(roomID, recMsg.roomID, () =>\n contentTypeHandleMap[contentType]?.(recMsg),\n );\n\n // 自定義 msg common type\n if (REC_MSG_COMMON_CONTENT_TYPE.includes(contentType)) {\n settingIDProcess(roomID, recMsg.roomID, () => msgCommonType(recMsg));\n }\n\n // 訊息收回\n if (status === MsgStatusKeys['Retract']) {\n settingIDProcess(msgID, recMsg.id, () => msgStatusRetract(recMsg));\n }\n },\n [\n roomID,\n contentTypeHandleMap,\n msgCommonType,\n msgID,\n msgStatusRetract,\n settingIDProcess,\n ],\n );\n\n useEffect(() => {\n if (recMsg) typeHandle(recMsg);\n return () => {\n recMsg && returnCallback(recMsg);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recMsg]);\n}\n\nuseRecMessage.propTypes = {\n hi: PropTypes.func,\n join: PropTypes.func,\n roomUpdate: PropTypes.func,\n bizSystem: PropTypes.func,\n typing: PropTypes.func,\n userOnlineInfo: PropTypes.func,\n csRoomStatusActive: PropTypes.func,\n csRoomStatusProcessing: PropTypes.func,\n csRoomStatusDeactivated: PropTypes.func,\n msgCommonType: PropTypes.func,\n returnCallback: PropTypes.func,\n};\n\nexport default useRecMessage;\n","import { useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setRoomDetail, setRoomUsersMap } from '@/store/room';\nimport { useQueryApi, useMutationApi, apiType } from '@/hook/useApi';\nimport useMe from '@/hook/useMe';\nimport useRecMessage from '@HOOK/useRecMessage';\nimport { AccountTypeKeys, OrderStatusKeys } from '@UTILS';\n/**\n * 還在房間內的所有 users\n * @returns {Array}\n */\nexport const existInRoomUsers = userRoom => {\n return userRoom.filter(u => u.deletedAt === 0);\n};\n\n/**\n * 是否還在房間內的 user\n * @returns {Boolean}\n */\nexport const existInRoomUser = (userRoom, userID) => {\n return userRoom.some(u => u.userID === userID && u.deletedAt === 0);\n};\n\n/**\n * 是否有pin住房間\n * @returns {Boolean}\n */\nconst isPinnedRoom = (userRoom, userID) => {\n return userRoom.find(u => u.userID === userID)?.isPinned === 'Yes' || false;\n};\n\n/**\n * ownerUser 處理\n * ownerUser.findData @returns {Object}\n * ownerUser.findID @returns {Number} ownerUserID > 找到 私聊的 ownerUserID (私聊沒有 ownerUserID 自定義為對方就是 ownerUser)\n */\nconst ownerUser = {\n findData: (ownerUserID = 0, userRooms = []) => {\n const { user, ...props } = userRooms.find(ur => ur.userID === ownerUserID);\n return { ...props, ...user };\n },\n findID: (userRooms = [], meID) => {\n return userRooms.find(u => u.userID !== meID && u.isOperator === 'No')\n ?.userID;\n },\n};\n\n/**\n * list room 房間格式處理\n * roomFormate.Direct // 用於 私聊\n * roomFormate.Group // 用於 群組\n * roomFormate.Consulting // 用於 諮詢單\n * @returns {Object} { room: { ... }, ownerUserData: { ... }, extraInfo: { ... } }\n * extraInfo: {\n * isExistInRoom: Boolean // 是否已在房間內\n * isPinned: Boolean // 是否pin\n * isNewActiveRoom: Boolean // 是否為新的諮詢室\n * }\n */\nexport const roomFormate = {\n direct: (room = {}, userRooms = [], meID, extraInfo = {}) => {\n let ownerUserID = ownerUser.findID(userRooms, meID);\n let ownerUserData = ownerUser.findData(ownerUserID, userRooms);\n return { room, ownerUserData, extraInfo };\n },\n\n group: ({\n room: { groupDetail = {}, ...props },\n ownerUserID = 0,\n userRooms = [],\n extraInfo = {},\n meID,\n }) => {\n const isExistInRoom = existInRoomUser(userRooms, meID);\n let ownerUserData = ownerUser.findData(ownerUserID, userRooms);\n return {\n room: { ...groupDetail, ...props },\n ownerUserData,\n extraInfo: { ...extraInfo, isExistInRoom },\n };\n },\n\n consulting: ({\n room: { consultingDetail = {}, ...props },\n ownerUserID = 0,\n userRooms = [],\n extraInfo = {},\n meID,\n }) => {\n const isExistInRoom = existInRoomUser(userRooms, meID);\n const isPinned = isPinnedRoom(userRooms, meID);\n let ownerUserData = ownerUser.findData(ownerUserID, userRooms);\n return {\n room: {\n ...consultingDetail,\n ...props,\n csType: consultingDetail.type || props.type,\n },\n ownerUserData,\n userRooms,\n extraInfo: { ...extraInfo, isExistInRoom, isPinned },\n };\n },\n};\n\n/**\n * 組出 roomUsersMap 依照 userRooms 資訊組出\n * @returns {Object} { 1: { username: 'xx'} ...}\n */\nexport const createdUsersMap = (userRooms = []) => {\n return userRooms.reduce((acc, { userID, user, ...props }) => {\n acc[userID] = { ...props, ...user };\n return acc;\n }, {});\n};\n\n/**\n * 第一個房間內客服頭像\n */\nexport const headerAvatarURL = usersMap => {\n for (const key in usersMap) {\n if (\n usersMap[key].accountType === AccountTypeKeys['CustomerService'] &&\n !usersMap[key].deletedAt\n ) {\n return usersMap[key].avatarURL;\n }\n }\n};\n\n/**\n * useRoom\n * @returns {Object}\n */\nexport default function useRoom({ getRoomContext = {} } = {}) {\n const dispatch = useDispatch();\n const { roomDetail } = useSelector(({ room }) => room);\n const { meInfo, isMonitorType } = useMe();\n\n /**\n * 房間明細處理\n */\n /**\n * 取得房間明細\n * - roomFormate.consulting\n * - createdUsersMap\n * @param.extraInfo {Object} 而外資訊\n * @param.onSuccess {Func} ({roomDetail, roomUsersMap}) => void 完成後行為\n * @return { roomDetail, roomUsersMap }\n * */\n const { fetchData: fetchRoom, loading: getRoomLoading } = useQueryApi(\n apiType.GET_ROOM,\n { ...getRoomContext },\n );\n const fetchRoomInfo = useCallback(\n async ({ id, extraInfo = {}, onSuccess = () => {} }) => {\n const { data, error } = await fetchRoom({ filter: { room: { id } } });\n if (error) return { error };\n const roomDetail = roomFormate.consulting({\n room: { ...data.getRoom },\n ownerUserID: data.getRoom.consultingDetail.ownerUserID,\n userRooms: data.getRoom.userRooms,\n meID: meInfo.id,\n extraInfo,\n });\n const roomUsersMap = createdUsersMap(data.getRoom.userRooms);\n dispatch(setRoomUsersMap(roomUsersMap));\n dispatch(setRoomDetail(roomDetail));\n onSuccess({ roomDetail, roomUsersMap });\n return {};\n },\n [fetchRoom, dispatch, meInfo.id],\n );\n\n /**\n * 進入房間 (押上即時已讀用)\n * ws 訂閱成功收到 Hi 才能呼叫\n * 離開房間需要恢復預設 0\n */\n const [updateInRoom] = useMutationApi(apiType.UPDATE_IN_ROOM, {\n context: { isShowGeneralError: false },\n });\n // 後台用 記錄當前進入的房間\n const updateInRoomHandle = useCallback(\n (roomID = 0, onCompleted = () => {}) => {\n if (isMonitorType) return; // monitor 不能 updateInRoom\n updateInRoom({ roomID });\n onCompleted(roomID);\n },\n [isMonitorType, updateInRoom],\n );\n\n useRecMessage({\n roomID: roomDetail?.room?.id,\n orderStatusCancel: () => {\n dispatch(\n setRoomDetail({\n ...roomDetail,\n room: {\n ...roomDetail?.room,\n userOrder: {\n ...roomDetail?.room?.userOrder,\n status: OrderStatusKeys['Canceled'].key,\n },\n },\n }),\n );\n },\n });\n\n return {\n getRoomLoading,\n updateInRoom,\n fetchRoom,\n updateInRoomHandle,\n fetchRoomInfo,\n };\n}\n","import { useRef, useEffect } from 'react';\n\nfunction useEventListener(eventName, handler) {\n const savedHandler = useRef();\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n useEffect(\n () => {\n // Make sure element supports addEventListener\n // On\n const isSupported = window && window.addEventListener;\n if (!isSupported) return;\n // Create event listener that calls handler function stored in ref\n const eventListener = event => savedHandler.current(event);\n // Add event listener\n window.addEventListener(eventName, eventListener);\n // Remove event listener on cleanup\n return () => {\n window.removeEventListener(eventName, eventListener);\n };\n },\n [eventName], // Re-run if eventName or element changes\n );\n}\n\nexport default useEventListener;\n","import { useCallback } from 'react';\nimport useEventListener from '@/hook/useEventListener';\n\nconst msgType = { unread: 'unread', back: 'back' };\nconst isInIframe = window.frames.length !== window.parent.frames.length;\n\nconst useIframe = parentURL => {\n const postMsgToParent = useCallback((postData = {}, parent = '*') => {\n window.parent.postMessage(postData, parent);\n }, []);\n\n const postUnRead = useCallback(\n (num = 1) => {\n postMsgToParent({ type: msgType['unread'], num });\n },\n [postMsgToParent],\n );\n\n const postToBack = useCallback(() => {\n postMsgToParent({ type: msgType['back'], message: 'go back' });\n }, [postMsgToParent]);\n\n // 接收 父層訊息\n const recParentListener = useCallback(\n e => {\n // eslint-disable-next-line\n if (e.origin == parentURL) {\n if (e.data.type === 'open') postUnRead(2);\n }\n },\n [parentURL, postUnRead],\n );\n\n useEventListener('message', recParentListener);\n return { isInIframe, postUnRead, postToBack };\n};\n\nexport default useIframe;\n","import React from 'react';\nimport { Box } from '@WRAP_COMP';\n\nfunction CSRoomFullBg({ children = null, bgImgUrl = '', bgColor = '' }) {\n return (\n \n {children}\n \n );\n}\n\nexport default CSRoomFullBg;\n","import { useState, useEffect, useCallback } from 'react';\nimport { IS_MOBILE } from '@/const';\nimport useEventListener from '@/hook/useEventListener';\n\nconst isWebview = () => {\n var useragent = navigator.userAgent;\n var rules = [\n 'WebView',\n '(iPhone|iPod|iPad)(?!.*Safari/)',\n 'Android.*(wv|.0.0.0)',\n ];\n var regex = new RegExp(`(${rules.join('|')})`, 'ig');\n return Boolean(useragent.match(regex));\n};\n\nconst useRWD = () => {\n const [size, setSize] = useState('mobile');\n\n const handleRWD = useCallback(() => {\n if (window.innerWidth > 1200) setSize('xl');\n else if (window.innerWidth > 992) setSize('lg');\n else if (window.innerWidth > 768) setSize('md');\n else if (window.innerWidth > 576) setSize('sm');\n else setSize('mobile');\n }, []);\n\n useEventListener('resize', handleRWD);\n useEffect(() => {\n handleRWD();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n size,\n isMobileSize: size === 'mobile',\n isMobileDevice: IS_MOBILE,\n isWebview: isWebview(),\n };\n};\n\nexport default useRWD;\n","/* eslint-disable no-unused-vars */\nimport React, { useEffect, useReducer } from 'react';\nimport styled from 'styled-components';\nimport useRWD from '@/hook/useRWD';\nimport { Box } from '@/plugin/wrap-comp';\n\nfunction Container({\n headerLogoURL = '',\n headerBgColor = '',\n bannerImgURL = '',\n bannerLinkURL = '',\n chatRoomHeader = null,\n chatRoomContent = null,\n chatRoomContentCourse = null,\n}) {\n const [ignored, forceUpdate] = useReducer(x => x + 1, 0);\n\n const { isMobileSize, isMobileDevice } = useRWD();\n const showLogoHeader = !!headerLogoURL;\n const showBanner = !!bannerImgURL;\n\n const borderSize = isMobileSize || isMobileDevice ? 0 : 12;\n const wrapStyle =\n isMobileSize || isMobileDevice ? { height: '100%' } : { height: '700px' };\n const chatRoomHeaderStyle = showLogoHeader\n ? {}\n : {\n borderTopRightRadius: borderSize,\n borderTopLeftRadius: borderSize,\n overflow: 'hidden',\n };\n\n useEffect(() => {\n forceUpdate();\n }, [bannerImgURL]);\n\n // 偵測橫豎屏自動 reload\n // useEffect(() => {\n // window.addEventListener(\n // 'onorientationchange' in window ? 'orientationchange' : 'resize',\n // function () {\n // if (window.orientation === 180 || window.orientation === 0) {\n // alert('偵測橫豎屏自動 reload');\n // window.location.reload();\n // }\n // if (window.orientation === 90 || window.orientation === -90) {\n // alert('偵測橫豎屏自動 reload');\n // window.location.reload();\n // }\n // },\n // false,\n // );\n // }, []);\n\n return (\n <>\n \n {showLogoHeader && (\n \n )}\n {chatRoomHeader}\n\n {showBanner && }\n\n {chatRoomContent}\n {chatRoomContentCourse}\n \n \n );\n}\n\nconst LogoHeaderWrap = styled.div`\n border-top-right-radius: ${({ borderSize }) => `${borderSize}px`};\n border-top-left-radius: ${({ borderSize }) => `${borderSize}px`};\n padding: 10px;\n background: ${({ theme, bgColor }) => bgColor || theme.secondary};\n & img {\n width: 30%;\n }\n`;\n\nconst LogoHeader = ({ logoURL = '', bgColor = '', borderSize = 0 }) => (\n \n {logoURL && LogoUrl}\n \n);\n\nconst BannerWrap = styled.div`\n width: 100%;\n cursor: pointer;\n & img {\n width: 100%;\n }\n`;\n\nconst Banner = ({ imgURL = '', link = '' }) => {\n const onClick = () => {\n if (!link) return;\n let a = document.createElement('a');\n a.href = link;\n a.target = '_blank';\n a.click();\n };\n return (\n \n {imgURL && LogoUrl}\n \n );\n};\n\nexport default Container;\n","import { useCallback } from 'react';\nimport { Modal } from 'antd';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport { apiType, useMutationApi } from '@/hook/useApi';\n\nfunction useOrder({ onCancelSuccess = () => {} } = {}) {\n const { onErrorMsg } = useAlertMessage();\n\n const [cancelDeposit] = useMutationApi(apiType.cancelDeposit, {\n context: { isShowGeneralError: false },\n onError: err => {\n if (['400000', '400002', '500002', '402001'].includes(err.message)) {\n onErrorMsg('你已超出取消次数限制,请联系客服');\n } else {\n onErrorMsg(err.message);\n }\n },\n onSuccess: (_, params) => {\n onCancelSuccess({ orderNo: params.in.orderNo });\n },\n });\n\n const cancelDepositConfirm = useCallback(\n ({ roomID, orderNo }) => {\n Modal.confirm({\n centered: true,\n title: '取消订单',\n content: '确定要取消这笔订单?',\n okText: '确定',\n cancelText: '取消',\n onOk: () => cancelDeposit({ in: { roomID, orderNo } }),\n });\n },\n [cancelDeposit],\n );\n\n const [expireDeposit] = useMutationApi(apiType.expireDeposit, {\n context: { isShowGeneralError: false },\n onError: err => {\n // if (['400000', '400002', '500002', '402001'].includes(err.message)) {\n // onErrorMsg('你已超出取消次数限制,请联系客服');\n // } else {\n // onErrorMsg(err.message);\n // }\n onErrorMsg(err.message);\n },\n });\n\n // 諮詢/崔單\n const [consultingOrder, { loading }] = useMutationApi(\n apiType.consultingOrder,\n {\n context: { isShowGeneralError: false },\n onError: err => {\n // if (['400000', '400002', '500002', '402001'].includes(err.message)) {\n // onErrorMsg('你已超出取消次数限制,请联系客服');\n // } else {\n // onErrorMsg(err.message);\n // }\n onErrorMsg(err.message);\n },\n },\n );\n\n return {\n cancelDepositConfirm,\n cancelDeposit,\n expireDeposit,\n consultingOrder,\n loading,\n };\n}\n\nexport default useOrder;\n","import React, { useEffect, useState } from 'react';\nimport { Button } from '@/plugin/wrap-comp';\n\nconst defaultCounter = 15;\n\nfunction CountdownButton({ children, onClick = () => {}, ...p }) {\n const [counter, setCounter] = useState(defaultCounter);\n const [showCount, setShowCount] = useState(false);\n\n const _onClick = async () => {\n if (showCount) return;\n await onClick();\n setCounter(defaultCounter);\n setShowCount(true);\n };\n\n useEffect(() => {\n let timer = null;\n if (counter > 0) {\n timer = setTimeout(() => setCounter(counter - 1), 1000);\n } else {\n setShowCount(false);\n }\n return () => clearTimeout(timer);\n }, [counter]);\n\n return (\n \n );\n}\n\nexport default CountdownButton;\n","import React, { forwardRef, useState, useImperativeHandle } from 'react';\nimport { Drawer } from 'antd';\nimport { Popup } from 'antd-mobile';\nimport { CloseOutlined } from '@ant-design/icons';\nimport useRWD from '@/hook/useRWD';\nimport { Box } from '@/plugin/wrap-comp';\n\nconst PopupC = ({\n children,\n title = 'title',\n onMaskClick,\n height,\n ...props\n}) => {\n return (\n \n \n
\n
{title}
\n
\n \n
\n \n
{children}
\n
\n );\n};\n\nfunction ClientDrawerWrap({ children, title = '', height = '100%' }, ref) {\n const [visible, setVisible] = useState(false);\n\n const { isMobileSize } = useRWD();\n\n const Comp = isMobileSize ? PopupC : Drawer;\n\n const compProps = isMobileSize\n ? {\n title,\n visible,\n onMaskClick: () => setVisible(false),\n bodyStyle: {\n borderTopLeftRadius: '16px',\n borderTopRightRadius: '16px',\n overflow: 'hidden',\n },\n height,\n }\n : {\n title,\n visible,\n onClose: () => setVisible(false),\n width: '400px',\n placement: 'right',\n height,\n };\n\n useImperativeHandle(ref, () => ({\n setVisible,\n }));\n\n return {children};\n}\n\nexport default forwardRef(ClientDrawerWrap);\n","import React, {\n forwardRef,\n useState,\n useImperativeHandle,\n useCallback,\n useRef,\n useEffect,\n} from 'react';\nimport { Typography, Spin, Divider, Empty, Badge } from 'antd';\nimport { Popup, Selector, DatePickerView } from 'antd-mobile';\nimport { RightOutlined } from '@ant-design/icons';\nimport { Button, Row, Col, Box } from '@/plugin/wrap-comp';\nimport useRecMessage from '@HOOK/useRecMessage';\nimport { useQueryApi, apiType } from '@HOOK/useApi';\nimport {\n OrderStatusKeys,\n formatDateTime,\n formatSearchDateTime,\n setDateRanges,\n labelRenderer,\n toMoment,\n formatSearchDate,\n compareRangeDateStrSize,\n formatDateStr,\n ConsultingOrderTypeKeys,\n PayType,\n PayTypeImg,\n} from '@/utils';\nimport orderURL from '@/assets/order.png';\nimport useOrder from '@/hook/useOrder';\nimport CountdownButton from '@/components/CountdownButton';\nimport ClientDrawerWrap from '@/components/Drawer/ClientDrawerWrap';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport useRWD from '@/hook/useRWD';\n\n\nconst dateTimeRange = setDateRanges(0);\nconst defaultSearchDataFormat = formatSearchDateTime([\n dateTimeRange.start,\n dateTimeRange.end,\n]);\n\nconst dateRange = [\n toMoment(defaultSearchDataFormat[0]).toDate(),\n toMoment(defaultSearchDataFormat[1]).toDate(),\n];\n\nexport const statusOptions = Object.keys(OrderStatusKeys).reduce(\n (acc, currKey) => {\n acc.push({\n label: OrderStatusKeys[currKey].label,\n value: OrderStatusKeys[currKey].key,\n });\n return acc;\n },\n [],\n);\n\nfunction OrderList({ roomID = 0 }, ref) {\n const clientDrawerWrapRef = useRef(null);\n const { isMobileSize } = useRWD();\n\n const { onErrorMsg } = useAlertMessage();\n\n const [list, setList] = useState([]);\n const [count, setCount] = useState(0);\n\n const [searchData, setSearchData] = useState({\n createdAtGTE: defaultSearchDataFormat[0],\n createdAtLTE: defaultSearchDataFormat[1],\n statusIn: [OrderStatusKeys['Unknown'].key],\n });\n\n // console.log(\n // 'createdAtLTE',\n // formatDateStr(toMoment(searchData.createdAtLTE).toDate()),\n // );\n\n const selectorVal = useRef(OrderStatusKeys['Unknown'].key);\n const [dateInputVal, setDateInputVal] = useState('1天');\n const [datePickerValue, setDatePickerValue] = useState(dateRange);\n\n const [visibleStatusPopup, setVisibleStatusPopup] = useState(false);\n const [visibleDatePopup, setVisibleDatePopup] = useState(false);\n\n const [visibleDatePickerView, setVisibleDatePickerView] = useState(null);\n\n const {\n cancelDepositConfirm,\n consultingOrder,\n loading: actionLoading,\n } = useOrder({\n onCancelSuccess: () => clientDrawerWrapRef.current.setVisible(false),\n });\n\n const { fetchData, loading } = useQueryApi(apiType.listOrder, {\n onSuccess: ({ listOrder }) => {\n setList(listOrder.orders || []);\n const _list = listOrder.orders.filter(item =>\n [\n OrderStatusKeys['Pending'].key,\n OrderStatusKeys['Waiting'].key,\n ].includes(item.status),\n );\n setCount(_list.length);\n },\n });\n const fetchPendingOrder = useCallback(\n async (searchData = {}) =>\n fetchData({\n pagination: { perPage: 999, page: 1 },\n in: { ...searchData },\n }),\n [fetchData],\n );\n\n const handleVisibleDatePickerView = index => {\n return () => {\n visibleDatePickerView === index\n ? setVisibleDatePickerView(null)\n : setVisibleDatePickerView(index);\n };\n };\n\n const onChangeDateRangeBtn = (rangeVal, dateInputVal) => {\n const dateRanges = setDateRanges(rangeVal);\n const defaultSearchDataFormat = formatSearchDateTime([\n dateRanges.start,\n dateRanges.end,\n ]);\n const _searchData = {\n ...searchData,\n createdAtGTE: defaultSearchDataFormat[0],\n createdAtLTE: defaultSearchDataFormat[1],\n };\n setSearchData(_searchData);\n setDateInputVal(dateInputVal);\n fetchPendingOrder(_searchData);\n };\n\n const onChangeDatePickerView = index => {\n return val => {\n let _v = [...datePickerValue];\n _v[index] = val;\n setDatePickerValue(_v);\n };\n };\n\n const onSubmitStatus = () => {\n const _searchData = { ...searchData, statusIn: [selectorVal.current] };\n setSearchData(_searchData);\n setVisibleStatusPopup(false);\n fetchPendingOrder(_searchData);\n };\n\n const onSubmitDateRange = () => {\n const isValid = compareRangeDateStrSize(...datePickerValue);\n if (!isValid) {\n onErrorMsg('开始时间不可大于结束时间');\n return;\n }\n\n const _searchData = {\n ...searchData,\n createdAtGTE: formatSearchDate(datePickerValue)[0],\n createdAtLTE: formatSearchDate(datePickerValue)[1],\n };\n setSearchData(_searchData);\n\n setDateInputVal('自定');\n setVisibleDatePickerView(null);\n setVisibleDatePopup(false);\n\n fetchPendingOrder(_searchData);\n };\n\n useEffect(() => {\n fetchPendingOrder({\n ...searchData,\n statusIn: [\n OrderStatusKeys['Pending'].key,\n OrderStatusKeys['Waiting'].key,\n ],\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useRecMessage({\n userOrder: useCallback(\n () => fetchPendingOrder(searchData),\n [fetchPendingOrder, searchData],\n ),\n });\n\n const handleOpen = () => {\n clientDrawerWrapRef.current.setVisible(true);\n fetchPendingOrder(searchData);\n };\n\n useImperativeHandle(ref, () => ({\n setVisible: visible => {\n if (visible) fetchPendingOrder(searchData);\n clientDrawerWrapRef.current.setVisible(visible);\n },\n }));\n\n return (\n <>\n \n \n 历史订单\n \n \n \n\n \n \n \n setVisibleStatusPopup(true)}>\n 状态\n \n {OrderStatusKeys[searchData.statusIn[0]].label}\n \n \n setVisibleDatePopup(true)}\n mr='2'>\n 时间\n \n {dateInputVal}\n \n \n \n onChangeDateRangeBtn(0, '1天')}>\n 1天\n \n onChangeDateRangeBtn(4, '3天')}>\n 3天\n \n onChangeDateRangeBtn(1, '7天')}>\n 7天\n \n onChangeDateRangeBtn(2, '30天')}>\n 30天\n \n \n \n \n {list.length === 0 && }\n {list.map(item => {\n return (\n \n \n \n 订单号:{item.orderNo}\n \n {\n await consultingOrder({\n in: {\n roomID,\n orderNo: item.orderNo,\n type: ConsultingOrderTypeKeys['Consulting'],\n },\n });\n clientDrawerWrapRef.current.setVisible(false);\n }}>\n 咨询此单\n \n \n {OrderStatusKeys[item.status]?.label}\n \n \n\n \n \n \n \n \n {PayType[item.payType]?.label || '官方充值'}\n \n
\n \n {formatDateTime(item.createdAt)}\n \n
\n
\n \n {item.amount} 元\n \n \n\n {(item.status === 'Waiting' || item.status === 'Pending') && (\n <>\n \n \n \n \n cancelDepositConfirm({\n roomID,\n orderNo: item.orderNo,\n })\n }>\n 取消订单\n \n \n \n \n \n \n {\n await consultingOrder({\n in: {\n roomID,\n orderNo: item.orderNo,\n type: ConsultingOrderTypeKeys['Urging'],\n },\n });\n clientDrawerWrapRef.current.setVisible(false);\n }}>\n 催单\n \n \n \n \n )}\n \n );\n })}\n \n
\n \n\n setVisibleStatusPopup(false)}\n onClose={() => setVisibleStatusPopup(false)}\n bodyStyle={{ padding: '14px' }}>\n (selectorVal.current = v[0])}\n />\n \n 确认\n \n \n\n setVisibleDatePopup(false)}\n onClose={() => setVisibleDatePopup(false)}\n bodyStyle={{ padding: '14px' }}>\n <>\n {['开始时间', '结束时间'].map((item, idx) => (\n \n \n {item}\n \n {formatDateStr(datePickerValue[idx])}\n \n \n \n {visibleDatePickerView === idx && (\n \n )}\n \n ))}\n \n 确认\n \n \n \n \n );\n}\n\nexport default forwardRef(OrderList);\n","import React from 'react'\nimport { Box } from '@/plugin/wrap-comp';\nimport useRWD from '@/hook/useRWD';\n\nfunction ContentWrap({ children }) {\n const { isMobileSize, isMobileDevice } = useRWD();\n const borderSize = isMobileSize || isMobileDevice ? 0 : 12;\n return (\n \n {children}\n \n )\n}\n\nexport default ContentWrap","import { useCallback } from 'react';\nimport useAlertMessage from './useAlertMessage';\nimport { useFetch } from './useApi';\nimport { CLIENT_API_DOMAIN, IS_CLIENT } from '@/const';\nconst domain = IS_CLIENT ? CLIENT_API_DOMAIN : process.env.REACT_APP_API_ORIGIN;\n\n/**\n * @returns {Function} getBase64 轉 Base64\n * @returns {Function} getDownloadFile 下載檔案\n */\nconst useFile = () => {\n const { fetchApi, loading } = useFetch();\n const { onErrorMsg } = useAlertMessage();\n\n const getFileUrl = useCallback(file => {\n return URL.createObjectURL(file);\n }, []);\n\n /**\n * File 轉 Base64\n * @param {*} file\n */\n const getBase64 = file => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result);\n reader.onerror = error => reject(error);\n });\n };\n\n /**\n * Img 轉 Base64\n * @param {*} img\n */\n const getBase64Image = img => {\n var canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n var ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, img.width, img.height);\n var ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase();\n var dataURL = canvas.toDataURL('image/' + ext);\n return dataURL;\n };\n\n /**\n * 下載圖片\n * @param {String} fileUrl\n * @param {String} userID\n * @returns {String || Object} 返回 Blob url\n */\n const getDownloadFile = useCallback(\n async (fileUrl, userID) => {\n try {\n const { error, data: blob } = await fetchApi(`${domain}${fileUrl}`, {\n resType: 'blob',\n headers: { 'content-type': 'image/png' },\n });\n if (error) {\n onErrorMsg('图片下载失败');\n return { error };\n }\n let resData = null;\n const objectURL = URL.createObjectURL(blob);\n resData = userID ? { userID, objectURL } : objectURL;\n return { data: resData };\n } catch (error) {\n console.log('getDownloadFile error', error);\n }\n },\n [fetchApi, onErrorMsg],\n );\n\n /**\n * 下載多張圖片\n * @param {Array} [{ userID, avatarURL }]\n * @returns\n */\n const getDownloadFiles = useCallback(\n (avatarsInfo = []) => {\n return Promise.all(\n avatarsInfo.map(item => getDownloadFile(item.avatarURL, item.userID)),\n );\n },\n [getDownloadFile],\n );\n\n /**\n * 檢查是否為 blob 字串\n * @param {String}\n * @returns {Boolean}\n */\n const checkBlobStr = useCallback(str => {\n return str ? str.includes('blob:') : '';\n }, []);\n\n /**\n * 檢查 是否為圖片 image/*\n */\n const checkIsFileImage = useCallback(file => {\n return file && file['type'].split('/')[0] === 'image';\n }, []);\n\n /**\n * 判斷是否為 file 檔案,是的話返回 Url\n */\n const changeFileToUrl = useCallback(\n val => {\n if (val instanceof File) {\n console.log('is file');\n return getFileUrl(val);\n }\n return val;\n },\n [getFileUrl],\n );\n\n /**\n * 將 url 轉成 File 物件\n */\n const changeUrlToFile = useCallback(async url => {\n if (typeof url !== 'string') return url;\n\n return new Promise((resolve, reject) => {\n let img = new Image();\n img.onload = () => {\n let base64 = getBase64Image(img);\n let file = btof(base64, 'test');\n resolve(file);\n };\n img.onerror = reject;\n img.setAttribute('crossOrigin', 'Anonymous');\n const timestamp = new Date().getTime();\n img.src = `${url}?timestamp=${timestamp}`;\n });\n }, []);\n\n function btof(data, fileName) {\n const dataArr = data.split(',');\n const byteString = atob(dataArr[1]);\n\n const options = {\n type: 'image/png',\n endings: 'native',\n };\n const u8Arr = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n u8Arr[i] = byteString.charCodeAt(i);\n }\n return new File([u8Arr], fileName + '.png', options);\n }\n // const changeUrlToFile = useCallback(\n // async url => {\n // if (typeof url === 'string') {\n // try {\n // const { error, data: blob } = await fetchApi(`url`, {\n // resType: 'blob',\n // headers: { 'content-type': 'image/*' },\n // });\n // if (error) {\n // onErrorMsg('图片下载失败');\n // return '';\n // }\n // let imgFile = new File([blob], 'fileName.png', { type: 'image/png' });\n // console.log('imgFile', imgFile);\n // console.log('imgFile URL', URL.createObjectURL(imgFile));\n\n // return imgFile;\n // } catch (error) {\n // console.log('changeUrlToFile', changeUrlToFile);\n // }\n // }\n // return url;\n // },\n // [fetchApi, onErrorMsg],\n // );\n\n return {\n loading,\n getFileUrl,\n getBase64,\n getDownloadFile,\n getDownloadFiles,\n checkBlobStr,\n checkIsFileImage,\n changeFileToUrl,\n changeUrlToFile,\n };\n};\n\nexport default useFile;\n","import React from 'react';\nimport { Box } from '@/plugin/wrap-comp';\nimport useRWD from '@/hook/useRWD';\nimport useIframe from '@/hook/useIframe';\nimport useFile from '@/hook/useFile';\n\nfunction Carousel({ position = 'Right', logoList = [] }) {\n const { isMobileSize } = useRWD();\n const { isInIframe } = useIframe();\n const { changeFileToUrl } = useFile();\n\n const carouselStyle =\n position === 'Right' ? { right: '-55%' } : { left: '-55%' };\n const showContentLogoURL =\n !isMobileSize && !isInIframe && logoList.length > 0;\n\n \n if (!showContentLogoURL) return null;\n \n return (\n \n \n \n {logoList.map((item, idx) => (\n
\n \n \n
\n \n ))}\n
\n
\n \n );\n}\n\nexport default Carousel;\n","import Icon from '@ant-design/icons';\nconst DoubleCheckSvg = () => (\n \n \n \n);\n\nexport default function DoubleCheckIcon(props) {\n return ;\n}\n","import Icon from '@ant-design/icons';\n\nconst SoundMuteSvg = () => (\n \n \n \n \n);\n\nexport default function SoundMuteIcon(props) {\n return ;\n}\n","import DoubleCheck from './DoubleCheckIcon';\nimport SoundMute from './SoundMuteIcon';\nconst { theme } = require('@/plugin/theme');\n\nconst DoubleCheckIcon = props => (\n \n);\nconst SoundMuteIcon = props => (\n \n);\n\nexport { DoubleCheckIcon, SoundMuteIcon };\n","import React, { useEffect, useState, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { UserOutlined } from '@ant-design/icons';\nimport { Avatar, Skeleton } from 'antd';\nimport useFile from '@/hook/useFile';\nconst { theme } = require('@/plugin/theme');\n\n/**\n * 顯示 大頭貼\n * 顯示:丟入 avatarURL 獲取有效頭像 src\n */\nconst AvatarFetch = ({ avatarURL = '', size = 'default', ...props }) => {\n const [src, setSrc] = useState('');\n const { getDownloadFile, loading } = useFile();\n const getDownloadFileHandle = useCallback(\n async url => {\n const { error, data } = await getDownloadFile(url);\n if (error) return;\n setSrc(data);\n },\n [getDownloadFile],\n );\n\n useEffect(() => {\n if (avatarURL) {\n avatarURL.includes('static') || avatarURL.includes('data:image')\n ? setSrc(avatarURL)\n : getDownloadFileHandle(avatarURL);\n }\n return () => {\n setSrc('');\n };\n }, [avatarURL, getDownloadFileHandle]);\n\n if (loading) return ;\n return (\n <>\n }\n style={{ background: theme['gray-2'] }}\n size={size}\n {...props}\n />\n \n );\n};\n\nAvatarFetch.propTypes = {\n avatarURL: PropTypes.string,\n size: PropTypes.string,\n};\nexport default AvatarFetch;\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport {\n CustomerServiceOutlined,\n RightOutlined,\n SoundFilled,\n FullscreenOutlined,\n DownOutlined,\n LeftOutlined,\n} from '@ant-design/icons';\nimport { Avatar, Typography, Space } from 'antd';\nimport { Button } from '@/plugin/wrap-comp';\nimport { setCSRoomSettingBeepEnabled } from '@/store/client';\nimport useRWD from '@HOOK/useRWD';\nimport { fullScreenHandle } from '@HOOK/useBrowser';\nimport useIframe from '@HOOK/useIframe';\nimport { SoundMuteIcon } from '@COMP/Icon';\nimport AvatarFetch from '@COMP/Avatar/AvatarFetch';\nimport CsAvatarUrl from '@/assets/cs-avatar.jpg';\nimport { useDispatch } from 'react-redux';\n\nconst { theme } = require('@/plugin/theme');\n\nfunction ClientHeader({\n title = '',\n roomID = null,\n avatarURL = '',\n showBeepBtn = false,\n beepEnabled = false,\n showBackBtn = false,\n backUrl = '',\n backToHandle = () => {},\n rightExtra = null,\n ...props\n}) {\n const { isInIframe } = useIframe();\n const { isMobileDevice } = useRWD();\n const dispatch = useDispatch();\n\n useEffect(() => {\n roomID && console.log('房間編號:', roomID);\n }, [roomID]);\n\n return (\n \n \n {isMobileDevice && showBackBtn && (\n fullScreenHandle(backUrl)}\n icon={}\n />\n )}\n\n {avatarURL ? (\n \n ) : (\n }\n src={CsAvatarUrl}\n style={{ background: theme.secondary }}\n />\n )}\n
\n {title}\n
\n
\n {/* button group */}\n \n {rightExtra}\n {isMobileDevice && (\n <>\n {showBeepBtn && (\n dispatch(setCSRoomSettingBeepEnabled())}\n icon={\n beepEnabled ? (\n \n ) : (\n \n )\n }\n />\n )}\n \n )}\n {isInIframe && (\n <>\n }\n onClick={() => fullScreenHandle()}\n />\n : }\n onClick={backToHandle}\n />\n \n )}\n \n
\n );\n}\n\nconst HeaderWrap = styled.div`\n padding: 0 12px;\n display: flex;\n justify-content: space-between;\n position: relative;\n background: white;\n min-height: ${({ theme }) => theme.comp.headerHeight};\n border-bottom: 1px solid ${({ theme }) => theme['gray-2']};\n`;\n\nexport default React.memo(ClientHeader);\n","import React from 'react';\nimport { Box } from '@WRAP_COMP';\nimport { Spin } from 'antd';\nfunction FullRoomLoading() {\n return (\n \n \n \n );\n}\n\nexport default FullRoomLoading;\n","/**\n * 詢前表單\n */\nimport React, {\n useCallback,\n useMemo,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Box } from '@WRAP_COMP';\nimport Captcha from 'react-captcha-code';\nimport { Form, Input, Radio, Checkbox, Button, Typography, Empty } from 'antd';\nimport { CSFormFieldType, CSFormFieldVerifyType, cloneDeep } from '@/utils';\n/**\n * @param {Array} formDataList\n * @returns formDataList\n */\n\nfunction CSForm({\n formTitle = '',\n formDataList = [],\n showVerificationCode = false,\n isReadType = false,\n cusFormCom = null,\n updateQsHandel = () => {},\n submitHandle = () => {},\n}) {\n /**\n * 更新 content\n * */\n const updateContentHandle = (itemIdx, content) => {\n let tempFormDataList = cloneDeep(formDataList);\n tempFormDataList[itemIdx].content = content;\n updateQsHandel(itemIdx, tempFormDataList[itemIdx]);\n };\n\n /**\n * 特定 fieldType 驗證規則\n */\n const fieldTypeVerify = {\n [CSFormFieldVerifyType['Age']]: (name, rule) => ({\n name,\n rules: [\n { required: rule.require, message: '必填' },\n {\n validator(_, value) {\n if (!value || (Number(value) >= 1 && Number(value) <= 120)) {\n return Promise.resolve();\n }\n return Promise.reject(new Error('请输入正确的年龄'));\n },\n },\n ],\n }),\n [CSFormFieldVerifyType['Email']]: (name, rule) => ({\n name,\n rules: [\n { required: rule.require, message: '必填' },\n { type: 'email', message: '请输入正确格式的邮箱' },\n ],\n }),\n [CSFormFieldVerifyType['QQ']]: (name, rule) => ({\n name,\n rules: [\n { required: rule.require, message: '必填' },\n {\n validator(_, value) {\n if (!value || /^[1-9][0-9]{4,10}$/gi.test(value)) {\n return Promise.resolve();\n }\n return Promise.reject(new Error('请输入正确的5~11位QQ号码格式'));\n },\n },\n ],\n }),\n [CSFormFieldVerifyType['WeChat']]: (name, rule) => ({\n name,\n rules: [\n { required: rule.require, message: '必填' },\n {\n validator(_, value) {\n if (!value || /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/gi.test(value)) {\n return Promise.resolve();\n }\n return Promise.reject(new Error('请输入正确的6~20位微信号码格式'));\n },\n },\n ],\n }),\n };\n const verifyTypeHandle = (name, rule) => {\n if (fieldTypeVerify[rule.verifyType]) {\n return fieldTypeVerify[rule.verifyType](name, rule);\n }\n return {\n name,\n rules: [{ required: rule.require, message: '必填' }],\n };\n };\n\n /**\n * Input type\n */\n const onChangeInput = (e, content, ItemIdx) => {\n const inputValue = e.target.value;\n let tempContent = cloneDeep(content);\n tempContent.value = inputValue;\n updateContentHandle(ItemIdx, tempContent);\n };\n const inputRender = (el, idx) => {\n return (\n \n onChangeInput(e, el.content, idx)}\n />\n \n );\n };\n\n /**\n * Radio 單選 type\n */\n const onChangeRadio = (e, content, ItemIdx) => {\n const clickIdx = e.target.value;\n let tempContent = cloneDeep(content);\n tempContent.items.forEach((it, i) => (it.value = i === clickIdx));\n updateContentHandle(ItemIdx, tempContent);\n };\n const radioRender = (el, idx) => {\n return (\n \n onChangeRadio(e, el.content, idx)}\n disabled={isReadType}>\n {el.content.items.map((item, itemIdx) => (\n \n {item.label}\n \n ))}\n \n \n );\n };\n\n /**\n * Checkbox 多選 type\n */\n const onChangeCheckbox = (e, clickIdx, content, ItemIdx) => {\n let tempContent = cloneDeep(content);\n tempContent.items[clickIdx].value = e.target.checked;\n updateContentHandle(ItemIdx, tempContent);\n };\n const checkboxRender = (el, idx) => {\n return (\n \n \n {el.content.items.map((item, itemIdx) => (\n onChangeCheckbox(e, itemIdx, el.content, idx)}>\n {item.label}\n \n ))}\n \n \n );\n };\n\n /**\n * 各種 fieldType 渲染\n */\n const fieldTypeRender = {\n [CSFormFieldType['Input']]: (el, idx) => inputRender(el, idx),\n [CSFormFieldType['Radio']]: (el, idx) => radioRender(el, idx),\n [CSFormFieldType['Checkbox']]: (el, idx) => checkboxRender(el, idx),\n };\n const formDataListRender = list => {\n return (\n <>\n {list.map((el, idx) => {\n if (fieldTypeRender[el.type]) {\n return fieldTypeRender[el.type](el, idx);\n } else {\n console.log('no mapping type > ', el);\n return null;\n }\n })}\n \n );\n };\n\n /**\n * 驗證碼\n */\n const captchaInputEl = useRef(null);\n const captchaRef = useRef(null);\n const charNum = 4;\n const [captchaCode, setCaptchaCode] = useState('');\n const [captchaError, setCaptchaError] = useState({\n validateStatus: '',\n help: '',\n });\n\n const clickChangeCaptcha = () => {\n captchaRef.current.refresh();\n setCaptchaCode();\n };\n\n useEffect(() => {\n if (showVerificationCode) {\n const array = [];\n for (let i = 0; i < charNum; i++) {\n const temp = Math.floor(Math.random() * 9);\n array.push(temp);\n }\n setCaptchaCode(array.join(''));\n }\n }, [showVerificationCode]);\n\n /**\n * 送出表單\n */\n const [CSForm] = Form.useForm();\n const clickSubmit = async () => {\n const fields = await CSForm.validateFields();\n\n // 檢查驗證碼\n if (showVerificationCode) {\n if (captchaInputEl.current.state.value !== captchaCode) {\n setCaptchaError({ validateStatus: 'error', help: '验证码错误' });\n return;\n } else {\n setCaptchaError({ validateStatus: '', help: '' });\n }\n }\n submitHandle({ ...fields, code: captchaCode });\n };\n\n /**\n * isReadType 的初始值\n */\n const fieldTypeInit = useMemo(\n () => ({\n [CSFormFieldType['Input']]: content => content.value,\n [CSFormFieldType['Radio']]: content => {\n let value = '';\n content.items.forEach((m, idx) => m.value && (value = idx));\n return value;\n },\n [CSFormFieldType['Checkbox']]: content => {\n let checkIdx = [];\n content.items.forEach((m, idx) => m.value && checkIdx.push(idx));\n return checkIdx;\n },\n }),\n [],\n );\n\n const initCSForm = useCallback(() => {\n let initValueObj = {};\n formDataList.forEach(el => {\n initValueObj[el.id] = fieldTypeInit[el.type](el.content);\n });\n CSForm.setFieldsValue(initValueObj);\n }, [formDataList, CSForm, fieldTypeInit]);\n\n useEffect(() => {\n if (isReadType) initCSForm();\n }, [isReadType, formDataList, initCSForm]);\n\n if (isReadType && !formDataList.length) return ;\n return (\n <>\n {formTitle}\n
\n {formDataListRender(formDataList)}\n
\n {cusFormCom}\n {showVerificationCode && (\n <>\n
\n \n \n \n \n \n setCaptchaCode(code)}\n height={50}\n width={200}\n fontSize={40}\n />\n \n \n \n )}\n\n {!isReadType && (\n \n )}\n \n );\n}\n\nexport default React.memo(CSForm);\n","import React, { useEffect } from 'react';\nimport { Button, Form, Select } from 'antd';\nimport { useSelector } from 'react-redux';\nimport { Box } from '@WRAP_COMP';\nimport CSForm from '@/components/ChatRoomContent/CSForm';\n\nfunction BeforeEnter({\n updateQsHandel = () => {},\n setQueueQsID = () => {},\n onfinish = () => {},\n}) {\n const { csRoomForm, csRoomQueueList, csRoomSetting } = useSelector(\n ({ client }) => client,\n );\n\n const [queueForm] = Form.useForm();\n const submitQueueForm = async () => {\n await queueForm.validateFields();\n onfinish();\n };\n const onChange = id => setQueueQsID(id);\n\n const queueFormRender = (cusType = false) => {\n return (\n \n \n \n \n {!cusType && (\n \n )}\n \n );\n };\n\n const isShowQueue = () =>\n csRoomSetting.queueEnabled && csRoomQueueList.length > 0;\n\n useEffect(() => {\n if (!csRoomForm.isEnabled && !isShowQueue()) onfinish();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n \n {csRoomForm.isEnabled ? (\n \n ) : (\n isShowQueue() && (\n \n {queueFormRender()}\n \n )\n )}\n \n );\n}\n\nexport default BeforeEnter;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Typography, Spin } from 'antd';\nimport { LoadingOutlined } from '@ant-design/icons';\nimport { Box, Button } from '@WRAP_COMP';\n\nfunction RedirectVerifyModel() {\n const { csRoomSetting } = useSelector(({ client }) => client);\n const [visible, setVisible] = useState(false);\n const [step, setStep] = useState(1);\n const step1Timer = useRef(null);\n const step2Timer = useRef(null);\n\n useEffect(() => {\n setVisible(csRoomSetting.redirectVerifyEnabled);\n csRoomSetting.redirectVerifyEnabled &&\n (step1Timer.current = setTimeout(() => setStep(2), 1300));\n return () => {\n step1Timer && clearTimeout(step1Timer.current);\n };\n }, [csRoomSetting.redirectVerifyEnabled]);\n\n useEffect(() => {\n step > 1 && (step2Timer.current = setTimeout(() => setVisible(false), 800));\n return () => {\n step2Timer.current && clearTimeout(step2Timer);\n };\n }, [step]);\n\n if (!visible) return null;\n return (\n \n \n } />\n \n \n {step === 1 ? '正在检测...' : '已通过安全检测'}\n \n {step === 2 &&

如果没有自动跳转,请点击下方按钮前往

}\n \n
\n
\n \n );\n}\n\nexport default RedirectVerifyModel;\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport { IS_CLIENT } from '@/const';\nimport { useQueryApi, useMutationApi, apiType } from '@/hook/useApi';\nimport useIframe from '@/hook/useIframe';\n\nimport {\n CusMsgContentType,\n MsgStatusKeys,\n RoomTypeKey,\n MsgContentTypeKeys,\n MsgFromTags,\n} from '@/utils';\nimport useRecMessage from './useRecMessage';\nimport useAlertMessage from './useAlertMessage';\n\nconst MSG_LIMIT = 20;\n\n/**\n * 訊息處理\n * @param {Object} param0\n * @returns {Object}\n */\nconst useRoomMessage = ({\n currentRoomID = 0,\n currUserRooms = [],\n currHistoryRooms = [],\n}) => {\n const { meInfo } = useSelector(({ auth }) => auth);\n const { clientUserInfo } = useSelector(({ client }) => client);\n const MeID = IS_CLIENT ? clientUserInfo.id : meInfo.id;\n const { onWarningMsg } = useAlertMessage();\n\n const [lastReadID, setLastReadID] = useState(0);\n const [roomMsg, setRoomMsg] = useState([]);\n const roomMsgTotal = useRef(0);\n const historyRooms = useRef([]);\n const currPreRoomIdx = useRef(0);\n const currPreRoomID = useRef(0);\n\n useEffect(() => {\n historyRooms.current = [...currHistoryRooms].reverse();\n currPreRoomIdx.current = 0;\n currPreRoomID.current = 0;\n }, [currHistoryRooms]);\n\n // 最後已讀的訊息 ID\n useEffect(() => {\n if (currentRoomID && currUserRooms.length > 0) {\n // 找到 room.userRooms 裡最大的已讀ID\n const lastReadID = currUserRooms.reduce((acc, curr) => {\n // 排除自己、已離開的人\n if (\n curr.userID !== MeID &&\n curr.deletedAt === 0 &&\n curr.lastReadMessageID > acc\n ) {\n return curr.lastReadMessageID;\n }\n return acc;\n }, 0);\n setLastReadID(lastReadID);\n }\n }, [currentRoomID, currUserRooms, MeID]);\n\n /**\n * 房間訊息處理\n * @param {String} type\n * INITIAL:初始化訊息,\n * PUSH:往後添加,\n * UNSHIFT:往前添加,\n * RESET:重置,\n * AFRESH: 略過 cusMsg 覆蓋所有訊息\n */\n const setRoomMsgHandle = useCallback(\n (type = 'INITIAL', { msgList = [], idx, msg } = {}) => {\n const handleType = {\n INITIAL: ({ msgList }) => setRoomMsg(msgList),\n PUSH: ({ msgList }) => setRoomMsg(pre => [...msgList, ...pre]),\n UNSHIFT: ({ msgList }) => setRoomMsg(pre => [...pre, ...msgList]),\n UPDATE: ({ id, msg }) =>\n setRoomMsg(pre => pre.map(m => (m.id === id ? msg : m))),\n AFRESH: () =>\n setRoomMsg(pre => {\n const cusMsg = pre.filter(m => m.contentType === CusMsgContentType);\n return [...msgList, ...cusMsg];\n }),\n RESET: () => setRoomMsg([]),\n };\n handleType[type] && handleType[type]({ msgList, idx, msg });\n },\n [],\n );\n\n // 推訊息 帶 lastMessageID\n const pushMsg = msg => {\n const lastMessageID =\n roomMsg[1]?.contentType === CusMsgContentType ? '' : roomMsg[1]?.id;\n setRoomMsgHandle('PUSH', { msgList: [{ ...msg, lastMessageID }] });\n };\n\n // 推前端客製訊息 (不傳後端\n const pushCusMsg = useCallback(\n ({ render }) => {\n setRoomMsgHandle('PUSH', {\n msgList: [\n {\n id: Date.now(),\n contentType: CusMsgContentType,\n render,\n },\n ],\n });\n },\n [setRoomMsgHandle],\n );\n\n /**\n * 推送系統訊息 (不會收到回傳推波\n */\n const [postMsg] = useMutationApi(apiType.POST_MSG, {\n context: { isClient: true },\n });\n const postSystemMsg = useCallback(\n async (params = {}, contentType = MsgContentTypeKeys['System']) => {\n const [err, data] = await postMsg({\n in: {\n roomID: currentRoomID,\n type: RoomTypeKey['Consulting'],\n contentType,\n ...params,\n },\n });\n IS_CLIENT &&\n setRoomMsgHandle('PUSH', { msgList: [data.data.postMessage] });\n return [err, data];\n },\n [currentRoomID, postMsg, setRoomMsgHandle],\n );\n\n /**\n * 取得訊息\n */\n const { fetchData: fetchRoomMsg } = useQueryApi(apiType.LIST_MSG);\n const fetchRoomMsgHandle = useCallback(\n async (roomID, setMsgType = 'INITIAL') => {\n const { error, data } = await fetchRoomMsg({\n filter: { roomID },\n pagination: { offsetType: 'New', limit: MSG_LIMIT },\n });\n if (error) return;\n setRoomMsgHandle(setMsgType, { msgList: data.listMessage.messages });\n roomMsgTotal.current = data.listMessage.meta.total;\n },\n [fetchRoomMsg, setRoomMsgHandle],\n );\n\n /**\n * 取得訊息 並更新已讀id (進入房間用的\n */\n // 處理房間已讀訊息\n const [updateLastMsg] = useMutationApi(apiType.UPDATE_LAST_READ_MSG);\n const fetchInRoomMsgHandle = useCallback(\n async (roomID, setMsgType = 'INITIAL', limit = MSG_LIMIT) => {\n const { error, data } = await fetchRoomMsg({\n filter: { roomID },\n pagination: { offsetType: 'New', limit },\n });\n if (error) return;\n const messages = data?.listMessage.messages;\n messages.length && updateLastMsg({ roomID, messageID: messages[0].id });\n setRoomMsgHandle(setMsgType, { msgList: messages });\n roomMsgTotal.current = data.listMessage.meta.total;\n return messages;\n },\n [fetchRoomMsg, updateLastMsg, setRoomMsgHandle],\n );\n\n /**\n * 返回有效訊息\n * @returns {Array}\n * */\n const filterEfficientMsg = useCallback(() => {\n return roomMsg.filter(\n ({ contentType }) => ![CusMsgContentType].includes(contentType),\n );\n }, [roomMsg]);\n\n /**\n * 載入更多訊息\n * */\n const loadMoreMsg = useCallback(async () => {\n const roomID = currPreRoomID.current || currentRoomID;\n if (!roomID) return;\n const efficientMsg = filterEfficientMsg(); // 取得有效訊息\n if (!efficientMsg.length || efficientMsg.length >= roomMsgTotal.current) {\n return { moreMsg: false };\n }\n const { error, data } = await fetchRoomMsg({\n filter: { roomID },\n pagination: {\n offsetType: 'Old',\n // 找到最舊的有效訊息 id\n offsetID: efficientMsg[efficientMsg.length - 1].id,\n limit: 10, // 要的筆數\n },\n });\n if (error) return;\n setRoomMsgHandle('UNSHIFT', { msgList: data.listMessage.messages });\n }, [currentRoomID, fetchRoomMsg, filterEfficientMsg, setRoomMsgHandle]);\n\n /**\n * 載入上個房間訊息\n */\n const loadPreRoomMsg = async () => {\n const preRoomID = historyRooms.current[currPreRoomIdx.current] || 0;\n currPreRoomIdx.current = currPreRoomIdx.current + 1;\n currPreRoomID.current = preRoomID;\n if (!preRoomID) {\n onWarningMsg('已载入全部讯息');\n return;\n }\n const { error, data } = await fetchRoomMsg({\n filter: { roomID: preRoomID },\n pagination: { offsetType: 'New', limit: MSG_LIMIT },\n });\n if (error) return;\n setRoomMsgHandle('UNSHIFT', { msgList: data.listMessage.messages });\n roomMsgTotal.current = data.listMessage.meta.total + roomMsgTotal.current;\n return { moreMsg: true };\n };\n\n /**\n * 監聽處理\n */\n // 處理 已讀\n const recLastReadIDHandle = useCallback(\n async (lastReads = []) => {\n if (!lastReads.length) return;\n const lastReadID = lastReads.reduce((acc, curr) => {\n if (curr.userID !== MeID && curr.messageID > acc) {\n return curr.messageID;\n }\n return acc;\n }, 0);\n lastReadID && setLastReadID(lastReadID);\n },\n [MeID],\n );\n\n // 處理 對方訊息\n const { postUnRead } = useIframe();\n const recOtherSideMsgHandle = useCallback(\n msg => {\n setRoomMsgHandle('PUSH', { msgList: [msg] });\n postUnRead();\n },\n [postUnRead, setRoomMsgHandle],\n );\n\n // 處理 自己送出訊息的ws即時回應\n const recOwnMsgHandle = msg => {\n recLastReadIDHandle(msg.lastReads || []); // 接收 自己傳送訊息 對方的即時已讀\n\n // 客服的自動回覆訊息\n if (msg.from.tags && msg.from.tags.includes(MsgFromTags['AutoReplay'])) {\n setRoomMsgHandle('PUSH', { msgList: [msg] });\n return;\n }\n\n // bubble 類訊息\n if (msg.contentType === MsgContentTypeKeys['Bubble']) {\n setRoomMsgHandle('PUSH', { msgList: [msg] });\n }\n };\n\n useRecMessage({\n roomID: currentRoomID,\n // 處理一般訊息 (處理已讀)\n msgCommonType: recMsg => {\n if (recMsg.status === MsgStatusKeys['Retract']) return;\n recMsg.from.userID !== MeID\n ? recOtherSideMsgHandle(recMsg)\n : recOwnMsgHandle(recMsg);\n },\n // 接收已讀狀態 (對方進入房間觸發已讀)\n lastRead: ({ lastReads }) => recLastReadIDHandle(lastReads || []),\n });\n\n return {\n roomMsg,\n updateLastMsg,\n fetchRoomMsgHandle,\n fetchInRoomMsgHandle,\n setRoomMsgHandle,\n postSystemMsg,\n pushCusMsg,\n pushMsg,\n loadMoreMsg,\n loadPreRoomMsg,\n lastReadID,\n };\n};\n\nexport default useRoomMessage;\n","import { useState, useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setBeepEnabled, setBeepAudioSrc } from '@/store/global';\nimport { useQueryApi, useMutationApi, apiType } from '@/hook/useApi';\nimport useAlertMessage from '@/hook/useAlertMessage';\n\nconst BEEP_FILE_KEY = 'bochat.platform.consulting.beep';\nconst BEEP_ENABLED_KEY = 'bochat.platform.consulting.beep.enabled';\nconst BEEP_CLIENT_ENABLED_KEY =\n 'bochat.platform.consulting.client.beep.enabled';\n\nconst useBeep = () => {\n const { onWarningMsg, onErrorMsg } = useAlertMessage();\n const { beepEnabled, beepAudioSrc } = useSelector(({ global }) => global);\n const dispatch = useDispatch();\n\n const { fetchData, loading } = useQueryApi(apiType.GET_PLATFORM_SETTING);\n const [updateData, { loading: updateLoading }] = useMutationApi(\n apiType.UPDATE_PLATFORM_SETTING,\n );\n\n // 提示音 音檔\n const fetchBeepFile = useCallback(\n async (key = BEEP_FILE_KEY) => {\n const { error, data } = await fetchData({\n filter: { PlatformSetting: { key } },\n });\n if (!error) {\n dispatch(setBeepAudioSrc(data?.getPlatformSetting?.value));\n }\n },\n [dispatch, fetchData],\n );\n\n // 更新提示音 音檔\n const updateBeepFile = useCallback(\n async ({ data }, key = BEEP_FILE_KEY) => {\n const { error } = await updateData({\n filter: { PlatformSetting: { key } },\n in: data,\n });\n if (!error) fetchBeepFile();\n },\n [fetchBeepFile, updateData],\n );\n\n // 提示音狀態\n const [beepClientEnabled, setClientBeepEnabled] = useState(false);\n const fetchBeepEnabled = useCallback(\n async (key = BEEP_ENABLED_KEY) => {\n const { error, data } = await fetchData({\n filter: { PlatformSetting: { key } },\n });\n if (error) return;\n const callback = {\n [BEEP_ENABLED_KEY]: () =>\n dispatch(setBeepEnabled(data.getPlatformSetting.value === 'Yes')),\n [BEEP_CLIENT_ENABLED_KEY]: () =>\n setClientBeepEnabled(data.getPlatformSetting.value === 'Yes'),\n };\n callback[key]?.();\n },\n [dispatch, fetchData],\n );\n\n // 更新提示音狀態\n const updateBeepEnabled = useCallback(\n async ({ data }, key = BEEP_ENABLED_KEY) => {\n const { error } = await updateData({\n filter: { PlatformSetting: { key } },\n in: data,\n });\n if (!error) fetchBeepEnabled(key);\n },\n [fetchBeepEnabled, updateData],\n );\n\n const playPromise = useCallback(\n audioObj => {\n if (!audioObj) return;\n const playAudioPromise = audioObj.play();\n if (playAudioPromise) {\n playAudioPromise\n .then(() => {})\n .catch(err => {\n err?.name === 'NotAllowedError'\n ? onWarningMsg('请启用浏览器声音播放权限')\n : onErrorMsg(err);\n });\n }\n },\n [onErrorMsg, onWarningMsg],\n );\n\n return {\n beepAudioSrc,\n beepEnabled,\n beepClientEnabled,\n loading,\n updateLoading,\n keys: { BEEP_FILE_KEY, BEEP_ENABLED_KEY, BEEP_CLIENT_ENABLED_KEY },\n playPromise,\n fetchBeepFile,\n fetchBeepEnabled,\n updateBeepEnabled,\n updateBeepFile,\n };\n};\n\nexport default useBeep;\n","import React from 'react';\nimport { Badge } from 'antd';\nimport { Button, Box } from '@WRAP_COMP';\nimport { DownOutlined } from '@ant-design/icons';\nconst { theme } = require('@/plugin/theme');\n\nconst ScrollDownBtn = ({\n show = false,\n hasNewMsg = false,\n onClick = () => {},\n}) => {\n if (!show) return null;\n return (\n \n \n }\n onClick={() => onClick()}\n style={{\n background: theme['gray-1'],\n border: `1px solid ${theme['gray-3']}`,\n }}\n />\n \n \n );\n};\nexport default ScrollDownBtn;\n","import React, {\n forwardRef,\n useState,\n useEffect,\n useCallback,\n useRef,\n useImperativeHandle,\n} from 'react';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport ResizeObserver from 'resize-observer-polyfill';\nimport { Button, Box } from '@WRAP_COMP';\nimport ScrollDownBtn from './ScrollDownBtn';\nimport { IS_CLIENT, IS_MOBILE } from '@/const';\nimport useBrowser, { BrowserType } from '@/hook/useBrowser';\n\nconst EndMsg = ({ showEndMsg = true, loadPreRoomMsg = () => {} }) => {\n if (IS_CLIENT || !showEndMsg) return null;\n return (\n \n );\n};\n\nconst controlFooterHeight = 40;\n\nconst ChatContent = (\n {\n roomID = 0,\n roomMsgLength = 0,\n loadMoreMsg = () => {},\n loadPreRoomMsg = () => {},\n children = null,\n controlHeader = null,\n controlFooter = null,\n bgColor = '',\n bgImg = '',\n showEndMsg = true,\n },\n ref,\n) => {\n const { browser } = useBrowser();\n const isSogou = browser === BrowserType['Sogou'];\n\n const [elHeight, setElHeight] = useState(0);\n const [roomContentEl, setRoomContentEl] = useState(null);\n\n const [wrapBoxRef, setWrapBoxRef] = useState(null);\n const [infiniteScrollNode, setInfiniteScrollNode] = useState(null);\n const [scrollToBtnShow, setScrollToBtnShow] = useState(false);\n\n const [hasNewMsg, setHasNewMsg] = useState(false);\n const [hasMoreMsg, setHasMoreMsg] = useState(true);\n\n const sogouBrowserScrollTop = () => {\n const target = infiniteScrollNode.getScrollableTarget();\n const outerDivHeight = target.clientHeight;\n const innerDivHeight = target.getElementsByClassName(\n 'infinite-scroll-component__outerdiv',\n )[0].clientHeight;\n const currScrollTop = innerDivHeight - outerDivHeight;\n return currScrollTop;\n };\n\n /**\n * 聊天內容動態偵測高度\n */\n const resizeObserver = useRef(\n new ResizeObserver(entries => {\n window.requestAnimationFrame(() => {\n if (!Array.isArray(entries) || !entries.length) return;\n setRoomContentEl(entries[0].contentRect);\n });\n }),\n );\n // const cleanObserver = useCallback(() => {\n // resizeObserver.current && resizeObserver.current.disconnect();\n // }, []);\n\n const observeTimeID = useRef(null);\n const getRoomContentEl = node => {\n if (!node || !resizeObserver.current) return;\n observeTimeID.current = setTimeout(() => {\n resizeObserver.current.observe(node);\n }, 0);\n };\n\n useEffect(() => {\n if (roomContentEl && roomContentEl.height) {\n let hight =\n roomContentEl.height - (controlFooter ? controlFooterHeight : 0);\n setElHeight(hight);\n }\n // return () => cleanObserver();\n }, [roomContentEl, controlFooter]);\n\n /**\n * 取得訊息\n */\n const loadMoreMsgHandle = async () => {\n const res = await loadMoreMsg();\n res && setHasMoreMsg(res.moreMsg);\n };\n const loadPreRoomMsgHandel = async () => {\n const res = await loadPreRoomMsg();\n res && setHasMoreMsg(res.moreMsg);\n };\n\n /**\n * 滾動相關操作\n */\n const getWrapBoxRef = useCallback(ref => ref && setWrapBoxRef(ref), []);\n\n const onScroll = e => {\n try {\n const scroll = e.target.scrollTop;\n\n // 搜狗是相反的\n if (isSogou) {\n const currScrollTop = sogouBrowserScrollTop();\n\n setScrollToBtnShow(scroll !== currScrollTop);\n scroll === currScrollTop && setHasNewMsg(false);\n scroll === 0 && loadMoreMsgHandle();\n return;\n }\n\n setScrollToBtnShow(scroll < 0);\n scroll >= 0 && setHasNewMsg(false);\n } catch (error) {\n console.log('onScroll error', error);\n }\n };\n\n const scrollNodeTo = (hight = 0) => {\n try {\n if (isSogou) {\n const currScrollTop = sogouBrowserScrollTop();\n infiniteScrollNode.getScrollableTarget().scrollTo(0, currScrollTop);\n } else {\n infiniteScrollNode.getScrollableTarget().scrollTo(0, hight);\n }\n setHasNewMsg(false);\n setScrollToBtnShow(false);\n } catch (error) {\n console.log('scrollNodeTo error', error);\n }\n };\n\n const getInfiniteScrollEl = useCallback(node => {\n node && setInfiniteScrollNode(node);\n }, []);\n\n /**\n * 新訊息提示\n */\n const setHasNewMsgHandle = () => {\n if (!infiniteScrollNode) return;\n if (isSogou) {\n const currScrollTop = sogouBrowserScrollTop();\n if (infiniteScrollNode.lastScrollTop !== currScrollTop) {\n setHasNewMsg(true);\n if (IS_MOBILE) setScrollToBtnShow(true);\n }\n } else {\n if (infiniteScrollNode.lastScrollTop < 0) {\n setHasNewMsg(true);\n if (IS_MOBILE) setScrollToBtnShow(true);\n }\n }\n };\n\n /**\n * 初始顯示\n * hasMoreMsg 為 false 才會顯示 EndMsg\n * */\n const initSetHasMoreMsg = useCallback(() => {\n if (!roomID || !roomMsgLength || !infiniteScrollNode) {\n setHasMoreMsg(false);\n return;\n }\n try {\n const infiniteChild = infiniteScrollNode.el.getElementsByClassName(\n 'infinite-scroll-component__outerdiv',\n )[0];\n infiniteChild.offsetHeight < elHeight\n ? setHasMoreMsg(false)\n : setHasMoreMsg(true);\n } catch (error) {\n console.log('initSetHasMoreMsg error', error);\n }\n }, [infiniteScrollNode, elHeight, roomID, roomMsgLength]);\n useEffect(() => {\n initSetHasMoreMsg();\n }, [initSetHasMoreMsg]);\n\n useImperativeHandle(ref, () => ({\n setHasNewMsgHandle,\n scrollNodeTo,\n }));\n\n return (\n \n {/* control header */}\n \n {controlHeader}\n \n {/* msg block */}\n \n {wrapBoxRef && (\n \n }\n next={loadMoreMsgHandle}\n hasMore={hasMoreMsg}\n loader={\n

\n 载入中...\n

\n }\n inverse={true}\n style={{ display: 'flex', flexDirection: 'column-reverse' }} // 反轉內容順序\n onScroll={onScroll}>\n {children}\n \n )}\n \n {/* 邀請控制 */}\n {controlFooter}\n \n \n );\n};\n\nexport default forwardRef(ChatContent);\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { Box } from '@WRAP_COMP';\n\nconst stopEventDefault = e => {\n e.preventDefault();\n e.stopPropagation();\n};\nconst checkIsDragIn = e =>\n e.dataTransfer?.items && e.dataTransfer.items.length > 0;\n\nfunction useDragDropFiles({\n onSetDropFiles = () => {},\n onSetDragInFiles = () => {},\n onSetDragOutFiles = () => {},\n}) {\n // const dropElRef = useRef(null);\n const [dropElRef, setDropElRef] = useState(null);\n const dragCounter = useRef(0);\n\n // isDragging 用於判斷是否有檔案在 drag 檔案的元件之中\n const [isDragging, setDrag] = useState(false);\n\n // 拖進\n const handleDragIn = useCallback(\n e => {\n stopEventDefault(e);\n dragCounter.current++;\n const isDragIn = checkIsDragIn(e);\n if (isDragIn) {\n setDrag(true);\n onSetDragInFiles();\n }\n },\n [onSetDragInFiles],\n );\n\n // 拖出\n const handleDragOut = useCallback(\n e => {\n stopEventDefault(e);\n dragCounter.current--;\n if (dragCounter.current === 0) {\n setDrag(false);\n onSetDragOutFiles();\n }\n },\n [onSetDragOutFiles],\n );\n\n // 拖曳檔案\n const handleDrag = useCallback(e => {\n stopEventDefault(e);\n }, []);\n\n // 放下檔案\n const handleDrop = useCallback(\n e => {\n stopEventDefault(e);\n setDrag(false);\n const isDragIn = checkIsDragIn(e);\n if (isDragIn && e.dataTransfer) {\n onSetDropFiles(e.dataTransfer.files);\n e.dataTransfer.clearData();\n dragCounter.current = 0;\n }\n },\n [onSetDropFiles],\n );\n\n useEffect(() => {\n if (dropElRef) {\n const el = dropElRef;\n el.addEventListener('dragenter', handleDragIn);\n el.addEventListener('dragenter', handleDragIn);\n el.addEventListener('dragleave', handleDragOut);\n el.addEventListener('dragover', handleDrag);\n el.addEventListener('drop', handleDrop);\n // clear events, 清除事件監聽\n return () => {\n el.removeEventListener('dragenter', handleDragIn);\n el.removeEventListener('dragleave', handleDragOut);\n el.removeEventListener('dragover', handleDrag);\n el.removeEventListener('drop', handleDrop);\n };\n }\n }, [handleDrag, handleDragIn, handleDragOut, handleDrop, dropElRef]);\n\n return { setDropElRef, dropElRef, isDragging };\n}\n\nexport const DragInDrop = () => {\n return (\n \n \n 拖曳新增图片\n \n \n );\n};\n\nexport default useDragDropFiles;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { Input } from 'antd';\n\nconst TextAreaWrapStyle = styled.div`\n position: relative;\n flex: 1;\n`;\nconst HintText = styled.span`\n position: absolute;\n bottom: 4px;\n right: 12px;\n margin-bottom: 0;\n color: ${({ theme }) => theme['gray-2']};\n`;\n\nfunction InputTextArea({\n value = '',\n setValue = () => {},\n onPressEnter = () => {},\n onChange = () => {},\n pasteHandle = () => {},\n onFocus = () => {},\n rows = 4,\n disabled = false,\n}) {\n // 換行處理\n const onkeydown = e => {\n if (e.keyCode === 13) {\n e.shiftKey ? setValue(pre => pre + '\\n') : onPressEnter();\n e.preventDefault();\n }\n };\n return (\n \n \n Shift + Enter 換行\n \n );\n}\n\nexport default InputTextArea;\n","import React, {\n lazy,\n Suspense,\n useState,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { SendOutlined } from '@ant-design/icons';\nimport { Input } from 'antd';\nimport { Button, Box, Space } from '@/plugin/wrap-comp';\nimport { IS_CLIENT } from '@/const';\nimport useDragDropFiles, { DragInDrop } from '@/hook/useDragDropFiles';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport useFile from '@/hook/useFile';\nimport useRWD from '@/hook/useRWD';\nimport { MsgContentTypeKeys, stripHtmlTag, lazyRetry } from '@/utils';\n// import AudioModal from '@/components/Modal/Audio';\nimport FrontDrop from './FrontDrop';\nimport InputTextArea from '@/components/InputTextArea';\n\nconst PreviewFileModal = lazy(() =>\n lazyRetry(\n () =>\n import(/*webpackChunkName: \"preview-file-modal\" */ './PreviewFileModal'),\n 'PreviewFileModal',\n ),\n);\nconst InputPayment = lazy(() =>\n lazyRetry(\n () => import(/*webpackChunkName: \"payment-input\" */ './InputPayment'),\n 'InputPayment',\n ),\n);\nconst BtnEmojiPicker = lazy(() =>\n lazyRetry(\n () => import(/*webpackChunkName: \"emoji-picker\" */ './BtnEmojiPicker'),\n 'BtnEmojiPicker',\n ),\n);\nconst BtnUploadFile = lazy(() =>\n lazyRetry(\n () => import(/*webpackChunkName: \"upload-file\" */ './BtnUploadFile'),\n 'BtnUploadFile',\n ),\n);\n\nconst InputBar = (\n {\n pushMsg = () => {},\n paymentInputSubmit = () => {},\n paymentBtnLoading = false,\n showFrontDrop = false,\n onChangeInputValue = () => {},\n frontDropControl = null,\n loading = false,\n showPaymentCancelBtn = true,\n paymentChannelListBtn = null,\n showUploadBtn = true,\n showEmojiBtn = false,\n },\n ref,\n) => {\n const { isMobileDevice } = useRWD();\n const [inputValue, setInputValue] = useState('');\n const [showPaymentInput, setShowPaymentInput] = useState(false);\n // const [showPaymentBtn, setShowPaymentBtn] = useState(false);\n\n const inputChangeHandle = e => {\n onChangeInputValue(e.target.value);\n setInputValue(e.target.value);\n };\n\n /**\n * 傳送 文字訊息\n */\n const pushTextHandle = () => {\n const text = stripHtmlTag(inputValue);\n if (!text || loading) return;\n pushMsg({\n id: Date.now(),\n contentType: MsgContentTypeKeys['Text'],\n text: { text, isEncrypt: false },\n });\n setInputValue('');\n };\n\n // 傳送 圖片訊息\n const pushFileHandle = (file, text = '') => {\n pushMsg({\n id: Date.now(),\n contentType: MsgContentTypeKeys['File'],\n file: { upload: file, text, type: 'Image' },\n });\n return false;\n };\n\n // 傳送 錄音訊息\n // const [showAudioModal, setShowAudioModal] = useState(false);\n // const postAudioHandle = voice => {\n // postMessage({\n // id: Date.now(),\n // contentType: MsgContentTypeKeys['Voice'],\n // voice,\n // });\n // };\n\n // 表情符號\n const [showEmojiBox, setShowEmojiBox] = useState(false);\n const onEmojiAdd = e => {\n let emoji = e.native;\n setInputValue(inputValue + emoji);\n };\n\n // 圖片預覽\n const [previewFileModal, setPreviewFileModal] = useState({ visible: false });\n\n // 圖片拖曳處理\n const { checkIsFileImage } = useFile();\n const { onWarningMsg } = useAlertMessage();\n const dropFilesHandle = useCallback(\n _files => {\n const isImage = _files ? checkIsFileImage(_files[0]) : false;\n if (!_files || !isImage) {\n onWarningMsg('格式错误');\n return;\n }\n setPreviewFileModal({ visible: true, file: _files[0] });\n },\n [checkIsFileImage, onWarningMsg],\n );\n const { setDropElRef, isDragging } = useDragDropFiles({\n onSetDropFiles: dropFilesHandle,\n });\n const getInputBarNode = node => node && setDropElRef(node);\n\n // 圖片貼上處理\n const pasteHandle = useCallback(\n e => {\n const file = e.clipboardData.files[0];\n // console.log('clipboardData', e.clipboardData.getData('text'));\n if (file && checkIsFileImage(file)) {\n setPreviewFileModal({ visible: true, file });\n e.preventDefault();\n }\n },\n [checkIsFileImage],\n );\n\n useImperativeHandle(ref, () => ({\n setShowPaymentInput,\n // setShowPaymentBtn,\n setInputValue,\n }));\n\n return (\n <>\n \n {/* FrontDrop */}\n <>\n {showPaymentInput && (\n }>\n setShowPaymentInput(false)}\n />\n \n )}\n {showFrontDrop && {frontDropControl}}\n {!showFrontDrop && isDragging && (\n \n \n \n )}\n \n\n {/* Input */}\n <>\n {IS_CLIENT && (\n setShowEmojiBox(false)}\n style={{ letterSpacing: '0.08rem', color: 'black' }}\n />\n )}\n {IS_CLIENT || (\n setShowEmojiBox(false)}\n disabled={loading}\n />\n )}\n \n\n {/* Btn group */}\n <>\n \n {/* {showAudioBtn && (\n }\n onClick={() => setShowAudioModal(true)}\n />\n )} */}\n {showEmojiBtn && !isMobileDevice && (\n }>\n \n \n )}\n {paymentChannelListBtn}\n {showUploadBtn && (\n }>\n \n \n )}\n {/* {showPaymentBtn && (\n setShowPaymentInput(true)}>\n 充值\n \n )} */}\n }\n onClick={pushTextHandle}\n />\n \n \n \n {/* */}\n {previewFileModal.visible && (\n }>\n setPreviewFileModal({ visible })}\n file={previewFileModal.file || null}\n postFile={pushFileHandle}\n />\n \n )}\n \n );\n};\n\nexport default forwardRef(InputBar);\n","import { useCallback } from 'react';\n// import { useSelector } from 'react-redux';\n\n// var message = '1';\n// var key = CryptoJS.enc.Utf8.parse(\"c7b54a1gnftv9apa\");\n\n// // 加密\n// var encrypted = CryptoJS.AES.encrypt(message,key, {\n// mode: CryptoJS.mode.ECB,\n// });\n\n// $('#1').text(\"Encrypted: \"+ encrypted.ciphertext);\n\n// // 密文\n// // var chiptext = encrypted.ciphertext\n// var chiptext = \"877ee2bbf035ed00a7c163441ff428c7\";\n// // 字串內容先進行Hex\n// var encryptedHexStr = CryptoJS.enc.Hex.parse(chiptext);\n\n// // 需要先轉成Base64才可以解\n// var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);\n\n// // 解密\n// var decrypted = CryptoJS.AES.decrypt(encryptedBase64Str, key, {\n// mode: CryptoJS.mode.ECB,\n// });\n\n// $('#2').text(\"decrypted: \"+ decrypted.toString(CryptoJS.enc.Utf8));\n\nconst CryptoJS = require('crypto-js');\nconst subStrToken = str => {\n if (!str) return;\n const key = CryptoJS.enc.Utf8.parse(str.substring(0, 16));\n return key;\n};\n\nfunction useCrypto() {\n const token = 'spVD5wCs2vcMTfO2';\n /**\n * 加密 Encrypt\n */\n const encryptBase64Handle = useCallback((text = '', key = '') => {\n if (!text || !key) throw Error('加密设定错误');\n let encrypted = CryptoJS.AES.encrypt(text, key, {\n mode: CryptoJS.mode.ECB,\n }).toString();\n if (!encrypted) throw Error('加密字串為空');\n return encrypted;\n }, []);\n const encryptHexHandle = useCallback((text = '', key = '') => {\n if (!text || !key) throw Error('加密设定错误');\n let encrypted = CryptoJS.AES.encrypt(text, key, {\n mode: CryptoJS.mode.ECB,\n }).ciphertext.toString();\n if (!encrypted) throw Error('加密字串為空');\n return encrypted;\n }, []);\n const encryptStrHandle = useCallback(\n (text = '', type = 'base64') => {\n try {\n if (!text || !token) throw Error('Handle 加密设定错误');\n const secretKey = subStrToken(token);\n const typeHandle = {\n base64: () => encryptBase64Handle(text, secretKey),\n hex: () => encryptHexHandle(text, secretKey),\n };\n return typeHandle[type] ? typeHandle[type]() : '';\n } catch (error) {\n console.log('encrypt error: ', error);\n throw Error(error?.message || error);\n }\n },\n [encryptBase64Handle, encryptHexHandle, token],\n );\n\n /**\n * 解密 Decrypt\n */\n const decryptBase64 = useCallback((cipherStr = '', key = '') => {\n if (!cipherStr || !key) throw Error('解密设定错误');\n const decrypted = CryptoJS.AES.decrypt(cipherStr, key, {\n mode: CryptoJS.mode.ECB,\n });\n const str = decrypted.toString(CryptoJS.enc.Utf8);\n if (!str) throw Error('解密字串为空');\n return str;\n }, []);\n const decryptHex = useCallback((cipherStr = '', key = '') => {\n if (!cipherStr || !key) throw Error('解密设定错误');\n // 字串內容先進行 Hex > Base64\n const hexStr = CryptoJS.enc.Hex.parse(cipherStr);\n const Base64Str = CryptoJS.enc.Base64.stringify(hexStr);\n const decryptStr = CryptoJS.AES.decrypt(Base64Str, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.NoPadding,\n });\n const str = decryptStr.toString(CryptoJS.enc.Utf8);\n if (!str) throw Error('解密字串为空');\n return str;\n }, []);\n const decryptStrHandle = useCallback(\n (cipherStr = '', type = 'base64') => {\n try {\n const secretKey = subStrToken(token);\n if (!secretKey || !cipherStr) return '';\n const typeHandle = {\n base64: () => decryptBase64(cipherStr, secretKey),\n hex: () => decryptHex(cipherStr, secretKey),\n };\n return typeHandle[type] ? typeHandle[type]() : '';\n } catch (error) {\n console.log('decrypt error: ', error);\n return `讯息解密错误: ${error?.message || ''}(${cipherStr})`;\n }\n },\n [decryptBase64, decryptHex, token],\n );\n\n return { encryptStrHandle, decryptStrHandle };\n}\n\nexport default useCrypto;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Box } from '@WRAP_COMP';\n/**\n * 對話訊息 邀請,加入,離開 顯示用\n * @param {Object} param0\n */\nconst MsgControlItem = ({ text = '', bgColor = 'white' }) => {\n return (\n \n \n {text}\n \n \n );\n};\n\nMsgControlItem.propTypes = {\n text: PropTypes.string,\n bgColor: PropTypes.string,\n};\nexport default MsgControlItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n CheckOutlined,\n LoadingOutlined,\n CloseOutlined,\n} from '@ant-design/icons';\nimport { Typography, Space } from 'antd';\nimport { Box } from '@WRAP_COMP';\nimport { DoubleCheckIcon } from '@/components/Icon';\nimport { formatTime } from '@/utils';\nimport { IS_CLIENT } from '@/const';\nconst { theme } = require('@/plugin/theme');\n\n/**\n * 對話訊息各種狀態顯示處理\n * - 使用者資訊 (username, userID, timestamp)\n * @param {String} param0.children 嵌入文字內容\n * @param {String} param0.showName 顯示名稱\n * @param {String} param0.userID 顯示userID\n * @param {String} param0.timestamp 時間\n * @param {Boolean}} param0.isShowMsgStatus 是否顯示訊息各種狀態\n * @param {Boolean} param0.isLoading 正在傳送\n * @param {Boolean} param0.isSend \b傳送成功\n * @param {Boolean} param0.isRead 對方已讀\n * @param {Boolean} param0.isRetract 已收回訊息\n * @param {Boolean} param0.isError 訊息傳送出錯\n * @param {Boolean} param0.right 訊息對齊\n * @param {String} param0.bg 背景色\n */\n\nconst MsgWrap = React.forwardRef(\n (\n {\n children,\n showName = '',\n userID = 0,\n timestamp = 0,\n isShowMsgStatus = true,\n isLoading = false,\n isSend = false,\n isRead = false,\n isRetract = false,\n isError = false,\n right = true,\n bg,\n color = 'black',\n avatar = null,\n },\n ref,\n ) => {\n const justifyContent = right ? 'flex-end' : 'flex-start';\n const checkRender = ({ isRead, isSend, isError, isLoading }) => {\n if (isLoading) return ;\n if (isError) return ;\n if (isRead) return ;\n if (isSend) return ;\n return null;\n };\n\n return (\n \n
\n {/* 使用者資訊 */}\n {IS_CLIENT || (\n \n \n {showName}\n {userID ? (\n \n (#{userID})\n \n ) : null}\n {timestamp && (\n \n {formatTime(timestamp)}\n \n )}\n \n \n )}\n\n {/* 訊息資訊 */}\n\n \n {/* 狀態 */}\n {isShowMsgStatus && (\n \n \n {checkRender({ isRead, isSend, isError, isLoading })}\n \n \n )}\n\n {/* 撤回狀態 */}\n {isRetract ? (\n \n 讯息已撤回\n \n ) : null}\n\n {/* 內容 */}\n \n {children}\n \n {IS_CLIENT && (\n \n {avatar}\n \n )}\n \n
\n
\n );\n },\n);\n\nMsgWrap.propTypes = {\n timestamp: PropTypes.number,\n direction: PropTypes.string,\n bg: PropTypes.string,\n};\n\nexport default MsgWrap;\n","import React, { lazy, useEffect, useState, useCallback } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { sentryCaptureErr } from '@/plugin/sentry';\nimport { IS_CLIENT } from '@/const';\nimport { setRenew } from '@/store/client';\nimport { useMutationApi, apiType } from '@HOOK/useApi';\nimport useCrypto from '@HOOK/useCrypto';\nimport useRecMessage from '@HOOK/useRecMessage';\nimport { headerAvatarURL } from '@HOOK/useRoom';\nimport useAlertMessage from '@HOOK/useAlertMessage';\nimport {\n AccountTypeKeys,\n MsgStatusKeys,\n MsgContentTypeKeys,\n RoomTypeKey,\n lazyRetry,\n} from '@/utils';\nimport AvatarFetch from '../Avatar/AvatarFetch';\nimport MsgControlItem from './MsgControlItem';\nimport MsgWrap from './MsgWrap';\nimport CsAvatarUrl from '@/assets/cs-avatar.jpg';\n\nconst MsgContextMenu = lazy(() =>\n lazyRetry(\n () => import(/*webpackChunkName: \"msg-context-menu\" */ './MsgContextMenu'),\n 'MsgContextMenu',\n ),\n);\n\n/**\n * 對話狀態的訊息\n * @param {} param0\n * @returns\n */\n\nconst MGM_TYPE = [\n AccountTypeKeys['CustomerService'],\n AccountTypeKeys['Monitor'],\n AccountTypeKeys['Manager'],\n AccountTypeKeys['System'],\n];\n\nconst Msg = ({\n children,\n roomID = 0,\n msg: originalMsg = {},\n usersMap = {},\n lastReadID = 0, // TODO\n updateMsg = () => {},\n}) => {\n const dispatch = useDispatch();\n const { loginInfo } = useSelector(({ global }) => global);\n const { clientUserInfo } = useSelector(({ client }) => client);\n const { meInfo: auth } = useSelector(({ auth }) => auth);\n const meInfo = IS_CLIENT\n ? clientUserInfo\n : { ...auth, token: loginInfo.token };\n\n const { onErrorMsg } = useAlertMessage();\n const [msgWrapNode, setMsgWrapNode] = useState(null);\n\n const [isRetract, setIsRetract] = useState(\n originalMsg.status === MsgStatusKeys['Retract'],\n );\n const [msg, setMsg] = useState(originalMsg);\n\n const { id, from = null, timestamp = null, file, text, contentType } = msg;\n\n const isSystem = contentType === MsgContentTypeKeys['System'];\n\n const isSelf = isSystem ? false : from ? meInfo.id === from.userID : true;\n\n const avatarURLHandle = () => {\n if (!IS_CLIENT) return '';\n if (isSystem) {\n return headerAvatarURL(usersMap) || CsAvatarUrl;\n } else {\n if (\n !from ||\n [AccountTypeKeys['CommonUser'], AccountTypeKeys['Tourist']].includes(\n from.accountType,\n )\n ) {\n return meInfo.avatarURL\n ? require(`@/assets/${meInfo.avatarURL}`).default\n : '';\n }\n return usersMap[from.userID]?.avatarURL || CsAvatarUrl;\n }\n };\n\n const avatarURL = avatarURLHandle();\n\n const [loading, setLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [postMsg] = useMutationApi(apiType.POST_MSG, {\n context: { isClient: IS_CLIENT, isShowGeneralError: false },\n });\n\n const [updateMsgStatus, { loading: retractLoading }] = useMutationApi(\n apiType.UPDATE_MSG,\n );\n\n /**\n * 傳送訊息\n */\n // 加解密\n const { encryptStrHandle } = useCrypto(meInfo.token);\n const isTextEncrypt = str => {\n try {\n const encryptStr = encryptStrHandle(str);\n return { text: { text: encryptStr, isEncrypt: true } };\n } catch (error) {\n console.log('postMsgHandle encrypt error', error);\n return {};\n }\n };\n\n const postMsgHandle = async ({ contentType, text, file, lastMessageID }) => {\n setLoading(true);\n const isText = contentType === MsgContentTypeKeys['Text'];\n let encryptTextObj = isText ? isTextEncrypt(text.text) : {};\n const postDefaultObj = {\n roomID,\n type: RoomTypeKey['Consulting'],\n contentType,\n lastMessageID: lastMessageID ? String(lastMessageID) : '',\n ...(isText ? { text } : { file }),\n };\n let resMsg = {};\n const [err, encryptPostData] = await postMsg({\n in: { ...postDefaultObj, ...encryptTextObj },\n });\n\n if (err) {\n let errorMsg = '';\n let errorLevel = 'info';\n let sentryErrorData = {\n title: `PostMessage Error Info ${err.message}`,\n roomID,\n params: JSON.stringify({ ...postDefaultObj, ...encryptTextObj }),\n resError: JSON.stringify(err),\n };\n // 諮詢房已封存\n if (err.message === '400004') {\n errorMsg = '咨询房已封存';\n }\n // 加密回傳錯誤 重新發送post\n if (err.message === '400000' && isText) {\n sentryErrorData.tokenKey = meInfo.token;\n sentryErrorData.originMsg = text?.text;\n sentryErrorData.encryptMsg = encryptTextObj?.text?.text;\n const [resentErr, data] = await postMsg({\n in: { ...postDefaultObj },\n });\n if (resentErr) {\n sentryErrorData.title = `PostMessage resent Error Info ${resentErr.message}`;\n sentryErrorData.resentError = JSON.stringify(resentErr);\n sentryErrorData.resentParams = JSON.stringify(postDefaultObj);\n onErrorMsg(resentErr.message);\n } else {\n errorMsg = '';\n resMsg = { ...data.data.postMessage };\n sentryErrorData.successResData = JSON.stringify(data);\n }\n }\n\n if (errorMsg) {\n onErrorMsg(errorMsg);\n setIsError(true);\n sentryCaptureErr(\n sentryErrorData.title,\n { ...sentryErrorData },\n errorLevel,\n );\n }\n } else {\n resMsg = { ...encryptPostData.data.postMessage };\n }\n if (resMsg.renew) dispatch(setRenew(true));\n setMsg(resMsg);\n updateMsg({ id, msg: resMsg });\n setLoading(false);\n };\n\n /**\n * 撤回訊息\n */\n const retractMsgHandle = useCallback(\n async messageID => {\n const [err] = await updateMsgStatus({\n messageID,\n in: {\n contentType: MsgContentTypeKeys['Unknown'],\n status: MsgStatusKeys['Retract'],\n },\n });\n if (!err) setIsRetract(true);\n },\n [updateMsgStatus],\n );\n const showRetractHandle = from => {\n // Monitor 可以撤回其他客服對話\n return (\n meInfo.accountType === AccountTypeKeys['Monitor'] &&\n from.accountType === AccountTypeKeys['CustomerService']\n );\n };\n\n /**\n * 訊息顯示處理\n * - 息預設都是自己傳的的狀態(right)\n * - client 端不需顯示 username userID\n */\n const userInfo = from => {\n let showName = meInfo.username;\n let userID = meInfo.id;\n let userAccountType = meInfo.accountType;\n // 客端顯示\n if (IS_CLIENT) {\n return isSelf\n ? { showName: '', userID: '' }\n : { showName: usersMap[from.userID]?.aliasName || '客服', userID: '' };\n }\n if (from) {\n showName = usersMap[from.userID]?.username || '';\n userID = from.userID || 0;\n userAccountType = usersMap[from.userID]?.accountType || '';\n }\n if (userAccountType === AccountTypeKeys['Tourist']) showName = '遊客';\n return { showName, userID };\n };\n\n const color = from => {\n const isClient = { bg: 'primary', color: 'white' };\n const isOther = { bg: 'white', color: 'black' };\n if (!from && MGM_TYPE.includes(meInfo.accountType)) return isOther;\n return MGM_TYPE.includes(from?.accountType) ? isOther : isClient;\n };\n\n /**\n * 監聽\n */\n useRecMessage({\n msgID: id,\n msgStatusRetract: () => setIsRetract(true),\n });\n\n useEffect(() => {\n if (!msg.timestamp && roomID) {\n postMsgHandle(msg);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (IS_CLIENT && isRetract)\n return (\n \n );\n\n return (\n <>\n setMsgWrapNode(n)}\n timestamp={timestamp}\n right={isSelf}\n {...color(from)}\n {...userInfo(from)}\n isShowMsgStatus={isSelf}\n isLoading={loading || retractLoading}\n isSend={!!timestamp}\n isRead={typeof id === 'string' && id > 0 && id <= lastReadID}\n isRetract={isRetract}\n isError={isError}\n avatar={}>\n {React.cloneElement(children, {\n fileURL: file?.fileURL,\n text: file?.text || text?.text,\n isEncrypt: text?.isEncrypt,\n })}\n \n {from && typeof id === 'string' && !IS_CLIENT && (\n retractMsgHandle(id)}\n />\n )}\n \n );\n};\nexport default Msg;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { IS_CLIENT } from '@/const';\nimport useCrypto from '@HOOK/useCrypto';\nimport { Box } from '@WRAP_COMP';\n\nfunction MsgText({ text, isEncrypt }) {\n const { loginInfo } = useSelector(({ global }) => global);\n const { clientUserInfo } = useSelector(({ client }) => client);\n const { meInfo: auth } = useSelector(({ auth }) => auth);\n const meInfo = IS_CLIENT\n ? clientUserInfo\n : { ...auth, token: loginInfo.token };\n\n const { decryptStrHandle } = useCrypto(meInfo.token);\n\n const _text = isEncrypt ? decryptStrHandle(text) : text;\n const __html = _text.replace(/\\n/g, '
');\n\n return (\n \n );\n}\nexport default React.memo(MsgText);\n","import React from 'react';\nimport styled from 'styled-components';\nimport alipayUrl from './alipay.png';\nimport wxUrl from './wx.png';\nimport bankUrl from './bank.png';\n// import bankUrl from './bank.png';\nimport { Box } from '@WRAP_COMP';\nimport { PayType } from '@/utils';\n\nconst imgType = {\n [PayType['wx'].key]: wxUrl, // 微信\n [PayType['alipay'].key]: alipayUrl, // 支付寶\n [PayType['bank'].key]: bankUrl, // 銀行卡\n};\n\nconst IconsWrap = styled(Box)`\n & .icon {\n width: 32px !important;\n }\n`;\n\nexport function Icon({ payType = '', style }) {\n return {payType}\n}\n\nfunction Icons({ payType = '' }) {\n return (\n \n {imgType[payType] && (\n \n )}\n \n {PayType[payType]?.label || payType}\n \n \n );\n}\n\nexport default Icons;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABoCAYAAAAdHLWhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1YWFkOWIyNS00YTBjLWUzNGEtYTVmOS03MzNhZTYzYmY2MDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkRBMDExMEYwRTQ5MTFFQzkwQjBDNjM4RTQyN0FCQkIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkRBMDExMEUwRTQ5MTFFQzkwQjBDNjM4RTQyN0FCQkIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTJhY2M5NjYtOGUwMi1lOTRiLTg5OTktMzQxMDM2NzY5ODg0IiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6M2RmOGIzOTUtMGRmYy0xMWVjLWE4Y2Ut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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABoCAYAAAAdHLWhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1YWFkOWIyNS00YTBjLWUzNGEtYTVmOS03MzNhZTYzYmY2MDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODlCREQ0OUUwRTQ5MTFFQ0E4NzNGN0EzMzgwN0EwMjEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODlCREQ0OUQwRTQ5MTFFQ0E4NzNGN0EzMzgwN0EwMjEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTJhY2M5NjYtOGUwMi1lOTRiLTg5OTktMzQxMDM2NzY5ODg0IiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6M2RmOGIzOTUtMGRmYy0xMWVjLWE4Y2Ut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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABoCAYAAAAdHLWhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1YWFkOWIyNS00YTBjLWUzNGEtYTVmOS03MzNhZTYzYmY2MDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkYwRDVDNDEzQzc1MTFFQzk2NDhBRTAyQUY2N0JEOEUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkYwRDVDNDAzQzc1MTFFQzk2NDhBRTAyQUY2N0JEOEUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Nzk0ZDIyNzAtYTMwOC1hOTQ1LWI5MmYtZmNjYTg0N2M2N2ZkIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6M2RmOGIzOTUtMGRmYy0xMWVjLWE4Y2Ut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\"","import React from 'react';\nimport { Spin, Typography } from 'antd';\nimport { Box } from '@WRAP_COMP';\nimport { IS_CLIENT } from '@/const';\nimport { useMutationApi, apiType } from '@/hook/useApi';\nimport useAlertMessage from '@/hook/useAlertMessage';\n// import { PayType } from '@/utils';\nimport PayIcons from './Icons';\n\nfunction PayList({ roomID, amount, payList = [] }) {\n const { onErrorMsg } = useAlertMessage();\n const [postDeposit, { loading }] = useMutationApi(apiType.deposit, {\n context: { isShowGeneralError: false },\n onError: err => {\n const msgType = {\n 400000: () => onErrorMsg('银行卡抽取失败,请联系客服'),\n 400002: () => onErrorMsg('已有订单进行中'),\n 402001: () => onErrorMsg('取消次数过多,请完成充值'),\n 500002: () => onErrorMsg('呼叫第三方失败,请联系客服人员'),\n };\n\n msgType[err.message] ? msgType[err.message]() : onErrorMsg(err.message);\n },\n });\n\n const clickPayment = params => () => {\n IS_CLIENT\n ? postDeposit({ in: { roomID, ...params } })\n : onErrorMsg('无法操作');\n };\n\n return (\n <>\n \n \n \n \n 支付金額:\n \n ¥ {amount || 0}\n \n \n \n \n 欢迎使用官方充值代理,请选择你的充值方式\n \n \n {payList.map(({ channelID, payType }) =>\n // PayType[payType]\n payType === 'bank' ? (\n \n \n \n ) : null,\n )}\n \n \n \n \n );\n}\n\nexport default PayList;\n","import React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport ClientDrawerWrap from '@/components/Drawer/ClientDrawerWrap';\nimport { IS_CLIENT } from '@/const';\nimport useOrder from '@/hook/useOrder';\nimport { CopyBtn } from '@/hook/useCopy';\nimport { Button, Box, Divider } from '@WRAP_COMP';\nimport {\n PayType,\n formatDateTime,\n ConsultingOrderTypeKeys,\n OrderStatusKeys,\n} from '@UTILS';\n\nfunction ClientOrderDetailDrawer(\n { roomID, payType, amount, orderNo, status, createdAt },\n ref,\n) {\n const orderDetailDrawerWrapRef = useRef(null);\n\n const { consultingOrder, loading } = useOrder();\n\n const _consultingOrder = async () => {\n await consultingOrder({\n in: {\n roomID,\n orderNo,\n type: ConsultingOrderTypeKeys['Consulting'],\n },\n });\n orderDetailDrawerWrapRef.current.setVisible(false);\n };\n\n useImperativeHandle(ref, () => ({\n setVisible: orderDetailDrawerWrapRef.current.setVisible,\n }));\n\n return (\n \n \n \n
付款方式
\n
{PayType[payType]?.label}
\n
\n \n \n
存款金额
\n
{amount}
\n
\n \n \n
订单号
\n
\n {orderNo}\n {IS_CLIENT ? (\n \n 咨询此单\n \n ) : (\n \n )}\n
\n
\n \n \n
状态
\n
{OrderStatusKeys[status]?.label}
\n
\n \n \n
日期
\n
{formatDateTime(createdAt)}
\n
\n
\n \n );\n}\n\nexport default forwardRef(ClientOrderDetailDrawer);\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Typography } from 'antd';\nimport QRCode from 'qrcode-react';\nimport { IS_CLIENT } from '@/const';\nimport { Box, Divider, Button } from '@WRAP_COMP';\nimport {\n PayType,\n PayTypeImg,\n PayMethod,\n OrderStatusKeys,\n getNow,\n} from '@UTILS';\nimport useRecMessage from '@/hook/useRecMessage';\nimport useOrder from '@/hook/useOrder';\nimport { CopyBtn } from '@/hook/useCopy';\nimport { fullScreenHandle } from '@/hook/useBrowser';\nimport ClientDrawerWrap from '@/components/Drawer/ClientDrawerWrap';\nimport ClientOrderDetailDrawer from '@/components/Drawer/ClientOrderDetailDrawer';\n\nimport alipayProcessUrl from '@/assets/alipay-process.jpg';\nimport wxProcessUrl from '@/assets/wx-process.jpg';\nimport { Icon } from '../PayList/Icons';\n\nconst InfoItem = ({ label = '', value = '', isBlue = false }) => {\n return (\n \n \n \n {label}:\n \n \n {value}\n \n \n \n \n );\n};\n\nfunction BankCardContent({\n bankName,\n bankCode,\n branchName,\n cardNo,\n accountName,\n amount,\n orderNo,\n onClickAlipay,\n onClickWx,\n}) {\n const _cardNo = cardNo.replace(/\\s*/g, '');\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n 支付宝转银行卡教程\n \n \n \n \n 微信转银行卡教程\n \n \n \n );\n}\nfunction AliCardContent({\n bankName,\n bankCode,\n branchName,\n cardNo,\n accountName,\n amount,\n orderNo,\n onClickAlipay,\n onClickWx,\n}) {\n const _cardNo = cardNo.replace(/\\s*/g, '');\n return (\n <>\n \n \n \n \n \n \n \n \n );\n}\n\nfunction QRcodeContent({\n url,\n orderNo,\n amount,\n qUrl,\n accountName,\n account,\n payType,\n}) {\n return (\n \n \n {!!accountName && }\n {!!account && }\n \n \n {!!url && }\n {!!qUrl && (\n WithdrawAddressUrl\n )}\n \n 使用\n \n 扫描支付\n \n \n \n );\n}\n\nfunction RedirectContent({ url, orderNo, amount, payType, status }) {\n return (\n \n \n \n \n \n \n \n {PayType[payType].label}\n \n \n \n \n fullScreenHandle(url)}\n disabled={\n !IS_CLIENT ||\n ![\n OrderStatusKeys['Pending'].key,\n OrderStatusKeys['Waiting'].key,\n ].includes(status)\n }>\n 点击前往收银台\n \n \n );\n}\n\nfunction Oder({\n msgID = 0,\n payType = '', // 使用的支付\n payMethod = '', // 支付方式\n roomID = 0,\n\n orderStatus = '', // 訂單狀態\n orderNo = '',\n orderAmount = 0,\n expiredAt = 0,\n\n bank = {},\n qrcode = {},\n redirect = {},\n\n createdAt,\n}) {\n const orderDetailDrawerWrapRef = useRef(null);\n const alipayDrawerWrapRef = useRef(null);\n const wxDrawerWrapRef = useRef(null);\n\n const [status, setStatus] = useState(orderStatus);\n\n const { cancelDepositConfirm, expireDeposit } = useOrder(); // 取消訂單\n\n const _cancelDepositConfirm = () => cancelDepositConfirm({ roomID, orderNo });\n\n const orderContentRender = {\n [PayMethod['bank']]: () => (\n alipayDrawerWrapRef.current.setVisible(true)}\n onClickWx={() => wxDrawerWrapRef.current.setVisible(true)}\n />\n ),\n\n [PayMethod['sub_alipay']]: () => (\n alipayDrawerWrapRef.current.setVisible(true)}\n onClickWx={() => wxDrawerWrapRef.current.setVisible(true)}\n />\n ),\n [PayMethod['qrcode']]: () => (\n \n ),\n [PayMethod['redirect']]: () => (\n \n ),\n };\n\n useRecMessage({\n msgID,\n orderStatusCancel: () => setStatus(OrderStatusKeys['Canceled'].key),\n orderStatusApproving: () => setStatus(OrderStatusKeys['Waiting'].key),\n });\n\n useEffect(() => {\n // 訂單倒數結束要打過期...\n if (\n orderStatus === OrderStatusKeys['Pending'].key &&\n getNow() > expiredAt\n ) {\n expireDeposit({ in: { roomID, orderNo } });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [expiredAt, orderStatus, roomID, orderNo]);\n\n return (\n <>\n \n \n
收款信息
\n \n orderDetailDrawerWrapRef.current?.setVisible(true)}\n style={{\n background: '#E8F6FF',\n color: '#3392D1',\n border: 'none',\n borderRadius: '4px',\n }}>\n 订单详情\n \n {[\n OrderStatusKeys['Canceled'].key,\n OrderStatusKeys['Expired'].key,\n ].includes(status) || (\n \n 取消订单\n \n )}\n \n
\n \n\n {/* 訂單內容 */}\n {orderContentRender[payMethod.toLowerCase()]?.() || null}\n
\n\n \n\n \n \n \n\n \n \n \n \n );\n}\n\nexport default Oder;\n","import React from 'react';\nimport { Box } from '@WRAP_COMP';\nimport { MsgSystemType } from '@/utils';\nimport PayList from './PayList';\nimport Oder from './Oder';\n\nfunction MsgSystem({ msgID, type, content, roomID, postMsg }) {\n const systemType = {\n [MsgSystemType['PayList']]: content => (\n \n ),\n [MsgSystemType['UserOrder']]: content => (\n \n ),\n [MsgSystemType['Text']]: content => (\n
${content.text}
` }} />\n ),\n };\n return systemType[type] ? {systemType[type](content)} : null;\n}\n\nexport default MsgSystem;\n","import React from 'react';\nimport { Image } from 'antd';\n\nfunction MsgImage({ fileURL = '', text = '' }) {\n return (\n <>\n \n
\n {text}\n \n );\n}\n\nexport default MsgImage;\n","import React from 'react';\nimport { Divider } from 'antd';\nimport { Box, Button } from '@WRAP_COMP';\nimport { MsgContentTypeKeys } from '@/utils';\n\nconst layoutMap = {\n BASELINE: { display: 'block' },\n HORIZONTAL: { display: 'flex' }, // 水平\n VERTICAL: { display: 'flex', flexDirection: 'column' }, // 垂直\n};\n\nfunction MsgBubble({ header, hero, body, footer, pushMsg, onOrderDetail }) {\n const compMap = {\n box: ({\n children,\n layout = 'BASELINE',\n justifyContent = '',\n alignItems = '',\n padding = '',\n margin = '',\n separator = false,\n }) => (\n <>\n {separator && }\n \n {children}\n \n \n ),\n\n text: ({ text, color, size, weight }) => {\n const __html = text.replace(/\\n/g, '
');\n return (\n \n );\n },\n\n button: ({ action, width, color, icon, iconAlign }) => {\n const { type, text, data } = action;\n\n const postBackMap = {\n onOrderDetail,\n };\n\n const actionTypeMap = {\n MESSAGE: () =>\n pushMsg('PUSH', {\n msgList: [\n {\n id: Date.now(),\n contentType: MsgContentTypeKeys['Text'],\n text: { text, isEncrypt: false },\n },\n ],\n }),\n POSTBACK: () => postBackMap[data]?.(),\n URI: () => {},\n };\n\n const IconComp = icon ? compMap['icon'] : null;\n const renderIconComp = () => (icon ? : null);\n\n return (\n \n \n {iconAlign === 'left' && renderIconComp()}\n {text}\n {iconAlign === 'right' && renderIconComp()}\n \n \n );\n },\n\n separator: ({ direction }) => (\n \n ),\n\n icon: ({ url, style }) => {\n return (\n \n );\n },\n };\n\n const Contents = ({ contents }) => {\n if (!contents) return null;\n return (\n <>\n {contents.map(({ type, ...item }, idx) => {\n const ContentComp = compMap[type] || null;\n if (!ContentComp) return null;\n return (\n \n \n \n );\n })}\n \n );\n };\n\n const Bubble = ({ type, contents, ...props }) => {\n const BubbleComp = compMap[type] || null;\n if (!BubbleComp) return null;\n return (\n \n \n \n );\n };\n\n return (\n
\n {header && }\n {hero && }\n {body && }\n {footer && }\n
\n );\n}\n\nexport default MsgBubble;\n","import { useCallback } from 'react';\nimport { IS_CLIENT } from '@/const';\n\nimport Msg from '@/components/Msg';\nimport MsgControlItem from '@/components/Msg/MsgControlItem';\nimport MsgText from '@/components/Msg/MsgText';\nimport MsgSystem from '@/components/Msg/MsgSystem';\nimport MsgImage from '@/components/Msg/MsgImage';\nimport MsgBubble from '@/components/Msg/MsgBubble';\n\nimport { ReceiveMsgContentType, MsgStatusKeys } from '@/utils';\n\nfunction MsgList({\n roomMsg = [],\n roomID = 0,\n usersMap = {},\n lastReadID = [],\n postSystemMsg = () => {},\n setRoomMsgHandle = () => {},\n onOrderDetail = () => {},\n}) {\n /**\n *\n */\n const msgBubbleRender = msg => {\n const { id, bubble, roomID } = msg;\n return (\n \n \n \n );\n };\n\n /**\n * 系統類訊息處理\n * @param {*} msg\n * @returns \n */\n const msgSystemRender = useCallback(\n msg => {\n const { id, system, roomID } = msg;\n return (\n \n \n \n );\n },\n [lastReadID, postSystemMsg, usersMap],\n );\n\n /**\n * 加入、離開、型態處理\n * @param {*} msg\n * @returns \n */\n const msgControlRender = useCallback(\n ({ id, timestamp, join, leave }) => {\n let showUserText = '';\n let text = '';\n\n if (join) {\n showUserText = IS_CLIENT\n ? usersMap[join.userID]?.aliasName || '客服'\n : usersMap[join.userID]?.username || '';\n text = `${showUserText} 加入群组`;\n }\n if (leave) {\n showUserText = IS_CLIENT\n ? usersMap[leave.userID]?.aliasName || '客服'\n : usersMap[leave.userID]?.username || '';\n text = `${showUserText} 离开群组`;\n }\n return ;\n },\n [usersMap],\n );\n\n /**\n * 檔案\n * @param {*} msg\n * @returns \n */\n const msgFileRender = useCallback(\n msg => {\n return (\n setRoomMsgHandle('UPDATE', { id, msg })}>\n \n \n );\n },\n [usersMap, roomID, lastReadID, setRoomMsgHandle],\n );\n\n /**\n * 文字\n * @param {*} msg\n * @returns \n */\n const msgTextRender = useCallback(\n msg => {\n return (\n setRoomMsgHandle('UPDATE', { id, msg })}>\n \n \n );\n },\n [roomID, lastReadID, usersMap, setRoomMsgHandle],\n );\n\n const type = {\n [ReceiveMsgContentType['Text']]: msg => msgTextRender(msg),\n [ReceiveMsgContentType['File']]: msg => msgFileRender(msg),\n [ReceiveMsgContentType['Join']]: msg => msgControlRender(msg),\n [ReceiveMsgContentType['Leave']]: msg => msgControlRender(msg),\n [ReceiveMsgContentType['System']]: msg => msgSystemRender(msg),\n [ReceiveMsgContentType['Bubble']]: msg => msgBubbleRender(msg),\n\n // 前端自己加的 cusType\n CusMsgContentType: msg => msg.render && msg.render(msg.id),\n };\n\n return (\n <>\n {roomMsg.map(msg => {\n if (IS_CLIENT && msg.status === MsgStatusKeys['Retract']) return null; // 收回的訊息不顯示\n return type[msg.contentType]?.(msg) ?? null;\n })}\n \n );\n}\n\nexport default MsgList;\n","/**\n * 運營類 訊息\n * - 行銷問候語\n * - FAQ\n */\nimport React from 'react';\nimport styled from 'styled-components';\nimport useRWD from '@/hook/useRWD';\n\nconst MsgInfoStyle = styled.div`\n margin-bottom: 1em;\n background: ${({ theme, bgColor }) => bgColor || theme.white};\n border-radius: 6px;\n padding: 8px 12px;\n color: ${({ theme, color }) => color || theme.black};\n ${({ isMobile }) =>\n isMobile &&\n `& img {\n width: 100% !important;\n height: auto !important;\n }`}\n`;\n\nconst MsgInfoWrap = ({\n children = null,\n bgColor = '',\n color = '',\n ...props\n}) => {\n const { isMobileSize } = useRWD();\n return (\n \n {children}\n \n );\n};\n\nexport default MsgInfoWrap;\n","import React from 'react';\nimport styled from 'styled-components';\nconst ResetHtml = styled.div`\n p {\n margin-bottom: 0px;\n }\n`;\n\nfunction ResetHtmlWrap({ html }) {\n return ;\n}\n\nexport default ResetHtmlWrap;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Button } from '@/plugin/wrap-comp';\n\nfunction ConnectCSBtn({ connectCS = () => {}, question }) {\n const { isLogin } = useSelector(({ client }) => client);\n return (\n
\n connectCS({ question })}\n disabled={isLogin}>\n 联系客服\n \n
\n );\n}\n\nexport default ConnectCSBtn;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Typography, Space, Divider } from 'antd';\nimport { Button } from '@/plugin/wrap-comp';\nimport MsgInfoWrap from '@/components/Msg/MsgInfoWrap';\nimport ResetHtmlWrap from '@/components/ResetHtmlWrap';\nimport ConnectCSBtn from './ConnectCSBtn';\n\nfunction CusFaqMsg({\n faqList = [],\n preData = {},\n clickFaq = () => {},\n connectCS = () => {},\n}) {\n const { csRoomSetting } = useSelector(({ client }) => client);\n const { currentRoomID } = useSelector(({ room }) => room);\n return (\n \n {/* 項目內文 */}\n {preData?.asked ? (\n \n ) : (\n 您想咨询哪个问题?\n )}\n\n {/* 問題按鈕 */}\n \n {faqList.map(faq => (\n clickFaq({ parentID: faq.id }, faq, currentRoomID)}>\n {faq.question}\n \n ))}\n \n {/* 進線按鈕 */}\n {faqList.length === 0 &&\n !csRoomSetting.autoCreatedCSEnable &&\n !currentRoomID && (\n <>\n \n \n \n )}\n \n );\n}\n\nexport default CusFaqMsg;\n","import React from 'react';\nimport MsgInfoWrap from '@/components/Msg/MsgInfoWrap';\nconst { theme } = require('@/plugin/theme');\n\nfunction CusUserMsg({ txt = '' }) {\n return (\n
\n \n {txt}\n \n
\n );\n}\n\nexport default CusUserMsg;\n","import React from 'react';\nimport { Box } from '@WRAP_COMP';\nimport { LoadingOutlined } from '@ant-design/icons';\nimport { Typography, Spin } from 'antd';\nfunction QueueInfo() {\n return (\n \n \n \n }\n />\n 等待客服加入...\n \n 目前访问人数较多\n \n 请您先留言或是\n 上传图片\n 来说明您的问题,客服将马上进线与您联系\n \n 感谢您的耐心等候\n \n );\n}\n\nexport default QueueInfo;\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { Box } from '@WRAP_COMP';\nimport { apiType, useQueryApi } from '@/hook/useApi';\n\nfunction DepositToken({ token = '' }) {\n const [code, setCode] = useState('');\n const { fetchData } = useQueryApi(apiType.GET_WEB_DEPOSIT_TOKEN);\n const handleFetchData = useCallback(async () => {\n if (!token) return;\n const { error, data } = await fetchData({ token });\n if (error) return;\n setCode(data?.getWebToken?.code || '');\n }, [token, fetchData]);\n useEffect(() => {\n handleFetchData();\n }, [handleFetchData]);\n\n if (!code) return null;\n return (\n \n 客服密码:{code}\n \n );\n}\n\nexport default DepositToken;\n","import React, {\n useState,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { Image, Upload } from 'antd';\nimport {\n LoadingOutlined,\n PlusOutlined,\n CloudUploadOutlined,\n} from '@ant-design/icons';\nimport { Button, Box } from '@/plugin/wrap-comp';\nimport ClientDrawerWrap from '@/components/Drawer/ClientDrawerWrap';\nimport useFile from '@/hook/useFile';\n\nfunction UploadProofDrawer({ payDeposit = () => {} }, ref) {\n const clientDrawerWrapRef = useRef(null);\n const [uploadLdg, setUploadLdg] = useState(false);\n const [file, setFile] = useState(false);\n const [url, setUrl] = useState('');\n const { getFileUrl } = useFile();\n\n const _beforeUpload = file => {\n setFile(file);\n setUrl(getFileUrl(file));\n return false;\n };\n\n const onChangeFile = info => {\n setUploadLdg(() => info.file.status === 'uploading');\n };\n\n useImperativeHandle(ref, () => ({\n setVisible: visible => clientDrawerWrapRef.current.setVisible(visible),\n }));\n\n return (\n <>\n clientDrawerWrapRef.current.setVisible(true)}\n style={{\n background: '#1c9cea',\n border: 'none',\n color: 'white',\n borderTopRightRadius: '20px',\n borderBottomRightRadius: '20px',\n }}>\n \n 上传凭证\n \n \n \n

\n 请您上传这笔存款的完整信息回执单(图片)\n
\n \n 包含完整的卡号、金额、姓名、银行印章(不可遮盖或含*)\n \n

\n \n \n \n \n \n \n 回执单示例\n \n \n \n \n \n {uploadLdg && }\n {uploadLdg ||\n (url ? (\n url\n ) : (\n \n ))}\n \n \n 点击上传凭证\n \n \n

\n 文件格式为PNG、JPEG、AVI,支持上传视频:MPEG、AVI、nAVI、ASF、MOV、3GP、WMV、DivX、XviD、RM、RMVB、FLV/F4V,文件大小不超过10M。\n

\n \n payDeposit(file)}\n style={{ borderRadius: '8px', padding: '6.4px 36px' }}>\n 提交凭证确认付款\n \n \n
\n
\n \n );\n}\n\nexport default forwardRef(UploadProofDrawer);\n","import React from 'react';\nimport { Statistic } from 'antd';\nimport { Box } from '@WRAP_COMP';\nconst { theme } = require('@/plugin/theme');\nfunction Countdown({\n value = 0,\n color = 'danger',\n text = '请在{value}内完成充值',\n size = 14,\n bgColor = '',\n onFinish = () => {},\n wrapProps = {},\n}) {\n const textArr = text.split('{value}');\n return (\n \n {textArr[0]}\n \n {textArr[1]}\n \n );\n}\nexport default Countdown;\n","import React from 'react';\nimport { Box } from '@/plugin/wrap-comp';\nimport { MsgContentTypeKeys } from '@/utils';\n\nconst arr = ['是的', '需要', '好的', '支付宝', '微信'];\n\nconst h = '30px';\n\nfunction QuickMsgTab({ pushMsg = () => {} }) {\n return (\n \n \n {arr.map((item, idx) => (\n \n pushMsg({\n id: Date.now(),\n contentType: MsgContentTypeKeys['Text'],\n text: { text: item, isEncrypt: false },\n })\n }>\n {item}\n \n ))}\n \n \n );\n}\n\nexport default QuickMsgTab;\n","import React, {\n Suspense,\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setRoomDetail } from '@/store/room';\nimport { setRenew } from '@/store/client';\n\nimport { apiType, useMutationApi, useQueryApi } from '@/hook/useApi';\nimport useRoomMessage from '@/hook/useRoomMessage';\nimport useRecMessage from '@/hook/useRecMessage';\nimport useBeep from '@/hook/useBeep';\nimport useAlertMessage from '@/hook/useAlertMessage';\nimport useOrder from '@/hook/useOrder';\n\nimport { Box } from '@WRAP_COMP';\nimport ChatRoomContent from '@/components/ChatRoomContent';\nimport ChatRoomInputBar from '@/components/ChatRoomInputBar';\nimport MsgList from '@/components/MsgList';\nimport MsgInfoWrap from '@/components/Msg/MsgInfoWrap';\nimport ResetHtmlWrap from '@/components/ResetHtmlWrap';\nimport {\n CSRoomTypeKey,\n MsgSystemType,\n OrderStatusKeys,\n asyncLocalStorage,\n csRoomUrlParams,\n MsgContentTypeKeys,\n} from '@/utils';\n\nimport CusFaqMsg from './components/CusFaqMsg';\nimport CusUserMsg from './components/CusUserMsg';\nimport ConnectCSBtn from './components/ConnectCSBtn';\nimport QueueInfo from './components/QueueInfo';\nimport DepositToken from './components/DepositToken';\nimport UploadProofDrawer from '@/views/Client/components/UploadProofDrawer';\nimport ClientOrderDetailDrawer from '@/components/Drawer/ClientOrderDetailDrawer';\nimport Countdown from '@/components/Countdown';\nimport QuickMsgTab from './components/QuickMsgTab';\n\nlet hasTypingTimeoutID = null;\n// let disConnectedInterID = null;\n// let refreshInterID = null;\n\nconst CSRoom = (\n {\n isQueue = false,\n createdCSRoomHandle = () => {},\n fetchRoomInfo = () => {},\n setConnectWS = () => {},\n },\n ref,\n) => {\n const dispatch = useDispatch();\n const operatingProcessDone = useRef(false);\n const inputBarRef = useRef(null);\n const chatRoomContentRef = useRef(null);\n const uploadProofDrawerRef = useRef(null);\n const clientOrderDetailDrawerRef = useRef(null);\n const { onErrorMsg } = useAlertMessage();\n\n const { currentRoomID, roomDetail, roomUsersMap } = useSelector(\n ({ room }) => room,\n );\n const { renew, csRoomSetting, isLogin, clientUserInfo } = useSelector(\n ({ client }) => client,\n );\n\n const isDepositRoomType = useMemo(\n () =>\n csRoomUrlParams.roomType === CSRoomTypeKey['Deposit'] ||\n clientUserInfo.roomType === CSRoomTypeKey['Deposit'],\n [clientUserInfo.roomType],\n );\n\n const [expiredAt, setExpiredAt] = useState(0);\n\n const userOrder = roomDetail?.room?.userOrder || {};\n\n /**\n * 訂單\n */\n // 取消訂單\n const { expireDeposit } = useOrder(); // 取消訂單\n\n // 審核訂單\n const [payDeposit] = useMutationApi(apiType.paidDeposit);\n const _payDeposit = async file => {\n const [err] = await payDeposit({\n in: {\n roomID: roomDetail.room.roomID,\n orderNo: roomDetail.room.userOrder.orderNo,\n },\n });\n if (err) {\n onErrorMsg(err?.message || '完成存款错误');\n } else {\n uploadProofDrawerRef.current.setVisible(false);\n pushMsgHandle({\n id: Date.now(),\n contentType: MsgContentTypeKeys['File'],\n file: {\n upload: file,\n text: '我已完成付款,请确认!',\n type: 'Image',\n },\n });\n }\n };\n\n /**\n * 提示音\n */\n const { playPromise } = useBeep();\n const playBeep = useCallback(() => {\n if (!csRoomSetting.beepURL || !csRoomSetting.beepEnabled) return;\n const beepObj = new Audio(csRoomSetting.beepURL);\n playPromise(beepObj);\n }, [csRoomSetting.beepEnabled, csRoomSetting.beepURL, playPromise]);\n\n /**\n * 行銷問候語 + FAQ depth: 1\n */\n const { fetchData: greetingAndFaq } = useQueryApi(\n apiType.GET_GREETING_AND_FAQ,\n );\n const fetchGreetingAndFaq = useCallback(async () => {\n const { error, data } = await greetingAndFaq({\n source: csRoomUrlParams.source || '',\n });\n if (error) return { error };\n return {\n greetingList: data.listConsultingGreeting.ConsultingGreetings,\n faqList: data.listFrequentlyQuestion.frequentlyQuestions,\n };\n }, [greetingAndFaq]);\n\n /**\n * FAQ\n */\n const [countFAQ] = useMutationApi(apiType.FAQ_COUNT);\n const { fetchData: fetchFaqList } = useQueryApi(apiType.LIST_FAQ_DETAIL);\n const fetchFaqListHandle = useCallback(\n async frequentlyQuestion => {\n const { error, data } = await fetchFaqList({\n filter: { frequentlyQuestion, isClient: true },\n });\n if (error) return { error };\n return { list: data.listFrequentlyQuestion.frequentlyQuestions };\n },\n [fetchFaqList],\n );\n\n const {\n roomMsg,\n pushCusMsg,\n pushMsg,\n setRoomMsgHandle,\n fetchInRoomMsgHandle,\n postSystemMsg,\n loadMoreMsg,\n loadPreRoomMsg,\n lastReadID,\n } = useRoomMessage({\n currentRoomID,\n currUserRooms: roomDetail?.room.userRooms || [],\n currHistoryRooms: roomDetail?.room.historyRooms || [],\n });\n\n /**\n * 推訊息\n */\n const pushMsgHandle = msg => {\n pushMsg(msg);\n chatRoomContentRef.current.scrollNodeTo();\n };\n\n /**\n * 使用者正在輸入處理 (加入延遲)\n */\n const [postTyping, { loading }] = useMutationApi(apiType.POST_TYPING);\n const lazyTyping = useCallback(\n content => {\n if (hasTypingTimeoutID) return;\n postTyping({ in: { roomID: clientUserInfo.roomID, content } });\n hasTypingTimeoutID = setInterval(function () {\n clearInterval(hasTypingTimeoutID);\n hasTypingTimeoutID = null;\n }, 500);\n },\n [clientUserInfo.roomID, postTyping],\n );\n\n /**\n * 監聽\n */\n // 封存處理\n const recDeactivatedHandle = () => {\n pushCusMsg({\n render: id => (\n \n 咨询已结束\n \n ),\n });\n setConnectWS({ skip: true });\n dispatch(setRoomDetail(null));\n asyncLocalStorage.removeItem('clientUserInfo');\n // if (refreshInterID) {\n // window.clearInterval(refreshInterID);\n // refreshInterID = null;\n // }\n };\n // 新訊息處理\n const recNewMsgHandle = recMsg => {\n if (recMsg.from.userID !== roomDetail?.ownerUserData?.id) {\n chatRoomContentRef.current?.setHasNewMsgHandle();\n playBeep();\n }\n };\n\n const recOrderPendingHandle = msg => {\n pushMsgHandle(msg);\n setExpiredAt(msg.system.content.expiredAt);\n };\n\n useRecMessage({\n msgCommonType: recNewMsgHandle,\n csRoomStatusDeactivated: recDeactivatedHandle,\n orderStatusPending: recOrderPendingHandle,\n orderStatusCancel: () => {\n setExpiredAt(0);\n },\n orderStatusApproving: () => {\n setExpiredAt(0);\n },\n payList: pushMsgHandle,\n systemText: () => {\n chatRoomContentRef.current?.setHasNewMsgHandle();\n chatRoomContentRef.current?.scrollNodeTo();\n },\n });\n\n /**\n * 訊息漏接處理\n */\n const gogoRetry = useCallback(() => {\n Promise.all([\n fetchInRoomMsgHandle(clientUserInfo.roomID, 'AFRESH', roomMsg.length),\n fetchRoomInfo({ id: clientUserInfo.roomID }),\n ]);\n }, [\n clientUserInfo.roomID,\n fetchInRoomMsgHandle,\n fetchRoomInfo,\n roomMsg.length,\n ]);\n useEffect(() => {\n if (renew) {\n gogoRetry();\n dispatch(setRenew(false));\n }\n }, [renew, gogoRetry, dispatch]);\n /**\n * ws 重連處理\n */\n // ws 斷線輪詢處理\n // const gogoRetry = () => {\n // Promise.all([\n // fetchInRoomMsgHandle(clientUserInfo.roomID, 'AFRESH', roomMsg.length),\n // fetchRoomInfo(clientUserInfo.roomID),\n // ]);\n // };\n // const disConnectedInterHandle = async () => {\n // if (!isLogin) return;\n // // 3s輪詢 (連上線後停止)\n // // eslint-disable-next-line no-unused-vars\n // if (!disConnectedInterID) {\n // disConnectedInterID = setInterval(async () => {\n // gogoRetry();\n // }, 3000);\n // }\n // // 30s輪詢 (不停止)\n // // eslint-disable-next-line no-unused-vars\n // if (!refreshInterID) {\n // refreshInterID = setInterval(async () => {\n // gogoRetry();\n // }, 30000);\n // }\n // };\n\n // const clearDisConnectedInter = () => {\n // if (!disConnectedInterID) return;\n // window.clearInterval(disConnectedInterID);\n // disConnectedInterID = null;\n // };\n // const wsStatusHandle = ({ status }) => {\n // const type = {\n // onDisconnected: disConnectedInterHandle,\n // onReconnected: clearDisConnectedInter,\n // onConnected: clearDisConnectedInter,\n // };\n // type[status] && type[status]();\n // };\n // useEffect(() => {\n // wsStatusHandle(wsStatusInfo);\n // // eslint-disable-next-line react-hooks/exhaustive-deps\n // }, [wsStatusInfo]);\n\n /**\n * 進線按鈕\n */\n const connectCSBtnRender = question => {\n pushCusMsg({\n render: id => (\n \n \n \n ),\n });\n };\n\n /**\n * FAQ 發送處理\n */\n const clickFaq = async (params = {}, preData = {}, roomID) => {\n pushCusMsg({\n render: id => ,\n });\n chatRoomContentRef.current.scrollNodeTo();\n roomID && countFAQ({ roomID });\n const { error, list } = await fetchFaqListHandle(params);\n if (error) {\n !roomID && connectCSBtnRender();\n return;\n }\n faqContentRender(list, preData);\n };\n const faqContentRender = (faqList = [], preData = {}) => {\n pushCusMsg({\n render: id => (\n \n ),\n });\n };\n\n /**\n * 行銷問候語發送處理\n */\n const greetingHandle = async el => {\n return new Promise(resolve => {\n setTimeout(() => {\n pushCusMsg({\n render: id => (\n \n \n \n ),\n });\n resolve();\n }, el.afterSendSec * 1000);\n });\n };\n\n /**\n * 運營流程 (顯示順序:行銷問候語 > faq > 房間舊訊息)\n */\n useEffect(() => {\n // 非自動進線登入後流程\n isLogin &&\n operatingProcessDone.current &&\n fetchInRoomMsgHandle(clientUserInfo.roomID, 'PUSH');\n }, [isLogin, clientUserInfo.roomID, fetchInRoomMsgHandle]);\n\n // 運營訊息發完才能顯示房間訊息\n const operatingProcess = async isLogin => {\n const { error, greetingList, faqList } = await fetchGreetingAndFaq();\n if (error) return;\n // 行銷問候語發完才發 FAQ\n if (greetingList.length)\n await Promise.all(greetingList.map(el => greetingHandle(el)));\n if (faqList.length) faqContentRender(faqList);\n // 沒有 FAQ 並且為未登入 才顯示進線按鈕\n if (!faqList.length && !isLogin) connectCSBtnRender();\n isLogin && fetchInRoomMsgHandle(clientUserInfo.roomID, 'PUSH');\n operatingProcessDone.current = true;\n };\n\n const handleDepositRoomInit = async () => {\n const msg = await fetchInRoomMsgHandle(clientUserInfo.roomID, 'PUSH');\n const pendingOrder = msg?.find(({ system }) => {\n return (\n system &&\n system.type === MsgSystemType['UserOrder'] &&\n system.content.orderStatus === OrderStatusKeys['Pending'].key\n );\n });\n pendingOrder && setExpiredAt(pendingOrder.system.content.expiredAt);\n };\n\n useEffect(() => {\n if (isDepositRoomType) {\n handleDepositRoomInit();\n } else {\n operatingProcess(isLogin);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useImperativeHandle(ref, () => ({\n pushMsgHandle,\n postSystemMsg,\n }));\n\n return (\n <>\n \n \n {isQueue && }\n {expiredAt > 0 && (\n }>\n \n {\n expireDeposit({\n in: {\n roomID: currentRoomID,\n orderNo: userOrder.orderNo,\n },\n });\n }}\n wrapProps={{\n px: 3,\n py: 1,\n borderRadius: '6px',\n fontSize: '12px',\n }}\n />\n \n \n )}\n \n }\n controlFooter={\n isDepositRoomType && (\n \n \n \n \n )\n }>\n \n clientOrderDetailDrawerRef.current.setVisible(true)\n }\n />\n \n\n
\n loading || lazyTyping(val)}\n pushMsg={pushMsgHandle}\n showFrontDrop={!roomDetail}\n showPaymentCancelBtn={!!roomMsg.length}\n />\n
\n\n \n \n );\n};\n\nexport default forwardRef(CSRoom);\n","import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { useSubscription } from '@apollo/client';\nimport { setClientUserInfo, setIsLogin } from '@/store/client';\nimport { setRoomDetail } from '@/store/room';\nimport { setRecMsg, setWsStatusInfo } from '@/store/subscribe';\nimport { useMutationApi, apiType } from '@HOOK/useApi';\nimport useRoom, { headerAvatarURL } from '@HOOK/useRoom';\nimport useIframe from '@HOOK/useIframe';\nimport useRecMessage from '@HOOK/useRecMessage';\nimport useAlertMessage from '@/hook/useAlertMessage';\n\nimport FullBg from '@/components/CSRoomClient/FullBg';\nimport Container from '@/components/CSRoomClient/Container';\nimport CSRoomOrderList from '@/views/Client/components/OrderList';\nimport CSRoomContentWrap from '@/components/ChatRoomContent/ContentWrap';\nimport Carousel from '@/components/ChatRoomContent/Carousel';\nimport Header from '@/components/ChatRoomHeader/ClientHeader';\nimport {\n omitTypenameHandle,\n asyncLocalStorage,\n RoomStatusKeys,\n CSRoomTypeKey,\n cloneDeep,\n csRoomUrlParams,\n} from '@UTILS';\nimport FullRoomLoading from './components/FullRoomLoading';\nimport BeforeEnter from './components/BeforeEnter';\nimport RedirectVerifyModel from './components/RedirectVerifyModel';\nimport CSRoom from './CSRoom';\n\n// http://localhost:3001/?userName=eWVsbG93MDcw (yellow070\n// console.log('username', csRoomUrlParams.username);\n\nconst arr = [1, 2, 3, 4];\nconst random = arr[Math.floor(Math.random() * arr.length)];\n\nfunction Client() {\n const dispatch = useDispatch();\n const { roomUsersMap } = useSelector(({ room }) => room);\n const { clientUserInfo, csRoomSetting, csRoomForm } = useSelector(\n ({ client }) => client,\n );\n const { onErrorMsg } = useAlertMessage();\n const { postToBack } = useIframe(csRoomUrlParams.reqUrl); // iframe 互動\n\n const csRoomRef = useRef(null);\n\n // 推波開關\n const [connectWS, setConnectWS] = useState({ skip: true });\n\n const [showCSRoom, setShowCSRoom] = useState(false);\n const [initLoading, setInitLoading] = useState(true);\n const [CSFormData, setCSFormData] = useState([]);\n\n // 排隊\n const [queueQsID, setQueueQsID] = useState(0);\n const [isQueue, setIsQueue] = useState(false);\n\n const isDepositRoomType =\n csRoomUrlParams.roomType === CSRoomTypeKey['Deposit'] ||\n clientUserInfo.roomType === CSRoomTypeKey['Deposit'];\n\n const { updateInRoom, fetchRoomInfo, fetchRoom } = useRoom({\n getRoomContext: { context: { isShowGeneralError: false } },\n });\n\n const resetUserInfo = () => {\n dispatch(setClientUserInfo({}));\n dispatch(setRoomDetail(null));\n };\n\n /**\n * 詢前表單\n */\n const updateQsHandel = useCallback((idx, data) => {\n const handle = org => {\n let tempList = cloneDeep(org);\n tempList[idx] = data;\n return tempList;\n };\n setCSFormData(pre => handle(pre));\n }, []);\n useEffect(() => {\n csRoomForm.isEnabled && setCSFormData(csRoomForm.formDataList);\n }, [csRoomForm]);\n\n /**\n * 排隊處理\n */\n const queueHandle = useCallback(\n roomStatus => {\n if (!csRoomSetting.queueEnabled) return;\n setIsQueue(false);\n if (roomStatus === RoomStatusKeys['Active']) setIsQueue(true);\n if (roomStatus === RoomStatusKeys['Processing']) setIsQueue(false);\n },\n [csRoomSetting.queueEnabled],\n );\n\n /**\n * 建立諮詢房\n */\n // 建立後的處理\n const afterCreatedRoomHandle = useCallback(\n async ({ token, deviceUID, roomID, type = '', ownerUserID }) => {\n const userInfo = {\n token,\n deviceUID,\n roomID,\n roomType: type.toLowerCase(),\n id: ownerUserID,\n username: csRoomUrlParams.username,\n avatarURL: `user-avatar${random}.jpg`,\n };\n dispatch(setClientUserInfo(userInfo));\n dispatch(setIsLogin(true));\n setConnectWS({ skip: false, token, deviceUID, roomID });\n await asyncLocalStorage.setItem('clientUserInfo', userInfo);\n },\n [dispatch],\n );\n\n // 建立諮詢房 一般房進線處理\n const [createdCSRoom] = useMutationApi(apiType.CREATED_CS_ROOM, {\n onError: err => {\n if (err.message === '401004') {\n resetUserInfo();\n // window.location.reload();\n // createdCSRoomHandle();\n }\n onErrorMsg('建立咨询房失败');\n },\n onSuccess: async data => {\n const {\n token = '',\n deviceUID = '',\n room: { consultingDetail },\n } = data.data.createConsultationRoom;\n await afterCreatedRoomHandle({ token, deviceUID, ...consultingDetail });\n queueHandle(consultingDetail.status);\n // 獲取第一次房間資訊&訊息\n const { error } = await fetchRoomInfo({ id: consultingDetail.roomID });\n if (error) return;\n setShowCSRoom(true);\n setInitLoading(false);\n },\n });\n\n const createdCSRoomHandle = useCallback(\n async (params = {}) => {\n await createdCSRoom({\n in: {\n accessDomain: document.domain,\n sourceDomain: csRoomUrlParams.sourceDomain,\n username: csRoomUrlParams.username,\n formData: omitTypenameHandle(CSFormData),\n questionID: queueQsID,\n ...params,\n },\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [CSFormData, dispatch],\n );\n\n // 建立諮詢房 充值房進線處理\n const [createCSDepositRoom] = useMutationApi(\n apiType.CREATED_CS_DEPOSIT_ROOM,\n {\n onError: err => {\n if (err.message === '401004') {\n resetUserInfo();\n // window.location.reload();\n // createCSDepositRoomHandle();\n }\n onErrorMsg('建立充值房失败');\n },\n onSuccess: async data => {\n const {\n token = '',\n deviceUID = '',\n room: { consultingDetail },\n } = data.data.createUserDepositRoom;\n await afterCreatedRoomHandle({ token, deviceUID, ...consultingDetail });\n await fetchRoomInfo({ id: consultingDetail.roomID });\n setShowCSRoom(true);\n setInitLoading(false);\n },\n },\n );\n const createCSDepositRoomHandle = useCallback(async () => {\n await createCSDepositRoom({\n in: {\n accessDomain: document.domain,\n sourceDomain: csRoomUrlParams.sourceDomain,\n username: csRoomUrlParams.username || clientUserInfo.username,\n realName: csRoomUrlParams.realName,\n amount: csRoomUrlParams.depositAmount,\n payType: csRoomUrlParams.payType,\n jobID: csRoomUrlParams.jobID,\n },\n });\n }, [clientUserInfo.username, createCSDepositRoom]);\n\n /**\n * 訂閱 ws\n */\n\n useSubscription(apiType.RECEIVE_MSG, {\n skip: connectWS.skip,\n variables: {\n userAuth: { token: connectWS.token, deviceUID: connectWS.deviceUID },\n },\n onSubscriptionData: ({ subscriptionData: subData }) => {\n // console.log('RecMsg', subData?.data?.receiveMessage);\n dispatch(setRecMsg(subData ? subData.data.receiveMessage : null));\n },\n });\n useRecMessage({\n hi: useCallback(() => {\n dispatch(setWsStatusInfo({ status: 'onConnected' }));\n updateInRoom({ roomID: connectWS.roomID });\n }, [connectWS.roomID, dispatch, updateInRoom]),\n join: useCallback(\n ({ roomID }) => fetchRoomInfo({ id: roomID }),\n [fetchRoomInfo],\n ),\n leave: useCallback(\n ({ roomID }) => fetchRoomInfo({ id: roomID }),\n [fetchRoomInfo],\n ),\n roomUpdate: useCallback(\n ({ roomUpdate }) => queueHandle(roomUpdate.consultingDetail.status),\n [queueHandle],\n ),\n csRoomStatusProcessing: useCallback(\n ({ roomUpdate }) => fetchRoomInfo({ id: roomUpdate.roomID }),\n [fetchRoomInfo],\n ),\n });\n\n /**\n * 關閉時重新檢查是否自動進線\n */\n const onFinishBeforeEnter = () => {\n createdCSRoomHandle();\n };\n\n /**\n * iniProcess\n * 照順序檢查\n */\n const iniProcess = useCallback(\n async ({ roomID, token = '' }) => {\n // ## 充值房 -> 直接進線\n if (isDepositRoomType) {\n resetUserInfo();\n createCSDepositRoomHandle({\n in: {\n accessDomain: document.domain,\n sourceDomain: csRoomUrlParams.sourceDomain,\n username: csRoomUrlParams.username || clientUserInfo.username,\n },\n });\n return;\n }\n\n // ## 復原 local 房間\n if (token) {\n const { error, data } = await fetchRoom({\n filter: { room: { id: roomID } },\n });\n // 權限未過期 || 房間未封存\n if (\n !error &&\n data.getRoom.consultingDetail.status !== RoomStatusKeys['Deactivated']\n ) {\n await createdCSRoomHandle();\n return;\n }\n }\n\n // ## 主動聯繫會員 || ## 自動進線 -> 直接進線\n if (\n csRoomUrlParams.autoContact === 'auto' ||\n csRoomSetting.autoCreatedCSEnable\n ) {\n resetUserInfo();\n createdCSRoomHandle();\n return;\n }\n\n // ## 詢前表單\n if (csRoomForm.isEnabled) {\n setInitLoading(false);\n return;\n }\n\n resetUserInfo();\n setInitLoading(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [csRoomSetting, csRoomForm, csRoomUrlParams],\n );\n\n useEffect(() => {\n iniProcess(clientUserInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <>\n \n \n csRoomRef.current.pushMsgHandle(msg)}\n />\n )\n }\n />\n \n }\n chatRoomContent={\n \n {initLoading && }\n {!initLoading && (\n <>\n {showCSRoom ? (\n \n ) : (\n \n )}\n \n )}\n \n }\n chatRoomContentCourse={\n \n }\n />\n \n \n \n );\n}\n\nexport default Client;\n","import React from 'react';\nimport { useRoutes } from 'react-router-dom';\nimport { client } from '@/router/client';\nconst clientRoutes = client();\n\nconst ClientApp = () => {\n const routing = useRoutes(clientRoutes);\n return <>{routing};\n};\n\nexport default ClientApp;\n","import React from 'react';\nimport { Navigate } from 'react-router-dom';\nimport GlobalClient from 'src/views/GlobalClient';\nimport Client from 'src/views/Client';\n\nexport const client = () => {\n return [\n {\n key: 'Client',\n path: '',\n element: ,\n children: [\n { path: '/', element: },\n { path: '*', element: },\n ],\n },\n ];\n};\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport React from 'react';\nimport { render } from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { CusApolloProvider } from './plugin/apollo';\nimport { CusThemeProvider } from './plugin/styled';\nimport { initSentry } from './plugin/sentry';\nimport store from './store';\nimport App from '@APP_NAME';\nimport './globel.css';\n\ninitSentry();\nfunction Root() {\n return (\n \n \n \n \n \n \n \n \n \n );\n}\nrender(, document.getElementById('root'));\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n// reportWebVitals();\n","/**\n * 主題\n */\nconst theme = {\n primary: '#6993FF',\n 'primary-light': '#D8E3FF',\n secondary: '#93B4D4',\n 'secondary-light': '#e3f2ff',\n success: '#2AC5BD',\n 'success-light': '#B7F5F2',\n warning: '#FBA801',\n 'warning-light': '#FFF1D5',\n danger: '#F64E60',\n 'danger-light': '#FCC7CD',\n white: '#fff',\n black: '#475F7B',\n 'gray-0': '#F7F9FB',\n 'gray-1': '#EEF3F9',\n 'gray-2': '#D5DFEA',\n 'gray-3': '#9AAABD',\n comp: {\n headerHeight: '50px',\n },\n};\n\n/**\n * 覆蓋 antd theme\n */\nconst AntTheme = {\n '@black': theme.black,\n '@primary-color': theme.primary,\n};\n\nmodule.exports = { AntTheme, theme };\n","/**\n * 菜單單\n */\n\nimport { gql } from '@apollo/client';\n\nexport const COMMENT_MENU = gql`\n fragment menuFields on Menu {\n name\n key\n # superKey\n # category\n # router\n # publicAPI\n }\n`;\n\nexport const GET_MENU_LIST = gql`\n ${COMMENT_MENU}\n query listMenu {\n listMenu {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n }\n }\n }\n }\n }\n`;\n","export default __webpack_public_path__ + \"static/media/cs-avatar.a6d4e81b.jpg\";","// 收集所有\r\n\r\nconst currFolderFiles = require.context('./', false, /\\.js$/);\r\n\r\n// 取得目錄下所有檔案名稱,並過濾不需要的檔案\r\nconst getModuleFiles = currFolderFiles.keys().filter((item) => {\r\n // 不需要的檔案寫進來\r\n const excludeFiles = ['./index.js'];\r\n\r\n return !excludeFiles.includes(item);\r\n});\r\n\r\nconst APIs = (function outputAPI() {\r\n // 將需要的檔案export default組成物件\r\n let allAPI = {};\r\n getModuleFiles.forEach((path) => {\r\n // 用來集合所有API的物件\r\n const apiFuncs = {};\r\n\r\n // 取得非default export的內容,\r\n const apiNameList = Object.keys(currFolderFiles(path));\r\n apiNameList.forEach((ele) => {\r\n if (ele !== 'default') {\r\n apiFuncs[ele] = currFolderFiles(path)[ele];\r\n }\r\n });\r\n\r\n // 取得非default export的內容\r\n if (currFolderFiles(path).default) {\r\n const defaultAPIName = path.replace(/((.\\/)|(.js))/g, '');\r\n apiFuncs[defaultAPIName] = currFolderFiles(path).default;\r\n }\r\n\r\n allAPI = {\r\n ...allAPI,\r\n ...apiFuncs\r\n };\r\n });\r\n\r\n return allAPI;\r\n})();\r\n\r\nexport const defaultOptions = {\r\n isShowGeneralError: true, // api error 是否出現攔截器的錯誤視窗\r\n /**\r\n * api如果有錯, 會呼叫getError function讓組件處理錯誤\r\n * @param {String} message 錯誤碼\r\n * @param {Function} originHandler api攔截器原來的錯誤處理, 當遇到不需要特別處理的錯誤碼時, 可以呼叫它來執行原來的錯誤處理\r\n */\r\n getError: () => {}\r\n};\r\n\r\nexport default APIs;\r\n","import { useCallback } from 'react';\nimport { Button, message } from 'antd';\n\nexport const copyText = async val => {\n await navigator.clipboard.writeText(val);\n message.success('复制成功');\n};\n\nexport const CopyBtn = ({ value, style = {} }) => (\n copyText(value)}\n size='small'\n style={{\n borderColor: '#1591dc',\n borderRadius: '4px',\n color: '#1591dc',\n padding: '0 5px',\n height: '22px',\n fontSize: '12px',\n ...style,\n }}>\n 复制\n \n);\n\nfunction useCopy() {\n const createImage = useCallback(options => {\n options = options || {};\n const img = document.createElement('img');\n if (options.src) {\n img.src = options.src;\n }\n return img;\n }, []);\n\n const copyMediaToClipboard = useCallback(async pngBlob => {\n try {\n await navigator.clipboard.write([\n // eslint-disable-next-line no-undef\n new ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n console.log('Image copied');\n } catch (error) {\n console.error(error);\n }\n }, []);\n\n const convertToPng = useCallback(\n imgBlob => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = createImage({ src: window.URL.createObjectURL(imgBlob) });\n imageEl.onload = e => {\n canvas.width = e.target.width;\n canvas.height = e.target.height;\n ctx.drawImage(e.target, 0, 0, e.target.width, e.target.height);\n canvas.toBlob(copyMediaToClipboard, 'image/png', 1);\n };\n },\n [copyMediaToClipboard, createImage],\n );\n\n const copyImg = useCallback(\n async src => {\n const img = await fetch(src);\n const imgBlob = await img.blob();\n const extension = src.split('.').pop();\n const supportedToBeConverted = ['jpeg', 'jpg', 'gif'];\n if (supportedToBeConverted.indexOf(extension.toLowerCase())) {\n return convertToPng(imgBlob);\n } else if (extension.toLowerCase() === 'png') {\n return copyMediaToClipboard(imgBlob);\n }\n console.error('Format unsupported');\n return;\n },\n [convertToPng, copyMediaToClipboard],\n );\n\n return { copyImg, copyText };\n}\n\nexport default useCopy;\n","import { gql } from '@apollo/client';\n\n/**\n * ROOM 相關\n */\n// CS_ROOM ----------------------------------\nexport const CS_DETAIL_FIELD = gql`\n fragment consultingDetailField on RoomConsultingDetail {\n roomID\n deactivatedAt\n deactivatedUserID\n ipAddress\n country\n administrativeArea\n sourceDomain\n accessDomain\n questionID\n deviceOS\n ownerUserID\n status\n isProactive\n createdAt\n question\n type\n userOrder {\n orderNo\n amount\n payType\n currency\n status\n createdAt\n }\n }\n`;\n\nexport const CS_DETAIL_FIELD_LESS = gql`\n fragment consultingDetailLessField on RoomConsultingDetail {\n roomID\n ipAddress\n country\n administrativeArea\n sourceDomain\n accessDomain\n ownerUserID\n status\n isProactive\n createdAt\n type\n }\n`;\n\nexport const CS_SETTING_FIELD = gql`\n fragment CSSetting on ConsultingRoomClientSetting {\n id\n consultingRoomOriginID\n backgroundColor\n backgroundImageURL\n header {\n title\n backgroundImageURL\n backgroundColor\n logoURL\n avatarURL\n isEnabled\n contentLogoEnabled\n contentLogoURL\n contentLogoPosition\n }\n content {\n backgroundColor\n backgroundImageURL\n boxBackgroundColor\n boxBackgroundImageURL\n }\n banner {\n imageURL\n linkUrl\n isEnabled\n }\n beepURL\n beepEnabled\n queueEnabled\n enterDirectlyEnabled\n redirectVerifyEnabled\n createdAt\n }\n`;\nexport const CS_GREETING_FIELD = gql`\n fragment CSGreeting on ConsultingGreeting {\n id\n consultingRoomOriginID\n title\n content\n source\n afterSendSec\n isEnabled\n }\n`;\nexport const CS_FORM_FIELD = gql`\n fragment CSForm on ConsultingRoomForm {\n id\n consultingRoomOriginID\n title\n isEnabled\n isVerificationCode\n formData {\n id\n type\n label\n content {\n value\n items {\n label\n value\n }\n }\n rule {\n require\n verifyType\n }\n }\n }\n`;\nexport const CS_ORIGIN_FIELD = gql`\n fragment CSRoomOrigin on ConsultingRoomOrigin {\n id\n origin\n spinachPlatformKey\n merchantID\n customerServices {\n id\n username\n }\n remark\n createdAt\n }\n`;\n\n// USER_ROOMS\nexport const COMMENT_USER_ROOMS = gql`\n fragment userRoomsFields on UserRoom {\n id\n userID\n isOperator\n deletedAt # 用來判斷是否已離開房間 重新加入會 = 0\n lastReadMessageID\n isPinned\n user {\n ...userRoomFields\n }\n }\n fragment userRoomFields on User {\n id\n username\n aliasName\n avatarURL\n accountType\n status\n email\n area\n notes\n isOnline\n }\n`;\n\n/**\n * MSG 相關\n */\n// SYSTEM\nexport const MSG_SYSTEM = gql`\n fragment MsgSystemField on MsgSystem {\n type\n content {\n ... on MsgSystemOrder {\n payType\n payMethod\n orderNo\n orderID\n orderStatus\n orderAmount\n remark\n createdAt\n updatedAt\n expiredAt\n bank {\n bankName\n branchName\n bankCode\n accountName\n cardNo\n }\n qrcode {\n url\n qUrl\n account\n accountName\n }\n redirect {\n url\n }\n }\n ... on MsgSystemPayList {\n amount\n payList {\n payeeID\n alias\n payType\n }\n }\n ... on MsgText {\n text\n isEncrypt\n }\n }\n }\n`;\n\n// BUBBLE\nexport const MSG_BUBBLE = gql`\n fragment MsgBubbleField on MsgBubble {\n type\n header {\n ...MsgBoxDetail\n ...MsgBoxRecursive\n }\n hero {\n ...MsgImageDetail\n }\n body {\n ...MsgBoxDetail\n ...MsgBoxRecursive\n }\n footer {\n ...MsgBoxDetail\n ...MsgBoxRecursive\n }\n }\n fragment MsgTextDeteil on MsgText {\n align\n color\n copied\n flex\n isEncrypt\n label\n margin\n size\n text\n type\n weight\n }\n\n fragment MsgActionDetail on MsgAction {\n type\n data\n text\n uri\n }\n\n fragment MsgImageDetail on MsgImage {\n action {\n ...MsgActionDetail\n }\n size\n type\n }\n\n fragment MsgButtonDetail on MsgButton {\n action {\n ...MsgActionDetail\n }\n color\n height\n width\n icon {\n ...MsgIconDetail\n }\n iconAlign\n style\n type\n }\n\n fragment MsgIconDetail on MsgIcon {\n type\n url\n size\n style\n }\n\n fragment MsgSeparatorDetail on MsgSeparator {\n type\n size\n color\n direction\n }\n\n fragment MsgBoxDetail on MsgBox {\n layout\n margin\n separator\n separatorColor\n spacing\n type\n padding\n justifyContent\n alignItems\n }\n\n fragment MsgBoxRecursive on MsgBox {\n contents {\n ... on MsgText {\n ...MsgTextDeteil\n }\n ... on MsgImage {\n ...MsgImageDetail\n }\n ... on MsgButton {\n ...MsgButtonDetail\n }\n ... on MsgIcon {\n ...MsgIconDetail\n }\n ... on MsgSeparator {\n ...MsgSeparatorDetail\n }\n ... on MsgBox {\n ...MsgBoxDetail\n contents {\n ... on MsgText {\n ...MsgTextDeteil\n }\n ... on MsgImage {\n ...MsgImageDetail\n }\n ... on MsgButton {\n ...MsgButtonDetail\n }\n ... on MsgIcon {\n ...MsgIconDetail\n }\n ... on MsgSeparator {\n ...MsgSeparatorDetail\n }\n ... on MsgBox {\n ...MsgBoxDetail\n contents {\n ... on MsgText {\n ...MsgTextDeteil\n }\n ... on MsgImage {\n ...MsgImageDetail\n }\n ... on MsgButton {\n ...MsgButtonDetail\n }\n ... on MsgIcon {\n ...MsgIconDetail\n }\n ... on MsgSeparator {\n ...MsgSeparatorDetail\n }\n ... on MsgBox {\n ...MsgBoxDetail\n contents {\n ... on MsgText {\n ...MsgTextDeteil\n }\n ... on MsgImage {\n ...MsgImageDetail\n }\n ... on MsgButton {\n ...MsgButtonDetail\n }\n ... on MsgIcon {\n ...MsgIconDetail\n }\n ... on MsgSeparator {\n ...MsgSeparatorDetail\n }\n }\n }\n }\n }\n }\n }\n }\n }\n`;\n\n/**\n * 其他\n */\nexport const SPINACH_FIELD = gql`\n fragment spinachPlatform on SpinachPlatform {\n id\n key\n host\n secretKey\n remark\n createdAt\n }\n`;\n","/**\n * format unix timestamp\n */\nimport moment from 'dayjs';\nvar utc = require('dayjs/plugin/utc');\nmoment.extend(utc);\n\n//日期格式\nexport const dateFormat = { YMD: 'YYYY-MM-DD' };\nexport const timeFormat = { hm: 'HH:mm', hms: 'HH:mm:ss' };\n\n// unix 轉 format\nexport const formatDate = s => moment.unix(s).format(dateFormat.YMD);\nexport const formatTime = s => moment.unix(s).format(timeFormat.hm);\nexport const formatDateTime = s =>\n moment.unix(s).format(`${dateFormat.YMD} ${timeFormat.hms}`);\n\nexport const getNow = () => moment().unix();\nexport const getToday = () => moment.unix().startOf('days').subtract(1, 'day');\nexport const formatMatchesTime = s => moment.unix(s).format('MM-DD HH:mm:ss');\n\nexport const formatDateStr = (dataStr, format = 'YYYY-MM-DD') => {\n return moment(dataStr).format(format);\n};\n\n// time to unix\nexport const toUnix = dateTime => moment(dateTime).unix();\n\n// unix to moment\nexport const toMoment = unix => moment.unix(unix);\n\n// format searchDate\nexport const formatSearchDate = (dateArr = []) => {\n if (dateArr.length) {\n return [\n moment(dateArr[0]).startOf('day').unix(),\n moment(dateArr[1]).endOf('day').unix(),\n ];\n }\n};\n\n// format searchDateTime\nexport const formatSearchDateTime = (dateArr = []) => {\n if (dateArr.length) {\n return [moment(dateArr[0]).unix(), moment(dateArr[1]).unix()];\n }\n};\n\n// ----------- ----------- ----------- -----------\n\n//時間的按鈕 0當日、1最近一週、2最近一個月、3最近三個月\nexport const setDateRanges = (val, isAdd = false) => {\n const subtractRange = {\n 0: {\n start: moment().startOf('day'),\n end: moment().endOf('day'),\n },\n 1: {\n start: moment().subtract(6, 'day').startOf('day'),\n end: moment().endOf('day'),\n },\n 2: {\n start: moment().subtract(1, 'month').startOf('day'),\n end: moment().endOf('day'),\n },\n 3: {\n start: moment().subtract(3, 'month').startOf('day'),\n end: moment().endOf('day'),\n },\n 4: {\n start: moment().subtract(2, 'day').startOf('day'),\n end: moment().endOf('day'),\n },\n };\n const addRange = {\n 0: {\n start: moment().startOf('day'),\n end: moment().endOf('day'),\n },\n 1: {\n start: moment().startOf('day'),\n end: moment().add(6, 'day').endOf('day'),\n },\n 2: {\n start: moment().startOf('day'),\n end: moment().add(1, 'month').endOf('day'),\n },\n 3: {\n start: moment().startOf('day'),\n end: moment().add(3, 'month').endOf('day'),\n },\n };\n if (isAdd) return addRange[val] || addRange[0];\n return subtractRange[val] || subtractRange[0];\n};\n\nexport const datePickerRanges = (isAdd = false) => {\n return {\n 今天: [setDateRanges(0, isAdd).start, setDateRanges(0, isAdd).end],\n 最近一週: [setDateRanges(1, isAdd).start, setDateRanges(1, isAdd).end],\n 最近一個月: [setDateRanges(2, isAdd).start, setDateRanges(2, isAdd).end],\n 最近三個月: [setDateRanges(3, isAdd).start, setDateRanges(3, isAdd).end],\n };\n};\n\n// 秒數換 hh:mm:ss\n// export const secondsToHms = s => s;\nexport const secondsToHms = s => moment.utc(s * 1000).format('HH:mm:ss');\n\n// 比較\nexport const compareRangeDateStrSize = (d1Str, d2Str) => {\n const date1 = moment(d1Str);\n const date2 = moment(d2Str);\n\n if (date1.isBefore(date2)) {\n console.log('date1 在 date2 之前');\n return true;\n } else if (date1.isSame(date2)) {\n console.log('date1 和 date2 相同');\n return true;\n } else {\n console.log('date1 在 date2 之後');\n return false;\n }\n};\n\nexport const labelRenderer = (type, data) => {\n switch (type) {\n case 'year':\n return data + '年';\n case 'month':\n return data + '月';\n case 'day':\n return data + '日';\n case 'hour':\n return data + '时';\n case 'minute':\n return data + '分';\n case 'second':\n return data + '秒';\n default:\n return data;\n }\n};\n","import { Base64 as base64 } from 'js-base64';\n\n//加密規則\nconst encode = value => {\n try {\n return base64.encode(encodeURIComponent(JSON.stringify(value)));\n } catch (error) {\n console.log('encode error', error, value);\n return '';\n }\n};\n\n//解密規則\n\nexport const decode = value => {\n try {\n return value ? decodeURIComponent(base64.decode(value)) : '';\n } catch (error) {\n console.log('decode error', error, value);\n return '';\n }\n};\n\nexport const decodeToJson = value => {\n try {\n if (typeof value === 'undefined') return '';\n return value ? JSON.parse(decodeURIComponent(base64.decode(value))) : '';\n } catch (error) {\n console.log('decodeToJson error', error, value);\n return '';\n }\n};\n\nconst storageList = {\n loginInfo: 'loginInfo', // {Object}\n meInfo: 'meInfo', // {Object}\n authRoutesInfo: 'authRoutesInfo', // [array]\n errorInfo: 'errorInfo', // {Object}\n clientUserInfo: 'clientUserInfo',\n businessSystemMsgLog: 'businessSystemMsgLog',\n authRoutesKey: 'authRoutesKey',\n};\n\nexport const isStorageAccessAllow = () => {\n try {\n if ('localStorage' in window && window['localStorage'] !== null) {\n return true;\n } else {\n console.log('getStorage error');\n return false;\n }\n } catch (e) {\n console.log('getStorage error', e);\n return false;\n }\n};\n\n/**\n * 設置 Storage\n */\nexport const setStorage = (key = '', value = '') => {\n if (isStorageAccessAllow()) {\n if (key && storageList[key]) {\n localStorage && localStorage.setItem(storageList[key], encode(value));\n } else {\n console.error('儲存 localstorage 的格式錯誤,請確認有設定相關的數值');\n }\n }\n};\n\n/**\n * 取得 Storage\n */\nexport const getStorage = key => {\n if (isStorageAccessAllow()) {\n let value = localStorage ? localStorage.getItem(storageList[key]) : '';\n return value ? decodeToJson(value) : '';\n }\n return '';\n};\n\nexport const asyncLocalStorage = {\n setItem: async (key, value) => {\n await null;\n if (isStorageAccessAllow()) return localStorage.setItem(key, encode(value));\n return '';\n },\n getItem: async key => {\n await null;\n if (isStorageAccessAllow()) {\n const value = decodeToJson(localStorage.getItem(key));\n return value;\n }\n return '';\n },\n removeItem: async key => {\n await null;\n if (isStorageAccessAllow()) localStorage.removeItem(key);\n },\n};\n\n/**\n * 取得 token\n */\nexport const getToken = (showBearer = false, key = 'loginInfo') => {\n const token = getStorage(key)?.token || '';\n return token && showBearer ? `Bearer ${token}` : token;\n};\n\n/**\n * 取得 device id\n */\nexport const getDeviceId = (key = 'loginInfo') => {\n return getStorage(key)?.deviceUID || '';\n};\n\n/**\n * 刪除 Storage\n */\nexport const removeStorage = key => {\n if (key && storageList[key]) {\n localStorage.removeItem(key);\n } else {\n console.error('欲刪除的 localstorage 格式有誤,請確認key值');\n }\n};\n\n/**\n * 刪除全部 Storage\n */\nexport const removeAllStorage = () => {\n let list = Object.keys(storageList);\n list.forEach(i => {\n localStorage.removeItem(i);\n });\n};\n","import {\n AndroidFilled,\n AppleFilled,\n WindowsOutlined,\n NumberOutlined,\n MobileFilled,\n} from '@ant-design/icons';\n\nimport alipayUrl from '@/assets/alipay.svg';\nimport wxUrl from '@/assets/wxUrl.svg';\nimport bankUrl from '@/assets/bank.png';\nimport ecnyUrl from '@/assets/ecnyUrl.svg';\n\nconst { theme } = require('@/plugin/theme');\n\nexport const EnableKey = { Unknown: 'Unknown', No: 'No', Yes: 'Yes' };\n\nexport const EnableDisplay = {\n Unknown: { text: '不明', searchText: '全部狀態', color: '' },\n No: { text: '停用', searchText: '停用状态', color: theme['gray-2'] },\n Yes: { text: '啟用', searchText: '启用状态', color: theme['primary'] },\n};\n\n// ------- User ---------------------------------------------\n/**\n * 帐号類型\n */\nexport const AccountTypeKeys = {\n Unknown: 'Unknown',\n Manager: 'Manager', // 管理員\n CustomerService: 'CustomerService', // 客服\n CommonUser: 'CommonUser', // 一般會員\n Tourist: 'Tourist', // 遊客\n System: 'System', // 系統\n Monitor: 'Monitor', // 監察人\n};\n\nexport const AccountTypeDisplay = {\n Unknown: { text: '不明', searchText: '全部类型', color: theme['gray-0'] },\n Manager: { text: '管理員', searchText: '管理員', color: 'blue' },\n CommonUser: { text: '會員', searchText: '會員', color: 'green' },\n CustomerService: { text: '客服', searchText: '客服', color: 'purple' },\n Tourist: { text: '遊客', searchText: '遊客', color: 'orange' },\n System: { text: '系統', searchText: '系統', color: theme['danger'] },\n Monitor: { text: '监察员', searchText: '监察员', color: theme['danger'] },\n};\n\n/**\n * User status key\n */\nexport const UserStatusKey = {\n Unknown: 'Unknown',\n Active: 'Active',\n Lock: 'Lock',\n Delete: 'Delete',\n};\n\nexport const UserStatusDisplay = {\n Unknown: { text: '不明', searchText: '全部狀態', color: '' },\n Active: { text: '啟用', searchText: '启用状态', color: theme.success },\n Lock: { text: '停用', searchText: '停用狀態', color: theme.warning },\n Delete: { text: '刪除', searchText: '刪除狀態', color: theme['gray-2'] },\n};\n\n// ------- Room ---------------------------------------------\n\nexport const RoomTypeKey = {\n Unknown: 'Unknown',\n Direct: 'Direct', // 私聊\n Group: 'Group', // 群組\n Consulting: 'Consulting', // 諮詢\n Invite: 'Invite', // 邀請\n};\n\n// 房間型態\nexport const RoomTypeDisplay = {\n Unknown: { text: '不明', searchText: '全部型態', color: '' },\n Direct: { text: '私聊', searchText: '私聊型態', color: 'purple' },\n Group: { text: '群組', searchText: '群組型態', color: 'blue' },\n Consulting: { text: '諮詢', searchText: '諮詢型態', color: 'warning' },\n};\n\n// 加入的層級\nexport const InviteLevel = {\n Unknown: { key: 'Unknown', label: '不明' },\n Member: { key: 'Member', label: '群员' },\n Admin: { key: 'Admin', label: '管理员' },\n Owner: { key: 'Owner', label: '拥有者' },\n};\n\n// 陌生人的等級\nexport const StrangerLevel = {\n Unknown: { key: 'Unknown', label: '不明' },\n All: { key: 'All', label: '所有人' },\n Password: { key: 'Password', label: '需要密码' },\n Close: { key: 'Close', label: '关闭' },\n};\n\n// Room Status\nexport const RoomStatusKeys = {\n Unknown: 'Unknown',\n Active: 'Active', // 開啟\n Deactivated: 'Deactivated', // 封存\n Processing: 'Processing', // 處理中\n};\n\nexport const RoomStatusDisplay = {\n Unknown: { text: '不明' },\n Active: { text: '開啟' },\n Deactivated: { text: '封存' },\n Processing: { text: '處理中' },\n};\n\nexport const CSRoomTypeKey = {\n Consulting: 'Consulting',\n Deposit: 'Deposit', // 充值\n};\n\n// ------- message ---------------------------------------------\n// post message\nexport const MsgContentTypeKeys = {\n Unknown: 'Unknown',\n Text: 'Text', // 文字\n File: 'File', // 檔案\n Voice: 'Voice', // 錄音\n Join: 'Join', // 加入\n Leave: 'Leave', // 離開\n Invite: 'Invite', // 邀請\n LastRead: 'LastRead', // 已讀\n System: 'System', // 系統訊息\n Bubble: 'Bubble', // 客制組合訊息\n};\n\n// post message\nexport const ReceiveMsgContentType = {\n Unknown: 'Unknown',\n Hi: 'Hi', // 確認連線\n Text: 'Text', // 文字\n File: 'File', // 檔案\n Voice: 'Voice', // 錄音\n Invite: 'Invite', // 邀請\n Join: 'Join', // 加入\n Leave: 'Leave', // 離開\n LastRead: 'LastRead', // 最後讀取訊息\n Consulting: 'Consulting', // 有新的諮詢聊天室\n Geo: 'Geo', // 位置資訊\n Typing: 'Typing', // 正在輸入\n RoomUpdate: 'RoomUpdate', // 房間 detail 更新\n UserOnlineInfo: 'UserOnlineInfo', // 使用者上下線\n BusinessSystemNotification: 'BusinessSystemNotification', // 業務系統通知\n System: 'System', // 系統訊息\n Bubble: 'Bubble', // 客制組合訊息\n};\n\nexport const MsgStatusKeys = {\n Unknown: 'Unknown',\n Initial: 'Initial', // 初始狀態\n Retract: 'Retract', // 收回\n Edit: 'Edit', // 修改\n};\n\nexport const MsgSystemType = {\n PayList: 'PayList',\n UserOrder: 'UserOrder',\n Text: 'Text',\n};\n\nexport const MsgFromTags = {\n AutoReplay: 'AutoReplay',\n};\n\n// 前端自定義訊息\nexport const CusMsgContentType = 'CusMsgContentType';\n\n// ------- order ---------------------------------------------\n\n// 支付方式\nexport const PayType = {\n wx: { key: 'wx', label: '微信' },\n alipay: { key: 'alipay', label: '支付宝', describe: '' },\n bank: { key: 'bank', label: '银行卡' },\n ecny: { key: 'ecny', label: '数字人民币' },\n sub_alipay: { key: 'sub_alipay', label: '支付宝' },\n // union: { key: 'union', label: '云闪付' },\n // qq: { key: 'qq', label: 'QQ支付' },\n // jd: { key: 'jd', label: '京东支付' },\n // crypto: { key: 'crypto', label: '加密货币' },\n // xlpay: { key: 'xlpay', label: '闲聊支付' },\n};\n\nexport const PayTypeImg = {\n [PayType['wx'].key]: wxUrl, // 微信\n [PayType['alipay'].key]: alipayUrl, // 支付寶\n [PayType['bank'].key]: bankUrl, // 銀行卡\n [PayType['ecny'].key]: ecnyUrl, // 數字人民幣\n};\n\n// 支付方法\nexport const PayMethod = {\n redirect: 'redirect',\n qrcode: 'qrcode',\n bank: 'bank',\n sub_alipay: 'sub_alipay',\n};\n\nexport const OrderStatusKeys = {\n Unknown: { key: 'Unknown', label: '全部', color: '' },\n // New: { key: 'New', label: '等待支付', color: 'orange' },\n Pending: { key: 'Pending', label: '等待支付', color: '#ed9c23' },\n Waiting: { key: 'Waiting', label: '等待到账', color: '#e43737' },\n Canceled: { key: 'Canceled', label: '已取消', color: '#7f7f7f' },\n Succeeded: { key: 'Succeeded', label: '成功', color: '#37cb69' },\n Failed: { key: 'Failed', label: '拒绝', color: '#7f7f7f' },\n Denied: { key: 'Denied', label: '审核拒绝', color: '#7f7f7f' },\n Expired: { key: 'Expired', label: '超时', color: '#7837cb' },\n};\n\nexport const ConsultingOrderTypeKeys = {\n Consulting: 'Consulting',\n Urging: 'Urging',\n};\n\n// ------- PushNotifications ---------------------------------------------\n\nexport const PushStatusKeys = {\n PENDING: { text: '待發送', variant: 'outline-warning' },\n SUCCESS: { text: '已發送', variant: 'outline-success' },\n FAIL: { text: '失敗', variant: 'outline-danger' },\n CANCELED: { text: '已撤回', variant: 'outline-secondary' },\n};\n\nexport const PushTargetKey = {\n ALL: { text: '所有用戶' },\n SINGLE_USER: { text: '單個用戶' },\n};\n\nexport const IsScheduledKeys = {\n Yes: { text: '定時推送', color: theme.primary },\n No: { text: '立即推送', color: theme.success },\n};\n\n// ------- PushNotifications ---------------------------------------------\n\nexport const MoreInformationTypeKey = {\n Unknown: 'Unknown',\n HTML: 'HTML',\n URL: 'URL',\n};\n\n// ------- deviceOS ---------------------------------------------\n\nexport const deviceOSKeys = {\n Unknown: {\n text: '不明',\n icon: style => ,\n },\n IOS: {\n text: 'IOS',\n icon: style => ,\n },\n Mac: {\n text: 'Mac',\n icon: style => ,\n },\n Android: {\n text: 'Android',\n icon: style => ,\n },\n Windows: {\n text: 'Windows',\n icon: style => ,\n },\n Other: {\n text: '其他',\n icon: style => ,\n },\n};\n\n// ------- CSForm ---------------------------------------------\n\nexport const CSFormFieldType = {\n Input: 'Input',\n Radio: 'Radio',\n Checkbox: 'Checkbox',\n};\n\nexport const CSFormFieldVerifyType = {\n Text: 'Text', // 不驗證\n Email: 'Email',\n Age: 'Age',\n QQ: 'QQ',\n WeChat: 'WeChat',\n};\n\n// ------- Merchant ---------------------------------------------\n\nexport const MerchantTypeKeys = {\n Unknown: 'Unknown',\n Bochat: 'Bochat',\n Spinach: 'Spinach',\n};\n\n// ------- PlatFormSettingKey ---------------------------------------------\n\nexport const PlatFormSettingKey = {\n BEEP: 'bochat.platform.consulting.beep',\n AUTO_DISTRIBUTE: 'bochat.platform.consulting.auto_distribute',\n AUTO_DEACTIVATE_MIN: 'bochat.platform.consulting.deactivate',\n AUTO_DEACTIVATE_ENABLED: 'bochat.platform.consulting.deactivate.enabled',\n AUTO_CREATED_CS: 'bochat.platform.consulting.client.enter_directly',\n QUEUE_MAX_COUNT: 'bochat.platform.consulting.max_processing_count',\n DIALOGUE_TIMEOUT_SEC: 'bochat.platform.consulting.time_out.sec',\n DIALOGUE_TIMEOUT_SEC_ENABLED: 'bochat.platform.consulting.time_out.enabled',\n NO_RESPONSE_TIP: 'bochat.platform.consulting.no_response.tip',\n NO_RESPONSE_SEC: 'bochat.platform.consulting.no_response.sec',\n NO_RESPONSE_ENABLED: 'bochat.platform.consulting.no_response.enabled',\n DEACTIVATE_TIP_MANUAL: 'bochat.platform.consulting.deactivate.tip.manual',\n DEACTIVATE_TIP_AUTO: 'bochat.platform.consulting.deactivate.tip.auto',\n DEACTIVATE_TIP_ENABLED: 'bochat.platform.consulting.deactivate.tip.enabled',\n REDIRECT_VERIFY_ENABLED:\n 'bochat.platform.consulting.client.redirect_verify.enabled',\n};\n\n// ------- Other ---------------------------------------------\n\n/**\n * pagination\n */\nexport const Pagination = {\n page: 1,\n perPage: 10,\n total: 0,\n};\n\n/**\n * 瀏覽器\n */\nexport const BrowserType = {\n IE: 'MSIE',\n Edge: 'Edg',\n Firefox: 'Firefox',\n Sogou: 'MetaSr',\n Opera: 'OPR',\n Chrome: 'Chrome',\n Safari: 'Safari',\n Netscape: 'Netscape',\n UC: 'UCBrowser',\n};\n\nexport const Currency = {\n RMB: '¥',\n};\n\n/**\n * 追蹤碼類型\n */\nexport const AdTrackingType = {\n CNZZ: 'CNZZ',\n Google: 'Google',\n Baidu: 'Baidu',\n};\n","// |狀態碼|系統定義|說明|\n// |-|-|-|\n// |400|400000|輸入可能有誤, 或請求資源失敗|\n// |400|400001|輸入有誤, 或所需要的欄位為空|\n// |400|400002|資源已被綁定|\n\n// |401|401001|需要有身份驗證|\n// |401|401002|token 不存在, 重新登錄|\n// |401|401003|帐号或密碼錯誤|\n// |401|401004|系統更新, token 失效, 請重新登錄|\n// |401|401004|帐号已被停用|\n// |401|401005|IP非法|\n\n// |403|403000|權限不足|\n// |403|403001|不允許操作|\n\n// |404|404001|資源不存在|\n// |405|405001|該請求方法不存在|\n// |408|408001|請求超時|\n// |409|409000|資源衝突|\n// |409|409001|該資源已存在|\n// |500|500000|伺服器錯誤|\n// |500|500001|伺服器內部錯誤|\n\nexport const errorCodes = {\n 400000: '输入可能有误, 或请求资源失败',\n 400001: '栏位参数错误', // \"GRAPHQL_VALIDATION_FAILED\"\n 400002: '资源已被绑定',\n 400003: '使用者已注册',\n 400106: '会员不在线上,无法联系',\n\n 401001: '需要身份验证',\n 401002: '身份不存在',\n 401003: '帐号或密碼錯誤',\n 401004: '权限过期,请重新登录',\n 401005: 'IP非法',\n\n 403000: '权限不足',\n 403001: '不允许操作',\n 403002: '帐号已被停用',\n\n 404001: '资源不存在',\n 405001: '请求方法不存在',\n 408001: '请求超时',\n\n 409000: '资源冲突',\n 409001: '该资源已存在',\n 500000: '伺服器错误',\n 500001: '500 伺服器内部错误',\n};\n\n/**\n * 取得錯誤代碼的i18n key\n * @param {} code error code\n */\nexport const getErrorMessage = code => {\n return errorCodes[code] || code;\n};\n\nexport const isLogoutErrorCode = code => {\n return ['401001', '401002', '401004'].indexOf(code) > -1;\n};\n\nexport const isSendSentryErrorCode = code => {\n return ['500000', '500001'].indexOf(code) > -1;\n};\n","/**\n * filter-加上千分位符號\n * @param {Any}\n * @return {String} 加上千分號的字串數字 || '-'\n * */\nexport const commaFormat = value => {\n let info = '0';\n value &&\n (info = value\n .toString()\n .replace(\n /^(-?\\d+?)((?:\\d{3})+)(?=\\.\\d+$|$)/,\n (all, pre, groupOf3Digital) => {\n return pre + groupOf3Digital.replace(/\\d{3}/g, ',$&');\n },\n ));\n return info;\n};\n\n/**\n * __typename in query\n * https://github.com/apollographql/apollo-client/issues/1913#issuecomment-393721604\n */\nexport const omitTypename = (key, value) =>\n key === '__typename' ? undefined : value;\nexport const omitTypenameHandle = payload =>\n JSON.parse(JSON.stringify(payload), omitTypename);\n\n/**\n * 深層複製資料\n * 如果不是 null、undefined、空字串、數字0就使用 JSON方法過濾, 否則直接返回 info 預設值(空字串)\n */\nexport const cloneDeep = object => {\n let info = '';\n if (!!object) info = JSON.parse(JSON.stringify(object));\n return info;\n};\nexport const isFunction = v => typeof v === 'function';\n\n/**\n * 回傳一級域名\n * @param {string} url\n * @return {string} 一級域名\n */\nexport const filterSubDomain = url => {\n if (url.match(/\\.\\w*\\b/g).length > 1) {\n let arr = url.split('.');\n return arr.slice(arr.length - 2).join('.');\n }\n return url;\n};\n\n/**\n * 字串 濾掉 html tag\n */\nexport const stripHtmlTag = str => str.replace(/(<([^>]+)>)/gi, '').trim();\n\n/**\n * lazyRetry avoid chunk load error\n * to update the code to the latest version\n * will handle refreshing the browser in the event of an error\n */\nexport const lazyRetry = (componentImport, componentName) => {\n return new Promise((resolve, reject) => {\n // check if the window has already been refreshed\n const hasRefreshed = JSON.parse(\n window.sessionStorage.getItem(`retry-${componentName}-refreshed`) ||\n 'false',\n );\n componentImport()\n .then(component => {\n window.sessionStorage.setItem(\n `retry-${componentName}-refreshed`,\n 'false',\n ); // success so reset the refresh\n resolve(component);\n })\n .catch(error => {\n if (!hasRefreshed) {\n // not been refreshed yet\n window.sessionStorage.setItem(\n `retry-${componentName}-refreshed`,\n 'true',\n ); // we are now going to refresh\n return window.location.reload(); // refresh the page\n }\n reject(error);\n });\n });\n};\n","import { decode } from './storage';\n\nconst handleDecode = name => (URL_PARAMS[name] ? decode(URL_PARAMS[name]) : '');\nconst URL_SEARCH = window.location.search;\nconst URL_SEARCH_PARAMS = new URLSearchParams(URL_SEARCH);\nconst URL_PARAMS = Object.fromEntries(URL_SEARCH_PARAMS.entries());\nconst autoContact = URL_PARAMS.contact || '';\nconst roomType = URL_PARAMS.roomType\n ? URL_PARAMS.roomType.replace(/^./, URL_PARAMS.roomType[0].toUpperCase())\n : '';\nconst username = handleDecode('userName') || handleDecode('username');\nconst realName = handleDecode('realName'); // 真實姓名\nconst reqUrl = handleDecode('reqUrl');\nconst backUrl = handleDecode('backUrl'); // 返回鍵要返回的路由\nconst depositToken = URL_PARAMS.depositToken || '';\nconst depositAmount = URL_PARAMS.depositAmount || 0; // 充值金額\nconst payType = URL_PARAMS.payType || ''; // 支付類型\nconst jobID = URL_PARAMS.jobID || ''; // 返利類型 非必填\nconst sourceDomain = reqUrl ? reqUrl.substring(reqUrl.indexOf('://') + 3) : ''; // 來源域名\n\nexport const csRoomUrlParams = {\n ...URL_PARAMS,\n roomType,\n username,\n realName,\n reqUrl,\n backUrl,\n depositToken,\n depositAmount,\n payType,\n jobID,\n sourceDomain,\n autoContact,\n};\n","export default __webpack_public_path__ + \"static/media/alipay.fab23a78.svg\";","export default __webpack_public_path__ + \"static/media/wxUrl.272082da.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABoCAYAAAAdHLWhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1YWFkOWIyNS00YTBjLWUzNGEtYTVmOS03MzNhZTYzYmY2MDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkYwRDVDNDEzQzc1MTFFQzk2NDhBRTAyQUY2N0JEOEUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkYwRDVDNDAzQzc1MTFFQzk2NDhBRTAyQUY2N0JEOEUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Nzk0ZDIyNzAtYTMwOC1hOTQ1LWI5MmYtZmNjYTg0N2M2N2ZkIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6M2RmOGIzOTUtMGRmYy0xMWVjLWE4Y2Ut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\"","export default __webpack_public_path__ + \"static/media/ecnyUrl.a2467f2f.svg\";","import { gql } from '@apollo/client';\nimport { MSG_SYSTEM, MSG_BUBBLE } from './Fragment';\n\nexport const MSG_REQUIRED = gql`\n fragment messageFields on Message {\n id\n roomID\n contentType\n timestamp\n status\n from {\n userID\n accountType\n username\n aliasName\n tags\n }\n }\n`;\n\nexport const LIST_MSG = gql`\n ${MSG_REQUIRED}\n ${MSG_SYSTEM}\n ${MSG_BUBBLE}\n query listMessage(\n $filter: MessageFilterInput!\n $pagination: PaginationInput\n ) {\n listMessage(filter: $filter, pagination: $pagination) {\n messages {\n ...messageFields\n text {\n text\n isEncrypt\n }\n file {\n text\n fileURL\n type\n }\n join {\n userID\n }\n leave {\n userID\n }\n system {\n ...MsgSystemField\n }\n bubble {\n ...MsgBubbleField\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 傳送訊息 (私聊的第一個步驟 帶 userID 之後帶 roomID 即可)\nexport const POST_MSG = gql`\n ${MSG_REQUIRED}\n ${MSG_SYSTEM}\n ${MSG_BUBBLE}\n mutation postMessage($in: MessageInput!) {\n postMessage(in: $in) {\n ...messageFields\n text {\n text\n isEncrypt\n }\n file {\n text\n fileURL\n type\n }\n join {\n userID\n }\n leave {\n userID\n }\n system {\n ...MsgSystemField\n }\n renew\n bubble {\n ...MsgBubbleField\n }\n }\n }\n`;\n\nexport const POST_TEMP_MSG = gql`\n ${MSG_REQUIRED}\n ${MSG_SYSTEM}\n ${MSG_BUBBLE}\n mutation postTemplateMessage($in: MsgTemplateInput!) {\n postTemplateMessage(in: $in) {\n ...messageFields\n text {\n text\n isEncrypt\n }\n file {\n text\n fileURL\n type\n }\n join {\n userID\n }\n leave {\n userID\n }\n system {\n ...MsgSystemField\n }\n renew\n bubble {\n ...MsgBubbleField\n }\n }\n }\n`;\n\nexport const RECEIVE_MSG = gql`\n ${MSG_REQUIRED}\n ${MSG_SYSTEM}\n ${MSG_BUBBLE}\n subscription receiveMessage($userAuth: UserAuth!) {\n receiveMessage(userAuth: $userAuth) {\n ...messageFields\n consulting {\n roomID\n status\n }\n text {\n text\n isEncrypt\n }\n file {\n text\n fileURL\n type\n }\n voice {\n duration\n size\n mimeType\n URL\n }\n join {\n userID\n }\n invite {\n id\n inviteeUserID\n inviterUserID\n roomID\n inviteeUserIDs\n }\n leave {\n userID\n }\n lastReads {\n userID\n messageID\n roomID\n }\n roomUpdate {\n roomID\n roomUID\n roomType\n consultingDetail {\n roomID\n merchantID\n deactivatedAt\n deactivatedUserID\n ipAddress\n isProactive\n country\n administrativeArea\n sourceDomain\n accessDomain\n question\n deviceOS\n ownerUserID\n status\n createdAt\n isWaitFirstResponse\n isTimeoutResponse\n }\n }\n typing {\n userID\n roomID\n username\n content\n }\n userOnlineInfo {\n userID\n isOnline\n }\n businessSystemNotification {\n createdAt\n message\n }\n system {\n ...MsgSystemField\n }\n bubble {\n ...MsgBubbleField\n }\n }\n }\n`;\n\n// 打字\nexport const POST_TYPING = gql`\n ${MSG_REQUIRED}\n mutation postTyping($in: MsgTypingInput!) {\n postTyping(in: $in) {\n ...messageFields\n }\n }\n`;\n\n// 更新訊息 (撤回訊息, 取消撤回訊息)\nexport const UPDATE_MSG = gql`\n ${MSG_REQUIRED}\n mutation updateMessage($messageID: String!, $in: MessageUpdateInput!) {\n updateMessage(messageID: $messageID, in: $in) {\n ...messageFields\n }\n }\n`;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABdBAMAAAA1X3fwAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAtUExURUdwTN6jMd+fMN+jMd6jMt+iMt6jMt6jMd2jMdufMN6jMt2jMd+gMN6jMt6jMq5JYioAAAAOdFJOUwDfIML+n4XvYBBwSjCv1x8zEAAAAwBJREFUWMOlmM9rE0EUx9cEbbaJsIoUBQ3pioqX0lJQvASrEaVIKEhUBEsqgvSSQ/FisaHivXjzJkVPgg3RQw8ioQfBm/gXCCHbprTm/Q3OzG5+zLw3uzP6TsPuZ3fffN+8N2/WcZClvj4+AdCevf/NMbDUVh36tvYpEd/Ow6hNFGJp90MAsnXW4/BngKz9xAqHYK6q4z8DaXMal86DxnbJSY/XdTycppyvgd6WLbwRIiGPcvk4Hk6q/I9YHLo7Mp6BBLsj8z+T+ED6QK6exMPLUX4yEZckcvPJPFwb8scMcNgb8hsmPGwOUjBvxK/0+aNGONy0cweCZsSbuQNwxkKdEYUmTfnbbwQvJUp3ltmMCCgfXZUeqGL3u/wdWT465PcuSRN+QSxlHhWXLz8PSzfPL6Vlfrrv4gKWTkRgSuaFG61I7SwRgRoRxTE2XeLbQZWIViEMyR7xbT6nHBDvSAHc4PyicpNdHFejIkQrinmn1DRlAh1X+QPON4J1qmr0xNSUROX8u4BP4wgqQ0QlEaKle5Gsyr0CviY8z+yHs8DvwmX5D18RXqiSym8iySLld+g8XcDfDJcoWpyh/SJ4qOrz2qOS19PntecQeXcY4lni1nVHX2jSRvyB7/tR2fP9RjK/P1rnN/6fz1vxniU/7fxWxalUKg9FmWSDIuYXqQbDoRZ/uH5UyYJSqXRLx7PkbhH6X47kR/qz9T9lM1+2a4/Z8F1cH2L5Hq4/sfw8TtIO2yWuiF2TDdRg3iWyIujryQZUJtUs4lWlipKeF0Uvbc53RN9pzoumzK0b8x7ef8MSzZZy5YGuML013d+jlsy2fzDq3kbrXsuw/+mfA9Jm/O6gf6sb8cOeu2Hljn3/6RbNu7d/6Z9N+vMVqf//btf/O5my3fnC9vyS1HOfReevWIk6+EToPrU73zkZvUer5Pn0QtncG2GvNJFt6g7MS6SUy/p/CUtlG5zZa/WBzsf4/w8XT0lPTDSTfljktp4Pnlh7b/JHJLd9jx0w2ucefSFu/gVSC9vZz8PzHgAAAABJRU5ErkJggg==\"","import React from 'react';\nimport { Box } from '@WRAP_COMP';\n\nfunction FrontDrop({ children, opacity = 80, ...props }) {\n return (\n \n {children}\n \n );\n}\n\nexport default FrontDrop;\n","export default __webpack_public_path__ + \"static/media/alipay-process.4df41401.jpg\";","export default __webpack_public_path__ + \"static/media/wx-process.fcaa5e55.jpg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLBAMAAADKYGfZAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAtUExURUdwTP///////////////////////////////////////////////////////81e3QIAAAAOdFJOUwB+38Sf70AlEGFfUK+QNVP8xAAAAj1JREFUSMedlktLI0EQx9uN5mE8JHoPI4sriEgum2MQHS+CoiA+WBgEYbxJ8API7ML6CYT1oOLRYzx5k4hHQTx6Eh2d9YHUZ7A7Mwnd1Y9prUuY4pea6qr/dBUhguUOp0cg+n5xRgyW3/MgsfETLZX9CZxdaajfEyDYmJIqeADpXLYOko3K2d+Bwm4wtq2iIGyIVL+nxOCXiFVAYyWe6tFR8GAVTAinDyaEOzdgcNyVhWfCVjrYNxMFYZBgd0as04qcmYL/Nu8EeIyxoxQsKd1EGrbaliMXvlwuDyW/g6jCXGoRPXs2SZpzh7gFrOK01g7KeJ0+X3PP1VgGkyhj6s7jEm0BNOJ382co8M/vFMu0C9XLu18JGRDOHjBVUS/Z4b1PuAcllsUzxeZ5b4T+1q5kvSrVvIEk+cZKcYwyZoWqSG3+G0hyuBHKFleyGFeFt0mCro5qrJp57EX6eFEq1SGe6nvrRdgCQY4oUAn6XsSWfb+N7fobJszpfuEZhHk22IJ4Uh3miHVbct1ZdvW47hSqGyokEw0KRa0l3gxJtILrziB9Hdnk1hT1psMapM8CC1H7fvj+Juu8L3bhXdKp8qRU03kvHWPqqqdjLVnPKqwpa0uBhYrZge62zlcpnUE2J21g8XMmk0KFyZRPwZ4/NWXIH5t3Wk9A85xpfnY6W856283Bcg8hRc1h1760I2lacSttZjnF9K2ptkGJW1RvjYgbDtQ7aJGfEVFNv/cedAMu7ZsW5NzpJdui5/4h/wcFIxPy5JFIYAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYBAMAAAA46dFkAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAYUExURaqqqkdwTKqqqqqqqqqqqqqqqqioqKqqqlTelc4AAAAHdFJOU58AAV8w/o8xuW3bAAAAVUlEQVQI12MQZhQEAQbzAgjNXg4WYBAoBwswCEIEGAQhAgyCEAEgDRYA0mABEA0SANFCQAEQLahQHoJMA8UTkdVB9cHMgZoLswdqL8wdMHfB3Al1NwCayBcBUYPdVwAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/proof-example.c19a54c7.jpg\";","import { useCallback } from 'react';\nimport { message as antdMessage } from 'antd';\nimport { getErrorMessage } from '@/utils';\nconst useAlertMessage = () => {\n /**\n * 提示 message\n */\n const onSuccessMsg = useCallback((content = null, config = {}) => {\n content = content ? content : '操作成功';\n antdMessage.success({ content, ...config });\n }, []);\n const onWarningMsg = useCallback((content = null, config = {}) => {\n content = content ? content : '警告';\n antdMessage.warning({ content, ...config });\n }, []);\n const onErrorMsg = useCallback((content = null, config = {}) => {\n let showContent = '';\n if (typeof content === 'string') {\n if (content === '401004') antdMessage.destroy();\n showContent = getErrorMessage(content);\n } else if (content?.message) {\n showContent = content.message;\n } else {\n showContent = content || '錯誤';\n }\n antdMessage.error({ content: showContent, ...config });\n }, []);\n\n /**\n * ws 狀態提示\n */\n const WS_ALERT_MSG_KEY = 'wsAlertMsg';\n const wsStatusNotify = useCallback(({ status } = {}) => {\n const success = () =>\n antdMessage.success({ content: '连线稳定', key: WS_ALERT_MSG_KEY });\n const loading = content =>\n antdMessage.loading({ content, duration: 0, key: WS_ALERT_MSG_KEY });\n\n const type = {\n onDisconnected: () => loading('网路不稳'),\n onReconnecting: () => loading('网路连线中'),\n onConnected: success,\n onReconnected: success,\n };\n type[status] && type[status]();\n }, []);\n\n return {\n onSuccessMsg,\n onWarningMsg,\n onErrorMsg,\n wsStatusNotify,\n };\n};\n\nexport default useAlertMessage;\n","var map = {\n\t\"./CSRoom.js\": 985,\n\t\"./Client.js\": 986,\n\t\"./Fragment.js\": 34,\n\t\"./adTracking.js\": 987,\n\t\"./canned.js\": 988,\n\t\"./csForm.js\": 989,\n\t\"./csRoomClientSetting.js\": 990,\n\t\"./customer.js\": 991,\n\t\"./faq.js\": 992,\n\t\"./greeting.js\": 993,\n\t\"./groupRoom.js\": 994,\n\t\"./hotsDenys.js\": 995,\n\t\"./index.js\": 276,\n\t\"./login.js\": 996,\n\t\"./menuList.js\": 238,\n\t\"./message.js\": 417,\n\t\"./monitor.js\": 997,\n\t\"./origin.js\": 998,\n\t\"./others.js\": 999,\n\t\"./platformSetting.js\": 1000,\n\t\"./pushNotification.js\": 1001,\n\t\"./read.js\": 1002,\n\t\"./report.js\": 1003,\n\t\"./role.js\": 1004,\n\t\"./room.js\": 1005,\n\t\"./setting.js\": 1006,\n\t\"./tags.js\": 1007,\n\t\"./user.js\": 1008\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 984;","import { gql } from '@apollo/client';\nimport {\n COMMENT_USER_ROOMS,\n CS_DETAIL_FIELD_LESS,\n CS_DETAIL_FIELD,\n} from './Fragment';\n\n/**\n * 諮詢室 相關\n * - 諮詢室列表\n * - 封存諮詢室列表\n * - 我的諮詢室列表\n * - 諮詢室\n * - 加入諮詢室\n * - 主動聯繫\n * - 諮詢室報表下載\n */\n\n// 諮詢室列表\nexport const LIST_CS_ROOM = gql`\n ${CS_DETAIL_FIELD_LESS}\n ${COMMENT_USER_ROOMS}\n query listConsultingRoom(\n $filter: ConsultingRoomFilterInput\n $pagination: PaginationInput\n ) {\n listConsultingRoom(filter: $filter, pagination: $pagination) {\n consultingRooms {\n ...consultingDetailLessField\n userRooms {\n ...userRoomsFields\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 我的諮詢室\nexport const LIST_MY_CS_ROOM = gql`\n ${CS_DETAIL_FIELD_LESS}\n ${COMMENT_USER_ROOMS}\n query listUserRoom($userID: Uint64!, $pagination: PaginationInput) {\n # 我的聊天室\n listUserRoom(\n filter: {\n userRoom: { userID: $userID, roomType: Consulting }\n roomStatusIn: [Processing]\n }\n pagination: $pagination\n ) {\n userRooms {\n id\n unRead\n lastReadMessageID\n isPinned\n room {\n type\n lastMessage {\n id\n roomID\n contentType\n timestamp\n status\n from {\n userID\n accountType\n username\n aliasName\n }\n text {\n text\n isEncrypt\n }\n }\n consultingDetail {\n ...consultingDetailLessField\n isWaitFirstResponse\n isTimeoutResponse\n }\n }\n userRooms {\n ...userRoomsFields\n }\n }\n meta {\n total\n totalUnRead\n }\n }\n }\n`;\n\n// 主動聯繫\nexport const CREATED_CS_CONTACT = gql`\n mutation createConsultingRoomWithContact(\n $in: ConsultingRoomWithContactCreateInput!\n ) {\n createConsultingRoomWithContact(in: $in) {\n id\n consultingDetail {\n roomID\n }\n }\n }\n`;\n\n// 待諮詢 批量封存\nexport const BATCH_DEACTIVATED_CS_ROOM = gql`\n mutation deactivateConsultingRooms($roomIDs: [Uint64!]!) {\n deactivateConsultingRooms(roomIDs: $roomIDs) {\n id\n uid\n type\n createdAt\n updatedAt\n }\n }\n`;\n\n// 封存諮詢室列表\nexport const LIST_DEACTIVATED_CS_ROOM = gql`\n ${CS_DETAIL_FIELD}\n ${COMMENT_USER_ROOMS}\n query listConsultingRoom(\n $filter: ConsultingRoomFilterInput\n $pagination: PaginationInput\n ) {\n listConsultingRoom(filter: $filter, pagination: $pagination) {\n consultingRooms {\n ...consultingDetailField\n userRooms {\n ...userRoomsFields\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n/**\n * 加入諮詢室\n */\n// 自己加入\nexport const JOIN_CS_ROOM = gql`\n mutation joinConsultingRoom($roomID: Uint64!) {\n joinConsultingRoom(roomID: $roomID) {\n roomID\n }\n }\n`;\n// 拉人進入聊天室 (可以選擇進房的身份)\nexport const PULL_IN_CS_ROOM = gql`\n mutation pullInConsultingRoom($in: PullInConsultingRoomInput!) {\n pullInConsultingRoom(in: $in) {\n roomID\n }\n }\n`;\n\n/**\n * 諮詢室報表下載\n */\nexport const DOWNLOAD_CS_ROOM_REPORT = gql`\n mutation downloadConsultingRoomReport($filter: ConsultingRoomFilterInput) {\n downloadConsultingRoomReport(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { MSG_REQUIRED } from './message';\nimport {\n CS_DETAIL_FIELD,\n CS_SETTING_FIELD,\n CS_FORM_FIELD,\n CS_GREETING_FIELD,\n MSG_SYSTEM,\n COMMENT_USER_ROOMS,\n} from './Fragment';\n\n/**\n * client H5 相關\n * - 諮詢房設定 + 詢前表單\n * - 諮詢房設定 + 詢前表單 + 房間資訊\n * - 行銷問候語 + FAQ depth 1\n * - 建立諮詢室\n * - 房間資訊 + 房間訊息\n */\n\n// 諮詢房設定 + 詢前表單\nexport const GET_CS_ROOM_SETTING_AND_FORM = gql`\n ${CS_SETTING_FIELD}\n ${CS_FORM_FIELD}\n query csRoomSettingAndForm {\n listConsultingRoomQuestion {\n consultingRoomQuestions {\n id\n question\n maxProcessingCount\n createdAt\n }\n }\n getConsultingRoomClientSetting(filter: { isClient: true }) {\n ...CSSetting\n }\n getConsultingRoomForm(filter: { isClient: true }) {\n ...CSForm\n }\n }\n`;\n\n// 行銷問候語 + FAQ depth 1\nexport const GET_GREETING_AND_FAQ = gql`\n ${CS_GREETING_FIELD}\n query greetingAndFaq($source: String) {\n listConsultingGreeting(\n filter: { consultingGreeting: { isEnabled: Yes }, isClient: true }\n ) {\n ConsultingGreetings {\n ...CSGreeting\n }\n }\n listFrequentlyQuestion(\n filter: {\n frequentlyQuestion: { depth: 1, source: $source }\n isClient: true\n }\n ) {\n frequentlyQuestions {\n id\n consultingRoomOriginID\n question\n asked\n parentID\n sequence\n source\n depth\n }\n }\n }\n`;\n\n// 房間資訊 + 房間訊息\nexport const GET_ROOM_DETAIL = gql`\n ${CS_DETAIL_FIELD}\n ${COMMENT_USER_ROOMS}\n ${MSG_REQUIRED}\n ${MSG_SYSTEM}\n query getRoomDetail($roomID: Uint64) {\n getRoom(filter: { room: { id: $roomID } }) {\n id\n type\n createdAt\n updatedAt\n consultingDetail {\n ...consultingDetailField\n }\n userRooms {\n ...userRoomsFields\n }\n }\n listMessage(\n filter: { roomID: $roomID }\n pagination: { offsetType: New, limit: 20 }\n ) {\n messages {\n ...messageFields\n text {\n text\n isEncrypt\n }\n file {\n text\n fileURL\n type\n }\n invite {\n id\n type\n inviteeUserIDs\n inviterUserID\n roomID\n }\n join {\n userID\n }\n leave {\n userID\n }\n system {\n ...MsgSystemField\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 建立 一般諮詢室\nexport const CREATED_CS_ROOM = gql`\n mutation createConsultationRoom($in: createConsultationRoomInput) {\n createConsultationRoom(in: $in) {\n room {\n id\n consultingDetail {\n roomID\n ownerUserID\n status\n type\n }\n }\n token\n deviceUID\n }\n }\n`;\n\n// 建立 充值諮詢室\nexport const CREATED_CS_DEPOSIT_ROOM = gql`\n mutation createUserDepositRoom($in: createUserDepositRoomInput) {\n createUserDepositRoom(in: $in) {\n room {\n id\n consultingDetail {\n roomID\n ownerUserID\n status\n type\n }\n }\n token\n deviceUID\n }\n }\n`;\n\n// 代客充值取得密碼及token\nexport const GET_WEB_DEPOSIT_TOKEN = gql`\n query getWebToken($token: String) {\n getWebToken(token: $token) {\n code\n }\n }\n`;\n\n// 查詢可支付渠道\nexport const listPaymentChannel = gql`\n query listPaymentChannel($in: ListPaymentChannelInput!) {\n listPaymentChannel(in: $in) {\n channels {\n payeeID\n alias\n name\n payType\n payMethod\n account\n bank\n bankCode\n subBank\n amount\n }\n }\n }\n`;\n\n// 生成訂單\nexport const deposit = gql`\n mutation deposit($in: DepositInput!) {\n deposit(in: $in) {\n payType\n payMethod\n orderID\n orderNo\n amount\n currency\n expiredAt\n bank {\n bankName\n branchName\n bankCode\n accountName\n cardNo\n }\n qrcode {\n url\n qUrl\n }\n redirect {\n url\n }\n }\n }\n`;\n\n// 過期訂單\nexport const expireDeposit = gql`\n mutation expireDeposit($in: ExpireDepositInput!) {\n expireDeposit(in: $in) {\n Result\n }\n }\n`;\n\n// 取消訂單\nexport const cancelDeposit = gql`\n mutation cancelDeposit($in: CancelDepositInput!) {\n cancelDeposit(in: $in) {\n Result\n }\n }\n`;\n\n// 審核訂單\nexport const paidDeposit = gql`\n mutation paidDeposit($in: PaidDepositInput!) {\n paidDeposit(in: $in) {\n Result\n }\n }\n`;\n\n// 諮詢/催單\nexport const consultingOrder = gql`\n mutation consultingOrder($in: ConsultingOrderInput!) {\n consultingOrder(in: $in) {\n orderNo\n amount\n payType\n currency\n createdAt\n status\n }\n }\n`;\n\n// 訂單列表\nexport const listOrder = gql`\n query listOrder($pagination: PaginationInput!, $in: ListOrderInput!) {\n listOrder(pagination: $pagination, in: $in) {\n meta {\n total\n page\n perPage\n totalPage\n }\n orders {\n orderNo\n amount\n payType\n currency\n createdAt\n status\n }\n }\n }\n`;\n\n// 訂單列表 棄用\nexport const listPendingOrder = gql`\n query listPendingOrder($pagination: PaginationInput!) {\n listPendingOrder(pagination: $pagination) {\n meta {\n total\n page\n perPage\n totalPage\n }\n orders {\n orderNo\n amount\n payType\n currency\n createdAt\n status\n }\n }\n }\n`;\n\nexport const FAQ_COUNT = gql`\n mutation addFrequentlyQuestionClick($roomID: Uint64!) {\n addFrequentlyQuestionClick(roomID: $roomID) {\n faqCount\n result\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const AD_TRACKING_FIELD = gql`\n fragment adTrackingField on AdTracking {\n id\n consultingRoomOriginID\n origin\n adTrackingType\n adTrackingCode\n createdAt\n updatedAt\n }\n`;\n\n/**\n * 廣告代碼\n */\nexport const LIST_AD_TRACKING = gql`\n ${AD_TRACKING_FIELD}\n query listAdTracking(\n $filter: AdTrackingFilterInput\n $pagination: PaginationInput\n ) {\n listAdTracking(filter: $filter, pagination: $pagination) {\n adTrackings {\n ...adTrackingField\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const GET_AD_TRACKING = gql`\n ${AD_TRACKING_FIELD}\n query getAdTracking($filter: AdTrackingFilterInput!) {\n getAdTracking(filter: $filter) {\n ...adTrackingField\n }\n }\n`;\n\nexport const CREATE_AD_TRACKING = gql`\n ${AD_TRACKING_FIELD}\n mutation createAdTracking($in: AdTrackingCreateInput!) {\n createAdTracking(in: $in) {\n ...adTrackingField\n }\n }\n`;\n\nexport const UPDATE_AD_TRACKING = gql`\n ${AD_TRACKING_FIELD}\n mutation updateAdTracking(\n $filter: AdTrackingFilterInput!\n $in: AdTrackingUpdateInput!\n ) {\n updateAdTracking(filter: $filter, in: $in) {\n ...adTrackingField\n }\n }\n`;\n\nexport const DELETE_AD_TRACKING = gql`\n mutation deleteAdTracking($filter: AdTrackingFilterInput!) {\n deleteAdTracking(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\n/**\n * 罐頭回覆\n */\nexport const LIST_CANNED = gql`\n query listCanned(\n $resCatList: CannedResponseCategoryFilterInput\n $resList: CannedResponseFilterInput\n ) {\n listCannedResponseCategory(filter: $resCatList) {\n cannedResponseCategories {\n id\n name\n createdAt\n }\n }\n listCannedResponse(filter: $resList) {\n cannedResponses {\n id\n categoryID\n text\n createdAt\n }\n }\n }\n`;\nexport const CREATE_CANNED_RES_CAT = gql`\n mutation createCannedResponseCategory(\n $in: CannedResponseCategoryCreateInput!\n ) {\n createCannedResponseCategory(in: $in) {\n id\n name\n createdAt\n }\n }\n`;\nexport const UPDATE_CANNED_RES_CAT = gql`\n mutation updateCannedResponseCategory(\n $filter: CannedResponseCategoryFilterInput!\n $in: CannedResponseCategoryUpdateInput!\n ) {\n updateCannedResponseCategory(filter: $filter, in: $in) {\n id\n name\n createdAt\n }\n }\n`;\nexport const DELETE_CANNED_RES_CAT = gql`\n mutation deleteCannedResponseCategory(\n $filter: CannedResponseCategoryFilterInput!\n ) {\n deleteCannedResponseCategory(filter: $filter)\n }\n`;\n\n// 新增罐頭類別內容\nexport const CREATE_CANNED_RES = gql`\n mutation createCannedResponse($in: CannedResponseCreateInput!) {\n createCannedResponse(in: $in) {\n id\n categoryID\n text\n createdAt\n }\n }\n`;\nexport const UPDATE_CANNED_RES = gql`\n mutation updateCannedResponse(\n $filter: CannedResponseFilterInput!\n $in: CannedResponseUpdateInput!\n ) {\n updateCannedResponse(filter: $filter, in: $in) {\n id\n categoryID\n text\n createdAt\n }\n }\n`;\nexport const DELETE_CANNED_RES = gql`\n mutation deleteCannedResponse($filter: CannedResponseFilterInput!) {\n deleteCannedResponse(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { CS_FORM_FIELD } from './Fragment';\n/**\n * 詢前表單\n */\nexport const GET_CS_FORM = gql`\n ${CS_FORM_FIELD}\n query getConsultingRoomForm($filter: ConsultingRoomFormFilterInput!) {\n getConsultingRoomForm(filter: $filter) {\n ...CSForm\n }\n }\n`;\nexport const CREATE_CS_FORM = gql`\n ${CS_FORM_FIELD}\n mutation createConsultingRoomForm($in: ConsultingRoomFormCreateInput!) {\n createConsultingRoomForm(in: $in) {\n ...CSForm\n }\n }\n`;\nexport const UPDATE_CS_FORM = gql`\n ${CS_FORM_FIELD}\n mutation updateConsultingRoomForm(\n $filter: ConsultingRoomFormFilterInput!\n $in: ConsultingRoomFormUpdateInput!\n ) {\n updateConsultingRoomForm(filter: $filter, in: $in) {\n ...CSForm\n }\n }\n`;\nexport const DELETE_CS_FORM = gql`\n ${CS_FORM_FIELD}\n mutation deleteConsultingRoomForm($filter: ConsultingRoomFormFilterInput!) {\n deleteConsultingRoomForm(filter: $filter) {\n ...CSForm\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport { CS_SETTING_FIELD } from './Fragment';\n\n/**\n * 諮詢窗口管理\n */\nexport const GET_CS_ROOM_SETTING = gql`\n ${CS_SETTING_FIELD}\n query getConsultingRoomClientSetting(\n $filter: ConsultingRoomClientSettingFilterInput!\n ) {\n getConsultingRoomClientSetting(filter: $filter) {\n ...CSSetting\n }\n }\n`;\nexport const LIST_CS_ROOM_SETTING = gql`\n ${CS_SETTING_FIELD}\n query listConsultingRoomClientSetting(\n $filter: ConsultingRoomClientSettingFilterInput\n ) {\n listConsultingRoomClientSetting(filter: $filter) {\n consultingRoomClientSettings {\n ...CSSetting\n }\n }\n }\n`;\nexport const CREATE_CS_ROOM_SETTING = gql`\n ${CS_SETTING_FIELD}\n mutation createConsultingRoomClientSetting(\n $in: ConsultingRoomClientSettingCreateInput!\n ) {\n createConsultingRoomClientSetting(in: $in) {\n ...CSSetting\n }\n }\n`;\nexport const UPDATE_CS_ROOM_SETTING = gql`\n ${CS_SETTING_FIELD}\n mutation updateConsultingRoomClientSetting(\n $filter: ConsultingRoomClientSettingFilterInput!\n $in: ConsultingRoomClientSettingUpdateInput!\n ) {\n updateConsultingRoomClientSetting(filter: $filter, in: $in) {\n ...CSSetting\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\n/**\n * 聯繫人客服\n */\n\n// 列表\nexport const LIST_CONTACT_CUS_SVS = gql`\n query listContactCustomerService(\n $filter: ContactCustomerServiceFilterInput\n $pagination: PaginationInput\n ) {\n listContactCustomerService(filter: $filter, pagination: $pagination) {\n contactCustomerServices {\n id\n name\n avatarURL\n isDisplayEnabled\n createdAt\n updatedAt\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 明細\nexport const GET_CONTACT_CUS_SVS = gql`\n query listContactCustomerService($filter: ContactCustomerServiceFilterInput) {\n listContactCustomerService(filter: $filter) {\n id\n name\n avatarURL\n isDisplayEnabled\n createdAt\n updatedAt\n }\n }\n`;\n\n// 新增\nexport const CREATED_CONTACT_CUS_SVS = gql`\n mutation createContactCustomerService(\n $in: ContactCustomerServiceCreateInput!\n ) {\n createContactCustomerService(in: $in) {\n id\n name\n avatarURL\n isDisplayEnabled\n createdAt\n createdAt\n }\n }\n`;\n\n// 更新\nexport const UPDATE_CONTACT_CUS_SVS = gql`\n mutation updateContactCustomerService(\n $filter: ContactCustomerServiceFilterInput!\n $in: ContactCustomerServiceUpdateInput!\n ) {\n updateContactCustomerService(filter: $filter, in: $in) {\n id\n name\n avatarURL\n isDisplayEnabled\n createdAt\n createdAt\n }\n }\n`;\n\n// 刪除\nexport const DELETE_CONTACT_CUS_SVS = gql`\n mutation deleteContactCustomerService(\n $filter: ContactCustomerServiceFilterInput!\n ) {\n deleteContactCustomerService(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\n\n/**\n * FAQ\n */\nexport const LIST_FAQ_KEYS = gql`\n query listFrequentlyQuestion($filter: FrequentlyQuestionFilterInput!) {\n listFrequentlyQuestion(filter: $filter) {\n frequentlyQuestions {\n id\n question\n parentID\n depth\n }\n }\n }\n`;\nexport const LIST_FAQ_DETAIL = gql`\n query listFrequentlyQuestion($filter: FrequentlyQuestionFilterInput!) {\n listFrequentlyQuestion(filter: $filter) {\n frequentlyQuestions {\n id\n consultingRoomOriginID\n question\n asked\n parentID\n sequence\n source\n depth\n createdAt\n updatedAt\n isEnabled\n }\n meta {\n total\n }\n }\n }\n`;\nexport const CREATE_FAQ = gql`\n mutation createFrequentlyQuestion($in: FrequentlyQuestionCreateInput!) {\n createFrequentlyQuestion(in: $in)\n }\n`;\nexport const UPDATE_FAQ = gql`\n mutation updateFrequentlyQuestion(\n $filter: FrequentlyQuestionFilterInput!\n $in: FrequentlyQuestionUpdateInput!\n ) {\n updateFrequentlyQuestion(filter: $filter, in: $in)\n }\n`;\nexport const DELETE_FAQ = gql`\n mutation deleteFrequentlyQuestion($filter: FrequentlyQuestionFilterInput!) {\n deleteFrequentlyQuestion(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { CS_GREETING_FIELD } from './Fragment';\n\n/**\n * 行銷問候語設定\n */\nexport const LIST_CS_GREETING = gql`\n ${CS_GREETING_FIELD}\n query listConsultingGreeting($filter: ConsultingGreetingFilterInput) {\n listConsultingGreeting(filter: $filter) {\n ConsultingGreetings {\n ...CSGreeting\n }\n }\n }\n`;\nexport const CREATE_CS_GREETING = gql`\n ${CS_GREETING_FIELD}\n mutation createConsultingGreeting($in: ConsultingGreetingCreateInput!) {\n createConsultingGreeting(in: $in) {\n ...CSGreeting\n }\n }\n`;\nexport const UPDATE_CS_GREETING = gql`\n ${CS_GREETING_FIELD}\n mutation updateConsultingGreeting(\n $filter: ConsultingGreetingFilterInput!\n $in: ConsultingGreetingUpdateInput!\n ) {\n updateConsultingGreeting(filter: $filter, in: $in) {\n ...CSGreeting\n }\n }\n`;\nexport const DELETE_CS_GREETING = gql`\n mutation deleteConsultingGreeting($filter: ConsultingGreetingFilterInput!) {\n deleteConsultingGreeting(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { COMMENT_USER_ROOMS } from './Fragment';\n\n// 群組列表\nexport const LIST_GROUP_ROOM = gql`\n ${COMMENT_USER_ROOMS}\n query listGroupRoom(\n $filter: GroupRoomFilterInput!\n $pagination: PaginationInput\n ) {\n listGroupRoom(filter: $filter, pagination: $pagination) {\n groupRooms {\n roomID\n imageURL\n name\n isPublic\n inviteLevel # 加入的層級\n strangerLevel # 陌生人的等級\n strangerPassword\n ownerUserID\n createdAt\n userRooms {\n ...userRoomsFields\n }\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 建立 群組聊天室\nexport const CREATE_GROUP = gql`\n mutation createGroup($in: GroupCreateInput!) {\n createGroup(in: $in) {\n id\n uid\n type\n createdAt\n updatedAt\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const HOSTS_DENY_FIELD = gql`\n fragment hostsDenyField on HostsDeny {\n id\n ipAddress\n isEnabled\n remark\n createdAt\n createUserID\n updatedAt\n updateUserID\n }\n`;\n\n/**\n * 行銷問候語設定\n */\nexport const LIST_HOSTS_DENY = gql`\n ${HOSTS_DENY_FIELD}\n query listHostsDeny(\n $filter: HostsDenyFilterInput\n $pagination: PaginationInput\n ) {\n listHostsDeny(filter: $filter, pagination: $pagination) {\n hostsDenys {\n ...hostsDenyField\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const CREATE_HOSTS_DENY = gql`\n ${HOSTS_DENY_FIELD}\n mutation createHostsDeny($in: HostsDenyCreateInput!) {\n createHostsDeny(in: $in) {\n ...hostsDenyField\n }\n }\n`;\n\nexport const UPDATE_HOSTS_DENY = gql`\n ${HOSTS_DENY_FIELD}\n mutation updateHostsDeny(\n $filter: HostsDenyFilterInput!\n $in: HostsDenyUpdateInput!\n ) {\n updateHostsDeny(filter: $filter, in: $in) {\n ...hostsDenyField\n }\n }\n`;\n\nexport const DELETE_HOSTS_DENY = gql`\n mutation deleteHostsDeny($filter: HostsDenyFilterInput!) {\n deleteHostsDeny(filter: $filter)\n }\n`;\n","import { gql } from '@apollo/client';\nimport { COMMENT_MENU } from './menuList';\n\n// 登入\nexport const POST_LOGIN = gql`\n mutation login($username: String!, $password: String!) {\n Login(in: { username: $username, password: $password }) {\n token\n deviceUID\n userAgent\n }\n }\n`;\n\n// 登出\nexport const POST_LOGOUT = gql`\n mutation Logout {\n Logout\n }\n`;\n\n// user login 資訊\nexport const LIST_USER_LOGIN_INFO = gql`\n query listUserLoginHistory(\n $filter: UserLoginHistoryFilterInput!\n $pagination: PaginationInput\n ) {\n listUserLoginHistory(filter: $filter, pagination: $pagination) {\n userLoginHistories {\n id\n userID\n ipAddress\n country\n administrativeArea\n deviceOS\n createdAt\n }\n meta {\n total\n }\n }\n }\n`;\n\n// 取得個人資料 以及 可見的 menu\nexport const GET_ME = gql`\n ${COMMENT_MENU}\n query Me {\n Me {\n id\n spinachUserID\n accountType\n status\n username\n aliasName\n avatarURL\n isOnline\n isStealth\n devices {\n id\n userID\n deviceUID\n isBind\n createdAt\n updatedAt\n }\n whitelists {\n id\n userID\n ipAddress\n createdAt\n }\n setting {\n id\n allowLoginStartAt\n allowLoginEndAt\n }\n menu {\n ...menuFields\n next {\n ...menuFields\n next {\n ...menuFields\n }\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\n// 諮詢室列表\nexport const LIST_MONITOR_CS_ROOM = gql`\n query listConsultingRoom(\n $filter: ConsultingRoomFilterInput\n $pagination: PaginationInput\n ) {\n listConsultingRoom(filter: $filter, pagination: $pagination) {\n consultingRooms {\n roomID\n merchantID\n ipAddress\n country\n administrativeArea\n accessDomain\n ownerUserID\n status\n createdAt\n userRooms {\n id\n userID\n deletedAt # 用來判斷是否已離開房間 重新加入會 = 0\n lastReadMessageID\n isPinned\n user {\n id\n username\n aliasName\n avatarURL\n accountType\n status\n isOnline\n }\n }\n }\n }\n }\n`;\n","/**\n * 域名管理\n * - 訪問域名\n * - spinach平台管理\n * - 商戶管理\n * */\nimport { gql } from '@apollo/client';\nimport { CS_ORIGIN_FIELD, SPINACH_FIELD } from './Fragment';\n\nexport const LIST_CS_ROOM_ORIGIN = gql`\n ${CS_ORIGIN_FIELD}\n query listConsultingRoomOrigin(\n $filter: ConsultingRoomOriginFilterInput\n $pagination: PaginationInput\n ) {\n listConsultingRoomOrigin(filter: $filter, pagination: $pagination) {\n consultingRoomOrigins {\n ...CSRoomOrigin\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const CREATE_CS_ROOM_ORIGIN = gql`\n ${CS_ORIGIN_FIELD}\n mutation createConsultingRoomOrigin($in: ConsultingRoomOriginCreateInput!) {\n createConsultingRoomOrigin(in: $in) {\n ...CSRoomOrigin\n }\n }\n`;\n\nexport const UPDATE_CS_ROOM_ORIGIN = gql`\n ${CS_ORIGIN_FIELD}\n mutation updateConsultingRoomOrigin(\n $filter: ConsultingRoomOriginFilterInput!\n $in: ConsultingRoomOriginUpdateInput!\n ) {\n updateConsultingRoomOrigin(filter: $filter, in: $in) {\n ...CSRoomOrigin\n }\n }\n`;\n\nexport const DELETE_CS_ROOM_ORIGIN = gql`\n mutation deleteConsultingRoomOrigin(\n $filter: ConsultingRoomOriginFilterInput!\n ) {\n deleteConsultingRoomOrigin(filter: $filter)\n }\n`;\n\n/**\n * 平台管理\n * */\n// spinach 平台列表\nexport const LIST_SPINACH_PLATFORM = gql`\n ${SPINACH_FIELD}\n query listSpinachPlatform(\n $filter: SpinachPlatformFilterInput\n $pagination: PaginationInput\n ) {\n listSpinachPlatform(filter: $filter, pagination: $pagination) {\n spinachPlatforms {\n ...spinachPlatform\n }\n meta {\n total\n }\n }\n }\n`;\n\n// SpinachPlatform 平台 key\nexport const CREATE_SPINACH_PLATFORM = gql`\n ${SPINACH_FIELD}\n mutation createSpinachPlatform($in: SpinachPlatformCreateInput!) {\n createSpinachPlatform(in: $in) {\n ...spinachPlatform\n }\n }\n`;\n\nexport const UPDATE_SPINACH_PLATFORM = gql`\n ${SPINACH_FIELD}\n mutation updateSpinachPlatform(\n $filter: SpinachPlatformFilterInput!\n $in: SpinachPlatformUpdateInput!\n ) {\n updateSpinachPlatform(filter: $filter, in: $in) {\n ...spinachPlatform\n }\n }\n`;\n\nexport const DELETE_SPINACH_PLATFORM = gql`\n mutation deleteSpinachPlatform($filter: SpinachPlatformFilterInput!) {\n deleteSpinachPlatform(filter: $filter)\n }\n`;\n\n/**\n * 商戶管理\n */\nexport const MERCHANT_FIELDS = gql`\n fragment merchantFields on Merchant {\n id\n name\n merchantType\n key\n host\n secretKey\n remark\n createdAt\n createUserID\n updatedAt\n updateUserID\n endpoints {\n paymentChannel\n deposit\n cancelDeposit\n queryOrder\n paidDeposit\n expireDeposit\n }\n }\n`;\n\nexport const LIST_MERCHANT = gql`\n ${MERCHANT_FIELDS}\n query listMerchant(\n $filter: MerchantFilterInput!\n $pagination: PaginationInput\n ) {\n listMerchant(filter: $filter, pagination: $pagination) {\n merchants {\n ...merchantFields\n }\n meta {\n total\n }\n }\n }\n`;\n\nexport const CREATE_MERCHANT = gql`\n ${MERCHANT_FIELDS}\n mutation createMerchant($in: MerchantCreateInput!) {\n createMerchant(in: $in) {\n ...merchantFields\n }\n }\n`;\n\nexport const UPDATE_MERCHANT = gql`\n ${MERCHANT_FIELDS}\n mutation updateMerchant(\n $filter: MerchantFilterInput!\n $in: MerchantUpdateInput!\n ) {\n updateMerchant(filter: $filter, in: $in) {\n ...merchantFields\n }\n }\n`;\n\nexport const DELETE_MERCHANT = gql`\n mutation deleteMerchant($filter: MerchantFilterInput!) {\n deleteMerchant(filter: $filter)\n }\n`;\n","/**\n * 上傳圖片\n */\nimport { gql } from '@apollo/client';\n\nexport const CREATED_UPLOAD_URL = gql`\n mutation createUploadURL($in: CreateUploadURLInput!) {\n createUploadURL(in: $in) {\n files {\n fileName\n uploadURL\n }\n }\n }\n`;\n\nexport const NEW_CREATE_UPLOAD = gql`\n mutation NewCreateUpload($in: Upload) {\n newCreateUpload(in: $in)\n }\n`;\n\n/**\n * 客服系統紅點\n * 有待諮詢 & 我的諮詢單\n */\nexport const GET_RED_POINT = gql`\n query redPointInfo($userID: Uint64) {\n listUserRoom(\n filter: {\n userRoom: { roomType: Consulting, userID: $userID }\n roomStatusIn: [Processing]\n }\n ) {\n # TODO total 有問題 先用 userRooms 自己算\n userRooms {\n id\n }\n meta {\n total\n totalUnRead\n }\n }\n # listConsultingRoom(filter: { statusIn: Active }) {\n # meta {\n # total\n # }\n # }\n }\n`;\n"],"sourceRoot":""}