Files
cinny/src/app/hooks/useExtendedProfile.ts
T

66 lines
1.8 KiB
TypeScript
Raw Normal View History

import { useEffect, useState } from 'react';
import { Method } from 'matrix-js-sdk';
import { useMatrixClient } from './useMatrixClient';
export type ExtendedProfile = {
pronouns?: string;
timezone?: string;
};
export const useExtendedProfile = (userId: string): ExtendedProfile => {
const mx = useMatrixClient();
const [extProfile, setExtProfile] = useState<ExtendedProfile>({});
useEffect(() => {
let cancelled = false;
const myUserId = mx.getUserId();
const fetchField = async <T extends Record<string, string>>(
field: string,
): Promise<string | undefined> => {
try {
const res = await mx.http.authedRequest<T>(
Method.Get,
`/profile/${encodeURIComponent(userId)}/${field}`,
);
return res[field as keyof T] as string | undefined;
} catch {
return undefined;
}
};
const run = async () => {
const [pronouns, tzFromProfile] = await Promise.all([
fetchField<{ 'm.pronouns': string }>('m.pronouns'),
fetchField<{ 'm.tz': string }>('m.tz'),
]);
let timezone = tzFromProfile;
// Standard Synapse doesn't support m.tz — fall back to account data for own profile
if (!timezone && userId === myUserId) {
try {
const res = await mx.http.authedRequest<{ timezone: string }>(
Method.Get,
`/user/${encodeURIComponent(userId)}/account_data/im.lotus.timezone`,
);
timezone = res.timezone || undefined;
} catch {
// not set yet
}
}
if (!cancelled) {
setExtProfile({ pronouns: pronouns || undefined, timezone: timezone || undefined });
}
};
run();
return () => {
cancelled = true;
};
}, [mx, userId]);
return extProfile;
};