Complete Story 1-1 and fix TypeScript issues
Add TypeScript strict mode and typecheck tasks to monorepo infrastructure. Fix E2E test @payload-config alias and frontend TypeScript errors. - Add tsconfig.json to backend with strict mode and path aliases - Add typecheck task to Turborepo and all packages - Fix @payload-config alias for E2E tests and dev server - Add setToken method to AuthService for middleware use - Fix implicit any types in Footer.astro and Header.astro - Remove invalid typescript config from astro.config.mjs
This commit is contained in:
@@ -51,6 +51,13 @@ import { Image } from 'astro:assets';
|
||||
|
||||
<script>
|
||||
// Client-side data fetching for footer
|
||||
interface LinkItem {
|
||||
link?: {
|
||||
url?: string;
|
||||
label?: string;
|
||||
};
|
||||
}
|
||||
|
||||
async function loadFooterData() {
|
||||
try {
|
||||
console.log('Fetching footer data...');
|
||||
@@ -61,7 +68,7 @@ import { Image } from 'astro:assets';
|
||||
// Update marketing solutions
|
||||
const marketingUl = document.getElementById('marketing-solutions');
|
||||
if (marketingUl && data.navItems?.[0]?.childNavItems) {
|
||||
const links = data.navItems[0].childNavItems.map(item =>
|
||||
const links = data.navItems[0].childNavItems.map((item: LinkItem) =>
|
||||
`<li><a href="${item.link?.url || '#'}" class="font-normal text-[var(--color-st-tropaz)] hover:text-[var(--color-dove-gray)] transition-colors">${item.link?.label}</a></li>`
|
||||
).join('');
|
||||
marketingUl.innerHTML = links;
|
||||
@@ -70,7 +77,7 @@ import { Image } from 'astro:assets';
|
||||
// Update marketing articles (行銷放大鏡)
|
||||
const articlesUl = document.getElementById('marketing-articles');
|
||||
if (articlesUl && data.navItems?.[1]?.childNavItems) {
|
||||
const links = data.navItems[1].childNavItems.map(item =>
|
||||
const links = data.navItems[1].childNavItems.map((item: LinkItem) =>
|
||||
`<li><a href="${item.link?.url || '#'}" class="font-normal text-[var(--color-st-tropaz)] hover:text-[var(--color-dove-gray)] transition-colors">${item.link?.label}</a></li>`
|
||||
).join('');
|
||||
articlesUl.innerHTML = links;
|
||||
|
||||
@@ -135,7 +135,7 @@ import { Image } from "astro:assets";
|
||||
mobileNav.innerHTML = "";
|
||||
|
||||
// Populate desktop navigation
|
||||
navItems.forEach((item) => {
|
||||
navItems.forEach((item: NavItem) => {
|
||||
const linkHtml = createNavLink(item);
|
||||
const li = document.createElement("li");
|
||||
li.innerHTML = linkHtml;
|
||||
@@ -143,7 +143,7 @@ import { Image } from "astro:assets";
|
||||
});
|
||||
|
||||
// Populate mobile navigation
|
||||
navItems.forEach((item) => {
|
||||
navItems.forEach((item: NavItem) => {
|
||||
const linkHtml = createNavLink(item)
|
||||
.replace("px-3 py-2", "block px-3 py-2")
|
||||
.replace(
|
||||
|
||||
@@ -15,7 +15,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
||||
}
|
||||
|
||||
// Validate token
|
||||
authService.token = token;
|
||||
authService.setToken(token);
|
||||
const user = await authService.getCurrentUser();
|
||||
|
||||
if (!user) {
|
||||
|
||||
@@ -61,6 +61,7 @@ export class AuthService {
|
||||
}
|
||||
|
||||
async logout(): Promise<void> {
|
||||
const tokenForRequest = this.token;
|
||||
this.token = null;
|
||||
if (typeof window !== 'undefined') {
|
||||
localStorage.removeItem('payload-token');
|
||||
@@ -68,17 +69,25 @@ export class AuthService {
|
||||
|
||||
// Optional: Call logout endpoint
|
||||
try {
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
if (tokenForRequest) {
|
||||
headers['Authorization'] = `Bearer ${tokenForRequest}`;
|
||||
}
|
||||
await fetch(`${PAYLOAD_URL}/api/users/logout`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
...(this.token && { 'Authorization': `Bearer ${this.token}` }),
|
||||
},
|
||||
headers,
|
||||
});
|
||||
} catch (error) {
|
||||
// Ignore logout errors
|
||||
}
|
||||
}
|
||||
|
||||
setToken(token: string): void {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
async getCurrentUser(): Promise<User | null> {
|
||||
if (!this.token) return null;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user