blowater/UI/dm.test.tsx

115 lines
3.7 KiB
TypeScript
Raw Normal View History

/** @jsx h */
import { h, render } from "https://esm.sh/preact@10.17.1";
import { PrivateKey } from "../lib/nostr-ts/key.ts";
import { InMemoryAccountContext, NostrEvent, NostrKind } from "../lib/nostr-ts/nostr.ts";
import { Datebase_View } from "../database.ts";
import { testEventBus } from "./_setup.test.ts";
import { prepareEncryptedNostrEvent } from "../lib/nostr-ts/event.ts";
2023-10-15 22:39:21 +00:00
import { DM_List } from "./conversation-list.ts";
import { EventSyncer } from "./event_syncer.ts";
2023-11-03 13:09:13 +00:00
import { ConnectionPool } from "../lib/nostr-ts/relay-pool.ts";
2023-10-01 20:59:07 +00:00
import { ProfileSyncer } from "../features/profile.ts";
import { handle_SendMessage } from "./app_update.tsx";
import { LamportTime } from "../time.ts";
import { initialModel } from "./app_model.ts";
import { relays } from "../lib/nostr-ts/relay-list.test.ts";
import { DirectMessageContainer } from "./dm.tsx";
import { fail } from "https://deno.land/std@0.176.0/testing/asserts.ts";
import { NewIndexedDB } from "./dexie-db.ts";
import { OtherConfig } from "./config-other.ts";
import { DirectedMessageController } from "../features/dm.ts";
import { GroupMessageController } from "../features/gm.ts";
2023-12-17 20:41:49 +00:00
import { Channel } from "https://raw.githubusercontent.com/BlowaterNostr/csp/master/csp.ts";
const ctx = InMemoryAccountContext.New(PrivateKey.Generate());
const indexedDB = NewIndexedDB();
if (indexedDB instanceof Error) {
fail(indexedDB.message);
}
2023-11-17 07:06:11 +00:00
const database = await Datebase_View.New(indexedDB, indexedDB, indexedDB);
2023-12-17 20:41:49 +00:00
const lamport = new LamportTime();
const e = await database.addEvent(
await prepareEncryptedNostrEvent(ctx, {
encryptKey: ctx.publicKey,
kind: NostrKind.DIRECT_MESSAGE,
tags: [["p", ctx.publicKey.hex]],
content: "hi",
}) as NostrEvent,
);
2023-09-12 14:51:27 +00:00
if (!e || e instanceof Error) {
fail();
}
2023-12-17 20:41:49 +00:00
const dm_list = new DM_List(ctx);
dm_list.addEvents([e]);
dm_list.addEvents(Array.from(database.getAllEvents()));
const pool = new ConnectionPool();
const model = initialModel();
pool.addRelayURL(relays[0]);
const gmControl = new GroupMessageController(ctx, { add: (_) => {} }, { add: (_) => {} });
2023-12-17 20:41:49 +00:00
const dmControl = new DirectedMessageController(ctx);
const view = () => {
return (
<DirectMessageContainer
2023-12-17 20:41:49 +00:00
conversationLists={dm_list}
eventSyncer={new EventSyncer(pool, database)}
2023-10-01 20:59:07 +00:00
profilesSyncer={new ProfileSyncer(database, pool)}
bus={testEventBus}
rightPanelModel={{
show: true,
}}
2023-10-07 20:40:18 +00:00
currentEditor={model.dm.currentEditor}
focusedContent={model.dm.focusedContent}
2023-10-04 21:34:43 +00:00
ctx={ctx}
pool={pool}
isGroupMessage={false}
2023-12-17 20:41:49 +00:00
pinListGetter={OtherConfig.Empty(new Channel(), ctx, lamport)}
profileGetter={database}
groupChatController={gmControl}
messageGetter={gmControl}
2023-12-17 20:41:49 +00:00
newMessageChecker={dm_list}
newMessageListener={dmControl}
relayRecordGetter={database}
/>
);
};
render(view(), document.body);
(async () => {
for await (const event of database.subscribe()) {
if (event == null) {
continue;
}
2023-12-17 20:41:49 +00:00
dm_list.addEvents([event]);
}
})();
for await (const e of testEventBus.onChange()) {
console.log(e);
if (e.type == "SendMessage") {
const err = await handle_SendMessage(
e,
ctx,
lamport,
pool,
2023-10-21 11:29:47 +00:00
model.dmEditors,
model.gmEditors,
database,
gmControl,
);
if (err instanceof Error) {
console.error("update:SendMessage", err);
continue; // todo: global error toast
}
}
render(view(), document.body);
}