diff --git a/src/components/Column.tsx b/src/components/Column.tsx index 2aaf7e6..49f557e 100644 --- a/src/components/Column.tsx +++ b/src/components/Column.tsx @@ -22,12 +22,12 @@ const Column: Component = (props) => { }; return ( -
-
+
+
{/* ๐Ÿ  */} {props.name}
-
{props.children}
+
{props.children}
); }; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index fa46e90..5910aae 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -8,9 +8,8 @@ import useConfig from '@/nostr/useConfig'; import useCommands from '@/nostr/useCommands'; import usePubkey from '@/nostr/usePubkey'; import { useHandleCommand } from '@/hooks/useCommandBus'; -import ensureNonNull from '@/utils/ensureNonNull'; -const SideBar: Component = (props) => { +const SideBar: Component = () => { let formTextAreaRef: HTMLTextAreaElement | undefined; const [config] = useConfig(); const getPubkey = usePubkey(); @@ -18,6 +17,17 @@ const SideBar: Component = (props) => { const [formOpened, setFormOpened] = createSignal(false); + const openForm = () => { + setFormOpened(true); + setTimeout(() => { + formTextAreaRef?.focus?.(); + }, 100); + }; + const closeForm = () => { + setFormOpened(false); + formTextAreaRef?.blur?.(); + }; + const handlePost = ({ content }: { content: string }) => { const pubkey = getPubkey(); if (pubkey == null) { @@ -41,8 +51,7 @@ const SideBar: Component = (props) => { useHandleCommand(() => ({ commandType: 'openPostForm', handler: (cmd) => { - setFormOpened(true); - formTextAreaRef?.focus?.(); + openForm(); }, })); @@ -62,11 +71,7 @@ const SideBar: Component = (props) => { {/*
column 2
*/}
- setFormOpened(false)} - /> +
); diff --git a/src/components/UserDisplayName.tsx b/src/components/UserDisplayName.tsx index f6565f0..b071d07 100644 --- a/src/components/UserDisplayName.tsx +++ b/src/components/UserDisplayName.tsx @@ -1,7 +1,7 @@ import { Component, Switch, Match } from 'solid-js'; import useConfig from '@/nostr/useConfig'; -import useProfile, { type Profile } from '@/nostr/useProfile'; +import useProfile from '@/nostr/useProfile'; type UserNameDisplayProps = { pubkey: string; diff --git a/src/components/textNote/GeneralUserMentionDisplay.tsx b/src/components/textNote/GeneralUserMentionDisplay.tsx index 3cab221..0e44757 100644 --- a/src/components/textNote/GeneralUserMentionDisplay.tsx +++ b/src/components/textNote/GeneralUserMentionDisplay.tsx @@ -15,7 +15,7 @@ const GeneralUserMentionDisplay = (props: GeneralUserMentionDisplayProps) => { })); return ( - + 0} fallback={`@${props.pubkey}`}> @{profile()?.name ?? props.pubkey} ); diff --git a/src/components/textNote/ImageDisplay.tsx b/src/components/textNote/ImageDisplay.tsx index ed3207b..601d424 100644 --- a/src/components/textNote/ImageDisplay.tsx +++ b/src/components/textNote/ImageDisplay.tsx @@ -23,9 +23,9 @@ const ImageDisplay: Component = (props) => { const url = () => new URL(props.url); return ( - + {props.url} diff --git a/src/hooks/useCommandBus.ts b/src/hooks/useCommandBus.ts index 5047d6c..0316da9 100644 --- a/src/hooks/useCommandBus.ts +++ b/src/hooks/useCommandBus.ts @@ -1,4 +1,3 @@ -import { onMount } from 'solid-js'; import { useRequestMessage, useHandleMessage } from '@/hooks/useMessageBus'; type UseHandleCommandProps = { diff --git a/src/hooks/useMessageBus.ts b/src/hooks/useMessageBus.ts index 8bb6ceb..9a08004 100644 --- a/src/hooks/useMessageBus.ts +++ b/src/hooks/useMessageBus.ts @@ -14,11 +14,9 @@ export type MessageChannelRequest = { request: T; }; -export type MessageChannelResponse = { - requestId: string; - response?: T; - error?: any; -}; +export type MessageChannelResponse = + | { requestId: string; ok: true; response: T } + | { requestId: string; ok: false; error: any }; const [channels, setChannels]: Signal> = createSignal({}); @@ -42,22 +40,26 @@ export const useRequestMessage = (propsProvider: () => UseRequestMessa const waitResponse = (requestId: string, timeoutMs = 1000): Promise => new Promise((resolve, reject) => { + let timeoutId: ReturnType | undefined; const listener = (event: MessageEvent) => { const data = event.data as MessageChannelResponse; if (data.requestId !== requestId) return; channel().port1.removeEventListener('message', listener); - if (data.response != null) { + if (data.ok) { resolve(data.response); } else { reject(data.error); } + if (timeoutId != null) { + clearTimeout(timeoutId); + } }; - setTimeout(() => { + timeoutId = setTimeout(() => { channel().port1.removeEventListener('message', listener); - reject(new Error('TimeoutError')); + reject(new Error(`TimeoutError: ${requestId}`)); }, timeoutMs); channel().port1.addEventListener('message', listener, false); @@ -84,6 +86,9 @@ export const useHandleMessage = ( const channel = () => channels()[props().id]; onMount(() => { + const { id } = props(); + registerChannelIfNotExist(id); + const port = channel().port2; const messageHandler = (event: MessageEvent) => { const { requestId, request } = event.data as MessageChannelRequest; @@ -92,12 +97,12 @@ export const useHandleMessage = ( resultPromise .then((res) => { - const response: MessageChannelResponse = { requestId, response: res }; + const response: MessageChannelResponse = { requestId, ok: true, response: res }; port.postMessage(response); }) .catch((err) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const response: MessageChannelResponse = { requestId, error: err }; + const response: MessageChannelResponse = { requestId, ok: false, error: err }; port.postMessage(response); }); }; diff --git a/src/hooks/useShortcutKeys.ts b/src/hooks/useShortcutKeys.ts index 2cd0b7c..77c1420 100644 --- a/src/hooks/useShortcutKeys.ts +++ b/src/hooks/useShortcutKeys.ts @@ -68,7 +68,7 @@ export const useMountShortcutKeys = () => { useShortcutKeys({ onShortcut: (shortcut) => { request(shortcut.command).then( - () => console.debug(`${shortcut.key} was processed successfully`), + () => console.debug(`shortcut key '${shortcut.key}' was processed successfully`), (err) => console.error(err), ); }, diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 9637ebf..054c71b 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,4 +1,4 @@ -import { Show, For, createSignal, createEffect, onMount, type Component } from 'solid-js'; +import { createEffect, onMount, type Component } from 'solid-js'; import { useNavigate } from '@solidjs/router'; import Column from '@/components/Column'; @@ -16,9 +16,8 @@ import { useMountShortcutKeys } from '@/hooks/useShortcutKeys'; import useLoginStatus from '@/hooks/useLoginStatus'; import ensureNonNull from '@/utils/ensureNonNull'; -useMountShortcutKeys(); - const Home: Component = () => { + useMountShortcutKeys(); const navigate = useNavigate(); const { loginStatus } = useLoginStatus(); @@ -29,7 +28,8 @@ const Home: Component = () => { createEffect(() => { config().relayUrls.map(async (relayUrl) => { const relay = await pool().ensureRelay(relayUrl); - relay.on('notice', (msg) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + relay.on('notice', (msg: any) => { console.error(`NOTICE: ${relayUrl}: ${msg}`); }); }); @@ -123,7 +123,7 @@ const Home: Component = () => { return (
-
+
@@ -136,6 +136,9 @@ const Home: Component = () => { + + <> +
);