Skip to content
Merged
Show file tree
Hide file tree
Changes from 115 commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
11d621e
feat: create pr validations workflows - [CU-869ar2kz9] (#1)
LoayAhmed304 Oct 9, 2025
6c0808e
feat: initial project configuration - [CU-869atcurc] (#2)
Exo1i Oct 10, 2025
9856136
chore: create code style and quality workflow - [CU-869ar2kzc] (#3)
LoayAhmed304 Oct 11, 2025
000e24f
fix: main branch protection workflow false triggers - [CU-869atvh7a] …
LoayAhmed304 Oct 12, 2025
8fc872c
fix: pnpm lock ignore - [CU-869aty1yg] (#8)
HelanaNady Oct 12, 2025
ea2ce23
feat: base ui theme colors - [CU-869aty2j0] (#10)
HelanaNady Oct 13, 2025
08c5c68
perf(workflow): add pnpm packages caching - [CU-869aubq63] (#14)
LoayAhmed304 Oct 14, 2025
9d9c698
feat: base button - [CU-869artvck] (#15)
HelanaNady Oct 15, 2025
271d55d
feat: stylesheet base colors - [CU-869av58zf] (#19)
Youssefwafa7 Oct 15, 2025
2b37857
feat: add coverage collection config for Jest - [CU-869av7jnf] (#23)
LoayAhmed304 Oct 16, 2025
2dea322
refactor: adjust workflows and consider draft PRs - [CU-869av1uqa] (#21)
LoayAhmed304 Oct 16, 2025
d1a6f4a
feat: add centralized API service utility - [CU-869av5wkh] (#20)
AhmedSobhy01 Oct 16, 2025
73c5eb5
feat: allowed either following system or setting ligh/dark theme - [C…
Exo1i Oct 16, 2025
186ab5f
feat: setup mock server - [CU-869av6ay9] (#22)
AhmedSobhy01 Oct 16, 2025
2cd7dd3
feat: add AppText component (Typography) - [CU-869artvwv] (#29)
Youssefwafa7 Oct 17, 2025
c0aa7ff
feat: styled UI loaders - [CU-869arvvqb] (#25)
HelanaNady Oct 18, 2025
d81ab22
feat: auth auto token refresh - [CU-869aw45mr] (#27)
AhmedSobhy01 Oct 18, 2025
cb7f9c3
feat: login screens - [CU-869arhm4x] (#26)
AhmedSobhy01 Oct 19, 2025
655c30f
feat: add UI playground - [CU-869avxb7x] (#30)
Exo1i Oct 19, 2025
72ad9f6
feat: create account - [CU-869arhpvy] (#18)
tonynagyy Oct 20, 2025
12cc0b8
chore: migrate to react navigation - [CU-869avtvbd] (#31)
HelanaNady Oct 22, 2025
a868128
feat: add abstraction for API validation errors - [CU-869aw0tkh] (#41)
AhmedSobhy01 Oct 23, 2025
046f361
feat: ui input fields - [CU-869artvk2] (#13)
Youssefwafa7 Oct 24, 2025
386fc15
feat: account switcher - [CU-869arw6fw] (#38)
Exo1i Oct 25, 2025
592d8a8
feat: base navigation layout - [CU-869arwb1z] (#33)
HelanaNady Oct 25, 2025
ba4c82b
chore: create testers PR checklist comment - [CU-869aw22yh] (#44)
LoayAhmed304 Oct 25, 2025
43e8f6b
feat: UI confirmation dialog - [CU-869atc2df] (#39)
tonynagyy Oct 25, 2025
42ae53a
fix(ui): button styles - [CU-869ayp4ye] (#47)
HelanaNady Oct 26, 2025
f3fbe7b
feat: captcha implementation - [CU-869arj0e7] (#32)
tonynagyy Oct 26, 2025
6783b45
feat: implement oauth for Google & Github - [CU-869arhwuy] (#34)
AhmedSobhy01 Oct 26, 2025
2d3a0cd
fix: refactor login to use new UI components - [CU-869axvegh] (#35)
AhmedSobhy01 Oct 26, 2025
43a5587
feat: start screen - [CU-869arhjj8] (#36)
AhmedSobhy01 Oct 27, 2025
9dbcbf7
feat: add captcha modal - [CU-869az56k4] (#50)
AhmedSobhy01 Oct 28, 2025
dbc4c5c
fix: missing button props - [CU-869az04r6] (#48)
HelanaNady Oct 28, 2025
a804ebf
feat: integrate Captcha for Signup Page - [CU-869ay3j8x] (#51)
tonynagyy Oct 29, 2025
cdb881a
feat: settings page - [CU-869arw63y] (#43)
Exo1i Oct 29, 2025
98870ef
feat: tweet component with like and retweet functionality - [CU-869az…
AhmedSobhy01 Oct 30, 2025
cdfd3a5
refactor: update inputs signup - [CU-869b023hm] (#53)
tonynagyy Oct 30, 2025
de6cae7
feat: profile page header - [CU-869atcd7t] (#40)
Youssefwafa7 Oct 30, 2025
7fb850e
feat: profile mock - [CU-869aw8cq7] (#46)
HelanaNady Oct 30, 2025
026859a
fix: keyboard avoiding view - [CU-869b020ff] (#52)
HelanaNady Oct 30, 2025
d597520
feat: account information settings - [CU-869at4rma] (#42)
tonynagyy Oct 30, 2025
10be505
feat: add client type header - [CU-869b0k0un] (#61)
AhmedSobhy01 Oct 31, 2025
fdfef5d
fix: OAuth form update - [CU-869b0xdfe] (#63)
AhmedSobhy01 Oct 31, 2025
57c216a
feat: multiple sessions & account switcher - [CU-869atqnz1] (#58)
AhmedSobhy01 Oct 31, 2025
a4e3426
feat: reset password - [CU-869arhp3k] (#37)
Exo1i Oct 31, 2025
8e96804
feat: added logic for handling logout - [CU-869b0yx22] (#64)
AhmedSobhy01 Nov 1, 2025
b772151
fix: account information settings - [CU-869b0yeu6] (#65)
tonynagyy Nov 1, 2025
9a8767e
feat: enhance password reset flow with captcha support - [CU-869ay3jd…
Exo1i Nov 1, 2025
02d7159
fix: password validation signup - [CU-869b0zhq8] (#66)
tonynagyy Nov 2, 2025
8c0a5d2
feat: create profile - [CU-869arhnjp] (#62)
tonynagyy Nov 2, 2025
3c1b096
refactor: auth session store - [CU-869b12p36] (#69)
AhmedSobhy01 Nov 2, 2025
a6f7a02
chore: add @Exo1i to codeowners - [CU-TEMP] (#72)
Exo1i Nov 2, 2025
79ebffe
fix: auth naviagtion - [CU-869b17w3j] (#73)
Exo1i Nov 2, 2025
2925ec9
feat: centralized server error handling - [CU-869b121cv] (#68)
AhmedSobhy01 Nov 3, 2025
948609e
fix: double navigation after logout - [CU-869b1g437] (#76)
AhmedSobhy01 Nov 3, 2025
3e1c4d0
fix: signup flow - [CU-869b180xw] (#74)
tonynagyy Nov 3, 2025
bcbe0d6
feat: connect picture picker backend - [CU-869b186eh] (#75)
tonynagyy Nov 3, 2025
2bf4ec1
feat: implement change password functionality - [CU-869arhppx] (#70)
Exo1i Nov 3, 2025
de8b953
feat: edit profile - [CU-869atcbxt] (#60)
HelanaNady Nov 3, 2025
bbd4a91
feat: timeline following - [CU-869aq7atn] (#57)
Youssefwafa7 Nov 3, 2025
6f1de90
fix: enhance tweet interaction functions with error handling for alre…
AhmedSobhy01 Nov 3, 2025
22b91dc
feat: add handlers to redirect to user profile - [CU-869b1p80r] (#81)
AhmedSobhy01 Nov 3, 2025
0b232fd
fix: types and miscellanious warnings - [CU-869b1phat] (#82)
Exo1i Nov 3, 2025
1ca3e67
fix: sync like and retweet state on prop changes in Tweet component -…
AhmedSobhy01 Nov 3, 2025
423e4a0
fix: made timeline refresh when switching accounts - [CU-869b1pyqk] (…
Exo1i Nov 3, 2025
dc0d6b3
feat(edit-profile): profile media uploads - [CU-869atccd6] (#78)
HelanaNady Nov 3, 2025
cc545c5
feat: add app branding - [CU-869b1hu11] (#77)
Exo1i Nov 3, 2025
3d7ab0f
test(e2e): add signup flow e2e tests - [CU-869atcqay] (#88)
im-saif Nov 3, 2025
9d3498d
test(e2e): add login flow e2e tests - [CU-869atcqaz] (#89)
im-saif Nov 3, 2025
18e8166
test(e2e): add logout flow e2e tests - [CU-869atcqax] (#90)
im-saif Nov 3, 2025
c8c9658
fix: update CODEOWNERS - [CU-869b66ek0] (#94)
AhmedSobhy01 Nov 15, 2025
a791c56
refactor: reorganize test files & fix console warnings - [CU-869ay353…
AhmedSobhy01 Nov 16, 2025
a01760c
fix: fix iOS profile setup image selection bug - [CU-869b6djx2] (#98)
AhmedSobhy01 Nov 17, 2025
ef1a51a
refactor(ui): date picker - [CU-869b66vxd] (#95)
HelanaNady Nov 17, 2025
867a829
refactor: remove redundant endpoint - [CU-869b6dky7] (#100)
HelanaNady Nov 17, 2025
884bc57
refactor: navigation types and routes - [CU-869az1dxb] (#101)
HelanaNady Nov 18, 2025
1be8ba0
refactor: improve auth e2e test files - [CU-869b6xhf8] (#99)
im-saif Nov 18, 2025
c7a2303
refactor: update sidebar to display user avatar instead of icon - [CU…
AhmedSobhy01 Nov 19, 2025
7ba43b8
fix: update sidebar user data - [CU-869b7mr4b] (#108)
tonynagyy Nov 19, 2025
bc11610
test(e2e): add reset password e2e tests - [CU-869atcqaw] (#107)
im-saif Nov 20, 2025
01000e7
fix: use real username suggestions - [CU-869b677ht] (#103)
tonynagyy Nov 20, 2025
d69e419
refactor: separate styles into dedicated files for sidebar, account b…
AhmedSobhy01 Nov 20, 2025
f9b73f2
fix: ui colors - [CU-869b6dm2f] (#116)
HelanaNady Nov 21, 2025
1a2b454
feat: add connections screen - [CU-869atcmv4] (#59)
Exo1i Nov 21, 2025
e92e9f8
fix: remove unnecessary lowercase conversion for identifier in sign i…
AhmedSobhy01 Nov 21, 2025
13a285a
fix: account information settings navigation header - [CU-869b1v7et] …
tonynagyy Nov 21, 2025
73203c1
refactor: remove session store cyclic dependency - [CU-869b6djc4] (#114)
AhmedSobhy01 Nov 21, 2025
e1ada67
refactor: improve tweet component - [CU-869b6djvk] (#97)
AhmedSobhy01 Nov 21, 2025
f0eb4be
feat: add link for logout to call backend to revoke token - [CU-869b7…
AhmedSobhy01 Nov 21, 2025
cc70a2c
fix: account switcher height - [CU-869b7uh1n] (#112)
AhmedSobhy01 Nov 21, 2025
e94f022
fix(profile): profile loader - [CU-869b1619w] (#91)
HelanaNady Nov 21, 2025
16e8de6
refactor: change profile and tweet URL when sharing - [CU-869b8gdgb] …
AhmedSobhy01 Nov 22, 2025
60eebed
feat: setup FCM based push notification support - [CU-869at6t01] (#109)
Exo1i Nov 22, 2025
751c7ca
refactor(ui): extract modal component - [CU-869b6dkmg] (#102)
HelanaNady Nov 22, 2025
db472be
feat: add Direct Messages: UI, composer/sheet, SSE - [CU-869b6dk8c] (…
AhmedSobhy01 Nov 22, 2025
7533fc1
fix: sync username and avatar updates with session store - [CU-869b8g…
AhmedSobhy01 Nov 23, 2025
6e6913a
feat: add appearance settings screen with theme toggle - [CU-869b8a66…
AhmedSobhy01 Nov 23, 2025
56490e2
fix: update email verification error handling and messages - [CU-869b…
tonynagyy Nov 23, 2025
66768a6
fix: update endpoint for unseen conversation count to use hyphen - [C…
AhmedSobhy01 Nov 23, 2025
141100d
refactor: edit profile screen - [CU-869b66vvv] (#104)
HelanaNady Nov 24, 2025
d6edf93
fix: prevent remove default avatar - [CU-869b8ubyz] (#133)
HelanaNady Nov 24, 2025
a056964
fix: connections screen navigate to user profile - [CU-869b8u2kd] (#130)
Exo1i Nov 24, 2025
f63d0ed
feat: add Tweet composer with media support - [CU-869atcezu] (#54)
Exo1i Nov 24, 2025
eb90687
feat: follow & unfollow actions - [CU-869b6dkb9] (#134)
AhmedSobhy01 Nov 24, 2025
837fb59
test(e2e): add account info settings e2e tests - [CU-869atcqzf] (#132)
im-saif Nov 24, 2025
0adc7fc
feat: add drawer tabs and theme switcher - [CU-869ayp4vj] (#125)
HelanaNady Nov 24, 2025
b1caa59
fix: fix performance issues with tweet composer - [CU-869atcezu] (#136)
AhmedSobhy01 Nov 24, 2025
42a5fa0
feat: reply section - [CU-869b67f61] (#71)
tonynagyy Nov 24, 2025
e94df2e
fix: top tabs width - [CU-869b97wjm] (#138)
HelanaNady Nov 24, 2025
c1978df
fix: profile updates not synced in account switcher and tweets - [CU-…
HelanaNady Nov 24, 2025
261cc54
chore: sync histories so dev is aligned with main
AhmedSobhy01 Nov 24, 2025
8498e4a
fix: fix bio parsing with mentions handling - [CU-869b6djqx] (#106)
Youssefwafa7 Nov 24, 2025
baf0fc4
fix: follow buttons - [CU-869b97q89] (#137)
HelanaNady Nov 24, 2025
12155ca
fix: add useHeaderHeight to fix reply section on android - [CU-869b98…
Exo1i Nov 24, 2025
552dd43
fix: username validations during onboarding - [CU-869b98dq7] (#142)
Exo1i Nov 24, 2025
5de643b
feat: chatbox - [CU-869at01va] (#124)
Youssefwafa7 Nov 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1 +1 @@
* @AhmedSobhy01 @AmrSamy59 @im-saif @LoayAhmed304 @Exo1i
* @AhmedSobhy01 @AmrSamy59 @im-saif @LoayAhmed304
3 changes: 3 additions & 0 deletions .github/workflows/code-quality-workflow.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ jobs:
- name: Run Linter
run: pnpm run lint:check

- name: TypeScript Typecheck
run: pnpm run typecheck

- name: Run Unit Tests
run: pnpm run test:cov

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ yarn-error.*
.env
.env*.local

# Firebase
google-services.json

# typescript
*.tsbuildinfo

Expand Down
3 changes: 2 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
npm run format
npm run lint
npm run lint
npx --no-install tsc --noEmit
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@
"**/.env*.local": true,
"**/*.tsbuildinfo": true,
"ios": true,
"android": true,
// "android": true,
"**/node_modules": true
},
"[xml]": {
"editor.defaultFormatter": "DotJoshJohnson.xml"
},
}
47 changes: 40 additions & 7 deletions app.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"expo": {
"name": "Raven",
"slug": "Raven",
"slug": "raven",
"version": "1.0.1",
"orientation": "portrait",
"icon": "./assets/images/light-raven.png",
Expand All @@ -18,24 +18,57 @@
"backgroundColor": "#000000"
}
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.raven.app"
},

"android": {
"googleServicesFile": "./google-services.json",
"versionCode": 1,
"adaptiveIcon": {
"backgroundColor": "#E6F4FE",
"foregroundImage": "./assets/images/light-raven.png"
},
"userInterfaceStyle": "automatic",
"edgeToEdgeEnabled": true,
"predictiveBackGestureEnabled": false,
"package": "com.raven.app"
"package": "space.cmp27.raven"
},
"web": {
"favicon": "./assets/images/light-raven.png"
},
"plugins": ["expo-secure-store", "expo-localization"],
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.raven.app",
"infoPlist": {
"NSPhotoLibraryUsageDescription": "We need access to your photo library so you can choose a profile picture and header.",
"NSPhotoLibraryAddUsageDescription": "We need to save images to your photo library when you download or export.",
"NSCameraUsageDescription": "We need access to your camera so you can take a profile picture."
}
},
"plugins": [
"expo-secure-store",
"expo-localization",
[
"expo-media-library",
{
"photosPermission": "Allow Raven to access your photos.",
"savePhotosPermission": "Allow Raven to save photos.",
"isAccessMediaLocationEnabled": true,
"granularPermissions": ["video", "photo"]
}
],
[
"expo-image-picker",
{
"photosPermission": "The app accesses your photos to let you share them with your friends."
}
],
[
"expo-video",
{
"supportsBackgroundPlayback": false,
"supportsPictureInPicture": true
}
]
],
"experiments": {
"typedRoutes": true,
"reactCompiler": true
Expand Down
28 changes: 28 additions & 0 deletions e2e/pageobjects/Home pages/ForYouScreen.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { $, driver } from '@wdio/globals';

class ForYouScreen {
get forYouTab() {
return $('android=new UiSelector().text("For You")');
}
get followingTab() {
return $('android=new UiSelector().text("Following")');
}
get sideMenuButton() {
return { x: 46, y: 156 };
}

async openSideMenu() {
await driver.execute('mobile: clickGesture', this.sideMenuButton);
}

async switchToFollowingTab() {
await this.followingTab.waitForDisplayed();
await this.followingTab.click();
}

async isDisplayed() {
return (await this.forYouTab.isDisplayed()) && (await this.followingTab.isDisplayed());
}
}

export default new ForYouScreen();
32 changes: 32 additions & 0 deletions e2e/pageobjects/Home pages/OnboardingScreen.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { $ } from '@wdio/globals';

class OnboardingScreen {
get screenTitle() {
return $('android=new UiSelector().text("Pick a profile picture")');
}
get skipButton() {
return $('android=new UiSelector().text("Skip for now")');
}
get nextButton() {
return $('android=new UiSelector().text("Next")');
}
get cancelButton() {
return $('android=new UiSelector().text("Cancel")');
}

async cancelOnboarding() {
await this.cancelButton.waitForDisplayed();
await this.cancelButton.click();
}

async isDisplayed() {
return (
(await this.screenTitle.isDisplayed()) &&
(await this.skipButton.isDisplayed()) &&
(await this.nextButton.isDisplayed()) &&
(await this.cancelButton.isDisplayed())
);
}
}

export default new OnboardingScreen();
40 changes: 40 additions & 0 deletions e2e/pageobjects/Home pages/SidebarScreen.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { $, driver } from '@wdio/globals';

class SidebarScreen {
get logoutButton() {
return $('android=new UiSelector().text("Log out")');
}
get accountSwitcherButton() {
return {
x: 838,
y: 211,
};
}
get logoutButtonFromAccountSwitcher() {
return $('android=new UiSelector().text("Log out from current account")');
}
get settingsButton() {
return $('android=new UiSelector().text("Settings and Privacy")');
}

async logout() {
await this.logoutButton.waitForDisplayed();
await this.logoutButton.click();
}

async openAccountSwitcherDrawer() {
await driver.execute('mobile: clickGesture', this.accountSwitcherButton);
}

async logoutFromAccountSwitcher() {
await this.logoutButtonFromAccountSwitcher.waitForDisplayed();
await this.logoutButtonFromAccountSwitcher.click();
}

async goToSettings() {
await this.settingsButton.waitForDisplayed();
await this.settingsButton.click();
}
}

export default new SidebarScreen();
58 changes: 58 additions & 0 deletions e2e/pageobjects/Login pages/LoginEmail.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { $, driver } from '@wdio/globals';

class LoginEmailScreen {
get screenTitle() {
return $(
'android=new UiSelector().text("To get started, first enter your email, or @username")'
);
}
get emailInput() {
return $('~email-username-input');
}
get nextButton() {
return $('~login-next-button');
}
get invalidEmailErrorMessage() {
return $('android=new UiSelector().text("No account found with that email or username.")');
}
get emptyEmailErrorMessage() {
return $('android=new UiSelector().text("Please enter your email or username.")');
}
get forgotPasswordButton() {
return $('android=new UiSelector().text("Forgot password?")');
}

async goBack() {
await driver.back();
await driver.pause(500);
}

async enterEmail(email) {
await this.emailInput.waitForDisplayed();
await this.emailInput.setValue(email);
}

async clickNext() {
await this.nextButton.waitForDisplayed();
await this.nextButton.click();
}

async clickForgotPassword() {
await this.forgotPasswordButton.waitForDisplayed();
await this.forgotPasswordButton.click();
}

async isNextButtonEnabled() {
return await this.nextButton.isEnabled();
}

async isInvalidEmailErrorMessageDisplayed() {
return await this.invalidEmailErrorMessage.isDisplayed();
}

async isEmptyEmailErrorMessageDisplayed() {
return await this.emptyEmailErrorMessage.isDisplayed();
}
}

export default new LoginEmailScreen();
60 changes: 60 additions & 0 deletions e2e/pageobjects/Login pages/LoginPassword.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { $, driver } from '@wdio/globals';

class LoginPasswordScreen {
get screenTitle() {
return $('android=new UiSelector().text("Enter your password")');
}
get emailDisplay() {
return $('~email-username-input');
}
get passwordInput() {
return $('~password-input');
}
get loginButton() {
return $('~login-button');
}
get togglePasswordButton() {
return $('~toggle-password-visibility');
}
get invalidPasswordErrorMessage() {
return $('android=new UiSelector().text("wrong credentials")');
}
get forgotPasswordButton() {
return $('android=new UiSelector().text("Forgot password?")');
}

async enterPassword(password) {
await this.passwordInput.waitForDisplayed();
await this.passwordInput.setValue(password);
}

async clickLogin() {
await this.loginButton.waitForDisplayed();
await this.loginButton.click();
}

async goBack() {
await driver.back();
await driver.pause(500);
}

async isLoginButtonEnabled() {
return await this.loginButton.isEnabled();
}

async isInvalidPasswordErrorMessageDisplayed() {
return await this.invalidPasswordErrorMessage.isDisplayed();
}

async togglePasswordVisibility() {
await this.togglePasswordButton.waitForDisplayed();
await this.togglePasswordButton.click();
}

async clickForgotPassword() {
await this.forgotPasswordButton.waitForDisplayed();
await this.forgotPasswordButton.click();
}
}

export default new LoginPasswordScreen();
Loading
Loading