.internal-skills/mobile-developer/SKILL.md
Desenvolvedor Mobile (iOS/Android). Use para: - Criar apps nativos e híbridos - Implementar UI mobile - Integração com APIs - Performance mobile - Publicação stores (App Store, Play Store)
npx skillsauth add suportebahia/equipe-devs Equipe SBahia - Mobile DeveloperInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
// Componente otimizado
import { memo } from 'react';
import { StyleSheet, TouchableOpacity, Text } from 'react-native';
interface ButtonProps {
title: string;
onPress: () => void;
loading?: boolean;
variant?: 'primary' | 'secondary';
}
const Button = memo(({ title, onPress, loading, variant = 'primary' }: ButtonProps) => {
return (
<TouchableOpacity
style={[styles.button, styles[variant]]}
onPress={onPress}
disabled={loading}
activeOpacity={0.7}
>
{loading ? <ActivityIndicator /> : <Text style={styles.text}>{title}</Text>}
</TouchableOpacity>
);
});
const styles = StyleSheet.create({
button: {
paddingVertical: 12,
paddingHorizontal: 24,
borderRadius: 8,
alignItems: 'center',
},
primary: { backgroundColor: '#007AFF' },
secondary: { backgroundColor: '#E5E5EA' },
text: { fontSize: 16, fontWeight: '600' },
});
// Widget otimizado com const
class UserCard extends StatelessWidget {
final User user;
final VoidCallback onTap;
const UserCard({
super.key,
required this.user,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return Card(
child: InkWell(
onTap: onTap,
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
CircleAvatar(backgroundImage: NetworkImage(user.avatar)),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(user.name, style: Theme.of(context).textTheme.titleMedium),
Text(user.email, style: Theme.of(context).textTheme.bodySmall),
],
),
),
],
),
),
),
);
}
}
// Zustand (React Native)
import { create } from 'zustand';
interface UserStore {
user: User | null;
isLoading: boolean;
fetchUser: (id: string) => Promise<void>;
}
const useUserStore = create<UserStore>((set) => ({
user: null,
isLoading: false,
fetchUser: async (id) => {
set({ isLoading: true });
const user = await api.getUser(id);
set({ user, isLoading: false });
},
}));
// Uso
const { user, fetchUser } = useUserStore();
// AsyncStorage + Sync
import AsyncStorage from '@react-native-async-storage/async-storage';
class OfflineStorage {
async save(key: string, data: any) {
await AsyncStorage.setItem(key, JSON.stringify({
data,
timestamp: Date.now(),
}));
}
async get<T>(key: string): Promise<T | null> {
const stored = await AsyncStorage.getItem(key);
return stored ? JSON.parse(stored).data : null;
}
async sync(key: string, apiCall: () => Promise<any>) {
const localData = await this.get(key);
if (navigator.onLine) {
const remoteData = await apiCall();
await this.save(key, remoteData);
return remoteData;
}
return localData;
}
}
// Expo Notifications
import * as Notifications from 'expo-notifications';
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: true,
shouldSetBadge: true,
}),
});
// Permissão
const { status } = await Notifications.requestPermissionsAsync();
// Listener
Notifications.addNotificationReceivedListener((notification) => {
const data = notification.request.content.data;
});
| Aspecto | Nativo (Swift/Kotlin) | Híbrido (RN/Flutter) | |---------|----------------------|---------------------| | Performance | Excelente | Bom | | UI Nativa | Sim | Parcial | | Curva aprendizado | Alta | Média | | Manutenção | 2 codebases | 1 codebase | | Biblioteca | Nativas | cross-platform |
# Build
xcodebuild -workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-archivePath MyApp.xcarchive \
archive
# Export
xcodebuild -exportArchive \
-archivePath MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath ./build
# Build release
cd android && ./gradlew assembleRelease
# Assinar
jarsigner -keystore my-release-key.keystore app-release.apk alias_name
# Upload
gcloud beta app deploy app-release.apk
React.memo / const widgetsgetItemLayout| Tipo | Ferramenta | |------|------------| | Framework | React Native, Flutter | | Nativo | Swift, Kotlin | | State | Redux, Zustand, Riverpod, Bloc | | Navigation | React Navigation, GoRouter | | Storage | AsyncStorage, Realm, SQLite | | Images | FastImage, CachedNetworkImage | | CI/CD | Fastlane, GitHub Actions |
testing
Sistema de agentes IA para coordenação de projetos de desenvolvimento. Use este skill para iniciar qualquer projeto. Este skill orquestra automaticamente os agentes especializados conforme a necessidade: - Análise e planejamento de projetos - Coordenação de múltiplos agentes - Gestão de tasks e dependências
development
Orquestrador principal do ecossistema de agentes IA Equipe SBahia. Use para: - Coordenar projetos de desenvolvimento web - Alocar agentes especializados - Gerenciar workflow completo - Garantir padrões MVC e de mercado Agents disponíveis: leadership-tech, uxui-designer, frontend-developer, backend-controller, backend-model, dba-specialist, security-specialist, api-gateway-specialist, mobile-developer, data-engineer, elastic-engineer, machine-learning-engineer, testing-specialist, error-handling-specialist, product-owner, devops-engineer, solutions-engineer
testing
Skill para Designer UX/UI. Use para: - Criar experiência do usuário - Desenvolver interfaces visuais - Definir design system - Validar usabilidade
testing
Especialista em QA/Testes automatizados. Use para: - Criar estratégia de testes completa - Implementar testes unitários, integração e E2E - TDD/BDD quando aplicável - Coverage analysis - Testes de performance e carga