123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- <template>
- <section class="search-result-container">
- <div v-if="!showEmptyView" class="search-result">
- <ul style="display: block">
- <li class="search-result-category-container" v-if="options.user && sharedSearchState.userSearchResult.length > 0">
- <label>{{ $t('search.new_user') }}</label>
- <ul>
- <li v-for="(user, index) in toShowUserList" :key="index">
- <div class="search-result-item contact">
- <img :src="user.portrait">
- <span>{{ user.displayName }}</span>
- <button style="margin-right: 0; margin-left: auto; border: none" size="mini" @click.stop="addFriend(user)">{{ $t('common.add') }}</button>
- </div>
- </li>
- </ul>
- <div v-if="!shouldShowAllUser && this.sharedSearchState.userSearchResult.length > 5"
- class="show-all"
- @click.stop="showAllUser">
- {{ $t('search.view_all') + this.sharedSearchState.userSearchResult.length }}
- </div>
- </li>
- <li class="search-result-category-container" v-if="options.contact && sharedSearchState.contactSearchResult.length > 0">
- <label>{{ $t('common.contact') }}</label>
- <ul>
- <li v-for="(contact, index) in toShowContactList" :key="index">
- <div class="search-result-item" @click.stop="chatToContact(contact)">
- <img :src="contact.portrait">
- <span>{{ contact._displayName }}</span>
- </div>
- </li>
- </ul>
- <div v-if="!shouldShowAllContact && this.sharedSearchState.contactSearchResult.length > 5"
- class="show-all"
- @click.stop="showAllContact">
- {{ $t('search.view_all') + this.sharedSearchState.contactSearchResult.length }}
- </div>
- </li>
- <li class="search-result-category-container" v-if="options.group && sharedSearchState.groupSearchResult.length > 0">
- <label>{{ $t('contact.group') }}</label>
- <ul>
- <li v-for="(group, index) in toShowGroupList" :key="index">
- <div class="search-result-item" @click="chatToGroup(group)">
- <img :src="group.portrait" alt="">
- <span>{{ group.remark ? group.remark : group.name }}</span>
- </div>
- </li>
- </ul>
- <div v-if="!shouldShowAllGroup && this.sharedSearchState.groupSearchResult.length > 5"
- class="show-all"
- @click.stop="showAllGroup">
- {{ $t('search.view_all') + this.sharedSearchState.groupSearchResult.length }}
- </div>
- </li>
- <li class="search-result-category-container" v-if="options.conversation && sharedSearchState.conversationSearchResult.length > 0">
- <label>聊天记录</label>
- <ul>
- <li v-for="(convR, index) in toShowConversationList" :key="index">
- <div class="search-result-item conversation" @click="onClickConversationSearchResultItem(convR)">
- <img :src="convR._conversationInfo.conversation._target.portrait" alt="">
- <div class="title-desc">
- <span>{{ convR._conversationInfo.conversation._target._displayName }}</span>
- <span class="desc">{{ conversationMatchDesc(convR) }}</span>
- </div>
- </div>
- </li>
- </ul>
- <div v-if="!shouldShowAllConversation&& this.sharedSearchState.conversationSearchResult.length > 5"
- class="show-all"
- @click.stop="showAllConversation">
- {{ $t('search.view_all') + this.sharedSearchState.conversationSearchResult.length }}
- </div>
- </li>
- </ul>
- </div>
- <div v-else class="empty-container">
- <text>没有搜索结果</text>
- </div>
- </section>
- </template>
- <script>
- import store from "@/store";
- import Conversation from "@/wfc/model/conversation";
- import ConversationType from "@/wfc/model/conversationType";
- import FriendRequestView from "@/pages/contact/FriendRequestView";
- import wfc from "../../wfc/client/wfc";
- export default {
- name: "SearchResultView",
- props: {
- query: {
- required: false,
- type: String,
- default: '',
- },
- options: {
- required: false,
- type: Object,
- default: () => {
- return {
- user: true,
- contact: true,
- conversation: true,
- group: true,
- }
- }
- }
- },
- data() {
- return {
- sharedSearchState: store.state.search,
- sharedMiscState: store.state.misc,
- shouldShowAllUser: false,
- shouldShowAllContact: false,
- shouldShowAllGroup: false,
- shouldShowAllConversation: false,
- }
- },
- mounted() {
- // do nothing
- let enableCount = 0;
- for (const key in this.options) {
- if (this.options[key]) {
- enableCount++;
- }
- }
- if (enableCount === 1) {
- this.shouldShowAllUser = this.options.user;
- this.shouldShowAllContact = this.options.contact;
- this.shouldShowAllGroup = this.options.group;
- this.shouldShowAllConversation = this.options.conversation;
- }
- },
- beforeDestroy() {
- store.setSearchQuery('')
- },
- watch: {
- // "query":function (val, oldVal){
- // console.log('searchView query changed:', val, oldVal)
- // }
- // or
- query() {
- console.log('searchView query changed:', this.query, this.options)
- // store.setSearchQuery(this.query, this.options)
- },
- },
- methods: {
- addFriend(user) {
- console.log('add friend', user);
- wfc.sendFriendRequest(user.uid, '你好', '', () => {
- uni.showToast({
- title: '发送好友请求成功',
- icon: 'none',
- });
- }, err => {
- console.log('sendFriendRequest fail', err)
- uni.showToast({
- title: ' 发送好友请求失败',
- icon: 'none',
- });
- })
- // this.$modal.show(
- // FriendRequestView,
- // {
- // userInfo: user,
- // },
- // {
- // name: 'friend-request-modal',
- // width: 600,
- // height: 250,
- // clickToClose: false,
- // }, {})
- },
- showAllUser() {
- this.shouldShowAllUser = true;
- },
- showAllContact() {
- this.shouldShowAllContact = true;
- },
- showAllGroup() {
- this.shouldShowAllGroup = true;
- },
- showAllConversation() {
- this.shouldShowAllConversation = true;
- },
- chatToContact(contact) {
- let conversation = new Conversation(ConversationType.Single, contact.uid, 0);
- store.setCurrentConversation(conversation);
- this.$go2ConversationPage();
- },
- chatToGroup(group) {
- let conversation = new Conversation(ConversationType.Group, group.target, 0);
- store.setCurrentConversation(conversation);
- this.$go2ConversationPage();
- },
- onClickConversationSearchResultItem(result) {
- if (result.matchMessage) {
- store.setCurrentConversation(result.conversation);
- this.$go2ConversationPage();
- } else {
- store.state.search.conversation = result.conversation;
- uni.navigateTo({
- url: '/pages/search/SearchConversationMessagePage'
- }
- );
- }
- },
- showMessageHistoryPage() {
- let hash = window.location.hash;
- let url = window.location.origin;
- if (hash) {
- url = window.location.href.replace(hash, '#/message-history');
- } else {
- url += "/message-history"
- }
- ipcRenderer.send(IPCRendererEventType.showMessageHistoryPage, {
- url: url,
- });
- console.log(IPCRendererEventType.showMessageHistoryPage, url)
- },
- conversationMatchDesc(convSearchResult) {
- // #ifdef APP-PLUS
- if (convSearchResult.matchMessage) {
- return convSearchResult.matchMessage.messageContent.digest(convSearchResult.matchMessage);
- } else {
- return convSearchResult.matchCount + '条相关聊天记录';
- }
- // #endif
- // #ifdef H5
- return '';
- // #endif
- },
- },
- computed: {
- toShowUserList: function () {
- return !this.shouldShowAllUser && this.sharedSearchState.userSearchResult.length > 5 ? this.sharedSearchState.userSearchResult.slice(0, 4) : this.sharedSearchState.userSearchResult;
- },
- toShowContactList: function () {
- return !this.shouldShowAllContact && this.sharedSearchState.contactSearchResult.length > 5 ? this.sharedSearchState.contactSearchResult.slice(0, 4) : this.sharedSearchState.contactSearchResult;
- },
- toShowGroupList: function () {
- return !this.shouldShowAllGroup && this.sharedSearchState.groupSearchResult.length > 5 ? this.sharedSearchState.groupSearchResult.slice(0, 4) : this.sharedSearchState.groupSearchResult;
- },
- toShowConversationList: function () {
- return !this.shouldShowAllConversation && this.sharedSearchState.conversationSearchResult.length > 5 ? this.sharedSearchState.conversationSearchResult.slice(0, 4) : this.sharedSearchState.conversationSearchResult;
- },
- showEmptyView() {
- const {userSearchResult, contactSearchResult, groupSearchResult, conversationSearchResult} = this.sharedSearchState;
- return userSearchResult.length + contactSearchResult.length + groupSearchResult.length + conversationSearchResult.length === 0;
- }
- },
- directives: {},
- }
- </script>
- <style lang="css" scoped>
- .search-result-container {
- margin-top: 35px;
- height: calc(100% - 35px);
- /*background-color: red;*/
- background-color: #f3f3f3e5;
- }
- .search-result-container .empty-container {
- display: flex;
- height: 100%;
- justify-content: center;
- align-items: center;
- color: grey;
- }
- .search-result-container ul {
- list-style: none;
- background-color: white;
- }
- .search-result-category-container {
- /*position: sticky;*/
- /*min-height: 40px;*/
- /*!* #ifndef APP-PLUS-NVUE *!*/
- /*position: -webkit-sticky;*/
- /*!* #endif *!*/
- /*top: 0;*/
- /*left: 0;*/
- }
- .search-result-category-container label {
- color: #828282;
- background: #EDEDED;
- display: block;
- padding-top: 10px;
- padding-bottom: 2px;
- padding-left: 12px;
- border-bottom: 1px solid #eeeeee;
- }
- .search-result-item {
- background-color: white;
- padding: 10px 12px;
- display: flex;
- align-items: center;
- }
- .search-result-item:active {
- background-color: #d9d9d9;
- }
- .search-result-item img {
- width: 34px;
- height: 34px;
- border-radius: 2px;
- }
- .search-result-item span {
- font-size: 14px;
- padding-left: 10px;
- }
- .search-result-item.conversation .title-desc {
- display: flex;
- flex-direction: column;
- }
- .search-result-item.conversation .title-desc .desc {
- font-size: 12px;
- color: grey;
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- overflow: hidden;
- }
- .search-result-item.contact button {
- margin-left: auto;
- padding: 3px 10px;
- border-radius: 3px;
- border: 1px solid #cccccc;
- outline: none;
- }
- .search-result-item.contact button:active {
- background: #cccccc;
- }
- .search-result-item.message {
- height: 54px;
- display: flex;
- align-items: center;
- }
- .show-all {
- padding-left: 12px;
- color: #66789d;
- font-size: 12px;
- }
- </style>
|