<template>
  <!-- 灵动岛占位区域 - 始终存在但控制可见性 -->
  <view
    class="dynamic-island-placeholder"
    :class="{ visible: isScrolled }"
    :style="{ height: placeholderHeight + 'rpx' }"
  >
    <view
      class="dynamic-island"
      :class="{
        compact: actualCompactState,
        fixed: isFixed,
      }"
      :style="{ top: isFixed ? fixedTopPosition + 'px' : 0 }"
      @click="handleToggle"
    >
      <!-- 展开状态 -->
      <view v-if="!actualCompactState" class="expanded-content">
        <template v-if="styleType != 'timeShop'">
          <view class="top-section">
            <text class="welcome-text">{{ title }}</text>
            <view class="qr-code">
              <image
                style="width: 39rpx; height: 39rpx"
                src="https://epic.js-dyyj.com/uploads/20250728/88e0991e58e692c86c25e42537edc6ca.png"
              ></image>
            </view>
          </view>
          <view class="bottom-section">
            <view class="stats-section">
              <view class="stat-item">
                <text class="stat-number">{{ getStatNumber("权益") }}</text>
                <text class="stat-label">权益</text>
              </view>
              <view class="stat-item">
                <text class="stat-number">{{ getStatNumber("时间银行") }}</text>
                <text class="stat-label">时间银行</text>
              </view>
            </view>
            <view class="divider"></view>
            <view class="action-section">
              <text class="action-text">{{ actionText }}</text>
              <image
                class="avatar"
                src="https://epic.js-dyyj.com/uploads/20250728/7d9ba1fe109643681396cb03f60f3218.png"
                mode="aspectFill"
              ></image>
            </view>
          </view>
        </template>
        <template v-if="styleType == 'timeShop'">
          <view class="bottom-section">
            <view class="stats-section">
              <view class="stat-item">
                <text class="stat-number">{{ getStatNumber("时间银行") }}</text>
                <text class="stat-label">时间银行</text>
              </view>
            </view>
            <view class="divider"></view>
            <view class="action-section">
              <view class="action-text-box">
                <view class="action-text-box-des">
                  在努力一点点，为更好的未来蓄力吧！
                </view>
                <view class="action-text-box-msg">
                  <image
                    class="action-text-box-img"
                    :src="
                      showImg(
                        '/uploads/20250728/d7ac383902515c9b507c78fdc8d29520.png'
                      )
                    "
                  ></image>
                  今日点赞和留言<text
                    style="font-size: 30rpx; font-weight: bold; margin: 0 10rpx"
                    >100</text
                  >条
                </view>
              </view>
              <image
                class="avatar"
                src="https://epic.js-dyyj.com/uploads/20250728/7d9ba1fe109643681396cb03f60f3218.png"
                mode="aspectFill"
              ></image>
            </view>
          </view>
        </template>
      </view>

      <!-- 紧凑状态 -->
      <view v-else class="compact-content">
        <text class="compact-name">{{ getCompactName() }}</text>
        <image
          class="compact-avatar"
          src="https://epic.js-dyyj.com/uploads/20250728/7d9ba1fe109643681396cb03f60f3218.png"
          mode="aspectFill"
        ></image>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  name: "DynamicIsland",
  props: {
    isCompact: {
      type: Boolean,
      default: false,
    },
    styleType: {
      type: String,
      default: "",
    },
    isFixed: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: "用户",
    },
    subtitle: {
      type: String,
      default: "周杰伦 - 青花瓷",
    },
    avatarUrl: {
      type: String,
      default: "https://picsum.photos/80/80",
    },
    actionText: {
      type: String,
      default: "暂停",
    },
    // 新增页面标识符，用于区分不同页面的灵动岛实例
    pageId: {
      type: String,
      default: "default_page",
    },
  },
  data() {
    return {
      isExpanded: false,
      statusBarHeight: 0,
      isScrolled: false,
      scrollThreshold: 160, // 灵动岛大卡片高度（160rpx）
      // 内部数据，减少对外部props的依赖
      currentTitle: "Hi！用户，欢迎回来～",
      currentSubtitle: "2个权益 | 120时间银行",
      currentAvatar: "https://picsum.photos/80/80",
      currentAction: "激活你的Agent",
      userInfo: {},
    };
  },
  computed: {
    // 计算实际显示状态：只有在固定模式下才使用内部状态
    actualCompactState() {
      if (this.isScrolled) {
        return !this.isExpanded;
      }
      return false; // 非滚动状态下始终展开
    },
    // 计算固定定位的top值
    fixedTopPosition() {
      // 状态栏高度 + 导航栏高度(40px) + 间距(20px)
      return this.statusBarHeight + 40 + 20;
    },
    // 计算占位区域高度 - 始终保持固定高度，等于灵动岛大卡片高度
    placeholderHeight() {
      // 占位区域高度应该等于灵动岛展开状态的高度
      // 包括上下边距：32rpx(上) + 160rpx(灵动岛) + 24rpx(下) = 216rpx
      const islandHeightRpx = 160; // 灵动岛展开高度
      const topMarginRpx = 32; // 上边距
      const bottomMarginRpx = 24; // 下边距
      return topMarginRpx + islandHeightRpx + bottomMarginRpx;
    },
    // 使用内部数据或props数据
    title() {
      return this.currentTitle;
    },
    subtitle() {
      return this.currentSubtitle;
    },
    avatarUrl() {
      return this.currentAvatar;
    },
    actionText() {
      return this.currentAction;
    },
    // 计算是否固定
    isFixed() {
      return this.isScrolled;
    },
  },
  mounted() {
    // uni-app中通过父组件传递点击事件
    this.setStatusBarHeight();
    // 监听页面滚动
    this.addScrollListener();
    // 获取用户信息
    this.getUserInfo();
  },
  beforeDestroy() {
    // 清理滚动监听
    this.removeScrollListener();
  },
  methods: {
    handleToggle() {
      if (this.isScrolled) {
        // 固定模式下切换内部状态
        this.isExpanded = !this.isExpanded;
        this.$emit("toggle", this.isExpanded);
      } else {
        // 非固定模式下触发外部事件
        this.$emit("toggle");
      }
    },
    handleAction() {
      this.$emit("action");
    },
    // 外部调用收缩方法
    collapseIsland() {
      if (this.isScrolled && this.isExpanded) {
        this.isExpanded = false;
        this.$emit("toggle", this.isExpanded);
      }
    },
    // 添加滚动监听
    addScrollListener() {
      // 只监听带页面ID的滚动事件，避免不同页面间的状态冲突
      const eventName = `pageScroll_${this.pageId}`;
      console.log("DynamicIsland 添加滚动监听:", eventName);
      uni.$on(eventName, this.handlePageScroll);
    },
    // 移除滚动监听
    removeScrollListener() {
      // 移除带页面ID的滚动监听
      const eventName = `pageScroll_${this.pageId}`;
      uni.$off(eventName, this.handlePageScroll);
    },
    // 处理页面滚动
    handlePageScroll(e) {
      const scrollTop = e.scrollTop || e;
      const shouldScroll = scrollTop > this.scrollThreshold;

      if (this.isScrolled !== shouldScroll) {
        this.isScrolled = shouldScroll;
        // 添加触觉反馈
        if (uni.vibrateShort) {
          uni.vibrateShort();
        }
      }

      // 滚动时自动收缩展开的灵动岛
      if (this.isScrolled) {
        this.collapseIsland();
      }
    },
    getCompactName() {
      // 从用户信息中获取昵称
      if (this.userInfo && this.userInfo.nickname) {
        return this.userInfo.nickname;
      }
      return "用户";
    },
    getStatNumber(type) {
      // 从副标题中解析统计数据
      if (this.subtitle) {
        if (type === "权益") {
          const match = this.subtitle.match(/(\d+)个权益/);
          return match ? match[1] : "0";
        } else if (type === "时间银行") {
          const match = this.subtitle.match(/(\d+)时间银行/);
          return match ? match[1] : "0";
        }
      }
      return "0";
    },
    // 设置状态栏高度
    setStatusBarHeight() {
      try {
        const systemInfo = uni.getSystemInfoSync();
        this.statusBarHeight = systemInfo.statusBarHeight || 0;
      } catch (e) {
        console.warn("获取系统信息失败:", e);
        this.statusBarHeight = 0;
      }
    },
    // 获取用户信息
    getUserInfo() {
      try {
        this.userInfo =
          (uni.getStorageSync("userInfo") &&
            JSON.parse(uni.getStorageSync("userInfo"))) ||
          this.$store.state.user.userInfo ||
          {};
        // 更新标题显示用户昵称
        if (this.userInfo && this.userInfo.nickname) {
          this.currentTitle = `Hi！${this.userInfo.nickname}，欢迎回来～`;
        }
      } catch (e) {
        console.warn("获取用户信息失败:", e);
        this.userInfo = {};
      }
    },
  },
};
</script>

<style scoped lang="scss">
/* 灵动岛占位区域样式 - 始终存在但控制可见性 */
.dynamic-island-placeholder {
  width: 100%;
  background: transparent;
  position: relative;
  opacity: 1;
  transition: opacity 0.3s ease;
}

.dynamic-island-placeholder.visible {
  opacity: 1;
}

/* 当灵动岛不是固定状态时，确保它在占位符内正常显示 */
.dynamic-island-placeholder .dynamic-island:not(.fixed) {
  position: relative;
  z-index: 100;
}

.dynamic-island {
  margin: 24rpx auto 24rpx;
  z-index: 100;

  background: rgba(0, 0, 0, 0.75);
  backdrop-filter: blur(20rpx);
  -webkit-backdrop-filter: blur(20rpx);
  border: 1rpx solid rgba(255, 255, 255, 0.1);
  border-radius: 40rpx;
  box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.3),
    0 0 0 1rpx rgba(255, 255, 255, 0.05) inset;

  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  overflow: hidden;

  // 展开状态
  width: 710rpx;
  height: 220rpx;

  // 紧凑状态
  &.compact {
    width: 300rpx;
    height: 80rpx;
    border-radius: 40rpx;

    .expanded-content {
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.15s ease-out, visibility 0s linear 0.15s;
    }
  }

  &:not(.compact) {
    .compact-content {
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.15s ease-out, visibility 0s linear 0.15s;
    }
  }

  // 固定定位状态
  &.fixed {
    position: fixed;
    left: 50%;
    transform: translateX(-50%);
    z-index: 998;
    margin: 0;
    transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    animation: slideInFromTop 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  }
}

.expanded-content {
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: 24rpx 32rpx;
  opacity: 1;
  visibility: visible;
  transition: opacity 0.2s ease-in 0.1s, visibility 0s linear 0s;
}

.top-section {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 16rpx;
}

.welcome-text {
  font-size: 28rpx;
  color: #ffffff;
  font-weight: 500;
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-weight: bold;
}

.qr-code {
  width: 32rpx;
  height: 32rpx;
<<<<<<< HEAD
=======

>>>>>>> 402de12 (feat：首页静态)
}

.qr-icon {
  width: 24rpx;
  height: 24rpx;
  background: rgba(255, 255, 255, 0.8);
  border-radius: 4rpx;
  position: relative;

  &::before {
    content: "";
    position: absolute;
    top: 2rpx;
    left: 2rpx;
    right: 2rpx;
    bottom: 2rpx;
    background: rgba(0, 0, 0, 0.6);
    border-radius: 2rpx;
  }
}

.bottom-section {
  display: flex;
  align-items: center;
  flex: 1;
}

.stats-section {
  display: flex;
  gap: 32rpx;
}

.stat-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  font-size: 28rpx;
  font-weight: bold;
}

.stat-number {
  font-size: 32rpx;
  color: #ffffff;
  font-weight: bold;
  line-height: 1;
  margin-bottom: 4rpx;
}

.stat-label {
  font-size: 28rpx;
  color: white;
  line-height: 1;
  font-weight: bold;
  margin-top: 20rpx;
}

.divider {
  width: 2rpx;
  height: 60rpx;
  background: rgba(255, 255, 255, 0.3);
  margin: 0 24rpx;
}

.action-section {
  display: flex;
  align-items: center;
  flex: 1;
  justify-content: space-between;
}

.action-text {
  font-size: 26rpx;
  color: #ffffff;
  font-weight: bold;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200rpx;
}

.avatar {
  width: 113rpx;
  height: 113rpx;
  border-radius: 50%;
}

// 添加点击反馈动画
.dynamic-island:active {
  transform: scale(0.98);

  &.fixed {
    transform: translateX(-50%) scale(0.98);
  }
}

// 从顶部滑入动画
@keyframes slideInFromTop {
  0% {
    transform: translateX(-50%) translateY(-100%);
    opacity: 0;
  }
  100% {
    transform: translateX(-50%) translateY(0);
    opacity: 1;
  }
}

.compact-content {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 100%;
  padding: 0 24rpx;
  opacity: 1;
  visibility: visible;
  transition: opacity 0.2s ease-in 0.1s, visibility 0s linear 0s;
}

.compact-name {
  font-size: 27rpx;
  color: #ffffff;
  font-weight: bold;
  flex: 1;
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200rpx;
}

.compact-avatar {
  width: 48rpx;
  height: 48rpx;
  border-radius: 50%;
  border: 2rpx solid rgba(255, 255, 255, 0.3);
  flex-shrink: 0;
}

// 动画定义
@keyframes pulse {
  0% {
    opacity: 1;
    transform: scale(1);
  }
  50% {
    opacity: 0.6;
    transform: scale(1.1);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}

// 响应式适配
// @media (max-width: 750rpx) {
//   .dynamic-island {
//     &.is-expanded {
//       width: 100vw;
//       max-width: 750rpx;
//     }

//     &.is-compact {
//       width: 280rpx;
//     }
//   }
// }
.action-text-box {
  color: white;

  .action-text-box-des {
    font-size: 20rpx;
  }
  .action-text-box-msg {
    font-size: 24rpx;
    display: flex;
    align-items: center;
    margin-top: 20rpx;
  }
  .action-text-box-img {
    width: 57rpx;
    height: 46rpx;
    margin-right: 10rpx;
  }
}
</style>
