|
|
@@ -24,11 +24,18 @@
|
|
|
<view class="type-grid">
|
|
|
<view class="type-item" v-for="(name, key) in interactionTypes" :key="key"
|
|
|
:class="{selected: selectedType === key}"
|
|
|
- @click="selectedType = key">
|
|
|
+ @click="selectType(key)">
|
|
|
<text class="type-icon">{{ typeIcons[key] || '💬' }}</text>
|
|
|
<text class="type-name">{{ name }}</text>
|
|
|
</view>
|
|
|
+ <view class="type-item" :class="{selected: selectedType === 'custom'}"
|
|
|
+ @click="selectType('custom')">
|
|
|
+ <text class="type-icon">✨</text>
|
|
|
+ <text class="type-name">自定义</text>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
+ <input v-if="selectedType === 'custom'" class="custom-type-input" v-model="customTypeName"
|
|
|
+ placeholder="请输入自定义活动名称(如:一起读书)" maxlength="20" />
|
|
|
</view>
|
|
|
|
|
|
<!-- 互动描述 -->
|
|
|
@@ -129,6 +136,7 @@ export default {
|
|
|
preselectedMemberId: null, // URL传入的memberId,不显示成员选择器
|
|
|
currentMemberId: null, // 当前登录用户的家庭成员ID(fromMemberId)
|
|
|
selectedType: '',
|
|
|
+ customTypeName: '',
|
|
|
description: '',
|
|
|
timeType: 'now',
|
|
|
customTime: '',
|
|
|
@@ -180,24 +188,19 @@ export default {
|
|
|
var res = await getFamilyMemberList()
|
|
|
if (res.code === 200 && res.data) {
|
|
|
var all = res.data || []
|
|
|
- // 确定"我"的成员ID:优先从成员列表中匹配当前登录用户
|
|
|
- var userInfo = uni.getStorageSync('userInfo')
|
|
|
- var uid = (userInfo && userInfo.id) || 0
|
|
|
- var self = this
|
|
|
+ // 使用后端返回的 isSelf 标记(比匹配 userId 更可靠)
|
|
|
var found = null
|
|
|
- if (uid) {
|
|
|
- for (var i = 0; i < all.length; i++) {
|
|
|
- var m = all[i]
|
|
|
- if (m && m.userId && Number(m.userId) === Number(uid)) {
|
|
|
- found = m
|
|
|
- break
|
|
|
- }
|
|
|
+ for (var i = 0; i < all.length; i++) {
|
|
|
+ var m = all[i]
|
|
|
+ if (m && m.isSelf === true) {
|
|
|
+ found = m
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
this.currentMemberId = found ? found.id : null
|
|
|
// 互动对象列表过滤掉"我"(from==to 后端会拒绝)
|
|
|
this.members = all.filter(function(m) {
|
|
|
- return !(m && m.userId && found && Number(m.userId) === Number(found.userId))
|
|
|
+ return !(m && m.isSelf === true)
|
|
|
})
|
|
|
}
|
|
|
} catch (e) {
|
|
|
@@ -207,6 +210,12 @@ export default {
|
|
|
selectMember(member) {
|
|
|
this.selectedMemberId = member.id
|
|
|
},
|
|
|
+ selectType(type) {
|
|
|
+ this.selectedType = type
|
|
|
+ if (type !== 'custom') {
|
|
|
+ this.customTypeName = ''
|
|
|
+ }
|
|
|
+ },
|
|
|
onTimeChange(e) {
|
|
|
this.customTime = e.detail.value
|
|
|
},
|
|
|
@@ -374,10 +383,11 @@ export default {
|
|
|
this.uploading = false
|
|
|
|
|
|
// 保存互动记录
|
|
|
+ var interactionType = this.selectedType === 'custom' ? this.customTypeName : this.selectedType
|
|
|
var res = await addInteraction({
|
|
|
fromMemberId: fromId,
|
|
|
toMemberId: this.selectedMemberId,
|
|
|
- interactionType: this.selectedType,
|
|
|
+ interactionType: interactionType,
|
|
|
description: this.description,
|
|
|
happenedAt: happenedAt,
|
|
|
photoUrls: photoUrls.join(','),
|
|
|
@@ -471,6 +481,14 @@ export default {
|
|
|
border-color: #F97316;
|
|
|
background: #FFF7ED;
|
|
|
}
|
|
|
+.custom-type-input {
|
|
|
+ margin-top: 20rpx;
|
|
|
+ border: 2rpx solid #e0e0e0;
|
|
|
+ border-radius: 12rpx;
|
|
|
+ padding: 16rpx 20rpx;
|
|
|
+ font-size: 28rpx;
|
|
|
+ background: #fafafa;
|
|
|
+}
|
|
|
.type-icon {
|
|
|
font-size: 40rpx;
|
|
|
display: block;
|