mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 06:01:09 +02:00
Move inactive projects out of active workspace: - bauntown (community website) - maerchenzauber (AI story generation) - memoro (voice memo app) - news (news aggregation) - nutriphi (nutrition tracking) - reader (reading app) - uload (URL shortener) - wisekeep (AI wisdom extraction) Update CLAUDE.md documentation: - Add presi to active projects - Document archived projects section - Update workspace configuration Archived apps can be re-activated by moving back to apps/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
9.1 KiB
9.1 KiB
Implementation Guide for @mana/auth-mobile
Overview
This package contains a reusable authentication system extracted from the Storyteller mobile app. It provides a complete authentication solution for Mana Core-powered React Native apps with full customization support.
Package Structure
@mana-auth-mobile/
├── src/
│ ├── services/ # Auth and token management services
│ │ ├── authService.ts # Main authentication service
│ │ └── tokenManager.ts # JWT token manager with auto-refresh
│ ├── components/ # UI components
│ │ ├── ManaLoginScreen.tsx # Complete login/register flow
│ │ ├── GoogleSignInButton.tsx # Google OAuth button
│ │ └── AppleSignInButton.tsx # Apple Sign In button
│ ├── contexts/ # React contexts
│ │ └── ManaAuthContext.tsx # Authentication state management
│ ├── utils/ # Utility functions
│ │ ├── safeStorage.ts # Secure storage wrapper
│ │ ├── logger.ts # Logging utilities
│ │ ├── deviceManager.ts # Device identification
│ │ └── networkErrorUtils.ts # Network helpers
│ ├── types/ # TypeScript definitions
│ │ └── index.ts # Auth-related types
│ ├── config/ # Configuration system
│ │ ├── types.ts # Config type definitions
│ │ ├── defaults.ts # Default configurations
│ │ └── ManaAuthConfigProvider.tsx # Config provider
│ ├── hooks/ # React hooks
│ │ └── useManaAuth.ts # Main auth hook
│ └── index.ts # Package exports
├── package.json
├── tsconfig.json
├── README.md
└── IMPLEMENTATION_GUIDE.md
Core Components to Implement
1. Services (Already Structured)
The following services need to be copied from the storyteller codebase with minimal modifications:
-
authService.ts: Copy from
mobile/src/services/authService.ts- Replace hardcoded
BACKEND_URLwithconfig.environment.backendUrl - Replace storage keys with
config.environment.storageKeys
- Replace hardcoded
-
tokenManager.ts: Copy from
mobile/src/services/tokenManager.ts- No configuration changes needed (works with authService)
2. Components
-
ManaLoginScreen.tsx: Copy from
mobile/app/login.tsx- Use
useManaAuthConfig()hook to access theme/text configuration - Replace hardcoded colors with
config.theme.colors.* - Replace hardcoded text with
config.text.* - Replace background image with
config.theme.backgroundImage
- Use
-
GoogleSignInButton.tsx: Copy from
mobile/components/molecules/GoogleSignInButton.tsx- Use
config.environment.googleClientId - Use
config.theme.colors.googleButton - Use
config.text.loginWithGoogle
- Use
-
AppleSignInButton.tsx: Copy from
mobile/components/molecules/AppleSignInButton.tsx- Use
config.environment.appleClientId - Use
config.theme.colors.appleButton - Use
config.text.loginWithApple
- Use
3. Context (ManaAuthContext.tsx)
Copy from mobile/src/contexts/AuthContext.tsx with these changes:
- Remove Supabase-specific code (or make it optional)
- Remove RevenueCat-specific code (or make it optional)
- Use configuration for analytics instead of hardcoded PostHog
- Export
useManaAuthhook
4. Main Export (index.ts)
// Configuration
export { ManaAuthConfigProvider, useManaAuthConfig } from './config/ManaAuthConfigProvider';
export * from './config/types';
// Context & Hooks
export { ManaAuthProvider, useManaAuth } from './contexts/ManaAuthContext';
// Components
export { default as ManaLoginScreen } from './components/ManaLoginScreen';
export { GoogleSignInButton } from './components/GoogleSignInButton';
export { AppleSignInButton } from './components/AppleSignInButton';
// Services (for advanced usage)
export { authService } from './services/authService';
export { tokenManager } from './services/tokenManager';
// Types
export * from './types';
Usage in Storyteller (Example)
Step 1: Install the Package
# From the storyteller mobile directory
npm install ../../../@mana-auth-mobile
Step 2: Configure in App Root
// mobile/app/_layout.tsx
import { ManaAuthConfigProvider } from '@mana/auth-mobile';
export default function RootLayout() {
return (
<ManaAuthConfigProvider
environment={{
backendUrl: process.env.EXPO_PUBLIC_STORYTELLER_BACKEND_URL || 'http://localhost:3002',
googleClientId: process.env.EXPO_PUBLIC_GOOGLE_CLIENT_ID,
enableGoogleSignIn: true,
enableAppleSignIn: true,
devMode: __DEV__,
devCredentials: {
email: 'till.schneider@memoro.ai',
password: 'Aa-12345678'
},
}}
theme={{
colors: {
primary: '#FFCB00',
buttonPrimary: '#FFCB00',
},
fonts: {
header: 'Grandstander_700Bold',
},
backgroundImage: require('../assets/images/marchenzauber-dadgirl.jpg'),
}}
text={{
appName: 'Märchenzauber',
loginTitle: 'Märchenzauber',
loginSubtitle: 'Erstelle ein Konto oder melde dich an.',
manaLoginTitle: 'Mana Login',
showManaLogin: true,
relatedApps: [
{
name: 'Memoro',
icon: require('../assets/images/Memoro-App-Icon.png'),
description: 'Zeichne Gespräche auf...',
appStoreUrl: 'https://apps.apple.com/app/memoro',
websiteUrl: 'https://memoro.ai',
},
],
}}
>
<ManaAuthProvider>
{/* Rest of your app */}
</ManaAuthProvider>
</ManaAuthConfigProvider>
);
}
Step 3: Use in Screens
// mobile/app/login.tsx
import { ManaLoginScreen } from '@mana/auth-mobile';
export default function LoginScreen() {
return <ManaLoginScreen />;
}
// mobile/app/(tabs)/index.tsx
import { useManaAuth } from '@mana/auth-mobile';
export default function HomeScreen() {
const { user, signOut } = useManaAuth();
return (
<View>
<Text>Welcome {user?.name}!</Text>
<Button title="Sign Out" onPress={signOut} />
</View>
);
}
Configuration Examples
German Language
<ManaAuthConfigProvider
text={{
appName: 'Meine App',
loginTitle: 'Anmelden',
loginButton: 'Anmelden',
registerTitle: 'Konto erstellen',
registerButton: 'Registrieren',
loginWithEmail: 'Mit E-Mail anmelden',
loginWithGoogle: 'Mit Google anmelden',
loginWithApple: 'Mit Apple anmelden',
emailPlaceholder: 'E-Mail Adresse eingeben...',
passwordPlaceholder: 'Passwort eingeben...',
forgotPassword: 'Passwort vergessen?',
emailInvalid: 'Bitte gib eine gültige E-Mail-Adresse ein',
passwordTooShort: 'Das Passwort muss mindestens 8 Zeichen lang sein',
loginError: 'Anmeldung fehlgeschlagen',
backButton: 'Zurück',
}}
/>
Custom Colors
<ManaAuthConfigProvider
theme={{
colors: {
primary: '#FF6B6B',
buttonPrimary: '#FF6B6B',
background: 'rgba(30, 30, 40, 0.95)',
inputBackground: 'rgba(50, 50, 70, 0.8)',
text: '#FFFFFF',
googleButton: '#4285F4',
appleButton: '#000000',
},
}}
/>
Minimal Configuration
<ManaAuthConfigProvider
environment={{
backendUrl: 'https://api.myapp.com',
}}
text={{
appName: 'My App',
}}
/>
Migrating from Hardcoded Auth
Before (Storyteller)
// Hardcoded in login.tsx
const handleLogin = async () => {
await authService.signIn(email, password);
};
// Hardcoded colors
const styles = StyleSheet.create({
button: {
backgroundColor: '#FFCB00', // Hardcoded
},
});
After (Using Package)
import { ManaLoginScreen, useManaAuth } from '@mana/auth-mobile';
// Configuration-driven
<ManaLoginScreen /> // Uses configured colors/text
// Or custom implementation
const { signIn } = useManaAuth();
const { colors, text } = useManaAuthConfig();
const handleLogin = async () => {
await signIn(email, password);
};
const styles = StyleSheet.create({
button: {
backgroundColor: colors.buttonPrimary, // From config
},
});
Testing the Package
Local Testing (Before Publishing)
# In @mana-auth-mobile directory
npm link
# In your app directory
npm link @mana/auth-mobile
Publishing to npm
# In @mana-auth-mobile directory
npm run build
npm publish
Next Steps
- Complete the missing service files (copy from storyteller with configuration updates)
- Test locally with
npm link - Publish to npm (or private registry)
- Update storyteller to use the package
- Update other Mana apps (Memoro) to use the same package
Benefits
- ✅ Single authentication codebase for all Mana apps
- ✅ Consistent UX across apps with app-specific branding
- ✅ Easy to maintain and update
- ✅ Type-safe configuration
- ✅ Reduced code duplication
- ✅ Faster development of new apps