Skip to content

naluri-admin (Frontend)

Admin panel frontend untuk Naluri.


Source Code References

Untuk Claude: Gunakan path ini untuk akses langsung ke source code.

ItemPath
Repository/Users/joko/Documents/projects/naluri-admin
Coupon Modulesrc/modules/coupon/
Focus Dashboardsrc/modules/coupon/tabs/FocusDashboard.tsx
API Queriessrc/api/queries/
API Mutationssrc/api/mutations/
Router Configsrc/router/index.tsx

Tech Stack

TechnologyVersionPurpose
React18.xUI Framework
TypeScript5.xType Safety
Vite5.xBuild Tool
TailwindCSS3.xStyling
React Query5.xData Fetching
React Router6.xRouting
React Hook Form7.xForm Management
Zod3.xValidation

Project Structure

src/
├── api/                    # API layer
│   ├── config.ts           # Axios config, query keys
│   ├── queries/            # React Query hooks (GET)
│   │   ├── coupon.ts
│   │   ├── focusDashboard.ts
│   │   └── ...
│   └── mutations/          # React Query hooks (POST/PUT/DELETE)
│       ├── coupon.ts
│       ├── focusDashboard.ts
│       └── ...
├── modules/                # Feature modules
│   ├── coupon/
│   │   ├── Coupon.tsx      # Parent layout with tabs
│   │   ├── CouponList.tsx  # Listing page
│   │   ├── tabs/           # Tab components
│   │   │   ├── Details.tsx
│   │   │   ├── FocusDashboard.tsx
│   │   │   ├── Onboarding.tsx
│   │   │   └── ...
│   │   ├── components/     # Module-specific components
│   │   └── store/          # Module state types
│   └── ...
├── services/               # Business logic services
│   └── Acl.service.ts      # Permission checking
├── constants/              # App constants
└── common/                 # Shared components

Key Modules

ModulePathDescription
Coupon/couponsCoupon & sponsor code management
Members/membersMember listing & management
Groups/groupsMember group management
Coach/coachCoach assignment

Data Flow Pattern

┌─────────────────────────────────────────────────────────────┐
│                         Component                            │
│  const { data } = useQuery(...)    // Fetch data            │
│  const mutation = useMutation(...) // Mutate data           │
└────────────────────────────────────┬────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                      api/queries/*.ts                        │
│  export const useCouponDetail = (id) => useQuery({          │
│    queryKey: ['coupon', id],                                │
│    queryFn: () => apiClient.get(`/coupon/show/${id}`)       │
│  })                                                          │
└────────────────────────────────────┬────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                      api/config.ts                           │
│  export const apiClient = axios.create({                    │
│    baseURL: import.meta.env.VITE_API_URL                    │
│  })                                                          │
└────────────────────────────────────┬────────────────────────┘


                              admin-api (backend)

Routing Structure

typescript
// Main routes
/coupons                    // Coupon list
/coupons/details            // Coupon detail (Details tab)
/coupons/coupon-member-all  // All members tab
/coupons/coupon-member-groups // Groups tab
/coupons/onboarding         // Onboarding/bloodtest tab
/coupons/focus-dashboard    // Focus Dashboard tab

Authentication & Authorization

JWT Token

  • Stored in localStorage
  • Attached to every request via Axios interceptor
  • Refresh token mechanism

Permissions (ACL)

typescript
// services/Acl.service.ts
AclService.permissionAccess(CouponPermissions.COUPON_EDIT)

// Usage in component
if (!AclService.permissionAccess(CouponPermissions.COUPON_EDIT)) {
  return <div>You have no access</div>
}

Environment Variables

VariableExampleDescription
VITE_API_URLhttp://localhost:3000admin-api URL

Module Documentation


Last updated: March 2026

Internal Documentation