- {pacienteNome
- .split(" ")
- .map((n) => n[0])
- .join("")
- .toUpperCase()
- .slice(0, 2)}
-
{pacienteNome}
diff --git a/MEDICONNECT 2/src/services/avatars/avatarService.ts b/MEDICONNECT 2/src/services/avatars/avatarService.ts
index 049d05e69..5443ec927 100644
--- a/MEDICONNECT 2/src/services/avatars/avatarService.ts
+++ b/MEDICONNECT 2/src/services/avatars/avatarService.ts
@@ -2,7 +2,8 @@
* Serviço de Avatars (Frontend)
*/
-import { apiClient } from "../api/client";
+import axios from "axios";
+import { API_CONFIG } from "../api/config";
import type {
UploadAvatarInput,
UploadAvatarResponse,
@@ -11,58 +12,75 @@ import type {
} from "./types";
class AvatarService {
+ private readonly SUPABASE_URL = API_CONFIG.SUPABASE_URL;
+ private readonly STORAGE_URL = `${this.SUPABASE_URL}/storage/v1/object/avatars`;
+
/**
* Faz upload de avatar do usuário
*/
async upload(data: UploadAvatarInput): Promise {
try {
- // Converte arquivo para base64
- const fileData = await this.fileToBase64(data.file);
+ const token = localStorage.getItem(API_CONFIG.STORAGE_KEYS.ACCESS_TOKEN);
+
+ // Determina a extensão do arquivo
+ const ext = data.file.name.split(".").pop()?.toLowerCase() || "jpg";
+ const path = `${data.userId}/avatar.${ext}`;
- const response = await apiClient.post(
- `/avatars-upload?userId=${data.userId}`,
- {
- fileData,
- contentType: data.file.type,
- fileName: data.file.name,
- },
+ // Cria FormData para o upload
+ const formData = new FormData();
+ formData.append("file", data.file);
+
+ // Upload usando Supabase Storage API
+ await axios.post(
+ `${this.STORAGE_URL}/${path}`,
+ formData,
{
headers: {
- "Content-Type": "application/json",
+ "Authorization": `Bearer ${token}`,
+ "Content-Type": "multipart/form-data",
},
}
);
- return response.data;
+ // Retorna a URL pública
+ const publicUrl = this.getPublicUrl({
+ userId: data.userId,
+ ext: ext as "jpg" | "png" | "webp",
+ });
+
+ return {
+ Key: publicUrl,
+ };
} catch (error) {
console.error("Erro ao fazer upload do avatar:", error);
throw error;
}
}
- /**
- * Converte File para base64
- */
- private fileToBase64(file: File): Promise {
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onload = () => {
- const result = reader.result as string;
- // Remove o prefixo "data:image/...;base64,"
- const base64 = result.split(",")[1];
- resolve(base64);
- };
- reader.onerror = reject;
- reader.readAsDataURL(file);
- });
- }
-
/**
* Remove avatar do usuário
*/
async delete(data: DeleteAvatarInput): Promise {
try {
- await apiClient.delete(`/avatars-delete?userId=${data.userId}`);
+ const token = localStorage.getItem(API_CONFIG.STORAGE_KEYS.ACCESS_TOKEN);
+
+ // Tenta deletar todas as extensões possíveis
+ const extensions = ["jpg", "png", "webp"];
+
+ for (const ext of extensions) {
+ try {
+ await axios.delete(
+ `${this.STORAGE_URL}/${data.userId}/avatar.${ext}`,
+ {
+ headers: {
+ "Authorization": `Bearer ${token}`,
+ },
+ }
+ );
+ } catch {
+ // Ignora erros se o arquivo não existir
+ }
+ }
} catch (error) {
console.error("Erro ao deletar avatar:", error);
throw error;
@@ -74,8 +92,7 @@ class AvatarService {
* Não precisa de autenticação pois é endpoint público
*/
getPublicUrl(data: GetAvatarUrlInput): string {
- const SUPABASE_URL = "https://yuanqfswhberkoevtmfr.supabase.co";
- return `${SUPABASE_URL}/storage/v1/object/public/avatars/${data.userId}/avatar.${data.ext}`;
+ return `${this.STORAGE_URL}/${data.userId}/avatar.${data.ext}`;
}
}