a. Update CORS settings b. Update session cookie settings c. Remove comments that expose project architecture (and that Claude made most of it :P)
152 lines
6.7 KiB
JavaScript
152 lines
6.7 KiB
JavaScript
|
|
// Pages
|
|
// Core
|
|
import PageHome from './pages/core/home.js';
|
|
import PageContact from './pages/core/contact.js';
|
|
// Legal
|
|
import PageAccessibilityReport from './pages/legal/accessibility_report.js';
|
|
import PageAccessibilityStatement from './pages/legal/accessibility_statement.js';
|
|
import PageLicense from './pages/legal/license.js';
|
|
// User
|
|
// import PageUserLogin from './pages/user/login.js';
|
|
// import PageUserLogout from './pages/user/logout.js';
|
|
// import PageUserAccount from './pages/user/account.js';
|
|
|
|
import API from './api.js';
|
|
import DOM from './dom.js';
|
|
import PagePrivacyPolicy from './pages/legal/privacy_policy.js';
|
|
import PageRetentionSchedule from './pages/legal/retention_schedule.js';
|
|
|
|
|
|
export default class Router {
|
|
constructor() {
|
|
// Pages
|
|
this.pages = {};
|
|
// Core
|
|
this.pages[hashPageHome] = { name: 'PageHome', module: PageHome }; // importModule: () => import(/* webpackChunkName: "page_core_home" */ './pages/core/home.js') , pathModule: './pages/core/home.js'
|
|
this.pages[hashPageContact] = { name: 'PageContact', module: PageContact }; // pathModule: './pages/core/contact.js' };
|
|
// Legal
|
|
this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement }; // pathModule: '../../static/js/pages/legal/accessibility_statement.js' }; // , page: PageAccessibilityStatement
|
|
this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule }; // pathModule: './pages/legal/data_retention_schedule.js' };
|
|
this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense }; // pathModule: './pages/legal/license.js' };
|
|
this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy }; // pathModule: './pages/legal/privacy_policy.js' }; // importModule: () => {return import(/* webpackChunkName: "page_privacy_policy" */ './pages/legal/privacy_policy.js'); }
|
|
// User
|
|
// this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' };
|
|
// this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' };
|
|
// this.pages[hashPageUserAccount] = { name: 'PageUserAccount', module: PageUserAccount }; // pathModule: './pages/user/account.js' };
|
|
|
|
// Routes
|
|
this.routes = {};
|
|
// Core
|
|
this.routes[hashPageHome] = (isPopState = false) => this.navigateToHash(hashPageHome, isPopState);
|
|
this.routes[hashPageContact] = (isPopState = false) => this.navigateToHash(hashPageContact, isPopState);
|
|
// Legal
|
|
this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);
|
|
this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);
|
|
this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState);
|
|
this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState);
|
|
// User
|
|
// this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState);
|
|
// this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState);
|
|
// this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState);
|
|
this.initialize();
|
|
}
|
|
loadPage(hashPage, isPopState = false) {
|
|
const PageClass = this.getClassPageFromHash(hashPage);
|
|
this.currentPage = new PageClass(this);
|
|
this.currentPage.initialize(isPopState);
|
|
window.addEventListener('beforeunload', () => this.currentPage.leave());
|
|
}
|
|
getClassPageFromHash(hashPage) {
|
|
|
|
let pageJson = this.pages[hashPage];
|
|
try {
|
|
/*
|
|
const module = await pagesContext(pageJson.pathModule);
|
|
console.log("module: ", module);
|
|
return module[pageJson.name];
|
|
*/
|
|
// const module = await import(pageJson.pathModule); // pageJson.page;
|
|
// const module = () => import(pageJson.pathModule);
|
|
const module = pageJson.module; // importModule;
|
|
return module; // [pageJson.name];
|
|
}
|
|
catch (error) {
|
|
if (_verbose) { console.log("this.pages: ", this.pages); };
|
|
console.error('Page not found:', hashPage);
|
|
throw error;
|
|
}
|
|
}
|
|
initialize() {
|
|
/*
|
|
let pages = Router.getPages();
|
|
for (const key of Object.keys(pages)) {
|
|
let page = pages[key];
|
|
this.addRoute(page.hash, page.initialize);
|
|
}
|
|
*/
|
|
window.addEventListener('popstate', this.handlePopState.bind(this)); // page accessed by history navigation
|
|
}
|
|
handlePopState(event) {
|
|
this.loadPageCurrent();
|
|
}
|
|
loadPageCurrent() {
|
|
const hashPageCurrent = DOM.getHashPageCurrent();
|
|
this.loadPage(hashPageCurrent);
|
|
}
|
|
navigateToHash(hash, data = null, params = null, isPopState = false) {
|
|
// this.beforeLeave();
|
|
/*
|
|
if (this.routes[hash]) {
|
|
this.routes[hash](isPopState);
|
|
} else {
|
|
console.error(`Hash ${hash} not found`);
|
|
}
|
|
*/
|
|
let url = API.getUrlFromHash(hash, params);
|
|
// if (!isPopState)
|
|
history.pushState({data: data, params: params}, '', hash);
|
|
API.goToUrl(url, data);
|
|
}
|
|
/* beforeunload listener
|
|
async beforeLeave() {
|
|
const ClassPageCurrent = await this.getClassPageFromHash(DOM.getHashPageCurrent());
|
|
const pageCurrent = new ClassPageCurrent(this);
|
|
pageCurrent.leave();
|
|
}
|
|
*/
|
|
navigateToUrl(url, data = null, appendHistory = true) {
|
|
// this.beforeLeave();
|
|
if (appendHistory) history.pushState(data, '', url);
|
|
url = API.parameteriseUrl(url, data);
|
|
API.goToUrl(url);
|
|
}
|
|
|
|
static loadPageBodyFromResponse(response) {
|
|
DOM.loadPageBody(response.data);
|
|
}
|
|
}
|
|
|
|
export const router = new Router();
|
|
|
|
/*
|
|
router.addRoute('/', () => {
|
|
console.log('Home page');
|
|
// Load home page content
|
|
});
|
|
|
|
router.addRoute('/about', () => {
|
|
console.log('About page');
|
|
// Load about page content
|
|
});
|
|
|
|
export function setupNavigationEvents() {
|
|
document.querySelectorAll('a[data-nav]').forEach(link => {
|
|
link.addEventListener('click', (e) => {
|
|
e.preventDefault();
|
|
const url = e.target.getAttribute('href');
|
|
router.navigateToUrl(url);
|
|
});
|
|
});
|
|
}
|
|
*/ |