feat: migrate auth from supabase to better auth (#596)

* feat: add README for @cio/db package and remove existingAccounts.json

* load session, load profile and organization, add create profile hook

* chore: cache session request

The trick was passing all the cookies to the backend. Previously I was only passing the better-auth.session_token and not better-auth.session_data. Read about the difference here https://www.better-auth.com/docs/concepts/cookies#custom-cookies

* feat: login, logout, onboarding, verify email, reset password.

* feat: complete change email and email verification

* feat: standardise how we make rpc calls and create org endpoints

* fix ui errors

* fix: handle potential undefined customerId and standardize avatar URL property

* refactor: standardize custom domain handling and update telegram chat ID references

* chore: add tailwind prefix to @cio/ui

this fixed the media query issues because  @cio/ui classes were overriding this dashboard tailwind build

* chore: clean up org sidebar

* chore: persist mode state

* feat: implement order breadcrumbs

* chore: upgrade to better auth 1.4

* chore: address common auth flow bugs and setup app for others to setup locally.
This commit is contained in:
Rotimi Best
2025-11-24 01:00:50 +01:00
committed by GitHub
parent 24741644d6
commit a3924100dd
567 changed files with 22364 additions and 13437 deletions
@@ -99,6 +99,21 @@
"email": "Ugyldig e -mail -adresse",
"username": "Brugernavn kan ikke være tomt",
"fullname": "Navnet skal være mindst 5 tegn"
},
"generic": {
"invalid_type": "Ugyldig type{forventet, vælg, udefineret{} anden{. Forventet {expected}}}{received, select, undefined{} other{ (received {received})}}",
"too_big": "Værdien er for stor{maksimum, vælg, udefineret{} andet{. Maksimum {maksimum}}}",
"too_small": "Værdien er for lille{minimum, vælg, udefineret{} andet{. Minimum {minimum}}}",
"invalid_format": "Ugyldigt format{validering, vælg, udefineret{} andet{ for {validation}}}",
"not_multiple_of": "Værdien skal være et multiplum af {multipleOf}",
"unrecognized_keys": "Indeholder ikke-genkendte nøgler{nøgler, vælg, udefineret{} andet{: {nøgler}}}",
"invalid_union": "Ugyldig værdi for angivne muligheder{unionErrors, select, undefined{} other{. {unionErrors} valgmulighed(er) mislykkedes}}",
"invalid_key": "Ugyldig nøgle{nøgle, vælg, udefineret{} anden{: {nøgle}}}",
"invalid_element": "Ugyldigt element{indeks, vælg, udefineret{} andet{ ved indeks {indeks}}}",
"invalid_value": "Ugyldig værdi{forventet, vælg, udefineret{} anden{. Forventet {expected}}}{received, select, undefined{} other{ (received {received})}}",
"custom": "{besked}",
"required_field": "Dette felt er påkrævet",
"invalid_field": "Ugyldig værdi"
}
},
"generic": {
@@ -1555,6 +1555,21 @@
"email": "Ungültige E-Mail-Adresse",
"username": "Benutzername darf nicht leer sein",
"fullname": "Der Name sollte mindestens 5 Zeichen lang sein"
},
"generic": {
"invalid_type": "Ungültiger Typ {erwartet, ausgewählt, undefiniert{} andere{. Erwartet {erwartet}}}{received, select, undefiniert{} other{ (received {received})}}",
"too_big": "Der Wert ist zu groß{maximum, select, undefiniert{} other{. Maximum {maximum}}}",
"too_small": "Der Wert ist zu klein{minimum, select, undefiniert{} other{. Minimum {Minimum}}}",
"invalid_format": "Ungültiges Format{validation, select, undefiniert{} other{ für {validation}}}",
"not_multiple_of": "Der Wert muss ein Vielfaches von {multipleOf} sein",
"unrecognized_keys": "Enthält nicht erkannte Schlüssel{keys, select, undefiniert{} other{: {keys}}}",
"invalid_union": "Ungültiger Wert für die bereitgestellten Optionen {unionErrors, select, undefined{} other{. {unionErrors}-Option(en) fehlgeschlagen}}",
"invalid_key": "Ungültiger Schlüssel{key, select, undefiniert{} other{: {key}}}",
"invalid_element": "Ungültiges Element{index, select, undefiniert{} other{ am Index {index}}}",
"invalid_value": "Invalid value{expected, select, undefined{} other{. Erwartet {erwartet}}}{received, select, undefiniert{} other{ (received {received})}}",
"custom": "{Nachricht}",
"required_field": "Dieses Feld ist erforderlich",
"invalid_field": "Ungültiger Wert"
}
},
"explore": {
@@ -72,7 +72,7 @@
"full_name": "Full Name",
"password": "Your Password",
"confirm_password": "Confirm Password",
"password_helper_message": "Password must be more than 6 characters",
"password_helper_message": "Password must be more than 8 characters",
"create_account": "Create Account"
},
"validation": {
@@ -117,7 +117,10 @@
"heading": "Personal Information",
"full_name": "Full Name",
"username": "Username",
"email": "Email"
"email": "Email",
"confirm": "Confirm",
"cancel": "Cancel",
"email_change_verification_note": "A verification email has been sent to your current email address. The new email will not be in effect until you accept the verification email."
},
"update_profile": "Update Profile",
"logout": "Log out"
@@ -272,6 +275,7 @@
},
"org_navigation": {
"platform": "Platform",
"dashboard": "Dashboard",
"courses": "Courses",
"community": "Community",
@@ -1661,6 +1665,21 @@
},
"email": {
"not_valid": "Not valid email"
},
"generic": {
"invalid_type": "Invalid type{expected, select, undefined{} other{. Expected {expected}}}{received, select, undefined{} other{ (received {received})}}",
"too_big": "Value is too large{maximum, select, undefined{} other{. Maximum {maximum}}}",
"too_small": "Value is too small{minimum, select, undefined{} other{. Minimum {minimum}}}",
"invalid_format": "Invalid format{validation, select, undefined{} other{ for {validation}}}",
"not_multiple_of": "Value must be a multiple of {multipleOf}",
"unrecognized_keys": "Contains unrecognized keys{keys, select, undefined{} other{: {keys}}}",
"invalid_union": "Invalid value for provided options{unionErrors, select, undefined{} other{. {unionErrors} option(s) failed}}",
"invalid_key": "Invalid key{key, select, undefined{} other{: {key}}}",
"invalid_element": "Invalid element{index, select, undefined{} other{ at index {index}}}",
"invalid_value": "Invalid value{expected, select, undefined{} other{. Expected {expected}}}{received, select, undefined{} other{ (received {received})}}",
"custom": "{message}",
"required_field": "This field is required",
"invalid_field": "Invalid value"
}
},
@@ -1555,6 +1555,21 @@
"email": "Dirección de correo electrónico no válida",
"username": "El nombre de usuario no puede estar vacío",
"fullname": "El nombre debe tener un mínimo de 5 caracteres."
},
"generic": {
"invalid_type": "Invalid type{expected, select, undefined{} other{. Esperado {esperado}}}{recibido, seleccionado, indefinido{} otro{ (recibido {recibido})}}",
"too_big": "El valor es demasiado grande{máximo, selección, undefinido{} otro{. Máximo {máximo}}}",
"too_small": "El valor es demasiado pequeño{mínimo, seleccionado, undefinido{} otro{. Mínimo {mínimo}}}",
"invalid_format": "Formato no válido{validación, selección, indefinido{} otro{ para {validación}}}",
"not_multiple_of": "El valor debe ser múltiplo de {multipleOf}",
"unrecognized_keys": "Contiene claves no reconocidas{keys, select, undefined{} other{: {keys}}}",
"invalid_union": "Valor no válido para las opciones proporcionadas{unionErrors, select, undefined{} other{. {unionErrors} opción(es) fallida(s)}}",
"invalid_key": "Clave no válida{clave, selección, undefinido{} otro{: {clave}}}",
"invalid_element": "Elemento no válido{índice, selección, undefinido{} otro{ en el índice {índice}}}",
"invalid_value": "Valor no válido{esperado, seleccionado, indefinido{} otro{. Esperado {esperado}}}{recibido, seleccionado, indefinido{} otro{ (recibido {recibido})}}",
"custom": "{mensaje}",
"required_field": "Este campo es obligatorio",
"invalid_field": "Invalid value"
}
},
"explore": {
@@ -1555,6 +1555,21 @@
"email": "Adresse e-mail invalide",
"username": "Le nom d'utilisateur ne peut pas être vide",
"fullname": "Le nom doit comporter au minimum 5 caractères"
},
"generic": {
"invalid_type": "Type non valide{attendu, sélectionné, non défini{} autre{. Attendu {attendu}}}{reçu, sélectionné, non défini{} autre{ (reçu {reçu})}}",
"too_big": "La valeur est trop grande{maximum, select, undefined{} autre{. Maximum {maximum}}}",
"too_small": "La valeur est trop petite{minimum, select, undefined{} autre{. Minimum {minimum}}}",
"invalid_format": "Format invalide{validation, select, non défini{} autre{ pour {validation}}}",
"not_multiple_of": "La valeur doit être un multiple de {multipleOf}",
"unrecognized_keys": "Contient des clés non reconnues{keys, select, undefined{} other{: {keys}}}",
"invalid_union": "Valeur non valide pour les options fournies {unionErrors, select, undefined{} other{. {unionErrors} option(s) a échoué}}",
"invalid_key": "Clé invalide{key, select, undefined{} other{: {key}}}",
"invalid_element": "Élément invalide{index, select, undefined{} autre{ à l'index {index}}}",
"invalid_value": "Valeur non valide{attendue, sélectionnée, non définie{} autre{. Attendu {attendu}}}{reçu, sélectionné, non défini{} autre{ (reçu {reçu})}}",
"custom": "{message}",
"required_field": "Ce champ est obligatoire",
"invalid_field": "Valeur invalide"
}
},
"explore": {
@@ -1555,6 +1555,21 @@
"email": "अमान्य ईमेल पता",
"username": "उपयोक्तानाम खाली नहीं हो सकता",
"fullname": "नाम कम से कम 5 अक्षर का होना चाहिए"
},
"generic": {
"invalid_type": "अमान्य प्रकार{अपेक्षित, चयन, अपरिभाषित{} अन्य{। अपेक्षित {अपेक्षित}} {प्राप्त, चयन, अपरिभाषित {} अन्य { (प्राप्त {प्राप्त})}}",
"too_big": "मान बहुत बड़ा है {अधिकतम, चयन करें, अपरिभाषित {} अन्य {। अधिकतम {अधिकतम}}}",
"too_small": "मान बहुत छोटा है {न्यूनतम, चयन करें, अपरिभाषित {} अन्य {। न्यूनतम {न्यूनतम}}}",
"invalid_format": "अमान्य प्रारूप{सत्यापन, चयन, अपरिभाषित{} अन्य{ {सत्यापन}}} के लिए",
"not_multiple_of": "मान {multipleOf} का गुणज होना चाहिए",
"unrecognized_keys": "अज्ञात कुंजियाँ शामिल हैं {कुंजियाँ, चयन करें, अपरिभाषित{} अन्य{: {कुंजियाँ}}}",
"invalid_union": "प्रदत्त विकल्पों के लिए अमान्य मान {संघत्रुटि, चयन, अपरिभाषित{} अन्य{। {unionErrors} विकल्प विफल रहे}}",
"invalid_key": "अमान्य कुंजी{कुंजी, चयन, अपरिभाषित{} अन्य{: {कुंजी}}}",
"invalid_element": "अमान्य तत्व {सूचकांक, चयन, अपरिभाषित {} अन्य {सूचकांक {सूचकांक}}} पर",
"invalid_value": "अमान्य मान{अपेक्षित, चयन, अपरिभाषित{} अन्य{। अपेक्षित {अपेक्षित}} {प्राप्त, चयन, अपरिभाषित {} अन्य { (प्राप्त {प्राप्त})}}",
"custom": "{संदेश}",
"required_field": "यह फ़ील्ड आवश्यक है",
"invalid_field": "अमान्य मान"
}
},
"explore": {
@@ -94,6 +94,21 @@
"email": "Nieprawidłowy adres e -mail",
"username": "Nazwa użytkownika nie może być pusta",
"fullname": "Nazwa powinna mieć minimum 5 znaków"
},
"generic": {
"invalid_type": "Nieprawidłowy typ{oczekiwany, wybierz, niezdefiniowany{} inny{. Oczekiwany {oczekiwany}}}{otrzymany, wybierz, niezdefiniowany{} inny{ (otrzymany {otrzymany})}}",
"too_big": "Wartość jest za duża{maksymalna, wybierz, niezdefiniowana{} inna{. Maksymalnie {maksimum}}}",
"too_small": "Wartość jest za mała{minimum, wybierz, niezdefiniowane{} inne{. Minimum {minimum}}}",
"invalid_format": "Nieprawidłowy format{validacja, wybierz, niezdefiniowany{} other{ for {validation}}}",
"not_multiple_of": "Wartość musi być wielokrotnością {multipleOf}",
"unrecognized_keys": "Zawiera nierozpoznane klucze{klucze, wybierz, niezdefiniowane{} inne{: {klucze}}}",
"invalid_union": "Nieprawidłowa wartość podanych opcji{unionErrors, wybierz, niezdefiniowane{} inne{. Niepowodzenie opcji: {unionErrors}}}",
"invalid_key": "Nieprawidłowy klucz{klucz, wybierz, niezdefiniowany{} inny{: {klucz}}}",
"invalid_element": "Nieprawidłowy element{index, wybierz, niezdefiniowany{} other{ w indeksie {index}}}",
"invalid_value": "Nieprawidłowa wartość{oczekiwana, wybierz, niezdefiniowana{} inna{. Oczekiwany {oczekiwany}}}{otrzymany, wybierz, niezdefiniowany{} inny{ (otrzymany {otrzymany})}}",
"custom": "{wiadomość}",
"required_field": "To pole jest wymagane",
"invalid_field": "Nieprawidłowa wartość"
}
},
"generic": {
@@ -1555,6 +1555,21 @@
"email": "Endereço de email invalido",
"username": "O nome de usuário não pode ficar vazio",
"fullname": "O nome deve ter no mínimo 5 caracteres"
},
"generic": {
"invalid_type": "Tipo inválido{esperado, selecionado, indefinido{} outro{. Esperado {esperado}}}{recebido, selecionado, indefinido{} outro{ (recebido {recebido})}}",
"too_big": "O valor é muito grande{máximo, seleção, indefinido{} outro{. Máximo {máximo}}}",
"too_small": "O valor é muito pequeno{mínimo, selecione, indefinido{} outro{. Mínimo {mínimo}}}",
"invalid_format": "Formato inválido{validação, seleção, indefinido{} outro{ para {validação}}}",
"not_multiple_of": "O valor precisa ser um múltiplo de {multipleOf}",
"unrecognized_keys": "Contém chaves não reconhecidas{keys, select, undefined{} other{: {keys}}}",
"invalid_union": "Valor inválido para opções fornecidas{unionErrors, select, indefinido{} other{. Falha na(s) opção(ões) {unionErrors}}}",
"invalid_key": "Chave inválida{chave, seleção, indefinida{} outra{: {chave}}}",
"invalid_element": "Elemento inválido{index, select, indefinido{} other{ no índice {index}}}",
"invalid_value": "Valor inválido{esperado, selecionado, indefinido{} outro{. Esperado {esperado}}}{recebido, selecionado, indefinido{} outro{ (recebido {recebido})}}",
"custom": "{mensagem}",
"required_field": "Este campo é obrigatório",
"invalid_field": "Valor inválido"
}
},
"explore": {
@@ -1555,6 +1555,21 @@
"email": "Неверный адрес электронной почты",
"username": "Имя пользователя не может быть пустым",
"fullname": "Имя должно состоять минимум из 5 символов."
},
"generic": {
"invalid_type": "Неверный тип {ожидаемый, выбранный, неопределенный{} другое{. Ожидается {ожидается}}}{получено, выберите, неопределенное{} другое { (получено {получено})}}",
"too_big": "Значение слишком велико{максимум, выберите, неопределенное{} другое{. Максимум {максимум}}}",
"too_small": "Значение слишком мало{минимальное, выберите, неопределенное{} другое{. Минимум {минимум}}}",
"invalid_format": "Неверный формат{проверка, выбор, неопределенное{} другое{ для {проверка}}}",
"not_multiple_of": "Значение должно быть кратно {multipleOf}.",
"unrecognized_keys": "Содержит нераспознанные ключи{keys, select, undefine{}other{: {keys}}}",
"invalid_union": "Недопустимое значение для предоставленных параметров{unionErrors, select, undefine{}other{. Вариант(ы) {unionErrors} не выполнен}}",
"invalid_key": "Неверный ключ{key, select, undefine{}other{: {key}}}",
"invalid_element": "Неверный элемент{index, select, undefined{}other{ по индексу {index}}}",
"invalid_value": "Недопустимое значение{ожидаемое, выбранное, неопределенное{} другое{. Ожидается {ожидается}}}{получено, выберите, неопределенное{} другое { (получено {получено})}}",
"custom": "{сообщение}",
"required_field": "Это поле обязательно для заполнения",
"invalid_field": "Недопустимое значение"
}
},
"explore": {
@@ -1555,6 +1555,21 @@
"email": "địa chỉ email không hợp lệ",
"username": "Tên ngươi dung không được để trông",
"fullname": "Tên phải có tối thiểu 5 ký tự"
},
"generic": {
"invalid_type": "Loại không hợp lệ{dự kiến, chọn, không xác định{} khác{. Dự kiến {mong đợi}}}{đã nhận, chọn, không xác định{} khác{ (đã nhận {đã nhận})}}",
"too_big": "Giá trị quá lớn{tối đa, chọn, không xác định{} khác{. Tối đa {tối đa}}}",
"too_small": "Giá trị quá nhỏ{tối thiểu, chọn, không xác định{} khác{. Tối thiểu {tối thiểu}}}",
"invalid_format": "Định dạng không hợp lệ{xác thực, chọn, không xác định{} khác{ cho {xác thực}}}",
"not_multiple_of": "Giá trị phải là bội số của {multipleOf}",
"unrecognized_keys": "Chứa các khóa không được nhận dạng{keys, select, undefind{} other{: {keys}}}",
"invalid_union": "Giá trị không hợp lệ cho các tùy chọn được cung cấp{unionErrors, select, unknown{} other{. {unionErrors} tùy chọn không thành công}}",
"invalid_key": "Khóa không hợp lệ{khóa, chọn, không xác định{} khác{: {key}}}",
"invalid_element": "Phần tử không hợp lệ{chỉ mục, chọn, không xác định{} khác{ tại chỉ mục {index}}}",
"invalid_value": "Giá trị không hợp lệ{dự kiến, chọn, không xác định{} khác{. Dự kiến {mong đợi}}}{đã nhận, chọn, không xác định{} khác{ (đã nhận {đã nhận})}}",
"custom": "{tin nhắn}",
"required_field": "Trường này là bắt buộc",
"invalid_field": "Giá trị không hợp lệ"
}
},
"explore": {