[READ ONLY MIRROR] Open Source TikTok alternative built on AT Protocol github.com/sprksocial/client
flutter atproto video dart
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

changes

C3B 29b4ee19 7a646c7c

+59 -9
+4 -4
app.json
··· 4 4 "slug": "spark-social-app", 5 5 "version": "1.0.0", 6 6 "orientation": "portrait", 7 - "icon": "./assets/images/icon.png", 7 + "icon": "/assets/images/icon.png", 8 8 "scheme": "myapp", 9 9 "userInterfaceStyle": "automatic", 10 10 "newArchEnabled": true, ··· 13 13 }, 14 14 "android": { 15 15 "adaptiveIcon": { 16 - "foregroundImage": "./assets/images/adaptive-icon.png", 16 + "foregroundImage": "/assets/images/adaptive-icon.png", 17 17 "backgroundColor": "#ffffff" 18 18 } 19 19 }, 20 20 "web": { 21 21 "bundler": "metro", 22 22 "output": "static", 23 - "favicon": "./assets/images/favicon.png" 23 + "favicon": "/assets/images/favicon.png" 24 24 }, 25 25 "plugins": [ 26 26 "expo-router", ··· 28 28 [ 29 29 "expo-splash-screen", 30 30 { 31 - "image": "./assets/images/splash-icon.png", 31 + "image": "/assets/images/splash-icon.png", 32 32 "imageWidth": 200, 33 33 "resizeMode": "contain", 34 34 "backgroundColor": "#ffffff"
+30
app/(tabs)/ProfileScreen.tsx
··· 6 6 StyleSheet, 7 7 useColorScheme, 8 8 View, 9 + Share, 9 10 } from 'react-native'; 10 11 import { ThemedText } from '@/components/ThemedText'; 11 12 import ContentWrapper from '@/components/global/ContentWrapper'; ··· 178 179 console.log("followed " + userData?.did); 179 180 }; 180 181 182 + // New handlers for profile actions 183 + const handleEdit = () => { 184 + console.log("Edit profile functionality would be implemented here"); 185 + // TODO: Implement profile editing screen 186 + }; 187 + 188 + const handleShareProfile = async () => { 189 + try { 190 + if (userData) { 191 + const profileUrl = `https://sprk.so/${userData.handle}`; 192 + await Share.share({ 193 + message: `Check out ${userData.displayName}'s profile on Spark: ${profileUrl}`, 194 + url: profileUrl, 195 + }); 196 + console.log("Shared profile"); 197 + } 198 + } catch (error) { 199 + console.error('Error sharing profile:', error); 200 + } 201 + }; 202 + 203 + const handleFriends = () => { 204 + console.log("Friends functionality would be implemented here"); 205 + // TODO: Implement friends screen 206 + }; 207 + 181 208 const styles = StyleSheet.create({ 182 209 container: { 183 210 flex: 1, ··· 232 259 onLogin={() => goTo('login')} 233 260 onFollow={handleFollow} 234 261 onLogout={handleLogout} 262 + onEdit={handleEdit} 263 + onShareProfile={handleShareProfile} 264 + onFriends={handleFriends} 235 265 /> 236 266 </View> 237 267
assets/icon.png

This is a binary file and will not be displayed.

+24 -5
components/Profile/ProfileActionButtons.tsx
··· 9 9 onLogin: () => void; 10 10 onFollow: () => void; 11 11 onLogout: () => void; 12 + onEdit?: () => void; 13 + onShareProfile?: () => void; 14 + onFriends?: () => void; 12 15 } 13 16 14 17 const ProfileActionButtons = ({ ··· 17 20 onRegister, 18 21 onLogin, 19 22 onFollow, 20 - onLogout 23 + onLogout, 24 + onEdit = () => {}, 25 + onShareProfile = () => {}, 26 + onFriends = () => {} 21 27 }: ProfileActionButtonsProps) => { 22 28 23 29 if (!isLoggedIn && isMine) { ··· 65 71 return ( 66 72 <View style={styles.profileActionButtons}> 67 73 <ActionButton 74 + type="primary" 75 + title="Edit" 76 + onPress={onEdit} 77 + width="30%" 78 + /> 79 + <ActionButton 68 80 type="outline" 69 - title="Logout" 70 - onPress={onLogout} 71 - width="60%" 81 + title="Share Profile" 82 + onPress={onShareProfile} 83 + width="45%" 84 + /> 85 + <ActionButton 86 + type="outline" 87 + title="Friends +" 88 + onPress={onFriends} 89 + width="25%" 72 90 /> 73 91 </View> 74 92 ); ··· 80 98 const styles = StyleSheet.create({ 81 99 profileActionButtons: { 82 100 flexDirection: 'row', 83 - justifyContent: 'center', 101 + justifyContent: 'space-between', 84 102 gap: 10, 85 103 width: '100%', 104 + marginTop: 15, 86 105 }, 87 106 profileActionButtonsVertical: { 88 107 display: 'flex',
+1
components/Video/VideoScreen.tsx
··· 43 43 setVideoProgress(player.currentTime ?? 0); 44 44 } 45 45 }, 500); 46 + 46 47 47 48 return () => clearInterval(interval); 48 49 }, [player]);