refactor: tweak profile loader
This commit is contained in:
parent
1a405f7796
commit
bdc94cec8b
40
packages/app/src/Components/User/Debug.tsx
Normal file
40
packages/app/src/Components/User/Debug.tsx
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { useUserProfile } from "@snort/system-react";
|
||||||
|
|
||||||
|
import { UserRelays } from "@/Cache";
|
||||||
|
import { getRelayName } from "@/Utils";
|
||||||
|
|
||||||
|
export function UserDebug({ pubkey }: { pubkey: string }) {
|
||||||
|
const profile = useUserProfile(pubkey);
|
||||||
|
const relays = UserRelays.getFromCache(pubkey);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="text-xs">
|
||||||
|
<div className="flex flex-col overflow-wrap">
|
||||||
|
{Object.entries(profile ?? {}).map(([k, v]) => {
|
||||||
|
let vv = <div>{v}</div>;
|
||||||
|
|
||||||
|
if (k === "loaded") vv = <div>{new Date(Number(v)).toISOString()}</div>;
|
||||||
|
if (k === "created") vv = <div>{new Date(Number(v) * 1000).toISOString()}</div>;
|
||||||
|
if (k === "npub" || k === "pubkey") return;
|
||||||
|
return (
|
||||||
|
<div key={`${pubkey}-${k}`} className="flex justify-between gap-1">
|
||||||
|
<div>{k}</div>
|
||||||
|
{vv}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<div>Relays Updated: {new Date(1000 * (relays?.created ?? 0)).toISOString()}</div>
|
||||||
|
{relays?.relays.map(a => (
|
||||||
|
<div className="flex hover:bg-[--gray-ultradark]" key={a.url}>
|
||||||
|
<div className="grow">{getRelayName(a.url)}</div>
|
||||||
|
<div>{a.settings.read && <>R</>}</div>
|
||||||
|
<div>{a.settings.write && <>W</>}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -8,6 +8,7 @@ import Text from "@/Components/Text/Text";
|
|||||||
import FollowedBy from "@/Components/User/FollowedBy";
|
import FollowedBy from "@/Components/User/FollowedBy";
|
||||||
|
|
||||||
import useLogin from "../../Hooks/useLogin";
|
import useLogin from "../../Hooks/useLogin";
|
||||||
|
import { UserDebug } from "./Debug";
|
||||||
import FollowButton from "./FollowButton";
|
import FollowButton from "./FollowButton";
|
||||||
import ProfileImage from "./ProfileImage";
|
import ProfileImage from "./ProfileImage";
|
||||||
import { UserWebsiteLink } from "./UserWebsiteLink";
|
import { UserWebsiteLink } from "./UserWebsiteLink";
|
||||||
@ -26,6 +27,7 @@ export function ProfileCard({
|
|||||||
const [showProfileMenu, setShowProfileMenu] = useState(false);
|
const [showProfileMenu, setShowProfileMenu] = useState(false);
|
||||||
const [t, setT] = useState<ReturnType<typeof setTimeout>>();
|
const [t, setT] = useState<ReturnType<typeof setTimeout>>();
|
||||||
const { publicKey: myPublicKey } = useLogin(s => ({ publicKey: s.publicKey }));
|
const { publicKey: myPublicKey } = useLogin(s => ({ publicKey: s.publicKey }));
|
||||||
|
const debug = Boolean(localStorage.getItem("debug"));
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (show) {
|
if (show) {
|
||||||
@ -71,6 +73,7 @@ export function ProfileCard({
|
|||||||
/>
|
/>
|
||||||
<UserWebsiteLink user={user} />
|
<UserWebsiteLink user={user} />
|
||||||
{myPublicKey && <FollowedBy pubkey={pubkey} />}
|
{myPublicKey && <FollowedBy pubkey={pubkey} />}
|
||||||
|
{debug && <UserDebug pubkey={pubkey} />}
|
||||||
</div>
|
</div>
|
||||||
</ControlledMenu>
|
</ControlledMenu>
|
||||||
);
|
);
|
||||||
|
@ -10,8 +10,9 @@ export interface KeyedHookFilter {
|
|||||||
fn: HookFn;
|
fn: HookFn;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CacheEvents {
|
export interface CacheEvents<T> {
|
||||||
change: (keys: Array<string>) => void;
|
change: (keys: Array<string>) => void;
|
||||||
|
update: (v: T) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type CachedTable<T> = {
|
export type CachedTable<T> = {
|
||||||
@ -41,12 +42,12 @@ export type CachedTable<T> = {
|
|||||||
key(of: T): string;
|
key(of: T): string;
|
||||||
snapshot(): Array<T>;
|
snapshot(): Array<T>;
|
||||||
search(q: string): Promise<Array<T>>;
|
search(q: string): Promise<Array<T>>;
|
||||||
} & EventEmitter<CacheEvents>;
|
} & EventEmitter<CacheEvents<T>>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dexie backed generic hookable store
|
* Dexie backed generic hookable store
|
||||||
*/
|
*/
|
||||||
export abstract class FeedCache<TCached> extends EventEmitter<CacheEvents> implements CachedTable<TCached> {
|
export abstract class FeedCache<TCached> extends EventEmitter<CacheEvents<TCached>> implements CachedTable<TCached> {
|
||||||
readonly name: string;
|
readonly name: string;
|
||||||
#snapshot: Array<TCached> = [];
|
#snapshot: Array<TCached> = [];
|
||||||
protected log: ReturnType<typeof debug>;
|
protected log: ReturnType<typeof debug>;
|
||||||
|
@ -79,6 +79,9 @@ export abstract class BackgroundLoader<T extends { loaded: number; created: numb
|
|||||||
resolve(existing);
|
resolve(existing);
|
||||||
this.UntrackKeys(key);
|
this.UntrackKeys(key);
|
||||||
this.cache.off("change", handler);
|
this.cache.off("change", handler);
|
||||||
|
} else {
|
||||||
|
// should never happen
|
||||||
|
reject(new Error("Not found"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { unixNowMs } from "@snort/shared";
|
import { unixNowMs } from "@snort/shared";
|
||||||
import { EventKind, TaggedNostrEvent, RequestBuilder } from ".";
|
import { EventKind, TaggedNostrEvent, RequestBuilder } from ".";
|
||||||
import { MetadataRelays, ProfileCacheExpire } from "./const";
|
import { ProfileCacheExpire } from "./const";
|
||||||
import { mapEventToProfile, CachedMetadata } from "./cache";
|
import { mapEventToProfile, CachedMetadata } from "./cache";
|
||||||
import { BackgroundLoader } from "./background-loader";
|
import { BackgroundLoader } from "./background-loader";
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ export class ProfileLoaderService extends BackgroundLoader<CachedMetadata> {
|
|||||||
|
|
||||||
override buildSub(missing: string[]): RequestBuilder {
|
override buildSub(missing: string[]): RequestBuilder {
|
||||||
const sub = new RequestBuilder(`profiles`);
|
const sub = new RequestBuilder(`profiles`);
|
||||||
sub.withFilter().kinds([EventKind.SetMetadata]).authors(missing).relay(MetadataRelays);
|
sub.withFilter().kinds([EventKind.SetMetadata]).authors(missing);
|
||||||
return sub;
|
return sub;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user