gengxin
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
const memoryCards = require('../../data/memoryCards')
|
||||
const {
|
||||
getProgress,
|
||||
getSettings,
|
||||
saveSettings,
|
||||
} = require('../../utils/storage')
|
||||
const {
|
||||
getCollectedMemories,
|
||||
} = require('../../utils/memoryCollection')
|
||||
const { chapterRoute } = require('../../utils/chapterRoute')
|
||||
|
||||
function twoDigits(value) {
|
||||
return String(value).padStart(2, '0')
|
||||
}
|
||||
|
||||
Page({
|
||||
data: {
|
||||
memories: [],
|
||||
memoryCount: 0,
|
||||
fontScale: 'large',
|
||||
},
|
||||
|
||||
onShow() {
|
||||
const progress = getProgress()
|
||||
const settings = getSettings()
|
||||
const memories = getCollectedMemories(progress, memoryCards).map(
|
||||
(memory, index) => ({
|
||||
...memory,
|
||||
chapterLabel: `第${twoDigits(memory.chapterNumber)}回`,
|
||||
pageLabel: `第${index + 1}页`,
|
||||
characterInitial: memory.characterName.slice(0, 1),
|
||||
}),
|
||||
)
|
||||
this.setData({
|
||||
memories,
|
||||
memoryCount: memories.length,
|
||||
fontScale: settings.fontScale === 'xlarge' ? 'xlarge' : 'large',
|
||||
})
|
||||
},
|
||||
|
||||
goBack() {
|
||||
wx.reLaunch({ url: '/pages/home/home' })
|
||||
},
|
||||
|
||||
openCatalog() {
|
||||
wx.navigateTo({ url: '/pages/catalog/catalog' })
|
||||
},
|
||||
|
||||
openChapter(event) {
|
||||
const chapter = Number(event.currentTarget.dataset.chapter) || 1
|
||||
wx.navigateTo({
|
||||
url: chapterRoute(chapter),
|
||||
})
|
||||
},
|
||||
|
||||
toggleFont() {
|
||||
const fontScale = this.data.fontScale === 'large' ? 'xlarge' : 'large'
|
||||
const settings = getSettings()
|
||||
settings.fontScale = fontScale
|
||||
saveSettings(settings)
|
||||
this.setData({ fontScale })
|
||||
},
|
||||
|
||||
onShareAppMessage() {
|
||||
return {
|
||||
title: '我的桂香岁月:饭桌边,也有值得带回家说的话',
|
||||
path: '/pages/home/home',
|
||||
}
|
||||
},
|
||||
|
||||
onShareTimeline() {
|
||||
return {
|
||||
title: '我的桂香岁月:饭桌边,也有值得带回家说的话',
|
||||
query: '',
|
||||
}
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"navigationStyle": "custom",
|
||||
"disableScroll": true
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
<view class="safe-shell memories-shell font-{{fontScale}}">
|
||||
<view class="memories-book paper-panel">
|
||||
<view class="memories-head">
|
||||
<button class="memory-back" bindtap="goBack" aria-label="回到封面">
|
||||
<text class="memory-back-long">‹ 封面</text>
|
||||
<text class="memory-back-short">封面</text>
|
||||
</button>
|
||||
<view class="memories-heading">
|
||||
<text class="memories-title">我的桂香岁月</text>
|
||||
<text class="memories-subtitle">
|
||||
{{memoryCount > 0 ? '收下的故事,慢慢翻、慢慢聊' : '一本等你慢慢装满的故事册'}}
|
||||
</text>
|
||||
</view>
|
||||
<view class="memories-head-actions">
|
||||
<button
|
||||
class="memory-font"
|
||||
bindtap="toggleFont"
|
||||
aria-label="{{fontScale === 'large' ? '把文字再放大一些' : '恢复较大文字'}}"
|
||||
>
|
||||
<text class="memory-font-long">{{fontScale === 'large' ? '再大一点' : '标准大字'}}</text>
|
||||
<text class="memory-font-short">大字</text>
|
||||
</button>
|
||||
<view class="capsule-safe-space" aria-hidden="true"></view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view wx:if="{{memoryCount === 0}}" class="empty-memory">
|
||||
<view class="empty-bookmark">桂香</view>
|
||||
<view class="empty-copy">
|
||||
<text class="empty-title">这本册子,还等着第一段回忆</text>
|
||||
<text class="empty-text">每读完一回,把最后那一页“收进画册”,这里就会多一段人物、一件旧物和一句带回家聊的话。</text>
|
||||
<button class="empty-action" bindtap="openCatalog">去翻一回故事</button>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<scroll-view
|
||||
wx:else
|
||||
class="memory-scroll"
|
||||
scroll-x
|
||||
enhanced
|
||||
enable-flex
|
||||
show-scrollbar="{{true}}"
|
||||
aria-label="已收藏的桂香故事页"
|
||||
>
|
||||
<view class="memory-pages">
|
||||
<view
|
||||
wx:for="{{memories}}"
|
||||
wx:key="cardId"
|
||||
class="memory-sheet"
|
||||
aria-label="{{item.pageLabel}},{{item.chapterLabel}},{{item.chapterTitle}}"
|
||||
>
|
||||
<view class="memory-sheet-spine" aria-hidden="true"></view>
|
||||
<view class="memory-left">
|
||||
<text class="memory-page-number">{{item.pageLabel}}</text>
|
||||
<view class="memory-person-seal">{{item.characterInitial}}</view>
|
||||
<text class="memory-person">{{item.characterName}}</text>
|
||||
<text class="memory-era">{{item.eraLine}}</text>
|
||||
<view class="memory-object">
|
||||
<text class="memory-label">这一回留下的物件</text>
|
||||
<text>{{item.eraObject || '桂香饭桌边的一件旧物'}}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<scroll-view class="memory-right" scroll-y enhanced show-scrollbar="{{true}}">
|
||||
<text class="memory-chapter">{{item.chapterLabel}} · {{item.chapterTitle}}</text>
|
||||
<text class="memory-echo">“{{item.tableEcho}}”</text>
|
||||
<view class="memory-note">
|
||||
<text class="memory-label">今天可以这样做</text>
|
||||
<text>{{item.lifeAction}}</text>
|
||||
</view>
|
||||
<view class="memory-note family-note">
|
||||
<text class="memory-label">带回家聊一聊</text>
|
||||
<text>“{{item.familyLine}}”</text>
|
||||
</view>
|
||||
<button
|
||||
class="memory-reread"
|
||||
data-chapter="{{item.chapterNumber}}"
|
||||
bindtap="openChapter"
|
||||
aria-label="再读第{{item.chapterNumber}}回,{{item.chapterTitle}}"
|
||||
>再读这一回</button>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<view class="memory-end-card">
|
||||
<text class="memory-end-title">往后的页,还在饭桌边等你</text>
|
||||
<text>每收下一页,不是为了攒数字,只为记住一个被看见的人。</text>
|
||||
<button class="memory-end-action" bindtap="openCatalog">继续翻故事</button>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -0,0 +1,568 @@
|
||||
/* Personal storybook: horizontal pages with elder-friendly reading controls. */
|
||||
.memories-shell {
|
||||
height: 100vh;
|
||||
min-height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.memories-book {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
overflow: hidden;
|
||||
border-radius: 9px;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.memories-head {
|
||||
position: relative;
|
||||
display: flex;
|
||||
min-height: 66px;
|
||||
flex: 0 0 auto;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 8px 10px 8px 12px;
|
||||
border-bottom: 3px solid #9b332a;
|
||||
}
|
||||
|
||||
.memory-back,
|
||||
.memory-font,
|
||||
.empty-action,
|
||||
.memory-reread,
|
||||
.memory-end-action {
|
||||
display: flex;
|
||||
min-height: 48px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 6px 13px;
|
||||
border: 2px solid #997a54;
|
||||
border-radius: 7px;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 18px;
|
||||
font-weight: 850;
|
||||
}
|
||||
|
||||
.memory-back,
|
||||
.memory-font {
|
||||
color: #52392a;
|
||||
background: #ead8af;
|
||||
}
|
||||
|
||||
.memories-heading {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
top: 8px;
|
||||
right: 246px;
|
||||
left: 134px;
|
||||
display: flex;
|
||||
min-width: 0;
|
||||
align-items: center;
|
||||
pointer-events: none;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.memories-title {
|
||||
overflow: hidden;
|
||||
font-size: 29px;
|
||||
font-weight: 900;
|
||||
letter-spacing: 3px;
|
||||
line-height: 1.16;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.memories-subtitle {
|
||||
overflow: hidden;
|
||||
color: #725b43;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.capsule-safe-space {
|
||||
width: 102px;
|
||||
height: 48px;
|
||||
flex: 0 0 102px;
|
||||
}
|
||||
|
||||
.memories-head-actions {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: 8px;
|
||||
right: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.memory-font {
|
||||
min-width: 112px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.memory-back-short,
|
||||
.memory-font-short {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.memory-back {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: 8px;
|
||||
left: 12px;
|
||||
width: 112px;
|
||||
min-width: 112px;
|
||||
}
|
||||
|
||||
.empty-memory {
|
||||
display: grid;
|
||||
width: calc(100% - 48px);
|
||||
max-width: 680px;
|
||||
min-height: 230px;
|
||||
align-self: center;
|
||||
grid-template-columns: 132px minmax(0, 1fr);
|
||||
align-items: stretch;
|
||||
margin: auto;
|
||||
overflow: hidden;
|
||||
background: #f8ecc9;
|
||||
border: 3px double #97784f;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 12px 28px rgba(67, 40, 23, 0.18);
|
||||
}
|
||||
|
||||
.empty-bookmark {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #f8e7bb;
|
||||
background: #913128;
|
||||
font-size: 30px;
|
||||
font-weight: 900;
|
||||
letter-spacing: 7px;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
|
||||
.empty-copy {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 22px 28px;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.empty-title {
|
||||
font-size: 27px;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
margin-top: 9px;
|
||||
color: #604b36;
|
||||
font-size: 18px;
|
||||
font-weight: 650;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.empty-action {
|
||||
width: 190px;
|
||||
margin-top: 14px;
|
||||
color: #fff0cc;
|
||||
background: #943128;
|
||||
border-color: #74231d;
|
||||
}
|
||||
|
||||
.memory-scroll {
|
||||
width: 100%;
|
||||
min-height: 0;
|
||||
flex: 1;
|
||||
padding: 12px 0 10px;
|
||||
}
|
||||
|
||||
.memory-pages {
|
||||
display: inline-flex;
|
||||
min-width: 100%;
|
||||
height: 100%;
|
||||
align-items: stretch;
|
||||
gap: 16px;
|
||||
padding: 0 18px;
|
||||
}
|
||||
|
||||
.memory-sheet {
|
||||
position: relative;
|
||||
display: grid;
|
||||
width: 710px;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
flex: none;
|
||||
overflow: hidden;
|
||||
grid-template-columns: 225px minmax(0, 1fr);
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(84, 55, 31, 0.025) 0, rgba(84, 55, 31, 0.025) 1px, transparent 1px, transparent 6px),
|
||||
#f8edcc;
|
||||
border: 3px double #91724b;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 10px 24px rgba(58, 35, 21, 0.2);
|
||||
scroll-snap-align: center;
|
||||
}
|
||||
|
||||
.memory-sheet-spine {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 219px;
|
||||
width: 7px;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, rgba(81, 50, 27, 0.1), rgba(255, 255, 255, 0.58), rgba(81, 50, 27, 0.12));
|
||||
}
|
||||
|
||||
.memory-left {
|
||||
position: relative;
|
||||
display: flex;
|
||||
min-width: 0;
|
||||
align-items: center;
|
||||
padding: 17px 20px;
|
||||
background: #263a3e;
|
||||
flex-direction: column;
|
||||
color: #f5e5bd;
|
||||
}
|
||||
|
||||
.memory-page-number {
|
||||
align-self: flex-start;
|
||||
color: #d6ba7e;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: 750;
|
||||
}
|
||||
|
||||
.memory-person-seal {
|
||||
display: flex;
|
||||
width: 74px;
|
||||
height: 74px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 4px;
|
||||
color: #8d2d25;
|
||||
background: #efe0b8;
|
||||
border: 5px double #ad4d3a;
|
||||
border-radius: 50%;
|
||||
font-size: 37px;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.memory-person {
|
||||
margin-top: 5px;
|
||||
font-size: 25px;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.memory-era {
|
||||
margin-top: 4px;
|
||||
color: #e3cf9f;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: 650;
|
||||
line-height: 1.4;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.memory-object {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
margin-top: auto;
|
||||
padding: 8px 10px;
|
||||
color: #f5e5bd;
|
||||
background: rgba(0, 0, 0, 0.18);
|
||||
border-left: 4px solid #caa65e;
|
||||
flex-direction: column;
|
||||
font-size: 17px;
|
||||
font-weight: 750;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.memory-right {
|
||||
min-width: 0;
|
||||
height: 100%;
|
||||
padding: 14px 22px 16px 25px;
|
||||
}
|
||||
|
||||
.memory-chapter {
|
||||
display: block;
|
||||
color: #8d2f27;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 17px;
|
||||
font-weight: 850;
|
||||
}
|
||||
|
||||
.memory-echo {
|
||||
display: block;
|
||||
margin-top: 7px;
|
||||
padding-bottom: 7px;
|
||||
font-size: 23px;
|
||||
font-weight: 900;
|
||||
line-height: 1.45;
|
||||
border-bottom: 1px solid #c9af7f;
|
||||
}
|
||||
|
||||
.memory-note {
|
||||
display: flex;
|
||||
margin-top: 8px;
|
||||
color: #4f3c2b;
|
||||
font-size: 17px;
|
||||
font-weight: 700;
|
||||
line-height: 1.42;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.memory-label {
|
||||
display: block;
|
||||
margin-bottom: 2px;
|
||||
color: #a03b31;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
|
||||
font-size: 15px;
|
||||
font-weight: 850;
|
||||
}
|
||||
|
||||
.family-note {
|
||||
padding-left: 10px;
|
||||
border-left: 4px solid #35634f;
|
||||
}
|
||||
|
||||
.memory-reread {
|
||||
width: 156px;
|
||||
margin-top: 10px;
|
||||
color: #fff0cc;
|
||||
background: #8d3028;
|
||||
border-color: #70231e;
|
||||
}
|
||||
|
||||
.memory-end-card {
|
||||
display: flex;
|
||||
width: 310px;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
flex: none;
|
||||
justify-content: center;
|
||||
padding: 24px;
|
||||
color: #f2e2b8;
|
||||
background: #3a2a20;
|
||||
border: 3px double #ad8d5e;
|
||||
border-radius: 6px;
|
||||
flex-direction: column;
|
||||
font-size: 18px;
|
||||
font-weight: 650;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.memory-end-title {
|
||||
margin-bottom: 10px;
|
||||
font-size: 26px;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.memory-end-action {
|
||||
width: 170px;
|
||||
margin-top: 18px;
|
||||
color: #34251c;
|
||||
background: #e9d6a8;
|
||||
}
|
||||
|
||||
.font-xlarge .memory-echo {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.font-xlarge .memory-note,
|
||||
.font-xlarge .memory-object,
|
||||
.font-xlarge .memory-end-card {
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
@media (max-width: 730px), (max-height: 400px) {
|
||||
.memories-head {
|
||||
min-height: 58px;
|
||||
padding: 5px 4px;
|
||||
}
|
||||
|
||||
.memories-heading {
|
||||
top: 17px;
|
||||
right: 158px;
|
||||
left: 82px;
|
||||
}
|
||||
|
||||
.memory-back,
|
||||
.memory-font,
|
||||
.empty-action,
|
||||
.memory-reread,
|
||||
.memory-end-action {
|
||||
min-height: 48px;
|
||||
padding-right: 8px;
|
||||
padding-left: 8px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.memories-title {
|
||||
font-size: 18px;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.memories-subtitle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.capsule-safe-space {
|
||||
width: 76px;
|
||||
flex-basis: 76px;
|
||||
}
|
||||
|
||||
.memory-font {
|
||||
width: 72px;
|
||||
min-width: 72px;
|
||||
padding-right: 4px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.memory-back {
|
||||
top: 5px;
|
||||
left: 4px;
|
||||
width: 74px;
|
||||
min-width: 0;
|
||||
padding-right: 4px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.memories-head-actions {
|
||||
top: 5px;
|
||||
right: 4px;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.memory-back-long,
|
||||
.memory-font-long {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.memory-back-short,
|
||||
.memory-font-short {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.memory-scroll {
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.memory-pages {
|
||||
gap: 12px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.memory-sheet {
|
||||
width: 565px;
|
||||
grid-template-columns: 170px minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.memory-sheet-spine {
|
||||
left: 164px;
|
||||
}
|
||||
|
||||
.memory-left {
|
||||
padding: 10px 12px;
|
||||
}
|
||||
|
||||
.memory-page-number {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.memory-person-seal {
|
||||
width: 58px;
|
||||
height: 58px;
|
||||
margin-top: 1px;
|
||||
font-size: 29px;
|
||||
}
|
||||
|
||||
.memory-person {
|
||||
margin-top: 2px;
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
.memory-era {
|
||||
font-size: 14px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.memory-object {
|
||||
padding: 6px 8px;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.memory-right {
|
||||
padding: 10px 14px 12px 18px;
|
||||
}
|
||||
|
||||
.memory-chapter {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.memory-echo {
|
||||
margin-top: 4px;
|
||||
padding-bottom: 5px;
|
||||
font-size: 20px;
|
||||
line-height: 1.32;
|
||||
}
|
||||
|
||||
.memory-note {
|
||||
margin-top: 5px;
|
||||
font-size: 15.5px;
|
||||
line-height: 1.32;
|
||||
}
|
||||
|
||||
.memory-label {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.memory-reread {
|
||||
width: 138px;
|
||||
margin-top: 7px;
|
||||
}
|
||||
|
||||
.font-xlarge .memory-echo {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.font-xlarge .memory-note,
|
||||
.font-xlarge .memory-object,
|
||||
.font-xlarge .memory-end-card {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.empty-memory {
|
||||
width: calc(100% - 24px);
|
||||
max-width: 590px;
|
||||
min-height: 220px;
|
||||
grid-template-columns: 100px minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.empty-bookmark {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
.empty-copy {
|
||||
padding: 15px 20px;
|
||||
}
|
||||
|
||||
.empty-title {
|
||||
font-size: 23px;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
margin-top: 5px;
|
||||
font-size: 16px;
|
||||
line-height: 1.42;
|
||||
}
|
||||
|
||||
.empty-action {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user