diff --git a/examples/expo-react-native/.env b/examples/expo-react-native/.env new file mode 120000 index 0000000..4a82335 --- /dev/null +++ b/examples/expo-react-native/.env @@ -0,0 +1 @@ +../.env \ No newline at end of file diff --git a/examples/expo-react-native/.gitignore b/examples/expo-react-native/.gitignore new file mode 100644 index 0000000..6623142 --- /dev/null +++ b/examples/expo-react-native/.gitignore @@ -0,0 +1,20 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ + +# macOS +.DS_Store + +# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb +# The following patterns were generated by expo-cli + +expo-env.d.ts +# @end expo-cli \ No newline at end of file diff --git a/examples/expo-react-native/README.md b/examples/expo-react-native/README.md new file mode 100644 index 0000000..cd4feb8 --- /dev/null +++ b/examples/expo-react-native/README.md @@ -0,0 +1,50 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/examples/expo-react-native/app.json b/examples/expo-react-native/app.json new file mode 100644 index 0000000..d4276e3 --- /dev/null +++ b/examples/expo-react-native/app.json @@ -0,0 +1,34 @@ +{ + "expo": { + "name": "expo-react-native", + "slug": "expo-react-native", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "myapp", + "userInterfaceStyle": "automatic", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "ios": { + "supportsTablet": true + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/images/adaptive-icon.png", + "backgroundColor": "#ffffff" + } + }, + "web": { + "bundler": "metro", + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": ["expo-router"], + "experiments": { + "typedRoutes": true + } + } +} diff --git a/examples/expo-react-native/app/(tabs)/_layout.tsx b/examples/expo-react-native/app/(tabs)/_layout.tsx new file mode 100644 index 0000000..4770985 --- /dev/null +++ b/examples/expo-react-native/app/(tabs)/_layout.tsx @@ -0,0 +1,36 @@ +import { Tabs } from 'expo-router'; +import React from 'react'; + +import { TabBarIcon } from '@/components/navigation/TabBarIcon'; +import { Colors } from '@/constants/Colors'; +import { useColorScheme } from '@/hooks/useColorScheme'; + +export default function TabLayout() { + const colorScheme = useColorScheme(); + + return ( + + , + }} + /> + ( + + ), + }} + /> + + ); +} diff --git a/examples/expo-react-native/app/(tabs)/explore.tsx b/examples/expo-react-native/app/(tabs)/explore.tsx new file mode 100644 index 0000000..1a7d72a --- /dev/null +++ b/examples/expo-react-native/app/(tabs)/explore.tsx @@ -0,0 +1,99 @@ +import Ionicons from '@expo/vector-icons/Ionicons'; +import { StyleSheet, Image, Platform } from 'react-native'; + +import { Collapsible } from '@/components/Collapsible'; +import { ExternalLink } from '@/components/ExternalLink'; +import ParallaxScrollView from '@/components/ParallaxScrollView'; +import { ThemedText } from '@/components/ThemedText'; +import { ThemedView } from '@/components/ThemedView'; + +export default function TabTwoScreen() { + return ( + } + > + + Explore + + This app includes example code to help you get started. + + + This app has two screens: app/(tabs)/index.tsx and{' '} + app/(tabs)/explore.tsx + + + The layout file in app/(tabs)/_layout.tsx sets up the tab + navigator. + + + Learn more + + + + + You can open this project on Android, iOS, and the web. To open the web version, press{' '} + w in the terminal running this project. + + + + + For static images, you can use the @2x and{' '} + @3x suffixes to provide files for different screen densities + + + + Learn more + + + + + Open app/_layout.tsx to see how to load{' '} + custom fonts such as this one. + + + Learn more + + + + + This template has light and dark mode support. The{' '} + useColorScheme() hook lets you inspect what the user's current + color scheme is, and so you can adjust UI colors accordingly. + + + Learn more + + + + + This template includes an example of an animated component. The{' '} + components/HelloWave.tsx component uses the powerful{' '} + react-native-reanimated library to create a waving hand + animation. + + {Platform.select({ + ios: ( + + The components/ParallaxScrollView.tsx component provides a + parallax effect for the header image. + + ), + })} + + + ); +} + +const styles = StyleSheet.create({ + headerImage: { + color: '#808080', + bottom: -90, + left: -35, + position: 'absolute', + }, + titleContainer: { + flexDirection: 'row', + gap: 8, + }, +}); diff --git a/examples/expo-react-native/app/(tabs)/index.tsx b/examples/expo-react-native/app/(tabs)/index.tsx new file mode 100644 index 0000000..7202a7a --- /dev/null +++ b/examples/expo-react-native/app/(tabs)/index.tsx @@ -0,0 +1,70 @@ +import { Image, StyleSheet, Button } from 'react-native'; + +import ParallaxScrollView from '@/components/ParallaxScrollView'; +import { Confidence } from '@spotify-confidence/sdk'; +import { ConfidenceProvider, useEvaluateFlag } from '@spotify-confidence/react'; +import { Suspense } from 'react'; +import { ThemedText } from '@/components/ThemedText'; + +const getClientSecret = () => { + const clientSecret = process.env.EXPO_PUBLIC_CLIENT_SECRET; + if (!clientSecret) throw new Error('Missing client secret'); + return clientSecret; +}; + +const confidence = Confidence.create({ + clientSecret: getClientSecret(), + environment: 'client', + timeout: 3000, + logger: console, + fetchImplementation: (req: Request) => { + console.log('request', req.url); + return fetch(req); + }, +}); + +confidence.setContext({ visitor_id: 'a' }); +export default function HomeScreen() { + return ( + // @ts-ignore + + } + > + App loading...}> + React Native Example + +