|
@@ -128,6 +128,7 @@
|
|
|
<!-- success -->
|
|
|
<div v-if="state.status == 'success'" class="success">
|
|
|
<div class="header"
|
|
|
+ v-if="state.detail.rewardType === RewardType.money"
|
|
|
:style="{ 'backgroundImage': `url(${require('@/assets/subject/002-back-head-top-180.svg')})` }">
|
|
|
<div class="success-title">
|
|
|
🎉 Awesome! You are Winner!
|
|
@@ -143,10 +144,31 @@
|
|
|
<img :src="require('@/assets/svg/icon-right.svg')" alt class="icon-right" />
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="header header-custom-prize"
|
|
|
+ v-else
|
|
|
+ :style="{ 'backgroundImage': `url(${successTopBgCpd})`, 'minHeight': '150px'}">
|
|
|
+ <div class="success-title">
|
|
|
+ 🎉 Awesome! You are the Winner!
|
|
|
+ </div>
|
|
|
+ <div class="custom-prize-show">
|
|
|
+
|
|
|
+
|
|
|
+ <component-zoom width="340" fontSize="22" class="custom-prise-name">
|
|
|
+ <img :src="require('@/assets/subject/icon-gift-inline.svg')" alt />
|
|
|
+ <span>{{state.detail.customizedReward}}</span>
|
|
|
+ </component-zoom>
|
|
|
+ <!-- <font-zoom :amount="state.detail.customizedReward" width="500" class="custom-prise-name" fontSize="22"></font-zoom> -->
|
|
|
+ </div>
|
|
|
+ <div class="done" @click="clickDone">
|
|
|
+ <img :src="require('@/assets/subject/001-icon-done.svg')" alt class="icon-done" />
|
|
|
+ <span>View Rewards In Wallet</span>
|
|
|
+ <img :src="require('@/assets/svg/icon-right.svg')" alt class="icon-right" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div class="luck-list-title">
|
|
|
<div>{{ state.detail.receiveCount || 0 }}/{{ state.detail.totalCount || 0 }} Winners</div>
|
|
|
<div class="right">
|
|
|
- <span class="text">
|
|
|
+ <span class="text" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<a-tooltip :title="state.detail.receiveAmountValue">
|
|
|
{{ getBit(state.detail.receiveAmountValue) }}
|
|
|
</a-tooltip>
|
|
@@ -172,7 +194,7 @@
|
|
|
<div class="luck-title" v-else>Twitter User</div>
|
|
|
<div class="luck-time">{{ moment(item.receiveTimestamp).format('MM-DD HH:mm') }}</div>
|
|
|
</div>
|
|
|
- <div class="luck-money">
|
|
|
+ <div class="luck-money" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<img :src="state.detail.currencyIconPath" alt />
|
|
|
<div class="luck-money-txt">
|
|
|
<a-tooltip :title="item.amountValue">
|
|
@@ -180,7 +202,8 @@
|
|
|
</a-tooltip>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="luck-king" v-if="item.maxAmount">
|
|
|
+ <div class="luck-custom-prize" v-else>winner</div>
|
|
|
+ <div class="luck-king" v-if="state.detail.rewardType === RewardType.money && item.maxAmount">
|
|
|
<img :src="require('@/assets/svg/icon-king-hat.svg')" alt />
|
|
|
<span>Luckiest Draw</span>
|
|
|
</div>
|
|
@@ -192,7 +215,7 @@
|
|
|
|
|
|
<!-- no-open -->
|
|
|
<div v-else-if="state.status == 'not-open'" class="not-open">
|
|
|
- <template v-if="state.detail.posterType === 2 && state.detail.customPosterInstalled">
|
|
|
+ <!-- <template v-if="state.detail.posterType === 2 && state.detail.customPosterInstalled">
|
|
|
<img class="customImg" :src="state.detail.customPosterInstalled" />
|
|
|
<div class="customBottom">
|
|
|
<div class="theme">
|
|
@@ -203,35 +226,34 @@
|
|
|
<div class="winner-info">
|
|
|
<span class="count">{{state.detail.totalCount}} Winners</span>
|
|
|
<span>to Share </span>
|
|
|
- <span class="prize-name">{{state.detail.amountValue + ' ' + state.detail.currencySymbol}}</span>
|
|
|
+ <span class="prize-name">{{state.detail.rewardType === RewardType.money ? state.detail.amountValue + ' ' + state.detail.currencySymbol : state.detail.customizedReward}}</span>
|
|
|
</div>
|
|
|
<div class="open-red" @click="clickOpenRedPacket">
|
|
|
Participate Now
|
|
|
</div>
|
|
|
</div>
|
|
|
- </template>
|
|
|
- <template v-else>
|
|
|
- <img :src="require('@/assets/subject/002-card.svg')" alt="">
|
|
|
- <img class="open-gif" :src="require('@/assets/gif/002.png')" />
|
|
|
-
|
|
|
- <img :src="require('@/assets/svg/icon-participate.svg')" alt="" class="open" @click="clickOpenRedPacket">
|
|
|
- <div class="title" v-if="state.detail.postUserInfo">
|
|
|
- <img :src="state.detail.postUserInfo.avatarUrl" alt />
|
|
|
- <span>{{ state.detail.postUserInfo.nickName || 'FutureDoctor' }}</span>
|
|
|
- </div>
|
|
|
- <div class="money-area">
|
|
|
- <div class="txt">{{ state.detail.currencySymbol }} GIVEAWAY</div>
|
|
|
- <div class="coin">
|
|
|
- <img :src="state.detail.currencyIconPath" alt />
|
|
|
- <font-amount :amount="state.detail.amountValue" style="color:#fff;"></font-amount>
|
|
|
- </div>
|
|
|
- <div class="time-area">
|
|
|
- <div></div>
|
|
|
- <img :src="require('@/assets/svg/icon-time.svg')" />
|
|
|
- <span>{{ state.count_down_time }}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
+ </template> -->
|
|
|
+ <!-- <template v-else> -->
|
|
|
+ <custom-card-cover
|
|
|
+ :data="{
|
|
|
+ totalCount: state.detail.totalCount,
|
|
|
+ amountValue: state.detail.amountValue,
|
|
|
+ tokenSymbol: state.detail.currencySymbol,
|
|
|
+ currencyIconUrl: state.detail.currencyIconPath,
|
|
|
+ type: PlayType.lottery,
|
|
|
+ validityDuration: state.count_down_time,
|
|
|
+ countDown: state.count_down_time,
|
|
|
+ userInfo: {
|
|
|
+ nickName: state.detail.postUserInfo.name,
|
|
|
+ avatarUrl: state.detail.postUserInfo.avatarUrl
|
|
|
+ },
|
|
|
+ rewardType: state.detail.rewardType,
|
|
|
+ customizedReward: state.detail.customizedReward,
|
|
|
+ customPosterUrl: state.detail.customPosterInstalled
|
|
|
+ }"
|
|
|
+ @clickOpenRedPacket = "clickOpenRedPacket"
|
|
|
+ ></custom-card-cover>
|
|
|
+ <!-- </template> -->
|
|
|
</div>
|
|
|
|
|
|
|
|
@@ -242,7 +264,7 @@
|
|
|
</div>
|
|
|
<div class="luck-list-title">
|
|
|
<div>{{ state.detail.receiveCount || 0 }}/{{ state.detail.totalCount || 0 }} Winners</div>
|
|
|
- <div class="right">
|
|
|
+ <div class="right" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<span class="text">
|
|
|
<a-tooltip :title="state.detail.receiveAmountValue">
|
|
|
{{ getBit(state.detail.receiveAmountValue) }}
|
|
@@ -270,7 +292,7 @@
|
|
|
<div class="luck-title" v-else>Twitter User</div>
|
|
|
<div class="luck-time">{{ moment(item.receiveTimestamp).format('MM-DD HH:mm:ss') }}</div>
|
|
|
</div>
|
|
|
- <div class="luck-money">
|
|
|
+ <div class="luck-money" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<img :src="state.detail.currencyIconPath" alt />
|
|
|
<div class="luck-money-txt">
|
|
|
<a-tooltip :title="item.amountValue">
|
|
@@ -278,8 +300,8 @@
|
|
|
</a-tooltip>
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
- <div class="luck-king" v-if="item.maxAmount">
|
|
|
+ <div class="luck-custom-prize" v-else>winner</div>
|
|
|
+ <div class="luck-king" v-if="state.detail.rewardType === RewardType.money && item.maxAmount">
|
|
|
<img :src="require('@/assets/svg/icon-king-hat.svg')" alt />
|
|
|
<span>Luckiest Draw</span>
|
|
|
</div>
|
|
@@ -345,7 +367,7 @@
|
|
|
|
|
|
<div class="luck-list-title" v-show="state.close_status != '等待结果'">
|
|
|
<div>{{ state.detail.receiveCount || 0 }}/{{ state.detail.totalCount || 0 }} Winners</div>
|
|
|
- <div class="right">
|
|
|
+ <div class="right" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<span class="text">
|
|
|
<a-tooltip :title="state.detail.receiveAmountValue">
|
|
|
{{ getBit(state.detail.receiveAmountValue) }}
|
|
@@ -374,7 +396,7 @@
|
|
|
<div class="luck-title" v-else>Twitter User</div>
|
|
|
<div class="luck-time">{{ moment(item.receiveTimestamp).format('MM-DD HH:mm:ss') }}</div>
|
|
|
</div>
|
|
|
- <div class="luck-money">
|
|
|
+ <div class="luck-money" v-if="state.detail.rewardType === RewardType.money">
|
|
|
<img :src="state.detail.currencyIconPath" alt />
|
|
|
<div class="luck-money-txt">
|
|
|
<a-tooltip :title="item.amountValue">
|
|
@@ -382,7 +404,8 @@
|
|
|
</a-tooltip>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="luck-king" v-if="item.maxAmount">
|
|
|
+ <div class="luck-custom-prize" v-else>winner</div>
|
|
|
+ <div class="luck-king" v-if="state.detail.rewardType === RewardType.money && item.maxAmount">
|
|
|
<img :src="require('@/assets/svg/icon-king-hat.svg')" alt />
|
|
|
<span>Luckiest Draw</span>
|
|
|
</div>
|
|
@@ -429,11 +452,13 @@ export default {
|
|
|
}
|
|
|
</script>
|
|
|
<script setup>
|
|
|
-import { onMounted, reactive, ref } from "vue";
|
|
|
+import { onMounted, reactive, ref, computed } from "vue";
|
|
|
import { getPostDetail, getRedPacket, finishRedPacket, oneKeyLike, oneKeyReTweet, oneKeyFollow, getTaskDetail, getReceivedList, addFinishEvent } from '@/http/redPacket.js'
|
|
|
import { getQueryString, guid, getBit, formatSecondsAsDaysOrTime } from '@/uilts/help.js'
|
|
|
import { message } from 'ant-design-vue';
|
|
|
import FontAmount from '@/view/components/font-amount.vue'
|
|
|
+import FontZoom from '@/view/components/font-zoom.vue'
|
|
|
+import ComponentZoom from '@/view/components/component-zoom.vue'
|
|
|
import GetMore from '@/view/iframe/publish/components/get-more.vue'
|
|
|
import { setChromeStorage, getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
|
|
|
import Report from "@/log-center/log"
|
|
@@ -443,7 +468,10 @@ import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
|
|
|
import { getSetting, putSetting } from '@/http/user'
|
|
|
import { getFrontConfig } from "@/http/account";
|
|
|
import { getInviteGuildInfo } from "@/http/discordApi";
|
|
|
-import GlobalTip from '@/view/components/global-tip.vue'
|
|
|
+import GlobalTip from '@/view/components/global-tip.vue';
|
|
|
+import customCardCover from '@/view/components/custom-card-cover.vue';
|
|
|
+import { RewardType, PlayType } from "@/types";
|
|
|
+
|
|
|
var moment = require('moment');
|
|
|
|
|
|
let discordAuthorizeRequired = false;
|
|
@@ -475,6 +503,8 @@ let state = reactive({
|
|
|
page_index: 1,
|
|
|
page_size: 20,
|
|
|
srcContentId: '',
|
|
|
+ customCover: '',
|
|
|
+ customGiveaway: '',
|
|
|
error_txt: `oops, new accounts cannot participate in this event,`,
|
|
|
receiveAmount: 0,
|
|
|
money: 0,
|
|
@@ -495,6 +525,17 @@ let state = reactive({
|
|
|
|
|
|
let fullName = '';
|
|
|
|
|
|
+let successTopBgCpd = computed(() => {
|
|
|
+ const { rewardType } = state.detail
|
|
|
+ switch (rewardType) {
|
|
|
+ case RewardType.custom:
|
|
|
+ return require('@/assets/subject/success-top-bg-2.svg');
|
|
|
+ default:
|
|
|
+ return require('@/assets/subject/002-back-head-top-180.svg');
|
|
|
+ break;
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
function clickRetry() {
|
|
|
init()
|
|
|
}
|
|
@@ -560,6 +601,8 @@ async function clickLikeBtn() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
function clickDone() {
|
|
@@ -572,7 +615,9 @@ function clickDone() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
function handleScroll(e) {
|
|
@@ -673,6 +718,8 @@ async function clickRetweetBtn() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -733,7 +780,9 @@ async function clickReply(params) {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -775,7 +824,9 @@ async function clickRepostFacebook(params) {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -983,7 +1034,9 @@ async function clickFollowAll(item, is_all) {
|
|
|
let _log_obj = {
|
|
|
pageSource: Report.pageSource.task_page,
|
|
|
businessType: Report.businessType.buttonClick,
|
|
|
- objectType: Report.objectType.follow
|
|
|
+ objectType: Report.objectType.follow,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
}
|
|
|
if (is_all) {
|
|
|
_log_obj.objectType = Report.objectType.follow_button
|
|
@@ -1107,7 +1160,9 @@ const showSuccessPage = () => {
|
|
|
senderId: state.userId,
|
|
|
isOldTwitterFans: reportParams.done.follow,
|
|
|
isOldDiscordFans: reportParams.done.join_discord,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
}
|
|
@@ -1126,7 +1181,9 @@ const showNotOpenPage = () => {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
const showOpenedPage = () => {
|
|
@@ -1149,7 +1206,9 @@ const showOpenedPageReport = () => {
|
|
|
senderId: state.userId,
|
|
|
isOldTwitterFans: state.done.follow,
|
|
|
isOldDiscordFans: state.done.join_discord,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -1186,7 +1245,7 @@ const handleStatusPage = () => {
|
|
|
// 如果 任务完成状态 = 未完成 & 红包状态 = 已结束
|
|
|
// 显示过期页面
|
|
|
// 如果 任务完成状态 = 已经完成
|
|
|
- // 如果 领取到红包金额 = 0 & 红包状态 = 已结束
|
|
|
+ // 如果 (货币奖品类型 领取到红包金额 = 0 || 通用奖品类型 winner = 0) & 红包状态 = 已结束
|
|
|
// 显示兔子页面
|
|
|
// 否则如果 红包状态 = 已结束
|
|
|
// 显示成功页面
|
|
@@ -1196,7 +1255,7 @@ const handleStatusPage = () => {
|
|
|
// 如果 任务完成状态 = 已经过期
|
|
|
// 如果 红包状态 = 进行中
|
|
|
// 显示未打开页面
|
|
|
- // 否则
|
|
|
+ // 否则
|
|
|
// 显示已经过期页面
|
|
|
|
|
|
// 如果 我没有领取过 & 红包状态 = 进行中
|
|
@@ -1210,6 +1269,7 @@ const handleStatusPage = () => {
|
|
|
|
|
|
// -------- 华丽的分割线 --------
|
|
|
// 如果 红包状态 = 未开始
|
|
|
+
|
|
|
if (state.detail.status == 0) {
|
|
|
showNotOpenPage()
|
|
|
return
|
|
@@ -1240,7 +1300,7 @@ const handleStatusPage = () => {
|
|
|
//如果 任务完成状态 = 已经完成
|
|
|
} else if (state.detail.myReceived.taskFinishStatus == 1) {
|
|
|
// 领取到空红包 & 红包状态 = 已结束
|
|
|
- if (state.receiveAmount == 0 && state.detail.status == 2) {
|
|
|
+ if (((state.detail.rewardType === RewardType.money && state.receiveAmount == 0) || (state.detail.rewardType === RewardType.custom && state.detail.myReceived.winner === 0)) && state.detail.status == 2) {
|
|
|
showRabbitPage()
|
|
|
showRabbitPageReport()
|
|
|
} else if (state.detail.status == 2) {
|
|
@@ -1331,6 +1391,8 @@ function init(initParams) {
|
|
|
state.tweetId = state.srcContentId;
|
|
|
state.userId = res.data.srcUserId;
|
|
|
state.tweet_author = state.detail.postUserInfo && state.detail.postUserInfo.nickName || '';
|
|
|
+ state.customCover = state.detail.posterType == 2 ? 1 : 0;
|
|
|
+ state.customGiveaway = state.detail.posterType == 2 ? 1 : 0;
|
|
|
// 不要删除这个console
|
|
|
console.log('postBizData', state.detail)
|
|
|
checkFacebookReply();
|
|
@@ -1572,7 +1634,9 @@ function handleRedPacket() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -1634,6 +1698,8 @@ function handleFinishRedPacket() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
}, {
|
|
|
get_giveaway_result: Report.extParams.success
|
|
|
});
|
|
@@ -1714,6 +1780,8 @@ function handleFinishRedPacket() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
}, {
|
|
|
get_giveaway_result: Report.extParams.failure,
|
|
|
});
|
|
@@ -1731,6 +1799,8 @@ function handleFinishRedPacket() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
}, {
|
|
|
get_giveaway_result: Report.extParams.failure,
|
|
|
});
|
|
@@ -2037,7 +2107,9 @@ async function joinDiscord() {
|
|
|
postId: state.postId,
|
|
|
srcContentId: state.tweetId,
|
|
|
senderId: state.userId,
|
|
|
- redPacketType: 1
|
|
|
+ redPacketType: 1,
|
|
|
+ customCover: state.customCover,
|
|
|
+ customGiveaway: state.customGiveaway,
|
|
|
});
|
|
|
|
|
|
let url = getInviteUrl();
|
|
@@ -2448,8 +2520,25 @@ body {
|
|
|
color: #fff;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .custom-prize-show {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ height: 44px;
|
|
|
+ margin-top: 20px;
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 24px;
|
|
|
+ height: 24px;
|
|
|
+ margin-right: 9px;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
.luck-list-title {
|
|
|
/* margin-top: 47px;*/
|
|
|
margin: 0 16px;
|
|
@@ -2582,14 +2671,19 @@ body {
|
|
|
color: #444444;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .luck-custom-prize {
|
|
|
+ font-weight: 500;
|
|
|
+ font-size: 14px;
|
|
|
+ letter-spacing: 0.3px;
|
|
|
+ color: #F5B945;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.luck-item:last-child {
|
|
|
border: 0;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
.close {
|
|
@@ -2752,6 +2846,15 @@ body {
|
|
|
margin-top: 10px;
|
|
|
border-bottom: 1px solid #ECECEC;
|
|
|
}
|
|
|
+
|
|
|
+ .header-custom-prize {
|
|
|
+ align-items: flex-start;
|
|
|
+ .success-title {
|
|
|
+ line-height: 21px;
|
|
|
+ margin-top: 23px;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.opened {
|