Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a642a6d
Closes #425
T-kesh Jun 23, 2026
60d194e
test: add integration tests for MarketingPage community links
samjay8 Jun 24, 2026
5fcd6cc
feat: #420 Add helper for formatting key price display in XLM with co…
jotel-dev Jun 25, 2026
b6d0bc1
Merge pull request #432 from samjay8/feat/add-integration-test
Chucks1093 Jun 25, 2026
ed258cc
Merge pull request #434 from jotel-dev/#420-add-helper-for-formatting…
Chucks1093 Jun 25, 2026
56f7157
feat: add computePriceChange helper for key price percentage change
Ghadaffijr Jun 25, 2026
0c1f5e1
feat: add shortenAddress helper with first 4 + ... + last 4 formatting
pixels26 Jun 25, 2026
54ddefa
feat: resolve issues #442 #443 #444 #445
zane1502 Jun 25, 2026
31ffdba
Merge pull request #449 from zane1502/main
Chucks1093 Jun 25, 2026
f5f8f82
Closes #446, #157, #155, #437
Nanle-code Jun 25, 2026
32b332a
Merge pull request #451 from covenantalade/fix/ledger-helper-tx-toolt…
Chucks1093 Jun 25, 2026
499444b
Merge pull request #447 from pixels26/formatting-wallet-address
Chucks1093 Jun 25, 2026
bf4abb5
docs: update CONTRIBUTING.md with folder structure and conventions
Vvictor-commits Jun 25, 2026
7cfe598
fix: show creator list skeleton correctly during API request, remove …
Vvictor-commits Jun 25, 2026
91c4a21
Add formatHolderCount helper for compact holder display.
Yormee-103 Jun 25, 2026
8601408
docs: add error handling guide for React Query hooks
samjay8 Jun 25, 2026
8f6b446
Merge pull request #465 from Yormee-103/feat/438-format-holder-count
Chucks1093 Jun 26, 2026
27cb9a8
Merge pull request #466 from samjay8/feat/add-docs
Chucks1093 Jun 26, 2026
6b0f733
test: add integration test for ledgerToTimestamp (#461)
Kaycee276 Jun 26, 2026
c1fc621
feat: add generic localStorage preference helpers (#458)
Kaycee276 Jun 26, 2026
127b0e4
feat: add CreatorPageErrorBoundary for creator page render errors
T-kesh Jun 26, 2026
d21d8eb
docs: add contributor guide for adding a new page route
LaPoshBaby Jun 26, 2026
759d811
Merge pull request #436 from Ghadaffijr/feat/compute-price-change
Chucks1093 Jun 26, 2026
ce35318
Merge pull request #467 from Kaycee276/fix/461-ledger-timestamp-test
Chucks1093 Jun 26, 2026
bf3e745
Merge pull request #468 from Kaycee276/fix/458-localStorage-preferences
Chucks1093 Jun 26, 2026
d17d722
Merge pull request #469 from T-kesh/docs/env-variable-setup
Chucks1093 Jun 26, 2026
5e33a18
Merge pull request #470 from T-kesh/feat/error-boundary-component
Chucks1093 Jun 26, 2026
0af2f0a
Merge pull request #463 from Vvictor-commits/docs/update-contributing…
Chucks1093 Jun 26, 2026
fd2cc57
Merge pull request #464 from Vvictor-commits/fix/creator-list-skeleto…
Chucks1093 Jun 26, 2026
203907c
Merge pull request #472 from LaPoshBaby/docs/adding-page-routes-guide
Chucks1093 Jun 26, 2026
46a1748
test: add query key integration tests and placeholder hooks
wagmiiii Jun 26, 2026
e15579e
Merge pull request #473 from wagmiiii/test/issue-459-query-keys
Chucks1093 Jun 26, 2026
45173e1
feat: replace copied tooltip with react-hot-toast success notification
Ghadaffijr Jun 26, 2026
fe22dae
Merge pull request #474 from Ghadaffijr/feat/copy-address-toast
Chucks1093 Jun 26, 2026
d5b09ba
test: add integration tests for empty state on zero-result creator se…
DammyAji Jun 26, 2026
2f95e19
Merge pull request #475 from DammyAji/feat/add-empty-state-integratio…
Chucks1093 Jun 26, 2026
e3c60bb
address creator list stability and filter coverage
BigDella Jun 27, 2026
d6ecf7d
Merge pull request #497 from BigDella/codex/creator-list-issues-492-495
Chucks1093 Jun 27, 2026
344e8f5
feat: add useDebounce hook, integration tests, and state management docs
Chidimj Jun 27, 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
35 changes: 23 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,22 +1,33 @@
VITE_BACKEND_URL=/api
# UTM settings for shared profile links (optional)
# Set any of these to enable UTM parameters on shared profile URLs.
VITE_UTM_SOURCE=twitter
VITE_UTM_MEDIUM=social
VITE_UTM_CAMPAIGN=share_profile
#VITE_UTM_TERM=
#VITE_UTM_CONTENT=
# Access Layer Client — environment variables
# Copy this file to `.env` and adjust values as needed:
# cp .env.example .env
# All client-exposed variables must be prefixed with VITE_ (see https://vitejs.dev/guide/env-and-mode).
# See CONTRIBUTING.md ("Environment variables") for which vars are required vs optional.

# --- Required (sensible defaults provided) ---

# Base URL for the backend API. Use the local backend during development.
VITE_BACKEND_URL=http://localhost:3000/api/v1

# Chain ID selected by default on load. 84532 = Base Sepolia testnet.
VITE_DEFAULT_CHAIN_ID=84532

# RPC URL for a local Anvil node (chain 31337). Used when developing against a local chain.
VITE_ANVIL_RPC_URL=http://127.0.0.1:8545

# RPC URL for the Base Sepolia testnet (chain 84532). The public default works out of the box.
VITE_BASE_SEPOLIA_RPC_URL=https://sepolia.base.org

# --- Optional ---

# RPC URL for the Ethereum Sepolia testnet (chain 11155111). Get one from Alchemy, Infura, or another provider.
VITE_SEPOLIA_RPC_URL=

# RPC URL for Ethereum mainnet (chain 1). Only needed when testing against mainnet.
VITE_MAINNET_RPC_URL=

# UTM settings for shared profile links (optional)
# Set any of these to enable UTM parameters on shared profile URLs.
# Remove or comment out to disable UTM tracking.
# Example configuration:
# UTM parameters appended to shared profile links (optional).
# Set any of these to enable UTM tracking; remove or leave blank to disable.
VITE_UTM_SOURCE=accesslayer
VITE_UTM_MEDIUM=share
VITE_UTM_CAMPAIGN=profile-sharing
Expand Down
79 changes: 78 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ Thanks for contributing to the frontend for Access Layer, a Stellar-native creat
## Local setup

1. Install Node.js 20+ and `pnpm`.
2. Copy `.env.example` to `.env` and add any local values you need.
2. Copy `.env.example` to `.env` and adjust values as needed (see [Environment variables](#environment-variables)):

```bash
cp .env.example .env
```

3. Install dependencies:

```bash
Expand All @@ -25,6 +30,41 @@ pnpm install
pnpm dev
```

## Environment variables

All client-exposed variables are prefixed with `VITE_` so Vite can expose them to the
browser. The defaults in `.env.example` are enough to run the client locally — you only
need to fill in optional values for the networks you actually want to test against.
Validation lives in [`src/utils/env.utils.ts`](./src/utils/env.utils.ts).

### Required (defaults provided)

| Variable | Description |
| --- | --- |
| `VITE_BACKEND_URL` | Base URL for the backend API. Point this at your local backend during development (e.g. `http://localhost:3000/api/v1`). |
| `VITE_DEFAULT_CHAIN_ID` | Chain ID selected by default on load. `84532` is Base Sepolia, the recommended testnet. |
| `VITE_ANVIL_RPC_URL` | RPC URL for a local [Anvil](https://book.getfoundry.sh/anvil/) node (chain `31337`), used when developing against a local chain. |
| `VITE_BASE_SEPOLIA_RPC_URL` | RPC URL for the Base Sepolia testnet (chain `84532`). The public default `https://sepolia.base.org` works without an account. |

### Optional

| Variable | Description |
| --- | --- |
| `VITE_SEPOLIA_RPC_URL` | RPC URL for the Ethereum Sepolia testnet (chain `11155111`). Only needed when testing on Sepolia. |
| `VITE_MAINNET_RPC_URL` | RPC URL for Ethereum mainnet (chain `1`). Only needed when testing against mainnet. |
| `VITE_UTM_SOURCE`, `VITE_UTM_MEDIUM`, `VITE_UTM_CAMPAIGN`, `VITE_UTM_TERM`, `VITE_UTM_CONTENT` | UTM parameters appended to shared profile links. Leave blank to disable UTM tracking. |

### Where to get testnet RPC URLs

- **Base Sepolia** — the public endpoint `https://sepolia.base.org` is preconfigured and
needs no account. For higher rate limits, create a free Base Sepolia endpoint at
[Alchemy](https://www.alchemy.com/) or [Infura](https://www.infura.io/).
- **Ethereum Sepolia** — create a free Sepolia endpoint at
[Alchemy](https://www.alchemy.com/) or [Infura](https://www.infura.io/), or use a public
endpoint from [Chainlist](https://chainlist.org/?testnets=true&search=sepolia).
- **Local Anvil** — no URL to fetch; run `anvil` from [Foundry](https://book.getfoundry.sh/)
and it serves the default `http://127.0.0.1:8545`.

## Verification commands

Run these before opening a pull request:
Expand All @@ -51,6 +91,43 @@ The repository also uses Husky plus `lint-staged` to run lightweight checks on s
- Do not reintroduce old template-era pages or branding.
- Prefer accessible, keyboard-friendly UI behavior.
- Keep new routes focused and incremental until the main marketplace flows land.
- See [docs/adding-page-routes.md](./docs/adding-page-routes.md) for how to register a new page, the file naming convention, and the recommended pattern for auth-protected routes.

### Folder structure

- `pages/`: Route-level components (each file maps to a route)
- `components/`: Reusable UI components and shared component logic
- `components/common/`: Application-specific reusable components
- `components/ui/`: Low-level UI primitives (from shadcn/ui or similar)
- `components/home/`: Home/landing-page specific components
- `hooks/`: Custom React hooks
- `utils/` or `lib/`: Pure helper functions and utilities
- `constants/`: Application constants
- `contracts/`: Web3 contract ABIs and related logic
- `assets/`: Static assets (images, icons, etc.)

### Naming conventions

- **Components**: PascalCase (e.g., `CreatorCard.tsx`, `ConnectWalletButton.tsx`)
- **Hooks**: camelCase, prefixed with `use` (e.g., `useCopySuccessAnnouncement.ts`, `useNetworkMismatch.ts`)
- **Utilities/helpers**: camelCase (e.g., `formatNumber.ts`)
- **Constants**: UPPER_SNAKE_CASE (e.g., `MAX_KEY_SUPPLY`)

### Components vs pages: decision guide

Use `pages/` when:
- The component is a top-level route or page entry point
- It represents a distinct URL path in the application

Use `components/` when:
- The component is reusable across multiple pages or routes
- It's a self-contained UI piece with a single responsibility
- It can be tested independently of route context

Keep components co-located in a page file only when:
- They are used exclusively within that single page
- They are small, helper components that don't make sense outside the page context
- Extracting them would add unnecessary indirection

## Good first issue guidance

Expand Down
Loading
Loading