NextAndPrevLinks.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { computed } from 'vue';
  2. import { useRoute, useSiteData } from 'vitepress';
  3. export default {
  4. setup() {
  5. const route = useRoute();
  6. // TODO: could this be useSiteData<DefaultTheme.Config> or is the siteData
  7. // resolved and has a different structure?
  8. const siteData = useSiteData();
  9. const resolveLink = (targetLink) => {
  10. let target;
  11. Object.keys(siteData.value.themeConfig.sidebar).some((k) => {
  12. return siteData.value.themeConfig.sidebar[k].some((v) => {
  13. if (Array.isArray(v.children)) {
  14. target = v.children.find((value) => {
  15. return value.link === targetLink;
  16. });
  17. }
  18. return !!target;
  19. });
  20. });
  21. return target;
  22. };
  23. const next = computed(() => {
  24. const pageData = route.data;
  25. if (pageData.frontmatter.next === false) {
  26. return undefined;
  27. }
  28. if (typeof pageData.frontmatter.next === 'string') {
  29. return resolveLink(pageData.frontmatter.next);
  30. }
  31. return pageData.next;
  32. });
  33. const prev = computed(() => {
  34. const pageData = route.data;
  35. if (pageData.frontmatter.prev === false) {
  36. return undefined;
  37. }
  38. if (typeof pageData.frontmatter.prev === 'string') {
  39. return resolveLink(pageData.frontmatter.prev);
  40. }
  41. return pageData.prev;
  42. });
  43. const hasLinks = computed(() => {
  44. return !!next || !!prev;
  45. });
  46. return {
  47. next,
  48. prev,
  49. hasLinks
  50. };
  51. }
  52. };