year пре 2 месеци
родитељ
комит
443ad844a9

+ 2 - 2
src/api/home.ts

@@ -316,14 +316,14 @@ export interface GlobalNoticeRep extends Omit<NoticeRep, "content"> {
     send_user_time: number;
 }
 export const getGlobalNoticeApi = () => {
-    return server.post<NoticeRep[], { summery: { unread: number } }>({
+    return server.post<NoticeRep[], { summery: { unread: number; promotion_count: number } }>({
         url: "/v1/api/front/notice_list",
         data: {},
     });
 };
 
 export const getGlobalUserNoticeApi = () => {
-    return server.post<NoticeRep[], { summery: { unread: number } }>({
+    return server.post<NoticeRep[], { summery: { unread: number; promotion_count: number } }>({
         url: "/v1/api/front/notice_user_list",
         data: {},
     });

+ 26 - 4
src/app/[locale]/(TabBar)/promo/layout.tsx

@@ -1,18 +1,40 @@
+"use client";
 import HeaderBack from "@/components/HeaderBack";
-import { getTranslations } from "next-intl/server";
+import { useRouter } from "@/i18n/routing";
+import { useTranslations } from "next-intl";
 import { ReactNode } from "react";
 
-export default async function Layout({
+export default function Layout({
     children,
     params: { locale },
 }: {
     children: ReactNode;
     params: { locale: string };
 }) {
-    const t = await getTranslations("Sidebar");
+    const t = useTranslations("Sidebar");
+    const router = useRouter();
+
+    const goRecord = () => {
+        router.push({
+            pathname: "/promo/record",
+        });
+    };
+
     return (
         <>
-            <HeaderBack useBg={true} showBack={true} title={t("promocoes")} />
+            <HeaderBack
+                useBg={true}
+                showBack={true}
+                title={t("promocoes")}
+                // Right={() => (
+                //     <div
+                //         onClick={goRecord}
+                //         className="whitespace-nowrap text-[.12rem] text-[#00eaff]"
+                //     >
+                //         Recorde de prêmios
+                //     </div>
+                // )}
+            />
             <main className={"main-header"}>{children}</main>
         </>
     );

+ 18 - 12
src/app/[locale]/(TabBar)/promo/page.tsx

@@ -96,27 +96,33 @@ const Promo = () => {
     return (
         <div className="flex h-[100%] items-stretch">
             <div className="w-[1.2rem] overflow-auto p-[.1rem] pr-[0px]">
-                <div
-                    className={clsx(styles.categoryItem, {
-                        [styles.active]: act === 0,
-                    })}
-                    onClick={() => doChange(0)}
-                >
-                    <Image alt="category" src="/promo/category.png" width={16} height={16}></Image>
-                    <div className="ml-[.04rem]">Abrangente</div>
-                </div>
                 {category.map((item: any) => {
                     return (
                         <div
                             key={item.id}
-                            className={clsx(styles.categoryItem, styles.small, {
+                            className={clsx(styles.categoryItem, {
                                 [styles.active]: act === item.id,
+                                [styles.small]: item.id,
                             })}
                             onClick={() => doChange(item.id)}
                         >
-                            {item.name}
+                            {item.id != 0 && item.name}
+                            {item.id === 0 && (
+                                <>
+                                    <Image
+                                        alt="category"
+                                        src="/promo/category.png"
+                                        width={16}
+                                        height={16}
+                                    ></Image>
+                                    <div className="ml-[.04rem]">Abrangente</div>
+                                </>
+                            )}
+
                             {!!item.badge_count && (
-                                <div className={styles.categoryItemNum}>{item.badge_count}</div>
+                                <div className={styles.categoryItemNum}>
+                                    {item.badge_count > 99 ? `99+` : item.badge_count}
+                                </div>
                             )}
                         </div>
                     );

+ 12 - 8
src/components/Footer/index.tsx

@@ -69,12 +69,15 @@ const Footer: FC = () => {
         router.push(path);
     };
 
-    const { unread, userUnred, setNotices, setUserUnread } = useGlobalNoticeStore((state) => ({
-        unread: state.unread,
-        setNotices: state.setNotices,
-        setUserUnread: state.setUserUnread,
-        userUnred: state.userUnred,
-    }));
+    const { unread, userUnred, setNotices, setUserUnread, promotion_count, setPromotionCount } =
+        useGlobalNoticeStore((state) => ({
+            unread: state.unread,
+            setNotices: state.setNotices,
+            setUserUnread: state.setUserUnread,
+            setPromotionCount: state.setPromotionCount,
+            userUnred: state.userUnred,
+            promotion_count: state.promotion_count,
+        }));
 
     const setWallet = useWalletStore((state) => state.setWallet);
     const { run } = useRequest(getGlobalNoticeApi, {
@@ -84,6 +87,7 @@ const Footer: FC = () => {
         pollingWhenHidden: false,
         onSuccess: (data) => {
             setNotices(data?.data || [], data?.summery.unread || 0);
+            setPromotionCount(data.summery.promotion_count || 0);
         },
     });
 
@@ -179,9 +183,9 @@ const Footer: FC = () => {
                                             ></span>
                                         </Badge>
                                     )}
-                                    {index == 3 && (
+                                    {index == 3 && !!promotion_count && (
                                         <div className="absolute -top-[0px] right-[4px] flex h-[.16rem] w-[.16rem] items-center justify-center rounded-[50%] bg-[#ff0000] text-[.1rem] text-[#fff]">
-                                            23
+                                            {promotion_count > 99 ? `99+` : promotion_count}
                                         </div>
                                     )}
                                 </div>

+ 9 - 3
src/components/HeaderBack/index.tsx

@@ -20,6 +20,7 @@ export interface HeaderBackProps {
     headerRender?: () => ReactNode;
     className?: string;
     useBg?: Boolean;
+    Right?: () => ReactNode; // 右侧自定义渲染,优先级高于childre
 }
 
 const HeaderBack: FC<PropsWithChildren<HeaderBackProps>> = ({
@@ -28,6 +29,7 @@ const HeaderBack: FC<PropsWithChildren<HeaderBackProps>> = ({
     children,
     className,
     useBg = false,
+    Right,
 }) => {
     const t = useTranslations("HeaderBack");
 
@@ -69,6 +71,7 @@ const HeaderBack: FC<PropsWithChildren<HeaderBackProps>> = ({
     };
 
     const cls = clsx(styles.headerBack, className, useBg && styles.useBg);
+
     return (
         <div className={cls}>
             <div className={styles.left}>
@@ -78,9 +81,12 @@ const HeaderBack: FC<PropsWithChildren<HeaderBackProps>> = ({
                 {(title || selfTitle) && <span>{title || selfTitle}</span>}
             </div>
             <div className={styles.content}>{children}</div>
-            <span className={styles.right} onClick={() => goPage("home")}>
-                <span className={iconClassName2}></span>
-            </span>
+            {!Right && (
+                <span className={styles.right} onClick={() => goPage("home")}>
+                    <span className={iconClassName2}></span>
+                </span>
+            )}
+            {Right && Right()}
         </div>
     );
 };

+ 5 - 0
src/stores/useGlobalNoticeStore.ts

@@ -7,6 +7,7 @@ interface State {
     unread: number; // 未读数量
     userUnred: number; // 未读数量
     notices: NoticeRep[]; // 总数据
+    promotion_count: number;
 }
 
 interface Action {
@@ -15,6 +16,7 @@ interface Action {
     setNotices: (notices: NoticeRep[], unread: number) => void;
     setReadNotices: (id: number) => Promise<Result<any>>;
     setUserUnread: (value: number) => void;
+    setPromotionCount: (value: number) => void;
 }
 
 const initialState: State = {
@@ -22,6 +24,7 @@ const initialState: State = {
     unread: 0,
     userUnred: 0,
     notices: [],
+    promotion_count: 0,
 };
 
 export const useGlobalNoticeStore = create<State & Action>()((set, get) => {
@@ -38,6 +41,8 @@ export const useGlobalNoticeStore = create<State & Action>()((set, get) => {
         setNotices: (notices, unread: number) => set((state) => ({ ...state, notices, unread })),
 
         setUserUnread: (value: number) => set((state) => ({ ...state, userUnred: value })),
+        setPromotionCount: (value: number) =>
+            set((state) => ({ ...state, promotion_count: value })),
         setReadNotices: (id: number) => {
             return updateGlobalNoticeApi(id);
         },