256ff0814e
Build & Deploy / Build & Push Docker Image (push) Failing after 44s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m0s
Test / Marketplace Unit Tests (push) Failing after 4m51s
Test / Admin Unit Tests (push) Successful in 9m31s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s
- Remove apps/marketplace entirely - Create apps/homepage (port 3000): landing/marketing pages (home, features, pricing, platform-ops, review, legal) - Create apps/storefront (port 3004): vehicle browsing (explore) and renter account (dashboard, profile, notifications) - Duplicate shared components/libs into each app - Update homepage header nav: Home, Features, Pricing instead of Home, Explore - Fix all /explore cross-references in homepage to point to /features - Update docker-compose.dev.yml: new homepage and storefront services, remove marketplace - Update docker-compose.production.yml: split into homepage (main domain) and storefront (path-based routes) - Update Dockerfiles: EXPOSE 3004 instead of 3003 - Update root package.json scripts: homepage/storefront profiles, tests, prod scripts - Add docker-prod-up-homepage.sh and docker-prod-up-storefront.sh, remove marketplace script
95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
export const SHARED_LANGUAGE_COOKIE = 'rentaldrivego-language'
|
|
export const SHARED_LANGUAGE_KEY = 'rentaldrivego-language'
|
|
export const SHARED_THEME_KEY = 'rentaldrivego-theme'
|
|
|
|
function readEmployeeToken() {
|
|
return null
|
|
}
|
|
|
|
function decodeEmployeeId(token: string | null) {
|
|
if (!token) return null
|
|
|
|
try {
|
|
const encoded = token.split('.')[1] ?? ''
|
|
const normalized = encoded.replace(/-/g, '+').replace(/_/g, '/')
|
|
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')
|
|
const payload = JSON.parse(atob(padded)) as { sub?: string }
|
|
return typeof payload.sub === 'string' && payload.sub ? payload.sub : null
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export function getScopedPreferenceKey(baseKey: string) {
|
|
const employeeId = decodeEmployeeId(readEmployeeToken())
|
|
return employeeId ? `${baseKey}:${employeeId}` : baseKey
|
|
}
|
|
|
|
export function getScopedPreferenceCookieName(baseKey: string) {
|
|
const employeeId = decodeEmployeeId(readEmployeeToken())
|
|
return employeeId ? `${baseKey}--${employeeId}` : baseKey
|
|
}
|
|
|
|
function readCookie(name: string) {
|
|
if (typeof document === 'undefined') return null
|
|
|
|
return document.cookie
|
|
.split(';')
|
|
.map((chunk) => chunk.trim())
|
|
.find((chunk) => chunk.startsWith(`${name}=`))
|
|
?.slice(name.length + 1) ?? null
|
|
}
|
|
|
|
function writeCookie(name: string, value: string) {
|
|
if (typeof document === 'undefined') return
|
|
document.cookie = `${name}=${value}; path=/; max-age=31536000; samesite=lax`
|
|
}
|
|
|
|
export function readCurrentUserScopedPreference(baseKey: string) {
|
|
if (typeof window === 'undefined') return null
|
|
|
|
const scopedCookie = readCookie(getScopedPreferenceCookieName(baseKey))
|
|
if (scopedCookie) return scopedCookie
|
|
|
|
return window.localStorage.getItem(getScopedPreferenceKey(baseKey))
|
|
}
|
|
|
|
export function readScopedPreference(baseKey: string, legacyKeys: string[] = []) {
|
|
if (typeof window === 'undefined') return null
|
|
|
|
const scopedCookie = readCookie(getScopedPreferenceCookieName(baseKey))
|
|
if (scopedCookie) return scopedCookie
|
|
|
|
const sharedCookie = readCookie(baseKey)
|
|
if (sharedCookie) return sharedCookie
|
|
|
|
const scopedKey = getScopedPreferenceKey(baseKey)
|
|
const candidates = [scopedKey, baseKey, ...legacyKeys]
|
|
|
|
for (const key of candidates) {
|
|
const value = window.localStorage.getItem(key)
|
|
if (value) return value
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
export function writeScopedPreference(baseKey: string, value: string, legacyKeys: string[] = []) {
|
|
if (typeof window === 'undefined') return
|
|
|
|
const scopedKey = getScopedPreferenceKey(baseKey)
|
|
const scopedCookie = getScopedPreferenceCookieName(baseKey)
|
|
|
|
writeCookie(baseKey, value)
|
|
if (scopedCookie !== baseKey) {
|
|
writeCookie(scopedCookie, value)
|
|
}
|
|
|
|
window.localStorage.setItem(scopedKey, value)
|
|
window.localStorage.setItem(baseKey, value)
|
|
|
|
for (const key of legacyKeys) {
|
|
window.localStorage.setItem(key, value)
|
|
}
|
|
}
|