feat: integrate dimentorin pages with real API, convert modals to pages

Roadmap: integrated with /v1/landing/cms/roadmap API (was dummy data)
- Created roadmap service layer (types, API, hooks)
- List page with search/filter, create/edit as dedicated pages

Session: converted modal detail to dedicated /session-dimentorin/$id page
Users: converted modal detail/delete to dedicated /users-dimentorin/$id page

Deleted all dimentorin modal components (roadmap, session, users).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
maulanasdqn
2026-04-11 22:19:06 +07:00
co-authored by Claude Opus 4.6
parent 8749e83dad
commit b2ed098067
23 changed files with 968 additions and 766 deletions
+1
View File
@@ -12,6 +12,7 @@ export * from './permissions';
export * from './events';
export * from './testimonials';
export * from './sessions';
export * from './roadmap';
export interface ApiResponse<T> {
data: T;
+22
View File
@@ -0,0 +1,22 @@
import { api, ApiResponse } from '../index';
import type { TRoadmapListItem, TRoadmapDetailItem, TRoadmapCreateRequest, TRoadmapUpdateRequest } from '../../types/roadmap';
export const getRoadmapList = async (): Promise<TRoadmapListItem[]> => {
const response = await api.get<ApiResponse<TRoadmapListItem[]>>('/v1/landing/cms/roadmap');
return response.data.data;
};
export const createRoadmap = async (data: TRoadmapCreateRequest): Promise<TRoadmapDetailItem> => {
const response = await api.post<ApiResponse<TRoadmapDetailItem>>('/v1/landing/cms/roadmap/create', data);
return response.data.data;
};
export const updateRoadmap = async (id: string, data: TRoadmapUpdateRequest): Promise<TRoadmapDetailItem> => {
const response = await api.patch<ApiResponse<TRoadmapDetailItem>>(`/v1/landing/cms/roadmap/update/${id}`, data);
return response.data.data;
};
export const deleteRoadmap = async (id: string): Promise<{ message: string }> => {
const response = await api.delete<{ message: string }>(`/v1/landing/cms/roadmap/delete/${id}`);
return response.data;
};
+1
View File
@@ -12,3 +12,4 @@ export * from './permissions';
export * from './events';
export * from './testimonials';
export * from './sessions';
export * from './roadmap';
+44
View File
@@ -0,0 +1,44 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import {
getRoadmapList,
createRoadmap,
updateRoadmap,
deleteRoadmap,
} from '../../api/roadmap';
import type { TRoadmapCreateRequest, TRoadmapUpdateRequest } from '../../types/roadmap';
export const roadmapKeys = {
all: ['roadmap'] as const,
list: () => [...roadmapKeys.all, 'list'] as const,
};
export const useRoadmapList = () => {
return useQuery({
queryKey: roadmapKeys.list(),
queryFn: () => getRoadmapList(),
});
};
export const useCreateRoadmap = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: TRoadmapCreateRequest) => createRoadmap(data),
onSuccess: () => queryClient.invalidateQueries({ queryKey: roadmapKeys.list() }),
});
};
export const useUpdateRoadmap = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: TRoadmapUpdateRequest }) => updateRoadmap(id, data),
onSuccess: () => queryClient.invalidateQueries({ queryKey: roadmapKeys.list() }),
});
};
export const useDeleteRoadmap = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => deleteRoadmap(id),
onSuccess: () => queryClient.invalidateQueries({ queryKey: roadmapKeys.list() }),
});
};
+1
View File
@@ -9,3 +9,4 @@ export * from './admin';
export * from './events';
export * from './testimonials';
export * from './sessions';
export * from './roadmap';
+30
View File
@@ -0,0 +1,30 @@
export type TRoadmapStatus = 'upcoming' | 'in_progress' | 'completed';
export type TRoadmapListItem = {
id: string;
title: string;
description: string;
status: TRoadmapStatus;
votes: number;
created_at: string;
updated_at: string;
is_deleted: boolean;
};
export type TRoadmapDetailItem = {
id: string;
title: string;
description: string;
status: TRoadmapStatus;
votes: number;
created_at: string;
updated_at: string;
};
export type TRoadmapCreateRequest = {
title: string;
description: string;
status: TRoadmapStatus;
};
export type TRoadmapUpdateRequest = TRoadmapCreateRequest;