douyin/src/pages/people/FindAcquaintance.vue
2024-04-02 17:24:18 +08:00

544 lines
13 KiB
Vue

<template>
<div class="FindAcquaintance" id="FindAcquaintance">
<div class="header">
<dy-back mode="light" @click="back"></dy-back>
<Indicator
style="width: 50%"
tabStyleWidth="40%"
:tabTexts="['发现朋友', '熟人列表']"
v-model:active-index="currentSlideItemIndex"
>
</Indicator>
<img
src="../../assets/img/icon/menu-gray.png"
alt=""
class="option"
@click="moreOptionDialog = true"
/>
</div>
<SlideHorizontal v-model:index="currentSlideItemIndex">
<SlideItem class="tab1" style="overflow: auto">
<div class="mr2r ml2r mt1r">
<Search
v-if="!isShowRightText"
placeholder="搜索用户名字/抖音号"
:is-show-right-text="false"
@click="isShowRightText = true"
>
<img
src="../../assets/img/icon/scan-gray.png"
style="width: 10rem; transform: scale(1.5)"
@click.stop="$nav('/scan')"
/>
</Search>
<Search
v-else
v-model="searchKey"
:is-show-right-text="true"
@notice="search"
@clear="isSearch = false"
></Search>
</div>
<div class="no-search" v-if="!isShowRightText">
<div class="look-address-list" @click="findAddressListDialog = true">
<img class="left" src="../../assets/img/icon/people/address-book.png" alt="" />
<div class="right">
<div class="notice">
<div class="text1">查看通讯录朋友</div>
<div class="text2">看看有谁在抖音</div>
</div>
<dy-back direction="right"></dy-back>
</div>
</div>
<div class="line"></div>
<div class="title">
朋友推荐
<img
src="../../assets/img/icon/about-gray.png"
style="width: 10rem; margin-left: 2rem"
/>
</div>
<People
:key="i"
v-for="(item, i) in friends.all"
:people="item"
mode="recommend"
></People>
</div>
<div class="is-search" v-else>
<div class="tooltip" v-if="searchKey && !isSearch">
<img src="../../assets/img/icon/close.svg" style="width: 10rem" />
搜索用户名字/抖音号:<span class="searchKey">{{ searchKey }}</span>
</div>
<!-- TODO -->
<template v-if="isSearch">
<People
:key="i"
v-for="(item, i) in friends.all"
:people="item"
mode="recommend"
></People>
</template>
</div>
</SlideItem>
<SlideItem class="tab2" style="overflow: auto">
<Search placeholder="搜索用户备注或名字" class="mr20p ml20p mt10p"></Search>
<div class="title">{{ friends.all.length }} 位朋友</div>
<People :key="i" v-for="(item, i) in friends.all" :people="item" mode="friend"></People>
<NoMore class="mb5r" />
</SlideItem>
</SlideHorizontal>
<transition name="fade">
<BaseMask v-if="maskDialog" @click="maskDialog = false"/>
</transition>
<transition name="fade">
<div
v-if="findAddressListDialog"
class="find-address-list-dialog"
@click="findAddressListDialog = false"
>
<div class="body">
<div>
<img src="../../assets/img/icon/head-image.jpeg" alt="" />
</div>
<span class="title">发现通讯录好友</span>
<span class="desc">
<span>授权通讯录,看看哪些好友在使用抖音。具体使用场景及撤回授权方式详见</span>
<span class="link" @click="$nav('/service-protocol', { type: '“抖音”用户服务协议' })"
>《隐私政策》</span
>
</span>
</div>
<div class="footer">
<div @click="findAddressListDialog = false">暂时不要</div>
<div @click="$nav('/address-list')">发现好友</div>
</div>
</div>
</transition>
<from-bottom-dialog
page-id="FindAcquaintance"
v-model="moreOptionDialog"
:show-heng-gang="false"
height="210rem"
mode="white"
>
<div class="more-option-dialog">
<div class="row" @click="handleClick">
<span>站外好友口令</span>
</div>
<div class="row" @click="$nav('/scan')">
<span>扫一扫加好友</span>
</div>
<div class="row" style="border-bottom: none" @click="$nav('/face-to-face')">
<span>面对面加好友</span>
</div>
<div class="space"></div>
<div class="row" @click="moreOptionDialog = false">取消</div>
</div>
</from-bottom-dialog>
<transition name="fade">
<div class="out-web-img-account-dialog" v-if="outWebImgAccountDialog">
<img src="../../assets/img/icon/head-image.jpeg" alt="" class="img-account" />
<img
src="../../assets/img/icon/close-white.png"
alt=""
class="close"
@click="outWebImgAccountDialog = false"
/>
<div class="desc">
<div>这是你的图片口令</div>
<div>你可以通过此口令添加站外好友</div>
</div>
<div class="notice">
<img src="../../assets/img/icon/close.svg" alt="" />
<span>图片口令已保存到相册</span>
</div>
<div class="btn wechat" @click="outWebImgAccountDialog = false">
<img src="../../assets/img/icon/close.svg" alt="" />
<span>发给微信好友</span>
</div>
<div class="btn qq" @click="outWebImgAccountDialog = false">
<img src="../../assets/img/icon/close.svg" alt="" />
<span>发给QQ好友</span>
</div>
</div>
</transition>
</div>
</template>
<script>
import People from './components/People'
import Search from '../../components/Search'
import Indicator from '../../components/slide/Indicator'
import FromBottomDialog from '../../components/dialog/FromBottomDialog'
import { mapState } from 'pinia'
import { useBaseStore } from '@/store/pinia'
export default {
name: 'FindAcquaintance',
components: {
People,
Search,
Indicator,
FromBottomDialog
},
data() {
return {
findAddressListDialog: false,
moreOptionDialog: false,
outWebImgAccountDialog: false,
indicatorFixed: false,
isShowRightText: false,
isSearch: false,
searchKey: '',
currentSlideItemIndex: 0,
list: [
{
type: 1
},
{
type: 2
},
{
type: 3
},
{
type: 4
},
{
type: 5
}
]
}
},
computed: {
maskDialog: {
get() {
return this.findAddressListDialog || this.outWebImgAccountDialog
},
set() {
this.findAddressListDialog = this.outWebImgAccountDialog = false
}
},
...mapState(useBaseStore, ['friends'])
},
mounted() {},
methods: {
async search() {
this.$showLoading()
await this.$sleep(500)
this.$hideLoading()
this.isSearch = true
},
back() {
if (this.isShowRightText) {
this.isShowRightText = false
} else {
this.$back()
}
},
handleClick() {
this.outWebImgAccountDialog = true
this.moreOptionDialog = false
}
}
}
</script>
<style scoped lang="less">
@import '../../assets/less/index';
.from-bottom-enter-active,
.from-bottom-leave-active {
transition: transform 0.2s ease;
}
.from-bottom-enter-from,
.from-bottom-leave-to {
transform: translate3d(0, 50vh, 0);
}
.FindAcquaintance {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
color: white;
font-size: 14rem;
.header {
height: 60rem;
font-size: 14rem;
padding: 0 20rem;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--line-color);
img {
height: 20rem;
}
}
.tab2 {
box-sizing: border-box;
padding: 20rem;
.title {
margin-top: var(--page-padding);
margin-bottom: 10rem;
color: var(--second-text-color);
font-size: 12rem;
}
}
.tab1 {
.title {
display: flex;
align-items: center;
margin-top: 20rem;
margin-bottom: 10rem;
color: var(--second-text-color);
font-size: 12rem;
img {
width: 10rem;
}
}
.no-search {
padding: 20rem;
.look-address-list {
margin: 0 0 20rem 0;
display: flex;
justify-content: space-between;
align-items: center;
.left {
background: var(--second-btn-color-tran);
border-radius: 50%;
padding: 12rem;
width: 22rem;
margin-right: 15rem;
}
.right {
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
img {
width: 14rem;
}
.notice {
.text1 {
font-size: 14rem;
margin-bottom: 5rem;
}
.text2 {
font-size: 12rem;
color: var(--second-text-color);
}
}
}
}
}
.is-search {
padding: 0 20rem 20rem 20rem;
.tooltip {
font-size: 12rem;
margin-top: 20rem;
display: flex;
align-items: center;
color: var(--second-text-color);
img {
margin-right: 10rem;
width: 15rem;
}
.searchKey {
color: yellow;
}
}
}
}
.find-address-list-dialog {
z-index: 4;
position: fixed;
left: 50%;
top: 50%;
transform: translate3d(-50%, -50%, 0);
width: 70vw;
color: black;
background: white;
box-sizing: border-box;
border-radius: 3rem;
display: flex;
flex-direction: column;
align-items: center;
.body {
padding: 20rem;
display: flex;
flex-direction: column;
align-items: center;
img {
height: 60rem;
margin-bottom: 20rem;
}
.title {
font-size: 16rem;
font-weight: bold;
margin-bottom: 10rem;
}
.desc {
font-size: 10rem;
color: gray;
}
.link {
color: rgb(18, 100, 149);
}
}
@footer-border-color: #eaeaf1;
.footer {
width: 100%;
display: flex;
height: 40rem;
border-top: 1px solid @footer-border-color;
font-size: 14rem;
div {
display: flex;
align-items: center;
justify-content: center;
width: 49%;
text-align: center;
border-right: 1px solid @footer-border-color;
opacity: 0.5;
&:nth-last-child(1) {
border-right: none;
opacity: 1;
}
}
}
}
.more-option-dialog {
font-size: 14rem;
.space {
height: 10rem;
background: whitesmoke;
}
.row {
height: 50rem;
color: black;
background: white;
box-sizing: border-box;
width: 100%;
//border-bottom: 1px solid ghostwhite;
border-bottom: 1px solid gainsboro;
display: flex;
align-items: center;
justify-content: center;
}
}
.out-web-img-account-dialog {
z-index: 4;
position: fixed;
left: 50%;
top: 50%;
transform: translate3d(-50%, -50%, 0);
width: 80vw;
color: black;
background: white;
box-sizing: border-box;
border-radius: 3rem;
display: flex;
flex-direction: column;
align-items: center;
padding: 20rem;
.img-account {
}
.close {
top: 10rem;
right: 10rem;
position: absolute;
background: var(--second-btn-color-tran);
padding: 4rem;
width: 10rem;
border-radius: 50%;
}
.desc {
margin-top: 20rem;
text-align: center;
}
.notice {
margin-top: 20rem;
display: flex;
align-items: center;
color: var(--second-text-color);
img {
margin-right: 10rem;
width: 10rem;
}
}
.btn {
width: 100%;
height: 40rem;
border-radius: 3rem;
margin-top: 20rem;
display: flex;
justify-content: center;
align-items: center;
color: white;
&:nth-last-child(1) {
margin-top: 10rem;
}
&.wechat {
background: rgb(62, 174, 56);
}
&.qq {
background: rgb(24, 183, 238);
}
img {
margin-right: 10rem;
width: 10rem;
}
}
}
}
</style>