@greatapps/common 1.1.492 → 1.1.495

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/components/layouts/AppNavBar.mjs +4 -8
  2. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  3. package/dist/components/layouts/NavBar.mjs +8 -7
  4. package/dist/components/layouts/NavBar.mjs.map +1 -1
  5. package/dist/components/navigation/ProjectSelectorPopover.mjs +0 -1
  6. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  7. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +10 -11
  8. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  9. package/dist/index.mjs +22 -0
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/modules/projects/actions/create-project.action.mjs +10 -0
  12. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -0
  13. package/dist/modules/projects/actions/delete-project.action.mjs +10 -0
  14. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -0
  15. package/dist/modules/projects/actions/list-projects.action.mjs +10 -0
  16. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -0
  17. package/dist/modules/projects/actions/update-project.action.mjs +10 -0
  18. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -0
  19. package/dist/modules/projects/hooks/create-project.hook.mjs +20 -0
  20. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -0
  21. package/dist/modules/projects/hooks/delete-project.hook.mjs +20 -0
  22. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -0
  23. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +38 -0
  24. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -0
  25. package/dist/modules/projects/hooks/list-projects.hook.mjs +22 -0
  26. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -0
  27. package/dist/modules/projects/hooks/update-project.hook.mjs +20 -0
  28. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -0
  29. package/dist/modules/projects/services/projects.service.mjs +83 -0
  30. package/dist/modules/projects/services/projects.service.mjs.map +1 -0
  31. package/dist/modules/projects/types.mjs +15 -0
  32. package/dist/modules/projects/types.mjs.map +1 -1
  33. package/dist/server.mjs +10 -0
  34. package/dist/server.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/src/components/layouts/AppNavBar.tsx +6 -12
  37. package/src/components/layouts/NavBar.tsx +31 -28
  38. package/src/components/navigation/ProjectSelectorPopover.tsx +5 -7
  39. package/src/components/navigation/subcomponents/ProjectSelector.tsx +14 -19
  40. package/src/index.ts +18 -1
  41. package/src/modules/projects/actions/create-project.action.ts +9 -0
  42. package/src/modules/projects/actions/delete-project.action.ts +8 -0
  43. package/src/modules/projects/actions/list-projects.action.ts +16 -0
  44. package/src/modules/projects/actions/update-project.action.ts +9 -0
  45. package/src/modules/projects/hooks/create-project.hook.ts +21 -0
  46. package/src/modules/projects/hooks/delete-project.hook.ts +20 -0
  47. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +42 -0
  48. package/src/modules/projects/hooks/list-projects.hook.ts +23 -0
  49. package/src/modules/projects/hooks/update-project.hook.ts +21 -0
  50. package/src/modules/projects/services/projects.service.ts +123 -0
  51. package/src/modules/projects/types.ts +46 -0
  52. package/src/server.ts +7 -0
  53. package/dist/components/navigation/types.mjs +0 -1
  54. package/dist/components/navigation/types.mjs.map +0 -1
  55. package/src/components/navigation/types.ts +0 -6
@@ -1,21 +1,17 @@
1
1
  'use client';
2
2
 
3
- import { useState, useRef, useEffect, RefObject } from 'react';
3
+ import { useState, useRef, useEffect, useMemo, RefObject } from 'react';
4
4
  import { useMobileNavbarSheet } from '../../../store/useMobileNavbarSheet';
5
5
  import { useAppNavigationContext } from '../AppNavigationContext';
6
6
  import { ProjectSelectorPopover } from '../ProjectSelectorPopover';
7
7
  import { cn, Command, CommandEmpty, CommandInput, CommandItem, CommandList, UserAvatar, useWhitelabel } from '../../../index';
8
+ import { useInfiniteProjects } from '../../../modules/projects/hooks/list-infinite-projects.hook';
8
9
  import { IconChevronDown } from '@tabler/icons-react';
9
- import type { NavigationProject } from '../types';
10
+ import type { Project } from '../../../modules/projects/types';
10
11
 
11
12
  export interface ProjectSelectorProps {
12
- projects: NavigationProject[];
13
- selectedProject: NavigationProject | null;
14
- isLoading?: boolean;
15
- isFetchingNextPage?: boolean;
16
- hasNextPage?: boolean;
17
- onLoadMore?: () => void | Promise<unknown>;
18
- onSelectProject: (project: NavigationProject) => void;
13
+ selectedProject: Project | null;
14
+ onSelectProject: (project: Project) => void;
19
15
  onAddProject?: () => void;
20
16
  onManageProjects?: () => void;
21
17
  }
@@ -30,14 +26,8 @@ function ProjectItemSkeleton() {
30
26
  }
31
27
 
32
28
  export function ProjectSelector({
33
- projects,
34
29
  selectedProject,
35
- isLoading,
36
- isFetchingNextPage,
37
- hasNextPage,
38
- onLoadMore,
39
30
  onSelectProject,
40
- onAddProject,
41
31
  onManageProjects,
42
32
  }: ProjectSelectorProps) {
43
33
  const { whitelabel } = useWhitelabel();
@@ -47,6 +37,12 @@ export function ProjectSelector({
47
37
  const titleRef = useRef<HTMLDivElement>(null);
48
38
  const { openProjectList, clearProjectList } = useMobileNavbarSheet();
49
39
 
40
+ const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useInfiniteProjects({
41
+ sort: 'title',
42
+ limit: 100,
43
+ });
44
+ const projects = useMemo(() => data?.pages.flatMap((page) => page.data) ?? [], [data]);
45
+
50
46
  useEffect(() => {
51
47
  if (openProjectList && breakpoint === 'mobile') {
52
48
  setActiveSection('projects');
@@ -70,9 +66,8 @@ export function ProjectSelector({
70
66
  isLoading={isLoading}
71
67
  isFetchingNextPage={isFetchingNextPage}
72
68
  hasNextPage={hasNextPage}
73
- onLoadMore={onLoadMore}
69
+ onLoadMore={() => fetchNextPage()}
74
70
  onSelectProject={onSelectProject}
75
- onAddProject={onAddProject}
76
71
  onManageProjects={onManageProjects}
77
72
  >
78
73
  <div className="flex items-center gap-2 truncate select-none cursor-pointer" ref={titleRef}>
@@ -121,13 +116,13 @@ export function ProjectSelector({
121
116
  <CommandList
122
117
  className="custom-scrollbar paragraph-small-medium text-gray-600 h-[227px]"
123
118
  onScroll={(event) => {
124
- if (!hasNextPage || isFetchingNextPage || !onLoadMore) return;
119
+ if (!hasNextPage || isFetchingNextPage || !fetchNextPage) return;
125
120
 
126
121
  const target = event.currentTarget;
127
122
  const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight;
128
123
 
129
124
  if (distanceToBottom <= 80) {
130
- onLoadMore();
125
+ fetchNextPage();
131
126
  }
132
127
  }}
133
128
  >
package/src/index.ts CHANGED
@@ -26,13 +26,31 @@ export {
26
26
  LIST_ALL_ACCOUNT_USERS_QUERY_KEY,
27
27
  LIST_ALL_ACCOUNT_USERS_BASE_KEY,
28
28
  } from "./modules/projects/hooks/list-all-account-users.hook";
29
+ export {
30
+ useProjects,
31
+ PROJECTS_BASE_KEY,
32
+ PROJECTS_QUERY_KEY,
33
+ } from "./modules/projects/hooks/list-projects.hook";
34
+ export {
35
+ useInfiniteProjects,
36
+ INFINITE_PROJECTS_QUERY_KEY,
37
+ } from "./modules/projects/hooks/list-infinite-projects.hook";
38
+ export { useCreateProject } from "./modules/projects/hooks/create-project.hook";
39
+ export { useUpdateProject } from "./modules/projects/hooks/update-project.hook";
40
+ export { useDeleteProject } from "./modules/projects/hooks/delete-project.hook";
29
41
  export type {
42
+ Project,
43
+ ProjectsPage,
44
+ CreateProjectRequest,
45
+ UpdateProjectRequest,
30
46
  ProjectUser,
31
47
  AccountUser,
32
48
  AddRemoveProjectUsersParams,
33
49
  ListUsersParams,
34
50
  UsersPage,
35
51
  } from "./modules/projects/types";
52
+ export { ProjectSchema } from "./modules/projects/types";
53
+ export type { ListProjectsActionParams } from "./modules/projects/actions/list-projects.action";
36
54
  export {
37
55
  useUserQuery,
38
56
  useUserValidateSession,
@@ -192,7 +210,6 @@ export type { NavBarItemProps } from "./components/layouts/NavBarItem";
192
210
  export { AppNavigation } from "./components/navigation/AppNavigation";
193
211
  export { CancelledSubscriptionBanner } from "./components/navigation/CancelledSubscriptionBanner";
194
212
  export type { NavItemConfig } from "./components/navigation/subcomponents/NavItems";
195
- export type { NavigationProject } from "./components/navigation/types";
196
213
  export { useMobileNavbarSheet } from "./store/useMobileNavbarSheet";
197
214
 
198
215
  // Auth Query Key Utilities
@@ -0,0 +1,9 @@
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+ import type { CreateProjectRequest } from '../types';
6
+
7
+ export async function createProjectAction(data: CreateProjectRequest) {
8
+ return safeServerAction(() => projectsService.create(data));
9
+ }
@@ -0,0 +1,8 @@
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+
6
+ export async function deleteProjectAction(projectId: number, moveToProjectId: number) {
7
+ return safeServerAction(() => projectsService.delete(projectId, moveToProjectId));
8
+ }
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+
6
+ export interface ListProjectsActionParams {
7
+ page?: number;
8
+ limit?: number;
9
+ sort?: string;
10
+ search?: string;
11
+ deleted?: number;
12
+ }
13
+
14
+ export async function listProjectsAction(params?: ListProjectsActionParams) {
15
+ return safeServerAction(() => projectsService.list(params));
16
+ }
@@ -0,0 +1,9 @@
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+ import type { UpdateProjectRequest } from '../types';
6
+
7
+ export async function updateProjectAction(projectId: number, data: UpdateProjectRequest) {
8
+ return safeServerAction(() => projectsService.update(projectId, data));
9
+ }
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query';
4
+ import { createProjectAction } from '../actions/create-project.action';
5
+ import { withAction } from '../../../utils/withAction';
6
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
+ import { PROJECTS_BASE_KEY } from './list-projects.hook';
8
+ import type { CreateProjectRequest } from '../types';
9
+
10
+ export function useCreateProject() {
11
+ const queryClient = useQueryClient();
12
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
13
+
14
+ return useMutation({
15
+ mutationFn: (data: CreateProjectRequest) =>
16
+ withAction(createProjectAction)(data),
17
+ onSuccess: () => {
18
+ queryClient.invalidateQueries({ queryKey: projectsKey });
19
+ },
20
+ });
21
+ }
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query';
4
+ import { deleteProjectAction } from '../actions/delete-project.action';
5
+ import { withAction } from '../../../utils/withAction';
6
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
+ import { PROJECTS_BASE_KEY } from './list-projects.hook';
8
+
9
+ export function useDeleteProject() {
10
+ const queryClient = useQueryClient();
11
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
12
+
13
+ return useMutation({
14
+ mutationFn: ({ projectId, moveToProjectId }: { projectId: number; moveToProjectId: number }) =>
15
+ withAction(deleteProjectAction)(projectId, moveToProjectId),
16
+ onSuccess: () => {
17
+ queryClient.invalidateQueries({ queryKey: projectsKey });
18
+ },
19
+ });
20
+ }
@@ -0,0 +1,42 @@
1
+ "use client";
2
+
3
+ import { useInfiniteQuery } from "@tanstack/react-query";
4
+ import { listProjectsAction } from "../actions/list-projects.action";
5
+ import type { ListProjectsActionParams } from "../actions/list-projects.action";
6
+ import { withAction } from "../../../utils/withAction";
7
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
8
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
9
+
10
+ const PAGE_SIZE = 20;
11
+
12
+ export const INFINITE_PROJECTS_QUERY_KEY = (
13
+ params?: Omit<ListProjectsActionParams, "page">,
14
+ ) => [...PROJECTS_BASE_KEY, "infinite", params] as const;
15
+
16
+ export function useInfiniteProjects({
17
+ limit = PAGE_SIZE,
18
+ ...params
19
+ }: Omit<ListProjectsActionParams, "page">) {
20
+ const queryKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY(params)]);
21
+
22
+ return useInfiniteQuery({
23
+ queryKey,
24
+ queryFn: ({ pageParam }) =>
25
+ withAction(() =>
26
+ listProjectsAction({
27
+ ...params,
28
+ page: pageParam as number,
29
+ limit: PAGE_SIZE,
30
+ }),
31
+ )(),
32
+ initialPageParam: 1,
33
+ getNextPageParam: (lastPage, allPages) => {
34
+ const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);
35
+ return loaded < lastPage.total ? allPages.length + 1 : undefined;
36
+ },
37
+ staleTime: 30_000,
38
+ refetchOnMount: true,
39
+ refetchOnWindowFocus: true,
40
+ refetchOnReconnect: true,
41
+ });
42
+ }
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+
3
+ import { useQuery, keepPreviousData } from '@tanstack/react-query';
4
+ import { listProjectsAction } from '../actions/list-projects.action';
5
+ import type { ListProjectsActionParams } from '../actions/list-projects.action';
6
+ import { withAction } from '../../../utils/withAction';
7
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
8
+
9
+ export const PROJECTS_BASE_KEY = ['projects'] as const;
10
+
11
+ export const PROJECTS_QUERY_KEY = (params?: ListProjectsActionParams) =>
12
+ [...PROJECTS_BASE_KEY, params] as const;
13
+
14
+ export function useProjects(params?: ListProjectsActionParams) {
15
+ const queryKey = useAuthQueryKey([...PROJECTS_QUERY_KEY(params)]);
16
+
17
+ return useQuery({
18
+ queryKey,
19
+ queryFn: withAction(() => listProjectsAction(params)),
20
+ staleTime: 30_000,
21
+ placeholderData: keepPreviousData,
22
+ });
23
+ }
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query';
4
+ import { updateProjectAction } from '../actions/update-project.action';
5
+ import { withAction } from '../../../utils/withAction';
6
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
+ import { PROJECTS_BASE_KEY } from './list-projects.hook';
8
+ import type { UpdateProjectRequest } from '../types';
9
+
10
+ export function useUpdateProject() {
11
+ const queryClient = useQueryClient();
12
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
13
+
14
+ return useMutation({
15
+ mutationFn: ({ projectId, data }: { projectId: number; data: UpdateProjectRequest }) =>
16
+ withAction(updateProjectAction)(projectId, data),
17
+ onSuccess: () => {
18
+ queryClient.invalidateQueries({ queryKey: projectsKey });
19
+ },
20
+ });
21
+ }
@@ -0,0 +1,123 @@
1
+ import 'server-only';
2
+
3
+ import { api } from '../../../infra/api/client';
4
+ import { ApiError } from '../../../infra/api/types';
5
+ import { buildQueryParams } from '../../../infra/utils/params';
6
+ import { getUserContext } from '../../auth/utils/get-user-context';
7
+ import { assertManagementSubscription } from '../../auth/utils/assert-management-subscription';
8
+ import {
9
+ Project,
10
+ ProjectSchema,
11
+ ProjectsPage,
12
+ CreateProjectRequest,
13
+ UpdateProjectRequest,
14
+ } from '../types';
15
+
16
+ interface ApiListResponse<T> {
17
+ data: T[];
18
+ total: number;
19
+ status: number;
20
+ message?: string;
21
+ }
22
+
23
+ interface ApiMutationResponse {
24
+ status: number;
25
+ message?: string;
26
+ data?: Project[];
27
+ }
28
+
29
+ interface ListProjectsParams {
30
+ page?: number;
31
+ limit?: number;
32
+ sort?: string;
33
+ search?: string;
34
+ deleted?: number;
35
+ }
36
+
37
+ class ProjectsService {
38
+ async list(params: ListProjectsParams = {}): Promise<ProjectsPage> {
39
+ const { id_account, id_user } = await getUserContext();
40
+ const query = buildQueryParams(params as Record<string, string | number | boolean | undefined>);
41
+ const url = `/account/${id_account}/user/${id_user}/projects${query ? `?${query}` : ''}`;
42
+
43
+ const response = await api.apps.get<ApiListResponse<Project>>(url);
44
+
45
+ if (response.status === 0) {
46
+ throw new ApiError(
47
+ response.message || 'Erro ao listar projetos',
48
+ 'LIST_PROJECTS_FAILED',
49
+ 400
50
+ );
51
+ }
52
+
53
+ return {
54
+ data: (response.data || []).map((item) => ProjectSchema.parse(item)),
55
+ total: response.total || 0,
56
+ page: params.page ?? 1,
57
+ };
58
+ }
59
+
60
+ async create(data: CreateProjectRequest): Promise<Project> {
61
+ await assertManagementSubscription();
62
+ const { id_account, id_user } = await getUserContext();
63
+ const url = `/account/${id_account}/user/${id_user}/projects`;
64
+
65
+ const response = await api.apps.post<ApiMutationResponse>(url, data);
66
+
67
+ if (response.status === 0) {
68
+ throw new ApiError(
69
+ response.message || 'Erro ao criar projeto',
70
+ 'CREATE_PROJECT_FAILED',
71
+ 400
72
+ );
73
+ }
74
+
75
+ if (!response.data || response.data.length === 0) {
76
+ throw new ApiError('Resposta inválida ao criar projeto', 'INVALID_RESPONSE', 500);
77
+ }
78
+
79
+ return ProjectSchema.parse(response.data[0]);
80
+ }
81
+
82
+ async update(projectId: number, data: UpdateProjectRequest): Promise<Project> {
83
+ await assertManagementSubscription();
84
+ const { id_account, id_user } = await getUserContext();
85
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
86
+
87
+ const response = await api.apps.put<ApiMutationResponse>(url, data);
88
+
89
+ if (response.status === 0) {
90
+ throw new ApiError(
91
+ response.message || 'Erro ao atualizar projeto',
92
+ 'UPDATE_PROJECT_FAILED',
93
+ 400
94
+ );
95
+ }
96
+
97
+ if (!response.data || response.data.length === 0) {
98
+ throw new ApiError('Resposta inválida ao atualizar projeto', 'INVALID_RESPONSE', 500);
99
+ }
100
+
101
+ return ProjectSchema.parse(response.data[0]);
102
+ }
103
+
104
+ async delete(projectId: number, moveToProjectId: number): Promise<void> {
105
+ await assertManagementSubscription();
106
+ const { id_account, id_user } = await getUserContext();
107
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
108
+
109
+ const response = await api.apps.delete<ApiMutationResponse>(url, {
110
+ body: JSON.stringify({ id_project_to_move: moveToProjectId }),
111
+ });
112
+
113
+ if (response.status === 0) {
114
+ throw new ApiError(
115
+ response.message || 'Erro ao deletar projeto',
116
+ 'DELETE_PROJECT_FAILED',
117
+ 400
118
+ );
119
+ }
120
+ }
121
+ }
122
+
123
+ export const projectsService = new ProjectsService();
@@ -1,5 +1,51 @@
1
1
  import { z } from "zod";
2
2
 
3
+ // ============================================================================
4
+ // Project
5
+ // ============================================================================
6
+
7
+ export const ProjectSchema = z.object({
8
+ id: z.union([z.number(), z.string()]).transform(Number),
9
+ id_wl: z.union([z.number(), z.string()]).transform(Number),
10
+ id_account: z.union([z.number(), z.string()]).transform(Number),
11
+ title: z.string(),
12
+ photo: z.string().nullable().optional(),
13
+ id_api: z.union([z.number(), z.string()]).nullable().optional(),
14
+ id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),
15
+ total_users: z.string().optional(),
16
+ deleted: z
17
+ .union([z.boolean(), z.number()])
18
+ .transform((v) => Boolean(v))
19
+ .default(false),
20
+ datetime_add: z.string().nullable().optional(),
21
+ datetime_alt: z.string().nullable().optional(),
22
+ datetime_del: z.string().nullable().optional(),
23
+ });
24
+
25
+ export type Project = z.infer<typeof ProjectSchema>;
26
+
27
+ export interface ProjectsPage {
28
+ data: Project[];
29
+ total: number;
30
+ page: number;
31
+ }
32
+
33
+ export interface CreateProjectRequest {
34
+ title: string;
35
+ photo?: string;
36
+ id_api?: number;
37
+ users?: number[];
38
+ }
39
+
40
+ export interface UpdateProjectRequest {
41
+ title: string;
42
+ photo?: string;
43
+ }
44
+
45
+ // ============================================================================
46
+ // Project Users
47
+ // ============================================================================
48
+
3
49
  export const ProjectUserSchema = z.object({
4
50
  id_user: z.union([z.number(), z.string()]).transform(Number),
5
51
  id_account: z.union([z.number(), z.string()]).transform(Number),
package/src/server.ts CHANGED
@@ -32,6 +32,13 @@ export { resolvePlanExtrasPrices } from './modules/subscriptions/utils/resolve-p
32
32
  export { hasSubscriptionExpired } from './modules/subscriptions/utils/has-subscription-expired';
33
33
  export { listIaCreditsAction } from './modules/ia-credits/actions/list-ia-credits.action';
34
34
 
35
+ // Project Services & Actions (server-only)
36
+ export { projectsService } from './modules/projects/services/projects.service';
37
+ export { listProjectsAction } from './modules/projects/actions/list-projects.action';
38
+ export { createProjectAction } from './modules/projects/actions/create-project.action';
39
+ export { updateProjectAction } from './modules/projects/actions/update-project.action';
40
+ export { deleteProjectAction } from './modules/projects/actions/delete-project.action';
41
+
35
42
  // Project Users Services & Actions (server-only)
36
43
  export { projectUsersService } from './modules/projects/services/project-users.service';
37
44
  export { listProjectUsersAction } from './modules/projects/actions/list-project-users.action';
@@ -1 +0,0 @@
1
- //# sourceMappingURL=types.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,6 +0,0 @@
1
- export interface NavigationProject {
2
- id: number;
3
- title: string;
4
- photo?: string | null;
5
- total_users?: string;
6
- }