36 lines
820 B
TypeScript
36 lines
820 B
TypeScript
|
|
export type ClaimantIdentifier = {
|
|||
|
|
canonical: string;
|
|||
|
|
display: string;
|
|||
|
|
kind: "phone" | "wechat";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
function stripLabel(value: string) {
|
|||
|
|
return value
|
|||
|
|
.replace(/^(?:微信号|微信|wechat|手机号|手机)\s*[::]?\s*/i, "")
|
|||
|
|
.trim();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function parseClaimantIdentifier(value: unknown): ClaimantIdentifier | null {
|
|||
|
|
const input = stripLabel(String(value ?? "").trim());
|
|||
|
|
if (!input) return null;
|
|||
|
|
|
|||
|
|
const phone = input.replace(/[\s-]/g, "").replace(/^\+?86/, "");
|
|||
|
|
if (/^1[3-9]\d{9}$/.test(phone)) {
|
|||
|
|
return {
|
|||
|
|
canonical: `phone:${phone}`,
|
|||
|
|
display: phone,
|
|||
|
|
kind: "phone",
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (/^[A-Za-z][A-Za-z0-9_-]{5,31}$/.test(input)) {
|
|||
|
|
return {
|
|||
|
|
canonical: `wechat:${input.toLowerCase()}`,
|
|||
|
|
display: input,
|
|||
|
|
kind: "wechat",
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|