Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e6981c4
fix: add load more button to dashboard campaign lists
TheShnider Jul 3, 2026
77ace41
style: apply Prettier formatting fixes
TheShnider Jul 3, 2026
15f6cd2
feat(middleware): add maintenance mode gate with i18n allowlist bypass
TheShnider Jul 3, 2026
9249b86
fix: resolve e2e hydration mismatch and missing translation strings
TheShnider Jul 3, 2026
4001f1b
style(footer): apply Prettier formatting
TheShnider Jul 3, 2026
ae2d9e0
Merge branch 'main' into fix/dashboard-load-more
TheShnider Jul 6, 2026
922909f
Fixed Issue
TheShnider Jul 6, 2026
659816a
Merge branch 'fix/dashboard-load-more' of https://github.com/TheShnid…
TheShnider Jul 6, 2026
8066337
fix(causes): guard category chips during loading/error states
TheShnider Jul 6, 2026
1899cc7
fix(causes): guard category chips during loading/error states
TheShnider Jul 6, 2026
8b3cbdb
fix: resolve issues #605 #606 #607 #611
Mrwicks00 Jun 30, 2026
25b5ec3
feat: resolve issues #651, #668, #601 from upstream
patopatrish Jun 30, 2026
c50577b
chore: update package-lock.json for storybook dependencies
patopatrish Jun 30, 2026
6352aa8
fix: correct DonationModal story props and format CI-flagged files
patopatrish Jul 2, 2026
14db295
fix: resolve high-severity @babel/core vulnerability from storybook deps
patopatrish Jul 2, 2026
863e79c
fix: resolve wallet state synchronization when externally disconnected
JemimahEkong Jun 30, 2026
0871049
fix: filter invalid coords before map render and add MapErrorBoundary
JemimahEkong Jun 30, 2026
9815f72
fix: address lint and prettier issues in wallet sync changes
JemimahEkong Jun 30, 2026
694c25d
fix: apply prettier formatting to map-related files
JemimahEkong Jun 30, 2026
52190f7
fix: replace click-based navigation with direct goto, remove unreliab…
JemimahEkong Jul 3, 2026
ff02719
fix(donation): prevent race condition and campaign overfunding in Don…
spartan124 Jun 30, 2026
31844e9
style: format and resolve ESLint warnings in DonationModal
spartan124 Jun 30, 2026
0d65183
fix(causes): guard category chips during loading/error states
TheShnider Jul 6, 2026
104a639
Merge branch 'fix/dashboard-load-more' of https://github.com/TheShnid…
TheShnider Jul 7, 2026
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
19 changes: 13 additions & 6 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"fundingHistory": "Funding/Donation History",
"noFundingHistory": "No funding/donation activity yet.",
"donated": "Donated {amount} XLM on {date}",
"campaignFallback": "Campaign #{id}"
"campaignFallback": "Campaign #{id}",
"loadMore": "Load more"
},
"MyContributions": {
"title": "My Contributions",
Expand Down Expand Up @@ -88,7 +89,15 @@
"donatedSuccess": "{amount} XLM donated successfully",
"thankYou": "Thank you for supporting this cause.",
"viewExplorer": "View on Stellar Explorer →",
"close": "Close"
"close": "Close",
"closeAriaLabel": "Close",
"amountPlaceholder": "e.g. 10",
"scientificNotation": "Scientific notation is not allowed.",
"invalidNumber": "Please enter a valid number.",
"invalidAmount": "Please enter a valid amount.",
"amountMustBePositive": "Amount must be greater than zero.",
"invalidNumberFormat": "Invalid number format.",
"maxDecimalPlaces": "Maximum 7 decimal places allowed."
},
"Admin": {
"title": "Admin Moderation",
Expand Down Expand Up @@ -433,10 +442,8 @@
"votesOfQuorum": "{current} of {quorum} votes",
"approvalThreshold": "Approval threshold",
"approvalOfThreshold": "{current}% of {threshold}%",
"needMoreVotes_one": "Need {count} more vote to reach quorum.",
"needMoreVotes_other": "Need {count} more votes to reach quorum.",
"needMoreApproval_one": "Need {count} more approval point to reach the approval threshold.",
"needMoreApproval_other": "Need {count} more approval points to reach the approval threshold.",
"needMoreVotes": "Need {count, plural, =1 {# more vote} other {# more votes}} to reach quorum.",
"needMoreApproval": "Need {count, plural, =1 {# more approval point} other {# more approval points}} to reach the approval threshold.",
"quorumReached": "Quorum and approval threshold reached. Anyone can finalize verification.",
"connectWalletPrompt": "Connect your wallet to vote on this cause",
"tokenHoldersOnlyPrompt": "Only governance token holders can vote on causes",
Expand Down
19 changes: 13 additions & 6 deletions messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"fundingHistory": "Historial de Financiación/Donaciones",
"noFundingHistory": "Aún no hay actividad de financiación/donación.",
"donated": "Donó {amount} XLM el {date}",
"campaignFallback": "Campaña #{id}"
"campaignFallback": "Campaña #{id}",
"loadMore": "Cargar más"
},
"MyContributions": {
"title": "Mis Contribuciones",
Expand Down Expand Up @@ -88,7 +89,15 @@
"donatedSuccess": "{amount} XLM donados correctamente",
"thankYou": "Gracias por apoyar esta causa.",
"viewExplorer": "Ver en Stellar Explorer →",
"close": "Cerrar"
"close": "Cerrar",
"closeAriaLabel": "Cerrar",
"amountPlaceholder": "ej. 10",
"scientificNotation": "No se permite la notación científica.",
"invalidNumber": "Por favor, ingresa un número válido.",
"invalidAmount": "Por favor, ingresa un monto válido.",
"amountMustBePositive": "El monto debe ser mayor que cero.",
"invalidNumberFormat": "Formato de número inválido.",
"maxDecimalPlaces": "Se permiten máximo 7 decimales."
},
"Admin": {
"title": "Moderación Administrativa",
Expand Down Expand Up @@ -433,10 +442,8 @@
"votesOfQuorum": "{current} de {quorum} votos",
"approvalThreshold": "Umbral de aprobación",
"approvalOfThreshold": "{current}% de {threshold}%",
"needMoreVotes_one": "Se necesita {count} voto más para alcanzar el quórum.",
"needMoreVotes_other": "Se necesitan {count} votos más para alcanzar el quórum.",
"needMoreApproval_one": "Se necesita {count} punto de aprobación más para alcanzar el umbral.",
"needMoreApproval_other": "Se necesitan {count} puntos de aprobación más para alcanzar el umbral.",
"needMoreVotes": "Se {count, plural, =1 {necesita # voto más} other {necesitan # votos más}} para alcanzar el quórum.",
"needMoreApproval": "Se {count, plural, =1 {necesita # punto de aprobación más} other {necesitan # puntos de aprobación más}} para alcanzar el umbral.",
"quorumReached": "Quórum y umbral de aprobación alcanzados. Cualquiera puede finalizar la verificación.",
"connectWalletPrompt": "Conecta tu wallet para votar en esta causa",
"tokenHoldersOnlyPrompt": "Solo los poseedores de tokens de gobernanza pueden votar en causas",
Expand Down
3 changes: 3 additions & 0 deletions src/app/[locale]/causes/[id]/CauseDetailClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
const EditCampaignMetadata = dynamic(() => import("@/components/EditCampaignMetadata"), {
ssr: false,
});
=======

Check failure on line 51 in src/app/[locale]/causes/[id]/CauseDetailClient.tsx

View workflow job for this annotation

GitHub Actions / TypeScript type-check

Merge conflict marker encountered.
import { getLocalizedDescription } from "@/utils/localizedDescription";
>>>>>>> a758690 (fix: resolve issues #605 #606 #607 #611)

Check failure on line 53 in src/app/[locale]/causes/[id]/CauseDetailClient.tsx

View workflow job for this annotation

GitHub Actions / TypeScript type-check

Merge conflict marker encountered.

export default function CauseDetailClient({ id }: { id: string }) {
const { publicKey: userWalletAddress } = useWallet();
Expand Down
44 changes: 31 additions & 13 deletions src/app/[locale]/dashboard/DashboardClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import Link from "next/link";
import { useTranslations } from "next-intl";
import React, { useMemo } from "react";
import React, { useMemo, useState } from "react";
import MyContributionsSection from "@/components/MyContributionsSection";
import MultiSigWithdrawalPanel from "@/components/MultiSigWithdrawalPanel";
import { Spinner, DashboardSkeleton } from "@/components/Skeleton";
Expand All @@ -25,6 +25,12 @@ export default function DashboardPage() {
const balanceError = balanceQueryError ? t("balanceFetchError") : null;
const { savedIds } = useSavedCampaigns();

const [visibleSavedCount, setVisibleSavedCount] = useState(5);
const [visibleSubmittedCount, setVisibleSubmittedCount] = useState(5);

const handleLoadMoreSaved = () => setVisibleSavedCount((prev) => prev + 5);
const handleLoadMoreSubmitted = () => setVisibleSubmittedCount((prev) => prev + 5);

const savedCampaigns = useMemo(
() => campaigns.filter((c) => savedIds.includes(c.id)),
[campaigns, savedIds],
Expand Down Expand Up @@ -107,19 +113,31 @@ export default function DashboardPage() {
You haven't saved any campaigns yet.
</span>
) : (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{savedCampaigns.map((campaign) => (
<Link
key={campaign.id}
href={`/causes/${campaign.id}`}
className="border rounded-xl p-4 bg-zinc-50 dark:bg-zinc-900 hover:border-blue-300 dark:hover:border-blue-700 transition-colors"
<div className="flex flex-col gap-4">
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{savedCampaigns.slice(0, visibleSavedCount).map((campaign) => (
<Link
key={campaign.id}
href={`/causes/${campaign.id}`}
className="border rounded-xl p-4 bg-zinc-50 dark:bg-zinc-900 hover:border-blue-300 dark:hover:border-blue-700 transition-colors"
>
<div className="font-medium text-zinc-900 dark:text-zinc-50">
{campaign.title}
</div>
<div className="text-sm text-zinc-500 dark:text-zinc-400 mt-1 line-clamp-2 break-words">
{campaign.description}
</div>
</Link>
))}
</div>
{visibleSavedCount < savedCampaigns.length && (
<button
onClick={handleLoadMoreSaved}
className="self-center px-4 py-2 border rounded-full text-sm font-medium hover:bg-zinc-100 dark:hover:bg-zinc-800 transition"
>
<div className="font-medium text-zinc-900 dark:text-zinc-50">{campaign.title}</div>
<div className="text-sm text-zinc-500 dark:text-zinc-400 mt-1 line-clamp-2 break-words">
{campaign.description}
</div>
</Link>
))}
{t("loadMore")}
</button>
)}
</div>
)}
</section>
Expand Down
4 changes: 2 additions & 2 deletions src/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export default function Footer() {
<p>{t("rights", { year })}</p>
<p className="flex items-center gap-3">
<span>{t("builtWith")}</span>
<div className="flex items-center gap-1.5">
<span className="flex items-center gap-1.5">
{process.env.NEXT_PUBLIC_APP_VERSION && (
<span
className="rounded bg-zinc-100 px-1.5 py-0.5 font-mono text-[10px] uppercase font-bold text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400"
Expand All @@ -136,7 +136,7 @@ export default function Footer() {
{isMismatch && <AlertTriangle size={10} />}c{version}
</span>
)}
</div>
</span>
</p>
</div>
</div>
Expand Down
Loading