Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
492 changes: 277 additions & 215 deletions package-lock.json

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"react-dom": "19.2.4",
"react-router-dom": "7.13.0",
"jitar": "0.10.6",
"@maskingtech/designsystem": "0.0.6",
"@maskingtech/designsystem": "0.0.8",
"@maskingtech/react-toolkit": "0.0.4",
"@theshelf/authentication": "0.4.1",
"@theshelf/database": "0.4.1",
Expand All @@ -74,19 +74,19 @@
"devDependencies": {
"@eslint/js": "9.39.2",
"@jitar/plugin-vite": "0.10.6",
"@types/node": "25.0.10",
"@types/react": "19.2.10",
"@types/node": "25.3.0",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "5.1.2",
"@vitejs/plugin-react": "5.1.4",
"@vitest/coverage-v8": "4.0.18",
"cpx2": "8.0.0",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "7.0.1",
"eslint-plugin-sonarjs": "3.0.6",
"rimraf": "6.1.2",
"rimraf": "6.1.3",
"tsc-alias": "1.8.16",
"typescript": "5.9.3",
"typescript-eslint": "8.54.0",
"typescript-eslint": "8.56.0",
"vite": "7.3.1",
"vite-plugin-pwa": "1.2.0",
"vite-tsconfig-paths": "5.1.4",
Expand Down
10 changes: 7 additions & 3 deletions src/apps/social/app/Routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { Route, Routes } from 'react-router-dom';

import accountRoutes from './account';
import { publicRoutes, protectedRoutes, ApplicationLayout, GuestLayout, ProtectedRoute } from './application';
import { legalRoutes, guestRoutes, appRoutes, ApplicationLayout, GuestLayout, LegalLayout, ProtectedRoute } from './application';
import timelineRoutes from './timeline';
import exploreRoutes from './explore';
import notificationRoutes from './notification';
Expand All @@ -16,7 +16,7 @@ export default function Component()
<Route element={<ProtectedRoute />}>

<Route element={<ApplicationLayout />}>
{protectedRoutes}
{appRoutes}
<Route path="/account">{accountRoutes}</Route>
<Route path="/timeline">{timelineRoutes}</Route>
<Route path="/explore">{exploreRoutes}</Route>
Expand All @@ -28,7 +28,11 @@ export default function Component()
</Route>

<Route element={<GuestLayout />}>
{publicRoutes}
{guestRoutes}
</Route>

<Route element={<LegalLayout />}>
{legalRoutes}
</Route>

</Routes>;
Expand Down
111 changes: 111 additions & 0 deletions src/apps/social/app/application/Privacy.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@

import { Column, List, Paragraph, Title } from '@maskingtech/designsystem';

export default function Feature()
{
return <Column gap='large'>


<Column gap='medium'>
<Title size='large'>Privacy Policy</Title>
<Paragraph>
Last updated: February 3, 2026
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>1. Introduction</Title>
<Paragraph>
This Privacy Policy explains how Comify processes personal data in accordance with the General Data Protection Regulation (GDPR).
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>2. Data Controller</Title>
<Paragraph>
The data controller is Masking Technology, Noordwijk, the Netherlands.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>3. Personal Data We Process</Title>
<Paragraph>
We process the following personal data:
</Paragraph>
<List type='unordered'>
<List.Item>Full name and nickname</List.Item>
<List.Item>Email address</List.Item>
<List.Item>Account registration date</List.Item>
<List.Item>Content you create (comics, reactions)</List.Item>
<List.Item>IP address and basic technical data for security purposes</List.Item>
</List>
<Paragraph>
We do not use third-party advertising cookies.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>4. Legal Bases for Processing</Title>
<Paragraph>
We process personal data based on:
</Paragraph>
<List type='unordered'>
<List.Item>Performance of a contract (providing the Comify service)</List.Item>
<List.Item>Legitimate interests (security, platform improvement)</List.Item>
<List.Item>Legal obligations where applicable</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>5. Use of Social Login Providers</Title>
<Paragraph>
If you choose to register or log in using a third-party provider, we receive limited information necessary to create and authenticate your Account.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>6. Cookies</Title>
<Paragraph>
Comify uses only essential cookies required for authentication and basic functionality. No tracking or advertising cookies are used.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>7. Data Retention</Title>
<Paragraph>
We retain personal data for as long as your Account is active or as necessary to comply with legal obligations. IP addresses are retained only as long as required for security purposes.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>8. Your Rights</Title>
<Paragraph>
You have the right to:
</Paragraph>
<List type='unordered'>
<List.Item>Access your personal data</List.Item>
<List.Item>Correct inaccurate data</List.Item>
<List.Item>Request deletion of your data</List.Item>
<List.Item>Restrict or object to processing</List.Item>
<List.Item>Receive your data in a portable format</List.Item>
<List.Item>Lodge a complaint with a supervisory authority</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>9. Security Measures</Title>
<Paragraph>
We take appropriate technical and organizational measures to protect personal data, including encrypted password storage.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>10. Contact</Title>
<Paragraph>
For privacy-related questions or Account deletion requests, contact:
Email: comify@masking.tech
</Paragraph>
Comment on lines +104 to +107
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Optional: make the contact email address a clickable mailto: link.

The email is currently unformatted inline text inside <Paragraph>, which requires users to copy-paste it manually.

✨ Proposed improvement
-import { Column, List, Paragraph, Title } from '@maskingtech/designsystem';
+import { Column, Link, List, Paragraph, Title } from '@maskingtech/designsystem';
         <Column gap='medium'>
             <Title size='medium'>10. Contact</Title>
             <Paragraph>
-                For privacy-related questions or Account deletion requests, contact:
-                Email: comify@masking.tech
+                For privacy-related questions or Account deletion requests, contact: <Link url='mailto:comify@masking.tech'>comify@masking.tech</Link>
             </Paragraph>
         </Column>
📝 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
<Paragraph>
For privacy-related questions or Account deletion requests, contact:
Email: comify@masking.tech
</Paragraph>
import { Column, Link, List, Paragraph, Title } from '@maskingtech/designsystem';
Suggested change
<Paragraph>
For privacy-related questions or Account deletion requests, contact:
Email: comify@masking.tech
</Paragraph>
<Paragraph>
For privacy-related questions or Account deletion requests, contact: <Link url='mailto:comify@masking.tech'>comify@masking.tech</Link>
</Paragraph>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/apps/social/app/application/Privacy.tsx` around lines 104 - 107, Replace
the plain email text inside the Paragraph in the Privacy component with a
clickable mailto link so users can open their email client directly; locate the
Paragraph element in the Privacy (or Privacy.tsx) component and change the email
string to an anchor with href="mailto:comify@masking.tech" (or the app's Link
component configured for external mailto links) and ensure accessibility by
keeping the visible text as "comify@masking.tech".

</Column>

</Column>;
}
13 changes: 10 additions & 3 deletions src/apps/social/app/application/Routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,21 @@ import Home from './Home';
import Login from './Login';
import Identify from './Identify';
import Logout from './Logout';
import Terms from './Terms';
import Privacy from './Privacy';

export const publicRoutes = <Route>
export const legalRoutes = <Route>
<Route path='/terms' element={<Terms />} />
<Route path='/privacy' element={<Privacy />} />
<Route path='*' element={<NotFound />} />
</Route>;
Comment on lines +13 to +17
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find router composition points and route group usage

# Search for where legalRoutes, appRoutes, guestRoutes are used/imported
echo "=== Route group usage outside Routes.tsx ==="
rg -n 'legalRoutes|appRoutes|guestRoutes' --type=tsx --type=ts -g '!**/Routes.tsx' | head -50

echo -e "\n=== Checking for catch-all routes ==="
rg -n "path=.*[\'\"]\\*[\'\"]" --type=tsx --type=ts

echo -e "\n=== Checking for NotFound usage ==="
rg -n 'NotFound' --type=tsx --type=ts

echo -e "\n=== Look for Router/Routes composition ==="
rg -n 'BrowserRouter|RouterProvider|<Routes' --type=tsx --type=ts -C3

Repository: MaskingTechnology/comify

Length of output: 427


🏁 Script executed:

#!/bin/bash
# Find router composition and route usage with corrected syntax

# First, check the file structure
echo "=== Looking for relevant files ==="
find . -type f -name "*.tsx" -o -name "*.ts" | grep -E '(Route|route|app)' | head -20

echo -e "\n=== Route group usage (legalRoutes, appRoutes, guestRoutes) ==="
rg -n 'legalRoutes|appRoutes|guestRoutes' -g '!Routes.tsx' | head -50

echo -e "\n=== Catch-all routes with asterisk ==="
rg -n "path='\\*'|path=\"\\*\"" | head -20

echo -e "\n=== NotFound component usage ==="
rg -n 'NotFound' | head -30

echo -e "\n=== Routes.tsx full content ==="
cat src/apps/social/app/application/Routes.tsx

Repository: MaskingTechnology/comify

Length of output: 5302


🏁 Script executed:

#!/bin/bash
# Check App.tsx for route composition

echo "=== App.tsx content ==="
cat src/apps/social/app/App.tsx

echo -e "\n=== Check for LegalLayout or layout composition ==="
rg -n 'LegalLayout|Layout' src/apps/social/app/ -A 2 -B 2 | head -40

Repository: MaskingTechnology/comify

Length of output: 3356


🏁 Script executed:

#!/bin/bash
# Get the full Routes.tsx file at the app level

echo "=== Full Routes.tsx (app level) ==="
cat src/apps/social/app/Routes.tsx

echo -e "\n=== Check ProtectedRoute to understand its behavior ==="
cat src/apps/social/app/application/ProtectedRoute.tsx

Repository: MaskingTechnology/comify

Length of output: 1712


🏁 Script executed:

#!/bin/bash
# Final check: confirm no other global catch-all exists
echo "=== Verify legalRoutes is the only global catch-all at app level ==="
cat src/apps/social/app/Routes.tsx | grep -n "path=.*\\*"

echo -e "\n=== Verify feature routes each have their own catch-alls ==="
rg -l "path.*\\*" --type ts --type tsx | grep -E '(account|timeline|profile|explore|notification)/Routes'

Repository: MaskingTechnology/comify

Length of output: 243


🏁 Script executed:

#!/bin/bash
# Check a couple feature route files to confirm the pattern
echo "=== Check account/Routes.tsx ==="
cat src/apps/social/app/account/Routes.tsx | head -15

echo -e "\n=== Check timeline/Routes.tsx ==="
cat src/apps/social/app/timeline/Routes.tsx | head -15

Repository: MaskingTechnology/comify

Length of output: 894


Remove the catch-all from legalRoutes or clarify that 404 pages should display within LegalLayout.

The catch-all <Route path='*' element={<NotFound />} /> inside legalRoutes is wrapped by <LegalLayout /> at the app level. This means all unmatched URLs in the entire app (e.g., /badurl) will render the NotFound page with the legal page layout (header and navigation). If this is unintended—i.e., generic 404 pages should not include the legal layout—move the catch-all to a sibling layout or apply a different layout for 404s.

Note: appRoutes is not in an isolated router context; all routes share the same <Routes> tree, so unmatched authenticated URLs do reach this catch-all.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/apps/social/app/application/Routes.tsx` around lines 13 - 17, The
catch-all Route for NotFound is inside legalRoutes and therefore renders with
LegalLayout for all unmatched URLs; remove the catch-all Route path='*' from
legalRoutes and instead add a top-level catch-all Route (e.g., in appRoutes or
the root routes tree) that renders NotFound with the correct layout (or wrap
NotFound with LegalLayout only if you intentionally want 404s to use
LegalLayout). Update references to legalRoutes, NotFound, LegalLayout and
appRoutes accordingly so the global 404 is a sibling route, not nested inside
legalRoutes.


export const guestRoutes = <Route>
<Route path='/' element={<Home />} />
<Route path='/login' element={<Login />} />
<Route path='/identify' element={<Identify />} />
<Route path='*' element={<NotFound />} />
</Route>;

export const protectedRoutes = <Route>
export const appRoutes = <Route>
<Route path='/logout' element={<Logout />} />
</Route>;
147 changes: 147 additions & 0 deletions src/apps/social/app/application/Terms.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@

import { Column, List, Paragraph, Text, Title } from '@maskingtech/designsystem';

export default function Feature()
{
Comment on lines +4 to +5
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Rename the component function from Feature to Terms (and Privacy in the sibling file)

Both Terms.tsx and Privacy.tsx export a function named Feature. Because React uses the function name as the component display name, React DevTools, error boundaries, and stack traces will show two identical Feature nodes with no way to distinguish them.

♻️ Proposed rename
-export default function Feature()
+export default function Terms()

Apply the equivalent rename (FeaturePrivacy) in src/apps/social/app/application/Privacy.tsx.

📝 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
export default function Feature()
{
export default function Terms()
{
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/apps/social/app/application/Terms.tsx` around lines 4 - 5, Rename the
default React component function currently named Feature to Terms in Terms.tsx
(and likewise rename Feature to Privacy in the sibling Privacy.tsx) so component
display names are unique; update the function declaration from "function
Feature()" to "function Terms()" (or "function Privacy()") and keep the default
export as the renamed function, and search for any local references to Feature
(tests, imports, displayName usage) and update them to the new symbol names.

return <Column gap='large'>

<Column gap='medium'>
<Title size='large'>Terms of Use</Title>
<Paragraph>
Last updated: February 3, 2026
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>1. About Comify</Title>
<Paragraph>
Comify is an online, open-source, comic-based social media platform operated by Masking Technology, a company registered in the Netherlands and listed in the Dutch Trade Register (Handelsregister) under Chamber of Commerce number 81340982.
These Terms of Use govern your access to and use of the Comify platform. By creating an account or using Comify, you agree to these Terms of Use.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>2. Definitions</Title>
<List type='unordered'>
<List.Item>
<Text weight='bold' value='Comify:' /> The Comify platform, website, and related services.
</List.Item>
<List.Item>
<Text weight='bold' value='User:' /> Any natural person who creates an account on Comify.
</List.Item>
<List.Item>
<Text weight='bold' value='Account:' /> The personal account created by a User to access Comify.
</List.Item>
<List.Item>
<Text weight='bold' value='Content:' /> Any comics, images, text, reactions, or other materials uploaded or created by Users.
</List.Item>
<List.Item>
<Text weight='bold' value='We / Us:' /> Masking Technology, operating Comify.
</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>3. Eligibility and Account Registration</Title>
<List type='ordered'>
<List.Item>You must be at least 16 years old to use Comify.</List.Item>
<List.Item>To create an account, you must provide accurate and complete information, including your full name, nickname, and email address.</List.Item>
<List.Item>Accounts may be created using a registration form or supported third-party social login providers.</List.Item>
<List.Item>Each User may create only one Account.</List.Item>
<List.Item>You are responsible for keeping your login credentials confidential. All activity performed through your Account is your responsibility.</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>4. Platform Functionality</Title>
<Paragraph>
Comify allows registered Users to:
</Paragraph>
<List type='ordered'>
<List.Item>View comics created by other Users through the Timeline and Explore pages.</List.Item>
<List.Item>Follow other Users and view their comics in a Following feed.</List.Item>
<List.Item>Create comics using the built-in editor and publish them to the platform.</List.Item>
<List.Item>Like comics and reactions.</List.Item>
<List.Item>Add reactions (comic-based or text-based) to comics and reactions.</List.Item>
<List.Item>View notifications related to follows, likes, and reactions.</List.Item>
</List>
<Paragraph>
All Content published on Comify is visible to registered Users only. Content is not accessible to non-registered visitors.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>5. User Content and Intellectual Property</Title>
<List type='ordered'>
<List.Item>You retain all intellectual property rights to the Content you create and publish on Comify.</List.Item>
<List.Item>By publishing Content on Comify, you grant us a non-exclusive, worldwide, royalty-free license to host, store, display, reproduce, and distribute your Content solely for the purpose of operating, improving, and showcasing the Comify platform.</List.Item>
<List.Item>We will not sell your Content or use it for third-party advertising.</List.Item>
<List.Item>You confirm that you have the necessary rights to publish the Content you upload and that it does not infringe the rights of third parties.</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>6. Prohibited Use</Title>
<Paragraph>
You may not use Comify to:
</Paragraph>
<List type='ordered'>
<List.Item>Violate any applicable laws or regulations.</List.Item>
<List.Item>Upload Content that is unlawful, hateful, threatening, discriminatory, pornographic, or incites violence.</List.Item>
<List.Item>Infringe intellectual property or privacy rights of others.</List.Item>
<List.Item>Disrupt or interfere with the security or operation of the platform.</List.Item>
<List.Item>Use automated systems to scrape or misuse the service.</List.Item>
</List>
<Paragraph>
We reserve the right to remove Content or restrict Accounts that violate these rules.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>7. Account Suspension and Termination</Title>
<List type='ordered'>
<List.Item>You may stop using Comify at any time by logging out of your Account.</List.Item>
<List.Item>At this stage, Account deletion is not available through self-service. You may request deletion by contacting us at comify@masking.tech.</List.Item>
<List.Item>We may suspend or terminate Accounts that violate these Terms or applicable laws.</List.Item>
</List>
</Column>

<Column gap='medium'>
<Title size='medium'>8. Availability and Maintenance</Title>
<Paragraph>
We aim to keep Comify available but do not guarantee uninterrupted access. We may
perform maintenance or updates that temporarily affect availability.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>9. Liability</Title>
<Paragraph>
To the maximum extent permitted by law:
</Paragraph>
<List type='unordered'>
<List.Item>Comify is provided “as is”.</List.Item>
<List.Item>We are not liable for damages resulting from User Content or interactions between Users.</List.Item>
<List.Item>We are not responsible for unauthorized access resulting from compromised login credentials.</List.Item>
</List>
<Paragraph>
Nothing in these Terms limits liability where such limitation is not permitted by law.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>10. Changes to These Terms</Title>
<Paragraph>
We may update these Terms from time to time. Continued use of Comify after changes take effect constitutes acceptance of the updated Terms.
</Paragraph>
</Column>

<Column gap='medium'>
<Title size='medium'>11. Governing Law</Title>
<Paragraph>
These Terms are governed by the laws of the Netherlands.
</Paragraph>
</Column>

</Column>;
}
17 changes: 17 additions & 0 deletions src/apps/social/app/application/components/LegalHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

import { Panel, ClickArea } from '@maskingtech/designsystem';

import Logo from './Logo';

type Props = {
readonly onGoHome: () => void;
};
Comment on lines 6 to 8
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Optional: rename onGoBack to onNavigateHome to reflect actual behavior.

The prop name onGoBack implies browser history navigation, but the hook always calls navigate('/') (root). The mismatch could mislead future maintainers.

♻️ Suggested rename
 type Props = {
-    readonly onGoBack: () => void;
+    readonly onNavigateHome: () => void;
 };
 
-export default function Component({ onGoBack }: Props)
+export default function Component({ onNavigateHome }: Props)
 {
     return <Panel type='transparent' padding='small'>
-        <ClickArea onClick={onGoBack}>
+        <ClickArea onClick={onNavigateHome}>
             <Logo size='small' />
         </ClickArea>
     </Panel>;
 }

Also update the call site in src/apps/social/app/application/layouts/Legal.tsx:

-    const Header = <LegalHeader onGoBack={navigateHome} />;
+    const Header = <LegalHeader onNavigateHome={navigateHome} />;
📝 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
type Props = {
readonly onGoBack: () => void;
};
type Props = {
readonly onNavigateHome: () => void;
};
export default function Component({ onNavigateHome }: Props)
{
return <Panel type='transparent' padding='small'>
<ClickArea onClick={onNavigateHome}>
<Logo size='small' />
</ClickArea>
</Panel>;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/apps/social/app/application/components/LegalHeader.tsx` around lines 6 -
8, Rename the prop onGoBack to onNavigateHome in the LegalHeader component:
update the Props type to readonly onNavigateHome: () => void, rename any
destructured prop usage inside the LegalHeader function/component to
onNavigateHome, and update the component invocation in Legal.tsx to pass the
same handler (the function that calls navigate('/')) under the new prop name;
ensure any internal references (e.g., button onClick) use onNavigateHome so
behavior is unchanged but the name reflects navigation to root.


export default function Component({ onGoHome }: Props)
{
return <Panel type='transparent' padding='small'>
<ClickArea onClick={onGoHome}>
<Logo size='small' />
</ClickArea>
</Panel>;
}
Comment on lines 1 to 17
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for LegalInfo.tsx and verify the url='privacy' issue
echo "=== Finding LegalInfo.tsx ==="
fd 'LegalInfo.tsx' --type f

echo -e "\n=== Searching for the privacy link pattern ==="
rg -n "url='privacy'" --type-add 'tsx:*.tsx' --type=tsx -B2 -A2

echo -e "\n=== Searching more broadly for LegalInfo content ==="
rg -n "privacy" src/apps/social/app/application/components/ --type-add 'tsx:*.tsx' --type=tsx -C2

Repository: MaskingTechnology/comify

Length of output: 1440


🏁 Script executed:

#!/bin/bash
# Search for privacy route definition
echo "=== Searching for /privacy route or privacy page ==="
rg -n "privacy" --type-add 'tsx:*.tsx' --type=tsx src/apps/social/app/application/ | grep -i "route\|path\|page" | head -20

echo -e "\n=== Searching in router/routing configuration files ==="
fd 'route|router' -t f src/apps/social/app/application/ | head -10

echo -e "\n=== Looking for any privacy-related files ==="
fd -i 'privacy' -t f src/apps/social/app/application/

Repository: MaskingTechnology/comify

Length of output: 460


Broken privacy policy link in LegalInfo.tsx — missing leading slash.

The code at line 8 shows:

<Link url='/terms' target='_blank'>terms of use</Link> and <Link url='privacy' target='_blank'>privacy policy</Link>

/terms is correctly an absolute path, but privacy (no leading /) is a relative path. On any route other than / (e.g., /login, /register), this resolves incorrectly — e.g., /login/privacy instead of /privacy — silently failing to reach the Privacy page.

🐛 Proposed fix in LegalInfo.tsx
- By getting in, you agree to our <Link url='/terms' target='_blank'>terms of use</Link> and <Link url='privacy' target='_blank'>privacy policy</Link>.
+ By getting in, you agree to our <Link url='/terms' target='_blank'>terms of use</Link> and <Link url='/privacy' target='_blank'>privacy policy</Link>.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/apps/social/app/application/components/LegalHeader.tsx` around lines 1 -
17, The privacy link in LegalInfo.tsx uses a relative URL ('privacy') causing
incorrect routing on non-root pages; update the Link component's url prop for
the privacy policy from 'privacy' to '/privacy' (i.e., locate the Link usage
that currently reads url='privacy' and change it to url='/privacy') so the
privacy policy resolves as an absolute path; verify the Link for terms remains
'/terms' and run a quick smoke test on routes like /login to confirm /privacy
opens correctly.

2 changes: 1 addition & 1 deletion src/apps/social/app/application/components/LegalInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export default function Component()
{
return <Column gap='none' alignX='center'>
<Paragraph size='small'>
By getting in, you agree to our <Link url='/assets/terms.pdf' target='_blank'>terms of use</Link> and <Link url='/assets/privacy.pdf' target='_blank'>privacy policy</Link>.
By getting in, you agree to our <Link url='/terms' target='_blank'>terms of use</Link> and <Link url='/privacy' target='_blank'>privacy policy</Link>.
</Paragraph>
<Paragraph size='small'>
Copyright © 2025 - <Link url='https://masking.tech' target='_blank'>Masking Technology</Link>.
Expand Down
9 changes: 9 additions & 0 deletions src/apps/social/app/application/hooks/useNavigateHome.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

import { useNavigate } from 'react-router-dom';

export default function useNavigateHome()
{
const navigate = useNavigate();

return () => navigate('/');
}
1 change: 1 addition & 0 deletions src/apps/social/app/application/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export { default as useAppState } from './hooks/useAppState';

export { default as ApplicationLayout } from './layouts/Application';
export { default as GuestLayout } from './layouts/Guest';
export { default as LegalLayout } from './layouts/Legal';

export { default as ErrorHandler } from './ErrorHandler';
export { default as ProtectedRoute } from './ProtectedRoute';
Expand Down
Loading