refactor(database): migrate to new modular database layer and unify data access
All checks were successful
Frontend CI / build-and-push-web (push) Successful in 2m44s
Frontend CI / ota-android (push) Successful in 12m51s
Frontend CI / build-android-apk (push) Successful in 1h1m26s

- Remove legacy database.ts, LocalDataSource.ts, and MessageRepository.ts
- Create new src/database/ module with messageRepository, userCacheRepository, conversationRepository, and groupCacheRepository
- Update all consumers to import from @/database instead of services/database
- Add web platform blur handling for modal components to fix focus issues
- Flatten SystemMessageItem and NotificationsScreen styles for consistent design
- Add draggable slider in ChatSettingsScreen and dynamic font size support
- Introduce 9 new chat color themes
- Add profile screens for about, terms, and privacy policy with navigation routes
- Add policy links to login and registration screens
- Fix post share URL format from /posts/ to /post/
This commit is contained in:
lafay
2026-04-04 08:01:45 +08:00
parent 189b977fac
commit 82c2970a85
76 changed files with 3382 additions and 2000 deletions

View File

@@ -237,6 +237,16 @@ export const LoginScreen: React.FC = () => {
<Text style={styles.registerLink}></Text>
</TouchableOpacity>
</View>
{/* 协议提示 */}
<View style={styles.policyFooter}>
<Text style={styles.policyText}>
<Text style={styles.policyLink} onPress={() => router.push(hrefs.hrefProfileTerms())}></Text>
<Text style={styles.policyLink} onPress={() => router.push(hrefs.hrefProfilePrivacy())}></Text>
</Text>
</View>
</Animated.View>
</ScrollView>
</KeyboardAvoidingView>
@@ -376,6 +386,18 @@ function createLoginStyles(colors: AppColors) {
fontWeight: '600',
marginLeft: 6,
},
policyFooter: {
alignItems: 'center',
marginTop: 24,
},
policyText: {
fontSize: 13,
color: colors.text.hint,
},
policyLink: {
color: THEME_COLORS.primary,
fontWeight: '500',
},
});
}

View File

@@ -12,9 +12,11 @@ import {
TouchableOpacity,
ActivityIndicator,
} from 'react-native';
import { useRouter } from 'expo-router';
import { MaterialCommunityIcons } from '@expo/vector-icons';
import { useAppColors, type AppColors } from '../../theme';
import { RegisterStepProps } from './types';
import * as hrefs from '../../navigation/hrefs';
const THEME_COLORS = {
primary: '#FF6B35',
@@ -32,6 +34,7 @@ export const RegisterStep3Profile: React.FC<RegisterStepProps> = ({
}) => {
const colors = propColors || useAppColors();
const styles = createStyles(colors);
const router = useRouter();
const [showPassword, setShowPassword] = useState(false);
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
@@ -185,28 +188,40 @@ export const RegisterStep3Profile: React.FC<RegisterStepProps> = ({
})}
{/* 服务条款 */}
<TouchableOpacity
style={styles.termsContainer}
onPress={() => {
setAgreedToTerms(!agreedToTerms);
if (errors.terms) {
setErrors((prev) => ({ ...prev, terms: '' }));
}
}}
activeOpacity={0.8}
>
<MaterialCommunityIcons
name={agreedToTerms ? 'checkbox-marked' : 'checkbox-blank-outline'}
size={22}
color={agreedToTerms ? THEME_COLORS.primary : colors.text?.hint || '#999'}
/>
<View style={styles.termsContainer}>
<TouchableOpacity
onPress={() => {
setAgreedToTerms(!agreedToTerms);
if (errors.terms) {
setErrors((prev) => ({ ...prev, terms: '' }));
}
}}
activeOpacity={0.8}
style={styles.checkboxWrapper}
>
<MaterialCommunityIcons
name={agreedToTerms ? 'checkbox-marked' : 'checkbox-blank-outline'}
size={22}
color={agreedToTerms ? THEME_COLORS.primary : colors.text?.hint || '#999'}
/>
</TouchableOpacity>
<Text style={styles.termsText}>
<Text style={styles.termsLink}></Text>
<Text
style={styles.termsLink}
onPress={() => router.push(hrefs.hrefProfileTerms())}
>
</Text>
<Text style={styles.termsLink}></Text>
<Text
style={styles.termsLink}
onPress={() => router.push(hrefs.hrefProfilePrivacy())}
>
</Text>
</Text>
</TouchableOpacity>
</View>
{errors.terms ? (
<Text style={[styles.errorText, { marginTop: -12, marginBottom: 12 }]}>
{errors.terms}
@@ -295,10 +310,13 @@ function createStyles(colors: AppColors) {
},
termsContainer: {
flexDirection: 'row',
alignItems: 'center',
alignItems: 'flex-start',
marginBottom: 20,
marginTop: 4,
},
checkboxWrapper: {
paddingTop: 2,
},
termsText: {
fontSize: 14,
color: colors.text?.secondary || '#666',