Skip to content

Commit

Permalink
Merge branch 'main' into profilePage
Browse files Browse the repository at this point in the history
  • Loading branch information
jrau1801 authored Jun 10, 2024
2 parents d4c907c + 31871ba commit 6193bf6
Show file tree
Hide file tree
Showing 41 changed files with 1,143 additions and 452 deletions.
3 changes: 2 additions & 1 deletion app.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
"recordAudioAndroid": true
}
],
"@config-plugins/react-native-webrtc"
"@config-plugins/react-native-webrtc",
"@giphy/react-native-sdk"
],
"experiments": {
"typedRoutes": true,
Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"dependencies": {
"@config-plugins/react-native-webrtc": "^9.0.0",
"@expo/vector-icons": "^14.0.0",
"@giphy/react-native-sdk": "^3.2.6",
"@react-native-async-storage/async-storage": "1.21.0",
"@react-navigation/native": "^6.1.7",
"@tamagui/font-inter": "1.74.8",
Expand Down Expand Up @@ -51,11 +52,13 @@
"react-dom": "18.2.0",
"react-native": "0.73.6",
"react-native-gesture-handler": "~2.14.0",
"react-native-incall-manager": "^4.2.0",
"react-native-modal": "^13.0.1",
"react-native-reanimated": "~3.6.2",
"react-native-safe-area-context": "^4.8.2",
"react-native-screens": "~3.29.0",
"react-native-svg": "14.1.0",
"react-native-toast-message": "^2.2.0",
"react-native-web": "~0.19.10",
"react-native-webrtc": "^118.0.7",
"react-query-kit": "^3.3.0",
Expand Down
21 changes: 21 additions & 0 deletions src/api/responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { TypedResponse } from '../types/response';

export type AchievementType = 'NTH_STREAM' | 'NTH_VIEWERS';


export type User = {
id: string;
username: string;
Expand Down Expand Up @@ -56,6 +57,16 @@ export type Follows = {
created_at: Date;
};

export type Notification = {
id: string;
type: NotificationType;
streamId: string | null;
userWhoFiredEvent: string | null;
recipientId: string;
created_at: Date;
updated_at: Date;
};

export type GetUserResponse = TypedResponse<{
user: User & {
userToAchievement: {
Expand Down Expand Up @@ -115,6 +126,10 @@ export type GetMostStreamedGenresResponse = TypedResponse<{
};
}>;

export type GetNotificationsResponse = TypedResponse<{
notifications: Notification[];
}>;

export type UpdateUserResponse = TypedResponse<{
user: User;
}>;
Expand Down Expand Up @@ -146,3 +161,9 @@ export type DeleteStreamResponse = TypedResponse<{
streamer: Streamer;
};
}>;

export type StartStreamResponse = TypedResponse<{
stream: Stream & {
streamer: Streamer;
};
}>;
183 changes: 5 additions & 178 deletions src/app/(auth)/stream/index.tsx
Original file line number Diff line number Diff line change
@@ -1,181 +1,8 @@
import { CreateStreamResponse } from '@api/responses';
import GenreBadge from '@components/GenreBadge';
import { Feather } from '@expo/vector-icons';
import useAuth from '@modules/auth/useAuth';
import { Link, router } from 'expo-router';
import React, { useState } from 'react';
import { SafeAreaView } from 'react-native-safe-area-context';
import { Button, H3, XStack, YStack } from 'tamagui';
import CreateStreamPage from '@screens/CreateStreamPage';
import React from 'react';

const StreamPage = () => {
const { user } = useAuth();
const [selectedGenre, setSelectedGenre] = useState<
{
text: string;
color: string;
selected: boolean;
}[]
>([
{
text: 'Chatting 💬',
color: '#E16F6F',
selected: false,
},
{
text: 'Beauty 💄',
color: '#E16FDD',
selected: false,
},
{
text: 'Gaming 🎮',
color: '#6FB1E1',
selected: false,
},
{
text: 'Nature 🌳',
color: '#85D95D',
selected: false,
},
{
text: 'Sport 🏈',
color: '#FBC151',
selected: false,
},
{
text: 'Art 🎨',
color: '#E4D3A6',
selected: false,
},
{
text: 'IRL 😄',
color: '#F4F2C3',
selected: false,
},
{
text: 'Football ⚽️',
color: '#DDDDDD',
selected: false,
},
{
text: 'Cooking 🍜',
color: '#FFE9CE',
selected: false,
},
{
text: 'Music 🎶',
color: '#D283F8',
selected: false,
},
{
text: 'Podcast 🎙️',
color: '#C2C2C2',
selected: false,
},
{
text: 'Education 👨‍🏫',
color: '#E6E890',
selected: false,
},
{
text: 'Camping ⛺️',
color: '#2AE3A1',
selected: false,
},
]);

const addSelectedGenre = (idx: number) => {
if (
selectedGenre.filter((g) => g.selected === true).length >= 3 ||
selectedGenre[idx]?.selected
) {
return;
}

const updatedGenres = [...selectedGenre];
updatedGenres[idx]!.selected = true;
setSelectedGenre(updatedGenres);
};

const removeSelectedGenre = (idx: number) => {
if (!selectedGenre[idx]?.selected) return;

const updatedGenres = [...selectedGenre];
updatedGenres[idx]!.selected = false;
setSelectedGenre(updatedGenres);
};

const createStream = async () => {
const createdStream = await fetch(`${process.env.EXPO_PUBLIC_API_URL}/api/stream/create`, {
method: 'POST',
body: JSON.stringify({
streamerId: user.id,
previewImgUrl: 'dummy',
genre: selectedGenre
.filter((g) => g.selected === true)
.map((m) => m.text)
.join(','),
}),
headers: {
'Content-Type': 'application/json',
},
}).then((res) => res.json() as Promise<CreateStreamResponse>);

if (createdStream && createdStream.success && createdStream.data) {
router.navigate(`/stream/${createdStream.data.stream.id}`);
}
};

return (
<SafeAreaView style={{ backgroundColor: '#151718' }}>
<YStack height="100%" backgroundColor="#151718" padding="$4" justifyContent="space-between">
<XStack>
<Link asChild href={{ pathname: '/' }}>
<Feather size={28} name="x" color="#fff" />
</Link>
</XStack>
<YStack
width="60%"
height="45%"
backgroundColor="#ddd"
borderRadius={25}
alignSelf="center"
alignItems="center"
justifyContent="center">
<YStack backgroundColor="#00000044" borderRadius={25} padding="$4">
<Feather size={28} name="plus" color="#fff" />
</YStack>
</YStack>
<YStack gap="$5">
<H3>Pick your Genre {selectedGenre.filter((g) => g.selected === true).length}/3</H3>
<XStack gap="$3" flexWrap="wrap" justifyContent="flex-start">
{selectedGenre.map((g, idx) => {
return (
<GenreBadge
key={`genre:${idx}:${g.text}`}
text={g.text}
color={g.color}
selected={g.selected}
onPress={() => {
if (selectedGenre[idx]?.selected) {
removeSelectedGenre(idx);
} else {
addSelectedGenre(idx);
}
}}
/>
);
})}
</XStack>
</YStack>

<Button
onPress={() => createStream()}
disabled={selectedGenre.filter((g) => g.selected === true).length < 1}>
Create Stream
</Button>
</YStack>
</SafeAreaView>
);
const CreateStream = () => {
return <CreateStreamPage />;
};

export default StreamPage;
export default CreateStream;
16 changes: 15 additions & 1 deletion src/app/_layout.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import 'expo-dev-client';

import { APIProvider } from '@api/APIProvider';
import { GiphySDK } from '@giphy/react-native-sdk';
import AuthProvider from '@modules/auth/AuthProvider';
import { useStreamStore } from '@modules/webrtc/stores/useStreamStore';
import { ThemeProvider, DarkTheme, DefaultTheme } from '@react-navigation/native';
import { useFonts } from 'expo-font';
import { Slot, SplashScreen } from 'expo-router';
import * as WebBrowser from 'expo-web-browser';
import React, { useCallback } from 'react';
import { useColorScheme } from 'react-native';
import { Platform, useColorScheme } from 'react-native';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import Toast from 'react-native-toast-message';
import { registerGlobals } from 'react-native-webrtc';
import { TamaguiProvider } from 'tamagui';

import config from '../../tamagui.config';
import { toastConfig } from '@modules/toast/config';

export const unstable_settings = {
// Ensure that reloading on `/modal` keeps a back button present.
Expand All @@ -24,6 +27,16 @@ WebBrowser.maybeCompleteAuthSession();

SplashScreen.preventAutoHideAsync();
registerGlobals();

if (Platform.OS === 'ios' || Platform.OS === 'android') {
GiphySDK.configure({
apiKey:
Platform.OS === 'ios'
? (process.env.EXPO_PUBLIC_IOS_GIPHY_API_KEY as string)
: (process.env.EXPO_PUBLIC_ANDROID_GIPHY_API_KEY as string),
});
}

export default function RootLayout() {
useStreamStore.getState().prepare();
const colorScheme = useColorScheme();
Expand Down Expand Up @@ -54,6 +67,7 @@ export default function RootLayout() {
}}>
<SafeAreaProvider onLayout={onLayoutRootView}>
<Slot />
<Toast config={toastConfig} />
</SafeAreaProvider>
</AuthProvider>
</APIProvider>
Expand Down
Loading

0 comments on commit 6193bf6

Please sign in to comment.