123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659 |
- import { defineComponent, nextTick, ref } from "vue";
- import { Config, DriveStep, PopoverDOM, State, driver } from "driver.js";
- import "driver.js/dist/driver.css";
- import state from "/src/state";
- import { getGuidance, setGuidance } from "../guide-page/api";
- const endGuide = (guideInfo: any) => {
- try {
- setGuidance({ guideTag: "guideInfo", guideValue: JSON.stringify(guideInfo) });
- } catch (e) {
- console.log(e);
- }
- };
- /** 练习模式 */
- export const PractiseDriver = defineComponent({
- name: "PractiseDriver",
- setup() {
- // 初始化部分引导位置
- const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 5;
- options.config.stagePadding = 8;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 + 4 + "px";
- } catch {}
- };
- // 乐器方向不一样引导位置不一样
- const instrumentDirection: DriveStep = {
- element: ".driver-7",
- popover: {
- title: "",
- description: "",
- popoverClass: `popoverClass ${state.fingeringInfo.direction === "transverse" ? "popoverClass7" : "popoverClass7-1"}`,
- align: state.fingeringInfo.direction === "transverse" ? "start" : "center",
- side: state.fingeringInfo.direction === "transverse" ? "top" : "left",
- nextBtnText: "下一步7/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- if (state.fingeringInfo.direction === "transverse") driverInitialPosition(popover, options);
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- };
- const driverOptions: Config = {
- showProgress: false,
- allowClose: false,
- popoverOffset: 3,
- disableActiveInteraction: true,
- onCloseClick: () => {
- onDriverClose();
- },
- steps: [
- {
- element: ".driver-1",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass1",
- align: "end",
- side: "top",
- nextBtnText: "下一步1/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- // console.log(popover, "popover", popover.wrapper, options.state.activeElement, options.state.__overlaySvg);
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- // popover.wrapper.addEventListener("click", (e) => {
- // e.stopPropagation;
- // console.log("12121212");
- // // driverObj.drive(1);
- // });
- // document.querySelector(".popoverClass1")?.addEventListener("click", () => {
- // console.log("11111");
- // });
- },
- },
- },
- {
- element: ".driver-2",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass2",
- align: "start",
- side: "top",
- nextBtnText: "下一步2/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- },
- },
- {
- element: ".driver-3",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass3",
- align: "start",
- side: "top",
- nextBtnText: "下一步3/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- },
- },
- {
- element: ".driver-4",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass4",
- align: "start",
- side: "top",
- nextBtnText: "下一步4/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- },
- },
- {
- element: ".driver-5",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass5",
- align: "start",
- side: "top",
- nextBtnText: "下一步5/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- },
- },
- {
- element: ".driver-6",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass6",
- align: "start",
- side: "top",
- nextBtnText: "下一步6/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- },
- },
- instrumentDirection,
- {
- element: ".driver-8",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass8",
- align: "start",
- side: "bottom",
- nextBtnText: "下一步8/9",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 - 4 + "px";
- } catch {}
- },
- },
- },
- {
- element: ".driver-9",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass9 popoverClose",
- align: "end",
- side: "bottom",
- prevBtnText: "再看一遍",
- doneBtnText: "完成",
- showButtons: ["next", "previous", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = -((rect?.width || 0) / 2 - 8) + "px";
- } catch {}
- },
- onPrevClick: () => {
- driverObj.drive(0);
- },
- onNextClick: () => {
- onDriverClose();
- },
- },
- },
- ],
- };
- let driverObj: any;
- const guideInfo = ref({} as any);
- const getAllGuidance = async () => {
- try {
- if (state.guideInfo) {
- guideInfo.value = state.guideInfo;
- } else {
- const res = await getGuidance({ guideTag: "guideInfo" });
- if (res.data) {
- guideInfo.value = JSON.parse(res.data?.guideValue) || null;
- } else {
- guideInfo.value = {};
- }
- }
- if (!(guideInfo.value && guideInfo.value.practiseDriver)) {
- driverObj = driver(driverOptions);
- nextTick(() => {
- driverObj.drive(0);
- });
- }
- } catch (e) {
- console.log(e);
- }
- };
- getAllGuidance();
- // 结束关闭弹窗
- const onDriverClose = () => {
- if (!guideInfo.value) {
- guideInfo.value = { practiseDriver: true };
- } else {
- guideInfo.value.practiseDriver = true;
- }
- endGuide(guideInfo.value);
- driverObj.destroy();
- };
- return () => <div></div>;
- },
- });
- /** 跟练模式 */
- export const FollowDriver = defineComponent({
- name: "FollowDriver",
- setup() {
- // 初始化部分引导位置
- const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 5;
- options.config.stagePadding = 8;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 + 4 + "px";
- } catch {}
- };
- const driverOptions: Config = {
- showProgress: false,
- allowClose: false,
- popoverOffset: 3,
- disableActiveInteraction: true,
- steps: [
- {
- element: ".follow-1",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassF1",
- align: "end",
- side: "top",
- nextBtnText: "下一步1/3",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".driver-5",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass5",
- align: "start",
- side: "top",
- nextBtnText: "下一步2/3",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".driver-6",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass6 popoverClose",
- align: "start",
- side: "top",
- prevBtnText: "再看一遍",
- doneBtnText: "完成",
- showButtons: ["next", "previous", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- onPrevClick: () => {
- driverObj.drive(0);
- },
- onNextClick: () => {
- onDriverClose();
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- ],
- };
- let driverObj: any;
- const guideInfo = ref({} as any);
- const getAllGuidance = async () => {
- try {
- if (state.guideInfo) {
- guideInfo.value = state.guideInfo;
- } else {
- const res = await getGuidance({ guideTag: "guideInfo" });
- if (res.data) {
- guideInfo.value = JSON.parse(res.data?.guideValue) || null;
- } else {
- guideInfo.value = {};
- }
- }
- if (!(guideInfo.value && guideInfo.value.followDriver)) {
- driverObj = driver(driverOptions);
- nextTick(() => {
- driverObj.drive(0);
- });
- }
- } catch (e) {
- console.log(e);
- }
- };
- getAllGuidance();
- // 结束关闭弹窗
- const onDriverClose = () => {
- if (!guideInfo.value) {
- guideInfo.value = { followDriver: true };
- } else {
- guideInfo.value.followDriver = true;
- }
- endGuide(guideInfo.value);
- driverObj.destroy();
- };
- return () => <div></div>;
- },
- });
- // 评测模式
- export const EvaluatingDriver = defineComponent({
- name: "EvaluatingDriver",
- setup() {
- // 初始化部分引导位置
- const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 5;
- options.config.stagePadding = 8;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 + 4 + "px";
- } catch {}
- };
- const driverOptions: Config = {
- showProgress: false,
- allowClose: false,
- popoverOffset: 3,
- disableActiveInteraction: true,
- steps: [
- {
- element: ".evaluting-1",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassE1",
- align: "end",
- side: "top",
- nextBtnText: "下一步1/3",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".driver-5",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass5",
- align: "start",
- side: "top",
- nextBtnText: "下一步2/3",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".driver-6",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClass6 popoverClose",
- align: "start",
- side: "top",
- prevBtnText: "再看一遍",
- doneBtnText: "完成",
- showButtons: ["next", "previous", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options);
- },
- onPrevClick: () => {
- driverObj.drive(0);
- },
- onNextClick: () => {
- onDriverClose();
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- ],
- };
- let driverObj: any;
- const guideInfo = ref({} as any);
- const getAllGuidance = async () => {
- try {
- if (state.guideInfo) {
- guideInfo.value = state.guideInfo;
- } else {
- const res = await getGuidance({ guideTag: "guideInfo" });
- if (res.data) {
- guideInfo.value = JSON.parse(res.data?.guideValue) || null;
- } else {
- guideInfo.value = {};
- }
- }
- if (!(guideInfo.value && guideInfo.value.evaluatingDriver)) {
- driverObj = driver(driverOptions);
- nextTick(() => {
- driverObj.drive(0);
- });
- } else {
- driverObj.destroy();
- }
- } catch (e) {
- console.log(e);
- }
- };
- getAllGuidance();
- // 结束关闭弹窗
- const onDriverClose = () => {
- if (!guideInfo.value) {
- guideInfo.value = { evaluatingDriver: true };
- } else {
- guideInfo.value.evaluatingDriver = true;
- }
- endGuide(guideInfo.value);
- driverObj?.destroy();
- };
- return () => <div></div>;
- },
- });
- // 评测模式 - 结果弹窗
- export const EvaluatingResultDriver = defineComponent({
- name: "EvaluatingResultDriver",
- setup() {
- // 初始化部分引导位置
- const driverInitialPosition = (popover: PopoverDOM, options: { config: Config; state: State }, position = 1) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * position + 4 + "px";
- } catch {}
- };
- const driverOptions: Config = {
- showProgress: false,
- allowClose: false,
- popoverOffset: 3,
- disableActiveInteraction: true,
- steps: [
- {
- element: ".evaluting-result-1",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassER1",
- align: "start",
- side: "right",
- nextBtnText: "下一步1/4",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 12;
- options.config.stagePadding = 10;
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".evaluting-result-2",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassER2",
- align: "start",
- side: "top",
- nextBtnText: "下一步2/4",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- options.config.stageRadius = 1000;
- options.config.stagePadding = 0;
- try {
- const rect = options.state.activeElement?.getBoundingClientRect();
- popover.wrapper.style.marginLeft = (rect?.width || 0) / 2 - 4 + "px";
- } catch {}
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".evaluting-result-3",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassER3",
- align: "end",
- side: "top",
- nextBtnText: "下一步3/4",
- showButtons: ["next", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options, -1);
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- {
- element: ".evaluting-result-4",
- popover: {
- title: "",
- description: "",
- popoverClass: "popoverClass popoverClassER4 popoverClose",
- align: "end",
- side: "top",
- prevBtnText: "再看一遍",
- doneBtnText: "完成",
- showButtons: ["next", "previous", "close"],
- onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
- driverInitialPosition(popover, options, -1);
- },
- onPrevClick: () => {
- driverObj.drive(0);
- },
- onNextClick: () => {
- onDriverClose();
- },
- onCloseClick: () => {
- onDriverClose();
- },
- },
- },
- ],
- };
- let driverObj: any;
- const guideInfo = ref({} as any);
- const getAllGuidance = async () => {
- try {
- if (state.guideInfo) {
- guideInfo.value = state.guideInfo;
- } else {
- const res = await getGuidance({ guideTag: "guideInfo" });
- if (res.data) {
- guideInfo.value = JSON.parse(res.data?.guideValue) || null;
- } else {
- guideInfo.value = {};
- }
- }
- if (!(guideInfo.value && guideInfo.value.evaluatingResultDriver)) {
- driverObj = driver(driverOptions);
- nextTick(() => {
- driverObj.drive(0);
- });
- }
- } catch (e) {
- console.log(e);
- }
- };
- getAllGuidance();
- // 结束关闭弹窗
- const onDriverClose = () => {
- if (!guideInfo.value) {
- guideInfo.value = { evaluatingResultDriver: true };
- } else {
- guideInfo.value.evaluatingResultDriver = true;
- }
- endGuide(guideInfo.value);
- driverObj.destroy();
- };
- return () => <div></div>;
- },
- });
|