phanpy/src/components/account-sheet.jsx

89 lines
2.5 KiB
React
Raw Normal View History

2024-08-13 10:26:23 +03:00
import { t } from '@lingui/macro';
import { useEffect } from 'preact/hooks';
import { api } from '../utils/api';
import states from '../utils/states';
import useLocationChange from '../utils/useLocationChange';
import AccountInfo from './account-info';
2023-04-20 11:10:57 +03:00
import Icon from './icon';
function AccountSheet({ account, instance: propInstance, onClose }) {
const { masto, instance, authenticated } = api({ instance: propInstance });
const isString = typeof account === 'string';
useEffect(() => {
if (!isString) {
states.accounts[`${account.id}@${instance}`] = account;
}
}, [account]);
useLocationChange(onClose);
return (
<div
class="sheet"
// onClick={(e) => {
// const accountBlock = e.target.closest('.account-block');
// if (accountBlock) {
// onClose({
// destination: 'account-statuses',
// });
// }
// }}
>
2023-04-20 11:10:57 +03:00
{!!onClose && (
<button type="button" class="sheet-close outer" onClick={onClose}>
2024-08-13 10:26:23 +03:00
<Icon icon="x" alt={t`Close`} />
2023-04-20 11:10:57 +03:00
</button>
)}
<AccountInfo
instance={instance}
authenticated={authenticated}
account={account}
fetchAccount={async () => {
if (isString) {
try {
const info = await masto.v1.accounts.lookup({
acct: account,
skip_webfinger: false,
});
return info;
} catch (e) {
const result = await masto.v2.search.fetch({
q: account,
type: 'accounts',
limit: 1,
resolve: authenticated,
});
if (result.accounts.length) {
return result.accounts[0];
2023-09-10 04:13:00 +03:00
} else if (/https?:\/\/[^/]+\/@/.test(account)) {
2024-06-14 03:34:50 +03:00
const accountURL = URL.parse(account);
const { hostname, pathname } = accountURL;
const acct =
pathname.replace(/^\//, '').replace(/\/$/, '') +
'@' +
hostname;
const result = await masto.v2.search.fetch({
2023-09-10 04:13:00 +03:00
q: acct,
type: 'accounts',
limit: 1,
resolve: authenticated,
});
if (result.accounts.length) {
return result.accounts[0];
}
}
}
} else {
return account;
}
}}
/>
</div>
);
}
export default AccountSheet;