tosPostItem.tsx1 match
45try {
46const token = localStorage.getItem("tos_token");
47const response = await fetch(`/api/posts/${post.id}/comments`, {
48headers: {
49"Authorization": `Bearer ${token}`
tosFeedPage.tsx5 matches
26try {
27const currentOffset = reset ? 0 : offset;
28const response = await fetch(`/api/posts?limit=${limit}&offset=${currentOffset}`, {
29headers: {
30"Authorization": `Bearer ${token}`
74
75try {
76const response = await fetch("/api/posts", {
77method: "POST",
78headers: {
107const handleLike = async (postId: number) => {
108try {
109const response = await fetch(`/api/posts/${postId}/like`, {
110method: "POST",
111headers: {
133const handleComment = async (postId: number, content: string) => {
134try {
135const response = await fetch(`/api/posts/${postId}/comments`, {
136method: "POST",
137headers: {
166const handleDelete = async (postId: number) => {
167try {
168const response = await fetch(`/api/posts/${postId}`, {
169method: "DELETE",
170headers: {
untitled-8850arena-blocks.html7 matches
237238try {
239// Log start of API request
240console.log('🔄 Starting API request to Are.na...');
241console.time('API Request');
242
243// Fetch data from Are.na API
244const response = await fetch('https://api.are.na/v2/search/blocks?sort=updated_at');
245
246// Log response received
247console.log(`✅ Response received with status: ${response.status}`);
248console.timeEnd('API Request');
249
250if (!response.ok) {
251throw new Error(`API responded with status: ${response.status}`);
252}
253
tosMainLayout.tsx2 matches
21if (!token) return;
2223const response = await fetch("/api/chat/unread", {
24headers: {
25"Authorization": `Bearer ${token}`
5455// Just hit any authenticated endpoint to update online status
56await fetch("/api/users/online", {
57headers: {
58"Authorization": `Bearer ${token}`
tosAuthPage.tsx2 matches
23// Login request
24const loginData: LoginRequest = { email, password };
25const response = await fetch("/api/auth/login", {
26method: "POST",
27headers: { "Content-Type": "application/json" },
40// Signup request
41const signupData: SignupRequest = { email, username, password };
42const response = await fetch("/api/auth/signup", {
43method: "POST",
44headers: { "Content-Type": "application/json" },
65});
6667// API routes
68app.route("/api/auth", authRouter);
69app.route("/api/users", usersRouter.use(jwtMiddleware));
70app.route("/api/posts", postsRouter.use(jwtMiddleware));
71app.route("/api/chat", chatRouter.use(jwtMiddleware));
7273// Static routes (must be last)
11getUnreadMessageCounts
12} from "../database/queries.ts";
13import { ApiResponse, ChatRoom, ChatRoomMessage, Message, User } from "../../shared/types.ts";
1415export const chatRouter = new Hono();
20const chatRooms = await getChatRooms();
21
22return c.json<ApiResponse<{ chatRooms: ChatRoom[] }>>({
23success: true,
24data: {
28} catch (error) {
29console.error("Get chat rooms error:", error);
30return c.json<ApiResponse<null>>({
31success: false,
32error: "Internal server error"
43
44if (isNaN(chatRoomId)) {
45return c.json<ApiResponse<null>>({
46success: false,
47error: "Invalid chat room ID"
52
53if (!success) {
54return c.json<ApiResponse<null>>({
55success: false,
56error: "Failed to join chat room"
58}
59
60return c.json<ApiResponse<{ success: boolean }>>({
61success: true,
62data: {
66} catch (error) {
67console.error("Join chat room error:", error);
68return c.json<ApiResponse<null>>({
69success: false,
70error: "Internal server error"
81
82if (isNaN(chatRoomId)) {
83return c.json<ApiResponse<null>>({
84success: false,
85error: "Invalid chat room ID"
90
91if (!success) {
92return c.json<ApiResponse<null>>({
93success: false,
94error: "Failed to leave chat room"
96}
97
98return c.json<ApiResponse<{ success: boolean }>>({
99success: true,
100data: {
104} catch (error) {
105console.error("Leave chat room error:", error);
106return c.json<ApiResponse<null>>({
107success: false,
108error: "Internal server error"
117
118if (isNaN(chatRoomId)) {
119return c.json<ApiResponse<null>>({
120success: false,
121error: "Invalid chat room ID"
125const messages = await getChatRoomMessages(chatRoomId);
126
127return c.json<ApiResponse<{ messages: ChatRoomMessage[] }>>({
128success: true,
129data: {
133} catch (error) {
134console.error("Get chat room messages error:", error);
135return c.json<ApiResponse<null>>({
136success: false,
137error: "Internal server error"
146
147if (isNaN(chatRoomId)) {
148return c.json<ApiResponse<null>>({
149success: false,
150error: "Invalid chat room ID"
154const members = await getChatRoomMembers(chatRoomId);
155
156return c.json<ApiResponse<{ members: User[] }>>({
157success: true,
158data: {
162} catch (error) {
163console.error("Get chat room members error:", error);
164return c.json<ApiResponse<null>>({
165success: false,
166error: "Internal server error"
180
181if (isNaN(receiverId)) {
182return c.json<ApiResponse<null>>({
183success: false,
184error: "Invalid user ID"
187
188if (!content || content.trim() === "") {
189return c.json<ApiResponse<null>>({
190success: false,
191error: "Content is required"
196
197if (!message) {
198return c.json<ApiResponse<null>>({
199success: false,
200error: "Failed to send message"
202}
203
204return c.json<ApiResponse<{ message: Message }>>({
205success: true,
206data: {
210} catch (error) {
211console.error("Send direct message error:", error);
212return c.json<ApiResponse<null>>({
213success: false,
214error: "Internal server error"
225
226if (isNaN(otherUserId)) {
227return c.json<ApiResponse<null>>({
228success: false,
229error: "Invalid user ID"
236await markMessagesAsRead(userId, otherUserId);
237
238return c.json<ApiResponse<{ messages: Message[] }>>({
239success: true,
240data: {
244} catch (error) {
245console.error("Get direct messages error:", error);
246return c.json<ApiResponse<null>>({
247success: false,
248error: "Internal server error"
259
260if (isNaN(otherUserId)) {
261return c.json<ApiResponse<null>>({
262success: false,
263error: "Invalid user ID"
267const success = await markMessagesAsRead(userId, otherUserId);
268
269return c.json<ApiResponse<{ success: boolean }>>({
270success: true,
271data: {
275} catch (error) {
276console.error("Mark messages as read error:", error);
277return c.json<ApiResponse<null>>({
278success: false,
279error: "Internal server error"
290const unreadCounts = await getUnreadMessageCounts(userId);
291
292return c.json<ApiResponse<{ unreadCounts: { [senderId: string]: number } }>>({
293success: true,
294data: {
298} catch (error) {
299console.error("Get unread message counts error:", error);
300return c.json<ApiResponse<null>>({
301success: false,
302error: "Internal server error"
10toggleLike
11} from "../database/queries.ts";
12import { ApiResponse, Post, Comment } from "../../shared/types.ts";
1314export const postsRouter = new Hono();
24
25if (!content || content.trim() === "") {
26return c.json<ApiResponse<null>>({
27success: false,
28error: "Content is required"
33
34if (!post) {
35return c.json<ApiResponse<null>>({
36success: false,
37error: "Failed to create post"
39}
40
41return c.json<ApiResponse<{ post: Post }>>({
42success: true,
43data: {
47} catch (error) {
48console.error("Create post error:", error);
49return c.json<ApiResponse<null>>({
50success: false,
51error: "Internal server error"
65const posts = await getPosts(userId, limit, offset);
66
67return c.json<ApiResponse<{ posts: Post[] }>>({
68success: true,
69data: {
73} catch (error) {
74console.error("Get posts error:", error);
75return c.json<ApiResponse<null>>({
76success: false,
77error: "Internal server error"
88
89if (isNaN(postId)) {
90return c.json<ApiResponse<null>>({
91success: false,
92error: "Invalid post ID"
97
98if (!post) {
99return c.json<ApiResponse<null>>({
100success: false,
101error: "Post not found"
103}
104
105return c.json<ApiResponse<{ post: Post }>>({
106success: true,
107data: {
111} catch (error) {
112console.error("Get post error:", error);
113return c.json<ApiResponse<null>>({
114success: false,
115error: "Internal server error"
127
128if (isNaN(postId)) {
129return c.json<ApiResponse<null>>({
130success: false,
131error: "Invalid post ID"
136
137if (!success) {
138return c.json<ApiResponse<null>>({
139success: false,
140error: "Failed to delete post or unauthorized"
142}
143
144return c.json<ApiResponse<{ success: boolean }>>({
145success: true,
146data: {
150} catch (error) {
151console.error("Delete post error:", error);
152return c.json<ApiResponse<null>>({
153success: false,
154error: "Internal server error"
168
169if (isNaN(postId)) {
170return c.json<ApiResponse<null>>({
171success: false,
172error: "Invalid post ID"
175
176if (!content || content.trim() === "") {
177return c.json<ApiResponse<null>>({
178success: false,
179error: "Content is required"
184
185if (!comment) {
186return c.json<ApiResponse<null>>({
187success: false,
188error: "Failed to create comment"
190}
191
192return c.json<ApiResponse<{ comment: Comment }>>({
193success: true,
194data: {
198} catch (error) {
199console.error("Create comment error:", error);
200return c.json<ApiResponse<null>>({
201success: false,
202error: "Internal server error"
211
212if (isNaN(postId)) {
213return c.json<ApiResponse<null>>({
214success: false,
215error: "Invalid post ID"
219const comments = await getPostComments(postId);
220
221return c.json<ApiResponse<{ comments: Comment[] }>>({
222success: true,
223data: {
227} catch (error) {
228console.error("Get comments error:", error);
229return c.json<ApiResponse<null>>({
230success: false,
231error: "Internal server error"
243
244if (isNaN(commentId)) {
245return c.json<ApiResponse<null>>({
246success: false,
247error: "Invalid comment ID"
252
253if (!success) {
254return c.json<ApiResponse<null>>({
255success: false,
256error: "Failed to delete comment or unauthorized"
258}
259
260return c.json<ApiResponse<{ success: boolean }>>({
261success: true,
262data: {
266} catch (error) {
267console.error("Delete comment error:", error);
268return c.json<ApiResponse<null>>({
269success: false,
270error: "Internal server error"
281
282if (isNaN(postId)) {
283return c.json<ApiResponse<null>>({
284success: false,
285error: "Invalid post ID"
289const result = await toggleLike(postId, userId);
290
291return c.json<ApiResponse<{ liked: boolean; count: number }>>({
292success: true,
293data: result
295} catch (error) {
296console.error("Toggle like error:", error);
297return c.json<ApiResponse<null>>({
298success: false,
299error: "Internal server error"
7getOnlineUsers
8} from "../database/queries.ts";
9import { ApiResponse, User, Post } from "../../shared/types.ts";
1011export const usersRouter = new Hono();
17
18if (isNaN(userId)) {
19return c.json<ApiResponse<null>>({
20success: false,
21error: "Invalid user ID"
26
27if (!user) {
28return c.json<ApiResponse<null>>({
29success: false,
30error: "User not found"
32}
33
34return c.json<ApiResponse<{ user: User }>>({
35success: true,
36data: {
40} catch (error) {
41console.error("Get user error:", error);
42return c.json<ApiResponse<null>>({
43success: false,
44error: "Internal server error"
63
64if (!updatedUser) {
65return c.json<ApiResponse<null>>({
66success: false,
67error: "Failed to update profile"
69}
70
71return c.json<ApiResponse<{ user: User }>>({
72success: true,
73data: {
77} catch (error) {
78console.error("Update profile error:", error);
79return c.json<ApiResponse<null>>({
80success: false,
81error: "Internal server error"
92
93if (isNaN(userId)) {
94return c.json<ApiResponse<null>>({
95success: false,
96error: "Invalid user ID"
100const posts = await getUserPosts(userId, currentUserId);
101
102return c.json<ApiResponse<{ posts: Post[] }>>({
103success: true,
104data: {
108} catch (error) {
109console.error("Get user posts error:", error);
110return c.json<ApiResponse<null>>({
111success: false,
112error: "Internal server error"
122
123if (isNaN(userId)) {
124return c.json<ApiResponse<null>>({
125success: false,
126error: "Invalid user ID"
130// Only allow users to see their own liked posts
131if (payload.id !== userId) {
132return c.json<ApiResponse<null>>({
133success: false,
134error: "Unauthorized"
138const posts = await getUserLikedPosts(userId);
139
140return c.json<ApiResponse<{ posts: Post[] }>>({
141success: true,
142data: {
146} catch (error) {
147console.error("Get user liked posts error:", error);
148return c.json<ApiResponse<null>>({
149success: false,
150error: "Internal server error"
158const onlineUsers = await getOnlineUsers();
159
160return c.json<ApiResponse<{ users: User[] }>>({
161success: true,
162data: {
166} catch (error) {
167console.error("Get online users error:", error);
168return c.json<ApiResponse<null>>({
169success: false,
170error: "Internal server error"
2import { jwt } from "https://esm.sh/hono@3.11.7/middleware/jwt";
3import { createUser, getUserByEmail, verifyUser } from "../database/queries.ts";
4import { SignupRequest, LoginRequest, ApiResponse, AuthResponse } from "../../shared/types.ts";
56const JWT_SECRET = Deno.env.get("JWT_SECRET") || "tos-secret-key-change-in-production";
16// Validate input
17if (!email || !username || !password) {
18return c.json<ApiResponse<null>>({
19success: false,
20error: "Email, username, and password are required"
25const existingUser = await getUserByEmail(email);
26if (existingUser) {
27return c.json<ApiResponse<null>>({
28success: false,
29error: "Email already in use"
34const user = await createUser(email, username, password);
35if (!user) {
36return c.json<ApiResponse<null>>({
37success: false,
38error: "Failed to create user"
48});
49
50return c.json<ApiResponse<AuthResponse>>({
51success: true,
52data: {
57} catch (error) {
58console.error("Signup error:", error);
59return c.json<ApiResponse<null>>({
60success: false,
61error: "Internal server error"
72// Validate input
73if (!email || !password) {
74return c.json<ApiResponse<null>>({
75success: false,
76error: "Email and password are required"
81const user = await verifyUser(email, password);
82if (!user) {
83return c.json<ApiResponse<null>>({
84success: false,
85error: "Invalid email or password"
95});
96
97return c.json<ApiResponse<AuthResponse>>({
98success: true,
99data: {
104} catch (error) {
105console.error("Login error:", error);
106return c.json<ApiResponse<null>>({
107success: false,
108error: "Internal server error"
116const payload = c.get("jwtPayload");
117
118return c.json<ApiResponse<{ user: any }>>({
119success: true,
120data: {
124} catch (error) {
125console.error("Get current user error:", error);
126return c.json<ApiResponse<null>>({
127success: false,
128error: "Internal server error"