index.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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: false
  25. });
  26. const prepareStore = usePrepareStore();
  27. const resourceMainRef = ref();
  28. // console.log(prepareStore, 'prepareStore');
  29. const { treeList, coursewareList } = storeToRefs(prepareStore);
  30. const showGuide = computed(() => {
  31. return (
  32. treeList.value.length > 0 &&
  33. coursewareList.value.length > 0 &&
  34. isEndMounted.value
  35. );
  36. });
  37. const isEndMounted = ref(false);
  38. const directroyRef = ref();
  39. const onUpdate = async (name: string) => {
  40. if (name === 'prepare-lessons') {
  41. if (prepareStore.getTabType === 'courseware') {
  42. try {
  43. await setGuidance({
  44. guideTag: 'teacher-guideInfo',
  45. guideValue: JSON.stringify({ lessonsGuide: false })
  46. });
  47. } catch (e) {
  48. console.log(e);
  49. }
  50. }
  51. eventGlobal.emit('prepare-lessons-guide', prepareStore.getTabType);
  52. }
  53. };
  54. const onSlideChange = (val: boolean) => {
  55. state.sidebarShow = val;
  56. resourceMainRef.value?.resetTabPosition();
  57. };
  58. onMounted(() => {
  59. // 指引事件
  60. eventGlobal.on('teacher-guideInfo', async (name: string) =>
  61. onUpdate(name)
  62. );
  63. // 作业预设事件
  64. eventGlobal.on('teacher-slideshow', onSlideChange);
  65. // // 课件编辑事件
  66. // eventGlobal.on('courseware-slideshow', onSlideChange);
  67. });
  68. onUnmounted(() => {
  69. eventGlobal.off('teacher-guideInfo', onUpdate);
  70. eventGlobal.off('teacher-slideshow', onSlideChange);
  71. });
  72. onMounted(() => {
  73. useResizeObserver(
  74. document.querySelector('#lessons-height') as HTMLElement,
  75. (entries: any) => {
  76. const entry = entries[0];
  77. const { height } = entry.contentRect;
  78. document.documentElement.style.setProperty(
  79. '--window-page-lesson-height',
  80. height + 'px'
  81. );
  82. }
  83. );
  84. setTimeout(() => {
  85. isEndMounted.value = true;
  86. }, 300);
  87. });
  88. // 当前页面离开时
  89. onBeforeRouteLeave(() => {
  90. // 离开时恢复默认
  91. prepareStore.setTabType('courseware');
  92. prepareStore.setSelectMusicStatus(false);
  93. prepareStore.setSelectResourceStatus(false);
  94. prepareStore.setIsAddResource(false);
  95. prepareStore.setIsAddTrain(false);
  96. prepareStore.setIsEditResource(false);
  97. prepareStore.setIsEditTrain(false);
  98. });
  99. onUnmounted(() => {
  100. prepareStore.setSubjectId('');
  101. });
  102. return () => (
  103. <div
  104. class={[
  105. styles.prepareLessons,
  106. !state.sidebarShow && styles.hideSideBar
  107. ]}>
  108. {/* 左侧目录 */}
  109. <div
  110. class={styles.directoryMain}
  111. ref={directroyRef.value}
  112. id="lessons-height">
  113. <DirectoryList />
  114. </div>
  115. {/* 中间排课 */}
  116. <div class={styles.lessonMain}>
  117. <LessonMain />
  118. </div>
  119. {/* 资源 */}
  120. <div class={[styles.resourceMain]} id="lessons-1">
  121. {state.sidebarShow && <ResourceMain ref={resourceMainRef} />}
  122. </div>
  123. {showGuide.value ? <LessonsGuide></LessonsGuide> : null}
  124. </div>
  125. );
  126. }
  127. });