Skip to content

Commit

Permalink
Allow editing the user display name from the account page (#405)
Browse files Browse the repository at this point in the history
  • Loading branch information
antoinejaussoin authored May 9, 2022
1 parent 3f2d00a commit 3cfa9de
Show file tree
Hide file tree
Showing 25 changed files with 120 additions and 40 deletions.
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@ trivy:
docker build -f ./backend/Dockerfile -t retrospected/backend:trivy ./backend
docker build -f ./frontend/Dockerfile -t retrospected/frontend:trivy ./frontend
trivy retrospected/backend:trivy
trivy retrospected/frontend:trivy
trivy retrospected/frontend:trivy

translate:
crowdin push sources
crowdin pre-translate --method=mt --engine-id=316468 -l=fr -l=nl -l=ar -l=de -l=it -l=ja -l=uk
crowdin download
4 changes: 4 additions & 0 deletions backend/src/common/payloads.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,7 @@ export interface DeleteAccountPayload {
export interface ChatMessagePayload {
content: string;
}

export interface ChangeUserNamePayload {
name: string;
}
2 changes: 1 addition & 1 deletion backend/src/db/actions/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ export async function registerUser(
identity.password = registration.password || null;
identity.emailVerification = registration.emailVerification || null;

user.name = registration.name;
user.name = user.name || registration.name;
user.slackUserId = registration.slackUserId || null;
user.slackTeamId = registration.slackTeamId || null;
user.photo = registration.photo || user.photo;
Expand Down
19 changes: 19 additions & 0 deletions backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {
CreateSessionPayload,
SelfHostedCheckPayload,
DeleteAccountPayload,
ChangeUserNamePayload,
} from './common';
import registerPasswordUser from './auth/register/register-user';
import { sendVerificationEmail, sendResetPassword } from './email/emailSender';
Expand Down Expand Up @@ -294,6 +295,24 @@ db().then(() => {
}
});

app.post('/api/me/username', async (req, res) => {
const user = await getUserViewFromRequest(req);
if (!user) {
return res.status(401).send('Please login');
}
const payload = req.body as ChangeUserNamePayload;
const success = await updateUser(user.id, { name: payload.name });
if (success) {
const updated = await getUserView(user.identityId);
if (updated) {
return res.send(updated.toJson());
}
}
return res
.status(500)
.send('Something went wrong while updating the user name');
});

app.delete('/api/me', heavyLoadLimiter, async (req, res) => {
const user = await getUserViewFromRequest(req);
if (user) {
Expand Down
24 changes: 11 additions & 13 deletions frontend/src/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,12 @@ function App() {
) : null}
<Spacer />
<Hidden mdDown>
<HelpUkraine>
<HelpUkraine
href="https://www.gov.uk/government/news/ukraine-what-you-can-do-to-help"
target="_blank"
>
<Flag country="ua" />
<a href="https://www.gov.uk/government/news/ukraine-what-you-can-do-to-help">
{t('Main.helpUkraine')}
</a>
{t('Main.helpUkraine')}
</HelpUkraine>
</Hidden>

Expand Down Expand Up @@ -244,19 +245,16 @@ const Spacer = styled.div`
flex: 1;
`;

const HelpUkraine = styled.div`
const HelpUkraine = styled.a`
display: flex;
align-items: center;
justify-content: center;
margin: 0 20px;
a {
font-style: unset;
text-decoration: unset;
font-size: 1.2rem;
font-weight: 100;
color: #0057b7;
}
border: 1px solid #0057b7;
font-style: unset;
text-decoration: unset;
font-size: 1.2rem;
font-weight: 100;
color: #0057b7;
border-radius: 5px;
padding: 10px;
backdrop-filter: blur(10px);
Expand Down
4 changes: 4 additions & 0 deletions frontend/src/common/payloads.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,7 @@ export interface DeleteAccountPayload {
export interface ChatMessagePayload {
content: string;
}

export interface ChangeUserNamePayload {
name: string;
}
2 changes: 1 addition & 1 deletion frontend/src/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export interface FullUser extends User {
username: string | null;
accountType: AccountType;
photo: string | null;
language: string;
language: string | null;
email: string | null;
canDeleteSession: boolean;
stripeId: string | null;
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/translations/LanguageProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default function LanguageProvider({ children }: PropsWithChildren<{}>) {

useEffect(() => {
if (user) {
i18n.changeLanguage(user.language);
i18n.changeLanguage(user.language || 'en-GB');
}
}, [user, i18n]);

Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/ar-SA.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "لا شكراً"
},
"AccountPage": {
"noEmptyNameError": "لا يمكنك اختيار اسم عرض فارغ. الرجاء المحاولة مرة أخرى.",
"anonymousError": "الحسابات المجهولة المصدر لا يمكن الوصول إلى ملفها الشخصي (لأنها لا تملك ملفاً).",
"details": {
"header": "التفاصيل الخاصة بك",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Nein danke"
},
"AccountPage": {
"noEmptyNameError": "Sie können keinen leeren Anzeigenamen auswählen. Bitte versuchen Sie es erneut.",
"anonymousError": "Anonyme Konten können keinen Zugriff auf ihr Profil haben (weil sie kein Profil haben).",
"details": {
"header": "Ihre Details",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/en-GB.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "No thanks"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Anonymous accounts cannot have access to their profile (because they don't have one).",
"details": {
"header": "Your Details",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/es-ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "No gracias"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Las cuentas anónimas no pueden tener acceso a su perfil (porque no tienen una).",
"details": {
"header": "Tus detalles",
Expand Down
41 changes: 21 additions & 20 deletions frontend/src/translations/locales/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
},
"Main": {
"hint": "Vous pouvez inviter d'autres participants en leur envoyant l'URL de cette page",
"helpUkraine": "Aidez l'Ukraine!",
"helpUkraine": "Aidez l'Ukraine !",
"loading": "Chargement en cours...",
"unlicenced": {
"title": "Retrospected est sans licence"
Expand All @@ -30,7 +30,7 @@
"votes_one": "vote",
"votes_other": "votes",
"actions_one": "action",
"actions_other": "action"
"actions_other": "actions"
},
"Column": {
"createGroupTooltip": "Créer un groupe"
Expand Down Expand Up @@ -202,11 +202,11 @@
},
"Register": {
"header": "S'enregistrer",
"info": "Enregistrez un nouveau compte Retrospected.",
"info": "Enregistrez un nouveau compte Retrospected !",
"registerButton": "Créer un compte",
"errorAlreadyRegistered": "Désolé, cet email est déjà enregistré",
"errorGeneral": "Une erreur s'est produite lors de la tentative de création de votre compte.",
"messageSuccess": "Merci! Vous devriez recevoir un e-mail sous peu pour valider votre compte.",
"messageSuccess": "Merci ! Vous devriez recevoir un e-mail sous peu pour valider votre compte.",
"errorInvalidEmail": "Merci d'entrer un email valide"
},
"ValidateAccount": {
Expand Down Expand Up @@ -237,7 +237,7 @@
"inviteButton": "Inviter",
"dialog": {
"title": "Invitez des participants à votre retrospective",
"text": "Pour inviter des participants à votre session retrospected, envoyez leur le lien suivant",
"text": "Pour inviter des participants à votre session Retrospected, envoyez leur le lien suivant",
"copyButton": "Copier"
}
},
Expand All @@ -253,20 +253,21 @@
},
"DeleteSession": {
"header": "Supprimer \"{{name}}\" ?",
"firstLine": "Effacer une session est irreversible. Tout les posts, groupes, votes et la session elle-même vont être effacés. Les données ne peuvent être récupérée.",
"secondLine": "Êtes-vous certain(e) de vouloir effaçer cette session et son contenu ?",
"firstLine": "Effacer une session est irréversible. Tous les posts, groupes, votes et la session elle-même vont être effacés. Les données ne peuvent être récupérée.",
"secondLine": "Êtes-vous certain(e) de vouloir effacer cette session et son contenu ?",
"yesImSure": "Oui, j'en suis sûr",
"cancel": "Non, je me suis trompé(e)"
},
"RevealCards": {
"buttonLabel": "Révéler",
"dialogTitle": "Révéler tous les posts",
"dialogContent": "Cela va révéler (déflouter) tout les posts. L'opération n'est pas reversible.",
"dialogContent": "Cela va révéler (déflouter) tous les posts. L'opération n'est pas réversible.",
"confirmButton": "Révéler",
"cancelButton": "Non merci"
},
"AccountPage": {
"anonymousError": "Les comptes anonymes ne peuvent avoir accès à leur profile (puisque ils n'en ont pas).",
"noEmptyNameError": "Vous ne pouvez pas choisir un nom d'affichage vide. Veuillez réessayer.",
"anonymousError": "Les comptes anonymes ne peuvent avoir accès à leur profil (puisqu'ils n'en ont pas).",
"details": {
"header": "Vos Coordonnées",
"username": "Nom d'utilisateur",
Expand All @@ -283,13 +284,13 @@
"header": "Votre Abonnement",
"manageButton": "Gérer mon abonnement",
"membersEditor": {
"title": "Votre Equipe",
"limitReached": "Vous avez atteint le nombre maximum de membres ({{limit}}) permis par votre abonnement. Vous pouvez passer à l'abonnement Company pour un nombre de collaborateur illimité.",
"info": "Ajouter des addresses emails ci-dessous pour donner un accès Pro à vos collaborateurs (dans la limite de {{limit}} collaborateurs). Appuyez sur Entrée après chaque email."
"title": "Votre Équipe",
"limitReached": "Vous avez atteint le nombre maximum de membres ({{limit}}) permis par votre abonnement. Vous pouvez passer à l'abonnement Unlimited pour un nombre de collaborateur illimité.",
"info": "Ajouter des adresses emails ci-dessous pour donner un accès Pro à vos collaborateurs (dans la limite de {{limit}} collaborateurs). Appuyez sur Entrée après chaque email."
}
},
"trial": {
"header": "Votre Periode d'Essai",
"header": "Votre Période d'Essai",
"yourTrialWillExpireIn": "Votre période d'essai va se terminer dans {{date}}.",
"subscribe": "S'abonner"
},
Expand All @@ -301,26 +302,26 @@
"confirm": {
"title": "Êtes-vous absolument certain(e) ?",
"description": "Cette opération n'est pas réversible !",
"confirmation": "Oui, je veux effaçer toutes mes données",
"confirmation": "Oui, je veux effacer toutes mes données",
"cancellation": "J'ai changé d'avis !"
},
"subheader": "Choisir quoi effacer",
"deleteAccount": "Effacer votre compte ainsi que toutes les identités liées à votre email.",
"recommended": "Recommandé",
"deleteSessions": {
"main": "Effacer les sessions (les rétrospectives) que vous avez créées ?",
"selected": "Vos sessions, and toutes les données associées (incluant les posts et votes d'autres personnes) seront éffacées de manière permanente et irréversible.",
"unselected": "Vos sessions seront conservées, et leur auteur deviendra un auteur anonyme."
"selected": "Vos sessions, and toutes les données associées (incluant les posts et votes d'autres personnes) seront effacées de manière permanente et irréversible.",
"unselected": "Vos sessions seront conservées et leur auteur deviendra un auteur anonyme."
},
"deletePosts": {
"main": "Effacer les posts que vous avez écris ?",
"selected": "Vos posts, dans n'importe quelle session, ainsi que les votes associés, seront effacés de manière permanente et irreversible.",
"main": "Effacer les posts que vous avez écrit ?",
"selected": "Vos posts, dans n'importe quelle session, ainsi que les votes associés, seront effacés de manière permanente et irréversible.",
"unselected": "Vos posts seront conservés, mais leur auteur deviendra un compte anonyme."
},
"deleteVotes": {
"main": "Effacer vos votes ?",
"selected": "Vos votes, dans n'importe quelle session, seront effacés.",
"unselected": "Vos votes seront conservés, et deviendront anonymes."
"unselected": "Vos votes seront conservés et deviendront anonymes."
},
"deleteAccountButton": "SUPPRIMER VOTRE COMPTE",
"cancelButton": "Annuler"
Expand All @@ -332,7 +333,7 @@
"alertAlreadySubscribed": "Vous avez déjà un abonnement, vous n'avez peut-être donc pas besoin d'un abonnement supplémentaire.",
"currency": {
"title": "Devise",
"description": "Choisissez une devise de facturation.",
"description": "Choisissez une devise de facturation",
"warning": "Votre compte est déjà en {{currency}}, vous ne pouvez donc plus en changer."
},
"plan": {
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/hu-HU.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Nem köszönöm"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Az anonim fiókok nem férhetnek hozzá a profiljukhoz (mert nincs ilyenük).",
"details": {
"header": "Az adataid",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/it-IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "No grazie"
},
"AccountPage": {
"noEmptyNameError": "Non puoi scegliere un nome di visualizzazione vuoto. Per favore riprova.",
"anonymousError": "Gli account anonimi non possono avere accesso al loro profilo (perché non ne hanno uno).",
"details": {
"header": "I Tuoi Dettagli",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "いいえ結構です"
},
"AccountPage": {
"noEmptyNameError": "空の表示名を選択することはできません。もう一度やり直してください。",
"anonymousError": "匿名のアカウントはプロフィールへのアクセス権を持つことはできません(そのアカウントがないので)",
"details": {
"header": "詳細",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/nl-NL.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Nee, bedankt"
},
"AccountPage": {
"noEmptyNameError": "U kunt geen lege weergavenaam kiezen. Probeer het opnieuw.",
"anonymousError": "Anonieme accounts kunnen geen toegang hebben tot hun profiel (omdat ze geen account hebben).",
"details": {
"header": "Uw gegevens",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/pl-PL.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Nie, dziękuję"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Anonimowe konta nie mogą mieć dostępu do swojego profilu (ponieważ nie mają nich).",
"details": {
"header": "Twoje dane",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Não, obrigado."
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Contas anônimas não podem ter acesso ao seu perfil (porque não têm uma).",
"details": {
"header": "Suas informações",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/pt-PT.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Não, obrigado."
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "Contas anônimas não podem ter acesso ao seu perfil (porque não têm uma).",
"details": {
"header": "Suas informações",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/uk-UA.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "Ні, дякую"
},
"AccountPage": {
"noEmptyNameError": "Не можна вибрати пусте ім'я дисплея. Будь ласка, спробуйте ще раз.",
"anonymousError": "Анонімні акаунти не можуть мати доступу до свого профілю (адже вони не мають).",
"details": {
"header": "Ваші дані",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "不要谢谢。"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "匿名帐户不能访问他们的个人资料 (因为他们没有一个)。",
"details": {
"header": "您的详细信息",
Expand Down
1 change: 1 addition & 0 deletions frontend/src/translations/locales/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@
"cancelButton": "不,謝謝"
},
"AccountPage": {
"noEmptyNameError": "You cannot choose an empty display name. Please try again.",
"anonymousError": "匿名帳戶無法訪問他們的個人資料(因為他們沒有個人資料)。",
"details": {
"header": "你的資料",
Expand Down
Loading

0 comments on commit 3cfa9de

Please sign in to comment.