components.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Navigation function for Electron desktop app
  2. function navigateToPage(page) {
  3. try {
  4. window.location.replace(page);
  5. } catch (error) {
  6. console.error('Navigation error:', error);
  7. window.location.href = page;
  8. }
  9. }
  10. async function loadComponent(componentPath, targetId, customizations = {}) {
  11. try {
  12. const response = await fetch(componentPath);
  13. if (!response.ok) throw new Error(`Failed to load ${componentPath}`);
  14. let html = await response.text();
  15. Object.entries(customizations).forEach(([placeholder, value]) => {
  16. html = html.replace(new RegExp(`{{${placeholder}}}`, 'g'), value);
  17. });
  18. const targetElement = document.getElementById(targetId);
  19. if (targetElement) {
  20. targetElement.innerHTML = html;
  21. }
  22. } catch (error) {
  23. console.error('Component loading failed:', error);
  24. }
  25. }
  26. const PAGE_CONFIGS = {
  27. editor: {
  28. header: `
  29. <span class="note-id" id="noteIdDisplay" style="display: none; cursor: pointer;" onclick="copyNoteLink()" title="Click to copy note ID"></span>
  30. <div class="theme-switch" id="themeSwitch" onclick="toggleTheme()" title="Toggle dark/light theme"></div>
  31. <button class="new-btn" onclick="showIdInput()">Open</button>
  32. <button class="new-btn" onclick="newNote()">New</button>
  33. `,
  34. needsModal: true,
  35. needsToast: true
  36. },
  37. home: {
  38. header: `
  39. <div class="theme-switch" id="themeSwitch" onclick="toggleTheme()" title="Toggle dark/light theme"></div>
  40. `,
  41. needsModal: true,
  42. needsToast: false
  43. },
  44. error: {
  45. header: `
  46. <div class="theme-switch" id="themeSwitch" onclick="toggleTheme()" title="Toggle dark/light theme"></div>
  47. <button class="new-btn" onclick="navigateToPage('home.html')">Home</button>
  48. `,
  49. needsModal: true,
  50. needsToast: false
  51. }
  52. };
  53. async function initPage(pageType) {
  54. const config = PAGE_CONFIGS[pageType];
  55. if (!config) {
  56. console.error('Unknown page type:', pageType);
  57. return;
  58. }
  59. await loadComponent('components/header.html', 'headerContainer', {
  60. HEADER_CONTENT: config.header
  61. });
  62. if (config.needsModal) {
  63. await loadComponent('components/modal.html', 'modalContainer');
  64. }
  65. if (typeof initializeTheme === 'function') {
  66. initializeTheme();
  67. }
  68. updateThemeSwitchState();
  69. }