ultisuite-client/lib/mail-url.ts
2026-05-15 17:40:17 +02:00

111 lines
2.6 KiB
TypeScript

/** Routage URL sous `/mail` : dossier, onglet boîte de réception, page, message ouvert. */
export const DEFAULT_MAIL_FOLDER = "inbox"
export const DEFAULT_INBOX_TAB = "primary"
/** Onglets catégories boîte de réception (alignés sur `categoryTabs` dans email-list). */
export const INBOX_CATEGORY_TAB_IDS = new Set([
"primary",
"promotions",
"social",
"updates",
"forums",
])
export type MailRouteState = {
folderId: string
/** Onglet catégorie ; pour `folderId !== inbox`, valeur ignorée par le filtre mais peut rester `primary`. */
inboxTab: string
page: number
mailId: string | null
}
const DEFAULT_STATE: MailRouteState = {
folderId: DEFAULT_MAIL_FOLDER,
inboxTab: DEFAULT_INBOX_TAB,
page: 1,
mailId: null,
}
function decodeSegment(s: string): string {
try {
return decodeURIComponent(s)
} catch {
return s
}
}
/**
* Parse le tableau de segments Next (sans le préfixe `mail`).
* Ex. `['inbox','promotions','page','2','message','1']`
*/
export function parseMailSegments(
segments: string[] | undefined | null
): MailRouteState {
const raw = segments?.filter((x) => x.length > 0) ?? []
if (raw.length === 0) return { ...DEFAULT_STATE }
const parts = [...raw]
let mailId: string | null = null
let page = 1
if (parts.length >= 2 && parts[parts.length - 2] === "message") {
mailId = decodeSegment(parts[parts.length - 1]!)
parts.length -= 2
}
if (parts.length >= 2 && parts[parts.length - 2] === "page") {
const n = parseInt(parts[parts.length - 1]!, 10)
page = Number.isFinite(n) && n >= 1 ? n : 1
parts.length -= 2
}
if (parts.length === 0) {
return { ...DEFAULT_STATE, mailId, page }
}
const folderId = parts[0]!
if (folderId === "inbox") {
if (parts.length >= 2) {
const tab = parts[1]!
if (INBOX_CATEGORY_TAB_IDS.has(tab)) {
return { folderId, inboxTab: tab, page, mailId }
}
return { folderId, inboxTab: DEFAULT_INBOX_TAB, page, mailId }
}
return { folderId, inboxTab: DEFAULT_INBOX_TAB, page, mailId }
}
return {
folderId,
inboxTab: DEFAULT_INBOX_TAB,
page,
mailId,
}
}
function encodePathSegment(s: string): string {
return encodeURIComponent(s)
}
export function buildMailPath(r: MailRouteState): string {
const segs: string[] = ["mail", encodeURIComponent(r.folderId)]
if (r.folderId === "inbox") {
const tab = r.inboxTab || DEFAULT_INBOX_TAB
if (tab !== DEFAULT_INBOX_TAB) {
segs.push(tab)
}
}
if (r.page > 1) {
segs.push("page", String(r.page))
}
if (r.mailId) {
segs.push("message", encodePathSegment(r.mailId))
}
return `/${segs.join("/")}`
}