-
Notifications
You must be signed in to change notification settings - Fork 4
RU-T47 Build version number fix #210
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| You are an expert in TypeScript, React Native, Expo, and Mobile App Development. | ||
|
|
||
| Code Style and Structure: | ||
|
|
||
| - Write concise, type-safe TypeScript code. | ||
| - Use functional components and hooks over class components. | ||
| - Ensure components are modular, reusable, and maintainable. | ||
| - Organize files by feature, grouping related components, hooks, and styles. | ||
| - This is a mobile application, so ensure all components are mobile friendly and responsive and support both iOS and Android platforms and ensure that the app is optimized for both platforms. | ||
|
|
||
| Naming Conventions: | ||
|
|
||
| - Use camelCase for variable and function names (e.g., `isFetchingData`, `handleUserInput`). | ||
| - Use PascalCase for component names (e.g., `UserProfile`, `ChatScreen`). | ||
| - Directory and File names should be lowercase and hyphenated (e.g., `user-profile`, `chat-screen`). | ||
|
|
||
| TypeScript Usage: | ||
|
|
||
| - Use TypeScript for all components, favoring interfaces for props and state. | ||
| - Enable strict typing in `tsconfig.json`. | ||
| - Avoid using `any`; strive for precise types. | ||
| - Utilize `React.FC` for defining functional components with props. | ||
|
|
||
| Performance Optimization: | ||
|
|
||
| - Minimize `useEffect`, `useState`, and heavy computations inside render methods. | ||
| - Use `React.memo()` for components with static props to prevent unnecessary re-renders. | ||
| - Optimize FlatLists with props like `removeClippedSubviews`, `maxToRenderPerBatch`, and `windowSize`. | ||
| - Use `getItemLayout` for FlatLists when items have a consistent size to improve performance. | ||
| - Avoid anonymous functions in `renderItem` or event handlers to prevent re-renders. | ||
|
|
||
| UI and Styling: | ||
|
|
||
| - Use consistent styling leveraging `gluestack-ui`. If there isn't a Gluestack component in the `components/ui` directory for the component you are trying to use consistently style it either through `StyleSheet.create()` or Styled Components. | ||
| - Ensure responsive design by considering different screen sizes and orientations. | ||
| - Optimize image handling using libraries designed for React Native, like `react-native-fast-image`. | ||
|
|
||
| Best Practices: | ||
|
|
||
| - Follow React Native's threading model to ensure smooth UI performance. | ||
| - Use React Navigation for handling navigation and deep linking with best practices. | ||
| - Create and use Jest to test to validate all generated components | ||
| - Generate tests for all components, services and logic generated. Ensure tests run without errors and fix any issues. | ||
| - The app is multi-lingual, so ensure all text is wrapped in `t()` from `react-i18next` for translations with the dictonary files stored in `src/translations`. | ||
| - Ensure support for dark mode and light mode. | ||
| - Ensure the app is accessible, following WCAG guidelines for mobile applications. | ||
| - Make sure the app is optimized for performance, especially for low-end devices. | ||
| - Handle errors gracefully and provide user feedback. | ||
| - Implement proper offline support. | ||
| - Ensure the user interface is intuitive and user-friendly and works seamlessly across different devices and screen sizes. | ||
| - This is an expo managed project that uses prebuild, do not make native code changes outside of expo prebuild capabilities. | ||
|
|
||
| Additional Rules: | ||
|
|
||
| - Use `yarn` as the package manager. | ||
| - Use Expo's secure store for sensitive data | ||
| - Implement proper offline support | ||
| - Use `zustand` for state management | ||
| - Use `react-hook-form` for form handling | ||
| - Use `react-query` for data fetching | ||
| - Use `react-i18next` for internationalization | ||
| - Use `react-native-mmkv` for local storage | ||
| - Use `axios` for API requests | ||
| - Use `@rnmapbox/maps` for maps, mapping or vehicle navigation | ||
| - Use `lucide-react-native` for icons and use those components directly in the markup and don't use the gluestack-ui icon component | ||
| - Use ? : for conditional rendering and not && | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -237,6 +237,57 @@ | |||||||||||||||||
| </Box> | ||||||||||||||||||
| )} | ||||||||||||||||||
|
|
||||||||||||||||||
| {/* System Audio Option */} | ||||||||||||||||||
| <Box className="mb-4"> | ||||||||||||||||||
| <Text className="mb-2 text-sm text-neutral-600 dark:text-neutral-400">{t('bluetooth.audio_output')}</Text> | ||||||||||||||||||
| <Pressable | ||||||||||||||||||
| onPress={async () => { | ||||||||||||||||||
| try { | ||||||||||||||||||
| useBluetoothAudioStore.getState().setIsConnecting(true); | ||||||||||||||||||
| // We use a dummy ID for loading state tracking if needed, or just rely on global loading | ||||||||||||||||||
| setConnectingDeviceId('system-audio'); | ||||||||||||||||||
|
|
||||||||||||||||||
| await bluetoothAudioService.connectToSystemAudio(); | ||||||||||||||||||
|
|
||||||||||||||||||
| // Update preferred device manually here to ensure UI reflects it immediately | ||||||||||||||||||
| // preventing race conditions with store updates | ||||||||||||||||||
| await setPreferredDevice({ id: 'system-audio', name: 'System Audio' }); | ||||||||||||||||||
|
|
||||||||||||||||||
| onClose(); | ||||||||||||||||||
| } catch (error) { | ||||||||||||||||||
| logger.error({ message: 'Failed to select System Audio', context: { error } }); | ||||||||||||||||||
| showMessage({ | ||||||||||||||||||
| message: t('bluetooth.connection_error_title') || 'Selection Failed', | ||||||||||||||||||
| description: t('bluetooth.system_audio_error') || 'Could not switch to System Audio', | ||||||||||||||||||
| type: 'danger', | ||||||||||||||||||
| }); | ||||||||||||||||||
| } finally { | ||||||||||||||||||
| useBluetoothAudioStore.getState().setIsConnecting(false); | ||||||||||||||||||
| setConnectingDeviceId(null); | ||||||||||||||||||
| } | ||||||||||||||||||
| }} | ||||||||||||||||||
| disabled={!!connectingDeviceId} | ||||||||||||||||||
| className={`rounded-lg border p-4 ${preferredDevice?.id === 'system-audio' ? 'border-primary-500 bg-primary-50 dark:bg-primary-950' : 'border-neutral-200 bg-white dark:border-neutral-700 dark:bg-neutral-800'} ${!!connectingDeviceId ? 'opacity-70' : ''}`} | ||||||||||||||||||
| > | ||||||||||||||||||
| <HStack className="items-center justify-between"> | ||||||||||||||||||
| <HStack className="items-center"> | ||||||||||||||||||
| <BluetoothIcon size={16} className="mr-2 text-primary-600" /> | ||||||||||||||||||
| <VStack> | ||||||||||||||||||
| <Text className={`font-medium ${preferredDevice?.id === 'system-audio' ? 'text-primary-700 dark:text-primary-300' : 'text-neutral-900 dark:text-neutral-100'}`}> | ||||||||||||||||||
| System Audio | ||||||||||||||||||
| </Text> | ||||||||||||||||||
| <Text className="text-xs text-neutral-500">AirPods, Car, Wired Headset</Text> | ||||||||||||||||||
|
Comment on lines
+276
to
+279
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. User-facing text missing i18n wrapping. "System Audio" and "AirPods, Car, Wired Headset" are hardcoded strings. Per coding guidelines, all user-facing text should be wrapped in 🌐 Proposed fix for i18n- <Text className={`font-medium ${preferredDevice?.id === 'system-audio' ? 'text-primary-700 dark:text-primary-300' : 'text-neutral-900 dark:text-neutral-100'}`}>
- System Audio
- </Text>
- <Text className="text-xs text-neutral-500">AirPods, Car, Wired Headset</Text>
+ <Text className={`font-medium ${preferredDevice?.id === 'system-audio' ? 'text-primary-700 dark:text-primary-300' : 'text-neutral-900 dark:text-neutral-100'}`}>
+ {t('bluetooth.system_audio')}
+ </Text>
+ <Text className="text-xs text-neutral-500">{t('bluetooth.system_audio_description')}</Text>Also addresses the static analysis hint about multiline formatting. As per coding guidelines: "Ensure all text is wrapped in 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: test[warning] 276-276: 🤖 Prompt for AI Agents |
||||||||||||||||||
| </VStack> | ||||||||||||||||||
| </HStack> | ||||||||||||||||||
| {preferredDevice?.id === 'system-audio' && ( | ||||||||||||||||||
| <VStack className="items-end"> | ||||||||||||||||||
| <Text className="text-sm font-medium text-primary-600 dark:text-primary-400">{t('bluetooth.selected')}</Text> | ||||||||||||||||||
| </VStack> | ||||||||||||||||||
| )} | ||||||||||||||||||
| </HStack> | ||||||||||||||||||
| </Pressable> | ||||||||||||||||||
| </Box> | ||||||||||||||||||
|
|
||||||||||||||||||
| {/* Scan Button */} | ||||||||||||||||||
| <HStack className="mb-4 w-full items-center justify-between"> | ||||||||||||||||||
| <Text className="text-sm text-neutral-600 dark:text-neutral-400">{t('bluetooth.available_devices')}</Text> | ||||||||||||||||||
|
|
||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo: "dictonary" should be "dictionary"
📝 Committable suggestion
🤖 Prompt for AI Agents