hackmate-cli 1.1.0 → 1.1.2

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 (84) hide show
  1. package/dist/Dashboard.js +4 -4
  2. package/dist/Dashboard.js.map +1 -1
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +10 -0
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli.js +11 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/Discover.d.ts +5 -1
  9. package/dist/commands/Discover.d.ts.map +1 -1
  10. package/dist/commands/Discover.js +12 -6
  11. package/dist/commands/Discover.js.map +1 -1
  12. package/dist/commands/MatchList.d.ts +5 -1
  13. package/dist/commands/MatchList.d.ts.map +1 -1
  14. package/dist/commands/MatchList.js +16 -8
  15. package/dist/commands/MatchList.js.map +1 -1
  16. package/dist/commands/auth/auth.logic.d.ts.map +1 -1
  17. package/dist/commands/auth/auth.logic.js +30 -14
  18. package/dist/commands/auth/auth.logic.js.map +1 -1
  19. package/dist/commands/auth/login.screen.d.ts.map +1 -1
  20. package/dist/commands/auth/login.screen.js +4 -1
  21. package/dist/commands/auth/login.screen.js.map +1 -1
  22. package/dist/commands/auth/verify.logic.js +1 -1
  23. package/dist/commands/auth/verify.logic.js.map +1 -1
  24. package/dist/config.d.ts +3 -8
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js.map +1 -1
  27. package/dist/context/AuthContext.d.ts +1 -4
  28. package/dist/context/AuthContext.d.ts.map +1 -1
  29. package/dist/context/AuthContext.js +18 -2
  30. package/dist/context/AuthContext.js.map +1 -1
  31. package/dist/features/admin/hooks/useAdmin.js +1 -1
  32. package/dist/features/chat/components/ChatList.d.ts +3 -1
  33. package/dist/features/chat/components/ChatList.d.ts.map +1 -1
  34. package/dist/features/chat/components/ChatList.js +7 -2
  35. package/dist/features/chat/components/ChatList.js.map +1 -1
  36. package/dist/features/chat/hooks/useChat.d.ts.map +1 -1
  37. package/dist/features/chat/hooks/useChat.js +26 -20
  38. package/dist/features/chat/hooks/useChat.js.map +1 -1
  39. package/dist/features/group/hooks/useGroup.js +1 -1
  40. package/dist/features/network/hooks/useNetwork.js +1 -1
  41. package/dist/features/notification/hooks/useNotification.js +1 -1
  42. package/dist/features/profile/components/index.d.ts +1 -0
  43. package/dist/features/profile/components/index.d.ts.map +1 -1
  44. package/dist/features/profile/components/index.js +16 -8
  45. package/dist/features/profile/components/index.js.map +1 -1
  46. package/dist/features/profile/hooks/useProfile.d.ts +13 -4
  47. package/dist/features/profile/hooks/useProfile.d.ts.map +1 -1
  48. package/dist/features/profile/hooks/useProfile.js +34 -36
  49. package/dist/features/profile/hooks/useProfile.js.map +1 -1
  50. package/dist/features/project/hooks/useProject.js +2 -2
  51. package/dist/features/project/hooks/useProject.js.map +1 -1
  52. package/dist/services/auth.service.d.ts +14 -0
  53. package/dist/services/auth.service.d.ts.map +1 -0
  54. package/dist/services/auth.service.js +19 -0
  55. package/dist/services/auth.service.js.map +1 -0
  56. package/dist/services/chat.service.d.ts +14 -0
  57. package/dist/services/chat.service.d.ts.map +1 -0
  58. package/dist/services/chat.service.js +22 -0
  59. package/dist/services/chat.service.js.map +1 -0
  60. package/dist/services/match.service.d.ts +20 -0
  61. package/dist/services/match.service.d.ts.map +1 -0
  62. package/dist/services/match.service.js +28 -0
  63. package/dist/services/match.service.js.map +1 -0
  64. package/dist/services/network.service.d.ts +4 -0
  65. package/dist/services/network.service.d.ts.map +1 -0
  66. package/dist/services/network.service.js +8 -0
  67. package/dist/services/network.service.js.map +1 -0
  68. package/dist/services/user.service.d.ts +7 -0
  69. package/dist/services/user.service.d.ts.map +1 -0
  70. package/dist/services/user.service.js +17 -0
  71. package/dist/services/user.service.js.map +1 -0
  72. package/dist/shared/hooks/useAsyncRequest.d.ts +1 -1
  73. package/dist/shared/hooks/useAsyncRequest.d.ts.map +1 -1
  74. package/dist/shared/hooks/useAsyncRequest.js +15 -11
  75. package/dist/shared/hooks/useAsyncRequest.js.map +1 -1
  76. package/dist/tests/Dashboard.test.d.ts +2 -0
  77. package/dist/tests/Dashboard.test.d.ts.map +1 -0
  78. package/dist/tests/Dashboard.test.js +30 -0
  79. package/dist/tests/Dashboard.test.js.map +1 -0
  80. package/dist/types/index.d.ts +36 -0
  81. package/dist/types/index.d.ts.map +1 -0
  82. package/dist/types/index.js +2 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/package.json +16 -3
@@ -0,0 +1,19 @@
1
+ import api from '../api.js';
2
+ export const AuthService = {
3
+ async login(usernameOrEmail, password) {
4
+ const { data } = await api.post('/auth/login', {
5
+ usernameOrEmail,
6
+ password
7
+ });
8
+ return data;
9
+ },
10
+ async signup(userData) {
11
+ const { data } = await api.post('/auth/signup', userData);
12
+ return data;
13
+ },
14
+ async validateToken() {
15
+ const { data } = await api.get('/auth/me');
16
+ return data;
17
+ }
18
+ };
19
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAQ5B,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK,CAAC,KAAK,CAAC,eAAuB,EAAE,QAAgB;QACjD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAe,aAAa,EAAE;YACzD,eAAe;YACf,QAAQ;SACX,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAA8C;QACvD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAe,cAAc,EAAE,QAAQ,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa;QACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAO,UAAU,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { User } from '../types/index.js';
2
+ export interface Message {
3
+ _id: string;
4
+ sender: User;
5
+ content: string;
6
+ timestamp: Date;
7
+ }
8
+ export declare const ChatService: {
9
+ getHistory(targetId: string): Promise<Message[]>;
10
+ getGroupHistory(groupId: string): Promise<Message[]>;
11
+ sendMessage(targetUsername: string, content: string): Promise<Message>;
12
+ getConversations(): Promise<any[]>;
13
+ };
14
+ //# sourceMappingURL=chat.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/services/chat.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,WAAW;yBACO,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;6BAOvB,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;gCAKxB,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;wBAKlD,OAAO,CAAC,GAAG,EAAE,CAAC;CAI3C,CAAC"}
@@ -0,0 +1,22 @@
1
+ import api from '../api.js';
2
+ export const ChatService = {
3
+ async getHistory(targetId) {
4
+ // Note: Logic used ID, not username for history fetching in hook?
5
+ // Hook used `api.get(/chat/history/${data.user.id})`. So it takes ID.
6
+ const { data } = await api.get(`/chat/history/${targetId}`);
7
+ return data;
8
+ },
9
+ async getGroupHistory(groupId) {
10
+ const { data } = await api.get(`/chat/history/group/${groupId}`);
11
+ return data;
12
+ },
13
+ async sendMessage(targetUsername, content) {
14
+ const { data } = await api.post('/chat/send', { targetUsername, content });
15
+ return data;
16
+ },
17
+ async getConversations() {
18
+ const { data } = await api.get('/chat/conversations');
19
+ return data;
20
+ }
21
+ };
22
+ //# sourceMappingURL=chat.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.service.js","sourceRoot":"","sources":["../../src/services/chat.service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAU5B,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC7B,kEAAkE;QAClE,sEAAsE;QACtE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAY,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAY,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB,EAAE,OAAe;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAU,YAAY,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { User } from '../types/index.js';
2
+ export interface MatchResult {
3
+ userId: User;
4
+ score: number;
5
+ matchReasons: string[];
6
+ compatibilityPercentage: number;
7
+ fullName?: string;
8
+ bio?: string;
9
+ stack?: string[];
10
+ }
11
+ export interface MatchFilters {
12
+ city?: string;
13
+ stack?: string;
14
+ }
15
+ export declare const MatchService: {
16
+ getTopMatches(limit?: number, filters?: MatchFilters): Promise<MatchResult[]>;
17
+ discoverMatches(filters?: MatchFilters): Promise<MatchResult[]>;
18
+ performDetailsExchange(targetUserId: string): Promise<void>;
19
+ };
20
+ //# sourceMappingURL=match.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.service.d.ts","sourceRoot":"","sources":["../../src/services/match.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAW,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY;0BACM,MAAM,YAAiB,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;8BAQvD,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;yCAY1B,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import api from '../api.js';
2
+ export const MatchService = {
3
+ async getTopMatches(limit = 10, filters) {
4
+ let query = `/match/top?limit=${limit}`;
5
+ if (filters?.city)
6
+ query += `&city=${encodeURIComponent(filters.city)}`;
7
+ if (filters?.stack)
8
+ query += `&stack=${encodeURIComponent(filters.stack)}`;
9
+ const { data } = await api.get(query);
10
+ return data;
11
+ },
12
+ async discoverMatches(filters) {
13
+ let query = '/match/discover?'; // Ensure ? is present if params added, but if empty query string is fine
14
+ // Better logic:
15
+ const params = new URLSearchParams();
16
+ if (filters?.city)
17
+ params.append('city', filters.city);
18
+ if (filters?.stack)
19
+ params.append('stack', filters.stack);
20
+ const queryString = params.toString() ? `?${params.toString()}` : '';
21
+ const { data } = await api.get('/match/discover' + queryString);
22
+ return data;
23
+ },
24
+ async performDetailsExchange(targetUserId) {
25
+ await api.post('/match/exchange', { targetUserId });
26
+ }
27
+ };
28
+ //# sourceMappingURL=match.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.service.js","sourceRoot":"","sources":["../../src/services/match.service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAkB5B,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,EAAE,OAAsB;QAC1D,IAAI,KAAK,GAAG,oBAAoB,KAAK,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE,IAAI;YAAE,KAAK,IAAI,SAAS,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,IAAI,OAAO,EAAE,KAAK;YAAE,KAAK,IAAI,UAAU,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAgB,KAAK,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAsB;QACxC,IAAI,KAAK,GAAG,kBAAkB,CAAC,CAAC,yEAAyE;QACzG,gBAAgB;QAChB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAgB,iBAAiB,GAAG,WAAW,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,YAAoB;QAC7C,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACxD,CAAC;CACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const NetworkService: {
2
+ sendConnectionRequest(targetUserId: string): Promise<void>;
3
+ };
4
+ //# sourceMappingURL=network.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.service.d.ts","sourceRoot":"","sources":["../../src/services/network.service.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;wCACmB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import api from '../api.js';
2
+ export const NetworkService = {
3
+ async sendConnectionRequest(targetUserId) {
4
+ await api.post('/network/request', { targetUserId });
5
+ },
6
+ // Add other network methods as needed (accept, reject, list, etc.)
7
+ };
8
+ //# sourceMappingURL=network.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.service.js","sourceRoot":"","sources":["../../src/services/network.service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,CAAC,qBAAqB,CAAC,YAAoB;QAC5C,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,mEAAmE;CACtE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Profile } from '../types/index.js';
2
+ export declare const UserService: {
3
+ getProfile(username?: string): Promise<Profile>;
4
+ updateProfile(profileData: Partial<Profile>): Promise<Profile>;
5
+ createProfile(profileData: Partial<Profile>): Promise<Profile>;
6
+ };
7
+ //# sourceMappingURL=user.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,eAAO,MAAM,WAAW;0BACQ,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;+BAMpB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;+BAKnC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAIvE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import api from '../api.js';
2
+ export const UserService = {
3
+ async getProfile(username) {
4
+ const url = username ? `/profile/${username}` : '/profile/me';
5
+ const { data } = await api.get(url);
6
+ return data;
7
+ },
8
+ async updateProfile(profileData) {
9
+ const { data } = await api.put('/profile/me', profileData);
10
+ return data;
11
+ },
12
+ async createProfile(profileData) {
13
+ const { data } = await api.post('/profile', profileData);
14
+ return data;
15
+ }
16
+ };
17
+ //# sourceMappingURL=user.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAG5B,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK,CAAC,UAAU,CAAC,QAAiB;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAU,GAAG,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAA6B;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAU,aAAa,EAAE,WAAW,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAA6B;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAU,UAAU,EAAE,WAAW,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAC"}
@@ -4,6 +4,6 @@ interface UseAsyncRequestResult<T> {
4
4
  error: string | null;
5
5
  refetch: () => Promise<void>;
6
6
  }
7
- export declare const useAsyncRequest: <T>(url: string | null, method?: "get" | "post", body?: any) => UseAsyncRequestResult<T>;
7
+ export declare const useAsyncRequest: <T>(source: string | (() => Promise<T>) | null, method?: "get" | "post", body?: any) => UseAsyncRequestResult<T>;
8
8
  export {};
9
9
  //# sourceMappingURL=useAsyncRequest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAsyncRequest.d.ts","sourceRoot":"","sources":["../../../src/shared/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAKA,UAAU,qBAAqB,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,GAAI,CAAC,EAC7B,KAAK,MAAM,GAAG,IAAI,EAClB,SAAQ,KAAK,GAAG,MAAc,EAC9B,OAAO,GAAG,KACX,qBAAqB,CAAC,CAAC,CAiDzB,CAAC"}
1
+ {"version":3,"file":"useAsyncRequest.d.ts","sourceRoot":"","sources":["../../../src/shared/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAKA,UAAU,qBAAqB,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,GAAI,CAAC,EAC7B,QAAQ,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAC1C,SAAQ,KAAK,GAAG,MAAc,EAC9B,OAAO,GAAG,KACX,qBAAqB,CAAC,CAAC,CAoDzB,CAAC"}
@@ -1,15 +1,13 @@
1
1
  import { useState, useEffect, useCallback } from 'react';
2
2
  import api from '../../api.js';
3
3
  import { useAuth } from '../../context/index.js';
4
- import { useApp } from 'ink';
5
- export const useAsyncRequest = (url, method = 'get', body) => {
4
+ export const useAsyncRequest = (source, method = 'get', body) => {
6
5
  const [data, setData] = useState(null);
7
6
  const [loading, setLoading] = useState(true);
8
7
  const [error, setError] = useState(null);
9
8
  const { isAuthenticated, isLoading: authLoading } = useAuth();
10
- const { exit } = useApp();
11
9
  const fetchData = useCallback(async () => {
12
- if (!url) {
10
+ if (!source) {
13
11
  setLoading(false);
14
12
  return;
15
13
  }
@@ -18,20 +16,26 @@ export const useAsyncRequest = (url, method = 'get', body) => {
18
16
  if (!isAuthenticated) {
19
17
  setError('Please login first using "hackmate auth login"');
20
18
  setLoading(false);
21
- // Optional: Auto-exit? Let's leave it to the UI component to decide via useEffect
22
19
  return;
23
20
  }
24
21
  setLoading(true);
25
22
  setError(null);
26
23
  try {
27
- let res;
28
- if (method === 'get') {
29
- res = await api.get(url);
24
+ let result;
25
+ if (typeof source === 'function') {
26
+ result = await source();
30
27
  }
31
28
  else {
32
- res = await api.post(url, body);
29
+ let res;
30
+ if (method === 'get') {
31
+ res = await api.get(source);
32
+ }
33
+ else {
34
+ res = await api.post(source, body);
35
+ }
36
+ result = res.data;
33
37
  }
34
- setData(res.data);
38
+ setData(result);
35
39
  }
36
40
  catch (err) {
37
41
  let msg = err.response?.data?.message || err.message || 'Request failed';
@@ -43,7 +47,7 @@ export const useAsyncRequest = (url, method = 'get', body) => {
43
47
  finally {
44
48
  setLoading(false);
45
49
  }
46
- }, [url, method, body, isAuthenticated, authLoading]);
50
+ }, [source, method, body, isAuthenticated, authLoading]);
47
51
  useEffect(() => {
48
52
  fetchData();
49
53
  }, [fetchData]);
@@ -1 +1 @@
1
- {"version":3,"file":"useAsyncRequest.js","sourceRoot":"","sources":["../../../src/shared/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAS7B,MAAM,CAAC,MAAM,eAAe,GAAG,CAC3B,GAAkB,EAClB,SAAyB,KAAK,EAC9B,IAAU,EACc,EAAE;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAErC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACX,CAAC;QAED,IAAI,WAAW;YAAE,OAAO;QAExB,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,QAAQ,CAAC,gDAAgD,CAAC,CAAC;YAC3D,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,kFAAkF;YAClF,OAAO;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACD,IAAI,GAAG,CAAC;YACR,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACnB,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAI,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACJ,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAI,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC;YACzE,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACnC,GAAG,GAAG,gDAAgD,CAAC;YAC3D,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,UAAU,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACX,SAAS,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"useAsyncRequest.js","sourceRoot":"","sources":["../../../src/shared/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC3B,MAA0C,EAC1C,SAAyB,KAAK,EAC9B,IAAU,EACc,EAAE;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;IAE9D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACX,CAAC;QAED,IAAI,WAAW;YAAE,OAAO;QAExB,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,QAAQ,CAAC,gDAAgD,CAAC,CAAC;YAC3D,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACD,IAAI,MAAS,CAAC;YACd,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACJ,IAAI,GAAG,CAAC;gBACR,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACnB,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,MAAO,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACJ,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC;YACzE,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACnC,GAAG,GAAG,gDAAgD,CAAC;YAC3D,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,UAAU,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACX,SAAS,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Dashboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.test.d.ts","sourceRoot":"","sources":["../../src/tests/Dashboard.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink-testing-library';
3
+ import { describe, it, expect, vi } from 'vitest';
4
+ import { Dashboard } from '../Dashboard.js';
5
+ // Mock explicit dependencies that might crash in test env
6
+ vi.mock('../context/index.js', () => ({
7
+ useAuth: () => ({
8
+ isAuthenticated: false,
9
+ isLoading: false,
10
+ user: null,
11
+ login: vi.fn(),
12
+ logout: vi.fn(),
13
+ }),
14
+ }));
15
+ vi.mock('ink', async () => {
16
+ const actual = await vi.importActual('ink');
17
+ return {
18
+ ...actual,
19
+ useApp: () => ({ exit: vi.fn() }),
20
+ };
21
+ });
22
+ describe('Dashboard Component', () => {
23
+ it('renders the welcome message when not authenticated', () => {
24
+ const { lastFrame } = render(_jsx(Dashboard, {}));
25
+ expect(lastFrame()).toContain('HackMate Terminal');
26
+ expect(lastFrame()).toContain('Login');
27
+ expect(lastFrame()).toContain('Exit');
28
+ });
29
+ });
30
+ //# sourceMappingURL=Dashboard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.test.js","sourceRoot":"","sources":["../../src/tests/Dashboard.test.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,0DAA0D;AAC1D,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACZ,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KAClB,CAAC;CACL,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;IACtB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO;QACH,GAAG,MAAM;QACT,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;KACpC,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ export interface User {
2
+ _id: string;
3
+ username: string;
4
+ email: string;
5
+ }
6
+ export interface Profile {
7
+ _id: string;
8
+ user: string | User;
9
+ bio?: string;
10
+ website?: string;
11
+ github?: string;
12
+ twitter?: string;
13
+ linkedin?: string;
14
+ skills: string[];
15
+ stack?: string[];
16
+ interests?: string[];
17
+ hobbies?: string[];
18
+ interestedIn?: string[];
19
+ role?: string;
20
+ company?: string;
21
+ location?: string;
22
+ city?: string;
23
+ country?: string;
24
+ intent?: string;
25
+ dateOfBirth?: string | Date;
26
+ }
27
+ export interface Project {
28
+ _id: string;
29
+ title: string;
30
+ description: string;
31
+ owner: string | User;
32
+ tags: string[];
33
+ status: 'open' | 'closed' | 'wip';
34
+ members: (string | User)[];
35
+ }
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackmate-cli",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "HackMate CLI - Terminal-based social network for developers and hackers",
5
5
  "type": "module",
6
6
  "bin": {
@@ -49,10 +49,23 @@
49
49
  "devDependencies": {
50
50
  "@types/node": "^20.0.0",
51
51
  "@types/react": "^18.0.0",
52
+ "@typescript-eslint/eslint-plugin": "^8.53.1",
53
+ "@typescript-eslint/parser": "^8.53.1",
54
+ "eslint": "^9.39.2",
55
+ "eslint-config-prettier": "^10.1.8",
56
+ "eslint-plugin-prettier": "^5.5.5",
57
+ "eslint-plugin-react": "^7.37.5",
58
+ "eslint-plugin-react-hooks": "^7.0.1",
59
+ "eslint-plugin-react-refresh": "^0.4.26",
60
+ "globals": "^17.0.0",
61
+ "ink-testing-library": "^4.0.0",
62
+ "prettier": "^3.8.0",
52
63
  "tsx": "^4.0.0",
53
- "typescript": "^5.9.3"
64
+ "typescript": "^5.9.3",
65
+ "typescript-eslint": "^8.53.1",
66
+ "vitest": "^4.0.17"
54
67
  },
55
68
  "engines": {
56
69
  "node": ">=20"
57
70
  }
58
- }
71
+ }