111 lines
2.6 KiB
TypeScript
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("/")}`
|
|
}
|