Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { ToggleSidePanelButton } from "@/ui/messages/toggle-side-panel-button";
import { ProgramHelpLinks } from "@/ui/partners/program-help-links";
import { ProgramRewardsPanel } from "@/ui/partners/program-rewards-panel";
import { X } from "@/ui/shared/icons";
import { Button, Grid, useCopyToClipboard } from "@dub/ui";
import { Button, Grid, useCopyToClipboard, useMediaQuery } from "@dub/ui";
import {
Check,
ChevronLeft,
Expand All @@ -36,13 +36,21 @@ import {
} from "@dub/utils";
import { useAction } from "next-safe-action/hooks";
import Link from "next/link";
import { redirect, useParams } from "next/navigation";
import { useState } from "react";
import {
redirect,
useParams,
useRouter,
useSearchParams,
} from "next/navigation";
import { useEffect, useState } from "react";
import { toast } from "sonner";
import { v4 as uuid } from "uuid";

export function PartnerMessagesProgramPageClient() {
const { programSlug } = useParams() as { programSlug: string };
const router = useRouter();
const searchParams = useSearchParams();
const { width } = useMediaQuery();

const { user } = useUser();
const { partner } = usePartnerProfile();
Expand Down Expand Up @@ -96,7 +104,18 @@ export function PartnerMessagesProgramPageClient() {
});

const { setCurrentPanel } = useMessagesContext();
const [isRightPanelOpen, setIsRightPanelOpen] = useState(true);
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
const shouldAutoFocusComposer = searchParams.get("new") === "1";

useEffect(() => {
if (typeof width !== "number") return;
setIsRightPanelOpen(width >= 1082);
}, [programSlug, width]);

useEffect(() => {
if (!shouldAutoFocusComposer) return;
router.replace(`/messages/${programSlug}`);
}, [programSlug, router, shouldAutoFocusComposer]);

// Redirect if no messages and not enrolled, or messages error
if (
Expand Down Expand Up @@ -194,6 +213,7 @@ export function PartnerMessagesProgramPageClient() {
currentUserType="partner"
currentUserId={partner?.id || ""}
program={program}
autoFocusComposer={shouldAutoFocusComposer}
onSendMessage={async (message) => {
const createdAt = new Date();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { NavButton } from "@/ui/layout/page-content/nav-button";
import { MessagesContext, MessagesPanel } from "@/ui/messages/messages-context";
import { MessagesList } from "@/ui/messages/messages-list";
import { ProgramSelector } from "@/ui/partners/program-selector";
import { Button, InfoTooltip, useRouterStuff } from "@dub/ui";
import { Button, InfoTooltip } from "@dub/ui";
import { Msgs, Pen2 } from "@dub/ui/icons";
import { useParams, useRouter } from "next/navigation";
import { CSSProperties, ReactNode, useEffect, useState } from "react";
Expand All @@ -14,7 +14,6 @@ export default function MessagesLayout({ children }: { children: ReactNode }) {
const { programSlug } = useParams() as { programSlug?: string };

const router = useRouter();
const { searchParams } = useRouterStuff();

const { programMessages, isLoading, error } = useProgramMessages({
query: { messagesLimit: 1 },
Expand All @@ -25,8 +24,8 @@ export default function MessagesLayout({ children }: { children: ReactNode }) {
);

useEffect(() => {
searchParams.get("new") && setCurrentPanel("main");
}, [searchParams.get("new")]);
setCurrentPanel(programSlug ? "main" : "index");
}, [programSlug]);

return (
<MessagesContext.Provider value={{ currentPanel, setCurrentPanel }}>
Expand Down Expand Up @@ -57,9 +56,10 @@ export default function MessagesLayout({ children }: { children: ReactNode }) {
</div>
<ProgramSelector
selectedProgramSlug={programSlug ?? null}
setSelectedProgramSlug={(slug) =>
router.push(`/messages/${slug}`)
}
setSelectedProgramSlug={(slug) => {
setCurrentPanel("main");
router.push(`/messages/${slug}?new=1`);
}}
trigger={
<Button
type="button"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,28 @@ import { PartnerInfoGroup } from "@/ui/partners/partner-info-group";
import { PartnerInfoSection } from "@/ui/partners/partner-info-section";
import { PartnerInfoStats } from "@/ui/partners/partner-info-stats";
import { X } from "@/ui/shared/icons";
import { Button } from "@dub/ui";
import { Button, useMediaQuery } from "@dub/ui";
import { ChevronLeft } from "@dub/ui/icons";
import { OG_AVATAR_URL, cn } from "@dub/utils";
import { useAction } from "next-safe-action/hooks";
import Link from "next/link";
import { redirect, useParams } from "next/navigation";
import { useState } from "react";
import {
usePathname,
redirect,
useParams,
useRouter,
useSearchParams,
} from "next/navigation";
import { useEffect, useState } from "react";
import { toast } from "sonner";
import { v4 as uuid } from "uuid";

export function ProgramMessagesPartnerPageClient() {
const { id: workspaceId, slug: workspaceSlug } = useWorkspace();
const router = useRouter();
const pathname = usePathname();
const searchParams = useSearchParams();
const { width } = useMediaQuery();

const { partnerId } = useParams() as { partnerId: string };
const { user } = useUser();
Expand Down Expand Up @@ -81,7 +91,23 @@ export function ProgramMessagesPartnerPageClient() {
});

const { setCurrentPanel } = useMessagesContext();
const [isRightPanelOpen, setIsRightPanelOpen] = useState(true);
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
const shouldAutoFocusComposer = searchParams.get("new") === "1";

useEffect(() => {
if (typeof width !== "number") return;
setIsRightPanelOpen(width >= 960);
}, [partnerId, width]);

useEffect(() => {
if (!shouldAutoFocusComposer) return;

const nextSearchParams = new URLSearchParams(searchParams.toString());
nextSearchParams.delete("new");
const nextSearch = nextSearchParams.toString();

router.replace(nextSearch ? `${pathname}?${nextSearch}` : pathname);
}, [pathname, router, searchParams, shouldAutoFocusComposer]);

if (errorMessages) redirect(`/${workspaceSlug}/program/messages`);

Expand Down Expand Up @@ -144,6 +170,7 @@ export function ProgramMessagesPartnerPageClient() {
currentUserId={user?.id || ""}
program={program}
partner={partner}
autoFocusComposer={shouldAutoFocusComposer}
onSendMessage={async (message) => {
const createdAt = new Date();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { PartnerSelector } from "@/ui/partners/partner-selector";
import { Button, InfoTooltip } from "@dub/ui";
import { Msgs, Pen2 } from "@dub/ui/icons";
import { useParams, useRouter } from "next/navigation";
import { CSSProperties, ReactNode, useState } from "react";
import { CSSProperties, ReactNode, useEffect, useState } from "react";
import { MessagesUpsell } from "./messages-upsell";

export default function MessagesLayout({ children }: { children: ReactNode }) {
Expand All @@ -30,7 +30,6 @@ export default function MessagesLayout({ children }: { children: ReactNode }) {
function CapableLayout({ children }: { children: ReactNode }) {
const { slug: workspaceSlug } = useWorkspace();
const { partnerId } = useParams() as { partnerId?: string };
const { program } = useProgram();

const router = useRouter();

Expand All @@ -42,6 +41,10 @@ function CapableLayout({ children }: { children: ReactNode }) {
partnerId ? "main" : "index",
);

useEffect(() => {
setCurrentPanel(partnerId ? "main" : "index");
}, [partnerId]);

return (
<MessagesContext.Provider value={{ currentPanel, setCurrentPanel }}>
<div className="@container/page h-[calc(100dvh-var(--page-top-margin)-var(--page-bottom-margin)-1px)] w-full overflow-hidden rounded-t-[inherit] bg-white">
Expand Down Expand Up @@ -71,9 +74,10 @@ function CapableLayout({ children }: { children: ReactNode }) {
</div>
<PartnerSelector
selectedPartnerId={partnerId ?? null}
setSelectedPartnerId={(id) =>
router.push(`/${workspaceSlug}/program/messages/${id}`)
}
setSelectedPartnerId={(id) => {
setCurrentPanel("main");
router.push(`/${workspaceSlug}/program/messages/${id}?new=1`);
}}
trigger={
<Button
type="button"
Expand Down
20 changes: 14 additions & 6 deletions apps/web/ui/layout/sidebar/app-sidebar-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import useProgram from "@/lib/swr/use-program";
import { useProgramReferralsCount } from "@/lib/swr/use-program-referrals-count";
import useWorkspace from "@/lib/swr/use-workspace";
import useWorkspaces from "@/lib/swr/use-workspaces";
import { useRouterStuff } from "@dub/ui";
import { useMediaQuery, useRouterStuff } from "@dub/ui";
import {
Bell,
Brush,
Expand Down Expand Up @@ -497,6 +497,7 @@ export function AppSidebarNav({
}) {
const { slug: paramsSlug } = useParams() as { slug?: string };
const pathname = usePathname();
const { width, isMobile } = useMediaQuery();
const { getQueryString } = useRouterStuff();
const { data: session, status } = useSession();
const { plan, defaultProgramId } = useWorkspace();
Expand Down Expand Up @@ -546,18 +547,25 @@ export function AppSidebarNav({
session?.user?.["defaultWorkspace"];

const currentArea = useMemo(() => {
const focusedProgramPath =
pathname.includes("/program/campaigns/") ||
pathname.includes("/program/messages/") ||
pathname.endsWith("/program/payouts/success");
const isMobileDrawerViewport =
typeof width === "number" ? width < 768 : isMobile;

return pathname.startsWith("/account/settings")
? "userSettings"
: pathname.startsWith(`/${slug}/settings`)
? "workspaceSettings"
: pathname.includes("/program/campaigns/") ||
pathname.includes("/program/messages/") ||
pathname.endsWith("/program/payouts/success")
? null
: focusedProgramPath
? isMobileDrawerViewport
? "program"
: null
: pathname.startsWith(`/${slug}/program`)
? "program"
: "default";
}, [slug, pathname]);
}, [isMobile, pathname, slug, width]);

const { program } = useProgram({
enabled: Boolean(currentArea === "program" && defaultProgramId),
Expand Down
4 changes: 3 additions & 1 deletion apps/web/ui/messages/messages-panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export function MessagesPanel({
partner,
onSendMessage,
placeholder,
autoFocusComposer,
error,
}: {
messages?: (Message & { delivered?: boolean })[];
Expand All @@ -40,6 +41,7 @@ export function MessagesPanel({
partner?: Pick<PartnerProps, "name">;
onSendMessage: (message: string) => void;
placeholder?: string;
autoFocusComposer?: boolean;
error?: any;
}) {
const { isMobile } = useMediaQuery();
Expand Down Expand Up @@ -286,7 +288,7 @@ export function MessagesPanel({
<MessageInput
placeholder={personalizedPlaceholder}
onSendMessage={sendMessage}
autoFocus={!isMobile}
autoFocus={!isMobile || autoFocusComposer}
/>
</div>
</div>
Expand Down