index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import {
  2. defineComponent,
  3. onMounted,
  4. ref,
  5. computed,
  6. onUnmounted,
  7. reactive
  8. } from 'vue';
  9. import styles from './index.module.less';
  10. import DirectoryList from './components/directory-main';
  11. import LessonMain from './components/lesson-main';
  12. import ResourceMain from './components/resource-main';
  13. import { useResizeObserver } from '@vueuse/core';
  14. import { onBeforeRouteLeave } from 'vue-router';
  15. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  16. import { storeToRefs } from 'pinia';
  17. import LessonsGuide from '@/custom-plugins/guide-page/lessons-guide';
  18. import { eventGlobal } from '/src/utils';
  19. import { setGuidance } from '/src/custom-plugins/guide-page/api';
  20. export default defineComponent({
  21. name: 'prepare-lessons',
  22. setup() {
  23. const state = reactive({
  24. sidebarShow: true
  25. });
  26. const prepareStore = usePrepareStore();
  27. // console.log(prepareStore, 'prepareStore');
  28. const { treeList, coursewareList } = storeToRefs(prepareStore);
  29. const showGuide = computed(() => {
  30. return (
  31. treeList.value.length > 0 &&
  32. coursewareList.value.length > 0 &&
  33. isEndMounted.value
  34. );
  35. });
  36. const isEndMounted = ref(false);
  37. const directroyRef = ref();
  38. const onUpdate = async (name: string) => {
  39. if (name === 'prepare-lessons') {
  40. if (prepareStore.getTabType === 'courseware') {
  41. try {
  42. await setGuidance({
  43. guideTag: 'teacher-guideInfo',
  44. guideValue: JSON.stringify({ lessonsGuide: false })
  45. });
  46. } catch (e) {
  47. console.log(e);
  48. }
  49. }
  50. eventGlobal.emit('prepare-lessons-guide', prepareStore.getTabType);
  51. }
  52. };
  53. const onSlideChange = (val: boolean) => {
  54. state.sidebarShow = val;
  55. };
  56. onMounted(() => {
  57. // 指引事件
  58. eventGlobal.on('teacher-guideInfo', async (name: string) =>
  59. onUpdate(name)
  60. );
  61. eventGlobal.on('teacher-slideshow', onSlideChange);
  62. });
  63. onUnmounted(() => {
  64. eventGlobal.off('teacher-guideInfo', onUpdate);
  65. eventGlobal.off('teacher-slideshow', onSlideChange);
  66. });
  67. onMounted(() => {
  68. useResizeObserver(
  69. document.querySelector('#lessons-height') as HTMLElement,
  70. (entries: any) => {
  71. const entry = entries[0];
  72. const { height } = entry.contentRect;
  73. document.documentElement.style.setProperty(
  74. '--window-page-lesson-height',
  75. height + 'px'
  76. );
  77. }
  78. );
  79. setTimeout(() => {
  80. isEndMounted.value = true;
  81. }, 300);
  82. });
  83. // 当前页面离开时
  84. onBeforeRouteLeave(() => {
  85. // 离开时恢复默认
  86. prepareStore.setTabType('courseware');
  87. prepareStore.setSelectMusicStatus(false);
  88. prepareStore.setSelectResourceStatus(false);
  89. prepareStore.setIsAddResource(false);
  90. prepareStore.setIsAddTrain(false);
  91. prepareStore.setIsEditResource(false);
  92. prepareStore.setIsEditTrain(false);
  93. });
  94. onUnmounted(() => {
  95. prepareStore.setSubjectId('');
  96. });
  97. return () => (
  98. <div
  99. class={[
  100. styles.prepareLessons,
  101. !state.sidebarShow && styles.hideSideBar
  102. ]}>
  103. {/* 左侧目录 */}
  104. <div
  105. class={styles.directoryMain}
  106. ref={directroyRef.value}
  107. id="lessons-height">
  108. <DirectoryList />
  109. </div>
  110. {/* 中间排课 */}
  111. <div class={styles.lessonMain}>
  112. <LessonMain />
  113. </div>
  114. {/* 资源 */}
  115. <div class={[styles.resourceMain]} id="lessons-1">
  116. <ResourceMain />
  117. </div>
  118. {showGuide.value ? <LessonsGuide></LessonsGuide> : null}
  119. </div>
  120. );
  121. }
  122. });