Skip to content

ECHO-673 Fixes#445

Merged
spashii merged 1 commit intomainfrom
testing
Feb 16, 2026
Merged

ECHO-673 Fixes#445
spashii merged 1 commit intomainfrom
testing

Conversation

@ussaama
Copy link
Contributor

@ussaama ussaama commented Feb 16, 2026

Summary by CodeRabbit

  • New Features

    • Added redacted text display with styled badges and tooltips for sensitive information (addresses, emails, IDs, etc.).
    • Implemented automatic file upload for custom logos on file selection.
  • UI/UX Improvements

    • Updated icons throughout the application for improved visual consistency.
  • Localization

    • Added translations for new redacted field labels across all supported languages.

@linear
Copy link

linear bot commented Feb 16, 2026

ECHO-673 fixes

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 16, 2026

Walkthrough

This PR introduces anonymization badge rendering for sensitive data, swaps security icons for detective/incognito icons, enables auto-save for logo uploads, and adds a "custom_logos" folder with associated permissions across Directus sync and frontend components.

Changes

Cohort / File(s) Summary
Directus Configuration
echo/directus/sync/collections/folders.json, echo/directus/sync/collections/permissions.json
Added "custom_logos" folder entry and expanded read permissions to grant access when folder name contains "custom_logos", alongside existing "Public" folder conditions.
Redacted Text Component
echo/frontend/src/components/common/RedactedText.tsx
New component for rendering anonymized placeholders as styled badges with tooltips, including regex pattern matching, localization support, and memoized parsing logic.
Icon & UI Replacements
echo/frontend/src/components/conversation/ConversationAccordion.tsx, echo/frontend/src/components/project/ProjectPortalEditor.tsx
Replaced ShieldCheckIcon with DetectiveIcon; added IconInfoCircle for Beta badge; removed Logo component in favor of IconRosetteDiscountCheck for visual consistency.
RedactedText Integration
echo/frontend/src/components/conversation/ConversationChunkAudioTranscript.tsx, echo/frontend/src/components/participant/UserChunkMessage.tsx, echo/frontend/src/components/quote/Quote.tsx
Wrapped transcript rendering with RedactedText component to handle anonymized content display with redaction badges and null-state handling.
Logo Upload Auto-Save
echo/frontend/src/components/settings/WhitelabelLogoCard.tsx
Refactored file input to trigger upload immediately on file selection via handleFileChange, eliminating separate upload button and manual submission flow.
Translation Updates
echo/frontend/src/locales/.../*
Added new RedactedText-related translation keys (Address, Card, IBAN, ID, Email, Name, Phone, Username) and updated ProjectPortalEditor references across de-DE, en-US, es-ES, fr-FR, it-IT, and nl-NL locale files.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

improvement, bug

🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'ECHO-673 Fixes' references a ticket but lacks specificity about what was actually fixed. Consider a more descriptive title like 'ECHO-673: UI improvements for anonymization and whitelabel uploads' that summarizes the primary changes.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed All objectives from ECHO-673 are addressed: icon replacements (shield→detective), info icons added, logo removals implemented, redacted text component with blue styling introduced, and whitelabel auto-upload behavior implemented.
Out of Scope Changes check ✅ Passed All changes directly support ECHO-673 objectives: new RedactedText component, icon swaps, permission updates for custom_logos folder, locale updates, and WhitelabelLogoCard refactor are all within scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch testing

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
echo/frontend/src/components/settings/WhitelabelLogoCard.tsx (1)

91-147: ⚠️ Potential issue | 🟠 Major

Add inline error feedback for upload/remove mutations.

Auto-upload makes toast-only errors easy to miss. Please surface failures inline (Mantine Alert) near the FileInput.

💡 One possible pattern
+ const [logoError, setLogoError] = useState<string | null>(null);
  const uploadMutation = useMutation({
    ...
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["users", "me"] });
      setFile(null);
+     setLogoError(null);
      toast.success(t`Logo updated successfully`);
    },
    onError: () => {
+     setLogoError(t`Failed to upload logo`);
      toast.error(t`Failed to upload logo`);
    },
  });

  return (
    <Card withBorder p="lg" radius="md">
      <Stack gap="md">
+       {logoError ? (
+         <Alert color="red" variant="light">
+           {logoError}
+         </Alert>
+       ) : null}
        ...
      </Stack>
    </Card>
  );

As per coding guidelines, surface UI mutations with inline feedback: pair toasts with contextual Mantine Alert components inside modals/forms for errors or warnings.

echo/frontend/src/locales/it-IT.po (1)

8-8: ⚠️ Potential issue | 🟡 Minor

Language header says en-US but this is it-IT.po.

Line 8 has "Language: en-US\n" — should be "Language: it-IT\n". Likely a pre-existing issue from the initial file setup, but worth fixing to keep metadata accurate.

🤖 Fix all issues with AI agents
In `@echo/directus/sync/collections/folders.json`:
- Around line 2-6: The JSON contains a duplicate root-level folder entry with
"name": "custom_logos" (this diff adds _syncId
"416965c6-7695-4235-8322-8515c9a05820"), which will create a third ambiguous
root folder—remove this duplicate and keep a single canonical root entry for
"custom_logos"; specifically, delete the added object (the one with parent: null
and _syncId "416965c6-7695-4235-8322-8515c9a05820") or merge any unique metadata
into the existing canonical "custom_logos" record so only one root folder with
name "custom_logos" remains in folders.json.

In `@echo/frontend/src/components/common/RedactedText.tsx`:
- Around line 87-94: The conditional in the RedactedText component is redundant
because both branches return identical JSX; simplify by removing the if-check
and directly returning <span className={className}>{rendered}</span> where
`rendered` comes from useMemo(parseRedactedText(children)); update the component
body to compute `rendered` (via useMemo and parseRedactedText) and then return
the single span using `className` and `rendered`.

In
`@echo/frontend/src/components/conversation/ConversationChunkAudioTranscript.tsx`:
- Around line 69-74: In the ConversationChunkAudioTranscript JSX where the
ternary renders status spans (the branch using chunk.error / !chunk.transcript
and the span with className "italic text-gray-500"), replace the hardcoded
Tailwind color utility with a theme CSS variable token (e.g., use a class that
applies color: var(--color-text-muted) or Tailwind arbitrary value referencing
the token) so the status text uses the theme token instead of text-gray-500;
ensure the token name you reference (for example --color-text-muted) exists in
the global CSS/theme and update both span occurrences (the "Unable to process
this chunk" and "Transcribing...") so they consistently use the token while
keeping the italic utility class and the rest of the markup (including
RedactedText) unchanged.

In `@echo/frontend/src/components/participant/UserChunkMessage.tsx`:
- Around line 105-115: The Paper message bubble currently hardcodes its
background with the utility class bg-gray-100; replace that hardcoded color with
a CSS theme token and update the Paper className to use the token-based
background instead (e.g. remove bg-gray-100 and reference a CSS variable like
--color-surface in the className or inline style). Update your theme/stylesheet
to ensure the token (e.g. --color-surface) is defined for the app and used for
message bubbles, and keep other utilities (my-2, rounded-*, border-0, p-4)
unchanged; verify rendering in UserChunkMessage (the Paper component rendering
chunk.transcript) after the change.

In `@echo/frontend/src/components/project/ProjectPortalEditor.tsx`:
- Around line 1223-1226: Replace the hardcoded Tailwind class on the
IconInfoCircle (currently using className="text-gray-400") with a CSS-variable
based color so theme switching works; locate the IconInfoCircle usage in
ProjectPortalEditor and set its color via a style or class that references the
Mantine/theme CSS variable (e.g. use style={{ color:
'var(--your-theme-color-variable)' }} or a utility class that maps to that
variable) instead of "text-gray-400", ensuring the variable used matches the
app's existing theme variables.

In `@echo/frontend/src/components/settings/WhitelabelLogoCard.tsx`:
- Around line 84-88: The file input remains selected after a failed auto-upload,
preventing re-selecting the same file; update the upload failure path to clear
the selected file so users can retry. In the upload mutation's onError handler
(the uploadMutation used in handleFileChange) call setFile(null) or clear the
input's value (via the input ref) to reset the FileInput, or add the UI
component's clearable prop so the control is cleared on error; ensure this
change is applied where uploadMutation.mutate is defined/handled (the
uploadMutation onError callback) so the selection is reset after a failure.

In `@echo/frontend/src/locales/de-DE.po`:
- Around line 4371-4373: The source copy in ProjectPortalEditor.tsx currently
uses "AI" in the prompt string (the msgid shown) and must be changed to
"language model"; update the string literal in
src/components/project/ProjectPortalEditor.tsx (the prompt passed/defined around
the code referenced by the msgid) to replace “AI” with “language model”, then
re-run the i18n extraction (lingui/cli or your project’s extraction tool) to
regenerate the .po files instead of editing echo/frontend/src/locales/de-DE.po
directly.
- Around line 4695-4697: Update the source UI strings in the WhitelabelLogoCard
component to use lowercase "dembrane" (replace "Dembrane" → "dembrane" in the
strings used by WhitelabelLogoCard.tsx, including the sentence that currently
reads "Upload a custom logo to replace the Dembrane logo..."), then re-run the
i18n extractor (pnpm messages:extract) so the .po files are regenerated instead
of manually editing locales; ensure you update all occurrences referenced in
that component (also the other occurrence noted around the same component)
before extracting.

In `@echo/frontend/src/locales/it-IT.po`:
- Around line 656-658: Several RedactedText translations in it-IT.po are still
English; find the RedactedText entries (from
src/components/common/RedactedText.tsx, e.g. msgid "Address" and the other
RedactedText msgids in the listed ranges) and replace their English msgstr
values with the correct Italian translations (for example "Address" ->
"Indirizzo"). Update every occurrence in it-IT.po that currently has an English
msgstr so it matches the translations used in other locales (de-DE, es-ES,
fr-FR, nl-NL) before merging to production.

In `@echo/frontend/src/locales/nl-NL.po`:
- Around line 2218-2219: Replace the current Dutch translation for the msgid
"Guide how titles are generated. Titles describe the topic of the conversation,
not the participant." by updating the msgstr to a more natural phrasing: "Leg
uit hoe titels worden gegenereerd. Titels beschrijven het onderwerp van het
gesprek, niet de deelnemer." — adjust the msgstr entry in the nl-NL.po file so
it replaces the existing "Gids hoe titels worden gegenereerd. Titels beschrijven
het onderwerp van het gesprek, niet de deelnemer." text.
- Around line 1423-1424: The Dutch translation for the string identified by
msgid "Deleted successfully" is incorrectly ordered; update msgstr in nl-NL.po
from "Verwijderd succesvol" to the correct phrasing "Succesvol verwijderd" so
the translation reads naturally; locate the entry with msgid "Deleted
successfully" and replace its msgstr value accordingly.
- Around line 4496-4497: Update the Dutch translation for the given msgid so it
uses informal "je/jij" instead of formal "u/uw": modify the msgstr for "This is
a live preview of the participant's portal. You will need to refresh the page to
see the latest changes." to "Dit is een live voorbeeld van het portaal van de
deelnemer. Je moet de pagina vernieuwen om de meest recente wijzigingen te
bekijken." ensuring the msgid remains unchanged.
- Around line 5005-5006: Update the Dutch translation for the msgid "Verify
Topics": replace the current msgstr "Verifiëren Themen" with the grammatically
correct "Verifiëren thema’s" so the translation uses the correct Dutch
plural/possessive form; locate the entry for msgid "Verify Topics" and update
its msgstr accordingly.
- Around line 4879-4881: The Dutch translation for the string with msgid "Upload
a custom logo to replace the Dembrane logo across the portal, dashboard,
reports, and host guide." contains typos and anglicisms; update the msgstr to
the corrected Dutch suggested: "Upload een aangepast logo om het dembrane‑logo
te vervangen in het portaal, dashboard, rapporten en hostgids." so the msgstr
matches that exact corrected phrasing for the same msgid.
- Around line 1696-1698: Update the Dutch translation for the message used in
ProjectPortalEditor (the msgid that starts "Enable this feature to allow
participants...") by replacing "AI" with "taalmodel", removing the duplicated
idea in the second sentence to tighten the copy, and produce a concise Dutch
msgstr that conveys participants can click "Verkennen" after recording to get
contextual feedback and that a cooldown applies; apply the same change to the
other identical occurrence referenced (the msgid at the other location noted in
the comment, e.g., lines 4544-4547) so both msgstr entries use "taalmodel" and
the tightened wording.

Comment on lines +2 to +6
{
"name": "custom_logos",
"parent": null,
"_syncId": "416965c6-7695-4235-8322-8515c9a05820"
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Avoid duplicate root custom_logos folders.

You’re adding a third root-level custom_logos entry while two already exist (Line 13–20). Directus will create multiple folders with the same name, making lookups and permission scoping ambiguous. Keep a single canonical entry and dedupe the rest.

🐛 Proposed fix (dedupe if existing entries are canonical)
-  {
-    "name": "custom_logos",
-    "parent": null,
-    "_syncId": "416965c6-7695-4235-8322-8515c9a05820"
-  },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{
"name": "custom_logos",
"parent": null,
"_syncId": "416965c6-7695-4235-8322-8515c9a05820"
},
🤖 Prompt for AI Agents
In `@echo/directus/sync/collections/folders.json` around lines 2 - 6, The JSON
contains a duplicate root-level folder entry with "name": "custom_logos" (this
diff adds _syncId "416965c6-7695-4235-8322-8515c9a05820"), which will create a
third ambiguous root folder—remove this duplicate and keep a single canonical
root entry for "custom_logos"; specifically, delete the added object (the one
with parent: null and _syncId "416965c6-7695-4235-8322-8515c9a05820") or merge
any unique metadata into the existing canonical "custom_logos" record so only
one root folder with name "custom_logos" remains in folders.json.

Comment on lines +87 to +94
}) => {
const rendered = useMemo(() => parseRedactedText(children), [children]);

if (typeof rendered === "string") {
return <span className={className}>{rendered}</span>;
}

return <span className={className}>{rendered}</span>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Redundant conditional — both branches are identical.

Lines 90-94: the if (typeof rendered === "string") and else branches return the exact same JSX. Ship it cleaner:

♻️ Proposed fix
 export const RedactedText = ({
 	children,
 	className,
 }: {
 	children: string;
 	className?: string;
 }) => {
 	const rendered = useMemo(() => parseRedactedText(children), [children]);
-
-	if (typeof rendered === "string") {
-		return <span className={className}>{rendered}</span>;
-	}
-
 	return <span className={className}>{rendered}</span>;
 };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
}) => {
const rendered = useMemo(() => parseRedactedText(children), [children]);
if (typeof rendered === "string") {
return <span className={className}>{rendered}</span>;
}
return <span className={className}>{rendered}</span>;
}) => {
const rendered = useMemo(() => parseRedactedText(children), [children]);
return <span className={className}>{rendered}</span>;
🤖 Prompt for AI Agents
In `@echo/frontend/src/components/common/RedactedText.tsx` around lines 87 - 94,
The conditional in the RedactedText component is redundant because both branches
return identical JSX; simplify by removing the if-check and directly returning
<span className={className}>{rendered}</span> where `rendered` comes from
useMemo(parseRedactedText(children)); update the component body to compute
`rendered` (via useMemo and parseRedactedText) and then return the single span
using `className` and `rendered`.

Comment on lines +69 to +74
{chunk.error ? (
<span className="italic text-gray-500">{t`Unable to process this chunk`}</span>
) : !chunk.transcript ? (
<span className="italic text-gray-500">{t`Transcribing...`}</span>
) : (
<RedactedText>{chunk.transcript}</RedactedText>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Swap Tailwind gray to a theme token for status text.
text-gray-500 hardcodes a theme color; use a CSS variable token instead. LGTM once aligned.

♻️ Suggested fix
-			{chunk.error ? (
-				<span className="italic text-gray-500">{t`Unable to process this chunk`}</span>
-			) : !chunk.transcript ? (
-				<span className="italic text-gray-500">{t`Transcribing...`}</span>
-			) : (
+			{chunk.error ? (
+				<span className="italic" style={{ color: "var(--app-text)" }}>
+					{t`Unable to process this chunk`}
+				</span>
+			) : !chunk.transcript ? (
+				<span className="italic" style={{ color: "var(--app-text)" }}>
+					{t`Transcribing...`}
+				</span>
+			) : (
 				<RedactedText>{chunk.transcript}</RedactedText>
 			)}
As per coding guidelines: “Keep static utility classes (borders, spacing, layout) in Tailwind; move theme-dependent colors to CSS variables.”
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{chunk.error ? (
<span className="italic text-gray-500">{t`Unable to process this chunk`}</span>
) : !chunk.transcript ? (
<span className="italic text-gray-500">{t`Transcribing...`}</span>
) : (
<RedactedText>{chunk.transcript}</RedactedText>
{chunk.error ? (
<span className="italic" style={{ color: "var(--app-text)" }}>
{t`Unable to process this chunk`}
</span>
) : !chunk.transcript ? (
<span className="italic" style={{ color: "var(--app-text)" }}>
{t`Transcribing...`}
</span>
) : (
<RedactedText>{chunk.transcript}</RedactedText>
)}
🤖 Prompt for AI Agents
In
`@echo/frontend/src/components/conversation/ConversationChunkAudioTranscript.tsx`
around lines 69 - 74, In the ConversationChunkAudioTranscript JSX where the
ternary renders status spans (the branch using chunk.error / !chunk.transcript
and the span with className "italic text-gray-500"), replace the hardcoded
Tailwind color utility with a theme CSS variable token (e.g., use a class that
applies color: var(--color-text-muted) or Tailwind arbitrary value referencing
the token) so the status text uses the theme token instead of text-gray-500;
ensure the token name you reference (for example --color-text-muted) exists in
the global CSS/theme and update both span occurrences (the "Unable to process
this chunk" and "Transcribing...") so they consistently use the token while
keeping the italic utility class and the rest of the markup (including
RedactedText) unchanged.

Comment on lines +105 to +115
<Paper className="my-2 rounded-t-xl rounded-bl-xl border-0 bg-gray-100 p-4">
<Text className="prose text-sm">
{chunk.transcript == null ? (
<Markdown content={t`*Transcription in progress.*`} />
) : chunk.transcript.includes("<redacted_") ? (
<RedactedText>{chunk.transcript}</RedactedText>
) : (
<Markdown content={chunk.transcript} />
)}
</Text>
</Paper>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use a theme token for the message bubble background.
bg-gray-100 hardcodes a theme color; swap to a CSS variable token. LGTM once aligned.

♻️ Suggested fix
-		<Paper className="my-2 rounded-t-xl rounded-bl-xl border-0 bg-gray-100 p-4">
+		<Paper
+			className="my-2 rounded-t-xl rounded-bl-xl border-0 p-4"
+			style={{ backgroundColor: "var(--app-background)" }}
+		>
As per coding guidelines: “Keep static utility classes (borders, spacing, layout) in Tailwind; move theme-dependent colors to CSS variables.”
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Paper className="my-2 rounded-t-xl rounded-bl-xl border-0 bg-gray-100 p-4">
<Text className="prose text-sm">
{chunk.transcript == null ? (
<Markdown content={t`*Transcription in progress.*`} />
) : chunk.transcript.includes("<redacted_") ? (
<RedactedText>{chunk.transcript}</RedactedText>
) : (
<Markdown content={chunk.transcript} />
)}
</Text>
</Paper>
<Paper
className="my-2 rounded-t-xl rounded-bl-xl border-0 p-4"
style={{ backgroundColor: "var(--app-background)" }}
>
<Text className="prose text-sm">
{chunk.transcript == null ? (
<Markdown content={t`*Transcription in progress.*`} />
) : chunk.transcript.includes("<redacted_") ? (
<RedactedText>{chunk.transcript}</RedactedText>
) : (
<Markdown content={chunk.transcript} />
)}
</Text>
</Paper>
🤖 Prompt for AI Agents
In `@echo/frontend/src/components/participant/UserChunkMessage.tsx` around lines
105 - 115, The Paper message bubble currently hardcodes its background with the
utility class bg-gray-100; replace that hardcoded color with a CSS theme token
and update the Paper className to use the token-based background instead (e.g.
remove bg-gray-100 and reference a CSS variable like --color-surface in the
className or inline style). Update your theme/stylesheet to ensure the token
(e.g. --color-surface) is defined for the app and used for message bubbles, and
keep other utilities (my-2, rounded-*, border-0, p-4) unchanged; verify
rendering in UserChunkMessage (the Paper component rendering chunk.transcript)
after the change.

Comment on lines +1223 to +1226
<IconInfoCircle
size={20}
className="text-gray-400"
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use CSS variable for icon color, not Tailwind gray.

text-gray-400 hardcodes theme color. Use a CSS variable instead so themes stay consistent.

🔧 Suggested fix
 <IconInfoCircle
   size={20}
-  className="text-gray-400"
+  style={{ color: "var(--mantine-color-gray-5)" }}
 />

As per coding guidelines "When adding new Mantine components, prefer referencing CSS variables in styles over hardcoded hex values" and "Keep theme-dependent colors to CSS variables."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<IconInfoCircle
size={20}
className="text-gray-400"
/>
<IconInfoCircle
size={20}
style={{ color: "var(--mantine-color-gray-5)" }}
/>
🤖 Prompt for AI Agents
In `@echo/frontend/src/components/project/ProjectPortalEditor.tsx` around lines
1223 - 1226, Replace the hardcoded Tailwind class on the IconInfoCircle
(currently using className="text-gray-400") with a CSS-variable based color so
theme switching works; locate the IconInfoCircle usage in ProjectPortalEditor
and set its color via a style or class that references the Mantine/theme CSS
variable (e.g. use style={{ color: 'var(--your-theme-color-variable)' }} or a
utility class that maps to that variable) instead of "text-gray-400", ensuring
the variable used matches the app's existing theme variables.

Comment on lines +1696 to 1698
#: src/components/project/ProjectPortalEditor.tsx:644
msgid "Enable this feature to allow participants to request AI-powered responses during their conversation. Participants can click \"Explore\" after recording their thoughts to receive contextual feedback, encouraging deeper reflection and engagement. A cooldown period applies between requests."
msgstr "Schakel deze functie in zodat deelnemers AI-antwoorden kunnen vragen tijdens hun gesprek. Na het inspreken van hun gedachten kunnen ze op \"Verkennen\" klikken voor contextuele feedback, zodat ze dieper gaan nadenken en meer betrokken raken. Er zit een wachttijd tussen verzoeken."
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Replace “AI” with “taalmodel” and tighten the Dutch copy.

Guideline says “language model” instead of “AI,” and the second sentence is duplicated. Suggested NL rewrite:

💬 Suggested translation update
-msgstr "Schakel deze functie in zodat deelnemers AI-antwoorden kunnen vragen tijdens hun gesprek. Na het inspreken van hun gedachten kunnen ze op \"Verkennen\" klikken voor contextuele feedback, zodat ze dieper gaan nadenken en meer betrokken raken. Er zit een wachttijd tussen verzoeken."
+msgstr "Schakel deze functie in zodat deelnemers antwoorden van het taalmodel kunnen vragen tijdens hun gesprek. Na het inspreken van hun gedachten kunnen ze op \"Verkennen\" klikken voor contextuele feedback. Er zit een wachttijd tussen verzoeken."

-msgstr "Deze prompt bepaalt hoe de AI reageert op deelnemers. Deze prompt stuurt aan hoe de AI reageert"
+msgstr "Deze prompt bepaalt hoe het taalmodel reageert op deelnemers."

As per coding guidelines "use 'language model' instead of 'AI'".

Also applies to: 4544-4547

🤖 Prompt for AI Agents
In `@echo/frontend/src/locales/nl-NL.po` around lines 1696 - 1698, Update the
Dutch translation for the message used in ProjectPortalEditor (the msgid that
starts "Enable this feature to allow participants...") by replacing "AI" with
"taalmodel", removing the duplicated idea in the second sentence to tighten the
copy, and produce a concise Dutch msgstr that conveys participants can click
"Verkennen" after recording to get contextual feedback and that a cooldown
applies; apply the same change to the other identical occurrence referenced (the
msgid at the other location noted in the comment, e.g., lines 4544-4547) so both
msgstr entries use "taalmodel" and the tightened wording.

Comment on lines 2218 to 2219
msgid "Guide how titles are generated. Titles describe the topic of the conversation, not the participant."
msgstr "Gids hoe titels worden gegenereerd. Titels beschrijven het onderwerp van het gesprek, niet de deelnemer."
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Make the Dutch sentence natural.

“Gids hoe …” → “Leg uit hoe …”

🤖 Prompt for AI Agents
In `@echo/frontend/src/locales/nl-NL.po` around lines 2218 - 2219, Replace the
current Dutch translation for the msgid "Guide how titles are generated. Titles
describe the topic of the conversation, not the participant." by updating the
msgstr to a more natural phrasing: "Leg uit hoe titels worden gegenereerd.
Titels beschrijven het onderwerp van het gesprek, niet de deelnemer." — adjust
the msgstr entry in the nl-NL.po file so it replaces the existing "Gids hoe
titels worden gegenereerd. Titels beschrijven het onderwerp van het gesprek,
niet de deelnemer." text.

Comment on lines 4496 to 4497
msgid "This is a live preview of the participant's portal. You will need to refresh the page to see the latest changes."
msgstr "Dit is een live voorbeeld van het portaal van de deelnemer. U moet de pagina vernieuwen om de meest recente wijzigingen te bekijken."
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Gebruik “je/jij” i.p.v. formeel “u/uw”.

Voor consistent NL:
"Je moet de pagina vernieuwen om de meest recente wijzigingen te bekijken."

As per coding guidelines "Dutch localization: use 'je/jij' not 'u/uw'".

🤖 Prompt for AI Agents
In `@echo/frontend/src/locales/nl-NL.po` around lines 4496 - 4497, Update the
Dutch translation for the given msgid so it uses informal "je/jij" instead of
formal "u/uw": modify the msgstr for "This is a live preview of the
participant's portal. You will need to refresh the page to see the latest
changes." to "Dit is een live voorbeeld van het portaal van de deelnemer. Je
moet de pagina vernieuwen om de meest recente wijzigingen te bekijken." ensuring
the msgid remains unchanged.

Comment on lines 4879 to 4881
msgid "Upload a custom logo to replace the Dembrane logo across the portal, dashboard, reports, and host guide."
msgstr "Upload een custom logo om het dembrane logo te vervangen op het portale, dashboard, rapporten, en host gids."

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix typos/anglicisms in custom logo copy.

Suggested:
“Upload een aangepast logo om het dembrane‑logo te vervangen in het portaal, dashboard, rapporten en hostgids.”

🤖 Prompt for AI Agents
In `@echo/frontend/src/locales/nl-NL.po` around lines 4879 - 4881, The Dutch
translation for the string with msgid "Upload a custom logo to replace the
Dembrane logo across the portal, dashboard, reports, and host guide." contains
typos and anglicisms; update the msgstr to the corrected Dutch suggested:
"Upload een aangepast logo om het dembrane‑logo te vervangen in het portaal,
dashboard, rapporten en hostgids." so the msgstr matches that exact corrected
phrasing for the same msgid.

Comment on lines 5005 to 5006
msgid "Verify Topics"
msgstr "Verifiëren Themen"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix Dutch grammar for “Verify Topics”.

“Verifiëren Themen” → “Verifiëren thema’s”.

🤖 Prompt for AI Agents
In `@echo/frontend/src/locales/nl-NL.po` around lines 5005 - 5006, Update the
Dutch translation for the msgid "Verify Topics": replace the current msgstr
"Verifiëren Themen" with the grammatically correct "Verifiëren thema’s" so the
translation uses the correct Dutch plural/possessive form; locate the entry for
msgid "Verify Topics" and update its msgstr accordingly.

@ussaama ussaama requested a review from spashii February 16, 2026 15:52
@spashii spashii merged commit 176aa3b into main Feb 16, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working improvement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants