Commit 84b48c2e by panjiangyi

format file

parent 31d2e1e4
const SVG_AUDIO = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484227561" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6614" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#E54C94" p-id="6615"></path><path d="M607.744 434.39c-31.488 19.86-73.472-1.43-73.472-1.43s40.47 178.795 37.483 193.003c0 0 0-1.43 0 0 0 42.56-37.483 78.037-83.968 78.037-46.464 0-82.454-35.477-82.454-78.037 0-42.582 37.483-78.059 82.454-78.059 16.49 0 34.496 5.675 43.477 15.616l-38.976-143.317s-16.49-65.28 41.984-56.768c41.984 7.082 29.995 34.048 104.96 11.349 1.493-1.408 4.48 36.907-31.488 59.605zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6616"></path></svg>`
const SVG_EXCEL = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484180583" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5396" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#3AC877" p-id="5397"></path><path d="M369.707 704L474.09 544.64l-94.592-146.048h72.085l61.248 98.133 60.01-98.133h71.467l-95.018 148.33L653.675 704h-74.39l-67.712-105.621L443.67 704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5398"></path></svg>`
const SVG_IMAGE = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484188280" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5531" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F6AD00" p-id="5532"></path><path d="M294.485 684.95l78.379-115.2a12.181 12.181 0 0 1 18.624-1.835l51.797 50.752 113.643-178.134a12.181 12.181 0 0 1 20.843 0.47l141.205 244.714A12.181 12.181 0 0 1 708.416 704h-403.84a12.181 12.181 0 0 1-10.09-19.05z" fill="#FFF7F7" p-id="5533"></path><path d="M443.307 423.616c0 32.512-29.014 60.95-62.187 60.95-33.152 0-62.165-28.438-62.165-60.95-2.07-32.512 26.944-60.95 62.165-60.95 33.152 0 62.165 28.438 62.165 60.95zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5534"></path></svg>`
const SVG_OTHERS = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484218091" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6343" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F2F2F2" p-id="6344"></path><path d="M512 693.333c-11.243-0.085-20.267-9.685-20.203-21.461 0-11.883 9.046-21.483 20.203-21.483 11.136 0 20.203 9.6 20.203 21.483 0 11.819-9.067 21.461-20.203 21.461z m86.89-195.712c-6.058 11.648-18.005 25.728-35.69 42.411-11.904 11.285-19.67 19.499-23.317 24.768-3.67 5.397-6.4 11.456-8.107 18.325a132.267 132.267 0 0 0-2.773 25.195 19.84 19.84 0 0 1-3.264 16.363 17.43 17.43 0 0 1-14.187 7.21c-8.533 0.043-15.872-6.293-17.621-15.146h-0.32a380.757 380.757 0 0 1-0.214-11.606c0-15.274 2.006-28.33 6.08-39.36 3.435-9.216 8.299-17.749 14.379-25.237 4.907-6.187 13.653-15.275 26.261-27.093 12.63-11.798 20.907-21.27 24.683-28.267 3.797-7.083 5.675-14.763 5.675-23.125 0-15.04-5.59-28.288-16.64-39.68a54.272 54.272 0 0 0-40.747-17.152c-15.573 0-28.544 5.12-38.912 15.53-9.984 9.878-16.619 25.067-20.053 45.59-0.299 10.944-8.768 19.626-19.072 19.562a18.603 18.603 0 0 1-15.232-8.021 21.163 21.163 0 0 1-3.051-17.77c3.776-27.35 13.653-48.427 29.525-63.297 16.704-15.637 38.784-23.488 66.176-23.488 29.142 0 52.288 8.406 69.59 25.238C599.38 415.317 608 435.69 608 459.477c0 13.782-3.03 26.454-9.11 38.102v0.042z" fill="#AAAAAA" p-id="6345"></path><path d="M650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill-opacity=".1" p-id="6346"></path></svg>`
const SVG_PDF = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484212640" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6208" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#EF5E5E" p-id="6209"></path><path d="M274.624 640V456.747h59.37c22.507 0 37.163 0.917 44.011 2.773 10.496 2.73 19.286 8.704 26.368 17.92 7.083 9.216 10.624 21.12 10.624 35.69 0 11.243-2.048 20.694-6.122 28.374-4.075 7.68-9.28 13.675-15.574 18.048-6.272 4.395-12.672 7.275-19.178 8.704-8.832 1.75-21.632 2.624-38.379 2.624h-24.107V640h-37.034z m36.992-152.256v52.01h20.267c14.57 0 24.32-0.96 29.226-2.88 4.928-1.92 8.79-4.906 11.584-9.002 2.774-4.075 4.182-8.832 4.182-14.25 0-6.657-1.963-12.16-5.867-16.491a25.6 25.6 0 0 0-14.89-8.128c-4.417-0.854-13.291-1.259-26.625-1.259h-17.877z m133.632-30.997h67.627c15.253 0 26.88 1.173 34.88 3.498 10.752 3.179 19.946 8.79 27.626 16.875 7.68 8.107 13.504 17.984 17.494 29.696 4.01 11.712 5.994 26.133 5.994 43.307 0 15.082-1.877 28.096-5.61 38.997-4.587 13.333-11.136 24.128-19.627 32.384-6.421 6.25-15.083 11.115-26.027 14.613C539.456 638.7 528.533 640 514.88 640h-69.653V456.747z m36.992 30.997v121.387h27.627c10.346 0 17.792-0.598 22.4-1.75a34.133 34.133 0 0 0 14.933-7.637c3.947-3.584 7.168-9.472 9.685-17.685 2.496-8.214 3.734-19.392 3.734-33.558 0-14.165-1.238-25.045-3.734-32.64-2.517-7.573-6.016-13.482-10.517-17.728a35.2 35.2 0 0 0-17.11-8.64c-5.183-1.152-15.295-1.749-30.378-1.749h-16.64zM630.507 640V456.747h125.61v30.997H667.52v43.37h76.501v31.02H667.52V640h-36.992zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6210"></path></svg>`
const SVG_PPT = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484168359" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5125" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F57B47" p-id="5126"></path><path d="M400.747 704V398.592h98.965c37.504 0 61.93 1.515 73.323 4.565 17.493 4.587 32.149 14.55 43.946 29.91 11.819 15.36 17.728 35.178 17.728 59.477 0 18.752-3.413 34.517-10.218 47.296-6.806 12.779-15.446 22.805-25.92 30.08a89.387 89.387 0 0 1-32 14.507c-14.72 2.901-36.032 4.373-63.936 4.373H462.42V704h-61.653zM462.4 450.24v86.677h33.77c24.32 0 40.534-1.6 48.747-4.8 8.192-3.2 14.614-8.192 19.264-14.997 4.651-6.805 6.976-14.72 6.976-23.744 0-11.093-3.264-20.267-9.792-27.52a42.645 42.645 0 0 0-24.789-13.525c-7.36-1.387-22.144-2.091-44.373-2.091H462.42zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5127"></path></svg>`
const SVG_RP = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484207818" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6072" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M640 32l277.333 277.333H682.667A42.667 42.667 0 0 1 640 266.667V32z" fill="#FFFFFF" p-id="6073"></path><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#BC6CD5" p-id="6074"></path><path d="M299.925 661.333v-244.33h103.83c26.112 0 45.077 2.197 56.917 6.57 11.819 4.395 21.29 12.203 28.416 23.424 7.104 11.222 10.667 24.064 10.667 38.507 0 18.347-5.398 33.472-16.171 45.419s-26.88 19.456-48.341 22.57c10.666 6.23 19.477 13.056 26.432 20.502 6.933 7.466 16.298 20.672 28.074 39.68l29.824 47.658h-58.986l-35.67-53.162c-12.672-18.987-21.333-30.976-26.005-35.926a37.867 37.867 0 0 0-14.827-10.154c-5.226-1.835-13.504-2.774-24.832-2.774h-10.005v102.016h-49.301z m49.323-141.013h36.501c23.68 0 38.443-0.981 44.331-2.987 5.888-2.005 10.496-5.44 13.845-10.325 3.328-4.907 4.992-11.008 4.992-18.347 0-8.213-2.197-14.848-6.592-19.904-4.373-5.056-10.581-8.256-18.56-9.6-4.01-0.554-16-0.832-36.01-0.832h-38.528v62.016zM546.24 661.333v-244.33h79.168c30.016 0 49.557 1.216 58.667 3.669 14.016 3.67 25.728 11.627 35.178 23.893 9.451 12.288 14.166 28.16 14.166 47.595 0 14.997-2.731 27.627-8.171 37.845a66.987 66.987 0 0 1-20.757 24.086 71.51 71.51 0 0 1-25.579 11.584c-11.776 2.325-28.821 3.498-51.157 3.498h-32.171v92.16H546.24z m49.344-203.008v69.334h27.008c19.435 0 32.427-1.28 38.997-3.84 6.55-2.56 11.691-6.55 15.403-11.99a32.853 32.853 0 0 0 5.59-18.986c0-8.896-2.603-16.214-7.83-22.016a34.133 34.133 0 0 0-19.84-10.838c-5.888-1.109-17.707-1.664-35.499-1.664h-23.829zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6075"></path></svg>`
const SVG_TEXT = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484222751" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6479" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#5098F1" p-id="6480"></path><path d="M481.493 704V450.24h-90.666v-51.648h242.709v51.648h-90.39V704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6481"></path></svg>`
const SVG_VIDEO = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484193398" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5667" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#8183F1" p-id="5668"></path><path d="M512 341.333c106.325 0 192 86.187 192 192s-86.187 192-192 192-192-86.186-192-192 86.187-192 192-192z m-31.296 102.87a12.8 12.8 0 0 0-19.904 10.666v156.95a12.8 12.8 0 0 0 19.904 10.666l117.717-78.506a12.8 12.8 0 0 0 0-21.291l-117.717-78.507zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5669"></path></svg>`
const SVG_WORD = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484175478" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5260" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0H646.74l291.926 295.83v681.237A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#66C7FC" p-id="5261"></path><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#3FB0EE" p-id="5262"></path><path d="M385.024 704l-72.917-305.408h63.125l46.037 209.792 55.83-209.792h73.344l53.546 213.333 46.87-213.333h62.08L638.763 704h-65.408l-60.843-228.33L451.904 704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5263"></path></svg>`
const SVG_XMIND = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484203239" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5937" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#EB4E53" p-id="5938"></path><path d="M412.267 394.667L277.333 424.66s0.726 78.294 148.139 114.902c0 0-163.541 40.234-134.933 132.437l117.333-19.755s0-98.773 84.33-84.885c84.331 13.163 101.206 73.173 107.073 98.048l147.392-22.677s-11.008-91.478-155.478-130.262c0 0 130.56-25.6 84.352-110.485L555.99 424.661s27.136 57.814-25.664 65.131-94.592-18.283-118.058-95.125zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5939"></path></svg>`
const SVG_ZIP = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484198283" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5802" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F38C12" p-id="5803"></path><path d="M426.667 0v85.333H512V0h-85.333z m0 170.667V256H512v-85.333h-85.333z m0 170.666v85.334H512v-85.334h-85.333z m85.333-256v85.334h85.333V85.333H512zM512 256v85.333h85.333V256H512z m0 170.667V512h85.333v-85.333H512zM426.667 512v170.667h170.666V512H426.667z m28.437 85.333h113.792v56.896H455.104v-56.896zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5804"></path></svg>`
const SVG_AUDIO = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484227561" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6614" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#E54C94" p-id="6615"></path><path d="M607.744 434.39c-31.488 19.86-73.472-1.43-73.472-1.43s40.47 178.795 37.483 193.003c0 0 0-1.43 0 0 0 42.56-37.483 78.037-83.968 78.037-46.464 0-82.454-35.477-82.454-78.037 0-42.582 37.483-78.059 82.454-78.059 16.49 0 34.496 5.675 43.477 15.616l-38.976-143.317s-16.49-65.28 41.984-56.768c41.984 7.082 29.995 34.048 104.96 11.349 1.493-1.408 4.48 36.907-31.488 59.605zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6616"></path></svg>`;
const SVG_EXCEL = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484180583" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5396" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#3AC877" p-id="5397"></path><path d="M369.707 704L474.09 544.64l-94.592-146.048h72.085l61.248 98.133 60.01-98.133h71.467l-95.018 148.33L653.675 704h-74.39l-67.712-105.621L443.67 704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5398"></path></svg>`;
const SVG_IMAGE = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484188280" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5531" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F6AD00" p-id="5532"></path><path d="M294.485 684.95l78.379-115.2a12.181 12.181 0 0 1 18.624-1.835l51.797 50.752 113.643-178.134a12.181 12.181 0 0 1 20.843 0.47l141.205 244.714A12.181 12.181 0 0 1 708.416 704h-403.84a12.181 12.181 0 0 1-10.09-19.05z" fill="#FFF7F7" p-id="5533"></path><path d="M443.307 423.616c0 32.512-29.014 60.95-62.187 60.95-33.152 0-62.165-28.438-62.165-60.95-2.07-32.512 26.944-60.95 62.165-60.95 33.152 0 62.165 28.438 62.165 60.95zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5534"></path></svg>`;
const SVG_OTHERS = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484218091" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6343" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F2F2F2" p-id="6344"></path><path d="M512 693.333c-11.243-0.085-20.267-9.685-20.203-21.461 0-11.883 9.046-21.483 20.203-21.483 11.136 0 20.203 9.6 20.203 21.483 0 11.819-9.067 21.461-20.203 21.461z m86.89-195.712c-6.058 11.648-18.005 25.728-35.69 42.411-11.904 11.285-19.67 19.499-23.317 24.768-3.67 5.397-6.4 11.456-8.107 18.325a132.267 132.267 0 0 0-2.773 25.195 19.84 19.84 0 0 1-3.264 16.363 17.43 17.43 0 0 1-14.187 7.21c-8.533 0.043-15.872-6.293-17.621-15.146h-0.32a380.757 380.757 0 0 1-0.214-11.606c0-15.274 2.006-28.33 6.08-39.36 3.435-9.216 8.299-17.749 14.379-25.237 4.907-6.187 13.653-15.275 26.261-27.093 12.63-11.798 20.907-21.27 24.683-28.267 3.797-7.083 5.675-14.763 5.675-23.125 0-15.04-5.59-28.288-16.64-39.68a54.272 54.272 0 0 0-40.747-17.152c-15.573 0-28.544 5.12-38.912 15.53-9.984 9.878-16.619 25.067-20.053 45.59-0.299 10.944-8.768 19.626-19.072 19.562a18.603 18.603 0 0 1-15.232-8.021 21.163 21.163 0 0 1-3.051-17.77c3.776-27.35 13.653-48.427 29.525-63.297 16.704-15.637 38.784-23.488 66.176-23.488 29.142 0 52.288 8.406 69.59 25.238C599.38 415.317 608 435.69 608 459.477c0 13.782-3.03 26.454-9.11 38.102v0.042z" fill="#AAAAAA" p-id="6345"></path><path d="M650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill-opacity=".1" p-id="6346"></path></svg>`;
const SVG_PDF = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484212640" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6208" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#EF5E5E" p-id="6209"></path><path d="M274.624 640V456.747h59.37c22.507 0 37.163 0.917 44.011 2.773 10.496 2.73 19.286 8.704 26.368 17.92 7.083 9.216 10.624 21.12 10.624 35.69 0 11.243-2.048 20.694-6.122 28.374-4.075 7.68-9.28 13.675-15.574 18.048-6.272 4.395-12.672 7.275-19.178 8.704-8.832 1.75-21.632 2.624-38.379 2.624h-24.107V640h-37.034z m36.992-152.256v52.01h20.267c14.57 0 24.32-0.96 29.226-2.88 4.928-1.92 8.79-4.906 11.584-9.002 2.774-4.075 4.182-8.832 4.182-14.25 0-6.657-1.963-12.16-5.867-16.491a25.6 25.6 0 0 0-14.89-8.128c-4.417-0.854-13.291-1.259-26.625-1.259h-17.877z m133.632-30.997h67.627c15.253 0 26.88 1.173 34.88 3.498 10.752 3.179 19.946 8.79 27.626 16.875 7.68 8.107 13.504 17.984 17.494 29.696 4.01 11.712 5.994 26.133 5.994 43.307 0 15.082-1.877 28.096-5.61 38.997-4.587 13.333-11.136 24.128-19.627 32.384-6.421 6.25-15.083 11.115-26.027 14.613C539.456 638.7 528.533 640 514.88 640h-69.653V456.747z m36.992 30.997v121.387h27.627c10.346 0 17.792-0.598 22.4-1.75a34.133 34.133 0 0 0 14.933-7.637c3.947-3.584 7.168-9.472 9.685-17.685 2.496-8.214 3.734-19.392 3.734-33.558 0-14.165-1.238-25.045-3.734-32.64-2.517-7.573-6.016-13.482-10.517-17.728a35.2 35.2 0 0 0-17.11-8.64c-5.183-1.152-15.295-1.749-30.378-1.749h-16.64zM630.507 640V456.747h125.61v30.997H667.52v43.37h76.501v31.02H667.52V640h-36.992zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6210"></path></svg>`;
const SVG_PPT = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484168359" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5125" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F57B47" p-id="5126"></path><path d="M400.747 704V398.592h98.965c37.504 0 61.93 1.515 73.323 4.565 17.493 4.587 32.149 14.55 43.946 29.91 11.819 15.36 17.728 35.178 17.728 59.477 0 18.752-3.413 34.517-10.218 47.296-6.806 12.779-15.446 22.805-25.92 30.08a89.387 89.387 0 0 1-32 14.507c-14.72 2.901-36.032 4.373-63.936 4.373H462.42V704h-61.653zM462.4 450.24v86.677h33.77c24.32 0 40.534-1.6 48.747-4.8 8.192-3.2 14.614-8.192 19.264-14.997 4.651-6.805 6.976-14.72 6.976-23.744 0-11.093-3.264-20.267-9.792-27.52a42.645 42.645 0 0 0-24.789-13.525c-7.36-1.387-22.144-2.091-44.373-2.091H462.42zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5127"></path></svg>`;
const SVG_RP = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484207818" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6072" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M640 32l277.333 277.333H682.667A42.667 42.667 0 0 1 640 266.667V32z" fill="#FFFFFF" p-id="6073"></path><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#BC6CD5" p-id="6074"></path><path d="M299.925 661.333v-244.33h103.83c26.112 0 45.077 2.197 56.917 6.57 11.819 4.395 21.29 12.203 28.416 23.424 7.104 11.222 10.667 24.064 10.667 38.507 0 18.347-5.398 33.472-16.171 45.419s-26.88 19.456-48.341 22.57c10.666 6.23 19.477 13.056 26.432 20.502 6.933 7.466 16.298 20.672 28.074 39.68l29.824 47.658h-58.986l-35.67-53.162c-12.672-18.987-21.333-30.976-26.005-35.926a37.867 37.867 0 0 0-14.827-10.154c-5.226-1.835-13.504-2.774-24.832-2.774h-10.005v102.016h-49.301z m49.323-141.013h36.501c23.68 0 38.443-0.981 44.331-2.987 5.888-2.005 10.496-5.44 13.845-10.325 3.328-4.907 4.992-11.008 4.992-18.347 0-8.213-2.197-14.848-6.592-19.904-4.373-5.056-10.581-8.256-18.56-9.6-4.01-0.554-16-0.832-36.01-0.832h-38.528v62.016zM546.24 661.333v-244.33h79.168c30.016 0 49.557 1.216 58.667 3.669 14.016 3.67 25.728 11.627 35.178 23.893 9.451 12.288 14.166 28.16 14.166 47.595 0 14.997-2.731 27.627-8.171 37.845a66.987 66.987 0 0 1-20.757 24.086 71.51 71.51 0 0 1-25.579 11.584c-11.776 2.325-28.821 3.498-51.157 3.498h-32.171v92.16H546.24z m49.344-203.008v69.334h27.008c19.435 0 32.427-1.28 38.997-3.84 6.55-2.56 11.691-6.55 15.403-11.99a32.853 32.853 0 0 0 5.59-18.986c0-8.896-2.603-16.214-7.83-22.016a34.133 34.133 0 0 0-19.84-10.838c-5.888-1.109-17.707-1.664-35.499-1.664h-23.829zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6075"></path></svg>`;
const SVG_TEXT = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484222751" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6479" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#5098F1" p-id="6480"></path><path d="M481.493 704V450.24h-90.666v-51.648h242.709v51.648h-90.39V704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="6481"></path></svg>`;
const SVG_VIDEO = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484193398" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5667" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#8183F1" p-id="5668"></path><path d="M512 341.333c106.325 0 192 86.187 192 192s-86.187 192-192 192-192-86.186-192-192 86.187-192 192-192z m-31.296 102.87a12.8 12.8 0 0 0-19.904 10.666v156.95a12.8 12.8 0 0 0 19.904 10.666l117.717-78.506a12.8 12.8 0 0 0 0-21.291l-117.717-78.507zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5669"></path></svg>`;
const SVG_WORD = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484175478" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5260" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0H646.74l291.926 295.83v681.237A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#66C7FC" p-id="5261"></path><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#3FB0EE" p-id="5262"></path><path d="M385.024 704l-72.917-305.408h63.125l46.037 209.792 55.83-209.792h73.344l53.546 213.333 46.87-213.333h62.08L638.763 704h-65.408l-60.843-228.33L451.904 704zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5263"></path></svg>`;
const SVG_XMIND = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484203239" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5937" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#EB4E53" p-id="5938"></path><path d="M412.267 394.667L277.333 424.66s0.726 78.294 148.139 114.902c0 0-163.541 40.234-134.933 132.437l117.333-19.755s0-98.773 84.33-84.885c84.331 13.163 101.206 73.173 107.073 98.048l147.392-22.677s-11.008-91.478-155.478-130.262c0 0 130.56-25.6 84.352-110.485L555.99 424.661s27.136 57.814-25.664 65.131-94.592-18.283-118.058-95.125zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5939"></path></svg>`;
const SVG_ZIP = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1595484198283" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5802" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M132.267 0h518.4l288 288v689.067A46.933 46.933 0 0 1 891.733 1024H132.267a46.933 46.933 0 0 1-46.934-46.933V46.933A46.933 46.933 0 0 1 132.267 0z" fill="#F38C12" p-id="5803"></path><path d="M426.667 0v85.333H512V0h-85.333z m0 170.667V256H512v-85.333h-85.333z m0 170.666v85.334H512v-85.334h-85.333z m85.333-256v85.334h85.333V85.333H512zM512 256v85.333h85.333V256H512z m0 170.667V512h85.333v-85.333H512zM426.667 512v170.667h170.666V512H426.667z m28.437 85.333h113.792v56.896H455.104v-56.896zM650.667 0v241.067A46.933 46.933 0 0 0 697.6 288h241.067l-288-288z" fill="#FFFFFF" p-id="5804"></path></svg>`;
const IMAGE_404 = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25px" height="23px" viewBox="0 0 25 23" version="1.1"><!-- Generator: Sketch 59 (86127) - https://sketch.com --><title>形状</title><desc>Created with Sketch.</desc><g id="页面-" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="聊天记录-全部" transform="translate(-630.000000, -504.000000)" fill="#C5D4E5" fill-rule="nonzero"><g id="输入区" transform="translate(460.500000, 65.000000)"><g id="聊天" transform="translate(21.000000, 57.000000)"><g id="Group-4" transform="translate(0.000000, 306.000000)"><g id="Group-6" transform="translate(50.500000, 22.000000)"><path d="M115.343089,60.4857235 C115.343089,61.4880836 116.155662,62.300657 117.158022,62.300657 C118.160382,62.300657 118.972956,61.4880836 118.972956,60.4857235 C118.972956,59.4833634 118.160382,58.67079 117.158022,58.67079 C116.155662,58.67079 115.343089,59.4833634 115.343089,60.4857235 L115.343089,60.4857235 Z M122.802062,55.1570787 C122.661436,54.9955729 122.46236,54.8966151 122.248709,54.8820154 L110.74929,54.0777982 C110.48502,54.0573212 110.227916,54.1698422 110.063649,54.3778672 L107.739727,57.2728878 C107.496372,57.5757527 107.503492,58.0090641 107.756667,58.3037701 L111.440578,62.5878198 L107.723595,67.4945933 L108.643161,63.1242335 C108.705387,62.8284556 108.597037,62.5227098 108.362451,62.3321158 L103.536341,58.406213 L105.543255,55.2377424 C105.705781,54.9807089 105.709936,54.6541148 105.554001,54.39303 C105.398066,54.1319451 105.108547,53.9807499 104.805182,54.0019743 L98.7505634,54.4246522 C98.5370214,54.4395331 98.3381511,54.5386828 98.1977496,54.7002656 C98.057348,54.8618484 97.9869302,55.0726122 98.0020041,55.2861406 L99.4087793,75.402057 C99.4240595,75.616038 99.5237815,75.8151664 99.6859762,75.9555738 C99.8481709,76.0959812 100.059531,76.1661479 100.273494,76.1506162 L104.722905,75.8182817 C105.167362,75.7852096 105.500503,75.3980238 105.466624,74.9543734 C105.432745,74.510723 105.048786,74.1719354 104.601909,74.2098473 L100.960749,74.481684 L100.798615,72.1496961 L103.957406,71.8326877 C104.170417,71.8114964 104.366269,71.7065053 104.501829,71.5408371 C104.63739,71.3751689 104.70154,71.1624111 104.680153,70.9494201 C104.633914,70.5069599 104.239744,70.1844247 103.796885,70.2266732 L100.686492,70.5396484 L99.6677098,55.9782353 L103.326616,55.7225313 L101.789972,58.1480891 C101.571262,58.4934105 101.645424,58.9477426 101.962592,59.2055904 L106.963742,63.2726547 L105.482757,70.3129834 C105.458801,70.4366147 105.465167,70.5642102 105.501309,70.6848431 C105.496625,70.778974 105.508642,70.8731908 105.536801,70.9631329 L106.835487,74.8591902 C106.936546,75.1634142 107.208317,75.3788038 107.527582,75.4077034 L120.713679,76.6063662 C120.929641,76.6257531 121.144336,76.5575538 121.309522,76.417093 C121.474707,76.2766322 121.576529,76.0756905 121.592107,75.8594202 L122.998075,55.7426972 C123.012827,55.5292412 122.942339,55.3186449 122.802062,55.1570787 Z M120.308747,71.0591227 L109.908775,70.0596994 C109.695255,70.0358706 109.481187,70.0995268 109.315381,70.2361533 C109.149575,70.3727799 109.046166,70.5707294 109.028733,70.7848661 C109.008287,70.99784 109.07329,71.2102124 109.20944,71.3752556 C109.345589,71.5402989 109.54173,71.6444911 109.754707,71.6649072 L120.196624,72.6683638 L120.038523,74.9253344 L108.197897,73.8484739 L107.200087,70.8558502 L113.11919,63.0411498 C113.349319,62.7383982 113.3362,62.3159043 113.087731,62.0280136 L109.416726,57.75929 L111.057426,55.7160782 L121.331563,56.4339852 L120.308747,71.0591227 L120.308747,71.0591227 Z" id="形状"/></g></g></g></g></g></g></svg>`
const IMAGE_404 = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25px" height="23px" viewBox="0 0 25 23" version="1.1"><!-- Generator: Sketch 59 (86127) - https://sketch.com --><title>形状</title><desc>Created with Sketch.</desc><g id="页面-" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="聊天记录-全部" transform="translate(-630.000000, -504.000000)" fill="#C5D4E5" fill-rule="nonzero"><g id="输入区" transform="translate(460.500000, 65.000000)"><g id="聊天" transform="translate(21.000000, 57.000000)"><g id="Group-4" transform="translate(0.000000, 306.000000)"><g id="Group-6" transform="translate(50.500000, 22.000000)"><path d="M115.343089,60.4857235 C115.343089,61.4880836 116.155662,62.300657 117.158022,62.300657 C118.160382,62.300657 118.972956,61.4880836 118.972956,60.4857235 C118.972956,59.4833634 118.160382,58.67079 117.158022,58.67079 C116.155662,58.67079 115.343089,59.4833634 115.343089,60.4857235 L115.343089,60.4857235 Z M122.802062,55.1570787 C122.661436,54.9955729 122.46236,54.8966151 122.248709,54.8820154 L110.74929,54.0777982 C110.48502,54.0573212 110.227916,54.1698422 110.063649,54.3778672 L107.739727,57.2728878 C107.496372,57.5757527 107.503492,58.0090641 107.756667,58.3037701 L111.440578,62.5878198 L107.723595,67.4945933 L108.643161,63.1242335 C108.705387,62.8284556 108.597037,62.5227098 108.362451,62.3321158 L103.536341,58.406213 L105.543255,55.2377424 C105.705781,54.9807089 105.709936,54.6541148 105.554001,54.39303 C105.398066,54.1319451 105.108547,53.9807499 104.805182,54.0019743 L98.7505634,54.4246522 C98.5370214,54.4395331 98.3381511,54.5386828 98.1977496,54.7002656 C98.057348,54.8618484 97.9869302,55.0726122 98.0020041,55.2861406 L99.4087793,75.402057 C99.4240595,75.616038 99.5237815,75.8151664 99.6859762,75.9555738 C99.8481709,76.0959812 100.059531,76.1661479 100.273494,76.1506162 L104.722905,75.8182817 C105.167362,75.7852096 105.500503,75.3980238 105.466624,74.9543734 C105.432745,74.510723 105.048786,74.1719354 104.601909,74.2098473 L100.960749,74.481684 L100.798615,72.1496961 L103.957406,71.8326877 C104.170417,71.8114964 104.366269,71.7065053 104.501829,71.5408371 C104.63739,71.3751689 104.70154,71.1624111 104.680153,70.9494201 C104.633914,70.5069599 104.239744,70.1844247 103.796885,70.2266732 L100.686492,70.5396484 L99.6677098,55.9782353 L103.326616,55.7225313 L101.789972,58.1480891 C101.571262,58.4934105 101.645424,58.9477426 101.962592,59.2055904 L106.963742,63.2726547 L105.482757,70.3129834 C105.458801,70.4366147 105.465167,70.5642102 105.501309,70.6848431 C105.496625,70.778974 105.508642,70.8731908 105.536801,70.9631329 L106.835487,74.8591902 C106.936546,75.1634142 107.208317,75.3788038 107.527582,75.4077034 L120.713679,76.6063662 C120.929641,76.6257531 121.144336,76.5575538 121.309522,76.417093 C121.474707,76.2766322 121.576529,76.0756905 121.592107,75.8594202 L122.998075,55.7426972 C123.012827,55.5292412 122.942339,55.3186449 122.802062,55.1570787 Z M120.308747,71.0591227 L109.908775,70.0596994 C109.695255,70.0358706 109.481187,70.0995268 109.315381,70.2361533 C109.149575,70.3727799 109.046166,70.5707294 109.028733,70.7848661 C109.008287,70.99784 109.07329,71.2102124 109.20944,71.3752556 C109.345589,71.5402989 109.54173,71.6444911 109.754707,71.6649072 L120.196624,72.6683638 L120.038523,74.9253344 L108.197897,73.8484739 L107.200087,70.8558502 L113.11919,63.0411498 C113.349319,62.7383982 113.3362,62.3159043 113.087731,62.0280136 L109.416726,57.75929 L111.057426,55.7160782 L121.331563,56.4339852 L120.308747,71.0591227 L120.308747,71.0591227 Z" id="形状"/></g></g></g></g></g></g></svg>`;
export const enum FileType {
Audio = "音频文件",
......@@ -46,7 +46,7 @@ const FILE_EXTENSION_VIDEO = [
"asf",
"navi",
"ts",
]
];
export const FILE_EXTENSION_IMAGE = [
"png",
......@@ -73,12 +73,12 @@ export const FILE_EXTENSION_IMAGE = [
"ai",
"raw",
"webp",
]
];
const FILE_EXTENSION_PPT = ["ppt", "pptx", "key"]
const FILE_EXTENSION_TEXT = ["txt", "md", "rtf"]
const FILE_EXTENSION_WORD = ["doc", "docx", "page"]
const FILE_EXTENSION_EXCEL = ["xls", "xlsx", "numbers"]
const FILE_EXTENSION_PPT = ["ppt", "pptx", "key"];
const FILE_EXTENSION_TEXT = ["txt", "md", "rtf"];
const FILE_EXTENSION_WORD = ["doc", "docx", "page"];
const FILE_EXTENSION_EXCEL = ["xls", "xlsx", "numbers"];
const FILE_EXTENSION_AUDIO = [
"mp3",
"cda",
......@@ -92,14 +92,14 @@ const FILE_EXTENSION_AUDIO = [
"rm",
"rmx",
"midi",
]
];
const FILE_EXTENSION_XMIND = [
"xmap",
"xmind",
"mmapmindly",
"mindnode",
"mindmaster",
]
];
const FILE_EXTENSION_COMPRESS = [
"zip",
"rar",
......@@ -110,50 +110,50 @@ const FILE_EXTENSION_COMPRESS = [
"cab",
"jar",
"uue",
]
];
export function getFileType(name: string) {
if (!name) {
return FileType.Others
return FileType.Others;
}
const splits = name.split(".")
const extension = splits[splits.length - 1].toLowerCase()
const splits = name.split(".");
const extension = splits[splits.length - 1].toLowerCase();
if (FILE_EXTENSION_VIDEO.some((i) => i === extension)) {
return FileType.Video
return FileType.Video;
}
if (FILE_EXTENSION_IMAGE.some((i) => i === extension)) {
return FileType.Image
return FileType.Image;
}
if (FILE_EXTENSION_AUDIO.some((i) => i === extension)) {
return FileType.Audio
return FileType.Audio;
}
if (FILE_EXTENSION_PPT.some((i) => i === extension)) {
return FileType.Ppt
return FileType.Ppt;
}
if (FILE_EXTENSION_TEXT.some((i) => i === extension)) {
return FileType.Txt
return FileType.Txt;
}
if (FILE_EXTENSION_WORD.some((i) => i === extension)) {
return FileType.Word
return FileType.Word;
}
if (FILE_EXTENSION_EXCEL.some((i) => i === extension)) {
return FileType.Excel
return FileType.Excel;
}
if (FILE_EXTENSION_XMIND.some((i) => i === extension)) {
return FileType.Xmind
return FileType.Xmind;
}
if (FILE_EXTENSION_COMPRESS.some((i) => i === extension)) {
return FileType.Zip
return FileType.Zip;
}
if (extension === "rp") {
return FileType.Rp
return FileType.Rp;
}
if (extension === "pdf") {
return FileType.Pdf
return FileType.Pdf;
}
return FileType.Others
return FileType.Others;
}
const type2SvgMapping = new Map<FileType, () => string>([
......@@ -170,36 +170,36 @@ const type2SvgMapping = new Map<FileType, () => string>([
[FileType.Video, () => SVG_VIDEO],
[FileType.Word, () => SVG_WORD],
[FileType.Image_404, () => IMAGE_404],
])
]);
export function getSvg(type: FileType) {
const action = type2SvgMapping.get(type)
return (action && action()) || ""
const action = type2SvgMapping.get(type);
return (action && action()) || "";
}
export function isAudio(name: string) {
return name && FILE_EXTENSION_AUDIO.some((i) => name.endsWith(i))
return name && FILE_EXTENSION_AUDIO.some((i) => name.endsWith(i));
}
export function isVideo(name: string) {
return name && FILE_EXTENSION_VIDEO.some((i) => name.endsWith(i))
return name && FILE_EXTENSION_VIDEO.some((i) => name.endsWith(i));
}
export function isImage(name: string) {
return name && FILE_EXTENSION_IMAGE.some((i) => name.endsWith(i))
return name && FILE_EXTENSION_IMAGE.some((i) => name.endsWith(i));
}
/**
* 最大图片文件大小
*/
export const MAX_IMAGE_SIZE = 5 * 1024 * 1024
export const MAX_IMAGE_SIZE_STRING = "5MB"
export const MESSAGE_IMAGE_TOO_LARGE = `您发送的图片大小超过 ${MAX_IMAGE_SIZE_STRING}。`
export const MESSAGE_FILE_EMPTY = "不能发送空文件。"
export const MAX_IMAGE_SIZE = 5 * 1024 * 1024;
export const MAX_IMAGE_SIZE_STRING = "5MB";
export const MESSAGE_IMAGE_TOO_LARGE = `您发送的图片大小超过 ${MAX_IMAGE_SIZE_STRING}。`;
export const MESSAGE_FILE_EMPTY = "不能发送空文件。";
/**
* 最大文件大小
*/
export const MAX_FILE_SIZE = 20 * 1024 * 1024
export const MAX_FILE_SIZE_STRING = "20MB"
export const MESSAGE_FILE_TOO_LARGE = `您发送的文件大小超过 ${MAX_FILE_SIZE_STRING}。`
export const MAX_FILE_SIZE = 20 * 1024 * 1024;
export const MAX_FILE_SIZE_STRING = "20MB";
export const MESSAGE_FILE_TOO_LARGE = `您发送的文件大小超过 ${MAX_FILE_SIZE_STRING}。`;
import type { UniplatSdk } from "uniplat-sdk"
import type { UniplatSdk } from "uniplat-sdk";
export interface Chat {
chat_id: number
title: string
service_id: number
create_time: number
update_time: number
start_time: number
end_time: number
is_finish: boolean
msg_id: number
last_cs_eid: string
first_cs_eid: string
last_msg_eid: string
last_msg_name: string
last_msg_ts: number
last_online_time: number
msg_type: string
msg: string
customer_name: string
customer_mobile: string
customer_avatar_url: string
customer_online: boolean
customer_eid: string
origin: string
unread_msg_count: number
chat_id: number;
title: string;
service_id: number;
create_time: number;
update_time: number;
start_time: number;
end_time: number;
is_finish: boolean;
msg_id: number;
last_cs_eid: string;
first_cs_eid: string;
last_msg_eid: string;
last_msg_name: string;
last_msg_ts: number;
last_online_time: number;
msg_type: string;
msg: string;
customer_name: string;
customer_mobile: string;
customer_avatar_url: string;
customer_online: boolean;
customer_eid: string;
origin: string;
unread_msg_count: number;
}
export type TokenStringGetter = () => Promise<string>
......@@ -33,174 +33,174 @@ export interface ChatOption {
/**
* 企业token [商户端使用,用户端和移动端不需要]
*/
enterpriseTokenString?: TokenStringGetter
enterpriseTokenString?: TokenStringGetter;
/**
* 个人token
*/
userTokenString: TokenStringGetter
userTokenString: TokenStringGetter;
/**
* 长链接chat sdk地址
*/
webSocketUri: string
webSocketUri: string;
sdk: () => UniplatSdk
sdk: () => UniplatSdk;
orgId: () => string | number
orgId: () => string | number;
logger?: ChatServiceLogger
logger?: ChatServiceLogger;
}
export interface ChatServiceLogger {
enabled: boolean
debug(message?: any, ...optionalParams: any[]): void
info(message?: any, ...optionalParams: any[]): void
error(message?: any, ...optionalParams: any[]): void
enabled: boolean;
debug(message?: any, ...optionalParams: any[]): void;
info(message?: any, ...optionalParams: any[]): void;
error(message?: any, ...optionalParams: any[]): void;
}
export type ChatListRequestList = {
list: Chat[]
total: number
list: Chat[];
total: number;
}
export interface Message {
at_id: string
chat_id: number
create_time: number
eid: string
id: number
is_open: boolean
is_read: boolean
like: boolean
like_count: number
msg: string
oid: string
read_count: number
ref_id: number
status: number
total_read_count: number
ts: number
type: "text" | "image" | "file" | "video" | "voice"
update_time: number
url: string
at_id: string;
chat_id: number;
create_time: number;
eid: string;
id: number;
is_open: boolean;
is_read: boolean;
like: boolean;
like_count: number;
msg: string;
oid: string;
read_count: number;
ref_id: number;
status: number;
total_read_count: number;
ts: number;
type: "text" | "image" | "file" | "video" | "voice";
update_time: number;
url: string;
}
export type MessageRequestResult = readonly Message[]
export interface CreateChatByServicemanRequestResult {
id: number
org_id: string
uid: string
oid: string
eid: string
type: string
title: string
app_id: string
tag: string
msg_id: number
ext: string
exit_msg_id: number
is_exited: boolean
dnd: number
is_top: boolean
label: string
join_msg_id: number
last_read_msg_id: number
biz_id: string
business_data: string
is_finish: boolean
is_deleted: boolean
is_remove: boolean
member_type: number
ref_id: number
unread_msg_count: number
at_me: boolean
at_all: boolean
last_login_oid: string
owner_oid: string
owner_eid: string
is_act: boolean
create_time: number
update_time: number
last_msg_ts: number
members_updated: number
user_updated: number
id: number;
org_id: string;
uid: string;
oid: string;
eid: string;
type: string;
title: string;
app_id: string;
tag: string;
msg_id: number;
ext: string;
exit_msg_id: number;
is_exited: boolean;
dnd: number;
is_top: boolean;
label: string;
join_msg_id: number;
last_read_msg_id: number;
biz_id: string;
business_data: string;
is_finish: boolean;
is_deleted: boolean;
is_remove: boolean;
member_type: number;
ref_id: number;
unread_msg_count: number;
at_me: boolean;
at_all: boolean;
last_login_oid: string;
owner_oid: string;
owner_eid: string;
is_act: boolean;
create_time: number;
update_time: number;
last_msg_ts: number;
members_updated: number;
user_updated: number;
}
export type ChatMemberExtraInfo = {
name?: string
phone?: string
name?: string;
phone?: string;
}
export interface ChatMember {
at_all: boolean
at_me: boolean
chat_id: number
create_time: number
dnd: number
eid: string
exit_msg_id: number
id: number
is_act: boolean
is_exited: boolean
is_remove: boolean
is_top: boolean
join_msg_id: number
label: string
nickname: string
oid: string
org_id: string
type: number
uid: string
unread_msg_count: number
update_time: number
at_all: boolean;
at_me: boolean;
chat_id: number;
create_time: number;
dnd: number;
eid: string;
exit_msg_id: number;
id: number;
is_act: boolean;
is_exited: boolean;
is_remove: boolean;
is_top: boolean;
join_msg_id: number;
label: string;
nickname: string;
oid: string;
org_id: string;
type: number;
uid: string;
unread_msg_count: number;
update_time: number;
}
export type ChatMembers = readonly ChatMember[]
export interface ServiceMan {
id: number
oid: string
eid: string
is_deleted: boolean
delete_time: number
delete_eid: string
service_id: number
type: number
name: string
mobile: string
email: string
description: string
avatar_url: string
create_time: number
update_time: number
chat_count: number
status: number
id: number;
oid: string;
eid: string;
is_deleted: boolean;
delete_time: number;
delete_eid: string;
service_id: number;
type: number;
name: string;
mobile: string;
email: string;
description: string;
avatar_url: string;
create_time: number;
update_time: number;
chat_count: number;
status: number;
}
export type AllServiceMan = ServiceMan[]
export interface OneWhoReadMessage {
create_time: number
eid: string
id: number
is_read: boolean
like: boolean
like_time: number
oid: string
owner_id: number
read_time: number
target_id: number
type: number
uid: string
create_time: number;
eid: string;
id: number;
is_read: boolean;
like: boolean;
like_time: number;
oid: string;
owner_id: number;
read_time: number;
target_id: number;
type: number;
uid: string;
}
export interface GetAllChatListParams {
service_id: number
user_info?: string
origin?: string
user_id?: string
is_finish?: boolean | -1 | number
chat_update_time_start?: string
chat_update_time_end?: string
page?: number
page_size?: number
last_cs_eid?: string | number
service_id: number;
user_info?: string;
origin?: string;
user_id?: string;
is_finish?: boolean | -1 | number;
chat_update_time_start?: string;
chat_update_time_end?: string;
page?: number;
page_size?: number;
last_cs_eid?: string | number;
}
import { TokenStringGetter } from "../model"
import { invokeGet } from "./request"
import { TokenStringGetter } from "../model";
import { invokeGet } from "./request";
export class EmojiService {
private static ready = false
......@@ -11,39 +12,39 @@ export class EmojiService {
this.url =
process.env.NODE_ENV === "production"
? "https://file.teammix.com"
: ""
: "";
}
public async getEmoji() {
const token = await EmojiService.token()
const token = await EmojiService.token();
return invokeGet<{
type: string
type: string;
list: {
code: string
name: string
emoji_chars: string
}[]
}>(`${this.url}/v1/emoji/list?type=chat`, token)
code: string;
name: string;
emoji_chars: string;
}[];
}>(`${this.url}/v1/emoji/list?type=chat`, token);
}
public static onReady(callback: () => void) {
if (EmojiService.ready) {
callback()
callback();
} else {
EmojiService.beforeReadyCacheAction.push(callback)
EmojiService.beforeReadyCacheAction.push(callback);
}
}
private static fireBeforeReadyAction() {
for (const item of EmojiService.beforeReadyCacheAction) {
item()
item();
}
EmojiService.beforeReadyCacheAction = []
EmojiService.beforeReadyCacheAction = [];
}
public static raiseOnReady(token: TokenStringGetter) {
EmojiService.ready = true
EmojiService.token = token
EmojiService.fireBeforeReadyAction()
EmojiService.ready = true;
EmojiService.token = token;
EmojiService.fireBeforeReadyAction();
}
}
import Axios from "axios"
import qs from "qs"
import Axios from "axios";
import qs from "qs";
export function buildConfig(token: string, url: string) {
if (url && url.includes("/general")) {
return { headers: { Authorization: token, CurrentOrg: this.station } }
return { headers: { Authorization: token, CurrentOrg: this.station } };
}
return { headers: { Authorization: token } }
return { headers: { Authorization: token } };
}
export function invokeGet<T>(url: string, token: string) {
return new Promise<T>((resolve, reject) => {
Axios.get(url, buildConfig(token, url))
.then((r) => {
if (r?.data?.data !== undefined) {
return resolve(r.data.data as T)
return resolve(r.data.data as T);
}
reject(r)
reject(r);
})
.catch(reject)
})
.catch(reject);
});
}
export const enum DataType {
......@@ -32,21 +32,21 @@ export function invokePost<T>(
data: any,
dataType = DataType.Json
): Promise<T> {
let postData: any = null
let postData: any = null;
if (dataType === DataType.Qs) {
postData = qs.stringify(data)
postData = qs.stringify(data);
} else {
postData = data
postData = data;
}
return new Promise<T>((resolve, reject) => {
Axios.post(url, postData, buildConfig(token, url))
.then((r) => {
if (r?.data?.data !== undefined) {
return resolve(r.data.data as T)
return resolve(r.data.data as T);
}
reject(r)
reject(r);
})
.catch(reject)
})
.catch(reject);
});
}
export function isAccessibleUrl(url: string) {
return url && (url.startsWith("blob") || url.startsWith("http"))
return url && (url.startsWith("blob") || url.startsWith("http"));
}
import Vue from "vue"
import { invokePost } from "./request"
import Axios from "axios"
import tokenManager from "../xim/token"
const orgId = () => Vue.prototype.global.org?.id ?? "0"
import Axios from "axios";
import Vue from "vue";
import tokenManager from "../xim/token";
import { invokePost } from "./request";
const orgId = () => Vue.prototype.global.org?.id ?? "0";
export async function uploadFile(
file: File,
chatId: number,
width?: number,
height?: number
) {
const splits = file.name.split(".")
const splits = file.name.split(".");
const parameter = {
file_name: file.name,
size: file.size,
......@@ -18,30 +20,30 @@ export async function uploadFile(
owner_id: chatId,
org_id: orgId(),
ext_type: splits[splits.length - 1],
}
};
if (width && height) {
Object.assign(parameter, { width, height })
Object.assign(parameter, { width, height });
}
const token = await invokePost<{
url_id: string
sign: string
domain: string
file_name: string
id: number
}>("/xchat/personal/upload_token", await tokenManager.getToken(), parameter)
url_id: string;
sign: string;
domain: string;
file_name: string;
id: number;
}>("/xchat/personal/upload_token", await tokenManager.getToken(), parameter);
const uri = `${token.domain}/gw/file/upload`
const form = new FormData()
form.append("file", file)
form.append("fileId", token.url_id)
form.append("fileSize", file.size.toString())
form.append("orgId", orgId())
form.append("sign", token.sign)
const uri = `${token.domain}/gw/file/upload`;
const form = new FormData();
form.append("file", file);
form.append("fileId", token.url_id);
form.append("fileSize", file.size.toString());
form.append("orgId", orgId());
form.append("sign", token.sign);
const result = await Axios.post(uri, form, {
headers: { "Content-Type": "multipart/form-data" },
})
});
if (result && result.data && result.data.errcode === 0) {
return token.url_id
return token.url_id;
}
return ""
return "";
}
import { Module } from "vuex"
import { RootStoreState } from "@/store/model"
import { ChatMember } from "../model"
import { ChatStore, ChatStoreState, ChatStatus, ChatMemberType } from "./model"
import xim, { ChatNotifyListener } from "../xim/xim"
import { unique } from "../utils"
import Chat from "../xim"
import { decode } from "../utils/jwt"
import chatType from "../xim/chat-type"
import { isAccessibleUrl } from "../service/tools"
import chat from "../xim/"
import { Module } from "vuex";
export const ns = ChatStore.ns
import { ChatMember } from "../model";
import { isAccessibleUrl } from "../service/tools";
import { unique } from "../utils";
import { decode } from "../utils/jwt";
import Chat from "../xim";
import chat from "../xim/";
import chatType from "../xim/chat-type";
import xim, { ChatNotifyListener } from "../xim/xim";
const sdk = chat.getSdk
const UniplatChatModelName = "UniplatChat"
const model = () => sdk().model(UniplatChatModelName)
const orgId = chat.getOrgId
import { ChatMemberType, ChatStatus, ChatStore, ChatStoreState } from "./model";
import { RootStoreState } from "@/store/model";
export const ns = ChatStore.ns;
const sdk = chat.getSdk;
const UniplatChatModelName = "UniplatChat";
const model = () => sdk().model(UniplatChatModelName);
const orgId = chat.getOrgId;
const getMyinfo = (function () {
let data
let data;
return async () => {
if (data != null) return data
data = sdk().getUserInfo()
return data
}
})()
if (data != null) return data;
data = sdk().getUserInfo();
return data;
};
})();
function uniqueMessages(
messages: NonNullable<ChatStore.STATE_CHAT_MSG_HISTORY>
) {
const arr = [...messages]
const arr = [...messages];
return unique(arr, function (item, all) {
return all.findIndex((k) => k.id === item.id)
})
return all.findIndex((k) => k.id === item.id);
});
}
function filterMessages(
messages: NonNullable<ChatStore.STATE_CHAT_MSG_HISTORY>,
......@@ -38,35 +41,35 @@ function filterMessages(
) {
return uniqueMessages(Array.from(messages)).filter(
(k) => k.chat_id === chatid
)
);
}
const removeRegisterChatEvents: (() => void)[] = []
const removeRegisterChatEvents: (() => void)[] = [];
async function preCacheImgs(msgs: any[]) {
await Promise.all(
msgs.map((k) => {
return new Promise((done: (p: void) => void) => {
if (k.type === "image") {
const msg = JSON.parse(k.msg)
const url = msg.url
const msg = JSON.parse(k.msg);
const url = msg.url;
if (!isAccessibleUrl(url)) {
done()
done();
}
if (url && isAccessibleUrl(url)) {
const preCache = new Image()
preCache.src = url
preCache.onload = () => done()
setTimeout(done, 2000)
const preCache = new Image();
preCache.src = url;
preCache.onload = () => done();
setTimeout(done, 2000);
} else {
done()
done();
}
} else {
done()
done();
}
})
});
})
)
);
}
export default {
namespaced: true,
......@@ -90,121 +93,121 @@ export default {
}),
mutations: {
[ChatStore.MUTATION_SHOW_CHAT](state) {
state[ChatStore.STATE_CHAT_DIALOG_VISIBLE] = true
state[ChatStore.STATE_CHAT_DIALOG_VISIBLE] = true;
},
[ChatStore.MUTATION_HIDE_CHAT](state) {
state[ChatStore.STATE_CHAT_DIALOG_VISIBLE] = false
state[ChatStore.STATE_CHAT_DIALOG_VISIBLE] = false;
},
[ChatStore.MUTATION_SHOW_CHAT_CREATOR](state) {
state[ChatStore.STATE_CHAT_CREATOR_VISIBLE] = true
state[ChatStore.STATE_CHAT_CREATOR_VISIBLE] = true;
},
[ChatStore.MUTATION_HIDE_CHAT_CREATOR](state) {
state[ChatStore.STATE_CHAT_CREATOR_VISIBLE] = false
state[ChatStore.STATE_CHAT_CREATOR_VISIBLE] = false;
},
[ChatStore.MUTATION_SAVE_CHAT_LIST](
state,
data: ChatStore.STATE_MY_CHAT_ROOM_LIST
) {
state[ChatStore.STATE_MY_CHAT_ROOM_LIST] = data
state[ChatStore.STATE_MY_CHAT_ROOM_LIST] = data;
},
[ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY](state) {
state[ChatStore.STATE_CHAT_MSG_HISTORY] = null
state[ChatStore.STATE_CHAT_MSG_HISTORY] = null;
},
[ChatStore.MUTATION_CLEAR_CURRENT_CHAT_ID](state) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID] = null
state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID] = null;
},
[ChatStore.MUTATION_SAVE_CURRENT_CHAT_ID](
state,
id: ChatStore.STATE_CHAT_CURRENT_CHAT_ID
) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID] = Number(id)
state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID] = Number(id);
},
[ChatStore.MUTATION_CLEAR_CURRENT_CHAT_VERSION](state) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION] = null
state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION] = null;
},
[ChatStore.MUTATION_SAVE_CURRENT_CHAT_VERSION](
state,
v: ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION
) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION] = v
state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION] = v;
},
[ChatStore.MUTATION_CLEAR_CURRENT_CHAT_UNIPLAT_ID](state) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID] = null
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID] = null;
},
[ChatStore.MUTATION_SAVE_CURRENT_CHAT_UNIPLAT_ID](
state,
id: ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID
) {
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID] = id
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID] = id;
},
[ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY](
state,
data: ChatStore.STATE_CHAT_MSG_HISTORY
) {
const old = state[ChatStore.STATE_CHAT_MSG_HISTORY] || []
const chatid = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatid == null) return
const old = state[ChatStore.STATE_CHAT_MSG_HISTORY] || [];
const chatid = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatid == null) return;
state[ChatStore.STATE_CHAT_MSG_HISTORY] = Object.freeze(
filterMessages([...old, ...(data || [])], chatid)
)
);
},
[ChatStore.MUTATION_SAVE_MYSELF_ID](state) {
Chat.getToken().then((token) => {
const eid = decode(token)
state[ChatStore.STATE_CHAT_MY_ID] = eid.eid || eid.sub
state[ChatStore.STATE_CHAT_MY_UID] = eid.sub
})
const eid = decode(token);
state[ChatStore.STATE_CHAT_MY_ID] = eid.eid || eid.sub;
state[ChatStore.STATE_CHAT_MY_UID] = eid.sub;
});
},
[ChatStore.MUTATION_CLEAR_MYSELF_ID](state) {
state[ChatStore.STATE_CHAT_MY_ID] = null
state[ChatStore.STATE_CHAT_MY_UID] = null
state[ChatStore.STATE_CHAT_MY_ID] = null;
state[ChatStore.STATE_CHAT_MY_UID] = null;
},
[ChatStore.MUTATION_SET_CHAT_SOURCE](
state,
data: ChatStore.STATE_CHAT_SOURCE
) {
state[ChatStore.STATE_CHAT_SOURCE] = data
state[ChatStore.STATE_CHAT_SOURCE] = data;
},
[ChatStore.MUTATION_UNSHIFT_CHAT_MSG_HISTORY](
state,
data: ChatStore.STATE_CHAT_MSG_HISTORY
) {
const old = state[ChatStore.STATE_CHAT_MSG_HISTORY] || []
const chatid = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatid == null) return
const old = state[ChatStore.STATE_CHAT_MSG_HISTORY] || [];
const chatid = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatid == null) return;
state[ChatStore.STATE_CHAT_MSG_HISTORY] = Object.freeze(
filterMessages([...(data || []), ...old], chatid)
)
);
},
[ChatStore.MUTATION_SAVE_CURRENT_CHAT_MEMBERS](
state,
data: ChatStore.STATE_CURRENT_CHAT_MEMBERS
) {
state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] = Object.freeze(data)
state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] = Object.freeze(data);
},
[ChatStore.MUTATION_CLEAR_CURRENT_CHAT_MEMBERS](state) {
state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] = null
state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] = null;
},
[ChatStore.MUTATION_SAVE_CHAT_TITLE](
state,
data: ChatStore.STATE_CURRENT_CHAT_TITLE
) {
state[ChatStore.STATE_CURRENT_CHAT_TITLE] = data
state[ChatStore.STATE_CURRENT_CHAT_TITLE] = data;
},
[ChatStore.MUTATION_CLEAR_CHAT_TITLE](state) {
state[ChatStore.STATE_CURRENT_CHAT_TITLE] = ""
state[ChatStore.STATE_CURRENT_CHAT_TITLE] = "";
},
[ChatStore.MUTATION_SCROLL_TO_BOTTOM](state) {
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]()
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]();
},
[ChatStore.MUTATION_SAVE_FUNC_SCROLL_TO_BOTTOM](
state,
data: ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM
) {
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM] = data
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM] = data;
},
[ChatStore.MUTATION_CLEAR_FUNC_SCROLL_TO_BOTTOM](state) {
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM] = () => true
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM] = () => true;
},
[ChatStore.MUTATION_APPEND_SENDING_MESSAGE]: (
state,
......@@ -212,15 +215,15 @@ export default {
) => {
const current = state[
ChatStore.STATE_CHAT_SENDING_MESSAGES
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[]
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[];
if (current) {
current.push(payload)
current.push(payload);
}
preCacheImgs([payload]).then(() => {
setTimeout(() => {
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]()
}, 100)
})
state[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]();
}, 100);
});
},
[ChatStore.MUTATION_REMOVE_SENDING_MESSAGE]: (
state,
......@@ -228,12 +231,12 @@ export default {
) => {
const current = state[
ChatStore.STATE_CHAT_SENDING_MESSAGES
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[]
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[];
if (current) {
const target = current.find((i) => i.id === payload)
const target = current.find((i) => i.id === payload);
if (target) {
const index = current.indexOf(target)
current.splice(index, 1)
const index = current.indexOf(target);
current.splice(index, 1);
}
}
},
......@@ -243,46 +246,46 @@ export default {
) => {
const current = state[
ChatStore.STATE_CHAT_SENDING_MESSAGES
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[]
] as ChatStore.STATE_CHAT_SENDING_MESSAGE[];
if (current) {
const target = current.find((i) => i.id === payload)
const target = current.find((i) => i.id === payload);
if (target) {
target.status = -1
target.status = -1;
}
state[ChatStore.STATE_CHAT_SENDING_MESSAGES] = [...current]
state[ChatStore.STATE_CHAT_SENDING_MESSAGES] = [...current];
}
},
[ChatStore.MUTATION_SAVE_CURRENT_CHAT_INPUTING]: (function () {
const setTimeoutId: { [key: string]: number } = {}
const setTimeoutId: { [key: string]: number } = {};
return (
state: ChatStoreState,
payload: Parameters<ChatStore.MUTATION_SAVE_CURRENT_CHAT_INPUTING>[0]
) => {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
if (payload.chat_id !== chatId) return
const arr = state[ChatStore.STATE_CURRENT_CHAT_INPUTING]
const eid = payload.eid
if (eid === state[ChatStore.STATE_CHAT_MY_ID]) return
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
if (payload.chat_id !== chatId) return;
const arr = state[ChatStore.STATE_CURRENT_CHAT_INPUTING];
const eid = payload.eid;
if (eid === state[ChatStore.STATE_CHAT_MY_ID]) return;
if (arr.includes(eid)) {
window.clearTimeout(setTimeoutId[eid])
window.clearTimeout(setTimeoutId[eid]);
} else {
arr.push(eid)
arr.push(eid);
}
setTimeoutId[eid] = window.setTimeout(() => {
arr.splice(arr.indexOf(eid), 1)
}, 4000)
}
arr.splice(arr.indexOf(eid), 1);
}, 4000);
};
})(),
[ChatStore.MUTATION_CLEAR_CURRENT_CHAT_INPUTING]: (state) => {
state[ChatStore.STATE_CURRENT_CHAT_INPUTING] = []
state[ChatStore.STATE_CURRENT_CHAT_INPUTING] = [];
},
[ChatStore.MUTATION_INITING_CHAT]: (state) => {
state[ChatStore.STATE_CURRENT_CHAT_INITING] = true
state[ChatStore.STATE_CURRENT_CHAT_INITING] = true;
},
[ChatStore.MUTATION_INITING_CHAT_DONE]: (state) => {
state[ChatStore.STATE_CURRENT_CHAT_INITING] = false
state[ChatStore.STATE_CURRENT_CHAT_INITING] = false;
},
},
actions: {
......@@ -293,7 +296,7 @@ export default {
const { pageData } = await model().list().query({
pageIndex: 1,
item_size: 50,
})
});
const result = pageData.rows
.map((row) => {
return {
......@@ -305,13 +308,13 @@ export default {
uniplat_version: Number(row.uniplat_version.value),
msg_type: row.LastMsgType.value,
is_finish: row.Status.value,
}
};
})
.filter((k) => !k.is_finish)
.filter((k) => !k.is_finish);
commit(ChatStore.MUTATION_SAVE_CHAT_LIST, {
list: result,
total: pageData.record_count,
})
});
},
async [ChatStore.ACTION_JOIN_CHAT](
{ commit },
......@@ -320,46 +323,46 @@ export default {
// return await XimService.getInstance().joinChat(chatId)
},
async [ChatStore.ACTION_GET_CHAT_MESSAGES]({ state, commit }) {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
try {
const data = await xim.queryLastPageMsg(chatType, chatId, 20)
commit(ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY, data)
await preCacheImgs(data)
commit(ChatStore.MUTATION_SCROLL_TO_BOTTOM)
return data
const data = await xim.queryLastPageMsg(chatType, chatId, 20);
commit(ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY, data);
await preCacheImgs(data);
commit(ChatStore.MUTATION_SCROLL_TO_BOTTOM);
return data;
} catch (error) {
console.error(error)
console.error(error);
}
},
async [ChatStore.ACTION_GET_CHAT_MESSAGES_BEFORE_SPECIFIC_ID](
{ state, commit },
msgId: Parameters<ChatStore.ACTION_GET_CHAT_MESSAGES_BEFORE_SPECIFIC_ID>[0]
) {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
const data = await xim.queryPrevPageMsg(chatType, chatId, msgId, 10)
commit(ChatStore.MUTATION_UNSHIFT_CHAT_MSG_HISTORY, data)
return data
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
const data = await xim.queryPrevPageMsg(chatType, chatId, msgId, 10);
commit(ChatStore.MUTATION_UNSHIFT_CHAT_MSG_HISTORY, data);
return data;
},
async [ChatStore.ACTION_GET_CHAT_MESSAGES_AFTER_SPECIFIC_ID](
{ state, commit },
msgId: Parameters<ChatStore.ACTION_GET_CHAT_MESSAGES_AFTER_SPECIFIC_ID>[0]
) {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
const data = await xim.queryNextPageMsg(chatType, chatId, msgId, 10)
commit(ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY, data)
return data
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
const data = await xim.queryNextPageMsg(chatType, chatId, msgId, 10);
commit(ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY, data);
return data;
},
async [ChatStore.ACTION_SEND_MESSAGE](
{ state, dispatch },
params: Parameters<ChatStore.ACTION_SEND_MESSAGE>[0]
) {
const uniplatId =
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID]
const version = state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION]
if (uniplatId == null) return
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID];
const version = state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION];
if (uniplatId == null) return;
try {
const data = await model()
.action("sendMsg")
......@@ -372,11 +375,11 @@ export default {
LastMsgType: params.msgType,
LastMsgContent: params.msg,
})
.dryExecute()
await dispatch(ChatStore.ACTION_GET_FRESH_MESSAGE)
return data
.dryExecute();
await dispatch(ChatStore.ACTION_GET_FRESH_MESSAGE);
return data;
} catch (error) {
console.error("testing 信息发送失败", error)
console.error("testing 信息发送失败", error);
}
},
async [ChatStore.ACTION_GET_FRESH_MESSAGE]({
......@@ -384,191 +387,191 @@ export default {
dispatch,
commit,
}) {
const msgs = state[ChatStore.STATE_CHAT_MSG_HISTORY]
let newMsgsArr
const msgs = state[ChatStore.STATE_CHAT_MSG_HISTORY];
let newMsgsArr;
if (msgs == null || msgs.length === 0) {
newMsgsArr = await dispatch(ChatStore.ACTION_GET_CHAT_MESSAGES)
newMsgsArr = await dispatch(ChatStore.ACTION_GET_CHAT_MESSAGES);
} else {
newMsgsArr = await dispatch(
ChatStore.ACTION_GET_CHAT_MESSAGES_AFTER_SPECIFIC_ID,
msgs[msgs.length - 1].id
)
);
}
const lastMsg = newMsgsArr[newMsgsArr.length - 1]
await preCacheImgs(newMsgsArr)
commit(ChatStore.MUTATION_SCROLL_TO_BOTTOM)
const lastMsg = newMsgsArr[newMsgsArr.length - 1];
await preCacheImgs(newMsgsArr);
commit(ChatStore.MUTATION_SCROLL_TO_BOTTOM);
},
async [ChatStore.ACTION_CREATE_NEW_CHAT_BY_SERVICE_MAN](
{ state, commit, dispatch },
params: Parameters<ChatStore.ACTION_CREATE_NEW_CHAT_BY_SERVICE_MAN>[0]
) {
const myId = "1" /* (await getMyinfo()).id */
const action = sdk().model(UniplatChatModelName).action("insert")
const myId = "1"; /* (await getMyinfo()).id */
const action = sdk().model(UniplatChatModelName).action("insert");
action.addInputs_parameter({
OrgId: orgId(),
ModelName: params.modelName,
ObjId: +params.selectedListId,
Creator: myId,
Status: ChatStatus.opening,
})
});
const detailManager = await action.getDetailParametersManagerByName(
"UniplatChatMember"
)
);
detailManager.add({
OrgId: orgId(),
Uid: myId,
type: ChatMemberType.member,
})
});
params.uids.forEach((id) => {
detailManager.add({
OrgId: orgId(),
Uid: id,
type: ChatMemberType.member,
})
})
detailManager.done()
const { id } = await action.dryExecute()
//无法得到chat id
});
});
detailManager.done();
const { id } = await action.dryExecute();
// 无法得到chat id
const data = await sdk()
.model(UniplatChatModelName)
.action("createXimChat")
.updateInitialParams({
selected_list: [{ v: 0, id }],
})
.dryExecute()
commit(ChatStore.MUTATION_HIDE_CHAT_CREATOR)
await dispatch(ChatStore.ACTION_GET_MY_CHAT_LIST)
.dryExecute();
commit(ChatStore.MUTATION_HIDE_CHAT_CREATOR);
await dispatch(ChatStore.ACTION_GET_MY_CHAT_LIST);
const newChat = state[ChatStore.STATE_MY_CHAT_ROOM_LIST].list.find(
(k) => k.uniplatId === id
)
commit(ChatStore.MUTATION_SHOW_CHAT)
);
commit(ChatStore.MUTATION_SHOW_CHAT);
await dispatch(ChatStore.ACTION_SAVE_CURRENT_CHAT_ID_VERSION, {
chatId: newChat.chat_id,
v: newChat.uniplat_version,
uniplatId: newChat.uniplatId,
})
});
},
async [ChatStore.ACTION_CREATE_NEW_CHAT_BY_CLIENT_SIDE](
{ commit, dispatch },
option: {
customerServiceId?: number | string
customerServiceGroupId?: number
customerServiceId?: number | string;
customerServiceGroupId?: number;
}
) {},
async [ChatStore.ACTION_REGISTER_EVENT]({ dispatch, commit, state }) {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
const onNewMsg = () => {
dispatch(ChatStore.ACTION_GET_FRESH_MESSAGE)
}
dispatch(ChatStore.ACTION_GET_FRESH_MESSAGE);
};
const onMsgRead: ChatNotifyListener = async (e) => {
if (
process.env.VUE_APP_API_CLIENT_ID !==
"teamix-fast-service-merchant"
) {
return
return;
}
console.log("事件消息已读", e)
if (chatId !== e.chat_id) return
const msgs = state[ChatStore.STATE_CHAT_MSG_HISTORY]
if (msgs == null) return
const oldestMsgId = msgs[0].id - 1
const lastMsgId = msgs[msgs.length - 1].id + 1
console.log("事件消息已读", e);
if (chatId !== e.chat_id) return;
const msgs = state[ChatStore.STATE_CHAT_MSG_HISTORY];
if (msgs == null) return;
const oldestMsgId = msgs[0].id - 1;
const lastMsgId = msgs[msgs.length - 1].id + 1;
const freshMsgs = await xim.queryMsgs(
chatType,
chatId,
oldestMsgId < 1 ? 1 : oldestMsgId,
lastMsgId
)
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY)
);
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY);
commit(
ChatStore.MUTATION_PUSH_CHAT_MSG_HISTORY,
msgs.map((msg) => {
msg = { ...msg }
msg = { ...msg };
const newMsg = freshMsgs.find(
(freshMsg) => freshMsg.id === msg.id
)
);
if (newMsg != null) {
msg.read_count = newMsg.read_count
msg.read_count = newMsg.read_count;
}
return msg
return msg;
})
)
}
);
};
const onInputing: ChatNotifyListener = (e) => {
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_INPUTING, e)
}
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_INPUTING, e);
};
removeRegisterChatEvents.push(() => {
xim.off("msg", chatId, onNewMsg)
xim.off("chat_notify", "read", onMsgRead)
xim.off("chat_notify", "user.input", onInputing)
})
xim.on("msg", chatId, onNewMsg)
xim.on("chat_notify", "read", onMsgRead)
xim.on("chat_notify", "user.input", onInputing)
xim.off("msg", chatId, onNewMsg);
xim.off("chat_notify", "read", onMsgRead);
xim.off("chat_notify", "user.input", onInputing);
});
xim.on("msg", chatId, onNewMsg);
xim.on("chat_notify", "read", onMsgRead);
xim.on("chat_notify", "user.input", onInputing);
},
async [ChatStore.ACTION_SAVE_CURRENT_CHAT_ID_VERSION](
{ commit, dispatch },
params: Parameters<ChatStore.ACTION_SAVE_CURRENT_CHAT_ID_VERSION>[0]
) {
const { chatId, v, uniplatId } = params
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY)
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_ID, chatId)
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_VERSION, v)
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_UNIPLAT_ID, uniplatId)
commit(ChatStore.MUTATION_INITING_CHAT)
removeRegisterChatEvents.forEach((k) => k())
const { chatId, v, uniplatId } = params;
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY);
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_ID, chatId);
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_VERSION, v);
commit(ChatStore.MUTATION_SAVE_CURRENT_CHAT_UNIPLAT_ID, uniplatId);
commit(ChatStore.MUTATION_INITING_CHAT);
removeRegisterChatEvents.forEach((k) => k());
await Promise.all([
dispatch(ChatStore.ACTION_REGISTER_EVENT),
dispatch(ChatStore.ACTION_GET_CHAT_MESSAGES),
dispatch(ChatStore.ACTION_GET_CHAT_MEMBERS),
])
commit(ChatStore.MUTATION_INITING_CHAT_DONE)
]);
commit(ChatStore.MUTATION_INITING_CHAT_DONE);
},
async [ChatStore.ACTION_CLEAR_CURRENT_CHAT_DATA]({ commit }) {
commit(ChatStore.MUTATION_CLEAR_CURRENT_CHAT_ID)
commit(ChatStore.MUTATION_CLEAR_MYSELF_ID)
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY)
commit(ChatStore.MUTATION_CLEAR_CHAT_TITLE)
commit(ChatStore.MUTATION_CLEAR_CURRENT_CHAT_MEMBERS)
commit(ChatStore.MUTATION_CLEAR_CURRENT_CHAT_ID);
commit(ChatStore.MUTATION_CLEAR_MYSELF_ID);
commit(ChatStore.MUTATION_CLEAR_CHAT_MSG_HISTORY);
commit(ChatStore.MUTATION_CLEAR_CHAT_TITLE);
commit(ChatStore.MUTATION_CLEAR_CURRENT_CHAT_MEMBERS);
},
async [ChatStore.ACTION_GET_CHAT_MEMBERS]({ commit, state }) {
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]
if (chatId == null) return
const getChatMembersResult = await xim.fetchChatMembers(chatId)
const chatMembers = getChatMembersResult.args[0] as ChatMember[]
const chatId = state[ChatStore.STATE_CHAT_CURRENT_CHAT_ID];
if (chatId == null) return;
const getChatMembersResult = await xim.fetchChatMembers(chatId);
const chatMembers = getChatMembersResult.args[0] as ChatMember[];
const newChatMembers = await Promise.all(
chatMembers.map(async (member) => {
let result: ChatStore.STATE_CURRENT_CHAT_MEMBERS[number]
let result: ChatStore.STATE_CURRENT_CHAT_MEMBERS[number];
try {
let info = await sdk()
const info = await sdk()
.model("user")
.detail(member.eid)
.query()
.query();
result = {
...member,
name: info.row.first_name.value as string,
phone: info.row.last_name.value as string,
}
};
} catch (error) {
console.error(error)
result = member
console.error(error);
result = member;
}
return result
return result;
})
)
);
commit(
ChatStore.MUTATION_SAVE_CURRENT_CHAT_MEMBERS,
unique(newChatMembers, function (item, all) {
return all.findIndex((k) => k.eid === item.eid)
return all.findIndex((k) => k.eid === item.eid);
})
)
);
},
async [ChatStore.ACTION_TERINATE_CHAT]({ state, dispatch }) {
const v = state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION]
const v = state[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION];
const id = Number(
state[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID]
)
);
await sdk()
.model(UniplatChatModelName)
.action("update")
......@@ -578,30 +581,30 @@ export default {
.addInputs_parameter({
Status: ChatStatus.terminated,
})
.execute()
await dispatch(ChatStore.ACTION_GET_MY_CHAT_LIST)
.execute();
await dispatch(ChatStore.ACTION_GET_MY_CHAT_LIST);
},
},
getters: {
[ChatStore.STATE_CHAT_MSG_HISTORY](state) {
return state[ChatStore.STATE_CHAT_MSG_HISTORY] ?? []
return state[ChatStore.STATE_CHAT_MSG_HISTORY] ?? [];
},
[ChatStore.STATE_CHAT_SENDING_MESSAGES](state) {
return state[ChatStore.STATE_CHAT_SENDING_MESSAGES] || []
return state[ChatStore.STATE_CHAT_SENDING_MESSAGES] || [];
},
[ChatStore.STATE_CURRENT_CHAT_MEMBERS](state) {
return state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] ?? []
return state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] ?? [];
},
[ChatStore.GETTER_CURRENT_CHAT_PRESENT_MEMBERS](state) {
return (state[ChatStore.STATE_CURRENT_CHAT_MEMBERS] ?? []).filter(
(member) => !member.is_exited
)
);
},
[ChatStore.STATE_CURRENT_CHAT_TITLE](state) {
return state[ChatStore.STATE_CURRENT_CHAT_TITLE] || ""
return state[ChatStore.STATE_CURRENT_CHAT_TITLE] || "";
},
[ChatStore.STATE_CHAT_SOURCE](state) {
return state[ChatStore.STATE_CHAT_SOURCE] || 0
return state[ChatStore.STATE_CHAT_SOURCE] || 0;
},
},
} as Module<ChatStoreState, RootStoreState>
} as Module<ChatStoreState, RootStoreState>;
import * as dto from "../model"
import * as chatDto from "../xim/models/chat"
import { namespace } from "vuex-class"
import { namespace } from "vuex-class";
import * as dto from "../model";
import * as chatDto from "../xim/models/chat";
export enum ChatStatus {
opening = 0,
terminated = 1,
......@@ -10,53 +11,53 @@ export enum ChatMemberType {
admin = "85",
}
export namespace ChatStore {
export const ns = "chatStore"
export const ns = "chatStore";
/* state */
export const STATE_CHAT_CREATOR_VISIBLE = "创建会话弹窗显示状态"
export const STATE_CHAT_CREATOR_VISIBLE = "创建会话弹窗显示状态";
export type STATE_CHAT_CREATOR_VISIBLE = boolean
export const STATE_CHAT_DIALOG_VISIBLE = "会话模块弹窗显示状态"
export const STATE_CHAT_DIALOG_VISIBLE = "会话模块弹窗显示状态";
export type STATE_CHAT_DIALOG_VISIBLE = boolean
export const STATE_MY_CHAT_ROOM_LIST = "我的会话列表"
export const STATE_MY_CHAT_ROOM_LIST = "我的会话列表";
export type STATE_MY_CHAT_ROOM_LIST = {
list: {
uniplatId: string
chat_id: number
msg: string
customer_name: string
customer_avatar_url: string
uniplat_version: number
msg_type: string
is_finish: 0 | 1
}[]
total: number
uniplatId: string;
chat_id: number;
msg: string;
customer_name: string;
customer_avatar_url: string;
uniplat_version: number;
msg_type: string;
is_finish: 0 | 1;
}[];
total: number;
}
export const STATE_CHAT_MSG_HISTORY = "某个会话聊天记录"
export const STATE_CHAT_MSG_HISTORY = "某个会话聊天记录";
export type STATE_CHAT_MSG_HISTORY = dto.MessageRequestResult | null
export const STATE_CHAT_SENDING_MESSAGES = "sendingMessages"
export const STATE_CHAT_SENDING_MESSAGES = "sendingMessages";
export type STATE_CHAT_SENDING_MESSAGES = dto.MessageRequestResult | null
export type STATE_CHAT_SENDING_MESSAGE = dto.Message
export const STATE_CHAT_CURRENT_CHAT_ID = "当前chat-id"
export const STATE_CHAT_CURRENT_CHAT_ID = "当前chat-id";
export type STATE_CHAT_CURRENT_CHAT_ID = number | null
export const STATE_CHAT_CURRENT_CHAT_VERSION = "当前chat的Uniplat version"
export const STATE_CHAT_CURRENT_CHAT_VERSION = "当前chat的Uniplat version";
export type STATE_CHAT_CURRENT_CHAT_VERSION = number | null
export const STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID = "当前chat的Uniplat id"
export const STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID = "当前chat的Uniplat id";
export type STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID = string | null
export const STATE_CHAT_MY_ID = "聊天窗口显示在右边那个人的id"
export const STATE_CHAT_MY_ID = "聊天窗口显示在右边那个人的id";
export type STATE_CHAT_MY_ID = string | null
export const STATE_CHAT_MY_UID = "聊天窗口显示在右边那个人的uid"
export const STATE_CHAT_MY_UID = "聊天窗口显示在右边那个人的uid";
export type STATE_CHAT_MY_UID = string | null
export const STATE_CHAT_SOURCE = "stateChatSource"
export const STATE_CHAT_SOURCE = "stateChatSource";
export type STATE_CHAT_SOURCE = StateChatSourceDirection
export const STATE_CURRENT_CHAT_INPUTING = "当前会话正在输入的人"
export const STATE_CURRENT_CHAT_INPUTING = "当前会话正在输入的人";
export type STATE_CURRENT_CHAT_INPUTING = string[]
export const STATE_CURRENT_CHAT_INITING = "当前会是否正在初始化"
export const STATE_CURRENT_CHAT_INITING = "当前会是否正在初始化";
export type STATE_CURRENT_CHAT_INITING = boolean
/**
......@@ -67,218 +68,218 @@ export namespace ChatStore {
Client = 0,
}
export const STATE_CURRENT_CHAT_MEMBERS = "当前会话参与者"
export const STATE_CURRENT_CHAT_MEMBERS = "当前会话参与者";
export type STATE_CURRENT_CHAT_MEMBERS =
| readonly (dto.ChatMember & dto.ChatMemberExtraInfo)[]
| null
export const STATE_CURRENT_CHAT_TITLE = "会话标题"
export const STATE_CURRENT_CHAT_TITLE = "会话标题";
export type STATE_CURRENT_CHAT_TITLE = string
export const STATE_FUNC_SCROLL_TO_BOTTOM = "收到消息后滚动到底部的方法"
export const STATE_FUNC_SCROLL_TO_BOTTOM = "收到消息后滚动到底部的方法";
export type STATE_FUNC_SCROLL_TO_BOTTOM = () => void
/* getter */
export const GETTER_CURRENT_CHAT_PRESENT_MEMBERS = "当前会话未退出的参与者"
export const GETTER_CURRENT_CHAT_PRESENT_MEMBERS = "当前会话未退出的参与者";
export type GETTER_CURRENT_CHAT_PRESENT_MEMBERS = dto.ChatMembers | null
/* mutation */
export const MUTATION_SHOW_CHAT_CREATOR = "打开创建会话弹窗"
export const MUTATION_SHOW_CHAT_CREATOR = "打开创建会话弹窗";
export type MUTATION_SHOW_CHAT_CREATOR = () => void
export const MUTATION_HIDE_CHAT_CREATOR = "关闭创建会话弹窗"
export const MUTATION_HIDE_CHAT_CREATOR = "关闭创建会话弹窗";
export type MUTATION_HIDE_CHAT_CREATOR = () => void
export const MUTATION_SHOW_CHAT = "打开会话弹窗"
export const MUTATION_SHOW_CHAT = "打开会话弹窗";
export type MUTATION_SHOW_CHAT = () => void
export const MUTATION_HIDE_CHAT = "关闭会话弹窗"
export const MUTATION_HIDE_CHAT = "关闭会话弹窗";
export type MUTATION_HIDE_CHAT = () => void
export const MUTATION_SAVE_CHAT_LIST = "保存我的会话列表"
export const MUTATION_SAVE_CHAT_LIST = "保存我的会话列表";
export type MUTATION_SAVE_CHAT_LIST = (
list: STATE_MY_CHAT_ROOM_LIST
) => void
export const MUTATION_PUSH_CHAT_MSG_HISTORY = "新增下一页聊天记录"
export const MUTATION_PUSH_CHAT_MSG_HISTORY = "新增下一页聊天记录";
export type MUTATION_PUSH_CHAT_MSG_HISTORY = (
list: ChatStore.STATE_CHAT_MSG_HISTORY
) => void
export const MUTATION_INITING_CHAT = "当前会话正在初始化"
export const MUTATION_INITING_CHAT = "当前会话正在初始化";
export type MUTATION_INITING_CHAT = () => void
export const MUTATION_INITING_CHAT_DONE = "当前会话初始完成"
export const MUTATION_INITING_CHAT_DONE = "当前会话初始完成";
export type MUTATION_INITING_CHAT_DONE = () => void
export const MUTATION_UNSHIFT_CHAT_MSG_HISTORY = "新增上一页聊天记录"
export const MUTATION_UNSHIFT_CHAT_MSG_HISTORY = "新增上一页聊天记录";
export type MUTATION_UNSHIFT_CHAT_MSG_HISTORY = (
list: ChatStore.STATE_CHAT_MSG_HISTORY
) => void
export const MUTATION_CLEAR_CHAT_MSG_HISTORY = "清空聊天记录"
export const MUTATION_CLEAR_CHAT_MSG_HISTORY = "清空聊天记录";
export type MUTATION_CLEAR_CHAT_MSG_HISTORY = () => void
export const MUTATION_SAVE_CURRENT_CHAT_ID = "保存当前chat-id"
export const MUTATION_SAVE_CURRENT_CHAT_ID = "保存当前chat-id";
export type MUTATION_SAVE_CURRENT_CHAT_ID = (
chatId: ChatStore.STATE_CHAT_CURRENT_CHAT_ID
) => void
export const MUTATION_CLEAR_CURRENT_CHAT_ID = "清空chat-id"
export const MUTATION_CLEAR_CURRENT_CHAT_ID = "清空chat-id";
export type MUTATION_CLEAR_CURRENT_CHAT_ID = () => void
export const MUTATION_SAVE_CURRENT_CHAT_VERSION =
"保存当前chat uniplat version"
"保存当前chat uniplat version";
export type MUTATION_SAVE_CURRENT_CHAT_VERSION = (
v: ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION
) => void
export const MUTATION_CLEAR_CURRENT_CHAT_VERSION =
"清空chat uniplat version"
"清空chat uniplat version";
export type MUTATION_CLEAR_CURRENT_CHAT_VERSION = () => void
export const MUTATION_SAVE_CURRENT_CHAT_UNIPLAT_ID =
"保存当前chat uniplat id"
"保存当前chat uniplat id";
export type MUTATION_SAVE_CURRENT_CHAT_UNIPLAT_ID = (
v: ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID
) => void
export const MUTATION_CLEAR_CURRENT_CHAT_UNIPLAT_ID = "清空chat uniplat id"
export const MUTATION_CLEAR_CURRENT_CHAT_UNIPLAT_ID = "清空chat uniplat id";
export type MUTATION_CLEAR_CURRENT_CHAT_UNIPLAT_ID = () => void
export const MUTATION_SAVE_MYSELF_ID =
"保存我的id:聊天窗口显示在右边那个人的id"
"保存我的id:聊天窗口显示在右边那个人的id";
export type MUTATION_SAVE_MYSELF_ID = () => void
export const MUTATION_CLEAR_MYSELF_ID =
"清空我的id:聊天窗口显示在右边那个人的id"
"清空我的id:聊天窗口显示在右边那个人的id";
export type MUTATION_CLEAR_MYSELF_ID = () => void
export const MUTATION_SET_CHAT_SOURCE = "setChatSource"
export const MUTATION_SET_CHAT_SOURCE = "setChatSource";
export type MUTATION_SET_CHAT_SOURCE = (
payload: StateChatSourceDirection
) => void
export const MUTATION_SAVE_CURRENT_CHAT_MEMBERS = "保存当前会话参与者"
export const MUTATION_SAVE_CURRENT_CHAT_MEMBERS = "保存当前会话参与者";
export type MUTATION_SAVE_CURRENT_CHAT_MEMBERS = (
params: ChatStore.STATE_CURRENT_CHAT_MEMBERS
) => void
export const MUTATION_CLEAR_CURRENT_CHAT_MEMBERS = "清空当前会话参与者"
export const MUTATION_CLEAR_CURRENT_CHAT_MEMBERS = "清空当前会话参与者";
export type MUTATION_CLEAR_CURRENT_CHAT_MEMBERS = () => void
export const MUTATION_SAVE_CHAT_TITLE = "保存会话标题"
export const MUTATION_SAVE_CHAT_TITLE = "保存会话标题";
export type MUTATION_SAVE_CHAT_TITLE = (
title: ChatStore.STATE_CURRENT_CHAT_TITLE
) => void
export const MUTATION_CLEAR_CHAT_TITLE = "清空会话标题"
export const MUTATION_CLEAR_CHAT_TITLE = "清空会话标题";
export type MUTATION_CLEAR_CHAT_TITLE = () => void
export const MUTATION_SCROLL_TO_BOTTOM = "收到新消息后滚动到底部"
export const MUTATION_SCROLL_TO_BOTTOM = "收到新消息后滚动到底部";
export type MUTATION_SCROLL_TO_BOTTOM = () => void
export const MUTATION_SAVE_FUNC_SCROLL_TO_BOTTOM =
"保存收到新消息后滚动到底部的方法"
"保存收到新消息后滚动到底部的方法";
export type MUTATION_SAVE_FUNC_SCROLL_TO_BOTTOM = (func: () => void) => void
export const MUTATION_CLEAR_FUNC_SCROLL_TO_BOTTOM =
"删除收到新消息后滚动到底部的方法"
"删除收到新消息后滚动到底部的方法";
export type MUTATION_CLEAR_FUNC_SCROLL_TO_BOTTOM = () => void
export const MUTATION_APPEND_SENDING_MESSAGE = "appendSendingMessage"
export const MUTATION_APPEND_SENDING_MESSAGE = "appendSendingMessage";
export type MUTATION_APPEND_SENDING_MESSAGE = (payload: dto.Message) => void
export const MUTATION_REMOVE_SENDING_MESSAGE = "removeSendingMessage"
export const MUTATION_REMOVE_SENDING_MESSAGE = "removeSendingMessage";
export type MUTATION_REMOVE_SENDING_MESSAGE = (id: number) => void
export const MUTATION_FAILED_SENDING_MESSAGE = "failedSendingMessage"
export const MUTATION_FAILED_SENDING_MESSAGE = "failedSendingMessage";
export type MUTATION_FAILED_SENDING_MESSAGE = (id: number) => void
export const MUTATION_SAVE_CURRENT_CHAT_INPUTING = "保存正在输入"
export const MUTATION_SAVE_CURRENT_CHAT_INPUTING = "保存正在输入";
export type MUTATION_SAVE_CURRENT_CHAT_INPUTING = (
params: chatDto.NotifyMessage
) => void
export const MUTATION_CLEAR_CURRENT_CHAT_INPUTING = "清空正在输入"
export const MUTATION_CLEAR_CURRENT_CHAT_INPUTING = "清空正在输入";
export type MUTATION_CLEAR_CURRENT_CHAT_INPUTING = () => void
/* action */
export const ACTION_GET_MY_CHAT_LIST = "获取我的会话列表"
export const ACTION_GET_MY_CHAT_LIST = "获取我的会话列表";
export type ACTION_GET_MY_CHAT_LIST = (keyword?: string) => void
export const ACTION_JOIN_CHAT = "加入某个会话"
export const ACTION_JOIN_CHAT = "加入某个会话";
export type ACTION_JOIN_CHAT = (chatId: number) => void
export const ACTION_GET_CHAT_MESSAGES = "打开某个会话时获取他的聊天记录"
export const ACTION_GET_CHAT_MESSAGES = "打开某个会话时获取他的聊天记录";
export type ACTION_GET_CHAT_MESSAGES =
() => Promise<dto.MessageRequestResult>
export const ACTION_GET_CHAT_MESSAGES_BEFORE_SPECIFIC_ID =
"获取某个消息之前的10条消息"
"获取某个消息之前的10条消息";
export type ACTION_GET_CHAT_MESSAGES_BEFORE_SPECIFIC_ID = (
msgId: number
) => Promise<dto.MessageRequestResult>
export const ACTION_GET_CHAT_MESSAGES_AFTER_SPECIFIC_ID =
"获取某个消息之后的10条消息"
"获取某个消息之后的10条消息";
export type ACTION_GET_CHAT_MESSAGES_AFTER_SPECIFIC_ID = (
msgId: number
) => Promise<dto.MessageRequestResult>
export const ACTION_GET_FRESH_MESSAGE = "获取最新的消息"
export const ACTION_GET_FRESH_MESSAGE = "获取最新的消息";
export type ACTION_GET_FRESH_MESSAGE =
() => Promise<dto.MessageRequestResult>
export const ACTION_CREATE_NEW_CHAT_BY_SERVICE_MAN = "客服向顾客发起新会话"
export const ACTION_CREATE_NEW_CHAT_BY_SERVICE_MAN = "客服向顾客发起新会话";
export type ACTION_CREATE_NEW_CHAT_BY_SERVICE_MAN = (params: {
modelName: string
selectedListId: string
uids: string[]
modelName: string;
selectedListId: string;
uids: string[];
}) => Promise<void>
export const ACTION_CREATE_NEW_CHAT_BY_CLIENT_SIDE =
"startNewConversationByCustomerSide"
"startNewConversationByCustomerSide";
export type ACTION_CREATE_NEW_CHAT_BY_CLIENT_SIDE = (option: {
customerServiceId?: number | string
customerServiceGroupId?: number | string
customerServiceId?: number | string;
customerServiceGroupId?: number | string;
}) => Promise<number>
export const ACTION_SAVE_CURRENT_CHAT_ID_VERSION = "action:保存当前chat-id"
export const ACTION_SAVE_CURRENT_CHAT_ID_VERSION = "action:保存当前chat-id";
export type ACTION_SAVE_CURRENT_CHAT_ID_VERSION = (params: {
chatId: ChatStore.STATE_CHAT_CURRENT_CHAT_ID
v: number
uniplatId: STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID
chatId: ChatStore.STATE_CHAT_CURRENT_CHAT_ID;
v: number;
uniplatId: STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID;
}) => Promise<void>
export const ACTION_CLEAR_CURRENT_CHAT_DATA = "action:清空当前会话数据"
export const ACTION_CLEAR_CURRENT_CHAT_DATA = "action:清空当前会话数据";
export type ACTION_CLEAR_CURRENT_CHAT_DATA = () => Promise<void>
export const ACTION_REGISTER_EVENT = "给当前会话注册事件通知"
export const ACTION_REGISTER_EVENT = "给当前会话注册事件通知";
export type ACTION_REGISTER_EVENT = () => Promise<void>
export const ACTION_GET_CHAT_MEMBERS = "获取会话成员列表"
export const ACTION_GET_CHAT_MEMBERS = "获取会话成员列表";
export type ACTION_GET_CHAT_MEMBERS = () => Promise<void>
export const ACTION_SEND_MESSAGE = "发送消息"
export const ACTION_SEND_MESSAGE = "发送消息";
export type ACTION_SEND_MESSAGE = (params: {
msgType: "text" | "image" | "file" | "voice" | "video"
msg: string
msgType: "text" | "image" | "file" | "voice" | "video";
msg: string;
}) => void
export const ACTION_TERINATE_CHAT = "结束会话"
export const ACTION_TERINATE_CHAT = "结束会话";
export type ACTION_TERINATE_CHAT = () => Promise<void>
}
export interface ChatStoreState {
[ChatStore.STATE_CHAT_CREATOR_VISIBLE]: ChatStore.STATE_CHAT_CREATOR_VISIBLE
[ChatStore.STATE_CHAT_MSG_HISTORY]: ChatStore.STATE_CHAT_MSG_HISTORY
[ChatStore.STATE_CHAT_SENDING_MESSAGES]: ChatStore.STATE_CHAT_SENDING_MESSAGES
[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]: ChatStore.STATE_CHAT_CURRENT_CHAT_ID
[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID]: ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID
[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION]: ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION
[ChatStore.STATE_CHAT_MY_UID]: ChatStore.STATE_CHAT_MY_UID
[ChatStore.STATE_CHAT_MY_ID]: ChatStore.STATE_CHAT_MY_ID
[ChatStore.STATE_CHAT_SOURCE]: ChatStore.STATE_CHAT_SOURCE
[ChatStore.STATE_CURRENT_CHAT_MEMBERS]: ChatStore.STATE_CURRENT_CHAT_MEMBERS
[ChatStore.STATE_CURRENT_CHAT_TITLE]: ChatStore.STATE_CURRENT_CHAT_TITLE
[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]: ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM
[ChatStore.STATE_CURRENT_CHAT_INPUTING]: ChatStore.STATE_CURRENT_CHAT_INPUTING
[ChatStore.STATE_CURRENT_CHAT_INITING]: ChatStore.STATE_CURRENT_CHAT_INITING
[ChatStore.STATE_MY_CHAT_ROOM_LIST]: ChatStore.STATE_MY_CHAT_ROOM_LIST
[ChatStore.STATE_CHAT_DIALOG_VISIBLE]: ChatStore.STATE_CHAT_DIALOG_VISIBLE
[ChatStore.STATE_CHAT_CREATOR_VISIBLE]: ChatStore.STATE_CHAT_CREATOR_VISIBLE;
[ChatStore.STATE_CHAT_MSG_HISTORY]: ChatStore.STATE_CHAT_MSG_HISTORY;
[ChatStore.STATE_CHAT_SENDING_MESSAGES]: ChatStore.STATE_CHAT_SENDING_MESSAGES;
[ChatStore.STATE_CHAT_CURRENT_CHAT_ID]: ChatStore.STATE_CHAT_CURRENT_CHAT_ID;
[ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID]: ChatStore.STATE_CHAT_CURRENT_CHAT_UNIPLAT_ID;
[ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION]: ChatStore.STATE_CHAT_CURRENT_CHAT_VERSION;
[ChatStore.STATE_CHAT_MY_UID]: ChatStore.STATE_CHAT_MY_UID;
[ChatStore.STATE_CHAT_MY_ID]: ChatStore.STATE_CHAT_MY_ID;
[ChatStore.STATE_CHAT_SOURCE]: ChatStore.STATE_CHAT_SOURCE;
[ChatStore.STATE_CURRENT_CHAT_MEMBERS]: ChatStore.STATE_CURRENT_CHAT_MEMBERS;
[ChatStore.STATE_CURRENT_CHAT_TITLE]: ChatStore.STATE_CURRENT_CHAT_TITLE;
[ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM]: ChatStore.STATE_FUNC_SCROLL_TO_BOTTOM;
[ChatStore.STATE_CURRENT_CHAT_INPUTING]: ChatStore.STATE_CURRENT_CHAT_INPUTING;
[ChatStore.STATE_CURRENT_CHAT_INITING]: ChatStore.STATE_CURRENT_CHAT_INITING;
[ChatStore.STATE_MY_CHAT_ROOM_LIST]: ChatStore.STATE_MY_CHAT_ROOM_LIST;
[ChatStore.STATE_CHAT_DIALOG_VISIBLE]: ChatStore.STATE_CHAT_DIALOG_VISIBLE;
}
export const chatStore = namespace(ChatStore.ns)
export const chatStore = namespace(ChatStore.ns);
export class ImageCompresser {
public static dataURL2File(data: string, name: string) {
const arr = data.split(",")
const arr = data.split(",");
if (arr) {
if (arr[0]) {
const match = arr[0].match(/:(.*?);/)
const match = arr[0].match(/:(.*?);/);
if (match) {
const mime = match[1]
const bstr = atob(arr[1])
let n = bstr.length
const u8arr = new Uint8Array(n)
const mime = match[1];
const bstr = atob(arr[1]);
let n = bstr.length;
const u8arr = new Uint8Array(n);
// eslint-disable-next-line no-plusplus
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], name, { type: mime })
return new File([u8arr], name, { type: mime });
}
}
}
return null
return null;
}
public static readFile2Image(
......@@ -26,38 +26,38 @@ export class ImageCompresser {
maxHeight: number
): Promise<File | null> {
return new Promise((resolve, reject) => {
const img = new Image()
const reader = new FileReader()
const img = new Image();
const reader = new FileReader();
reader.onload = (e) => {
if (e && e.target && e.target.result) {
img.src = e.target.result as string
img.src = e.target.result as string;
} else {
reject()
reject();
}
}
reader.readAsDataURL(file)
};
reader.readAsDataURL(file);
img.onload = () => {
const originWidth = img.naturalWidth
const originHeight = img.naturalHeight
const originWidth = img.naturalWidth;
const originHeight = img.naturalHeight;
if (originWidth > maxWidth || originHeight > maxHeight) {
ImageCompresser.compressImg(img, maxWidth, maxHeight)
.then((b) => {
if (b) {
const newFile = new File([b], file.name)
const newFile = new File([b], file.name);
// 如果压缩完还不如原始图片size小,直接返回原始图片
resolve(
newFile.size <= file.size ? newFile : file
)
);
} else {
reject()
reject();
}
})
.catch(reject)
.catch(reject);
} else {
resolve(file)
resolve(file);
}
}
})
};
});
}
/**
......@@ -74,40 +74,40 @@ export class ImageCompresser {
type?: string
): Promise<Blob | null> {
return new Promise((resolve, reject) => {
const canvas = document.createElement("canvas")
const context = canvas.getContext("2d")
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
if (!context) {
reject()
return
reject();
return;
}
const { width: originWidth, height: originHeight } = img // 最大尺寸限制
const maxWidth = mx
const maxHeight = mh // 目标尺寸
let targetWidth = originWidth
let targetHeight = originHeight
const { width: originWidth, height: originHeight } = img; // 最大尺寸限制
const maxWidth = mx;
const maxHeight = mh; // 目标尺寸
let targetWidth = originWidth;
let targetHeight = originHeight;
if (originWidth > maxWidth || originHeight > maxHeight) {
if (originWidth / originHeight > 1) {
// 宽图片
targetWidth = maxWidth
targetWidth = maxWidth;
targetHeight = Math.round(
maxWidth * (originHeight / originWidth)
)
);
} else {
// 高图片
targetHeight = maxHeight
targetHeight = maxHeight;
targetWidth = Math.round(
maxHeight * (originWidth / originHeight)
)
);
}
}
canvas.width = targetWidth
canvas.height = targetHeight
context.clearRect(0, 0, targetWidth, targetHeight)
context.drawImage(img, 0, 0, targetWidth, targetHeight)
canvas.width = targetWidth;
canvas.height = targetHeight;
context.clearRect(0, 0, targetWidth, targetHeight);
context.drawImage(img, 0, 0, targetWidth, targetHeight);
canvas.toBlob((blob) => {
resolve(blob)
canvas.remove()
}, type || "image/png")
})
resolve(blob);
canvas.remove();
}, type || "image/png");
});
}
}
import { UserAgentHelper } from "../user-agent"
import { UserAgentHelper } from "../user-agent";
export enum TransformTarget {
Mobile,
......@@ -36,12 +36,12 @@ export interface PcMobileTransformerOption {
/**
* 手机端根host,如 https://www.teammix.com/ms
*/
mobileHost?: string
mobileHost?: string;
/**
* 桌面端根host,如 https://www.teammix.com/s
*/
desktopHost?: string
desktopHost?: string;
}
/**
......@@ -79,84 +79,84 @@ export class PcMobileTransformer {
public static setup(option: PcMobileTransformerOption) {
if (option.desktopHost) {
PcMobileTransformer.target = TransformTarget.Desktop
PcMobileTransformer.target = TransformTarget.Desktop;
PcMobileTransformer.host = PcMobileTransformer.trimEnd(
option.desktopHost
)
);
}
if (option.mobileHost) {
PcMobileTransformer.target = TransformTarget.Mobile
PcMobileTransformer.target = TransformTarget.Mobile;
PcMobileTransformer.host = PcMobileTransformer.trimEnd(
option.mobileHost
)
);
}
}
public static isNeed2Redirect() {
if (PcMobileTransformer.target === TransformTarget.Mobile) {
return PcMobileTransformer.isMobileDevice()
return PcMobileTransformer.isMobileDevice();
}
return false
return false;
}
private static trimEnd(input: string) {
if (input && input.endsWith("/")) {
return input.substring(0, input.length - 1)
return input.substring(0, input.length - 1);
}
return input
return input;
}
private static isMobileDevice() {
const ua = window.navigator.userAgent
return UserAgentHelper.isMobile(ua)
const ua = window.navigator.userAgent;
return UserAgentHelper.isMobile(ua);
}
public static transform(
parameters: (string | number)[],
target: TransformDirection
) {
let v = ""
let v = "";
if (PcMobileTransformer.target === TransformTarget.Desktop) {
v = PcMobileTransformer.transform2Desktop(parameters, target)
v = PcMobileTransformer.transform2Desktop(parameters, target);
}
if (PcMobileTransformer.target === TransformTarget.Mobile) {
v = PcMobileTransformer.transform2Mobile(parameters, target)
v = PcMobileTransformer.transform2Mobile(parameters, target);
}
return v.replace(/\.html/gi, "")
return v.replace(/\.html/gi, "");
}
private static transform2Mobile(
parameters: (string | number)[],
target: TransformDirection
) {
const url = PcMobileTransformer.desktop2MobileMapping.get(target)
const url = PcMobileTransformer.desktop2MobileMapping.get(target);
if (url) {
let targetUrl = `${PcMobileTransformer.host}${url}`
let targetUrl = `${PcMobileTransformer.host}${url}`;
for (let i = 0; i < parameters.length; i++) {
targetUrl = targetUrl.replace(`{${i}}`, parameters[i] + "")
targetUrl = targetUrl.replace(`{${i}}`, parameters[i] + "");
}
return targetUrl
return targetUrl;
}
const base = PcMobileTransformer.rebuildMapping.get(target)
const base = PcMobileTransformer.rebuildMapping.get(target);
if (base) {
let rebuildUrl = base
let rebuildUrl = base;
for (let i = 0; i < parameters.length; i++) {
rebuildUrl = rebuildUrl.replace(`{${i}}`, parameters[i] + "")
rebuildUrl = rebuildUrl.replace(`{${i}}`, parameters[i] + "");
}
return `${PcMobileTransformer.host}${rebuildUrl}`
return `${PcMobileTransformer.host}${rebuildUrl}`;
}
return PcMobileTransformer.host
return PcMobileTransformer.host;
}
private static transform2Desktop(
parameters: (string | number)[],
target: TransformDirection
) {
return target + ""
return target + "";
}
}
......@@ -4,24 +4,24 @@ export class SeoHelper {
title &&
(title.indexOf("TeamMix") > -1 || title.indexOf("亲亲小站") > -1)
) {
return title
return title;
}
return `${title || ""}-亲亲小站`
return `${title || ""}-亲亲小站`;
}
public static updateFavicon(path: string) {
const link = document.querySelector(
"link[rel*='icon']"
) as HTMLLinkElement
) as HTMLLinkElement;
if (link) {
link.href = path
link.href = path;
} else {
const l = document.createElement("link")
l.type = "image/x-icon"
l.rel = "shortcut icon"
l.href = path
document.getElementsByTagName("head")[0].appendChild(l)
const l = document.createElement("link");
l.type = "image/x-icon";
l.rel = "shortcut icon";
l.href = path;
document.getElementsByTagName("head")[0].appendChild(l);
}
}
}
......@@ -39,79 +39,79 @@ export const enum UserAgentType {
export class UserAgentHelper {
private static contains(source: string, match: string) {
return source.indexOf(match) > -1
return source.indexOf(match) > -1;
}
private static containsAll(source: string, matches: string[]) {
for (const item of matches) {
if (!UserAgentHelper.contains(source, item)) {
return false
return false;
}
}
return true
return true;
}
private static containsAny(source: string, matches: string[]) {
for (const item of matches) {
if (UserAgentHelper.contains(source, item)) {
return true
return true;
}
}
return false
return false;
}
public static getType(ua: string) {
const lower = ua.toLowerCase()
const lower = ua.toLowerCase();
if (UserAgentHelper.contains(lower, "ipad")) {
return UserAgentType.IPad
return UserAgentType.IPad;
}
if (UserAgentHelper.contains(lower, "android_tablet")) {
return UserAgentType.Tablet
return UserAgentType.Tablet;
}
if (UserAgentHelper.contains(lower, "iphone")) {
return UserAgentType.IPhone
return UserAgentType.IPhone;
}
if (UserAgentHelper.contains(lower, "ipod")) {
return UserAgentType.IPhone
return UserAgentType.IPhone;
}
if (UserAgentHelper.containsAny(lower, ["android", "mobile"])) {
return UserAgentType.Andriod
return UserAgentType.Andriod;
}
if (UserAgentHelper.contains(lower, "safari")) {
return UserAgentType.DesktopSafari
return UserAgentType.DesktopSafari;
}
if (UserAgentHelper.containsAny(lower, ["edge", "edg"])) {
return UserAgentType.DesktopEdge
return UserAgentType.DesktopEdge;
}
if (UserAgentHelper.contains(lower, "trident")) {
return UserAgentType.DesktopIE
return UserAgentType.DesktopIE;
}
if (UserAgentHelper.contains(lower, "firefox")) {
return UserAgentType.DesktopFirefox
return UserAgentType.DesktopFirefox;
}
if (UserAgentHelper.contains(lower, "chrome")) {
return UserAgentType.DesktopChrome
return UserAgentType.DesktopChrome;
}
if (UserAgentHelper.containsAny(lower, ["360", "baidu", "qq"])) {
return UserAgentType.DesktopOthers
return UserAgentType.DesktopOthers;
}
return UserAgentType.None
return UserAgentType.None;
}
public static isMobile(ua: string) {
const type = UserAgentHelper.getType(ua)
return type === UserAgentType.Andriod || type === UserAgentType.IPhone
const type = UserAgentHelper.getType(ua);
return type === UserAgentType.Andriod || type === UserAgentType.IPhone;
}
}
function b64DecodeUnicode(str: string) {
return decodeURIComponent(
atob(str).replace(/(.)/g, function (m, p) {
let code = p.charCodeAt(0).toString(16).toUpperCase()
let code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) {
code = "0" + code
code = "0" + code;
}
return "%" + code
return "%" + code;
})
)
);
}
function base64_url_decode(str: string) {
let output = str.replace(/-/g, "+").replace(/_/g, "/")
let output = str.replace(/-/g, "+").replace(/_/g, "/");
switch (output.length % 4) {
case 0:
break
break;
case 2:
output += "=="
break
output += "==";
break;
case 3:
output += "="
break
output += "=";
break;
default:
throw "Illegal base64url string!"
throw "Illegal base64url string!";
}
try {
return b64DecodeUnicode(output)
return b64DecodeUnicode(output);
} catch {
return atob(output)
return atob(output);
}
}
export function decode(token: string) {
return JSON.parse(base64_url_decode(token.split(".")[1]))
return JSON.parse(base64_url_decode(token.split(".")[1]));
}
const STANDARD = Math.pow(10, 12)
const ONE_DAY_TICKS = 86400000
const STANDARD = Math.pow(10, 12);
const ONE_DAY_TICKS = 86400000;
const ONE_MINUTE_TICKS = 60 * 1000
const ONE_HOUR_TICKS = 60 * 60 * 1000
const ONE_MINUTE_TICKS = 60 * 1000;
const ONE_HOUR_TICKS = 60 * 60 * 1000;
export const enum TimeFormatRule {
/**
......@@ -17,43 +17,43 @@ export const enum TimeFormatRule {
function formatHour2Friendly(hour: number) {
if (hour <= 1) {
return "凌晨"
return "凌晨";
}
if (hour < 12) {
return "上午"
return "上午";
}
if (hour === 12) {
return "中午"
return "中午";
}
if (hour < 20) {
return "下午"
return "下午";
}
return "晚上"
return "晚上";
}
function formatHour12Unit(hour: number, rule: TimeFormatRule) {
if (rule === TimeFormatRule.Hour12) {
return hour > 12 ? hour - 12 : hour
return hour > 12 ? hour - 12 : hour;
}
return hour
return hour;
}
function format2DetailTime(hour: number, time: Date, rule: TimeFormatRule) {
let hourString = ""
const h = formatHour12Unit(hour, rule)
let hourString = "";
const h = formatHour12Unit(hour, rule);
if (h < 10) {
hourString = "0" + h
hourString = "0" + h;
} else {
hourString = h + ""
hourString = h + "";
}
let minuteString = ""
const m = time.getMinutes()
let minuteString = "";
const m = time.getMinutes();
if (m < 10) {
minuteString = "0" + m
minuteString = "0" + m;
} else {
minuteString = "" + m
minuteString = "" + m;
}
return `${formatHour2Friendly(hour)} ${hourString}:${minuteString}`
return `${formatHour2Friendly(hour)} ${hourString}:${minuteString}`;
}
function isSameDay(d1: Date, d2: Date) {
......@@ -61,43 +61,43 @@ function isSameDay(d1: Date, d2: Date) {
d1.getFullYear() === d2.getFullYear() &&
d1.getMonth() === d2.getMonth() &&
d1.getDate() === d2.getDate()
)
);
}
function isInMinute(d1: Date, d2: Date) {
return Math.abs(d1.valueOf() - d2.valueOf()) <= ONE_MINUTE_TICKS
return Math.abs(d1.valueOf() - d2.valueOf()) <= ONE_MINUTE_TICKS;
}
function isInHour(d1: Date, d2: Date) {
return Math.abs(d1.valueOf() - d2.valueOf()) < ONE_HOUR_TICKS
return Math.abs(d1.valueOf() - d2.valueOf()) < ONE_HOUR_TICKS;
}
function isYesterday(date: Date) {
const now = new Date()
now.setHours(0)
now.setMinutes(0)
now.setSeconds(0)
now.setMilliseconds(0)
const ticks = now.valueOf()
const yesterday = ticks - ONE_DAY_TICKS
const v = date.valueOf()
return v >= yesterday && v < ticks
const now = new Date();
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
now.setMilliseconds(0);
const ticks = now.valueOf();
const yesterday = ticks - ONE_DAY_TICKS;
const v = date.valueOf();
return v >= yesterday && v < ticks;
}
function isIn6Days(date: Date) {
const now = new Date()
now.setHours(0)
now.setMinutes(0)
now.setSeconds(0)
now.setMilliseconds(0)
const ticks = now.valueOf()
const sixDaysAgo = ticks - ONE_DAY_TICKS * 6
const v = date.valueOf()
return v >= sixDaysAgo && v < ticks
const now = new Date();
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
now.setMilliseconds(0);
const ticks = now.valueOf();
const sixDaysAgo = ticks - ONE_DAY_TICKS * 6;
const v = date.valueOf();
return v >= sixDaysAgo && v < ticks;
}
function isSameYear(d1: Date, d2: Date) {
return d1.getFullYear() === d2.getFullYear()
return d1.getFullYear() === d2.getFullYear();
}
const DAY_MAPPING: { [key: number]: string } = {
......@@ -108,39 +108,39 @@ const DAY_MAPPING: { [key: number]: string } = {
4: "四",
5: "五",
6: "六",
}
};
function getDayInWeek(time: Date) {
const d = time.getDay()
return DAY_MAPPING[d]
const d = time.getDay();
return DAY_MAPPING[d];
}
function formatWithTwoNumber(number: number) {
return number < 10 ? `0${number}` : `${number}`
return number < 10 ? `0${number}` : `${number}`;
}
function formatTime2MonthDate(time: Date) {
return `${formatWithTwoNumber(time.getMonth() + 1)}${formatWithTwoNumber(
time.getDate()
)}日`
)}日`;
}
function formatTime2ShortMonthDate(time: Date) {
return `${formatWithTwoNumber(time.getMonth() + 1)}/${formatWithTwoNumber(
time.getDate()
)}`
)}`;
}
function formatTime2YearMonthDate(time: Date) {
return `${time.getFullYear()}${formatWithTwoNumber(
time.getMonth() + 1
)}${formatWithTwoNumber(time.getDate())}日`
)}${formatWithTwoNumber(time.getDate())}日`;
}
function formatTime2ShortYearMonthDate(time: Date) {
return `${time.getFullYear()}/${formatWithTwoNumber(
time.getMonth() + 1
)}/${formatWithTwoNumber(time.getDate())}`
)}/${formatWithTwoNumber(time.getDate())}`;
}
/**
......@@ -160,63 +160,63 @@ export function formatTime(
option = { rule: TimeFormatRule.Hour12, short: false }
) {
if (time < STANDARD) {
time *= 1000
time *= 1000;
}
const t = new Date(time)
const now = new Date()
const t = new Date(time);
const now = new Date();
if (!option.short) {
if (isInMinute(t, now)) {
return "刚刚"
return "刚刚";
}
if (isInHour(t, now)) {
return `${Math.round(
Math.abs(t.valueOf() - now.valueOf()) / 1000 / 60
)}分钟前`
)}分钟前`;
}
}
const hour = t.getHours()
const hour = t.getHours();
if (isSameDay(t, now)) {
return format2DetailTime(hour, t, option.rule)
return format2DetailTime(hour, t, option.rule);
}
if (isYesterday(t)) {
if (option.short) {
return "昨天"
return "昨天";
}
return "昨天 " + format2DetailTime(hour, t, option.rule)
return "昨天 " + format2DetailTime(hour, t, option.rule);
}
if (isIn6Days(t)) {
if (option.short) {
return `星期${getDayInWeek(t)}`
return `星期${getDayInWeek(t)}`;
}
return (
`星期${getDayInWeek(t)} ` + format2DetailTime(hour, t, option.rule)
)
);
}
if (isSameYear(t, now)) {
if (option.short) {
return formatTime2ShortMonthDate(t)
return formatTime2ShortMonthDate(t);
}
return (
formatTime2MonthDate(t) +
" " +
format2DetailTime(hour, t, option.rule)
)
);
}
if (option.short) {
return formatTime2ShortYearMonthDate(t)
return formatTime2ShortYearMonthDate(t);
}
return (
formatTime2YearMonthDate(t) +
" " +
format2DetailTime(hour, t, option.rule)
)
);
}
export default "group"
export default "group";
import xim from "./xim"
import { ChatOption, TokenStringGetter } from "./../model"
import { ChatLoggerService } from "./logger"
import { EmojiService } from "../service/emoji"
import tokenManager from "./token"
import type { UniplatSdk } from "uniplat-sdk"
import type { UniplatSdk } from "uniplat-sdk";
import { EmojiService } from "../service/emoji";
import { ChatOption, TokenStringGetter } from "./../model";
import { ChatLoggerService } from "./logger";
import tokenManager from "./token";
import xim from "./xim";
class Chat {
private _sdk?: () => UniplatSdk
private _orgId: () => string | number = () => "0"
......@@ -11,11 +14,12 @@ class Chat {
private userMapping: { [key: string]: { name: string; avatar: string } } =
{}
private webHost = false
public async setup(option: ChatOption) {
if (!option) {
throw new Error(`You must specify a chat option for chat service`)
throw new Error(`You must specify a chat option for chat service`);
}
// if (!option.userTokenString) {
// throw new Error(`You must specify a user token for chat service`)
......@@ -23,75 +27,75 @@ class Chat {
if (!option.webSocketUri) {
throw new Error(
`You must specify a web socket address for chat service`
)
);
}
this._sdk = option.sdk
this._orgId = option.orgId
this._sdk = option.sdk;
this._orgId = option.orgId;
// if (option.enterpriseTokenString) {
// this.token = option.enterpriseTokenString
// } else {
this.token = option.userTokenString
tokenManager.save(this.token)
this.token = option.userTokenString;
tokenManager.save(this.token);
// }
EmojiService.raiseOnReady(this.token)
return this.initChatSdk(option.webSocketUri)
EmojiService.raiseOnReady(this.token);
return this.initChatSdk(option.webSocketUri);
}
public getSdk = () => {
if(this._sdk == null) return
return this._sdk()
if (this._sdk == null) return;
return this._sdk();
}
public getOrgId = () => {
return this._orgId()
return this._orgId();
}
public isWebHost() {
return this.webHost
return this.webHost;
}
private trimToken(token: string) {
return token.replace(/^Bearer\s/, "")
return token.replace(/^Bearer\s/, "");
}
public async getToken() {
return this.trimToken(await this.token())
return this.trimToken(await this.token());
}
private async initChatSdk(uri: string) {
if (xim.isConnected()) {
return uri
return uri;
}
return new Promise((resolve: (p?: unknown) => void) => {
xim.open(uri, this.token)
this.registerXimEvent(resolve)
})
xim.open(uri, this.token);
this.registerXimEvent(resolve);
});
}
public registerXimEvent(onConnected?: () => void) {
xim.off("status", (e) => this.raiseOnStatusChanged(e, onConnected))
xim.on("status", (e) => this.raiseOnStatusChanged(e, onConnected))
xim.off("status", (e) => this.raiseOnStatusChanged(e, onConnected));
xim.on("status", (e) => this.raiseOnStatusChanged(e, onConnected));
}
private raiseOnStatusChanged(e: any, onConnected?: () => void) {
if (e === "CONNECTED") {
if (onConnected) {
onConnected()
onConnected();
}
}
this.debug(`client status ${e}`)
this.debug(`client status ${e}`);
}
public getUserMapping() {
return {}
return {};
}
private debug(message: string) {
ChatLoggerService.logger?.debug(message)
ChatLoggerService.logger?.debug(message);
}
}
export default new Chat()
export default new Chat();
import { ChatServiceLogger } from "../model"
import { ChatServiceLogger } from "../model";
export class ChatLoggerService {
public static logger = console
......
export interface Chat {
type: string
chat_id: number
service_id: number
title: string
type: string;
chat_id: number;
service_id: number;
title: string;
// tag: string;
// ext: string;
create_time: number
update_time: number
create_time: number;
update_time: number;
// exit_msg_id: number;
// is_exited: boolean;
// dnd: number;
is_top: boolean
is_top: boolean;
// label: string;
// join_msg_id: number;
// last_read_msg_id: number;
......@@ -22,62 +22,62 @@ export interface Chat {
// is_remove: boolean;
// member_type: number;
// ref_id: number;
unread_msg_count: number
unread_msg_count: number;
// at_me: boolean;
// at_all: boolean;
// last_login_oid: string;
last_msg_eid: string
last_msg_name: string
last_msg_ts: number
msg_id: number
msg_type: string
msg: string
last_msg_eid: string;
last_msg_name: string;
last_msg_ts: number;
msg_id: number;
msg_type: string;
msg: string;
}
export interface Message {
chat_id: number
oid: string
eid: string
id: number
ts: number
type: string
msg: string
total_read_count: number
read_count: number
like_count: number
ref_id: number
at_id: string
is_read: boolean
like: boolean
create_time: number
update_time: number
status: number
url: string
is_open: boolean
chat_id: number;
oid: string;
eid: string;
id: number;
ts: number;
type: string;
msg: string;
total_read_count: number;
read_count: number;
like_count: number;
ref_id: number;
at_id: string;
is_read: boolean;
like: boolean;
create_time: number;
update_time: number;
status: number;
url: string;
is_open: boolean;
}
export interface NotifyMessage {
chat_type: string
chat_id: number
eid: string
ts: number
msg_type: string
msg: string
chat_type: string;
chat_id: number;
eid: string;
ts: number;
msg_type: string;
msg: string;
}
export interface Member {
chat_id: number
oid: string
eid: string
type: number
is_exited: boolean
is_remove: boolean
is_top: boolean
label: string
create_time: number
update_time: number
nick_name: string
chat_id: number;
oid: string;
eid: string;
type: number;
is_exited: boolean;
is_remove: boolean;
is_top: boolean;
label: string;
create_time: number;
update_time: number;
nick_name: string;
}
/**
......@@ -119,102 +119,102 @@ export type ChatInputBoxData = { key: string } & (
)
export type TextMessageBody = {
text: string
text: string;
}
export type FileMessageBody = {
name: string
url: string // 生消息是本地path,熟消息是文件url_id
size: number // number, 可选,文件大小:单位-字节
remark: string
isNeedUploaded?: boolean // pc客户端自定义属性(只有生消息的消息体才有该属性, 值为false时不需要上传, true和undefined时需要上传)
name: string;
url: string; // 生消息是本地path,熟消息是文件url_id
size: number; // number, 可选,文件大小:单位-字节
remark: string;
isNeedUploaded?: boolean; // pc客户端自定义属性(只有生消息的消息体才有该属性, 值为false时不需要上传, true和undefined时需要上传)
source?: {
source_type: number //来源类型(若为团队小站文件,则来源类型为团队小站文件)
source_id: number //来源id(若为团队小站文件,此处为团队工作站id)
source_name: string //来源名称(若为团队小站文件,此处传入团队小站名称)
source_icon: string //来源图标(若为团队小站文件,此处传入团队icon的url)
extra?: { [prop: string]: any } //附加信息
}
source_type: number; // 来源类型(若为团队小站文件,则来源类型为团队小站文件)
source_id: number; // 来源id(若为团队小站文件,此处为团队工作站id)
source_name: string; // 来源名称(若为团队小站文件,此处传入团队小站名称)
source_icon: string; // 来源图标(若为团队小站文件,此处传入团队icon的url)
extra?: { [prop: string]: any }; // 附加信息
};
}
export type ImageMessageBody = {
name: string
url: string
size: number
w: number
h: number
thumbnail?: string // 缩略图地址
preview?: string // 预览图地址
remark: string
name: string;
url: string;
size: number;
w: number;
h: number;
thumbnail?: string; // 缩略图地址
preview?: string; // 预览图地址
remark: string;
}
export type VoiceMessageBody = {
name: string
url: string
size: number
duration: number // 语音时间:单位-ms
name: string;
url: string;
size: number;
duration: number; // 语音时间:单位-ms
}
//第一顺序 default_text 第二顺序 operator_text、receiver_text
// 第一顺序 default_text 第二顺序 operator_text、receiver_text
export type NotifyMessageBody = {
operator_id: string
receiver_ids: string[]
default_text: string //默认文本
operator_text: string //操作人文本
receiver_text: string //处理人文本
operator_id: string;
receiver_ids: string[];
default_text: string; // 默认文本
operator_text: string; // 操作人文本
receiver_text: string; // 处理人文本
}
export type TextNoticeMessageBody = {
title: string
text: string
is_at_all: boolean //是否@全部人
title: string;
text: string;
is_at_all: boolean; // 是否@全部人
}
export type VideoMessageBody = {
name: string
url: string // 生消息是本地path,熟消息是文件url_id
size: number
cover?: string
duration: number
w: number
h: number
isNeedUploaded?: boolean // pc客户端自定义属性(只有生消息的消息体才有该属性, 值为false时不需要上传, true和undefined时需要上传)
name: string;
url: string; // 生消息是本地path,熟消息是文件url_id
size: number;
cover?: string;
duration: number;
w: number;
h: number;
isNeedUploaded?: boolean; // pc客户端自定义属性(只有生消息的消息体才有该属性, 值为false时不需要上传, true和undefined时需要上传)
}
export type UrlMessageBody = {
title: string
icon: string
url: string
desc: string
title: string;
icon: string;
url: string;
desc: string;
source?: {
source_type: number //来源类型(若为团队小站文件,则来源类型为团队小站文件)
source_id: number //来源id(若为团队小站文件,此处为团队工作站id)
source_name: string //来源名称(若为团队小站文件,此处传入团队小站名称)
source_icon: string //来源图标(若为团队小站文件,此处传入团队icon的url)
extra?: { [prop: string]: any } //附加信息
}
source_type: number; // 来源类型(若为团队小站文件,则来源类型为团队小站文件)
source_id: number; // 来源id(若为团队小站文件,此处为团队工作站id)
source_name: string; // 来源名称(若为团队小站文件,此处传入团队小站名称)
source_icon: string; // 来源图标(若为团队小站文件,此处传入团队icon的url)
extra?: { [prop: string]: any }; // 附加信息
};
}
export type ForwardMessageBody = {
snap: string
chat_type: string //会话类型
chat_id: number // 会话id
msg_ids: number[] //消息id集合
snap: string;
chat_type: string; // 会话类型
chat_id: number; // 会话id
msg_ids: number[]; // 消息id集合
}
export type QuoteMessageBody = {
text: string
quote_text: string // JSON字符串
quote_msg_type: string
quote_eid: string
quote_msg_id: number //引用id
text: string;
quote_text: string; // JSON字符串
quote_msg_type: string;
quote_eid: string;
quote_msg_id: number; // 引用id
}
export type CommentForwardMessageBody = {
snap: string
channel_id: number //团队工作站id
topic_id: number // 主题id
comment_ids: number[] //评论id集合
snap: string;
channel_id: number; // 团队工作站id
topic_id: number; // 主题id
comment_ids: number[]; // 评论id集合
}
// export type SpecifiedChatRecordMsg = SpecifiedChatRecord & {
......@@ -229,21 +229,21 @@ export type CommentForwardMessageBody = {
// 客服
export interface CsUser {
id: number
oid: string
eid: string
is_deleted: boolean
delete_time: number
delete_oid: string
delete_eid: string
service_id: number
type: number
name: string
mobile: string
email: string
description: string
create_time: number
update_time: number
chat_count: number
status: number
id: number;
oid: string;
eid: string;
is_deleted: boolean;
delete_time: number;
delete_oid: string;
delete_eid: string;
service_id: number;
type: number;
name: string;
mobile: string;
email: string;
description: string;
create_time: number;
update_time: number;
chat_count: number;
status: number;
}
......@@ -5,9 +5,9 @@ export enum UserType {
}
export default interface User {
uid: string
oid: string
eid: string
jwt: string
userType: UserType
}
uid: string;
oid: string;
eid: string;
jwt: string;
userType: UserType;
};;;;;;;;;;
import { ChatOption, TokenStringGetter } from "./../model"
import { ChatOption, TokenStringGetter } from "./../model";
function Token() {
let _token: TokenStringGetter
let _token: TokenStringGetter;
return {
save(token: TokenStringGetter) {
_token = token
_token = token;
},
getToken() {
return _token()
return _token();
},
}
};
}
export default Token()
export default Token();
import Vue from "vue"
import { XChatClient, wampDebug } from "xchat-client"
import { NotifyMessage, Message } from "./models/chat"
import { ChatLoggerService } from "./logger"
import { TokenStringGetter } from "./../model"
import chatType from "../xim/chat-type"
import Vue from "vue";
import { wampDebug, XChatClient } from "xchat-client";
wampDebug(true)
import chatType from "../xim/chat-type";
const DefaultMsgPageSize = 20
import { TokenStringGetter } from "./../model";
import { ChatLoggerService } from "./logger";
import { Message, NotifyMessage } from "./models/chat";
wampDebug(true);
const DefaultMsgPageSize = 20;
function emptyFunc() {
return
}
export type MsgListener = (msg: Message) => void
......@@ -36,69 +38,69 @@ export class Xim {
private client?: XChatClient
private paramsForReconnection?: {
url: string
token: TokenStringGetter
url: string;
token: TokenStringGetter;
}
public close() {
if (this.client) {
if (this.client.connected) {
this.client.close()
this.client.close();
}
this.client.onconnected = emptyFunc
this.client.onmsg = emptyFunc
this.client = undefined
this.client.onconnected = emptyFunc;
this.client.onmsg = emptyFunc;
this.client = undefined;
}
}
private connectionPending = false
public async open(url: string, token: TokenStringGetter) {
this.connectionPending = true
this.connectionPending = true;
await new Promise((success: (p?: unknown) => void, failed) => {
this.paramsForReconnection = { url, token }
this.close()
this.paramsForReconnection = { url, token };
this.close();
token().then((t) => {
const client = new XChatClient(url, this.trimToken(t))
this.client = client
const client = new XChatClient(url, this.trimToken(t));
this.client = client;
client.onstatuschange = (status: any, details: any) => {
this.onStatusChange.call(this, status, details)
this.onStatusChange.call(this, status, details);
if (status === "DISCONNECTED" || status === "CLOSED") {
failed()
failed();
}
}
};
client.onconnected = () => {
this.onConnected.apply(this)
success()
}
client.onmsg = this.handleMsg.bind(this)
client.open()
})
}).finally(() => (this.connectionPending = false))
this.onConnected.apply(this);
success();
};
client.onmsg = this.handleMsg.bind(this);
client.open();
});
}).finally(() => (this.connectionPending = false));
}
private trimToken(token: string) {
return token.replace(/^Bearer\s/, "")
return token.replace(/^Bearer\s/, "");
}
/**
* token过期或者切换用户登录时,需要设置新的token
*/
public async setToken(token: TokenStringGetter) {
const client = this.client!
const client = this.client!;
client.close()
client.setToken(this.trimToken(await token()))
client.open()
client.close();
client.setToken(this.trimToken(await token()));
client.open();
}
public fetchMsgInBox(chatId: number, msgId: number) {
return this.client!.fetchMsgInBox(chatType, chatId, msgId)
return this.client!.fetchMsgInBox(chatType, chatId, msgId);
}
/**
......@@ -110,23 +112,23 @@ export class Xim {
msgType: string,
msg: string
) {
this.checkConnected()
this.checkConnected();
return this.client!.sendMsg(chatType, chatId, msgType, msg, "", {})
return this.client!.sendMsg(chatType, chatId, msgType, msg, "", {});
}
public inputing(chatId: number) {
this.checkConnected()
return this.client!.userInput(chatType, chatId)
this.checkConnected();
return this.client!.userInput(chatType, chatId);
}
/*
* 查询会话
*/
public fetchChatMembers(chat_id: number) {
this.checkConnected()
this.checkConnected();
return this.client!.fetchChatMembers(chat_id)
return this.client!.fetchChatMembers(chat_id);
}
/**
......@@ -140,19 +142,19 @@ export class Xim {
limit = DefaultMsgPageSize,
desc = true
): Promise<Message[]> {
this.checkConnected()
this.checkConnected();
const res = await this.client!.fetchChatMsgs(chatType, chatId, {
lid,
rid,
limit,
desc,
})
return res.args[0]
});
return res.args[0];
}
private setMessagesRead(chatId: number, msg: Message[]) {
if (msg.length === 0) return
return this.setRead(chatId, msg[0].id, msg[msg.length - 1].id)
if (msg.length === 0) return;
return this.setRead(chatId, msg[0].id, msg[msg.length - 1].id);
}
/** 查询最后一页消息 */
......@@ -161,9 +163,9 @@ export class Xim {
chatId: number,
limit: number
) {
const data = await this.queryMsgs(chatType, chatId, 0, 0, limit, true)
this.setMessagesRead(chatId, data)
return data
const data = await this.queryMsgs(chatType, chatId, 0, 0, limit, true);
this.setMessagesRead(chatId, data);
return data;
}
/** 查询上一页消息 */
......@@ -180,9 +182,9 @@ export class Xim {
msgId,
limit,
true
)
this.setMessagesRead(chatId, data)
return data
);
this.setMessagesRead(chatId, data);
return data;
}
/** 查询下一页消息 */
......@@ -199,9 +201,9 @@ export class Xim {
0,
limit,
false
)
this.setMessagesRead(chatId, data)
return data
);
this.setMessagesRead(chatId, data);
return data;
}
public on(event: "msg", chatId: number, listener: MsgListener): this
......@@ -211,16 +213,18 @@ export class Xim {
kind: "chat_change",
listener: ChatNotifyListener
): this
public on(
event: "chat_notify",
kind: string,
listener: ChatNotifyListener
): this
public on(event: "chat_notify", listener: ChatNotifyListener): this
public on(event: "status", listener: StatusChangeListener): this
public on(...args: any[]): this {
this.eventBus.$on(...this.parseEventListener(...args))
return this
this.eventBus.$on(...this.parseEventListener(...args));
return this;
}
public off(event: "msg", chatId: number, listener: MsgListener): this
......@@ -230,119 +234,121 @@ export class Xim {
kind: "chat_change",
listener: ChatNotifyListener
): this
public off(
event: "chat_notify",
kind: string,
listener: ChatNotifyListener
): this
public off(event: "chat_notify", listener: ChatNotifyListener): this
public off(event: "status", listener: StatusChangeListener): this
public off(...args: any[]): this {
this.eventBus.$off(...this.parseEventListener(...args))
return this
this.eventBus.$off(...this.parseEventListener(...args));
return this;
}
public once(...args: any[]): this {
this.eventBus.$once(...this.parseEventListener(...args))
return this
this.eventBus.$once(...this.parseEventListener(...args));
return this;
}
public emit(event: string, ...args: any[]): this {
this.eventBus.$emit(event, ...args)
return this
this.eventBus.$emit(event, ...args);
return this;
}
/**
* 移除会话(用户端/移动端使用)
*/
public async closeChat(chatId: number) {
return this.client?.setChat(chatId, { is_remove: true })
return this.client?.setChat(chatId, { is_remove: true });
}
public isConnected() {
return this.client?.connected
return this.client?.connected;
}
public setRead(chatId: number, start_msg_id: number, end_msg_id: number) {
return this.client?.syncReadMsg(chatId, start_msg_id, end_msg_id)
return this.client?.syncReadMsg(chatId, start_msg_id, end_msg_id);
}
private parseEventListener(...args: any[]): [string, Function] {
if (args.length < 2) {
throw new Error("参数个数不正确")
throw new Error("参数个数不正确");
}
const listener: Function = args[args.length - 1]
return [args.slice(0, -1).join("."), listener]
const listener: Function = args[args.length - 1];
return [args.slice(0, -1).join("."), listener];
}
private onConnected() {
// 连接成功后,需要调用pubUserInfo, 否则服务端会认为此连接无效
this.client!.pubUserInfo("")
this.debug("xim connected")
this.client!.pubUserInfo("");
this.debug("xim connected");
}
/*
DISCONNECTED: "DISCONNECTED",
CONNECTING: "CONNECTING",
CONNECTED: "CONNECTED",
CLOSED: "CLOSED",
CLOSED: "CLOSED",
*/
private onStatusChange(status: any, details: any) {
this.debug("onstatuschange", status, details)
this.emit(Events.Status, status, details)
this.debug("onstatuschange", status, details);
this.emit(Events.Status, status, details);
if (status === "DISCONNECTED" || status === "CLOSED") {
this.hanldeOffline()
this.hanldeOffline();
}
}
private hanldeOffline() {
this.debug("开始重连")
this.reOpen()
this.debug("开始重连");
this.reOpen();
}
private reOpen() {
if (this.connectionPending) return
if (this.paramsForReconnection == null) return
if (this.connectionPending) return;
if (this.paramsForReconnection == null) return;
this.open(
this.paramsForReconnection.url,
this.paramsForReconnection.token
)
);
}
private handleMsg(kind: any, msg: any) {
this.debug(`收到消息 ${new Date().getTime()}`, kind, msg)
this.debug(`收到消息 ${new Date().getTime()}`, kind, msg);
switch (kind) {
case "chat":
this.emit(`msg`, msg)
this.emit(`msg.${msg.chat_id}`, msg)
break
this.emit(`msg`, msg);
this.emit(`msg.${msg.chat_id}`, msg);
break;
case "chat_notify":
this.emit(`chat_notify`, msg)
this.emit(`chat_notify.${msg.msg_type}`, msg)
break
this.emit(`chat_notify`, msg);
this.emit(`chat_notify.${msg.msg_type}`, msg);
break;
default:
this.emit(kind, msg)
this.emit(kind, msg);
}
}
private checkConnected() {
if (!this.client!.connected) {
try {
this.client?.open()
this.client?.open();
} catch (e) {
console.error("checkConnected", e)
this.reOpen()
console.error("checkConnected", e);
this.reOpen();
}
}
}
private debug(message: any, ...params: any[]) {
ChatLoggerService.logger?.debug(message, params)
ChatLoggerService.logger?.debug(message, params);
}
}
const ximInstance = new Xim()
const ximInstance = new Xim();
export default ximInstance
export default ximInstance;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment