diff --git a/app/.storybook/main.ts b/app/.storybook/main.ts index 8cdb9537..19ec2a30 100644 --- a/app/.storybook/main.ts +++ b/app/.storybook/main.ts @@ -13,9 +13,7 @@ const config: StorybookConfig = { stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], addons: [ getAbsolutePath("@storybook/addon-themes"), - getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@chromatic-com/storybook"), - getAbsolutePath("@storybook/addon-interactions"), ], framework: { name: getAbsolutePath("@storybook/react-vite"), diff --git a/app/src/js/components/Router.tsx b/app/src/js/components/Router.tsx index fde13578..7346ec96 100644 --- a/app/src/js/components/Router.tsx +++ b/app/src/js/components/Router.tsx @@ -78,7 +78,7 @@ const RouteHandler = () => { if (params.channelId) { return (
- {/*params.isSearch && */} + {params.isSearch && } {params.isPins && } {!params.isPins && !params.isSearch && ( diff --git a/app/src/js/components/molecules/DiscussionHeader.stories.tsx b/app/src/js/components/molecules/DiscussionHeader.stories.tsx index 268bdc7b..9a41e008 100644 --- a/app/src/js/components/molecules/DiscussionHeader.stories.tsx +++ b/app/src/js/components/molecules/DiscussionHeader.stories.tsx @@ -6,7 +6,7 @@ import { AppModel } from "../../core/models/app.ts"; import { AppProvider } from "../contexts/appState.tsx"; const app = new AppModel(); -import { client } from "app/src/js/core/client.ts"; +import { client } from "../../core/client.ts"; const meta: Meta = { component: DiscussionHeader, diff --git a/app/src/js/components/organisms/MessageListScroller.tsx b/app/src/js/components/organisms/MessageListScroller.tsx index 3d1b9776..786c6df4 100644 --- a/app/src/js/components/organisms/MessageListScroller.tsx +++ b/app/src/js/components/organisms/MessageListScroller.tsx @@ -85,6 +85,7 @@ export const MessageList = observer((props: MessageListProps) => { // fix scroll position when scrolling and new messages are added/removed from the list useEffect(() => { if (!element?.current) return; + if (!model.messages) return; if (list === oldList) return; const getRect = (): DOMRect | undefined => { if (!element.current) return; @@ -107,11 +108,12 @@ export const MessageList = observer((props: MessageListProps) => { setCurrent([current[0], rect]); } setOldList(list); - }, [list, model.messages.mode, oldList, setOldList, current, setCurrent]); + }, [list, model.messages?.mode, oldList, setOldList, current, setCurrent]); // scroll selected item into view useEffect(() => { if (!element.current) return; + if (!model.messages) return; if (model.messages.selected === selected) return; const found = [...element.current.children] ?.find((child) => @@ -127,7 +129,7 @@ export const MessageList = observer((props: MessageListProps) => { }, 500); setSelected(model.messages.selected); } - }, [model.messages.selected, selected, setSelected]); + }, [model.messages?.selected, selected, setSelected]); const scroll = useCallback((e: React.SyntheticEvent) => { detectDate(e); diff --git a/app/src/js/components/organisms/Search.tsx b/app/src/js/components/organisms/Search.tsx index 3b9a12f2..c1d4f49b 100644 --- a/app/src/js/components/organisms/Search.tsx +++ b/app/src/js/components/organisms/Search.tsx @@ -56,6 +56,7 @@ const StyledSearch = styled.div` export const Header = observer(() => { const app = useApp(); + const navigate = useNavigate(); const { channelId } = useParams(); const onSearch = useCallback( (search: string) => { @@ -70,8 +71,9 @@ export const Header = observer(() => { const onClose = useCallback(() => { if (channelId) { app.clearSearch(channelId); + navigate(`/${channelId}`); } - }, [channelId]); + }, [channelId, navigate]); return ( {isMobile() @@ -119,6 +121,11 @@ export const SearchResults = observer( model.init(); }, [model]); + // Don't render MessageList until messages model is ready + if (!model.messages) { + return
Enter search query...
; + } + // Create a wrapper object that makes SearchModel compatible with MessageList const threadModelWrapper = { messages: model.messages, diff --git a/app/vite.config.ts b/app/vite.config.ts index fbdef449..05c67f17 100644 --- a/app/vite.config.ts +++ b/app/vite.config.ts @@ -21,6 +21,7 @@ export default defineConfig(({ command }) => ({ key: fs.readFileSync(path.join(sslPath, "key.pem")), cert: fs.readFileSync(path.join(sslPath, "cert.pem")), }, + host: true, port: 3000, strictPort: true, hmr: { diff --git a/deno/config/base.ts b/deno/config/base.ts index 66920bfa..bd1f73c5 100644 --- a/deno/config/base.ts +++ b/deno/config/base.ts @@ -17,7 +17,7 @@ export const from = async (path: string): Promise => { const __dirname = path.dirname(path.fromFileUrl(import.meta.url)); const SECRETS_FILE: string = path.join(__dirname, "..", "..", "secrets.json"); -const PORT: number = parseInt(Deno.env.get("PORT") ?? "8080") || 8080; +const PORT: number = parseInt(Deno.env.get("PORT") ?? "3001") || 3001; const DATABASE_URL = Deno.env.get("DATABASE_URL"); const ENV = Deno.env.get("ENV_TYPE") || Deno.env.get("NODE_ENV"); @@ -51,7 +51,7 @@ const defaults: Partial = { type: "fs", directory: path.join(Deno.cwd(), "..", "..", "uploads"), }, - baseUrl: "http://localhost:8080", + baseUrl: "http://localhost:3001", }; const secrets = generateSecrets(); diff --git a/deno/server/infra/repo/mod.ts b/deno/server/infra/repo/mod.ts index 3837327f..6d09ffac 100644 --- a/deno/server/infra/repo/mod.ts +++ b/deno/server/infra/repo/mod.ts @@ -36,7 +36,7 @@ export class Repository { constructor(config: Config) { const databaseUrl = config.databaseUrl ?? Deno.env.get("DATABASE_URL") ?? - "mongodb://chat:chat@localhost:27017/tests?authSource=admin"; + "mongodb://chat:chat@localhost:27017/chat?authSource=admin"; const db = new Database(databaseUrl); this.user = new UserRepo(db); this.session = new SessionRepo(db);