From 51440af3b063837bc2a411f53ba6337108948460 Mon Sep 17 00:00:00 2001 From: Tech-lo Date: Mon, 13 Jul 2026 16:13:40 +0545 Subject: [PATCH 1/2] update the integration with actual params objects --- .../routes/verse-of-day/VerseOfDay.tsx | 40 +++++++++----- .../routes/verse-of-day/VerseOfDayList.tsx | 53 +++++++++++++------ .../routes/verse-of-day/api/verseOfDayApi.ts | 35 ++++++++---- 3 files changed, 90 insertions(+), 38 deletions(-) diff --git a/src/components/routes/verse-of-day/VerseOfDay.tsx b/src/components/routes/verse-of-day/VerseOfDay.tsx index f186eb8..5fa46ab 100644 --- a/src/components/routes/verse-of-day/VerseOfDay.tsx +++ b/src/components/routes/verse-of-day/VerseOfDay.tsx @@ -11,6 +11,7 @@ import { getApiErrorMessage } from "@/lib/apiErrors"; import { fetchVerseOfDayList, deleteVerseOfDay, + type SortOrder, type VerseOfDayItem, } from "./api/verseOfDayApi"; import VerseOfDayList from "./VerseOfDayList"; @@ -21,6 +22,7 @@ const PAGE_SIZE = 10; const VerseOfDay = () => { const [search, setSearch] = useState(""); const [currentPage, setCurrentPage] = useState(1); + const [sortOrder, setSortOrder] = useState("desc"); const [debouncedSearch] = useDebounce(search, 500); const [formOpen, setFormOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); @@ -29,8 +31,14 @@ const VerseOfDay = () => { const queryClient = useQueryClient(); const { data, isLoading, error } = useQuery({ - queryKey: ["verse-of-day-list", currentPage, debouncedSearch], - queryFn: fetchVerseOfDayList, + queryKey: ["verse-of-day-list", currentPage, debouncedSearch, sortOrder], + queryFn: () => + fetchVerseOfDayList({ + page: currentPage, + limit: PAGE_SIZE, + search: debouncedSearch, + sortOrder, + }), refetchOnWindowFocus: false, retry: false, }); @@ -44,6 +52,9 @@ const VerseOfDay = () => { onSuccess: () => { toast.success("Verse of Day deleted successfully!"); setDeleteTarget(null); + if (data?.verses.length === 1 && currentPage > 1) { + setCurrentPage(currentPage - 1); + } invalidateVerses(); }, onError: (err) => { @@ -68,14 +79,15 @@ const VerseOfDay = () => { invalidateVerses(); }; - const sortedVerses = data?.verses - ? [...data.verses].sort( - (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(), - ) - : []; + const handleToggleSort = () => { + setSortOrder((prev) => (prev === "desc" ? "asc" : "desc")); + if (currentPage !== 1) setCurrentPage(1); + }; + + const verses = data?.verses ?? []; - const totalPages = - sortedVerses.length > 0 ? Math.ceil(sortedVerses.length / PAGE_SIZE) : 1; + const total = data?.total ?? 0; + const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE)); return (
@@ -109,7 +121,7 @@ const VerseOfDay = () => {

Failed to load verses. {getApiErrorMessage(error)}

- ) : sortedVerses.length === 0 && !isLoading ? ( + ) : verses.length === 0 && !isLoading ? (

No verses found

+ Group Actions @@ -52,7 +71,7 @@ const VerseOfDayList = ({ onEdit, onDelete }: VerseOfDayListProps) => { - {sortedVerses.map((verse) => ( + {verses.map((verse) => (

diff --git a/src/components/routes/verse-of-day/api/verseOfDayApi.ts b/src/components/routes/verse-of-day/api/verseOfDayApi.ts index c3f1039..34a166b 100644 --- a/src/components/routes/verse-of-day/api/verseOfDayApi.ts +++ b/src/components/routes/verse-of-day/api/verseOfDayApi.ts @@ -61,16 +61,33 @@ const getAuthHeaders = () => ({ Authorization: `Bearer ${sessionStorage.getItem("accessToken")}`, }); -export const fetchVerseOfDayList = - async (): Promise => { - const { data } = await axiosInstance.get( - `/api/v1/cms/verse-of-day`, - { - headers: getAuthHeaders(), +export type SortOrder = "asc" | "desc"; + +export type FetchVerseOfDayParams = { + page?: number; + limit?: number; + search?: string; + sortOrder?: SortOrder; +}; + +export const fetchVerseOfDayList = async ( + params: FetchVerseOfDayParams = {}, +): Promise => { + const { page = 1, limit = 10, search = "", sortOrder = "desc" } = params; + const { data } = await axiosInstance.get( + `/api/v1/cms/verse-of-day`, + { + headers: getAuthHeaders(), + params: { + skip: (page - 1) * limit, + limit, + sort_order: sortOrder, + ...(search.trim() && { search: search.trim() }), }, - ); - return data; - }; + }, + ); + return data; +}; export const createVerseOfDay = async ( payload: VerseOfDayPayload, From 4a75d03dda3913e6a688cad9d64507c9883f74c7 Mon Sep 17 00:00:00 2001 From: Tech-lo Date: Mon, 13 Jul 2026 16:17:59 +0545 Subject: [PATCH 2/2] lint --- .../ChinaRestrictionsPage.tsx | 10 +---- .../routes/dashboard/dashboardTableUi.tsx | 4 +- .../routes/groups/GroupAboutEditPage.tsx | 8 +--- .../routes/groups/GroupAboutPage.tsx | 5 +-- src/components/routes/groups/GroupLayout.tsx | 5 ++- .../routes/groups/GroupMembersPage.tsx | 4 +- src/components/routes/groups/GroupsList.tsx | 6 ++- .../components/GroupAccumulatorsPanel.tsx | 41 +++++++++++++------ .../components/GroupTitleWithAvatar.tsx | 11 ++--- .../series-details/SeriesDetailsPage.test.tsx | 5 ++- .../series-details/SeriesDetailsPage.tsx | 7 +++- .../series-details/seriesDetailsUrlState.ts | 3 +- src/components/routes/tags/TagsTable.tsx | 2 +- .../modals/day-create/DayCreateDialog.tsx | 3 +- 14 files changed, 65 insertions(+), 49 deletions(-) diff --git a/src/components/routes/china-restrictions/ChinaRestrictionsPage.tsx b/src/components/routes/china-restrictions/ChinaRestrictionsPage.tsx index 4930591..91c5ef5 100644 --- a/src/components/routes/china-restrictions/ChinaRestrictionsPage.tsx +++ b/src/components/routes/china-restrictions/ChinaRestrictionsPage.tsx @@ -6,17 +6,11 @@ import { format } from "date-fns"; import { Navigate } from "react-router-dom"; import { Pecha } from "@/components/ui/shadimport"; import { Button } from "@/components/ui/atoms/button"; -import { - DialogDescription, - DialogFooter, -} from "@/components/ui/atoms/dialog"; +import { DialogDescription, DialogFooter } from "@/components/ui/atoms/dialog"; import { Pagination } from "@/components/ui/molecules/pagination/Pagination"; import { getApiErrorMessage } from "@/lib/apiErrors"; import { useUserInfo } from "@/hooks/useUserInfo"; -import { - canAccessAdminAuthors, - isSuperAdmin, -} from "@/lib/platformAccess"; +import { canAccessAdminAuthors, isSuperAdmin } from "@/lib/platformAccess"; import { ROUTES } from "@/routes/paths"; import { createChinaRestrictedItem, diff --git a/src/components/routes/dashboard/dashboardTableUi.tsx b/src/components/routes/dashboard/dashboardTableUi.tsx index 9774c7e..fa18fcf 100644 --- a/src/components/routes/dashboard/dashboardTableUi.tsx +++ b/src/components/routes/dashboard/dashboardTableUi.tsx @@ -70,7 +70,5 @@ export function statusChip(status: string) { } export function languageChip(code: DashboardLanguageCode) { - return ( - {languageChipLabel(code)} - ); + return {languageChipLabel(code)}; } diff --git a/src/components/routes/groups/GroupAboutEditPage.tsx b/src/components/routes/groups/GroupAboutEditPage.tsx index be72b2f..999d930 100644 --- a/src/components/routes/groups/GroupAboutEditPage.tsx +++ b/src/components/routes/groups/GroupAboutEditPage.tsx @@ -40,12 +40,8 @@ type AssociationBaselines = { }; const GroupAboutEditPage = () => { - const { - group, - groupId, - myRole, - readOnlyPlatform, - } = useOutletContext(); + const { group, groupId, myRole, readOnlyPlatform } = + useOutletContext(); const queryClient = useQueryClient(); const hydratedRef = useRef(null); diff --git a/src/components/routes/groups/GroupAboutPage.tsx b/src/components/routes/groups/GroupAboutPage.tsx index 0a1ad52..5ded2a4 100644 --- a/src/components/routes/groups/GroupAboutPage.tsx +++ b/src/components/routes/groups/GroupAboutPage.tsx @@ -4,10 +4,7 @@ import { Pecha } from "@/components/ui/shadimport"; import { Button } from "@/components/ui/atoms/button"; import type { LanguageCode } from "@/schema/SeriesSchema"; import { ROUTES } from "@/routes/paths"; -import { - languageLabelForCode, - resolveGroupBannerUrl, -} from "./api/groupsApi"; +import { languageLabelForCode, resolveGroupBannerUrl } from "./api/groupsApi"; import { canEditGroupSettings } from "./lib/groupPermissions"; import { GroupDetailCard } from "./components/GroupSection"; import type { GroupOutletContext } from "./GroupLayout"; diff --git a/src/components/routes/groups/GroupLayout.tsx b/src/components/routes/groups/GroupLayout.tsx index cfc215a..8f3dc8a 100644 --- a/src/components/routes/groups/GroupLayout.tsx +++ b/src/components/routes/groups/GroupLayout.tsx @@ -216,7 +216,10 @@ const GroupLayout = () => {

- + Delete group? diff --git a/src/components/routes/groups/GroupMembersPage.tsx b/src/components/routes/groups/GroupMembersPage.tsx index 65d161b..075a847 100644 --- a/src/components/routes/groups/GroupMembersPage.tsx +++ b/src/components/routes/groups/GroupMembersPage.tsx @@ -5,9 +5,7 @@ import type { GroupOutletContext } from "./GroupLayout"; const GroupMembersPage = () => { const { group, groupId } = useOutletContext(); - return ( - - ); + return ; }; export default GroupMembersPage; diff --git a/src/components/routes/groups/GroupsList.tsx b/src/components/routes/groups/GroupsList.tsx index ba2fbf7..0136f20 100644 --- a/src/components/routes/groups/GroupsList.tsx +++ b/src/components/routes/groups/GroupsList.tsx @@ -1,5 +1,9 @@ import { useNavigate } from "react-router-dom"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/atoms/avatar"; +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@/components/ui/atoms/avatar"; import { ROUTES } from "@/routes/paths"; import { groupTypeLabel, diff --git a/src/components/routes/groups/components/GroupAccumulatorsPanel.tsx b/src/components/routes/groups/components/GroupAccumulatorsPanel.tsx index 7c4f640..6b4f951 100644 --- a/src/components/routes/groups/components/GroupAccumulatorsPanel.tsx +++ b/src/components/routes/groups/components/GroupAccumulatorsPanel.tsx @@ -87,10 +87,9 @@ const GroupAccumulatorsPanel = ({ const platformReadOnly = isReviewer(userInfo?.platform_role); const canCreate = !platformReadOnly && groupRole != null && groupRole !== "VIEWER"; - const canManage = !platformReadOnly && canChangeContentStatus( - groupRole, - userInfo?.platform_role, - ); + const canManage = + !platformReadOnly && + canChangeContentStatus(groupRole, userInfo?.platform_role); const [dialogOpen, setDialogOpen] = useState(false); const [editing, setEditing] = useState(null); @@ -122,7 +121,9 @@ const GroupAccumulatorsPanel = ({ let cancelled = false; searchAccumulatorPresets({ limit: 100 }).then((result) => { if (cancelled) return; - const match = result.items.find((preset) => preset.id === form.preset?.id); + const match = result.items.find( + (preset) => preset.id === form.preset?.id, + ); if (match) { setForm((prev) => ({ ...prev, preset: match })); } @@ -318,8 +319,12 @@ const GroupAccumulatorsPanel = ({ ? accumulator.target_count.toLocaleString() : "—"} - Start: {formatAccumulatorDate(accumulator.start_date)} - End: {formatAccumulatorDate(accumulator.end_date)} + + Start: {formatAccumulatorDate(accumulator.start_date)} + + + End: {formatAccumulatorDate(accumulator.end_date)} + Joined:{" "} {accumulator.member_count != null @@ -401,7 +406,10 @@ const GroupAccumulatorsPanel = ({

Start date

- + - + Delete accumulator? This will remove “ - {deleteTarget?.title?.trim() || "Untitled accumulator"}” from - the group. This action cannot be undone. + {deleteTarget?.title?.trim() || "Untitled accumulator"}” + from the group. This action cannot be undone. diff --git a/src/components/routes/groups/components/GroupTitleWithAvatar.tsx b/src/components/routes/groups/components/GroupTitleWithAvatar.tsx index cc20733..f626770 100644 --- a/src/components/routes/groups/components/GroupTitleWithAvatar.tsx +++ b/src/components/routes/groups/components/GroupTitleWithAvatar.tsx @@ -1,4 +1,8 @@ -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/atoms/avatar"; +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@/components/ui/atoms/avatar"; import { cn } from "@/lib/utils"; type GroupTitleWithAvatarProps = { @@ -23,12 +27,9 @@ const GroupTitleWithAvatar = ({ }: GroupTitleWithAvatarProps) => { return (
- - - {title.charAt(0)} - + {title.charAt(0)} {title}
diff --git a/src/components/routes/series-details/SeriesDetailsPage.test.tsx b/src/components/routes/series-details/SeriesDetailsPage.test.tsx index c0123b4..4ec2fd4 100644 --- a/src/components/routes/series-details/SeriesDetailsPage.test.tsx +++ b/src/components/routes/series-details/SeriesDetailsPage.test.tsx @@ -167,7 +167,10 @@ describe("SeriesDetailsPage", () => { it("updates URL params when selecting a language tab", async () => { const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false }, mutations: { retry: false } }, + defaultOptions: { + queries: { retry: false }, + mutations: { retry: false }, + }, }); render( diff --git a/src/components/routes/series-details/SeriesDetailsPage.tsx b/src/components/routes/series-details/SeriesDetailsPage.tsx index ee2d990..cb4c5c3 100644 --- a/src/components/routes/series-details/SeriesDetailsPage.tsx +++ b/src/components/routes/series-details/SeriesDetailsPage.tsx @@ -1,5 +1,10 @@ import { useCallback, useEffect, useMemo, useState } from "react"; -import { Link, useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { + Link, + useNavigate, + useParams, + useSearchParams, +} from "react-router-dom"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { IoMdArrowBack } from "react-icons/io"; import { toast } from "sonner"; diff --git a/src/components/routes/series-details/seriesDetailsUrlState.ts b/src/components/routes/series-details/seriesDetailsUrlState.ts index 4314d50..31dffa0 100644 --- a/src/components/routes/series-details/seriesDetailsUrlState.ts +++ b/src/components/routes/series-details/seriesDetailsUrlState.ts @@ -7,7 +7,8 @@ export function parseSeriesLanguageParam( searchParams: URLSearchParams, ): LanguageCode { return ( - normalizeLanguageCode(searchParams.get("language") ?? "") ?? DEFAULT_LANGUAGE + normalizeLanguageCode(searchParams.get("language") ?? "") ?? + DEFAULT_LANGUAGE ); } diff --git a/src/components/routes/tags/TagsTable.tsx b/src/components/routes/tags/TagsTable.tsx index c847779..fb321c8 100644 --- a/src/components/routes/tags/TagsTable.tsx +++ b/src/components/routes/tags/TagsTable.tsx @@ -68,7 +68,7 @@ const TagsTable = ({ )}
- + {tag.plan_ids.length} {showActionsColumn ? ( diff --git a/src/components/ui/molecules/modals/day-create/DayCreateDialog.tsx b/src/components/ui/molecules/modals/day-create/DayCreateDialog.tsx index 78f63f6..b493f2a 100644 --- a/src/components/ui/molecules/modals/day-create/DayCreateDialog.tsx +++ b/src/components/ui/molecules/modals/day-create/DayCreateDialog.tsx @@ -277,7 +277,8 @@ const DayCreateDialog = ({ > {plan.title} - {formatPlanLanguage(plan.language)} · {plan.total_days}{" "} + {formatPlanLanguage(plan.language)} ·{" "} + {plan.total_days}{" "} {plan.total_days === 1 ? "day" : "days"}