61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import React from 'react';
|
|
import { Icon } from 'antd';
|
|
import keybaseIcon from 'static/images/keybase.svg';
|
|
import { SOCIAL_TYPE, SocialAccountMap, SocialInfo } from 'types';
|
|
|
|
const accountNameRegex = '([a-zA-Z0-9-_]*)';
|
|
export const SOCIAL_INFO: { [key in SOCIAL_TYPE]: SocialInfo } = {
|
|
[SOCIAL_TYPE.GITHUB]: {
|
|
type: SOCIAL_TYPE.GITHUB,
|
|
name: 'Github',
|
|
format: `https://github.com/${accountNameRegex}`,
|
|
icon: <Icon type="github" />,
|
|
},
|
|
[SOCIAL_TYPE.TWITTER]: {
|
|
type: SOCIAL_TYPE.TWITTER,
|
|
name: 'Twitter',
|
|
format: `https://twitter.com/${accountNameRegex}`,
|
|
icon: <Icon type="twitter" />,
|
|
},
|
|
[SOCIAL_TYPE.LINKEDIN]: {
|
|
type: SOCIAL_TYPE.LINKEDIN,
|
|
name: 'LinkedIn',
|
|
format: `https://linkedin.com/in/${accountNameRegex}`,
|
|
icon: <Icon type="linkedin" />,
|
|
},
|
|
[SOCIAL_TYPE.KEYBASE]: {
|
|
type: SOCIAL_TYPE.KEYBASE,
|
|
name: 'KeyBase',
|
|
format: `https://keybase.io/${accountNameRegex}`,
|
|
icon: <Icon component={keybaseIcon} />,
|
|
},
|
|
};
|
|
|
|
function urlToAccount(format: string, url: string): string | false {
|
|
const matches = url.match(new RegExp(format));
|
|
return matches && matches[1] ? matches[1] : false;
|
|
}
|
|
|
|
export function socialAccountToUrl(account: string, type: SOCIAL_TYPE): string {
|
|
return SOCIAL_INFO[type].format.replace(accountNameRegex, account);
|
|
}
|
|
|
|
export function socialUrlsToAccounts(urls: string[]): SocialAccountMap {
|
|
const accounts: SocialAccountMap = {};
|
|
urls.forEach(url => {
|
|
Object.values(SOCIAL_INFO).forEach(s => {
|
|
const account = urlToAccount(s.format, url);
|
|
if (account) {
|
|
accounts[s.type] = account;
|
|
}
|
|
});
|
|
});
|
|
return accounts;
|
|
}
|
|
|
|
export function socialAccountsToUrls(accounts: SocialAccountMap): string[] {
|
|
return Object.entries(accounts).map(([key, value]) => {
|
|
return socialAccountToUrl(value as string, key as SOCIAL_TYPE);
|
|
});
|
|
}
|